Merge "Revert "Ignore broken tests on presubmit."" into androidx-main
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
index a6e02d7c..da39dab 100644
--- a/.github/workflows/presubmit.yml
+++ b/.github/workflows/presubmit.yml
@@ -1,13 +1,18 @@
 name: AndroidX Presubmits
 on:
   push:
+    branches:
+      - androidx-main
   pull_request_target:
-    types: [opened, synchronize, reopened, 'labeled']
-  workflow_dispatch:
+    types: ['labeled']
 
 jobs:
   setup:
+    # Both `run_workflow` and `retry_workflow` will trigger the workflow
+    if: ${{ (github.event_name == 'push' || contains(github.event.label.name, 'workflow')) }}
     runs-on: ubuntu-latest
+    outputs:
+      gradlew_flags: ${{ steps.global-constants.outputs.gradlew_flags }}
     steps:
       - name: "Start webhook"
         uses: androidx/github-workflow-webhook-action@main
@@ -15,6 +20,16 @@
           url: 'https://androidx.dev/github/androidX/presubmit/hook'
           secret: ${{ secrets.ANDROIDX_PRESUBMIT_HOOK_SECRET }}
           payload: '{ "platform": "all", "token": "${{ secrets.GITHUB_TOKEN }}", "state": "started"}'
+      - name: "Setup global constants"
+        id: global-constants
+        run: |
+          set -x
+          GRADLEW_FLAGS="-Dorg.gradle.internal.http.connectionTimeout=300000 \
+            -Dorg.gradle.internal.http.socketTimeout=300000                  \
+            -Dorg.gradle.internal.repository.max.retries=10                  \
+            -Dorg.gradle.internal.repository.initial.backoff=500             \
+            --stacktrace"
+          echo "::set-output name=gradlew_flags::$GRADLEW_FLAGS"
 
   lint:
     runs-on: ubuntu-latest
@@ -92,7 +107,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: -q :ktlintCheckFile ${{ steps.ktlint-file-args.outputs.ktlint-file-args }} --stacktrace
+          arguments: -q :ktlintCheckFile ${{ steps.ktlint-file-args.outputs.ktlint-file-args }} ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: activity
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -141,7 +156,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -198,7 +213,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -255,7 +270,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -312,7 +327,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -369,7 +384,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -426,7 +441,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -483,7 +498,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -540,7 +555,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
@@ -548,6 +563,26 @@
           wrapper-directory: ${{ env.project-root }}/gradle/wrapper
           wrapper-cache-enabled: true
 
+      - name: Set up Cloud SDK
+        uses: google-github-actions/setup-gcloud@master
+        if: ${{ github.repository == 'androidX/androidx' }}
+        with:
+          project_id: ${{ secrets.GCP_PROJECT_ID }}
+          service_account_key: ${{ secrets.GCP_SA_KEY }}
+          export_default_credentials: true
+      - name: "Run application tests on Firebase Test Lab"
+        uses: eskatos/gradle-command-action@v1
+        if: ${{ github.repository == 'androidX/androidx' }}
+        env:
+          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
+        with:
+          arguments: firebaseTestLabTests ${{ needs.setup.outputs.gradlew_flags }}
+          build-root-directory: ${{ env.project-root }}
+          configuration-cache-enabled: true
+          dependencies-cache-enabled: true
+          gradle-executable: ${{ env.project-root }}/gradlew
+          wrapper-directory: ${{ env.project-root }}/gradle/wrapper
+          wrapper-cache-enabled: true
 
       - name: "upload build artifacts"
         continue-on-error: true
@@ -556,7 +591,6 @@
         with:
           name: artifacts_${{ env.artifact-id }}
           path: ~/dist
-
       - name: "Report job status"
         id: output-status
         if: always()
@@ -598,7 +632,7 @@
         env:
           JAVA_HOME: ${{ steps.setup-java.outputs.path }}
         with:
-          arguments: buildOnServer --stacktrace
+          arguments: buildOnServer ${{ needs.setup.outputs.gradlew_flags }}
           build-root-directory: ${{ env.project-root }}
           configuration-cache-enabled: true
           dependencies-cache-enabled: true
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index d69f697..5422d22 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,6 +1,5 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
-    <option name="WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN" value="true" />
     <JavaCodeStyleSettings>
       <option name="FIELD_NAME_PREFIX" value="m" />
       <option name="STATIC_FIELD_NAME_PREFIX" value="s" />
@@ -107,6 +106,7 @@
       <option name="WHILE_BRACE_FORCE" value="1" />
       <option name="FOR_BRACE_FORCE" value="1" />
       <option name="WRAP_LONG_LINES" value="true" />
+      <option name="WRAP_ON_TYPING" value="1" />
     </codeStyleSettings>
     <codeStyleSettings language="XML">
       <option name="FORCE_REARRANGE_MODE" value="2" />
@@ -267,6 +267,7 @@
     </codeStyleSettings>
     <codeStyleSettings language="kotlin">
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
+      <option name="WRAP_ON_TYPING" value="1" />
       <indentOptions>
         <option name="CONTINUATION_INDENT_SIZE" value="4" />
       </indentOptions>
diff --git a/activity/activity-compose/api/current.txt b/activity/activity-compose/api/current.txt
index 682a3e8..6d0ba62 100644
--- a/activity/activity-compose/api/current.txt
+++ b/activity/activity-compose/api/current.txt
@@ -6,7 +6,7 @@
 
   public final class ActivityResultRegistryKt {
     method @Deprecated @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
-    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
   }
 
   public final class BackHandlerKt {
@@ -31,5 +31,11 @@
     field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
   }
 
+  public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+    method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+    method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+    method @Deprecated public void unregister();
+  }
+
 }
 
diff --git a/activity/activity-compose/api/public_plus_experimental_current.txt b/activity/activity-compose/api/public_plus_experimental_current.txt
index 682a3e8..6d0ba62 100644
--- a/activity/activity-compose/api/public_plus_experimental_current.txt
+++ b/activity/activity-compose/api/public_plus_experimental_current.txt
@@ -6,7 +6,7 @@
 
   public final class ActivityResultRegistryKt {
     method @Deprecated @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
-    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
   }
 
   public final class BackHandlerKt {
@@ -31,5 +31,11 @@
     field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
   }
 
+  public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+    method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+    method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+    method @Deprecated public void unregister();
+  }
+
 }
 
diff --git a/activity/activity-compose/api/restricted_current.txt b/activity/activity-compose/api/restricted_current.txt
index 682a3e8..6d0ba62 100644
--- a/activity/activity-compose/api/restricted_current.txt
+++ b/activity/activity-compose/api/restricted_current.txt
@@ -6,7 +6,7 @@
 
   public final class ActivityResultRegistryKt {
     method @Deprecated @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
-    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.result.ActivityResultLauncher<I> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+    method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
   }
 
   public final class BackHandlerKt {
@@ -31,5 +31,11 @@
     field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
   }
 
+  public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+    method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+    method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+    method @Deprecated public void unregister();
+  }
+
 }
 
diff --git a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ActivityResultRegistryTest.kt b/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ActivityResultRegistryTest.kt
index 78bce56..d9f957e 100644
--- a/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ActivityResultRegistryTest.kt
+++ b/activity/activity-compose/src/androidTest/java/androidx/activity/compose/ActivityResultRegistryTest.kt
@@ -19,6 +19,7 @@
 import android.app.Activity.RESULT_OK
 import android.content.Intent
 import androidx.activity.ComponentActivity
+import androidx.activity.result.ActivityResult
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.ActivityResultRegistry
 import androidx.activity.result.ActivityResultRegistryOwner
@@ -27,6 +28,7 @@
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -41,6 +43,9 @@
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.receiveAsFlow
 import org.junit.Assert.fail
 import org.junit.Rule
 import org.junit.Test
@@ -67,7 +72,7 @@
     }
 
     @Test
-    fun testRegisterForActivityResult() {
+    fun testLaunch() {
         var launcher: ActivityResultLauncher<Intent>? by mutableStateOf(null)
         composeTestRule.setContent {
             CompositionLocalProvider(
@@ -87,7 +92,50 @@
     }
 
     @Test
-    fun testRegisterForActivityResultAfterRestoration() {
+    fun testGetContract() {
+        var launcher: ActivityResultLauncher<Intent>? by mutableStateOf(null)
+        composeTestRule.setContent {
+            CompositionLocalProvider(
+                LocalActivityResultRegistryOwner provides registryOwner
+            ) {
+                launcher = rememberLauncherForActivityResult(
+                    ActivityResultContracts.StartActivityForResult()
+                ) {}
+            }
+        }
+        composeTestRule.runOnIdle {
+            val contract = launcher?.contract
+            assertThat(contract)
+                .isInstanceOf(ActivityResultContracts.StartActivityForResult::class.java)
+        }
+    }
+
+    @Test
+    fun testUnregister() {
+        var launcher: ManagedActivityResultLauncher<Intent, ActivityResult>? by mutableStateOf(null)
+        composeTestRule.setContent {
+            CompositionLocalProvider(
+                LocalActivityResultRegistryOwner provides registryOwner
+            ) {
+                launcher = rememberLauncherForActivityResult(
+                    ActivityResultContracts.StartActivityForResult()
+                ) {}
+            }
+        }
+        composeTestRule.runOnIdle {
+            try {
+                @Suppress("DEPRECATION") // the unregister method is deprecated
+                launcher?.unregister()
+            } catch (e: UnsupportedOperationException) {
+                assertThat(e).hasMessageThat().contains(
+                    "Registration is automatically handled by rememberLauncherForActivityResult"
+                )
+            }
+        }
+    }
+
+    @Test
+    fun testLaunchAfterRestoration() {
         val activityScenario: ActivityScenario<ComponentActivity> =
             ActivityScenario.launch(ComponentActivity::class.java)
 
@@ -118,7 +166,57 @@
     }
 
     @Test
-    fun testRegisterForActivityResultOnResult() {
+    fun testRecomposeBeforeLaunch() {
+        var counter = 0
+        var code = 0
+        val registry = object : ActivityResultRegistry() {
+            override fun <I : Any?, O : Any?> onLaunch(
+                requestCode: Int,
+                contract: ActivityResultContract<I, O>,
+                input: I,
+                options: ActivityOptionsCompat?
+            ) {
+                code = requestCode
+            }
+        }
+        val owner = ActivityResultRegistryOwner { registry }
+        var recompose by mutableStateOf(false)
+        val launchChannel = Channel<Boolean>()
+        val launchFlow = launchChannel.receiveAsFlow()
+        composeTestRule.setContent {
+            CompositionLocalProvider(
+                LocalActivityResultRegistryOwner provides owner
+            ) {
+                @Suppress("ControlFlowWithEmptyBody") // triggering recompose
+                if (recompose) {}
+                val launcher = rememberLauncherForActivityResult(
+                    ActivityResultContracts.StartActivityForResult()
+                ) {
+                    counter++
+                }
+                LaunchedEffect(Unit) {
+                    launchFlow.collect { shouldLaunch ->
+                        if (shouldLaunch) {
+                            launcher.launch(null)
+                        }
+                    }
+                }
+            }
+        }
+
+        recompose = true
+        composeTestRule.runOnIdle {
+            assertThat(counter).isEqualTo(0)
+        }
+        launchChannel.offer(true)
+        composeTestRule.runOnIdle {
+            registry.dispatchResult(code, RESULT_OK, Intent())
+            assertThat(counter).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun testRecomposeAfterLaunch() {
         var counter = 0
         var code = 0
         val registry = object : ActivityResultRegistry() {
@@ -164,7 +262,7 @@
     }
 
     @Test
-    fun testRegisterForActivityResultOnResultSameContract() {
+    fun testLaunchWithSameContract() {
         var counter = 0
         var code = 0
         val registry = object : ActivityResultRegistry() {
diff --git a/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt b/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
index 69be7da..6055636 100644
--- a/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
+++ b/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
@@ -22,6 +22,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.ProvidedValue
+import androidx.compose.runtime.State
 import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
@@ -112,8 +113,9 @@
 public fun <I, O> rememberLauncherForActivityResult(
     contract: ActivityResultContract<I, O>,
     onResult: (O) -> Unit
-): ActivityResultLauncher<I> {
-    // Keep track of the current onResult listener
+): ManagedActivityResultLauncher<I, O> {
+    // Keep track of the current contract and onResult listener
+    val currentContract = rememberUpdatedState(contract)
     val currentOnResult = rememberUpdatedState(onResult)
 
     // It doesn't really matter what the key is, just that it is unique
@@ -123,20 +125,9 @@
     val activityResultRegistry = checkNotNull(LocalActivityResultRegistryOwner.current) {
         "No ActivityResultRegistryOwner was provided via LocalActivityResultRegistryOwner"
     }.activityResultRegistry
-    val realLauncher = remember(contract) { ActivityResultLauncherHolder<I>() }
-    val returnedLauncher = remember(contract) {
-        object : ActivityResultLauncher<I>() {
-            override fun launch(input: I, options: ActivityOptionsCompat?) {
-                realLauncher.launch(input, options)
-            }
-
-            override fun unregister() {
-                error("Registration is automatically handled by rememberLauncherForActivityResult")
-            }
-
-            @Suppress("UNCHECKED_CAST")
-            override fun getContract() = contract as ActivityResultContract<I, *>
-        }
+    val realLauncher = remember { ActivityResultLauncherHolder<I>() }
+    val returnedLauncher = remember {
+        ManagedActivityResultLauncher(realLauncher, currentContract)
     }
 
     // DisposableEffect ensures that we only register once
@@ -152,7 +143,42 @@
     return returnedLauncher
 }
 
-private class ActivityResultLauncherHolder<I> {
+/**
+ * A launcher for a previously-{@link ActivityResultCaller#registerForActivityResult prepared call}
+ * to start the process of executing an {@link ActivityResultContract}.
+ *
+ * This launcher does not support the [unregister] function. Attempting to use [unregister] will
+ * result in an [IllegalStateException].
+ *
+ * @param I type of the input required to launch
+ */
+public class ManagedActivityResultLauncher<I, O> internal constructor(
+    private val launcher: ActivityResultLauncherHolder<I>,
+    private val contract: State<ActivityResultContract<I, O>>
+) : ActivityResultLauncher<I>() {
+    /**
+     * This function should never be called and doing so will result in an
+     * [UnsupportedOperationException].
+     *
+     * @throws UnsupportedOperationException if this function is called.
+     */
+    @Suppress("DeprecatedCallableAddReplaceWith")
+    @Deprecated("Registration is automatically handled by rememberLauncherForActivityResult")
+    override fun unregister() {
+        throw UnsupportedOperationException(
+            "Registration is automatically handled by rememberLauncherForActivityResult"
+        )
+    }
+
+    override fun launch(input: I, options: ActivityOptionsCompat?) {
+        launcher.launch(input, options)
+    }
+
+    @Suppress("UNCHECKED_CAST")
+    override fun getContract(): ActivityResultContract<I, *> = contract.value
+}
+
+internal class ActivityResultLauncherHolder<I> {
     var launcher: ActivityResultLauncher<I>? = null
 
     fun launch(input: I?, options: ActivityOptionsCompat?) {
diff --git a/activity/activity-ktx/api/current.txt b/activity/activity-ktx/api/current.txt
index 5956a38..f844b35 100644
--- a/activity/activity-ktx/api/current.txt
+++ b/activity/activity-ktx/api/current.txt
@@ -9,6 +9,9 @@
     method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
   }
 
+  public final class PipHintTrackerKt {
+  }
+
 }
 
 package androidx.activity.contextaware {
diff --git a/activity/activity-ktx/api/public_plus_experimental_current.txt b/activity/activity-ktx/api/public_plus_experimental_current.txt
index 5956a38..5dff406 100644
--- a/activity/activity-ktx/api/public_plus_experimental_current.txt
+++ b/activity/activity-ktx/api/public_plus_experimental_current.txt
@@ -9,6 +9,10 @@
     method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
   }
 
+  public final class PipHintTrackerKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) @kotlinx.coroutines.ExperimentalCoroutinesApi public static suspend Object? trackPipAnimationHintView(android.app.Activity, android.view.View view, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
 }
 
 package androidx.activity.contextaware {
diff --git a/activity/activity-ktx/api/restricted_current.txt b/activity/activity-ktx/api/restricted_current.txt
index 5956a38..f844b35 100644
--- a/activity/activity-ktx/api/restricted_current.txt
+++ b/activity/activity-ktx/api/restricted_current.txt
@@ -9,6 +9,9 @@
     method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
   }
 
+  public final class PipHintTrackerKt {
+  }
+
 }
 
 package androidx.activity.contextaware {
diff --git a/activity/activity-ktx/src/main/java/androidx/activity/PipHintTracker.kt b/activity/activity-ktx/src/main/java/androidx/activity/PipHintTracker.kt
new file mode 100644
index 0000000..047b11d
--- /dev/null
+++ b/activity/activity-ktx/src/main/java/androidx/activity/PipHintTracker.kt
@@ -0,0 +1,112 @@
+/*
+ * 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.activity
+
+import android.app.Activity
+import android.app.PictureInPictureParams
+import android.graphics.Rect
+import android.os.Build
+import android.view.View
+import android.view.ViewTreeObserver
+import androidx.annotation.RequiresApi
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.collect
+
+/**
+ * Sets the [View] that will be used as reference to set the
+ * [PictureInPictureParams.Builder.setSourceRectHint].
+ *
+ * Anytime the view position changes, [Activity.setPictureInPictureParams] will be called with
+ * the updated view's position in window coordinates as the
+ * [PictureInPictureParams.Builder.setSourceRectHint].
+ *
+ * @param view the view to use as the reference for the source rect hint
+ */
+@ExperimentalCoroutinesApi
+@RequiresApi(Build.VERSION_CODES.O)
+public suspend fun Activity.trackPipAnimationHintView(view: View) {
+    // Returns a rect of the window coordinates of a view.
+    fun View.positionInWindow(): Rect {
+        val position = Rect()
+        getGlobalVisibleRect(position)
+        return position
+    }
+
+    // Create a cold flow that will emit the most updated position of the view in the form of a
+    // rect as long as the view is attached to the window.
+    val flow = callbackFlow<Rect> {
+        // Emit a new hint rect any time the view moves.
+        val layoutChangeListener = View.OnLayoutChangeListener { v, l, t, r, b, oldLeft, oldTop,
+            oldRight, oldBottom ->
+            if (l != oldLeft || r != oldRight || t != oldTop || b != oldBottom) {
+                offer(v.positionInWindow())
+            }
+        }
+        val scrollChangeListener = ViewTreeObserver.OnScrollChangedListener {
+            offer(view.positionInWindow())
+        }
+        // When the view is attached, emit the current position and start listening for layout
+        // changes to track movement.
+        val attachStateChangeListener = object : View.OnAttachStateChangeListener {
+            override fun onViewAttachedToWindow(v: View) {
+                offer(view.positionInWindow())
+                view.viewTreeObserver.addOnScrollChangedListener(scrollChangeListener)
+                view.addOnLayoutChangeListener(layoutChangeListener)
+            }
+
+            override fun onViewDetachedFromWindow(v: View) {
+                v.viewTreeObserver.removeOnScrollChangedListener(scrollChangeListener)
+                v.removeOnLayoutChangeListener(layoutChangeListener)
+            }
+        }
+        // Check if the view is already attached to the window, if it is then emit the current
+        // position and start listening for layout changes to track movement.
+        if (Api19Impl.isAttachedToWindow(view)) {
+            offer(view.positionInWindow())
+            view.viewTreeObserver.addOnScrollChangedListener(scrollChangeListener)
+            view.addOnLayoutChangeListener(layoutChangeListener)
+        }
+        view.addOnAttachStateChangeListener(attachStateChangeListener)
+
+        awaitClose {
+            view.viewTreeObserver.removeOnScrollChangedListener(scrollChangeListener)
+            view.removeOnLayoutChangeListener(layoutChangeListener)
+            view.removeOnAttachStateChangeListener(attachStateChangeListener)
+        }
+    }
+    flow.collect { hint ->
+        Api26Impl.setPipParamsSourceRectHint(this, hint)
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.KITKAT)
+internal object Api19Impl {
+    fun isAttachedToWindow(view: View): Boolean = view.isAttachedToWindow
+}
+
+@RequiresApi(Build.VERSION_CODES.O)
+internal object Api26Impl {
+    fun setPipParamsSourceRectHint(activity: Activity, hint: Rect) {
+        activity.setPictureInPictureParams(
+            PictureInPictureParams.Builder()
+                .setSourceRectHint(hint)
+                .build()
+        )
+    }
+}
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index 0daef05..4d4be33 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -153,7 +153,14 @@
   public final class ActivityResultContracts {
   }
 
-  public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+  public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.CaptureVideo();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method public final Boolean parseResult(int, android.content.Intent?);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
     ctor public ActivityResultContracts.CreateDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String);
@@ -167,28 +174,28 @@
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+  @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.GetMultipleContents();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String);
     method public final java.util.List<android.net.Uri!> parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String![]);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+  @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocumentTree();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri?);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, android.net.Uri?);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.OpenMultipleDocuments();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String![]);
@@ -248,11 +255,11 @@
     method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
-    ctor public ActivityResultContracts.TakeVideo();
-    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
-    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
-    method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+  @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+    ctor @Deprecated public ActivityResultContracts.TakeVideo();
+    method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
 }
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index 14637c3..5ae7716 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -152,7 +152,14 @@
   public final class ActivityResultContracts {
   }
 
-  public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+  public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.CaptureVideo();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method public final Boolean parseResult(int, android.content.Intent?);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
     ctor public ActivityResultContracts.CreateDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String);
@@ -166,28 +173,28 @@
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+  @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.GetMultipleContents();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String);
     method public final java.util.List<android.net.Uri!> parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String![]);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+  @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocumentTree();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri?);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, android.net.Uri?);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.OpenMultipleDocuments();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String![]);
@@ -247,11 +254,11 @@
     method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
-    ctor public ActivityResultContracts.TakeVideo();
-    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
-    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
-    method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+  @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+    ctor @Deprecated public ActivityResultContracts.TakeVideo();
+    method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
 }
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 14637c3..5ae7716 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -152,7 +152,14 @@
   public final class ActivityResultContracts {
   }
 
-  public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+  public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+    ctor public ActivityResultContracts.CaptureVideo();
+    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method public final Boolean parseResult(int, android.content.Intent?);
+  }
+
+  @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
     ctor public ActivityResultContracts.CreateDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String);
@@ -166,28 +173,28 @@
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+  @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.GetMultipleContents();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String);
     method public final java.util.List<android.net.Uri!> parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocument();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, String![]);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+  @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
     ctor public ActivityResultContracts.OpenDocumentTree();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri?);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!>? getSynchronousResult(android.content.Context, android.net.Uri?);
     method public final android.net.Uri? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+  @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
     ctor public ActivityResultContracts.OpenMultipleDocuments();
     method @CallSuper public android.content.Intent createIntent(android.content.Context, String![]);
     method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!>? getSynchronousResult(android.content.Context, String![]);
@@ -247,11 +254,11 @@
     method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
-  public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
-    ctor public ActivityResultContracts.TakeVideo();
-    method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
-    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
-    method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+  @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+    ctor @Deprecated public ActivityResultContracts.TakeVideo();
+    method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
+    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
+    method @Deprecated public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
   }
 
 }
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index 3f497dc..fd9d259 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -10,10 +10,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     defaultConfig {
         testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener"
     }
diff --git a/activity/activity/lint-baseline.xml b/activity/activity/lint-baseline.xml
deleted file mode 100644
index 7819beb..0000000
--- a/activity/activity/lint-baseline.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="BanTargetApiAnnotation"
-        message="Uses @TargetApi annotation"
-        errorLine1="    @TargetApi(18)"
-        errorLine2="    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="459"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="BanTargetApiAnnotation"
-        message="Uses @TargetApi annotation"
-        errorLine1="    @TargetApi(19)"
-        errorLine2="    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="523"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="BanTargetApiAnnotation"
-        message="Uses @TargetApi annotation"
-        errorLine1="    @TargetApi(19)"
-        errorLine2="    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="561"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="BanTargetApiAnnotation"
-        message="Uses @TargetApi annotation"
-        errorLine1="    @TargetApi(21)"
-        errorLine2="    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="603"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="BanTargetApiAnnotation"
-        message="Uses @TargetApi annotation"
-        errorLine1="    @TargetApi(19)"
-        errorLine2="    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="642"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            ClipData clipData = intent.getClipData();"
-        errorLine2="                                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/result/contract/ActivityResultContracts.java"
-            line="497"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                            decor.cancelPendingInputEvents();"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/activity/ComponentActivity.java"
-            line="232"
-            column="35"/>
-    </issue>
-
-</issues>
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index 3e81c8c..a0a6e13 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -61,6 +61,7 @@
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.app.ActivityCompat;
 import androidx.core.app.ActivityOptionsCompat;
 import androidx.core.content.ContextCompat;
@@ -233,7 +234,7 @@
                         Window window = getWindow();
                         final View decor = window != null ? window.peekDecorView() : null;
                         if (decor != null) {
-                            decor.cancelPendingInputEvents();
+                            Api19Impl.cancelPendingInputEvents(decor);
                         }
                     }
                 }
@@ -703,4 +704,14 @@
             Trace.endSection();
         }
     }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() { }
+
+        static void cancelPendingInputEvents(View view) {
+            view.cancelPendingInputEvents();
+        }
+
+    }
 }
diff --git a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
index e3d52e1..c488640 100644
--- a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
+++ b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
@@ -20,7 +20,6 @@
 
 import static java.util.Collections.emptyMap;
 
-import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.ClipData;
 import android.content.Context;
@@ -40,6 +39,7 @@
 import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.collection.ArrayMap;
 import androidx.core.app.ActivityOptionsCompat;
 import androidx.core.content.ContextCompat;
@@ -356,7 +356,11 @@
      * <p>
      * This can be extended to override {@link #createIntent} if you wish to pass additional
      * extras to the Intent created by {@code super.createIntent()}.
+     *
+     * @deprecated The thumbnail bitmap is rarely returned and is not a good signal to determine
+     * whether the video was actually successfully captured. Use {@link CaptureVideo} to instead.
      */
+    @Deprecated
     public static class TakeVideo extends ActivityResultContract<Uri, Bitmap> {
 
         @CallSuper
@@ -383,6 +387,40 @@
     }
 
     /**
+     * An {@link ActivityResultContract} to
+     * {@link MediaStore#ACTION_VIDEO_CAPTURE take a video} saving it into the provided
+     * content-{@link Uri}.
+     * <p>
+     * Returns {@code true} if the video was saved into the given {@link Uri}.
+     * <p>
+     * This can be extended to override {@link #createIntent} if you wish to pass additional
+     * extras to the Intent created by {@code super.createIntent()}.
+     */
+    public static class CaptureVideo extends ActivityResultContract<Uri, Boolean> {
+
+        @CallSuper
+        @NonNull
+        @Override
+        public Intent createIntent(@NonNull Context context, @NonNull Uri input) {
+            return new Intent(MediaStore.ACTION_VIDEO_CAPTURE)
+                    .putExtra(MediaStore.EXTRA_OUTPUT, input);
+        }
+
+        @Nullable
+        @Override
+        public final SynchronousResult<Boolean> getSynchronousResult(@NonNull Context context,
+                @NonNull Uri input) {
+            return null;
+        }
+
+        @NonNull
+        @Override
+        public final Boolean parseResult(int resultCode, @Nullable Intent intent) {
+            return resultCode == Activity.RESULT_OK;
+        }
+    }
+
+    /**
      * An {@link ActivityResultContract} to request the user to pick a contact from the contacts
      * app.
      * <p>
@@ -456,7 +494,7 @@
      * This can be extended to override {@link #createIntent} if you wish to pass additional
      * extras to the Intent created by {@code super.createIntent()}.
      */
-    @TargetApi(18)
+    @RequiresApi(18)
     public static class GetMultipleContents extends ActivityResultContract<String, List<Uri>> {
 
         @CallSuper
@@ -520,7 +558,7 @@
      *
      * @see DocumentsContract
      */
-    @TargetApi(19)
+    @RequiresApi(19)
     public static class OpenDocument extends ActivityResultContract<String[], Uri> {
 
         @CallSuper
@@ -558,7 +596,7 @@
      *
      * @see DocumentsContract
      */
-    @TargetApi(19)
+    @RequiresApi(19)
     public static class OpenMultipleDocuments extends ActivityResultContract<String[], List<Uri>> {
 
         @CallSuper
@@ -600,7 +638,7 @@
      * @see DocumentsContract#buildDocumentUriUsingTree
      * @see DocumentsContract#buildChildDocumentsUriUsingTree
      */
-    @TargetApi(21)
+    @RequiresApi(21)
     public static class OpenDocumentTree extends ActivityResultContract<Uri, Uri> {
 
         @CallSuper
@@ -639,7 +677,7 @@
      * This can be extended to override {@link #createIntent} if you wish to pass additional
      * extras to the Intent created by {@code super.createIntent()}.
      */
-    @TargetApi(19)
+    @RequiresApi(19)
     public static class CreateDocument extends ActivityResultContract<String, Uri> {
 
         @CallSuper
diff --git a/activity/integration-tests/testapp/build.gradle b/activity/integration-tests/testapp/build.gradle
index 6216bf8..11e5101 100644
--- a/activity/integration-tests/testapp/build.gradle
+++ b/activity/integration-tests/testapp/build.gradle
@@ -32,12 +32,13 @@
 
 dependencies {
     implementation(project(":activity:activity-ktx"))
+    implementation(projectOrArtifact(":lifecycle:lifecycle-runtime-ktx"))
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
 }
diff --git a/activity/integration-tests/testapp/lint-baseline.xml b/activity/integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/activity/integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/activity/integration-tests/testapp/src/main/AndroidManifest.xml b/activity/integration-tests/testapp/src/main/AndroidManifest.xml
index af315b5..b801794 100644
--- a/activity/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/activity/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -27,6 +27,11 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
+        <activity
+            android:name="androidx.activity.integration.testapp.PipActivity"
+            android:exported="true"
+            android:supportsPictureInPicture="true"
+            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
         <provider
             android:name="androidx.core.content.FileProvider"
             android:authorities="androidx.activity.integration.testapp"
diff --git a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
index c182859..29a4375 100644
--- a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
+++ b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
@@ -33,8 +33,10 @@
 import android.widget.LinearLayout.VERTICAL
 import android.widget.Toast
 import androidx.activity.ComponentActivity
+import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.IntentSenderRequest
 import androidx.activity.result.contract.ActivityResultContracts
+import androidx.activity.result.contract.ActivityResultContracts.CaptureVideo
 import androidx.activity.result.contract.ActivityResultContracts.GetContent
 import androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments
 import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
@@ -61,17 +63,15 @@
         toast("Got picture: $success")
     }
 
+    val captureVideo = registerForActivityResult(CaptureVideo()) { success ->
+        toast("Got video: $success")
+    }
+
     val getContent = registerForActivityResult(GetContent()) { uri ->
         toast("Got image: $uri")
     }
 
-    val openDocuments = registerForActivityResult(OpenMultipleDocuments()) { uris ->
-        var docs = ""
-        uris.forEach {
-            docs += "uri: $it \n"
-        }
-        toast("Got documents: $docs")
-    }
+    lateinit var openDocuments: ActivityResultLauncher<Array<String>>
 
     val intentSender = registerForActivityResult(
         ActivityResultContracts
@@ -83,6 +83,16 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        if (android.os.Build.VERSION.SDK_INT >= 19) {
+            openDocuments = registerForActivityResult(OpenMultipleDocuments()) { uris ->
+                var docs = ""
+                uris.forEach {
+                    docs += "uri: $it \n"
+                }
+                toast("Got documents: $docs")
+            }
+        }
+
         setContentView {
             add(::LinearLayout) {
                 orientation = VERTICAL
@@ -98,11 +108,18 @@
                     val uri = FileProvider.getUriForFile(this@MainActivity, packageName, file)
                     takePicture.launch(uri)
                 }
+                button("Capture video") {
+                    val file = File(filesDir, "video")
+                    val uri = FileProvider.getUriForFile(this@MainActivity, packageName, file)
+                    captureVideo.launch(uri)
+                }
                 button("Pick an image") {
                     getContent.launch("image/*")
                 }
-                button("Open documents") {
-                    openDocuments.launch(arrayOf("*/*"))
+                if (android.os.Build.VERSION.SDK_INT >= 19) {
+                    button("Open documents") {
+                        openDocuments.launch(arrayOf("*/*"))
+                    }
                 }
                 button("Start IntentSender") {
                     val request = IntentSenderRequest.Builder(
diff --git a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/PipActivity.kt b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/PipActivity.kt
new file mode 100644
index 0000000..0f1f268
--- /dev/null
+++ b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/PipActivity.kt
@@ -0,0 +1,95 @@
+/*
+ * 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.activity.integration.testapp
+
+import android.app.Activity
+import android.app.PictureInPictureParams
+import android.os.Build
+import android.os.Bundle
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.RelativeLayout
+import android.widget.TextView
+import androidx.activity.ComponentActivity
+import androidx.activity.trackPipAnimationHintView
+import androidx.annotation.RequiresApi
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.addRepeatingJob
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+@ExperimentalCoroutinesApi
+class PipActivity : ComponentActivity() {
+
+    private lateinit var moveButton: Button
+    private lateinit var textView: TextView
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.pip_activity)
+        moveButton = findViewById(R.id.moveButton)
+        textView = findViewById(R.id.textView)
+
+        moveToRandomPosition()
+        moveButton.setOnClickListener {
+            moveToRandomPosition()
+        }
+
+        trackHintView()
+    }
+
+    override fun onPictureInPictureRequested(): Boolean {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            Api26Impl.enterPictureInPictureMode(this)
+        }
+        return true
+    }
+
+    @ExperimentalCoroutinesApi
+    private fun trackHintView() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            addRepeatingJob(Lifecycle.State.STARTED) {
+                trackPipAnimationHintView(moveButton)
+            }
+        }
+    }
+
+    private fun moveToRandomPosition() {
+        moveButton.layoutParams = RelativeLayout.LayoutParams(
+            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
+        ).apply {
+            randomPosition().forEach { rule -> addRule(rule) }
+        }
+    }
+
+    private fun randomPosition(): List<Int> {
+        return when ((0..4).random()) {
+            0 -> listOf(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.CENTER_HORIZONTAL)
+            1 -> listOf(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.CENTER_HORIZONTAL)
+            2 -> listOf(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.CENTER_VERTICAL)
+            3 -> listOf(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.CENTER_VERTICAL)
+            4 -> listOf(RelativeLayout.CENTER_IN_PARENT)
+            else -> throw IllegalArgumentException()
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.O)
+    internal object Api26Impl {
+        fun enterPictureInPictureMode(activity: Activity) {
+            activity.enterPictureInPictureMode(PictureInPictureParams.Builder().build())
+        }
+    }
+}
\ No newline at end of file
diff --git a/activity/integration-tests/testapp/src/main/res/layout/pip_activity.xml b/activity/integration-tests/testapp/src/main/res/layout/pip_activity.xml
new file mode 100644
index 0000000..876921c
--- /dev/null
+++ b/activity/integration-tests/testapp/src/main/res/layout/pip_activity.xml
@@ -0,0 +1,75 @@
+<?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">
+
+    <Button
+        android:id="@+id/moveButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Move"/>
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="200dp"
+                android:text="Text"
+                android:layout_gravity="center_horizontal"
+                android:textColor="#000000"/>
+
+            <TextView
+                android:id="@+id/textView"
+                android:layout_width="wrap_content"
+                android:layout_height="200dp"
+                android:text="Text"
+                android:layout_gravity="center_horizontal"
+                android:textColor="#000000"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="200dp"
+                android:text="Text"
+                android:layout_gravity="center_horizontal"
+                android:textColor="#000000"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="200dp"
+                android:text="Text"
+                android:layout_gravity="center_horizontal"
+                android:textColor="#000000"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="200dp"
+                android:text="Text"
+                android:layout_gravity="center_horizontal"
+                android:textColor="#000000"/>
+        </LinearLayout>
+
+    </ScrollView>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/ads/ads-identifier-benchmark/build.gradle b/ads/ads-identifier-benchmark/build.gradle
index cc75f5d..95e55d2 100644
--- a/ads/ads-identifier-benchmark/build.gradle
+++ b/ads/ads-identifier-benchmark/build.gradle
@@ -35,5 +35,5 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
diff --git a/ads/ads-identifier-benchmark/lint-baseline.xml b/ads/ads-identifier-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/ads/ads-identifier-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/ads/ads-identifier-common/lint-baseline.xml b/ads/ads-identifier-common/lint-baseline.xml
index 6b37260..46a8e35 100644
--- a/ads/ads-identifier-common/lint-baseline.xml
+++ b/ads/ads-identifier-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/ads/ads-identifier-provider/build.gradle b/ads/ads-identifier-provider/build.gradle
index d412cd9..f1039b5 100644
--- a/ads/ads-identifier-provider/build.gradle
+++ b/ads/ads-identifier-provider/build.gradle
@@ -39,7 +39,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
index 07c5eaf..5830381 100644
--- a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/ads/ads-identifier-provider/integration-tests/testapp/src/main/res/values/strings.xml b/ads/ads-identifier-provider/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from ads/ads-identifier-provider/integration-tests/testapp/src/main/res/values/strings.xml
rename to ads/ads-identifier-provider/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/ads/ads-identifier-provider/lint-baseline.xml b/ads/ads-identifier-provider/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/ads/ads-identifier-provider/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/ads/ads-identifier-testing/build.gradle b/ads/ads-identifier-testing/build.gradle
index 07d65f8..c54af2d 100644
--- a/ads/ads-identifier-testing/build.gradle
+++ b/ads/ads-identifier-testing/build.gradle
@@ -24,16 +24,11 @@
 dependencies {
     implementation(project(":ads-identifier-common"))
     api("androidx.annotation:annotation:1.1.0")
-    api(MOCKITO_CORE, libs.exclude_bytebuddy)
+    api(MOCKITO_CORE, excludes.bytebuddy)
 }
 
 android {
     lintOptions {
         disable "InvalidPackage" // Lint is unhappy about mockito package
     }
-
-    compileOptions {
-        sourceCompatibility(JavaVersion.VERSION_1_7)
-        targetCompatibility(JavaVersion.VERSION_1_7)
-    }
 }
diff --git a/ads/ads-identifier-testing/lint-baseline.xml b/ads/ads-identifier-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/ads/ads-identifier-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/ads/ads-identifier/build.gradle b/ads/ads-identifier/build.gradle
index 6841cce..c844d83 100644
--- a/ads/ads-identifier/build.gradle
+++ b/ads/ads-identifier/build.gradle
@@ -41,14 +41,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
-}
-
-android {
-    compileOptions {
-        sourceCompatibility(JavaVersion.VERSION_1_7)
-        targetCompatibility(JavaVersion.VERSION_1_7)
-    }
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
index dd2755a..09c1c25 100644
--- a/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/ads/ads-identifier/integration-tests/testapp/src/main/res/values/strings.xml b/ads/ads-identifier/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from ads/ads-identifier/integration-tests/testapp/src/main/res/values/strings.xml
rename to ads/ads-identifier/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/ads/ads-identifier/lint-baseline.xml b/ads/ads-identifier/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/ads/ads-identifier/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/androidx-plugin/build.gradle b/androidx-plugin/build.gradle
index 154fadc..3b6650b 100644
--- a/androidx-plugin/build.gradle
+++ b/androidx-plugin/build.gradle
@@ -1,13 +1,11 @@
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 buildscript {
-    apply from: "../buildSrc/build_dependencies.gradle"
-
     repositories {
         google()
         jcenter()
         maven {
-            url("https://androidx.dev/dokka/builds/6656073/artifacts/repository")
+            url("https://androidx.dev/dokka/builds/7299536/artifacts/repository")
             metadataSources {
                 mavenPom()
                 artifact()
@@ -16,10 +14,9 @@
     }
 
     dependencies {
-        classpath build_libs.agp
-        classpath build_libs.kotlin.gradle_plugin
-        classpath "org.jetbrains.dokka:dokka-gradle-plugin:${build_versions.dokka}"
-        classpath "org.jetbrains.dokka:dokka-android-gradle-plugin:${build_versions.dokka}"
+        classpath(libs.androidGradlePlugin)
+        classpath(libs.kotlinGradlePlugin)
+        classpath(libs.dokkaGradlePlugin)
     }
 }
 
@@ -29,14 +26,14 @@
         mavenCentral()
         jcenter()
         maven {
-            url("https://androidx.dev/metalava/builds/6604778/artifacts/repo/m2repository")
+            url("https://androidx.dev/metalava/builds/7255182/artifacts/repo/m2repository")
             metadataSources {
                 mavenPom()
                 artifact()
             }
         }
         maven {
-            url("https://androidx.dev/dokka/builds/6656073/artifacts/repository")
+            url("https://androidx.dev/dokka/builds/7299536/artifacts/repository")
             metadataSources {
                 mavenPom()
                 artifact()
diff --git a/androidx-plugin/gradle-plugin/build.gradle b/androidx-plugin/gradle-plugin/build.gradle
index 5ec65c17..7f6bef7 100644
--- a/androidx-plugin/gradle-plugin/build.gradle
+++ b/androidx-plugin/gradle-plugin/build.gradle
@@ -7,7 +7,6 @@
 
 ext.supportRootFolder = project.projectDir.getParentFile().getParentFile()
 
-apply from: "../../buildSrc/build_dependencies.gradle"
 apply from: "../../buildSrc/kotlin-dsl-dependency.gradle"
 
 dependencies {
@@ -16,21 +15,20 @@
     compileOnly(findGradleKotlinDsl())
     implementation(gradleApi())
 
-    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${build_versions.kotlin}")
+    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${libs.versions.kotlin.get()}")
 
-    implementation(build_libs.agp)
-    implementation(build_libs.dex_member_list)
-    implementation(build_libs.kotlin.gradle_plugin)
-    implementation(build_libs.kotlinpoet)
+    implementation(libs.androidGradlePlugin)
+    implementation(libs.dexMemberList)
+    implementation(libs.kotlinGradlePlugin)
+    implementation(libs.kotlinPoet)
 
-    implementation("org.jetbrains.dokka:dokka-gradle-plugin:${build_versions.dokka}")
-    implementation("org.jetbrains.dokka:dokka-android-gradle-plugin:${build_versions.dokka}")
+    implementation(libs.dokkaGradlePlugin)
 
     // Not really sure about these:
     implementation("androidx.benchmark:benchmark-gradle-plugin:1.0.0")
     implementation("com.google.protobuf:protobuf-gradle-plugin:0.8.13")
-    implementation("org.anarres.jarjar:jarjar-gradle:1.0.1")
-    implementation("com.github.jengelman.gradle.plugins:shadow:5.2.0")
+    implementation(libs.shadow)
+    implementation(libs.wireGradlePlugin)
 }
 
 sourceSets {
diff --git a/androidx-plugin/settings.gradle b/androidx-plugin/settings.gradle
index 6c460ee..490f67f 100644
--- a/androidx-plugin/settings.gradle
+++ b/androidx-plugin/settings.gradle
@@ -1,3 +1,13 @@
+enableFeaturePreview("VERSION_CATALOGS")
+
+dependencyResolutionManagement {
+    versionCatalogs {
+        libs {
+            from(files("../gradle/libs.versions.toml"))
+        }
+    }
+}
+
 include ":gradle-plugin"
 include ":jetpad-integration"
 project(":jetpad-integration").projectDir = file("../buildSrc/jetpad-integration")
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/build.gradle b/annotation/annotation-experimental-lint/build.gradle
index 2434718..ba26632 100644
--- a/annotation/annotation-experimental-lint/build.gradle
+++ b/annotation/annotation-experimental-lint/build.gradle
@@ -34,7 +34,13 @@
 }
 
 dependencies {
-    compileOnly(LINT_API_LATEST)
+    // compileOnly because we use lintChecks and it doesn't allow other types of deps
+    // this ugly hack exists because of b/63873667
+    if (rootProject.hasProperty("android.injected.invoked.from.ide")) {
+        compileOnly(LINT_API_LATEST)
+    } else {
+        compileOnly(LINT_API_MIN)
+    }
     compileOnly(KOTLIN_STDLIB)
 
     testImplementation(KOTLIN_STDLIB)
diff --git a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
index 7f7d50f..061025b 100644
--- a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
+++ b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
@@ -1,5 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ExperimentalAnnotationRetention"
+        message="Experimental annotation has `RUNTIME` retention, should use default (`CLASS`)"
+        errorLine1="public @interface ExperimentalJavaAnnotationWrongRetention {}"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/ExperimentalJavaAnnotationWrongRetention.java"
+            line="28"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ExperimentalAnnotationRetention"
+        message="Experimental annotation has default (`RUNTIME`) retention, should use `BINARY`"
+        errorLine1="annotation class ExperimentalKotlinAnnotationWrongRetention"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt"
+            line="21"
+            column="18"/>
+    </issue>
 
     <issue
         id="UnsafeOptInUsageError"
@@ -59,55 +81,55 @@
     <issue
         id="UnsafeOptInUsageError"
         message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        errorLine1="@RequiresOptIn(level = RequiresOptIn.Level.ERROR)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalDateTimeKt.kt"
-            line="20"
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt"
+            line="19"
             column="1"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
         message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        errorLine1="@RequiresOptIn(level = RequiresOptIn.Level.ERROR)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalDateTimeKt.kt"
-            line="20"
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt"
+            line="19"
             column="1"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
         message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        errorLine1="@RequiresOptIn(level = RequiresOptIn.Level.ERROR)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalDateTimeKt.kt"
-            line="20"
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt"
+            line="19"
             column="1"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
         message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        errorLine1="@RequiresOptIn(level = RequiresOptIn.Level.ERROR)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalDateTimeKt.kt"
-            line="20"
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt"
+            line="19"
             column="1"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
         message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        errorLine1="@RequiresOptIn(level = RequiresOptIn.Level.ERROR)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalDateTimeKt.kt"
-            line="20"
+            file="src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt"
+            line="19"
             column="1"/>
     </issue>
 
@@ -135,24 +157,46 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalLocationKt.kt"
-            line="20"
-            column="1"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java"
+            line="31"
+            column="49"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
-        message="Failed to extract attribute &quot;level&quot; from annotation"
-        errorLine1="@RequiresOptIn"
-        errorLine2="~~~~~~~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/ExperimentalLocationKt.kt"
-            line="20"
-            column="1"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java"
+            line="39"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return experimentalObject.method();"
+        errorLine2="                                  ~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java"
+            line="40"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaClass.methodStatic();"
+        errorLine2="                                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java"
+            line="54"
+            column="35"/>
     </issue>
 
     <issue
@@ -179,28 +223,6 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)&apos;"
-        errorLine1="        DateProvider dateProvider = new DateProvider();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromJava.java"
-            line="27"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)&apos;"
-        errorLine1="        return dateProvider.getDate();"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromJava.java"
-            line="28"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.experimental.ExperimentalLocation&apos; or &apos;@OptIn(markerClass = sample.experimental.ExperimentalLocation.class)&apos;"
         errorLine1="        LocationProvider locationProvider = new LocationProvider();"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~">
@@ -223,46 +245,13 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalLocation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalLocation.class)&apos;"
-        errorLine1="        LocationProvider locationProvider = new LocationProvider();"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromJava.java"
-            line="55"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalLocation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalLocation.class)&apos;"
-        errorLine1="        return dateProvider.getDate() + locationProvider.getLocation();"
-        errorLine2="                                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromJava.java"
-            line="56"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)&apos;"
-        errorLine1="        val dateProvider = DateProvider()"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="27"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)&apos;"
-        errorLine1="        return dateProvider.date"
-        errorLine2="                            ~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        val experimentalObject = AnnotatedJavaClass()"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
             line="28"
-            column="29"/>
+            column="34"/>
     </issue>
 
     <issue
@@ -289,24 +278,35 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalLocation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalLocation.class)&apos;"
-        errorLine1="        val locationProvider = LocationProvider()"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        val experimentalObject = AnnotatedJavaClass()"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="55"
-            column="32"/>
+            line="36"
+            column="34"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalLocation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalLocation.class)&apos;"
-        errorLine1="        return dateProvider.date + locationProvider.location"
-        errorLine2="                                                    ~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return experimentalObject.method()"
+        errorLine2="                                  ~~~~~~">
         <location
             file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="56"
-            column="53"/>
+            line="37"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaClass.methodStatic()"
+        errorLine2="                                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
+            line="51"
+            column="35"/>
     </issue>
 
     <issue
@@ -333,6 +333,105 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return stableObject.field"
+        errorLine2="                            ~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
+            line="77"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return stableObject.method()"
+        errorLine2="                            ~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
+            line="85"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaMembers.FIELD_STATIC"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
+            line="92"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaMembers.methodStatic()"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
+            line="99"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return stableObject.field;"
+        errorLine2="                            ~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
+            line="30"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return stableObject.method();"
+        errorLine2="                            ~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
+            line="38"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaMembers.FIELD_STATIC;"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
+            line="45"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        return AnnotatedJavaMembers.methodStatic();"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
+            line="52"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation2&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation2.class)&apos;"
+        errorLine1="        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java"
+            line="33"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.experimental.foo.ExperimentalPackage&apos; or &apos;@OptIn(markerClass = sample.experimental.foo.ExperimentalPackage.class)&apos;"
         errorLine1="        callPackageExperimental();"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -344,23 +443,12 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.foo.ExperimentalPackage&apos; or &apos;@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)&apos;"
-        errorLine1="        callPackageExperimental();"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        safePropagateMarker();"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/sample/optin/UseJavaPackageFromJava.java"
-            line="54"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.foo.ExperimentalPackage&apos; or &apos;@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)&apos;"
-        errorLine1="        callPackageExperimental()"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"
-            line="54"
+            line="67"
             column="9"/>
     </issue>
 
@@ -377,6 +465,17 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        callPackageExperimental()"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"
+            line="64"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.experimental.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.experimental.ExperimentalDateTime.class)&apos;"
         errorLine1="        new TimeProviderKt().getTimeJava();"
         errorLine2="                             ~~~~~~~~~~~">
@@ -388,13 +487,13 @@
 
     <issue
         id="UnsafeOptInUsageError"
-        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalDateTime&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)&apos;"
-        errorLine1="        new TimeProviderKt().getTimeJava();"
-        errorLine2="                             ~~~~~~~~~~~">
+        message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@sample.optin.ExperimentalJavaAnnotation&apos; or &apos;@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)&apos;"
+        errorLine1="        new AnnotatedKotlinMembers().methodWithJavaMarker();"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="98"
-            column="30"/>
+            line="108"
+            column="38"/>
     </issue>
 
 </issues>
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass.java
new file mode 100644
index 0000000..217333f
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass.java
@@ -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 sample.optin;
+
+/**
+ * Class which is experimental.
+ */
+@ExperimentalJavaAnnotation
+class AnnotatedJavaClass {
+    public static final int FIELD_STATIC = -1;
+
+    public static int methodStatic() {
+        return -1;
+    }
+
+    public final int field = -1;
+
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass2.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass2.java
new file mode 100644
index 0000000..c505a37
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaClass2.java
@@ -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 sample.optin;
+
+/**
+ * Class which is experimental.
+ */
+@ExperimentalJavaAnnotation2
+class AnnotatedJavaClass2 {
+    public static final int FIELD_STATIC = -1;
+
+    public static int methodStatic() {
+        return -1;
+    }
+
+    public final int field = -1;
+
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaMembers.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaMembers.java
new file mode 100644
index 0000000..406cb9f
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedJavaMembers.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 sample.optin;
+
+/**
+ * Class which is stable but has experimental members.
+ */
+class AnnotatedJavaMembers {
+    @ExperimentalJavaAnnotation
+    public static final int FIELD_STATIC = -1;
+
+    @ExperimentalJavaAnnotation
+    public static int methodStatic() {
+        return -1;
+    }
+
+    @ExperimentalJavaAnnotation
+    public final int field = -1;
+
+    @ExperimentalJavaAnnotation
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass.kt
new file mode 100644
index 0000000..f23d75d
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass.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 sample.optin
+
+@ExperimentalKotlinAnnotation
+open class AnnotatedKotlinClass {
+    val field: Int = -1
+
+    fun method(): Int {
+        return -1
+    }
+
+    companion object {
+        @JvmStatic
+        val fieldStatic: Int = -1
+
+        @JvmStatic
+        fun methodStatic(): Int {
+            return -1
+        }
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass2.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass2.kt
new file mode 100644
index 0000000..eea7fe0
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinClass2.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 sample.optin
+
+@ExperimentalKotlinAnnotation2
+open class AnnotatedKotlinClass2 {
+    val field: Int = -1
+
+    fun method(): Int {
+        return -1
+    }
+
+    companion object {
+        const val fieldStatic: Int = -1
+
+        @JvmStatic
+        fun methodStatic(): Int {
+            return -1
+        }
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinMembers.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinMembers.kt
new file mode 100644
index 0000000..79a309e
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/AnnotatedKotlinMembers.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.
+ */
+
+package sample.optin
+
+open class AnnotatedKotlinMembers {
+    @ExperimentalKotlinAnnotation
+    val field: Int = -1
+
+    @ExperimentalKotlinAnnotation
+    fun method(): Int {
+        return -1
+    }
+
+    @ExperimentalJavaAnnotation
+    fun methodWithJavaMarker(): Int {
+        return -1
+    }
+
+    internal companion object {
+        @JvmStatic
+        @ExperimentalKotlinAnnotation
+        fun methodStatic(): Int {
+            return -1
+        }
+
+        @JvmStatic
+        @ExperimentalKotlinAnnotation
+        val fieldStatic: Int = -1
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProvider.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProvider.java
deleted file mode 100644
index 812c484..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin;
-
-@ExperimentalDateTime
-class DateProvider {
-    int getDate() {
-        return -1;
-    }
-}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProviderKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProviderKt.kt
deleted file mode 100644
index 1bd6341..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/DateProviderKt.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin
-
-@ExperimentalDateTimeKt
-open class DateProviderKt {
-    fun getDate(): Int {
-        return -1
-    }
-}
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTime.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTime.java
deleted file mode 100644
index ae873b8..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTime.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin;
-
-import static androidx.annotation.RequiresOptIn.Level.ERROR;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import androidx.annotation.RequiresOptIn;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Retention(CLASS)
-@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD,
-        ElementType.PACKAGE})
-@RequiresOptIn(level = ERROR)
-@interface ExperimentalDateTime {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTimeKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTimeKt.kt
deleted file mode 100644
index 40b50c0..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalDateTimeKt.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin
-
-@Suppress("DEPRECATION")
-@RequiresOptIn
-@Retention(AnnotationRetention.BINARY)
-@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
-annotation class ExperimentalDateTimeKt
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation.java
new file mode 100644
index 0000000..7ca12fca
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation.java
@@ -0,0 +1,24 @@
+/*
+ * 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 sample.optin;
+
+import static androidx.annotation.RequiresOptIn.Level.ERROR;
+
+import androidx.annotation.RequiresOptIn;
+
+@RequiresOptIn(level = ERROR)
+public @interface ExperimentalJavaAnnotation {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation2.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation2.java
new file mode 100644
index 0000000..f745f39
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotation2.java
@@ -0,0 +1,28 @@
+/*
+ * 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 sample.optin;
+
+import static androidx.annotation.RequiresOptIn.Level.ERROR;
+
+import androidx.annotation.RequiresOptIn;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@RequiresOptIn(level = ERROR)
+@Retention(RetentionPolicy.CLASS)
+public @interface ExperimentalJavaAnnotation2 {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotationWrongRetention.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotationWrongRetention.java
new file mode 100644
index 0000000..c8a4588
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalJavaAnnotationWrongRetention.java
@@ -0,0 +1,28 @@
+/*
+ * 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 sample.optin;
+
+import static androidx.annotation.RequiresOptIn.Level.ERROR;
+
+import androidx.annotation.RequiresOptIn;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@RequiresOptIn(level = ERROR)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExperimentalJavaAnnotationWrongRetention {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt
new file mode 100644
index 0000000..759d0de
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.optin
+
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalKotlinAnnotation
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation2.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation2.kt
new file mode 100644
index 0000000..56c3475
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotation2.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.optin
+
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalKotlinAnnotation2
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt
new file mode 100644
index 0000000..774a77c
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.optin
+
+@Suppress("unused")
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+annotation class ExperimentalKotlinAnnotationWrongRetention
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocation.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocation.java
deleted file mode 100644
index 7019747..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin;
-
-import static androidx.annotation.RequiresOptIn.Level.ERROR;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import androidx.annotation.RequiresOptIn;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Retention(CLASS)
-@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD,
-        ElementType.PACKAGE})
-@RequiresOptIn(level = ERROR)
-@interface ExperimentalLocation {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocationKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocationKt.kt
deleted file mode 100644
index 5a2e6cf..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/ExperimentalLocationKt.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin
-
-@Suppress("DEPRECATION")
-@RequiresOptIn
-@Retention(AnnotationRetention.BINARY)
-@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
-annotation class ExperimentalLocationKt
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProvider.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProvider.java
deleted file mode 100644
index 26017ad..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin;
-
-@ExperimentalLocation
-class LocationProvider {
-    int getLocation() {
-        return -1;
-    }
-}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProviderKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProviderKt.kt
deleted file mode 100644
index 847e88a..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/LocationProviderKt.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin
-
-@ExperimentalLocationKt
-class LocationProviderKt {
-    fun getLocation(): Int {
-        return -1
-    }
-}
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/TimeProviderKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/TimeProviderKt.kt
deleted file mode 100644
index faab09c..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/TimeProviderKt.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin
-
-class TimeProviderKt {
-    @ExperimentalDateTimeKt
-    fun getTime(): Int {
-        return -1
-    }
-
-    @ExperimentalDateTime
-    fun getTimeJava(): Int {
-        return -1
-    }
-
-    internal companion object {
-        @JvmStatic
-        @ExperimentalDateTimeKt
-        fun getTimeStatically(): Int {
-            return -1
-        }
-    }
-}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java
new file mode 100644
index 0000000..60f8fba
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalClassFromJava.java
@@ -0,0 +1,74 @@
+/*
+ * 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 sample.optin;
+
+import androidx.annotation.OptIn;
+
+/**
+ * Tests for calls made to members on an experimental class.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalClassFromJava {
+
+    /**
+     * Unsafe call into a field on an experimental class.
+     */
+    int unsafeExperimentalClassField() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.field;
+    }
+
+    /**
+     * Unsafe call into a method on an experimental class.
+     */
+    int unsafeExperimentalClassMethod() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Unsafe call into a static field on an experimental class.
+     */
+    int unsafeExperimentalClassStaticField() {
+        return AnnotatedJavaClass.FIELD_STATIC;
+    }
+
+    /**
+     * Unsafe call into a static method on an experimental class.
+     */
+    int unsafeExperimentalClassStaticMethod() {
+        return AnnotatedJavaClass.methodStatic();
+    }
+
+    /**
+     * Safe call due to propagation of experimental annotation.
+     */
+    @ExperimentalJavaAnnotation
+    int safePropagateMarker() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    int safeOptInMarker() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromJava.java
deleted file mode 100644
index 3a7f797..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromJava.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin;
-
-import androidx.annotation.OptIn;
-
-@SuppressWarnings({"unused", "WeakerAccess"})
-class UseJavaExperimentalFromJava {
-    /**
-     * Unsafe call into an experimental class.
-     */
-    int getDateUnsafe() {
-        DateProvider dateProvider = new DateProvider();
-        return dateProvider.getDate();
-    }
-
-    @ExperimentalDateTime
-    int getDateExperimental() {
-        DateProvider dateProvider = new DateProvider();
-        return dateProvider.getDate();
-    }
-
-    @OptIn(markerClass = ExperimentalDateTime.class)
-    int getDateUseExperimental() {
-        DateProvider dateProvider = new DateProvider();
-        return dateProvider.getDate();
-    }
-
-    void displayDate() {
-        System.out.println("" + getDateUnsafe());
-    }
-
-    // Tests involving multiple experimental markers.
-
-    /**
-     * Unsafe call into an experimental class.
-     */
-    @ExperimentalDateTime
-    int getDateExperimentalLocationUnsafe() {
-        DateProvider dateProvider = new DateProvider();
-        LocationProvider locationProvider = new LocationProvider();
-        return dateProvider.getDate() + locationProvider.getLocation();
-    }
-
-    @ExperimentalDateTime
-    @ExperimentalLocation
-    int getDateAndLocationExperimental() {
-        DateProvider dateProvider = new DateProvider();
-        LocationProvider locationProvider = new LocationProvider();
-        return dateProvider.getDate() + locationProvider.getLocation();
-    }
-
-    @OptIn(markerClass = ExperimentalDateTime.class)
-    @ExperimentalLocation
-    int getDateUseExperimentalLocationExperimental() {
-        DateProvider dateProvider = new DateProvider();
-        LocationProvider locationProvider = new LocationProvider();
-        return dateProvider.getDate() + locationProvider.getLocation();
-    }
-
-    @OptIn(markerClass = { ExperimentalDateTime.class, ExperimentalLocation.class })
-    int getDateAndLocationUseExperimental() {
-        DateProvider dateProvider = new DateProvider();
-        LocationProvider locationProvider = new LocationProvider();
-        return dateProvider.getDate() + locationProvider.getLocation();
-    }
-}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromKt.kt
index 6bab642..af88dc8 100644
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromKt.kt
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalFromKt.kt
@@ -20,62 +20,120 @@
 
 @Suppress("unused", "MemberVisibilityCanBePrivate")
 class UseJavaExperimentalFromKt {
-    /**
-     * Unsafe call into an experimental class.
-     */
-    fun getDateUnsafe(): Int {
-        val dateProvider = DateProvider()
-        return dateProvider.date
-    }
-
-    @ExperimentalDateTime
-    fun getDateExperimental(): Int {
-        val dateProvider = DateProvider()
-        return dateProvider.date
-    }
-
-    @OptIn(ExperimentalDateTime::class)
-    fun getDateUseExperimental(): Int {
-        val dateProvider = DateProvider()
-        return dateProvider.date
-    }
-
-    fun displayDate() {
-        println("" + getDateUnsafe())
-    }
-
-    // Tests involving multiple experimental markers.
 
     /**
-     * Unsafe call into an experimental class.
+     * Unsafe call into a field on an experimental class.
      */
-    @ExperimentalDateTime
-    fun getDateExperimentalLocationUnsafe(): Int {
-        val dateProvider = DateProvider()
-        val locationProvider = LocationProvider()
-        return dateProvider.date + locationProvider.location
+    fun unsafeExperimentalClassField(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.field
     }
 
-    @ExperimentalDateTime
-    @ExperimentalLocation
-    fun getDateAndLocationExperimental(): Int {
-        val dateProvider = DateProvider()
-        val locationProvider = LocationProvider()
-        return dateProvider.date + locationProvider.location
+    /**
+     * Unsafe call into a method on an experimental class.
+     */
+    fun unsafeExperimentalClassMethod(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method()
     }
 
-    @OptIn(ExperimentalDateTime::class)
-    @ExperimentalLocation
-    fun getDateUseExperimentalLocationExperimental(): Int {
-        val dateProvider = DateProvider()
-        val locationProvider = LocationProvider()
-        return dateProvider.date + locationProvider.location
+    /**
+     * Unsafe call into a static field on an experimental class.
+     */
+    fun unsafeExperimentalClassStaticField(): Int {
+        return AnnotatedJavaClass.FIELD_STATIC
     }
 
-    @OptIn(ExperimentalDateTime::class, ExperimentalLocation::class)
-    fun getDateAndLocationUseExperimental(): Int {
-        val dateProvider = DateProvider()
-        val locationProvider = LocationProvider()
-        return dateProvider.date + locationProvider.location
+    /**
+     * Unsafe call into a static method on an experimental class.
+     */
+    fun unsafeExperimentalClassStaticMethod(): Int {
+        return AnnotatedJavaClass.methodStatic()
     }
-}
\ No newline at end of file
+
+    /**
+     * Safe call due to propagation of experimental annotation.
+     */
+    @ExperimentalJavaAnnotation
+    fun safePropagateMarker(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method()
+    }
+
+    /**
+     * Safe call due to opting in to experimental annotation.
+     */
+    @OptIn(ExperimentalJavaAnnotation::class)
+    fun safeOptInMarker(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method()
+    }
+
+    /**
+     * Unsafe call into an experimental field on a stable class.
+     */
+    fun unsafeExperimentalField(): Int {
+        val stableObject = AnnotatedJavaMembers()
+        return stableObject.field
+    }
+
+    /**
+     * Unsafe call into an experimental method on a stable class.
+     */
+    fun unsafeExperimentalMethod(): Int {
+        val stableObject = AnnotatedJavaMembers()
+        return stableObject.method()
+    }
+
+    /**
+     * Unsafe call into an experimental static field on a stable class.
+     */
+    fun unsafeExperimentalStaticField(): Int {
+        return AnnotatedJavaMembers.FIELD_STATIC
+    }
+
+    /**
+     * Unsafe call into an experimental static method on a stable class.
+     */
+    fun unsafeExperimentalStaticMethod(): Int {
+        return AnnotatedJavaMembers.methodStatic()
+    }
+
+    /**
+     * Unsafe call into multiple experimental classes.
+     */
+    @ExperimentalJavaAnnotation
+    fun unsafeMultipleExperimentalClasses(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC
+    }
+
+    /**
+     * Safe call due to propagation of both annotations.
+     */
+    @ExperimentalJavaAnnotation
+    @ExperimentalJavaAnnotation2
+    fun safePropagateMultipleMarkers(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC
+    }
+
+    /**
+     * Safe call due to opt-in of one annotation and propagation of another.
+     */
+    @OptIn(ExperimentalJavaAnnotation::class)
+    @ExperimentalJavaAnnotation2
+    fun safePropagateAndOptInMarkers(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC
+    }
+
+    /**
+     * Safe call due to opt-in of both annotations.
+     */
+    @OptIn(ExperimentalJavaAnnotation::class, ExperimentalJavaAnnotation2::class)
+    fun safeOptInMultipleMarkers(): Int {
+        val experimentalObject = AnnotatedJavaClass()
+        return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java
new file mode 100644
index 0000000..1aa316e
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sample.optin;
+
+/**
+ * Tests for calls made to experimental members on a stable class.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalMembersFromJava {
+
+    /**
+     * Unsafe call into an experimental field on a stable class.
+     */
+    int unsafeExperimentalField() {
+        AnnotatedJavaMembers stableObject = new AnnotatedJavaMembers();
+        return stableObject.field;
+    }
+
+    /**
+     * Unsafe call into an experimental method on a stable class.
+     */
+    int unsafeExperimentalMethod() {
+        AnnotatedJavaMembers stableObject = new AnnotatedJavaMembers();
+        return stableObject.method();
+    }
+
+    /**
+     * Unsafe call into an experimental static field on a stable class.
+     */
+    int unsafeExperimentalStaticField() {
+        return AnnotatedJavaMembers.FIELD_STATIC;
+    }
+
+    /**
+     * Unsafe call into an experimental static method on a stable class.
+     */
+    int unsafeExperimentalStaticMethod() {
+        return AnnotatedJavaMembers.methodStatic();
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java
new file mode 100644
index 0000000..80e0b22
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java
@@ -0,0 +1,68 @@
+/*
+ * 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 sample.optin;
+
+import androidx.annotation.OptIn;
+
+/**
+ * Tests for calls involving multiple experimental markers.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalMultipleMarkersFromJava {
+
+    /**
+     * Unsafe call into multiple experimental classes.
+     */
+    @ExperimentalJavaAnnotation
+    int unsafeMultipleExperimentalClasses() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to propagation of both annotations.
+     */
+    @ExperimentalJavaAnnotation
+    @ExperimentalJavaAnnotation2
+    int safePropagateMultipleMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to opt-in of one annotation and propagation of another.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    @ExperimentalJavaAnnotation2
+    int safePropagateAndOptInMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to opt-in of both annotations.
+     */
+    @OptIn(markerClass = { ExperimentalJavaAnnotation.class, ExperimentalJavaAnnotation2.class })
+    int safeOptInMultipleMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromJava.java
index d40176a..c316d7e7 100644
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromJava.java
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromJava.java
@@ -18,43 +18,59 @@
 
 import androidx.annotation.OptIn;
 
-import sample.optin.foo.Bar;
-import sample.optin.foo.ExperimentalPackage;
+import sample.optin.foo.AnnotatedJavaPackage;
 
+/**
+ * Tests for calls made on classes within an experimental package.
+ */
 @SuppressWarnings("unused")
 class UseJavaPackageFromJava {
+
     /**
-     * Unsafe call into a class within an experimental package.
+     * Unsafe call into a method on a class within an experimental package.
      */
-    void callPackageUnsafe() {
-        Bar bar = new Bar();
-        bar.baz();
+    void unsafeMethodInExperimentalPackage() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
     }
 
-    @ExperimentalPackage
-    void callPackageExperimental() {
-        Bar bar = new Bar();
-        bar.baz();
+    /**
+     * Safe call due to propagation of experimental marker.
+     */
+    @ExperimentalJavaAnnotation
+    void safePropagateMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
     }
 
-    @OptIn(markerClass = ExperimentalPackage.class)
-    void callPackageUseExperimental() {
-        Bar bar = new Bar();
-        bar.baz();
+    /**
+     * Safe call due to opt-in to experimental marker.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    void safeOptInMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
     }
 
-    void callSelfUnsafe() {
-        callPackageUnsafe();
+    /**
+     * Unsafe call into a method with an unsafe call. This should not be flagged, as the
+     * called method itself is not experimental.
+     */
+    void unsafeSelfExperimental() {
+        unsafeMethodInExperimentalPackage();
     }
 
     /**
      * Unsafe call into an experimental method within this class.
      */
-    void callSelfExperimental() {
-        callPackageExperimental();
+    void unsafeSelfPropagateMarker() {
+        safePropagateMarker();
     }
 
-    void callSelfUseExperimental() {
-        callPackageUseExperimental();
+    /**
+     * Safe call into an opted-in method within this class.
+     */
+    void safeSelfOptInMarker() {
+        safeOptInMarker();
     }
 }
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromKt.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromKt.kt
index 7d2f7d5..f995a66 100644
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromKt.kt
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseJavaPackageFromKt.kt
@@ -18,31 +18,41 @@
 
 import androidx.annotation.OptIn
 
-import sample.optin.foo.Bar
-import sample.optin.foo.ExperimentalPackage
+import sample.optin.foo.AnnotatedJavaPackage
 
-@Suppress("unused")
+@Suppress("unused", "MemberVisibilityCanBePrivate")
 class UseJavaPackageFromKt {
+
     /**
-     * Unsafe call into a class within an experimental package.
+     * Unsafe call into a method on a class within an experimental package.
      */
     fun callPackageUnsafe() {
-        val bar = Bar()
-        bar.baz()
+        val experimentalObject = AnnotatedJavaPackage()
+        experimentalObject.method()
     }
 
-    @ExperimentalPackage
+    /**
+     * Safe call due to propagation of experimental marker.
+     */
+    @ExperimentalJavaAnnotation
     fun callPackageExperimental() {
-        val bar = Bar()
-        bar.baz()
+        val experimentalObject = AnnotatedJavaPackage()
+        experimentalObject.method()
     }
 
-    @OptIn(ExperimentalPackage::class)
+    /**
+     * Safe call due to opt-in to experimental marker.
+     */
+    @OptIn(ExperimentalJavaAnnotation::class)
     fun callPackageUseExperimental() {
-        val bar = Bar()
-        bar.baz()
+        val experimentalObject = AnnotatedJavaPackage()
+        experimentalObject.method()
     }
 
+    /**
+     * Unsafe call into a method with an unsafe call. This should not be flagged, as the
+     * called method itself is not experimental.
+     */
     fun callSelfUnsafe() {
         callPackageUnsafe()
     }
@@ -54,7 +64,10 @@
         callPackageExperimental()
     }
 
+    /**
+     * Safe call into an opted-in method within this class.
+     */
     fun callSelfUseExperimental() {
         callPackageUseExperimental()
     }
-}
\ No newline at end of file
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseKtExperimentalFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseKtExperimentalFromJava.java
index 8dd1896..ec165d9 100644
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseKtExperimentalFromJava.java
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/UseKtExperimentalFromJava.java
@@ -20,87 +20,103 @@
 
 @SuppressWarnings({"unused", "WeakerAccess"})
 class UseKtExperimentalFromJava {
-    /**
-     * Unsafe call into an experimental class.
-     */
-    int getDateUnsafe() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        return dateProvider.getDate();
-    }
-
-    @ExperimentalDateTimeKt
-    int getDateExperimental() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        return dateProvider.getDate();
-    }
-
-    @OptIn(markerClass = ExperimentalDateTimeKt.class)
-    int getDateUseExperimental() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        return dateProvider.getDate();
-    }
-
-    void displayDate() {
-        System.out.println("" + getDateUnsafe());
-    }
-
-    // Tests involving multiple experimental markers.
 
     /**
      * Unsafe call into an experimental class.
      */
-    @ExperimentalDateTimeKt
-    int getDateExperimentalLocationUnsafe() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        LocationProviderKt locationProvider = new LocationProviderKt();
-        return dateProvider.getDate() + locationProvider.getLocation();
+    int unsafeExperimentalClassField() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
     }
 
-    @ExperimentalDateTimeKt
-    @ExperimentalLocationKt
-    int getDateAndLocationExperimental() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        LocationProviderKt locationProvider = new LocationProviderKt();
-        return dateProvider.getDate() + locationProvider.getLocation();
+    /**
+     * Safe call due to propagation of experimental annotation.
+     */
+    @ExperimentalKotlinAnnotation
+    int safePropagateMarker() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
     }
 
-    @OptIn(markerClass = ExperimentalDateTimeKt.class)
-    @ExperimentalLocationKt
-    int getDateUseExperimentalLocationExperimental() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        LocationProviderKt locationProvider = new LocationProviderKt();
-        return dateProvider.getDate() + locationProvider.getLocation();
+    /**
+     * Safe call due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    int safeOptInMarker() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
     }
 
+    /**
+     * Unsafe call into multiple experimental classes.
+     */
+    @ExperimentalKotlinAnnotation
+    int unsafeMultipleExperimentalClasses() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to propagation of both annotations.
+     */
+    @ExperimentalKotlinAnnotation
+    @ExperimentalKotlinAnnotation2
+    int safePropagateMultipleMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to opt-in of one annotation and propagation of another.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    @ExperimentalKotlinAnnotation2
+    int safePropagateAndOptInMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to opt-in of both annotations.
+     */
     @OptIn(markerClass = {
-            ExperimentalDateTimeKt.class,
-            ExperimentalLocationKt.class
+            ExperimentalKotlinAnnotation.class,
+            ExperimentalKotlinAnnotation2.class
     })
-    int getDateAndLocationUseExperimental() {
-        DateProviderKt dateProvider = new DateProviderKt();
-        LocationProviderKt locationProvider = new LocationProviderKt();
-        return dateProvider.getDate() + locationProvider.getLocation();
+    int safeOptInMultipleMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
     }
 
     /**
+     * Unsafe calls into static methods.
+     *
      * Regression test for issue reported in b/140637106, which passes here but fails in Studio.
      */
     void regressionTestStaticUsage() {
-        TimeProviderKt.getTimeStatically();
-        TimeProviderKt.Companion.getTimeStatically();
+        AnnotatedKotlinMembers.methodStatic();
+        AnnotatedKotlinMembers.Companion.methodStatic();
     }
 
     /**
+     * Unsafe calls into methods without intermediate variable.
+     *
      * Regression test for issue reported in b/140637106, which passes here but fails in Studio.
      */
     void regressionTestInlineUsage() {
-        new TimeProviderKt().getTime();
-        new TimeProviderKt().getTimeJava();
+        new AnnotatedKotlinMembers().method();
+        new AnnotatedKotlinMembers().methodWithJavaMarker();
     }
 
-    @OptIn(markerClass = ExperimentalDateTimeKt.class)
-    static class FancyDateProvider extends DateProviderKt {}
+    /**
+     * Safe usage due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    static class ExtendsAnnotatedKotlinClass extends AnnotatedKotlinClass {}
 
-    @kotlin.OptIn(markerClass = ExperimentalDateTimeKt.class)
-    static class FancyDateProvider2 extends DateProviderKt {}
+    /**
+     * Safe usage due to opting in to experimental annotation.
+     */
+    @kotlin.OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    static class ExtendsAnnotatedKotlinClass2 extends AnnotatedKotlinClass {}
 }
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/AnnotatedJavaPackage.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/AnnotatedJavaPackage.java
new file mode 100644
index 0000000..3d49f03
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/AnnotatedJavaPackage.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 sample.optin.foo;
+
+/**
+ * Class which lives in an experimental package.
+ */
+public class AnnotatedJavaPackage {
+
+    /**
+     * Method that inherits experimental status from its package.
+     */
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/Bar.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/Bar.java
deleted file mode 100644
index 7dcd141..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/Bar.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin.foo;
-
-/**
- * Test class.
- */
-@SuppressWarnings("unused")
-public class Bar {
-    /**
-     * Test method.
-     */
-    public void baz() {
-        // Stub method, nothing to see here.
-    }
-}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/ExperimentalPackage.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/ExperimentalPackage.java
deleted file mode 100644
index 8a2583f..0000000
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/ExperimentalPackage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package sample.optin.foo;
-
-import static androidx.annotation.RequiresOptIn.Level.ERROR;
-
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import androidx.annotation.RequiresOptIn;
-
-import java.lang.annotation.Retention;
-
-@Retention(CLASS)
-@RequiresOptIn(level = ERROR)
-public @interface ExperimentalPackage {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/package-info.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/package-info.java
index e344e2c..d98d8b5 100644
--- a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/package-info.java
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/optin/foo/package-info.java
@@ -14,5 +14,7 @@
  * limitations under the License.
  */
 
-@ExperimentalPackage
+@ExperimentalJavaAnnotation
 package sample.optin.foo;
+
+import sample.optin.ExperimentalJavaAnnotation;
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
new file mode 100644
index 0000000..b5a1fa6
--- /dev/null
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
@@ -0,0 +1,146 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.annotation.experimental.lint
+
+import androidx.annotation.experimental.lint.ExperimentalDetector.Companion.JAVA_EXPERIMENTAL_ANNOTATION
+import androidx.annotation.experimental.lint.ExperimentalDetector.Companion.JAVA_REQUIRES_OPT_IN_ANNOTATION
+import androidx.annotation.experimental.lint.ExperimentalDetector.Companion.KOTLIN_EXPERIMENTAL_ANNOTATION
+import androidx.annotation.experimental.lint.ExperimentalDetector.Companion.KOTLIN_REQUIRES_OPT_IN_ANNOTATION
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.ConstantEvaluator
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.isKotlin
+import com.intellij.psi.PsiField
+import org.jetbrains.kotlin.name.Name
+import org.jetbrains.uast.UAnnotated
+import org.jetbrains.uast.UAnnotation
+
+class AnnotationRetentionDetector : Detector(), Detector.UastScanner {
+
+    override fun getApplicableUastTypes() = listOf(UAnnotation::class.java)
+
+    override fun createUastHandler(context: JavaContext): UElementHandler {
+        return AnnotationChecker(context)
+    }
+
+    private inner class AnnotationChecker(val context: JavaContext) : UElementHandler() {
+        override fun visitAnnotation(node: UAnnotation) {
+            when (node.qualifiedName) {
+                KOTLIN_EXPERIMENTAL_ANNOTATION, KOTLIN_REQUIRES_OPT_IN_ANNOTATION,
+                JAVA_EXPERIMENTAL_ANNOTATION, JAVA_REQUIRES_OPT_IN_ANNOTATION -> {
+                    (node.uastParent as? UAnnotated)?.let { annotated ->
+                        validateAnnotationRetention(annotated)
+                    }
+                }
+            }
+        }
+
+        /**
+         * Validates that the [annotated] element has the correct retention, reporting an issue
+         * if it does not.
+         */
+        private fun validateAnnotationRetention(annotated: UAnnotated) {
+            val isKotlin = isKotlin(annotated.sourcePsi)
+            val annotations = context.evaluator.getAllAnnotations(annotated, false)
+
+            val annotationClass: String
+            val defaultRetention: String
+            val expectedRetention: String
+
+            if (isKotlin) {
+                // The retention must be explicitly Kotlin BINARY. While Java CLASS is technically
+                // correct, we prefer that Kotlin code be annotated with Kotlin annotations.
+                expectedRetention = "BINARY"
+                defaultRetention = "RUNTIME"
+                annotationClass = "kotlin.annotation.Retention"
+            } else {
+                // The retention can either be default (which is CLASS) or explicitly Java CLASS.
+                expectedRetention = "CLASS"
+                defaultRetention = "CLASS"
+                annotationClass = "java.lang.annotation.Retention"
+            }
+
+            val actualRetention = annotations.find { annotation ->
+                annotationClass == annotation.qualifiedName
+            }?.extractAttribute(context, "value") ?: defaultRetention
+
+            if (expectedRetention != actualRetention) {
+                report(
+                    annotated,
+                    formatRetention(expectedRetention, defaultRetention),
+                    formatRetention(actualRetention, defaultRetention),
+                )
+            }
+        }
+
+        /**
+         * Formats [retention] for presentation in an error message by adding code font and
+         * labeling it as the default value, if applicable.
+         */
+        private fun formatRetention(retention: String, defaultRetention: String): String {
+            return if (defaultRetention == retention) "default (`$retention`)" else "`$retention`"
+        }
+
+        /**
+         * Reports an issue with the [annotated] element where the [expected] retention does not
+         * match the [actual] retention.
+         */
+        private fun report(annotated: UAnnotated, expected: String, actual: String) {
+            context.report(
+                ISSUE, annotated, context.getNameLocation(annotated),
+                "Experimental annotation has $actual retention, should use $expected"
+            )
+        }
+    }
+
+    companion object {
+        val ISSUE = Issue.create(
+            "ExperimentalAnnotationRetention",
+            "Experimental annotation with incorrect retention",
+            "Experimental annotations defined in Java source should use default " +
+                "(`CLASS`) retention, while Kotlin-sourced annotations should use `BINARY` " +
+                "retention.",
+            Category.CORRECTNESS, 5, Severity.ERROR,
+            Implementation(AnnotationRetentionDetector::class.java, Scope.JAVA_FILE_SCOPE)
+        )
+    }
+}
+
+/**
+ * Attempts to extract the name of the constant used for an attribute value, returning
+ * `null` if it couldn't understand the value representation.
+ */
+@Suppress("SameParameterValue")
+fun UAnnotation.extractAttribute(
+    context: JavaContext,
+    name: String
+): String? {
+    val value = ConstantEvaluator.evaluate(context, findAttributeValue(name))
+    return when (value) {
+        is PsiField -> value.name
+        is Pair<*, *> -> (value.second as? Name)?.identifier
+        else -> null
+    }
+}
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
index e038722..89cded5 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage", "SyntheticAccessor")
+
 package androidx.annotation.experimental.lint
 
 import com.android.tools.lint.detector.api.AnnotationUsageType
@@ -41,9 +43,9 @@
 import org.jetbrains.uast.UReferenceExpression
 import org.jetbrains.uast.getParentOfType
 
-@Suppress("SyntheticAccessor", "UnstableApiUsage")
 class ExperimentalDetector : Detector(), SourceCodeScanner {
-    override fun applicableAnnotations(): List<String>? = listOf(
+
+    override fun applicableAnnotations(): List<String> = listOf(
         JAVA_EXPERIMENTAL_ANNOTATION,
         KOTLIN_EXPERIMENTAL_ANNOTATION,
         JAVA_REQUIRES_OPT_IN_ANNOTATION,
@@ -215,20 +217,20 @@
             Scope.JAVA_FILE_SCOPE
         )
 
-        private const val KOTLIN_EXPERIMENTAL_ANNOTATION = "kotlin.Experimental"
-        private const val KOTLIN_USE_EXPERIMENTAL_ANNOTATION = "kotlin.UseExperimental"
+        const val KOTLIN_EXPERIMENTAL_ANNOTATION = "kotlin.Experimental"
+        const val KOTLIN_USE_EXPERIMENTAL_ANNOTATION = "kotlin.UseExperimental"
 
-        private const val KOTLIN_OPT_IN_ANNOTATION = "kotlin.OptIn"
-        private const val KOTLIN_REQUIRES_OPT_IN_ANNOTATION = "kotlin.RequiresOptIn"
+        const val KOTLIN_OPT_IN_ANNOTATION = "kotlin.OptIn"
+        const val KOTLIN_REQUIRES_OPT_IN_ANNOTATION = "kotlin.RequiresOptIn"
 
-        private const val JAVA_EXPERIMENTAL_ANNOTATION =
+        const val JAVA_EXPERIMENTAL_ANNOTATION =
             "androidx.annotation.experimental.Experimental"
-        private const val JAVA_USE_EXPERIMENTAL_ANNOTATION =
+        const val JAVA_USE_EXPERIMENTAL_ANNOTATION =
             "androidx.annotation.experimental.UseExperimental"
 
-        private const val JAVA_REQUIRES_OPT_IN_ANNOTATION =
+        const val JAVA_REQUIRES_OPT_IN_ANNOTATION =
             "androidx.annotation.RequiresOptIn"
-        private const val JAVA_OPT_IN_ANNOTATION =
+        const val JAVA_OPT_IN_ANNOTATION =
             "androidx.annotation.OptIn"
 
         @Suppress("DefaultLocale")
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalIssueRegistry.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalIssueRegistry.kt
index 0f5986e..4f633fb 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalIssueRegistry.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalIssueRegistry.kt
@@ -22,5 +22,5 @@
 class ExperimentalIssueRegistry : IssueRegistry() {
     override val minApi = CURRENT_API
     override val api = 8
-    override val issues get() = ExperimentalDetector.ISSUES
+    override val issues get() = ExperimentalDetector.ISSUES + AnnotationRetentionDetector.ISSUE
 }
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt
new file mode 100644
index 0000000..efcab90
--- /dev/null
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/AnnotationRetentionDetectorTest.kt
@@ -0,0 +1,82 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.annotation.experimental.lint
+
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.checks.infrastructure.TestLintTask
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class AnnotationRetentionDetectorTest {
+
+    private fun check(vararg testFiles: TestFile): TestLintResult {
+        return TestLintTask.lint()
+            .files(
+                RequiresOptInDetectorTest.ANDROIDX_REQUIRES_OPT_IN_KT,
+                RequiresOptInDetectorTest.ANDROIDX_OPT_IN_KT,
+                *testFiles
+            )
+            .issues(AnnotationRetentionDetector.ISSUE)
+            .run()
+    }
+
+    @Test
+    fun experimentalAnnotationsJava() {
+        val input = arrayOf(
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation2"),
+            javaSample("sample.optin.ExperimentalJavaAnnotationWrongRetention"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/optin/ExperimentalJavaAnnotationWrongRetention.java:28: Error: Experimental annotation has RUNTIME retention, should use default (CLASS) [ExperimentalAnnotationRetention]
+public @interface ExperimentalJavaAnnotationWrongRetention {}
+                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun experimentalAnnotationsKotlin() {
+        val input = arrayOf(
+            RequiresOptInDetectorTest.OPT_IN_KT,
+            ktSample("sample.optin.ExperimentalKotlinAnnotation"),
+            ktSample("sample.optin.ExperimentalKotlinAnnotation2"),
+            ktSample("sample.optin.ExperimentalKotlinAnnotationWrongRetention"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt:21: Error: Experimental annotation has default (RUNTIME) retention, should use BINARY [ExperimentalAnnotationRetention]
+annotation class ExperimentalKotlinAnnotationWrongRetention
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+}
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ApiLintVersionsTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..50585ec
--- /dev/null
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.annotation.experimental.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = ExperimentalIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
index a6271ae..6cb030e 100644
--- a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.annotation.experimental.lint
 
 import com.android.tools.lint.checks.infrastructure.TestFile
@@ -26,7 +28,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
-@Suppress("UnstableApiUsage")
 @RunWith(JUnit4::class)
 class RequiresOptInDetectorTest {
 
@@ -42,33 +43,31 @@
     }
 
     @Test
-    fun useJavaExperimentalFromJava() {
+    fun useJavaExperimentalMembersFromJava() {
         val input = arrayOf(
-            javaSample("sample.optin.DateProvider"),
-            javaSample("sample.optin.ExperimentalDateTime"),
-            javaSample("sample.optin.ExperimentalLocation"),
-            javaSample("sample.optin.LocationProvider"),
-            javaSample("sample.optin.UseJavaExperimentalFromJava")
+            javaSample("sample.optin.AnnotatedJavaMembers"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
+            javaSample("sample.optin.UseJavaExperimentalMembersFromJava")
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
-src/sample/optin/UseJavaExperimentalFromJava.java:27: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalDateTime' or '@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)' [UnsafeOptInUsageError]
-        DateProvider dateProvider = new DateProvider();
-                                    ~~~~~~~~~~~~~~~~~~
-src/sample/optin/UseJavaExperimentalFromJava.java:28: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalDateTime' or '@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)' [UnsafeOptInUsageError]
-        return dateProvider.getDate();
-                            ~~~~~~~
-src/sample/optin/UseJavaExperimentalFromJava.java:55: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalLocation' or '@OptIn(markerClass = sample.optin.ExperimentalLocation.class)' [UnsafeOptInUsageError]
-        LocationProvider locationProvider = new LocationProvider();
-                                            ~~~~~~~~~~~~~~~~~~~~~~
-src/sample/optin/UseJavaExperimentalFromJava.java:56: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalLocation' or '@OptIn(markerClass = sample.optin.ExperimentalLocation.class)' [UnsafeOptInUsageError]
-        return dateProvider.getDate() + locationProvider.getLocation();
-                                                         ~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalMembersFromJava.java:30: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return stableObject.field;
+                            ~~~~~
+src/sample/optin/UseJavaExperimentalMembersFromJava.java:38: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return stableObject.method();
+                            ~~~~~~
+src/sample/optin/UseJavaExperimentalMembersFromJava.java:45: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.FIELD_STATIC;
+                                    ~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalMembersFromJava.java:52: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.methodStatic();
+                                    ~~~~~~~~~~~~
 4 errors, 0 warnings
         """.trimIndent()
         /* ktlint-enable max-line-length */
@@ -77,34 +76,107 @@
     }
 
     @Test
+    fun useJavaExperimentalClassFromJava() {
+        val input = arrayOf(
+            javaSample("sample.optin.AnnotatedJavaClass"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
+            javaSample("sample.optin.UseJavaExperimentalClassFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/optin/UseJavaExperimentalClassFromJava.java:31: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+                                                ~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalClassFromJava.java:39: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+                                                ~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalClassFromJava.java:40: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return experimentalObject.method();
+                                  ~~~~~~
+src/sample/optin/UseJavaExperimentalClassFromJava.java:54: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaClass.methodStatic();
+                                  ~~~~~~~~~~~~
+4 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun useJavaExperimentalMultipleMarkersFromJava() {
+        val input = arrayOf(
+            javaSample("sample.optin.AnnotatedJavaClass"),
+            javaSample("sample.optin.AnnotatedJavaClass2"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation2"),
+            javaSample("sample.optin.UseJavaExperimentalMultipleMarkersFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java:33: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation2' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation2.class)' [UnsafeOptInUsageError]
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
     fun useJavaExperimentalFromKt() {
         val input = arrayOf(
-            javaSample("sample.optin.DateProvider"),
-            javaSample("sample.optin.ExperimentalDateTime"),
-            javaSample("sample.optin.ExperimentalLocation"),
-            javaSample("sample.optin.LocationProvider"),
+            javaSample("sample.optin.AnnotatedJavaClass"),
+            javaSample("sample.optin.AnnotatedJavaClass2"),
+            javaSample("sample.optin.AnnotatedJavaMembers"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation2"),
             ktSample("sample.optin.UseJavaExperimentalFromKt")
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
-src/sample/optin/UseJavaExperimentalFromKt.kt:27: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalDateTime' or '@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)' [UnsafeOptInUsageError]
-        val dateProvider = DateProvider()
-                           ~~~~~~~~~~~~
 src/sample/optin/UseJavaExperimentalFromKt.kt:28: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalDateTime' or '@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)' [UnsafeOptInUsageError]
-        return dateProvider.date
-                            ~~~~
-src/sample/optin/UseJavaExperimentalFromKt.kt:55: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalLocation' or '@OptIn(markerClass = sample.optin.ExperimentalLocation.class)' [UnsafeOptInUsageError]
-        val locationProvider = LocationProvider()
-                               ~~~~~~~~~~~~~~~~
-src/sample/optin/UseJavaExperimentalFromKt.kt:56: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.ExperimentalLocation' or '@OptIn(markerClass = sample.optin.ExperimentalLocation.class)' [UnsafeOptInUsageError]
-        return dateProvider.date + locationProvider.location
-                                                    ~~~~~~~~
-4 errors, 0 warnings
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        val experimentalObject = AnnotatedJavaClass()
+                                 ~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:36: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        val experimentalObject = AnnotatedJavaClass()
+                                 ~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:37: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return experimentalObject.method()
+                                  ~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:51: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaClass.methodStatic()
+                                  ~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:77: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return stableObject.field
+                            ~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:85: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return stableObject.method()
+                            ~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:92: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.FIELD_STATIC
+                                    ~~~~~~~~~~~~
+src/sample/optin/UseJavaExperimentalFromKt.kt:99: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.methodStatic()
+                                    ~~~~~~~~~~~~
+8 errors, 0 warnings
         """.trimIndent()
         /* ktlint-enable max-line-length */
 
@@ -115,50 +187,37 @@
     fun useKtExperimentalFromJava() {
         val input = arrayOf(
             OPT_IN_KT,
-            ktSample("sample.optin.DateProviderKt"),
-            ktSample("sample.optin.TimeProviderKt"),
-            ktSample("sample.optin.ExperimentalDateTimeKt"),
-            ktSample("sample.optin.ExperimentalLocationKt"),
-            ktSample("sample.optin.LocationProviderKt"),
-            javaSample("sample.optin.ExperimentalDateTime"),
+            ktSample("sample.optin.AnnotatedKotlinClass"),
+            ktSample("sample.optin.AnnotatedKotlinClass2"),
+            ktSample("sample.optin.AnnotatedKotlinMembers"),
+            ktSample("sample.optin.ExperimentalKotlinAnnotation"),
+            ktSample("sample.optin.ExperimentalKotlinAnnotation2"),
             javaSample("sample.optin.UseKtExperimentalFromJava")
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
- src/sample/optin/UseKtExperimentalFromJava.java:27: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTimeKt' or '@OptIn(markerClass = sample.optin.ExperimentalDateTimeKt.class)' [UnsafeOptInUsageError]
-         DateProviderKt dateProvider = new DateProviderKt();
-                                       ~~~~~~~~~~~~~~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:28: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTimeKt' or '@OptIn(markerClass = sample.optin.ExperimentalDateTimeKt.class)' [UnsafeOptInUsageError]
-         return dateProvider.getDate();
-                             ~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:55: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalLocationKt' or '@OptIn(markerClass = sample.optin.ExperimentalLocationKt.class)' [UnsafeOptInUsageError]
-         LocationProviderKt locationProvider = new LocationProviderKt();
-                                               ~~~~~~~~~~~~~~~~~~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:56: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalLocationKt' or '@OptIn(markerClass = sample.optin.ExperimentalLocationKt.class)' [UnsafeOptInUsageError]
-         return dateProvider.getDate() + locationProvider.getLocation();
-                                                          ~~~~~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:89: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTimeKt' or '@OptIn(markerClass = sample.optin.ExperimentalDateTimeKt.class)' [UnsafeOptInUsageError]
-         TimeProviderKt.getTimeStatically();
-                        ~~~~~~~~~~~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:90: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTimeKt' or '@OptIn(markerClass = sample.optin.ExperimentalDateTimeKt.class)' [UnsafeOptInUsageError]
-         TimeProviderKt.Companion.getTimeStatically();
-                                  ~~~~~~~~~~~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:97: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTimeKt' or '@OptIn(markerClass = sample.optin.ExperimentalDateTimeKt.class)' [UnsafeOptInUsageError]
-         new TimeProviderKt().getTime();
-                              ~~~~~~~
- src/sample/optin/UseKtExperimentalFromJava.java:98: Error: This declaration is opt-in and its usage should be marked with
- '@sample.optin.ExperimentalDateTime' or '@OptIn(markerClass = sample.optin.ExperimentalDateTime.class)' [UnsafeOptInUsageError]
-         new TimeProviderKt().getTimeJava();
-                              ~~~~~~~~~~~
- 8 errors, 0 warnings
+src/sample/optin/UseKtExperimentalFromJava.java:28: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalKotlinAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalKotlinAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseKtExperimentalFromJava.java:29: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalKotlinAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalKotlinAnnotation.class)' [UnsafeOptInUsageError]
+        return experimentalObject.method();
+                                  ~~~~~~
+src/sample/optin/UseKtExperimentalFromJava.java:97: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalKotlinAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalKotlinAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedKotlinMembers.methodStatic();
+                               ~~~~~~~~~~~~
+src/sample/optin/UseKtExperimentalFromJava.java:98: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalKotlinAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalKotlinAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedKotlinMembers.Companion.methodStatic();
+                                         ~~~~~~~~~~~~
+src/sample/optin/UseKtExperimentalFromJava.java:107: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalKotlinAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalKotlinAnnotation.class)' [UnsafeOptInUsageError]
+        new AnnotatedKotlinMembers().method();
+                                     ~~~~~~
+5 errors, 0 warnings
         """.trimIndent()
         /* ktlint-enable max-line-length */
 
@@ -169,25 +228,25 @@
     fun useJavaPackageFromJava() {
         val input = arrayOf(
             SAMPLE_FOO_PACKAGE_INFO,
-            javaSample("sample.optin.foo.Bar"),
-            javaSample("sample.optin.foo.ExperimentalPackage"),
+            javaSample("sample.optin.foo.AnnotatedJavaPackage"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
             javaSample("sample.optin.UseJavaPackageFromJava")
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
-src/sample/optin/UseJavaPackageFromJava.java:30: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
-        Bar bar = new Bar();
-                  ~~~~~~~~~
-src/sample/optin/UseJavaPackageFromJava.java:31: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
-        bar.baz();
-            ~~~
-src/sample/optin/UseJavaPackageFromJava.java:54: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
-        callPackageExperimental();
-        ~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaPackageFromJava.java:33: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/optin/UseJavaPackageFromJava.java:34: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        experimentalObject.method();
+                           ~~~~~~
+src/sample/optin/UseJavaPackageFromJava.java:67: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        safePropagateMarker();
+        ~~~~~~~~~~~~~~~~~~~
 3 errors, 0 warnings
         """.trimIndent()
         /* ktlint-enable max-line-length */
@@ -199,23 +258,23 @@
     fun useJavaPackageFromKt() {
         val input = arrayOf(
             SAMPLE_FOO_PACKAGE_INFO,
-            javaSample("sample.optin.foo.Bar"),
-            javaSample("sample.optin.foo.ExperimentalPackage"),
+            javaSample("sample.optin.foo.AnnotatedJavaPackage"),
+            javaSample("sample.optin.ExperimentalJavaAnnotation"),
             ktSample("sample.optin.UseJavaPackageFromKt")
         )
 
         /* ktlint-disable max-line-length */
         val expected = """
 src/sample/optin/UseJavaPackageFromKt.kt:30: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
-        val bar = Bar()
-                  ~~~
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        val experimentalObject = AnnotatedJavaPackage()
+                                 ~~~~~~~~~~~~~~~~~~~~
 src/sample/optin/UseJavaPackageFromKt.kt:31: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
-        bar.baz()
-            ~~~
-src/sample/optin/UseJavaPackageFromKt.kt:54: Error: This declaration is opt-in and its usage should be marked with
-'@sample.optin.foo.ExperimentalPackage' or '@OptIn(markerClass = sample.optin.foo.ExperimentalPackage.class)' [UnsafeOptInUsageError]
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
+        experimentalObject.method()
+                           ~~~~~~
+src/sample/optin/UseJavaPackageFromKt.kt:64: Error: This declaration is opt-in and its usage should be marked with
+'@sample.optin.ExperimentalJavaAnnotation' or '@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)' [UnsafeOptInUsageError]
         callPackageExperimental()
         ~~~~~~~~~~~~~~~~~~~~~~~
 3 errors, 0 warnings
@@ -225,20 +284,6 @@
         check(*input).expect(expected)
     }
 
-    /**
-     * Loads a [TestFile] from Java source code included in the JAR resources.
-     */
-    private fun javaSample(className: String): TestFile {
-        return java(javaClass.getResource("/java/${className.replace('.','/')}.java").readText())
-    }
-
-    /**
-     * Loads a [TestFile] from Kotlin source code included in the JAR resources.
-     */
-    private fun ktSample(className: String): TestFile {
-        return kotlin(javaClass.getResource("/java/${className.replace('.','/')}.kt").readText())
-    }
-
     /* ktlint-disable max-line-length */
     companion object {
         /**
@@ -354,13 +399,35 @@
          * 2. mkdir -p temp/sample/optin/foo/
          * 3. cp ../../out/androidx/annotation/annotation-experimental-lint-integration-tests/build/intermediates/javac/debug/classes/sample/optin/foo/package-info.class temp/sample/optin/foo/
          * 4. jar -c -f sample.optin.foo.package-info.jar -C temp . | openssl base64 < sample.optin.foo.package-info.jar | tr -d '\n' | pbcopy
-         * 5. rm -rf temp sample.optin.foo.package-info.jar
-         * 6. Paste here
+         * 5. Paste below
+         * 6. rm -rf temp sample.optin.foo.package-info.jar
          */
         val SAMPLE_FOO_PACKAGE_INFO: TestFile = base64gzip(
             "libs/sample.optin.foo.package-info.jar",
-            "UEsDBBQACAgIAER1/VAAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAgICABEdf1QAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLElN0XWqBAoARfRMFDT8ixKTc1IVnPOLCvKLEkuAijV5uXi5AFBLBwiVBramQAAAAEIAAABQSwMECgAACAAAOHX9UAAAAAAAAAAAAAAAAAcAAABzYW1wbGUvUEsDBAoAAAgAADh1/VAAAAAAAAAAAAAAAAANAAAAc2FtcGxlL29wdGluL1BLAwQKAAAIAABAdf1QAAAAAAAAAAAAAAAAEQAAAHNhbXBsZS9vcHRpbi9mb28vUEsDBBQACAgIAEB1/VAAAAAAAAAAAAAAAAAjAAAAc2FtcGxlL29wdGluL2Zvby9wYWNrYWdlLWluZm8uY2xhc3NlTb0OwVAYPbdoMbFYxGrjLjaTgUQiITzB1+a2uXX73aa9bTybwQN4KFG6SJzhnOH8PV/3B4AVBgGCAH2B4cVWRaR22iiBcU7RlRK10BzbZUo1CUzPFTudqT3XutShURtm68hpy6XA/FBSlhslbe40y9haub3lqmgK7Mic2r21wOwv9/slMPq8SUOcyGOYqshNAAEPLTx0vtxFr1G/cXzgDVBLBwiEWN3yoQAAAM0AAABQSwECFAAUAAgICABEdf1QAAAAAAIAAAAAAAAACQAEAAAAAAAAAAAAAAAAAAAATUVUQS1JTkYv/soAAFBLAQIUABQACAgIAER1/VCVBramQAAAAEIAAAAUAAAAAAAAAAAAAAAAAD0AAABNRVRBLUlORi9NQU5JRkVTVC5NRlBLAQIKAAoAAAgAADh1/VAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAL8AAABzYW1wbGUvUEsBAgoACgAACAAAOHX9UAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAA5AAAAHNhbXBsZS9vcHRpbi9QSwECCgAKAAAIAABAdf1QAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAPAQAAc2FtcGxlL29wdGluL2Zvby9QSwECFAAUAAgICABAdf1QhFjd8qEAAADNAAAAIwAAAAAAAAAAAAAAAAA+AQAAc2FtcGxlL29wdGluL2Zvby9wYWNrYWdlLWluZm8uY2xhc3NQSwUGAAAAAAYABgB9AQAAMAIAAAAA"
+            "UEsDBBQACAgIABRYjVIAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAgICAAUWI1SAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLElN0XWqBAoARfRMFDT8ixKTc1IVnPOLCvKLEkuAijV5uXi5AFBLBwiVBramQAAAAEIAAABQSwMECgAACAAAOVeNUgAAAAAAAAAAAAAAAAcAAABzYW1wbGUvUEsDBAoAAAgAADlXjVIAAAAAAAAAAAAAAAANAAAAc2FtcGxlL29wdGluL1BLAwQKAAAIAAA7V41SAAAAAAAAAAAAAAAAEQAAAHNhbXBsZS9vcHRpbi9mb28vUEsDBBQACAgIADtXjVIAAAAAAAAAAAAAAAAjAAAAc2FtcGxlL29wdGluL2Zvby9wYWNrYWdlLWluZm8uY2xhc3NVjcEOwUAYhGeLFicuLuIBHNiLm5MDCZFIeIJts222tv9u2m3j2Rw8gIcSiwPmMHOYbzL3x/UGYIFehChCl6F/MnWZyI3SkmFoRXIWmZwpSs08F41gGB9rcqqQW2pUpWItV0TGCacMVQzTfSUKqyU31ini64uVpYfJCb3z8y+7ZJj8oakx/PeOYfA65FpQxg9xLhM3AhgCfBSg9fY2Oj5D34TAE1BLBwjeUT3SpAAAANAAAABQSwECFAAUAAgICAAUWI1SAAAAAAIAAAAAAAAACQAEAAAAAAAAAAAAAAAAAAAATUVUQS1JTkYv/soAAFBLAQIUABQACAgIABRYjVKVBramQAAAAEIAAAAUAAAAAAAAAAAAAAAAAD0AAABNRVRBLUlORi9NQU5JRkVTVC5NRlBLAQIKAAoAAAgAADlXjVIAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAL8AAABzYW1wbGUvUEsBAgoACgAACAAAOVeNUgAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAA5AAAAHNhbXBsZS9vcHRpbi9QSwECCgAKAAAIAAA7V41SAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAPAQAAc2FtcGxlL29wdGluL2Zvby9QSwECFAAUAAgICAA7V41S3lE90qQAAADQAAAAIwAAAAAAAAAAAAAAAAA+AQAAc2FtcGxlL29wdGluL2Zvby9wYWNrYWdlLWluZm8uY2xhc3NQSwUGAAAAAAYABgB9AQAAMwIAAAAA"
         )
     }
     /* ktlint-enable max-line-length */
 }
+
+/**
+ * Loads a [TestFile] from Java source code included in the JAR resources.
+ */
+fun javaSample(className: String): TestFile {
+    return java(
+        RequiresOptInDetectorTest::class.java.getResource(
+            "/java/${className.replace('.','/')}.java"
+        ).readText()
+    )
+}
+
+/**
+ * Loads a [TestFile] from Kotlin source code included in the JAR resources.
+ */
+fun ktSample(className: String): TestFile {
+    return kotlin(
+        RequiresOptInDetectorTest::class.java.getResource(
+            "/java/${className.replace('.','/')}.kt"
+        ).readText()
+    )
+}
\ No newline at end of file
diff --git a/annotation/annotation-experimental/build.gradle b/annotation/annotation-experimental/build.gradle
index f2310ec..2ff61bb 100644
--- a/annotation/annotation-experimental/build.gradle
+++ b/annotation/annotation-experimental/build.gradle
@@ -33,11 +33,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility(JavaVersion.VERSION_1_7)
-        targetCompatibility(JavaVersion.VERSION_1_7)
-    }
-
     buildTypes.all {
         consumerProguardFiles("proguard-rules.pro")
     }
diff --git a/annotation/annotation/api/current.txt b/annotation/annotation/api/current.txt
index 70995d8..625bbf4 100644
--- a/annotation/annotation/api/current.txt
+++ b/annotation/annotation/api/current.txt
@@ -207,7 +207,7 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @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.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 {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
   }
 
diff --git a/annotation/annotation/api/public_plus_experimental_current.txt b/annotation/annotation/api/public_plus_experimental_current.txt
index 70995d8..625bbf4 100644
--- a/annotation/annotation/api/public_plus_experimental_current.txt
+++ b/annotation/annotation/api/public_plus_experimental_current.txt
@@ -207,7 +207,7 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @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.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 {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
   }
 
diff --git a/annotation/annotation/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
index 70995d8..625bbf4 100644
--- a/annotation/annotation/api/restricted_current.txt
+++ b/annotation/annotation/api/restricted_current.txt
@@ -207,7 +207,7 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @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.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 {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
   }
 
diff --git a/annotation/annotation/build.gradle b/annotation/annotation/build.gradle
index eb13c91..5bd52ea 100644
--- a/annotation/annotation/build.gradle
+++ b/annotation/annotation/build.gradle
@@ -7,9 +7,6 @@
     id("java-library")
 }
 
-targetCompatibility = JavaVersion.VERSION_1_7
-sourceCompatibility = JavaVersion.VERSION_1_7
-
 jar {
     from sourceSets.main.output
     // Strip out typedef classes. For Android libraries, this is done
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
index aac6d87..9404b41 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
@@ -23,6 +23,7 @@
 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;
 
@@ -46,6 +47,7 @@
  *   public void onDrawForeground(Canvas canvas) { ...
  * </code></pre>
  */
+@Documented
 @Retention(CLASS)
 @Target({ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE})
 public @interface RestrictTo {
diff --git a/appcompat/appcompat-benchmark/lint-baseline.xml b/appcompat/appcompat-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/appcompat/appcompat-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/appcompat/appcompat-lint/build.gradle b/appcompat/appcompat-lint/build.gradle
index 7c589a4..18e16cb 100644
--- a/appcompat/appcompat-lint/build.gradle
+++ b/appcompat/appcompat-lint/build.gradle
@@ -26,7 +26,13 @@
 }
 
 dependencies {
-    compileOnly(LINT_API_LATEST)
+    // compileOnly because we use lintChecks and it doesn't allow other types of deps
+    // this ugly hack exists because of b/63873667
+    if (rootProject.hasProperty("android.injected.invoked.from.ide")) {
+        compileOnly(LINT_API_LATEST)
+    } else {
+        compileOnly(LINT_API_MIN)
+    }
     compileOnly(KOTLIN_STDLIB)
 
     testImplementation(KOTLIN_STDLIB)
diff --git a/appcompat/appcompat-lint/lint-baseline.xml b/appcompat/appcompat-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/appcompat/appcompat-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/ApiLintVersionsTest.kt b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..3d24927
--- /dev/null
+++ b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/ApiLintVersionsTest.kt
@@ -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.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.appcompat.lint
+
+import androidx.appcompat.AppCompatIssueRegistry
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = AppCompatIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/appcompat/appcompat-resources/api/restricted_current.txt b/appcompat/appcompat-resources/api/restricted_current.txt
index 84adee2..9a7d74e 100644
--- a/appcompat/appcompat-resources/api/restricted_current.txt
+++ b/appcompat/appcompat-resources/api/restricted_current.txt
@@ -51,7 +51,7 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
     method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
-    method public static android.graphics.Rect! getOpticalBounds(android.graphics.drawable.Drawable!);
+    method public static android.graphics.Rect getOpticalBounds(android.graphics.drawable.Drawable);
     method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
     field public static final android.graphics.Rect! INSETS_NONE;
   }
@@ -87,10 +87,15 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
     ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+    method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+    method public android.content.res.ColorStateList! getColorStateList(int) throws android.content.res.Resources.NotFoundException;
     method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+    method @RequiresApi(15) public android.graphics.drawable.Drawable! getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
+    method public android.graphics.Movie! getMovie(int) throws android.content.res.Resources.NotFoundException;
     method public static boolean isCompatVectorFromResourcesEnabled();
     method public static void setCompatVectorFromResourcesEnabled(boolean);
     method public static boolean shouldBeUsed();
+    method public void updateConfiguration(android.content.res.Configuration!, android.util.DisplayMetrics!);
     field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
   }
 
diff --git a/appcompat/appcompat-resources/build.gradle b/appcompat/appcompat-resources/build.gradle
index 33879d3..7cc3642 100644
--- a/appcompat/appcompat-resources/build.gradle
+++ b/appcompat/appcompat-resources/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    api("androidx.annotation:annotation:1.1.0")
+    api("androidx.annotation:annotation:1.2.0")
     api("androidx.core:core:1.0.1")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.vectordrawable:vectordrawable:1.1.0")
@@ -36,19 +36,15 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.appcompat", module: "appcompat-resources"
     })
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     defaultConfig {
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
diff --git a/appcompat/appcompat-resources/lint-baseline.xml b/appcompat/appcompat-resources/lint-baseline.xml
index f350c2b..383403b 100644
--- a/appcompat/appcompat-resources/lint-baseline.xml
+++ b/appcompat/appcompat-resources/lint-baseline.xml
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="BanSynchronizedMethods"
-        message="Use of synchronized methods is not recommended"
-        errorLine1="        /**"
-        errorLine2="        ^">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="1128"
-            column="9"/>
-    </issue>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -19,7 +8,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="89"
+            line="92"
             column="5"/>
     </issue>
 
@@ -30,7 +19,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="127"
+            line="130"
             column="5"/>
     </issue>
 
@@ -41,7 +30,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="131"
+            line="134"
             column="5"/>
     </issue>
 
@@ -52,7 +41,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="135"
+            line="138"
             column="5"/>
     </issue>
 
@@ -63,7 +52,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="158"
+            line="161"
             column="5"/>
     </issue>
 
@@ -74,7 +63,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="313"
+            line="316"
             column="5"/>
     </issue>
 
@@ -85,7 +74,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="334"
+            line="337"
             column="5"/>
     </issue>
 
@@ -96,7 +85,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="349"
+            line="352"
             column="5"/>
     </issue>
 
@@ -107,7 +96,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="377"
+            line="380"
             column="5"/>
     </issue>
 
@@ -118,7 +107,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="467"
+            line="470"
             column="5"/>
     </issue>
 
@@ -134,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat.AnimationDrawableTransition is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat.AnimationDrawableTransition is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                anim.setAutoCancel(true);"
         errorLine2="                     ~~~~~~~~~~~~~">
         <location
@@ -145,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            state.mChangingConfigurations |= a.getChangingConfigurations();"
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                dr = Drawable.createFromXmlInner(resources, parser, attrs, theme);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                dr = Drawable.createFromXmlInner(resources, parser, attrs, theme);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,151 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.content.res.AppCompatResources is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getColorStateList(resId);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/content/res/AppCompatResources.java"
-            line="69"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mCurrDrawable.getOutline(outline);"
-        errorLine2="                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="132"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                d.setLayoutDirection(getLayoutDirection());"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="518"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                d.setLayoutDirection(getLayoutDirection());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="518"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                d.setAutoMirrored(mDrawableContainerState.mAutoMirrored);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="521"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                d.setHotspotBounds(hotspotBounds.left, hotspotBounds.top,"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="525"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                child.setLayoutDirection(mLayoutDirection);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="813"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        childChanged = drawables[i].setLayoutDirection(layoutDirection);"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="859"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    if (drawables[i] != null &amp;&amp; drawables[i].canApplyTheme()) {"
-        errorLine2="                                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="898"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        drawables[i].applyTheme(theme);"
-        errorLine2="                                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="899"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                updateDensity(theme.getResources());"
-        errorLine2="                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="904"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    if (d.canApplyTheme()) {"
-        errorLine2="                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="916"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.DrawableContainer.DrawableContainerState is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    if (future != null &amp;&amp; future.canApplyTheme()) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/graphics/drawable/DrawableContainer.java"
-            line="921"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.DrawableUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.DrawableUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final android.graphics.Insets insets = drawable.getOpticalInsets();"
         errorLine2="                                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -332,19 +178,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ResourceManagerInternal.DrawableDelegate is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ResourceManagerInternal.DrawableDelegate is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        drawable.inflate(context.getResources(), parser, attrs, theme);"
         errorLine2="                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="562"
+            line="565"
             column="34"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ResourcesWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ResourcesWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mResources.getDrawable(id, theme);"
         errorLine2="                          ~~~~~~~~~~~">
         <location
@@ -354,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.appcompat.widget.ResourcesWrapper is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.appcompat.widget.ResourcesWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mResources.getDrawableForDensity(id, density);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -365,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ResourcesWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ResourcesWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mResources.getDrawableForDensity(id, density, theme);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.appcompat.widget.ResourcesWrapper is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.appcompat.widget.ResourcesWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mResources.getValueForDensity(id, density, outValue, resolveRefs);"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~">
         <location
@@ -387,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.StateListDrawable is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.graphics.drawable.StateListDrawable is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            state.mChangingConfigurations |= a.getChangingConfigurations();"
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -398,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.graphics.drawable.StateListDrawable is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.graphics.drawable.StateListDrawable is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    dr = Drawable.createFromXmlInner(r, parser, attrs, theme);"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~">
         <location
@@ -474,7 +320,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/content/res/AppCompatResources.java"
-            line="66"
+            line="47"
             column="19"/>
     </issue>
 
@@ -727,7 +573,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="92"
+            line="95"
             column="32"/>
     </issue>
 
@@ -738,7 +584,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="127"
+            line="130"
             column="39"/>
     </issue>
 
@@ -749,7 +595,7 @@
         errorLine2="                        ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="131"
+            line="134"
             column="25"/>
     </issue>
 
@@ -760,7 +606,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="467"
+            line="470"
             column="32"/>
     </issue>
 
@@ -771,7 +617,7 @@
         errorLine2="                       ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
-            line="468"
+            line="471"
             column="24"/>
     </issue>
 
diff --git a/appcompat/appcompat-resources/src/androidTest/AndroidManifest.xml b/appcompat/appcompat-resources/src/androidTest/AndroidManifest.xml
index d165e3b..17fa06f 100644
--- a/appcompat/appcompat-resources/src/androidTest/AndroidManifest.xml
+++ b/appcompat/appcompat-resources/src/androidTest/AndroidManifest.xml
@@ -15,12 +15,14 @@
    limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.appcompat.resources.test">
+    package="androidx.appcompat.resources.test">
 
     <application
-            android:theme="@android:style/Theme">
+        android:theme="@android:style/Theme">
+
         <activity
-                android:name="android.app.Activity"/>
+            android:name="android.app.Activity"/>
+
     </application>
 
 </manifest>
diff --git a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/content/res/AppCompatResourcesTestCase.java b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/content/res/AppCompatResourcesTestCase.java
index 46fd67d..f0574b5d 100644
--- a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/content/res/AppCompatResourcesTestCase.java
+++ b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/content/res/AppCompatResourcesTestCase.java
@@ -22,6 +22,10 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.drawable.ColorStateListDrawable;
 import android.graphics.drawable.Drawable;
 
 import androidx.appcompat.graphics.drawable.MyDrawable;
@@ -29,6 +33,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,7 +41,7 @@
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class AppCompatResourcesTestCase {
-    private Context mContext;
+    private final Context mContext;
 
     public AppCompatResourcesTestCase() {
         mContext = ApplicationProvider.getApplicationContext();
@@ -69,4 +74,31 @@
         assertNotNull(custom);
         assertTrue(custom instanceof MyDrawable);
     }
+
+    /**
+     * Test workaround for platform bug on SDKs 29 and 30 where the second ColorStateListDrawable
+     * for a given resource ID will be cloned from the cache without setting a default color.
+     */
+    @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 30)
+    @Test
+    public void testGetColorStateListDrawable() {
+        Bitmap b = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+
+        ColorStateListDrawable csld1 = (ColorStateListDrawable) AppCompatResources.getDrawable(
+                mContext, R.color.color_state_list_red);
+        assertNotNull(csld1);
+        csld1.setBounds(0, 0, 1, 1);
+        csld1.draw(c);
+        assertEquals(Color.RED, b.getPixel(0, 0));
+
+        b.eraseColor(Color.TRANSPARENT);
+
+        ColorStateListDrawable csld2 = (ColorStateListDrawable) AppCompatResources.getDrawable(
+                mContext, R.color.color_state_list_red);
+        assertNotNull(csld2);
+        csld2.setBounds(0, 0, 1, 1);
+        csld2.draw(c);
+        assertEquals(Color.RED, b.getPixel(0, 0));
+    }
 }
diff --git a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java
new file mode 100644
index 0000000..9da3eb9
--- /dev/null
+++ b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Observable Resources class.
+ */
+@SuppressWarnings("deprecation")
+class TestResources extends Resources {
+    private boolean mGetDrawableCalled;
+    private boolean mGetStringCalled;
+
+    TestResources(Resources res) {
+        super(res.getAssets(), res.getDisplayMetrics(), res.getConfiguration());
+    }
+
+    @Override
+    public Drawable getDrawable(int id) throws NotFoundException {
+        mGetDrawableCalled = true;
+        return super.getDrawable(id);
+    }
+
+    @NonNull
+    @Override
+    public String getString(int id) throws NotFoundException {
+        mGetStringCalled = true;
+        return super.getString(id);
+    }
+
+    public void resetGetDrawableCalled() {
+        mGetDrawableCalled = false;
+    }
+
+    public boolean wasGetDrawableCalled() {
+        return mGetDrawableCalled;
+    }
+
+    public boolean wasGetStringCalled() {
+        return mGetStringCalled;
+    }
+}
diff --git a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java
index 313399e..e19b084 100644
--- a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java
+++ b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java
@@ -17,12 +17,15 @@
 package androidx.appcompat.widget;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import android.app.Activity;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
 
+import androidx.appcompat.resources.test.R;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
@@ -38,41 +41,41 @@
     public final androidx.test.rule.ActivityTestRule<Activity> mActivityTestRule =
             new androidx.test.rule.ActivityTestRule<>(Activity.class);
 
+    /**
+     * Ensures that TintResources delegates calls to the wrapped Resources object.
+     */
     @Test
     public void testTintResourcesDelegateBackToOriginalResources() {
         final TestResources testResources =
                 new TestResources(mActivityTestRule.getActivity().getResources());
+
         // First make sure that the flag is false
+        testResources.resetGetDrawableCalled();
         assertFalse(testResources.wasGetDrawableCalled());
 
         // Now wrap in a TintResources instance and get a Drawable
-        final Resources tintResources =
+        final TintResources tintResources =
                 new TintResources(mActivityTestRule.getActivity(), testResources);
         tintResources.getDrawable(android.R.drawable.ic_delete);
 
-        // ...and assert that the flag was flipped
-        assertTrue(testResources.wasGetDrawableCalled());
+        // We can't delegate to the wrapped Resource object's getDrawable() because it will break
+        // support for nested vector-enabled tinted resources.
+        assertFalse(testResources.wasGetDrawableCalled());
+
+        tintResources.getString(android.R.string.ok);
+
+        // However, we can still delegate other calls.
+        assertTrue(testResources.wasGetStringCalled());
     }
 
-    /**
-     * Special Resources class which returns a known Drawable instance from a special ID
-     */
-    private static class TestResources extends Resources {
-        private boolean mGetDrawableCalled;
+    public void testNestedTintResources() {
+        Resources tintResources = new TintResources(mActivityTestRule.getActivity(),
+                        mActivityTestRule.getActivity().getResources());
+        Drawable d = tintResources.getDrawable(R.drawable.tint_nested);
+        assertTrue(d instanceof LayerDrawable);
 
-        private TestResources(Resources res) {
-            super(res.getAssets(), res.getDisplayMetrics(), res.getConfiguration());
-        }
-
-        @Override
-        public Drawable getDrawable(int id) throws NotFoundException {
-            mGetDrawableCalled = true;
-            return super.getDrawable(id);
-        }
-
-        public boolean wasGetDrawableCalled() {
-            return mGetDrawableCalled;
-        }
+        // Color filter is applied to nested drawable.
+        LayerDrawable ld = (LayerDrawable) d;
+        assertNotNull(ld.getDrawable(0).getColorFilter());
     }
-
 }
diff --git a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/VectorEnabledTintResourcesTest.java b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/VectorEnabledTintResourcesTest.java
new file mode 100644
index 0000000..68ca9f8
--- /dev/null
+++ b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/VectorEnabledTintResourcesTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+
+import androidx.appcompat.resources.test.R;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SuppressWarnings("deprecation")
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class VectorEnabledTintResourcesTest {
+    @Rule
+    public final androidx.test.rule.ActivityTestRule<Activity> mActivityTestRule =
+            new androidx.test.rule.ActivityTestRule<>(Activity.class);
+
+    /**
+     * Ensures that VectorEnabledTintResources delegates calls to the wrapped Resources object.
+     */
+    @Test
+    public void testVectorEnabledTintResourcesDelegateBackToOriginalResources() {
+        final TestResources testResources =
+                new TestResources(mActivityTestRule.getActivity().getResources());
+
+        // First make sure that the flag is false
+        testResources.resetGetDrawableCalled();
+        assertFalse(testResources.wasGetDrawableCalled());
+
+        // Now wrap in a TintResources instance and get a Drawable
+        final VectorEnabledTintResources tintResources =
+                new VectorEnabledTintResources(mActivityTestRule.getActivity(), testResources);
+        tintResources.getDrawable(android.R.drawable.ic_delete);
+
+        // We can't delegate to the wrapped Resource object's getDrawable() because it will break
+        // support for nested vector-enabled tinted resources.
+        assertFalse(testResources.wasGetDrawableCalled());
+
+        tintResources.getString(android.R.string.ok);
+
+        // However, we can still delegate other calls.
+        assertTrue(testResources.wasGetStringCalled());
+    }
+
+    public void testNestedVectorEnabledTintResources() {
+        Resources tintResources = new VectorEnabledTintResources(mActivityTestRule.getActivity(),
+                        mActivityTestRule.getActivity().getResources());
+        Drawable d = tintResources.getDrawable(R.drawable.vector_nested);
+        assertTrue(d instanceof LayerDrawable);
+
+        // Nested drawable is loaded using VectorEnabledTintResources.
+        LayerDrawable ld = (LayerDrawable) d;
+        assertTrue(ld.getDrawable(0) instanceof VectorDrawableCompat);
+    }
+}
diff --git a/appcompat/appcompat-resources/src/androidTest/res/color/color_state_list_red.xml b/appcompat/appcompat-resources/src/androidTest/res/color/color_state_list_red.xml
new file mode 100644
index 0000000..04c70bc1
--- /dev/null
+++ b/appcompat/appcompat-resources/src/androidTest/res/color/color_state_list_red.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="#FFFF0000" />
+</selector>
diff --git a/appcompat/appcompat-resources/src/androidTest/res/drawable/tint_nested.xml b/appcompat/appcompat-resources/src/androidTest/res/drawable/tint_nested.xml
new file mode 100644
index 0000000..70581a5
--- /dev/null
+++ b/appcompat/appcompat-resources/src/androidTest/res/drawable/tint_nested.xml
@@ -0,0 +1,23 @@
+<?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.
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <bitmap
+            android:src="@drawable/state_list_density_1"
+            android:tint="#ffffff" />
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/appcompat/appcompat-resources/src/androidTest/res/drawable/vector_nested.xml b/appcompat/appcompat-resources/src/androidTest/res/drawable/vector_nested.xml
new file mode 100644
index 0000000..5aba52a
--- /dev/null
+++ b/appcompat/appcompat-resources/src/androidTest/res/drawable/vector_nested.xml
@@ -0,0 +1,19 @@
+<?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.
+  -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/vector_drawable_grouping_1" />
+</layer-list>
\ No newline at end of file
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
index 025d2c8..8bb6a4e 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
@@ -19,13 +19,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.TypedValue;
 
 import androidx.annotation.ColorRes;
 import androidx.annotation.DrawableRes;
@@ -33,11 +27,6 @@
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.ResourceManagerInternal;
 import androidx.core.content.ContextCompat;
-import androidx.core.content.res.ColorStateListInflaterCompat;
-
-import org.xmlpull.v1.XmlPullParser;
-
-import java.util.WeakHashMap;
 
 /**
  * Class for accessing an application's resources through AppCompat, and thus any backward
@@ -46,14 +35,6 @@
 @SuppressLint("RestrictedAPI") // Temporary until we have correct restriction scopes for 1.0
 public final class AppCompatResources {
 
-    private static final String LOG_TAG = "AppCompatResources";
-    private static final ThreadLocal<TypedValue> TL_TYPED_VALUE = new ThreadLocal<>();
-
-    private static final WeakHashMap<Context, SparseArray<ColorStateListCacheEntry>>
-            sColorStateCaches = new WeakHashMap<>(0);
-
-    private static final Object sColorStateCacheLock = new Object();
-
     private AppCompatResources() {}
 
     /**
@@ -64,25 +45,6 @@
      * @param resId the resource identifier of the ColorStateList to retrieve
      */
     public static ColorStateList getColorStateList(@NonNull Context context, @ColorRes int resId) {
-        if (Build.VERSION.SDK_INT >= 23) {
-            // On M+ we can use the framework
-            return context.getColorStateList(resId);
-        }
-
-        // Before that, we'll try handle it ourselves
-        ColorStateList csl = getCachedColorStateList(context, resId);
-        if (csl != null) {
-            return csl;
-        }
-        // Cache miss, so try and inflate it ourselves
-        csl = inflateColorStateList(context, resId);
-        if (csl != null) {
-            // If we inflated it, add it to the cache and return
-            addColorStateListToCache(context, resId, csl);
-            return csl;
-        }
-
-        // If we reach here then we couldn't inflate it, so let the framework handle it
         return ContextCompat.getColorStateList(context, resId);
     }
 
@@ -103,90 +65,4 @@
     public static Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {
         return ResourceManagerInternal.get().getDrawable(context, resId);
     }
-
-    /**
-     * Inflates a {@link ColorStateList} from resources, honouring theme attributes.
-     */
-    @Nullable
-    private static ColorStateList inflateColorStateList(Context context, int resId) {
-        if (isColorInt(context, resId)) {
-            // The resource is a color int, we can't handle it so return null
-            return null;
-        }
-
-        final Resources r = context.getResources();
-        final XmlPullParser xml = r.getXml(resId);
-        try {
-            return ColorStateListInflaterCompat.createFromXml(r, xml, context.getTheme());
-        } catch (Exception e) {
-            Log.e(LOG_TAG, "Failed to inflate ColorStateList, leaving it to the framework", e);
-        }
-        return null;
-    }
-
-    @Nullable
-    private static ColorStateList getCachedColorStateList(@NonNull Context context,
-            @ColorRes int resId) {
-        synchronized (sColorStateCacheLock) {
-            final SparseArray<ColorStateListCacheEntry> entries = sColorStateCaches.get(context);
-            if (entries != null && entries.size() > 0) {
-                final ColorStateListCacheEntry entry = entries.get(resId);
-                if (entry != null) {
-                    if (entry.configuration.equals(context.getResources().getConfiguration())) {
-                        // If the current configuration matches the entry's, we can use it
-                        return entry.value;
-                    } else {
-                        // Otherwise we'll remove the entry
-                        entries.remove(resId);
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    private static void addColorStateListToCache(@NonNull Context context, @ColorRes int resId,
-            @NonNull ColorStateList value) {
-        synchronized (sColorStateCacheLock) {
-            SparseArray<ColorStateListCacheEntry> entries = sColorStateCaches.get(context);
-            if (entries == null) {
-                entries = new SparseArray<>();
-                sColorStateCaches.put(context, entries);
-            }
-            entries.append(resId, new ColorStateListCacheEntry(value,
-                    context.getResources().getConfiguration()));
-        }
-    }
-
-    private static boolean isColorInt(@NonNull Context context, @ColorRes int resId) {
-        final Resources r = context.getResources();
-
-        final TypedValue value = getTypedValue();
-        r.getValue(resId, value, true);
-
-        return value.type >= TypedValue.TYPE_FIRST_COLOR_INT
-                && value.type <= TypedValue.TYPE_LAST_COLOR_INT;
-    }
-
-    @NonNull
-    private static TypedValue getTypedValue() {
-        TypedValue tv = TL_TYPED_VALUE.get();
-        if (tv == null) {
-            tv = new TypedValue();
-            TL_TYPED_VALUE.set(tv);
-        }
-        return tv;
-    }
-
-    private static class ColorStateListCacheEntry {
-        final ColorStateList value;
-        final Configuration configuration;
-
-        ColorStateListCacheEntry(@NonNull ColorStateList value,
-                @NonNull Configuration configuration) {
-            this.value = value;
-            this.configuration = configuration;
-        }
-    }
-
 }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
index 8c5a0a6..9a439f9 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
@@ -18,7 +18,9 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
-import android.annotation.SuppressLint;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Insets;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
@@ -28,109 +30,72 @@
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.ScaleDrawable;
 import android.os.Build;
-import android.util.Log;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.appcompat.graphics.drawable.DrawableWrapper;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.graphics.drawable.WrappedDrawable;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /** @hide */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
-@SuppressLint("RestrictedAPI") // Temporary until we have correct restriction scopes for 1.0
 public class DrawableUtils {
-    private static final int[] CHECKED_STATE_SET = new int[]{android.R.attr.state_checked};
+
+    private static final int[] CHECKED_STATE_SET = new int[] { android.R.attr.state_checked };
     private static final int[] EMPTY_STATE_SET = new int[0];
 
-    private static final String TAG = "DrawableUtils";
-
     public static final Rect INSETS_NONE = new Rect();
-    private static Class<?> sInsetsClazz;
 
-    private static final String VECTOR_DRAWABLE_CLAZZ_NAME
-            = "android.graphics.drawable.VectorDrawable";
-
-    static {
-        if (Build.VERSION.SDK_INT >= 18) {
-            try {
-                sInsetsClazz = Class.forName("android.graphics.Insets");
-            } catch (ClassNotFoundException e) {
-                // Oh well...
-            }
-        }
+    private DrawableUtils() {
+        // This class is non-instantiable.
     }
 
-    private DrawableUtils() {}
-
     /**
      * Allows us to get the optical insets for a {@link Drawable}. Since this is hidden we need to
      * use reflection. Since the {@code Insets} class is hidden also, we return a Rect instead.
      */
-    public static Rect getOpticalBounds(Drawable drawable) {
+    @NonNull
+    public static Rect getOpticalBounds(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 29) {
-            final android.graphics.Insets insets = drawable.getOpticalInsets();
-            final Rect result = new Rect();
-            result.left = insets.left;
-            result.right = insets.right;
-            result.top = insets.top;
-            result.bottom = insets.bottom;
-            return result;
-        }
-        if (sInsetsClazz != null) {
-            try {
-                // If the Drawable is wrapped, we need to manually unwrap it and process
-                // the wrapped drawable.
-                drawable = DrawableCompat.unwrap(drawable);
-
-                final Method getOpticalInsetsMethod = drawable.getClass()
-                        .getMethod("getOpticalInsets");
-                final Object insets = getOpticalInsetsMethod.invoke(drawable);
-
-                if (insets != null) {
-                    // If the drawable has some optical insets, let's copy them into a Rect
-                    final Rect result = new Rect();
-
-                    for (Field field : sInsetsClazz.getFields()) {
-                        switch (field.getName()) {
-                            case "left":
-                               result.left = field.getInt(insets);
-                                break;
-                            case "top":
-                                result.top = field.getInt(insets);
-                                break;
-                            case "right":
-                                result.right = field.getInt(insets);
-                                break;
-                            case "bottom":
-                                result.bottom = field.getInt(insets);
-                                break;
-                        }
-                    }
-                    return result;
-                }
-            } catch (Exception e) {
-                // Eugh, we hit some kind of reflection issue...
-                Log.e(TAG, "Couldn't obtain the optical insets. Ignoring.");
-            }
+            final Insets insets = Api29Impl.getOpticalInsets(drawable);
+            return new Rect(
+                    insets.left,
+                    insets.top,
+                    insets.right,
+                    insets.bottom
+            );
+        } else if (Build.VERSION.SDK_INT >= 18) {
+            return Api18Impl.getOpticalInsets(DrawableCompat.unwrap(drawable));
         }
 
         // If we reach here, either we're running on a device pre-v18, the Drawable didn't have
-        // any optical insets, or a reflection issue, so we'll just return an empty rect
+        // any optical insets, or a reflection issue, so we'll just return an empty rect.
         return INSETS_NONE;
     }
 
     /**
      * Attempt the fix any issues in the given drawable, usually caused by platform bugs in the
      * implementation. This method should be call after retrieval from
-     * {@link android.content.res.Resources} or a {@link android.content.res.TypedArray}.
+     * {@link Resources} or a {@link TypedArray}.
      */
-    static void fixDrawable(@NonNull final Drawable drawable) {
+    static void fixDrawable(@NonNull Drawable drawable) {
+        String className = drawable.getClass().getName();
         if (Build.VERSION.SDK_INT == 21
-                && VECTOR_DRAWABLE_CLAZZ_NAME.equals(drawable.getClass().getName())) {
-            fixVectorDrawableTinting(drawable);
+                && "android.graphics.drawable.VectorDrawable".equals(className)) {
+            // VectorDrawable has an issue on API 21 where it sometimes doesn't create its tint
+            // filter until a state change event has occurred.
+            forceDrawableStateChange(drawable);
+        } else if (Build.VERSION.SDK_INT >= 29 && Build.VERSION.SDK_INT < 31
+                && "android.graphics.drawable.ColorStateListDrawable".equals(className)) {
+            // ColorStateListDrawable has an issue on APIs 29 and 30 where it doesn't set up the
+            // default color until a state change event has occurred.
+            forceDrawableStateChange(drawable);
         }
     }
 
@@ -141,7 +106,7 @@
     public static boolean canSafelyMutateDrawable(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT < 15 && drawable instanceof InsetDrawable) {
             return false;
-        }  else if (Build.VERSION.SDK_INT < 15 && drawable instanceof GradientDrawable) {
+        } else if (Build.VERSION.SDK_INT < 15 && drawable instanceof GradientDrawable) {
             // GradientDrawable has a bug pre-ICS which results in mutate() resulting
             // in loss of color
             return false;
@@ -162,13 +127,9 @@
                 }
             }
         } else if (drawable instanceof WrappedDrawable) {
-            return canSafelyMutateDrawable(
-                    ((WrappedDrawable) drawable)
-                            .getWrappedDrawable());
-        } else if (drawable instanceof androidx.appcompat.graphics.drawable.DrawableWrapper) {
-            return canSafelyMutateDrawable(
-                    ((androidx.appcompat.graphics.drawable.DrawableWrapper) drawable)
-                            .getWrappedDrawable());
+            return canSafelyMutateDrawable(((WrappedDrawable) drawable).getWrappedDrawable());
+        } else if (drawable instanceof DrawableWrapper) {
+            return canSafelyMutateDrawable(((DrawableWrapper) drawable).getWrappedDrawable());
         } else if (drawable instanceof ScaleDrawable) {
             return canSafelyMutateDrawable(((ScaleDrawable) drawable).getDrawable());
         }
@@ -177,10 +138,9 @@
     }
 
     /**
-     * VectorDrawable has an issue on API 21 where it sometimes doesn't create its tint filter.
-     * Fixed by toggling its state to force a filter creation.
+     * Force a drawable state change.
      */
-    private static void fixVectorDrawableTinting(final Drawable drawable) {
+    private static void forceDrawableStateChange(final Drawable drawable) {
         final int[] originalState = drawable.getState();
         if (originalState == null || originalState.length == 0) {
             // The drawable doesn't have a state, so set it to be checked
@@ -198,14 +158,111 @@
      */
     public static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {
         switch (value) {
-            case 3: return PorterDuff.Mode.SRC_OVER;
-            case 5: return PorterDuff.Mode.SRC_IN;
-            case 9: return PorterDuff.Mode.SRC_ATOP;
-            case 14: return PorterDuff.Mode.MULTIPLY;
-            case 15: return PorterDuff.Mode.SCREEN;
-            case 16: return PorterDuff.Mode.ADD;
-            default: return defaultMode;
+            case 3:
+                return PorterDuff.Mode.SRC_OVER;
+            case 5:
+                return PorterDuff.Mode.SRC_IN;
+            case 9:
+                return PorterDuff.Mode.SRC_ATOP;
+            case 14:
+                return PorterDuff.Mode.MULTIPLY;
+            case 15:
+                return PorterDuff.Mode.SCREEN;
+            case 16:
+                return PorterDuff.Mode.ADD;
+            default:
+                return defaultMode;
         }
     }
 
+    // Only accessible on SDK_INT >= 18 and < 29.
+    @RequiresApi(18)
+    static class Api18Impl {
+        private static final boolean sReflectionSuccessful;
+        private static final Method sGetOpticalInsets;
+        private static final Field sLeft;
+        private static final Field sTop;
+        private static final Field sRight;
+        private static final Field sBottom;
+
+        static {
+            Method getOpticalInsets = null;
+            Field left = null;
+            Field top = null;
+            Field right = null;
+            Field bottom = null;
+            boolean success = false;
+
+            try {
+                Class<?> insets = Class.forName("android.graphics.Insets");
+                getOpticalInsets = Drawable.class.getMethod("getOpticalInsets");
+                left = insets.getField("left");
+                top = insets.getField("top");
+                right = insets.getField("right");
+                bottom = insets.getField("bottom");
+                success = true;
+            } catch (NoSuchMethodException e) {
+                // Not successful, null everything out.
+            } catch (ClassNotFoundException e) {
+                // Not successful, null everything out.
+            } catch (NoSuchFieldException e) {
+                // Not successful, null everything out.
+            }
+
+            if (success) {
+                sGetOpticalInsets = getOpticalInsets;
+                sLeft = left;
+                sTop = top;
+                sRight = right;
+                sBottom = bottom;
+                sReflectionSuccessful = true;
+            } else {
+                sGetOpticalInsets = null;
+                sLeft = null;
+                sTop = null;
+                sRight = null;
+                sBottom = null;
+                sReflectionSuccessful = false;
+            }
+        }
+
+        private Api18Impl() {
+            // This class is not instantiable.
+        }
+
+        @NonNull
+        static Rect getOpticalInsets(@NonNull Drawable drawable) {
+            // Check the SDK_INT to avoid UncheckedReflection error.
+            if (Build.VERSION.SDK_INT < 29 && sReflectionSuccessful) {
+                try {
+                    Object insets = sGetOpticalInsets.invoke(drawable);
+                    if (insets != null) {
+                        return new Rect(
+                                sLeft.getInt(insets),
+                                sTop.getInt(insets),
+                                sRight.getInt(insets),
+                                sBottom.getInt(insets)
+                        );
+                    }
+                } catch (IllegalAccessException e) {
+                    // Ignore, we'll return empty insets.
+                } catch (InvocationTargetException e) {
+                    // Ignore, we'll return empty insets.
+                }
+            }
+            return DrawableUtils.INSETS_NONE;
+        }
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Insets getOpticalInsets(Drawable drawable) {
+            return drawable.getOpticalInsets();
+        }
+    }
 }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
index 000c035..dfb0754 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
@@ -353,7 +353,7 @@
             @NonNull VectorEnabledTintResources resources, @DrawableRes final int resId) {
         Drawable drawable = loadDrawableFromDelegates(context, resId);
         if (drawable == null) {
-            drawable = resources.superGetDrawable(resId);
+            drawable = resources.getDrawableCanonical(resId);
         }
         if (drawable != null) {
             return tintDrawable(context, resId, false, drawable);
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourcesWrapper.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourcesWrapper.java
index aac0c3f..d81cfe7 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourcesWrapper.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourcesWrapper.java
@@ -29,6 +29,7 @@
 import android.util.TypedValue;
 
 import androidx.annotation.RequiresApi;
+import androidx.core.content.res.ResourcesCompat;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -131,23 +132,42 @@
         return mResources.getDrawable(id);
     }
 
+    /**
+     * Calls the canonical implementation of {@link Resources#getDrawable(int)} on the Resources
+     * superclass, rather than the wrapped class.
+     * <p>
+     * This method is useful for avoiding issues with re-entrant calls where a class has extended
+     * {@code ResourcesWrapper} and overridden {@link #getDrawable(int)}.
+     *
+     * @param id the id of the drawable to load
+     * @return a drawable, or {@code null} in some cases where a drawable failed to load
+     * @throws NotFoundException in most cases where a drawable failed to load
+     */
+    @SuppressWarnings("deprecation")
+    final Drawable getDrawableCanonical(int id) throws NotFoundException {
+        return super.getDrawable(id);
+    }
+
     @RequiresApi(21)
     @Override
     public Drawable getDrawable(int id, Theme theme) throws NotFoundException {
-        return mResources.getDrawable(id, theme);
+        return ResourcesCompat.getDrawable(mResources, id, theme);
     }
 
     @SuppressWarnings("deprecation")
     @RequiresApi(15)
     @Override
     public Drawable getDrawableForDensity(int id, int density) throws NotFoundException {
-        return mResources.getDrawableForDensity(id, density);
+        // If the developer only overrode the three-arg method, this will cause issues; however,
+        // this is very unlikely given that (a) nobody calls this method and (b) nobody overrides
+        // this method.
+        return ResourcesCompat.getDrawableForDensity(mResources, id, density, null);
     }
 
     @RequiresApi(21)
     @Override
     public Drawable getDrawableForDensity(int id, int density, Theme theme) {
-        return mResources.getDrawableForDensity(id, density, theme);
+        return ResourcesCompat.getDrawableForDensity(mResources, id, density, theme);
     }
 
     @SuppressWarnings("deprecation")
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
index dc25d22..9461000 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
@@ -43,7 +43,7 @@
      */
     @Override
     public Drawable getDrawable(int id) throws NotFoundException {
-        Drawable d = super.getDrawable(id);
+        Drawable d = getDrawableCanonical(id);
         Context context = mContextRef.get();
         if (d != null && context != null) {
             ResourceManagerInternal.get().tintDrawableUsingColorFilter(context, id, d);
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
index b375ac4..c9df59d 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
@@ -35,7 +35,7 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
-public class VectorEnabledTintResources extends Resources {
+public class VectorEnabledTintResources extends ResourcesWrapper {
     private static boolean sCompatVectorFromResourcesEnabled = false;
 
     public static boolean shouldBeUsed() {
@@ -53,7 +53,7 @@
     @SuppressWarnings("deprecation")
     public VectorEnabledTintResources(@NonNull final Context context,
             @NonNull final Resources res) {
-        super(res.getAssets(), res.getDisplayMetrics(), res.getConfiguration());
+        super(res);
         mContextRef = new WeakReference<>(context);
     }
 
@@ -62,22 +62,19 @@
      * things like {@link android.graphics.drawable.DrawableContainer}s which can retrieve
      * their children via this method.
      */
-    @SuppressWarnings("deprecation")
     @Override
     public Drawable getDrawable(int id) throws NotFoundException {
         final Context context = mContextRef.get();
         if (context != null) {
             return ResourceManagerInternal.get().onDrawableLoadedFromResources(context, this, id);
         } else {
-            return super.getDrawable(id);
+            // Delegate to the Resources implementation, NOT the superclass implementation. This
+            // method is re-entrant along the call path, e.g. for nested drawables, and we need to
+            // avoid passing control to a separate (e.g. wrapped) Resources object.
+            return getDrawableCanonical(id);
         }
     }
 
-    @SuppressWarnings("deprecation")
-    final Drawable superGetDrawable(int id) {
-        return super.getDrawable(id);
-    }
-
     /**
      * Sets whether vector drawables on older platforms (< API 21) can be used within
      * {@link android.graphics.drawable.DrawableContainer} resources.
diff --git a/appcompat/appcompat/api/current.txt b/appcompat/appcompat/api/current.txt
index 3d0e9f6..f608d7e 100644
--- a/appcompat/appcompat/api/current.txt
+++ b/appcompat/appcompat/api/current.txt
@@ -472,7 +472,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatButton extends android.widget.Button implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatButton(android.content.Context);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
@@ -480,9 +480,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setSupportAllCaps(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -506,13 +508,15 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.core.view.TintableBackgroundView {
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatCheckedTextView(android.content.Context);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
     method public void setTextAppearance(android.content.Context, int);
@@ -606,7 +610,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatTextView extends android.widget.TextView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatTextView(android.content.Context);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -615,9 +619,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
     method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -628,16 +634,23 @@
     method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
   }
 
-  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.core.view.TintableBackgroundView {
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatToggleButton(android.content.Context);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
   public class LinearLayoutCompat extends android.view.ViewGroup {
     ctor public LinearLayoutCompat(android.content.Context);
     ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
@@ -830,7 +843,7 @@
     method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
   }
 
-  public class SwitchCompat extends android.widget.CompoundButton {
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
@@ -847,7 +860,9 @@
     method public android.graphics.drawable.Drawable! getTrackDrawable();
     method public android.content.res.ColorStateList? getTrackTintList();
     method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setShowText(boolean);
     method public void setSplitTrack(boolean);
     method public void setSwitchMinWidth(int);
diff --git a/appcompat/appcompat/api/public_plus_experimental_current.txt b/appcompat/appcompat/api/public_plus_experimental_current.txt
index cef99ba..615c749 100644
--- a/appcompat/appcompat/api/public_plus_experimental_current.txt
+++ b/appcompat/appcompat/api/public_plus_experimental_current.txt
@@ -472,7 +472,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatButton(android.content.Context);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
@@ -480,9 +480,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setSupportAllCaps(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -506,7 +508,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
     ctor public AppCompatCheckedTextView(android.content.Context);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -514,7 +516,9 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
@@ -618,7 +622,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatTextView(android.content.Context);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -627,9 +631,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
     method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -640,16 +646,23 @@
     method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
   }
 
-  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.core.view.TintableBackgroundView {
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatToggleButton(android.content.Context);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
   public class LinearLayoutCompat extends android.view.ViewGroup {
     ctor public LinearLayoutCompat(android.content.Context);
     ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
@@ -842,7 +855,7 @@
     method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
   }
 
-  public class SwitchCompat extends android.widget.CompoundButton {
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
@@ -859,7 +872,9 @@
     method public android.graphics.drawable.Drawable! getTrackDrawable();
     method public android.content.res.ColorStateList? getTrackTintList();
     method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setShowText(boolean);
     method public void setSplitTrack(boolean);
     method public void setSwitchMinWidth(int);
diff --git a/appcompat/appcompat/api/res-current.txt b/appcompat/appcompat/api/res-current.txt
index 78975ff..b9f58a8 100644
--- a/appcompat/appcompat/api/res-current.txt
+++ b/appcompat/appcompat/api/res-current.txt
@@ -98,6 +98,7 @@
 attr editTextColor
 attr editTextStyle
 attr elevation
+attr emojiCompatEnabled
 attr firstBaselineToTopHeight
 attr fontFamily
 attr fontVariationSettings
diff --git a/appcompat/appcompat/api/restricted_current.txt b/appcompat/appcompat/api/restricted_current.txt
index e0b7fe6..1292e2a 100644
--- a/appcompat/appcompat/api/restricted_current.txt
+++ b/appcompat/appcompat/api/restricted_current.txt
@@ -1340,7 +1340,7 @@
     method public void setTextAppearance(android.content.Context!, int);
   }
 
-  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatButton(android.content.Context);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
@@ -1348,9 +1348,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setSupportAllCaps(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -1374,7 +1376,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
     ctor public AppCompatCheckedTextView(android.content.Context);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1382,7 +1384,9 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
@@ -1501,7 +1505,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
 
-  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+  public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
     ctor public AppCompatTextView(android.content.Context);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
@@ -1510,9 +1514,11 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
     method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
     method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
@@ -1523,12 +1529,14 @@
     method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
   }
 
-  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.core.view.TintableBackgroundView {
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
     ctor public AppCompatToggleButton(android.content.Context);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
     ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
   }
@@ -1627,6 +1635,11 @@
     ctor public DialogTitle(android.content.Context);
   }
 
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
     ctor public FitWindowsFrameLayout(android.content.Context);
     ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
@@ -1921,7 +1934,7 @@
     method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
   }
 
-  public class SwitchCompat extends android.widget.CompoundButton {
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
     ctor public SwitchCompat(android.content.Context);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
     ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
@@ -1938,7 +1951,9 @@
     method public android.graphics.drawable.Drawable! getTrackDrawable();
     method public android.content.res.ColorStateList? getTrackTintList();
     method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
     method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
     method public void setShowText(boolean);
     method public void setSplitTrack(boolean);
     method public void setSwitchMinWidth(int);
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index dc4233a..546496f 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -13,10 +13,12 @@
     api("androidx.annotation:annotation:1.1.0")
 
     api(project(":core:core"))
+    implementation(project(":emoji2:emoji2"))
+    implementation(project(":emoji2:emoji2-views-helper"))
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.cursoradapter:cursoradapter:1.0.0")
-    api("androidx.activity:activity:1.2.2")
-    api("androidx.fragment:fragment:1.3.2")
+    api("androidx.activity:activity:1.2.3")
+    api("androidx.fragment:fragment:1.3.4")
     api(project(":appcompat:appcompat-resources"))
     api("androidx.drawerlayout:drawerlayout:1.0.0")
     implementation("androidx.lifecycle:lifecycle-runtime:2.3.1")
@@ -28,10 +30,11 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":internal-testutils-appcompat"), {
         exclude group: "androidx.appcompat", module: "appcompat"
         exclude group: "androidx.core", module: "core"
@@ -48,10 +51,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     defaultConfig {
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
diff --git a/appcompat/appcompat/lint-baseline.xml b/appcompat/appcompat/lint-baseline.xml
index a40150a..d9ee4cc 100644
--- a/appcompat/appcompat/lint-baseline.xml
+++ b/appcompat/appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -173,7 +173,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="409"
+            line="441"
             column="17"/>
     </issue>
 
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mContainer.mSplitBackground.getOutline(outline);"
         errorLine2="                                            ~~~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mContainer.mBackground.getOutline(outline);"
         errorLine2="                                       ~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ActionBarContainer is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            invalidateOutline();"
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ActionBarContainer is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            invalidateOutline();"
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.ActionBarContainer is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            invalidateOutline();"
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    actionBar.setHomeAsUpIndicator(themeImage);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    actionBar.setHomeActionContentDescription(contentDescRes);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    actionBar.setHomeActionContentDescription(contentDescRes);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -343,30 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.app.AppCompatDelegateImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                            .getSystemService(UiModeManager.class);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"
-            line="2426"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.app.AppCompatDelegateImpl.AutoBatteryNightModeManager is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return mPowerManager.isPowerSaveMode() ? MODE_NIGHT_YES : MODE_NIGHT_NO;"
-        errorLine2="                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java"
-            line="3281"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.show(getTextDirection(), getTextAlignment());"
         errorLine2="                        ~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.show(getTextDirection(), getTextAlignment());"
         errorLine2="                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -387,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                vto.removeOnGlobalLayoutListener(this);"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -398,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (themedAdapter.getDropDownViewTheme() != dropDownTheme) {"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -409,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        themedAdapter.setDropDownViewTheme(dropDownTheme);"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -420,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                listView.setTextDirection(textDirection);"
         errorLine2="                         ~~~~~~~~~~~~~~~~">
         <location
@@ -431,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                listView.setTextAlignment(textAlignment);"
         errorLine2="                         ~~~~~~~~~~~~~~~~">
         <location
@@ -442,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                listView.setTextDirection(textDirection);"
         errorLine2="                         ~~~~~~~~~~~~~~~~">
         <location
@@ -453,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                listView.setTextAlignment(textAlignment);"
         errorLine2="                         ~~~~~~~~~~~~~~~~">
         <location
@@ -464,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mTextView.getContext().getSystemService(TextClassificationManager.class);"
         errorLine2="                                           ~~~~~~~~~~~~~~~~">
         <location
@@ -475,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return tcm.getTextClassifier();"
         errorLine2="                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -486,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mView.setFontVariationSettings(fontVariation);"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -497,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mView.setTextLocales(LocaleList.forLanguageTags(localeListString));"
         errorLine2="                      ~~~~~~~~~~~~~~">
         <location
@@ -508,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mView.setTextLocales(LocaleList.forLanguageTags(localeListString));"
         errorLine2="                                                ~~~~~~~~~~~~~~~">
         <location
@@ -519,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mView.setTextLocale(Locale.forLanguageTag(firstLanTag));"
         errorLine2="                      ~~~~~~~~~~~~~">
         <location
@@ -530,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mView.setTextLocale(Locale.forLanguageTag(firstLanTag));"
         errorLine2="                                           ~~~~~~~~~~~~~~">
         <location
@@ -541,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (mView.getAutoSizeStepGranularity() != AppCompatTextViewAutoSizeHelper"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -552,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mView.setAutoSizeTextTypeUniformWithConfiguration("
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -563,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mView.setAutoSizeTextTypeUniformWithPresetSizes("
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -574,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                typeface = Typeface.create(typeface, fontWeight,"
         errorLine2="                                                    ~~~~~~">
         <location
@@ -585,8 +563,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mFontTypeface = Typeface.create("
         errorLine2="                                                     ~~~~~~">
         <location
@@ -596,8 +574,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mFontTypeface = Typeface.create("
         errorLine2="                                                 ~~~~~~">
         <location
@@ -607,74 +585,74 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mView.setFontVariationSettings(fontVariation);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="495"
+            line="505"
             column="23"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                final Drawable[] compoundDrawables = mView.getCompoundDrawablesRelative();"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="523"
+            line="533"
             column="60"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final Drawable[] existingRel = mView.getCompoundDrawablesRelative();"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="663"
+            line="673"
             column="50"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mView.setCompoundDrawablesRelativeWithIntrinsicBounds("
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="664"
+            line="674"
             column="19"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                final Drawable[] existingRel = mView.getCompoundDrawablesRelative();"
         errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="674"
+            line="684"
             column="54"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.AppCompatTextHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mView.setCompoundDrawablesRelativeWithIntrinsicBounds("
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
-            line="676"
+            line="686"
             column="27"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                isInLayout = mTextView.isInLayout();"
         errorLine2="                                       ~~~~~~~~~~">
         <location
@@ -684,8 +662,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final int maxLines = Build.VERSION.SDK_INT >= 16 ? mTextView.getMaxLines() : -1;"
         errorLine2="                                                                     ~~~~~~~~~~~">
         <location
@@ -695,8 +673,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain("
         errorLine2="                                                                        ~~~~~~">
         <location
@@ -706,8 +684,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        layoutBuilder.setAlignment(alignment)"
         errorLine2="                      ~~~~~~~~~~~~">
         <location
@@ -717,8 +695,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setLineSpacing("
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -728,8 +706,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mTextView.getLineSpacingExtra(),"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -739,8 +717,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mTextView.getLineSpacingMultiplier())"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -750,8 +728,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setIncludePad(mTextView.getIncludeFontPadding())"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -761,8 +739,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setIncludePad(mTextView.getIncludeFontPadding())"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -772,8 +750,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setBreakStrategy(mTextView.getBreakStrategy())"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -783,8 +761,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setBreakStrategy(mTextView.getBreakStrategy())"
         errorLine2="                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -794,8 +772,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setHyphenationFrequency(mTextView.getHyphenationFrequency())"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -805,8 +783,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setHyphenationFrequency(mTextView.getHyphenationFrequency())"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -816,8 +794,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMaxLines(maxLines == -1 ? Integer.MAX_VALUE : maxLines);"
         errorLine2="                 ~~~~~~~~~~~">
         <location
@@ -827,8 +805,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return layoutBuilder.build();"
         errorLine2="                             ~~~~~">
         <location
@@ -838,8 +816,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final float lineSpacingMultiplier = mTextView.getLineSpacingMultiplier();"
         errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -849,8 +827,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final float lineSpacingAdd = mTextView.getLineSpacingExtra();"
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -860,8 +838,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final boolean includePad = mTextView.getIncludeFontPadding();"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -871,8 +849,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.view.ContextThemeWrapper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.view.ContextThemeWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                final Context resContext = createConfigurationContext(mOverrideConfiguration);"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -882,30 +860,30 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.DropDownListView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.DropDownListView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            drawableHotspotChanged(x, y);"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/DropDownListView.java"
-            line="648"
+            line="650"
             column="13"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.DropDownListView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.DropDownListView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            child.drawableHotspotChanged(childX, childY);"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/DropDownListView.java"
-            line="671"
+            line="673"
             column="19"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.ListPopupWindow is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPopup.setEpicenterBounds(mEpicenterBounds);"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~">
         <location
@@ -915,8 +893,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.ListPopupWindow is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.setIsClippedToScreen(clip);"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -926,8 +904,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.appcompat.widget.ListPopupWindow is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mPopup.getMaxAvailableHeight(anchor, yOffset, ignoreBottomDecorations);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -937,19 +915,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.view.menu.MenuPopupHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.view.menu.MenuPopupHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            display.getRealSize(displaySize);"
         errorLine2="                    ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"
-            line="231"
+            line="236"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.MenuPopupWindow is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.setEnterTransition((Transition) enterTransition);"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~">
         <location
@@ -959,8 +937,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.widget.MenuPopupWindow is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.setExitTransition((Transition) exitTransition);"
         errorLine2="                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -970,8 +948,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.MenuPopupWindow is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPopup.setTouchModal(touchModal);"
         errorLine2="                   ~~~~~~~~~~~~~">
         <location
@@ -981,8 +959,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.appcompat.widget.MenuPopupWindow.MenuDropDownListView is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.MenuPopupWindow.MenuDropDownListView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    &amp;&amp; ViewCompat.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {"
         errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~">
         <location
@@ -992,8 +970,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.appcompat.app.ResourcesFlusher is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.appcompat.app.ResourcesFlusher is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            unthemedEntries.clear();"
         errorLine2="                            ~~~~~">
         <location
@@ -1003,8 +981,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.SearchView is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.SearchView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mSearchSrcTextView.refreshAutoCompleteResults();"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1014,8 +992,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.appcompat.widget.SearchView.SearchAutoComplete is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.SearchView.SearchAutoComplete is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                setInputMethodMode(INPUT_METHOD_NEEDED);"
         errorLine2="                ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1025,8 +1003,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.appcompat.widget.SwitchCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.appcompat.widget.SwitchCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mPositionAnimator.setAutoCancel(true);"
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
@@ -1036,8 +1014,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.TintTypedArray is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.TintTypedArray is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mWrapped.getType(index);"
         errorLine2="                            ~~~~~~~">
         <location
@@ -1047,8 +1025,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.appcompat.widget.TintTypedArray is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.TintTypedArray is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mWrapped.getChangingConfigurations();"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1058,8 +1036,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.widget.TooltipCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.TooltipCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            view.setTooltipText(tooltipText);"
         errorLine2="                 ~~~~~~~~~~~~~~">
         <location
@@ -1069,8 +1047,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.view.WindowCallbackWrapper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mWrapped.onSearchRequested(searchEvent);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
@@ -1080,8 +1058,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.appcompat.view.WindowCallbackWrapper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mWrapped.onWindowStartingActionMode(callback, type);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1091,8 +1069,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.appcompat.view.WindowCallbackWrapper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mWrapped.onProvideKeyboardShortcuts(data, menu, deviceId);"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1102,8 +1080,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.appcompat.view.WindowCallbackWrapper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mWrapped.onPointerCaptureChanged(hasCapture);"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -3229,7 +3207,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="122"
+            line="123"
             column="30"/>
     </issue>
 
@@ -3240,7 +3218,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="128"
+            line="129"
             column="40"/>
     </issue>
 
@@ -3251,7 +3229,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="141"
+            line="142"
             column="44"/>
     </issue>
 
@@ -3262,7 +3240,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="580"
+            line="581"
             column="15"/>
     </issue>
 
@@ -3273,7 +3251,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="588"
+            line="589"
             column="12"/>
     </issue>
 
@@ -3284,7 +3262,7 @@
         errorLine2="                                             ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="588"
+            line="589"
             column="46"/>
     </issue>
 
@@ -3295,7 +3273,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="593"
+            line="594"
             column="15"/>
     </issue>
 
@@ -3306,7 +3284,7 @@
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="593"
+            line="594"
             column="49"/>
     </issue>
 
@@ -3317,7 +3295,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="607"
+            line="608"
             column="41"/>
     </issue>
 
@@ -3328,7 +3306,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="613"
+            line="614"
             column="12"/>
     </issue>
 
@@ -3339,7 +3317,7 @@
         errorLine2="                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="622"
+            line="623"
             column="31"/>
     </issue>
 
@@ -3350,7 +3328,7 @@
         errorLine2="                           ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="636"
+            line="637"
             column="28"/>
     </issue>
 
@@ -3361,7 +3339,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="648"
+            line="649"
             column="12"/>
     </issue>
 
@@ -3372,7 +3350,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="669"
+            line="670"
             column="34"/>
     </issue>
 
@@ -3383,7 +3361,7 @@
         errorLine2="                                                             ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="669"
+            line="670"
             column="62"/>
     </issue>
 
@@ -3394,7 +3372,7 @@
         errorLine2="           ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="679"
+            line="680"
             column="12"/>
     </issue>
 
@@ -3405,7 +3383,7 @@
         errorLine2="                                                      ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="747"
+            line="748"
             column="55"/>
     </issue>
 
@@ -3416,7 +3394,7 @@
         errorLine2="                                       ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="769"
+            line="770"
             column="40"/>
     </issue>
 
@@ -3427,7 +3405,7 @@
         errorLine2="                            ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="830"
+            line="831"
             column="29"/>
     </issue>
 
@@ -3438,7 +3416,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="830"
+            line="831"
             column="40"/>
     </issue>
 
@@ -3449,7 +3427,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="834"
+            line="835"
             column="29"/>
     </issue>
 
@@ -3460,7 +3438,7 @@
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
-            line="838"
+            line="839"
             column="29"/>
     </issue>
 
@@ -3768,7 +3746,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="301"
+            line="304"
             column="41"/>
     </issue>
 
@@ -3779,7 +3757,7 @@
         errorLine2="                                                        ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="320"
+            line="323"
             column="57"/>
     </issue>
 
@@ -3790,7 +3768,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="344"
+            line="347"
             column="29"/>
     </issue>
 
@@ -3801,7 +3779,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="481"
+            line="488"
             column="12"/>
     </issue>
 
@@ -3812,7 +3790,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="490"
+            line="497"
             column="38"/>
     </issue>
 
@@ -3823,7 +3801,7 @@
         errorLine2="                           ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="870"
+            line="877"
             column="28"/>
     </issue>
 
@@ -3834,7 +3812,7 @@
         errorLine2="                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
-            line="870"
+            line="877"
             column="45"/>
     </issue>
 
@@ -5546,17 +5524,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java"
-            line="202"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 setTextAppearance(Context context, int resId) {"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -5612,17 +5579,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
-            line="375"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 onSupportActionModeStarted(ActionMode mode);"
         errorLine2="                                    ~~~~~~~~~~">
         <location
@@ -5667,50 +5623,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 setTextAppearance(Context context, int resId) {"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java"
-            line="78"
-            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 InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java"
-            line="94"
-            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 InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="                                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java"
-            line="94"
-            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 setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java"
-            line="104"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 MenuInflater getMenuInflater();"
         errorLine2="                    ~~~~~~~~~~~~">
         <location
@@ -6089,7 +6001,7 @@
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="218"
+            line="207"
             column="35"/>
     </issue>
 
@@ -6100,29 +6012,18 @@
         errorLine2="                                                   ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="233"
+            line="222"
             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 setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="286"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 onDragEvent(@SuppressWarnings(&quot;MissingNullability&quot;) DragEvent event) {"
         errorLine2="                                                                       ~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
-            line="322"
+            line="285"
             column="72"/>
     </issue>
 
@@ -6415,22 +6316,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="446"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 getText() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
-            line="500"
+            line="508"
             column="12"/>
     </issue>
 
@@ -6441,7 +6331,7 @@
         errorLine2="                                               ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="193"
+            line="200"
             column="48"/>
     </issue>
 
@@ -6452,7 +6342,7 @@
         errorLine2="                                                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="193"
+            line="200"
             column="65"/>
     </issue>
 
@@ -6463,7 +6353,7 @@
         errorLine2="                                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="198"
+            line="205"
             column="50"/>
     </issue>
 
@@ -6474,7 +6364,7 @@
         errorLine2="                                                                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="198"
+            line="205"
             column="67"/>
     </issue>
 
@@ -6485,7 +6375,7 @@
         errorLine2="                                           ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="203"
+            line="210"
             column="44"/>
     </issue>
 
@@ -6496,7 +6386,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="203"
+            line="210"
             column="61"/>
     </issue>
 
@@ -6507,7 +6397,7 @@
         errorLine2="                                               ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="208"
+            line="215"
             column="48"/>
     </issue>
 
@@ -6518,7 +6408,7 @@
         errorLine2="                                                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="208"
+            line="215"
             column="65"/>
     </issue>
 
@@ -6529,7 +6419,7 @@
         errorLine2="                                             ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="213"
+            line="220"
             column="46"/>
     </issue>
 
@@ -6540,7 +6430,7 @@
         errorLine2="                                                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="213"
+            line="220"
             column="63"/>
     </issue>
 
@@ -6551,7 +6441,7 @@
         errorLine2="                                                     ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="218"
+            line="225"
             column="54"/>
     </issue>
 
@@ -6562,7 +6452,7 @@
         errorLine2="                                                                      ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="218"
+            line="225"
             column="71"/>
     </issue>
 
@@ -6573,7 +6463,7 @@
         errorLine2="                                               ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="223"
+            line="230"
             column="48"/>
     </issue>
 
@@ -6584,7 +6474,7 @@
         errorLine2="                                                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="223"
+            line="230"
             column="65"/>
     </issue>
 
@@ -6595,7 +6485,7 @@
         errorLine2="                                                     ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="228"
+            line="235"
             column="54"/>
     </issue>
 
@@ -6606,7 +6496,7 @@
         errorLine2="                                                                      ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="228"
+            line="235"
             column="71"/>
     </issue>
 
@@ -6617,7 +6507,7 @@
         errorLine2="                                                             ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="233"
+            line="240"
             column="62"/>
     </issue>
 
@@ -6628,7 +6518,7 @@
         errorLine2="                                                                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="233"
+            line="240"
             column="79"/>
     </issue>
 
@@ -6639,7 +6529,7 @@
         errorLine2="                                                                       ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="238"
+            line="245"
             column="72"/>
     </issue>
 
@@ -6650,7 +6540,7 @@
         errorLine2="            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="239"
+            line="246"
             column="13"/>
     </issue>
 
@@ -6661,7 +6551,7 @@
         errorLine2="                                                                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="244"
+            line="251"
             column="82"/>
     </issue>
 
@@ -6672,7 +6562,7 @@
         errorLine2="            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="245"
+            line="252"
             column="13"/>
     </issue>
 
@@ -6683,7 +6573,7 @@
         errorLine2="                                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="250"
+            line="257"
             column="50"/>
     </issue>
 
@@ -6694,7 +6584,7 @@
         errorLine2="                                                                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="250"
+            line="257"
             column="67"/>
     </issue>
 
@@ -6705,7 +6595,7 @@
         errorLine2="                                             ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="255"
+            line="262"
             column="46"/>
     </issue>
 
@@ -6716,7 +6606,7 @@
         errorLine2="                                                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="255"
+            line="262"
             column="63"/>
     </issue>
 
@@ -6727,7 +6617,7 @@
         errorLine2="                                                       ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="260"
+            line="267"
             column="56"/>
     </issue>
 
@@ -6738,7 +6628,7 @@
         errorLine2="                                                                        ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="260"
+            line="267"
             column="73"/>
     </issue>
 
@@ -6749,7 +6639,7 @@
         errorLine2="                              ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="272"
+            line="279"
             column="31"/>
     </issue>
 
@@ -6760,7 +6650,7 @@
         errorLine2="                                               ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="272"
+            line="279"
             column="48"/>
     </issue>
 
@@ -6771,7 +6661,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
-            line="272"
+            line="279"
             column="61"/>
     </issue>
 
@@ -10357,7 +10247,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"
-            line="345"
+            line="350"
             column="12"/>
     </issue>
 
@@ -10434,7 +10324,7 @@
         errorLine2="                                    ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
-            line="191"
+            line="199"
             column="37"/>
     </issue>
 
@@ -12234,17 +12124,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
-            line="1460"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
@@ -12513,7 +12392,7 @@
         errorLine2="                        ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="556"
+            line="557"
             column="25"/>
     </issue>
 
@@ -12524,7 +12403,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="556"
+            line="557"
             column="43"/>
     </issue>
 
@@ -12535,7 +12414,7 @@
         errorLine2="                        ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="630"
+            line="631"
             column="25"/>
     </issue>
 
@@ -12546,7 +12425,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="652"
+            line="653"
             column="12"/>
     </issue>
 
@@ -12557,7 +12436,7 @@
         errorLine2="                                   ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="676"
+            line="677"
             column="36"/>
     </issue>
 
@@ -12568,7 +12447,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="690"
+            line="691"
             column="12"/>
     </issue>
 
@@ -12579,7 +12458,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="737"
+            line="738"
             column="12"/>
     </issue>
 
@@ -12590,7 +12469,7 @@
         errorLine2="                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="761"
+            line="762"
             column="26"/>
     </issue>
 
@@ -12601,7 +12480,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="793"
+            line="794"
             column="12"/>
     </issue>
 
@@ -12612,7 +12491,7 @@
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="815"
+            line="816"
             column="29"/>
     </issue>
 
@@ -12623,7 +12502,7 @@
         errorLine2="                                       ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="846"
+            line="847"
             column="40"/>
     </issue>
 
@@ -12634,7 +12513,7 @@
         errorLine2="                                          ~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="857"
+            line="858"
             column="43"/>
     </issue>
 
@@ -12645,7 +12524,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1021"
+            line="1022"
             column="46"/>
     </issue>
 
@@ -12656,7 +12535,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1127"
+            line="1128"
             column="12"/>
     </issue>
 
@@ -12667,7 +12546,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1204"
+            line="1205"
             column="44"/>
     </issue>
 
@@ -12678,7 +12557,7 @@
         errorLine2="              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1532"
+            line="1533"
             column="15"/>
     </issue>
 
@@ -12689,7 +12568,7 @@
         errorLine2="                                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1544"
+            line="1545"
             column="43"/>
     </issue>
 
@@ -12700,7 +12579,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1578"
+            line="1579"
             column="33"/>
     </issue>
 
@@ -12711,7 +12590,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="1604"
+            line="1605"
             column="33"/>
     </issue>
 
@@ -12722,7 +12601,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2199"
+            line="2200"
             column="12"/>
     </issue>
 
@@ -12733,7 +12612,7 @@
         errorLine2="                                             ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2199"
+            line="2200"
             column="46"/>
     </issue>
 
@@ -12744,7 +12623,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2204"
+            line="2205"
             column="15"/>
     </issue>
 
@@ -12755,7 +12634,7 @@
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2204"
+            line="2205"
             column="49"/>
     </issue>
 
@@ -12766,7 +12645,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2217"
+            line="2218"
             column="15"/>
     </issue>
 
@@ -12777,7 +12656,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2222"
+            line="2223"
             column="41"/>
     </issue>
 
@@ -12788,7 +12667,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2228"
+            line="2229"
             column="12"/>
     </issue>
 
@@ -12799,7 +12678,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2277"
+            line="2278"
             column="34"/>
     </issue>
 
@@ -12810,7 +12689,7 @@
         errorLine2="                                                             ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2277"
+            line="2278"
             column="62"/>
     </issue>
 
@@ -12821,7 +12700,7 @@
         errorLine2="                                       ~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2332"
+            line="2333"
             column="40"/>
     </issue>
 
@@ -12832,7 +12711,7 @@
         errorLine2="                                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2351"
+            line="2352"
             column="49"/>
     </issue>
 
@@ -12843,7 +12722,7 @@
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2369"
+            line="2370"
             column="29"/>
     </issue>
 
@@ -12854,7 +12733,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2375"
+            line="2376"
             column="29"/>
     </issue>
 
@@ -12865,7 +12744,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2379"
+            line="2380"
             column="29"/>
     </issue>
 
@@ -12876,7 +12755,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2386"
+            line="2387"
             column="29"/>
     </issue>
 
@@ -12887,7 +12766,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2402"
+            line="2403"
             column="27"/>
     </issue>
 
@@ -12898,7 +12777,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2406"
+            line="2407"
             column="27"/>
     </issue>
 
@@ -12909,7 +12788,7 @@
         errorLine2="                                         ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2406"
+            line="2407"
             column="42"/>
     </issue>
 
@@ -12920,7 +12799,7 @@
         errorLine2="                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2412"
+            line="2413"
             column="27"/>
     </issue>
 
@@ -12931,7 +12810,7 @@
         errorLine2="                                  ~~~~~~">
         <location
             file="src/main/java/androidx/appcompat/widget/Toolbar.java"
-            line="2417"
+            line="2418"
             column="35"/>
     </issue>
 
diff --git a/appcompat/appcompat/src/androidTest/AndroidManifest.xml b/appcompat/appcompat/src/androidTest/AndroidManifest.xml
index 41d32b4..f8ce22f 100644
--- a/appcompat/appcompat/src/androidTest/AndroidManifest.xml
+++ b/appcompat/appcompat/src/androidTest/AndroidManifest.xml
@@ -15,7 +15,12 @@
    limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.support.v7.appcompat.test">
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.appcompat.test">
+
+    <uses-sdk
+        android:minSdkVersion="14"
+        tools:overrideLibrary="android_libs.ub_uiautomator" />
 
     <application
         android:name="androidx.multidex.MultiDexApplication"
@@ -93,6 +98,11 @@
             android:configChanges="orientation"/>
 
         <activity
+            android:name="androidx.appcompat.widget.AppCompatAutoCompleteTextViewActivity"
+            android:label="@string/app_compat_auto_complete_text_view_activity"
+            android:theme="@style/Theme.TextColors"/>
+
+        <activity
             android:name="androidx.appcompat.widget.AppCompatTextViewActivity"
             android:label="@string/app_compat_text_view_activity"
             android:theme="@style/Theme.TextColors"/>
@@ -103,6 +113,11 @@
             android:theme="@style/Theme.AppCompat.Light"/>
 
         <activity
+            android:name="androidx.appcompat.widget.AppCompatTextViewEmojiActivity"
+            android:label="@string/app_compat_text_view_emoji_activity"
+            android:theme="@style/Theme.AppCompat.Light" />
+
+        <activity
             android:name="androidx.appcompat.widget.AppCompatEditTextActivity"
             android:label="@string/app_compat_edit_text_activity"
             android:theme="@style/Theme.TextColors"/>
@@ -133,6 +148,11 @@
             android:theme="@style/Theme.AppCompat.Light"/>
 
         <activity
+            android:name="androidx.appcompat.widget.AppCompatButtonEmojiActivity"
+            android:label="@string/app_compat_button_activity"
+            android:theme="@style/Theme.AppCompat.Light"/>
+
+        <activity
             android:name="androidx.appcompat.widget.AppCompatIconsActivity"
             android:label="@string/app_compat_icons_activity"
             android:theme="@style/Theme.AppCompat.Light"/>
@@ -153,11 +173,26 @@
             android:theme="@style/Theme.AppCompat.Light"/>
 
         <activity
+            android:name="androidx.appcompat.widget.AppCompatCheckedTextViewEmojiActivity"
+            android:label="@string/app_compat_checkedtextview_activity"
+            android:theme="@style/Theme.AppCompat.Light"/>
+
+        <activity
             android:name="androidx.appcompat.widget.AppCompatToggleButtonActivity"
             android:label="@string/app_compat_toggle_button_activity"
             android:theme="@style/Theme.AppCompat.Light"/>
 
         <activity
+            android:name="androidx.appcompat.widget.AppCompatToggleButtonEmojiActivity"
+            android:label="@string/app_compat_text_view_emoji_activity"
+            android:theme="@style/Theme.AppCompat.Light" />
+
+        <activity
+            android:name="androidx.appcompat.widget.SwitchCompatEmojiActivity"
+            android:label="@string/app_compat_text_view_emoji_activity"
+            android:theme="@style/Theme.AppCompat.Light" />
+
+        <activity
             android:name="androidx.appcompat.widget.SwitchCompatActivity"
             android:label="@string/switch_compat_activity"
             android:theme="@style/Theme.AppCompat.Light"/>
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
index 0d0af97..dbeb17c 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateDoesNotRecreateActivityTestCase.kt
@@ -24,15 +24,16 @@
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
-import androidx.appcompat.testutils.TestUtilsActions.rotateScreenOrientation
 import androidx.lifecycle.Lifecycle
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.matcher.ViewMatchers.isRoot
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
 import androidx.testutils.LifecycleOwnerUtils
 import org.junit.After
 import org.junit.Assert.assertNotSame
 import org.junit.Assert.assertSame
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -40,7 +41,12 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 18)
 public class NightModeRotateDoesNotRecreateActivityTestCase(private val setMode: NightSetMode) {
+
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
     @get:Rule
     public val activityRule: NightModeActivityTestRule<NightModeRotateDoesNotRecreateActivity> =
         NightModeActivityTestRule(
@@ -50,8 +56,16 @@
             launchActivity = false
         )
 
+    @Before
+    public fun setup() {
+        device.setOrientationNatural()
+    }
+
     @After
     public fun teardown() {
+        device.unfreezeRotation()
+        device.waitForIdle()
+
         // Clean up after the default mode test.
         if (setMode == NightSetMode.DEFAULT) {
             activityRule.runOnUiThread {
@@ -62,15 +76,6 @@
 
     @Test
     public fun testRotateDoesNotRecreateActivity() {
-        // Don't run this test on SDK 26 because it has issues with setRequestedOrientation. Also
-        // don't run it on SDK 24 (Nexus Player) or SDK 23 (Pixel C) because those devices only
-        // support a single orientation and there doesn't seem to be a way to query supported
-        // screen orientations.
-        val sdkInt = Build.VERSION.SDK_INT
-        if (sdkInt == 26 || sdkInt == 24 || sdkInt == 23) {
-            return
-        }
-
         // Set local night mode to MODE_NIGHT_YES and wait for state RESUMED.
         val initialActivity = activityRule.launchActivity(null)
         LifecycleOwnerUtils.waitUntilState(initialActivity, Lifecycle.State.RESUMED)
@@ -89,7 +94,8 @@
         // Now rotate the device. This should NOT result in a lifecycle event, just a call to
         // onConfigurationChanged.
         nightModeActivity.resetOnConfigurationChange()
-        onView(isRoot()).perform(rotateScreenOrientation(nightModeActivity))
+        device.setOrientationLeft()
+        instrumentation.waitForIdleSync()
         nightModeActivity.expectOnConfigurationChange(5000)
 
         // Assert that we got the same activity and thus it was not recreated.
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
index f3e217c..3a8995a 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeRotateRecreatesActivityWithConfigTestCase.kt
@@ -16,6 +16,8 @@
 
 package androidx.appcompat.app
 
+import android.app.Activity
+import android.app.Instrumentation
 import android.content.res.Configuration
 import android.os.Build
 import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
@@ -24,15 +26,16 @@
 import androidx.appcompat.testutils.NightModeUtils.NightSetMode
 import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
 import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForRecreate
-import androidx.appcompat.testutils.TestUtilsActions.rotateScreenOrientation
 import androidx.lifecycle.Lifecycle
-import androidx.test.espresso.Espresso.onView
-import androidx.test.espresso.matcher.ViewMatchers
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
 import androidx.testutils.LifecycleOwnerUtils
 import org.junit.After
+import org.junit.Assert.assertNotEquals
 import org.junit.Assert.assertNotSame
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -40,7 +43,12 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 18)
 public class NightModeRotateRecreatesActivityWithConfigTestCase(private val setMode: NightSetMode) {
+
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
+    private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
     @get:Rule
     public val activityRule: NightModeActivityTestRule<NightModeActivity> =
         NightModeActivityTestRule(
@@ -50,8 +58,17 @@
             launchActivity = false
         )
 
+    @Before
+    public fun setup() {
+        device.setOrientationNatural()
+        device.waitForIdle(5000)
+    }
+
     @After
     public fun teardown() {
+        device.setOrientationNatural()
+        device.waitForIdle(5000)
+
         // Clean up after the default mode test.
         if (setMode == NightSetMode.DEFAULT) {
             activityRule.runOnUiThread {
@@ -60,18 +77,8 @@
         }
     }
 
-    @FlakyTest // b/182209264
     @Test
     public fun testRotateRecreatesActivityWithConfig() {
-        // Don't run this test on SDK 26 because it has issues with setRequestedOrientation. Also
-        // don't run it on SDK 24 (Nexus Player) or SDK 23 (Pixel C) because those devices only
-        // support a single orientation and there doesn't seem to be a way to query supported
-        // screen orientations.
-        val sdkInt = Build.VERSION.SDK_INT
-        if (sdkInt == 26 || sdkInt == 24 || sdkInt == 23) {
-            return
-        }
-
         // Set local night mode to MODE_NIGHT_YES and wait for state RESUMED.
         val initialActivity = activityRule.launchActivity(null)
         LifecycleOwnerUtils.waitUntilState(initialActivity, Lifecycle.State.RESUMED)
@@ -88,14 +95,10 @@
         assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, config)
 
         // Now rotate the device. This should result in an onDestroy lifecycle event.
-        nightModeActivity.resetOnCreate()
         nightModeActivity.resetOnDestroy()
-        onView(ViewMatchers.isRoot()).perform(rotateScreenOrientation(nightModeActivity))
+        rotateDeviceAndWaitForRecreate(nightModeActivity)
         nightModeActivity.expectOnDestroy(5000)
 
-        // Slow devices might need some time between onDestroy and onCreate.
-        nightModeActivity.expectOnCreate(5000)
-
         // Assert that we got a different activity and thus it was recreated.
         val rotatedNightModeActivity = activityRule.activity
         val rotatedConfig = rotatedNightModeActivity.resources.configuration
@@ -107,6 +110,26 @@
         assertNotSame(orientation, rotatedConfig.orientation)
     }
 
+    private fun rotateDeviceAndWaitForRecreate(activity: Activity) {
+        val monitor = Instrumentation.ActivityMonitor(activity::class.java.name, null, false)
+        instrumentation.addMonitor(monitor)
+
+        // Rotate
+        device.setOrientationLeft()
+
+        // Wait for the activity to be recreated after rotation
+        var count = 0
+        var lastActivity = activity
+        while (activity == lastActivity && count < 5) {
+            lastActivity = monitor.waitForActivityWithTimeout(1000L)
+            count++
+        }
+        instrumentation.waitForIdleSync()
+
+        // Ensure that we didn't time out
+        assertNotEquals("Activity was not recreated within 5000ms", activity, lastActivity)
+    }
+
     public companion object {
         @JvmStatic
         @Parameterized.Parameters
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/SupportActionBarTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/SupportActionBarTestCase.kt
new file mode 100644
index 0000000..e77dd7d
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/SupportActionBarTestCase.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.appcompat.app
+
+import android.os.SystemClock
+import android.view.MotionEvent
+import android.view.Window
+import androidx.appcompat.test.R
+import androidx.test.core.app.ActivityScenario
+import androidx.test.filters.MediumTest
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+@MediumTest
+public class SupportActionBarTestCase {
+
+    /**
+     * Regression test for b/186791590 where custom window callbacks were overwritten.
+     */
+    @Test
+    public fun testSetSupportActionBarPreservesWindowCallback() {
+        ActivityScenario.launch(ToolbarAppCompatActivity::class.java).onActivity { activity ->
+            val previousCallback = activity.window.callback
+            var dispatchedToCallback = false
+
+            activity.window.callback = object : Window.Callback by previousCallback {
+                override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
+                    dispatchedToCallback = true
+                    return previousCallback.dispatchTouchEvent(event)
+                }
+            }
+
+            activity.setSupportActionBar(activity.findViewById(R.id.toolbar))
+            activity.window.callback.dispatchTouchEvent(obtainEvent(MotionEvent.ACTION_DOWN))
+
+            assertTrue(
+                "Event was not dispatched to custom window callback",
+                dispatchedToCallback
+            )
+        }
+    }
+
+    @Suppress("SameParameterValue")
+    private fun obtainEvent(action: Int): MotionEvent {
+        val now: Long = SystemClock.uptimeMillis()
+        return MotionEvent.obtain(now, now, action, 0f, 0f, 0)
+    }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewActivity.java
new file mode 100644
index 0000000..2f0220e
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class AppCompatAutoCompleteTextViewActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_autocompletetextview_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewTest.java
new file mode 100644
index 0000000..c5046d0
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.appcompat.widget;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import androidx.test.filters.LargeTest;
+
+import org.junit.Test;
+
+/**
+ * In addition to all tinting-related tests done by the base class, this class provides
+ * tests specific to {@link AppCompatAutoCompleteTextView} class.
+ */
+@LargeTest
+public class AppCompatAutoCompleteTextViewTest
+        extends AppCompatBaseViewTest<AppCompatAutoCompleteTextViewActivity,
+        AppCompatAutoCompleteTextView> {
+
+    public AppCompatAutoCompleteTextViewTest() {
+        super(AppCompatAutoCompleteTextViewActivity.class);
+    }
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final AppCompatAutoCompleteTextView view = new AppCompatAutoCompleteTextView(mActivity);
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseTextViewEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseTextViewEmojiTest.java
new file mode 100644
index 0000000..334793c
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseTextViewEmojiTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.app.Instrumentation;
+import android.widget.TextView;
+
+import androidx.appcompat.testutils.BaseTestActivity;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public abstract class AppCompatBaseTextViewEmojiTest<ActivityType extends BaseTestActivity,
+        ViewType extends TextView & EmojiCompatConfigurationView> {
+
+    @Rule
+    public final ActivityTestRule<ActivityType> mActivityTestRule;
+    public EmojiCompat mEmojiCompatMock;
+    public Instrumentation mInstrumentation;
+
+    public AppCompatBaseTextViewEmojiTest(Class<ActivityType> clazz) {
+        mActivityTestRule = new ActivityTestRule<>(clazz, false, false);
+    }
+
+    @Before
+    public void ensureEmojiInitialized() {
+        resetEmojiCompatToNewMock();
+        mActivityTestRule.launchActivity(null);
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+    }
+
+    @After
+    public void cleanupEmojiCompat() {
+        EmojiCompat.reset((EmojiCompat) null);
+    }
+
+    public void resetEmojiCompatToNewMock() {
+        mEmojiCompatMock = mock(EmojiCompat.class);
+        when(mEmojiCompatMock.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
+        EmojiCompat.reset(mEmojiCompatMock);
+    }
+
+    @Test
+    public void byDefault_setText_callsEmojiCompat() {
+        resetEmojiCompatToNewMock();
+        ViewType subject = mActivityTestRule.getActivity()
+                .findViewById(androidx.appcompat.test.R.id.emoji_default);
+        mInstrumentation.runOnMainSync(() -> {
+            subject.setText("Test text");
+            verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+        });
+    }
+
+    @Test
+    public void whenEnabled_setText_callsProcess() {
+        resetEmojiCompatToNewMock();
+        ViewType subject = mActivityTestRule.getActivity()
+                .findViewById(androidx.appcompat.test.R.id.emoji_enabled);
+        mInstrumentation.runOnMainSync(() -> {
+            String expected = "Test text";
+            subject.setText(expected);
+            verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+        });
+    }
+
+    @Test
+    public void whenDisabled_noCalls() {
+        resetEmojiCompatToNewMock();
+        ViewType subject = mActivityTestRule.getActivity()
+                .findViewById(androidx.appcompat.test.R.id.emoji_disabled);
+        String expected = "Test text";
+        subject.setText(expected);
+
+        verifyNoMoreInteractions(mEmojiCompatMock);
+    }
+
+    @Test
+    public void whenReEnabled_callsProcess() throws Throwable {
+        resetEmojiCompatToNewMock();
+        ViewType subject = mActivityTestRule.getActivity()
+                .findViewById(androidx.appcompat.test.R.id.emoji_disabled);
+        String expected = "Some text";
+        mInstrumentation.runOnMainSync(() -> {
+            subject.setText(expected);
+            verifyNoMoreInteractions(mEmojiCompatMock);
+
+            subject.setEmojiCompatEnabled(true);
+        });
+        verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+    }
+
+    @Test
+    public void whenNotConfigured_andDisabled_doesNotEnable_whenConfigured() throws Throwable {
+        EmojiCompat.reset((EmojiCompat) null);
+        mActivityTestRule.finishActivity();
+        mActivityTestRule.launchActivity(null);
+
+        ActivityType activity = mActivityTestRule.getActivity();
+        ViewType disabledInAdvance =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_disabled);
+        ViewType enabledInAdvance =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_enabled);
+        ViewType defaultEmoji =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_default);
+
+        mInstrumentation.runOnMainSync(() -> {
+            enabledInAdvance.setEmojiCompatEnabled(false);
+            defaultEmoji.setEmojiCompatEnabled(false);
+        });
+        // now: confirm no interactions with EmojiCompat with all text views disabled
+        resetEmojiCompatToNewMock();
+        // set the filters without calling enabled to avoid allowing re-set of disabled to update
+        // the disabled state
+        disabledInAdvance.setFilters(disabledInAdvance.getFilters());
+        disabledInAdvance.setText("Some text");
+        enabledInAdvance.setFilters(enabledInAdvance.getFilters());
+        enabledInAdvance.setText("Some text");
+        defaultEmoji.setFilters(defaultEmoji.getFilters());
+        defaultEmoji.setText("Some text");
+        verifyNoMoreInteractions(mEmojiCompatMock);
+    }
+
+    @Test
+    public void whenNotConfigured_callingEnabled_afterConfigure_enablesEmoji() throws Throwable {
+        EmojiCompat.reset((EmojiCompat) null);
+        mActivityTestRule.finishActivity();
+        mActivityTestRule.launchActivity(null);
+
+        ActivityType activity = mActivityTestRule.getActivity();
+        ViewType enabledInAdvance =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_enabled);
+
+        resetEmojiCompatToNewMock();
+        mInstrumentation.runOnMainSync(() -> {
+            enabledInAdvance.setEmojiCompatEnabled(true);
+            enabledInAdvance.setText("Some text");
+        });
+
+        verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+    }
+
+    @Test
+    public void getEnabled() throws Throwable {
+        ActivityType activity = mActivityTestRule.getActivity();
+        ViewType disabledInAdvance =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_disabled);
+        ViewType enabledInAdvance =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_enabled);
+        ViewType defaultEmoji =
+                activity.findViewById(androidx.appcompat.test.R.id.emoji_default);
+
+        assertFalse(disabledInAdvance.isEmojiCompatEnabled());
+        assertTrue(enabledInAdvance.isEmojiCompatEnabled());
+        assertTrue(defaultEmoji.isEmojiCompatEnabled());
+
+        mInstrumentation.runOnMainSync(() -> {
+            defaultEmoji.setEmojiCompatEnabled(false);
+        });
+        assertFalse(defaultEmoji.isEmojiCompatEnabled());
+    }
+
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiActivity.java
new file mode 100644
index 0000000..d9dd723
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class AppCompatButtonEmojiActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_togglebutton_emoji_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiTest.java
new file mode 100644
index 0000000..23323fa
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonEmojiTest.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.appcompat.widget;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatButtonEmojiTest extends
+        AppCompatBaseTextViewEmojiTest<AppCompatButtonEmojiActivity, AppCompatButton> {
+
+    public AppCompatButtonEmojiTest() {
+        super(AppCompatButtonEmojiActivity.class);
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonTest.java
index 3bc8f73..b6febf9 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatButtonTest.java
@@ -20,8 +20,12 @@
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import android.graphics.Typeface;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
 
 import androidx.appcompat.test.R;
 import androidx.core.content.res.ResourcesCompat;
@@ -102,4 +106,40 @@
 
         assertEquals(expected, button.getTypeface());
     }
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final AppCompatButton view = new AppCompatButton(mActivity);
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiActivity.java
new file mode 100644
index 0000000..b0a5a92
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class AppCompatCheckedTextViewEmojiActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_checkedtextview_emoji_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiTest.java
new file mode 100644
index 0000000..e3ff955
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewEmojiTest.java
@@ -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.appcompat.widget;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatCheckedTextViewEmojiTest
+        extends AppCompatBaseTextViewEmojiTest<AppCompatCheckedTextViewEmojiActivity,
+        AppCompatCheckedTextView> {
+
+    public AppCompatCheckedTextViewEmojiTest() {
+        super(AppCompatCheckedTextViewEmojiActivity.class);
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewTest.java
index 92e3a95..cef0f44 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatCheckedTextViewTest.java
@@ -23,6 +23,9 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.AnimatedStateListDrawable;
 import android.graphics.drawable.Drawable;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
 
 import androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat;
 import androidx.appcompat.test.R;
@@ -109,4 +112,40 @@
         // Then the drawable should be present
         assertNotNull(checkMark);
     }
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final AppCompatCheckedTextView view = new AppCompatCheckedTextView(mActivity);
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextTest.java
index 6f9efd0..1f61146 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextTest.java
@@ -17,11 +17,15 @@
 package androidx.appcompat.widget;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.text.Editable;
 import android.text.Layout;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.textclassifier.TextClassificationManager;
 import android.view.textclassifier.TextClassifier;
 import android.widget.EditText;
@@ -195,4 +199,40 @@
     }
 
     private static class NoOpTextClassifier implements TextClassifier {}
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final AppCompatEditText view = new AppCompatEditText(mActivityTestRule.getActivity());
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiActivity.java
new file mode 100644
index 0000000..ff9dad5
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class AppCompatTextViewEmojiActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_textview_emoji_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiTest.java
new file mode 100644
index 0000000..0795264
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewEmojiTest.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.appcompat.widget;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatTextViewEmojiTest
+        extends AppCompatBaseTextViewEmojiTest<AppCompatTextViewEmojiActivity, AppCompatTextView> {
+
+    public AppCompatTextViewEmojiTest() {
+        super(AppCompatTextViewEmojiActivity.class);
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewTest.java
index d0f11af..281e840 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewTest.java
@@ -41,6 +41,9 @@
 import android.os.Build;
 import android.os.LocaleList;
 import android.text.Layout;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.textclassifier.TextClassificationManager;
@@ -1217,4 +1220,40 @@
                 0,
                 true);
     }
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final AppCompatTextView view = new AppCompatTextView(mActivity);
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiActivity.java
new file mode 100644
index 0000000..8b4b801
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class AppCompatToggleButtonEmojiActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.appcompat_togglebutton_emoji_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiTest.java
new file mode 100644
index 0000000..c44e7f9
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatToggleButtonEmojiTest.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.appcompat.widget;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppCompatToggleButtonEmojiTest extends
+        AppCompatBaseTextViewEmojiTest<AppCompatToggleButtonEmojiActivity, AppCompatToggleButton> {
+
+    public AppCompatToggleButtonEmojiTest() {
+        super(AppCompatToggleButtonEmojiActivity.class);
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiActivity.java
new file mode 100644
index 0000000..dde3c5d
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.appcompat.widget;
+
+import androidx.appcompat.test.R;
+import androidx.appcompat.testutils.BaseTestActivity;
+
+public class SwitchCompatEmojiActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.switch_compat_emoji_activity;
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiTest.java
new file mode 100644
index 0000000..9c85141
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatEmojiTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import androidx.appcompat.test.R;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SwitchCompatEmojiTest extends
+        AppCompatBaseTextViewEmojiTest<SwitchCompatEmojiActivity, SwitchCompat> {
+
+    public SwitchCompatEmojiTest() {
+        super(SwitchCompatEmojiActivity.class);
+    }
+
+    @Test
+    public void setupCallbacks_whenLoading() throws Throwable {
+        SwitchCompat emojiEnabled = mActivityTestRule.getActivity()
+                .findViewById(R.id.emoji_enabled);
+
+        mInstrumentation.runOnMainSync(() -> {
+            resetEmojiCompatToNewMock();
+            when(mEmojiCompatMock.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+            emojiEnabled.setTextOn("text on");
+            emojiEnabled.setShowText(true);
+        });
+        verify(mEmojiCompatMock).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void dontSetupCallbacks_whenDisabled() throws Throwable {
+        SwitchCompat emojiDisabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_disabled);
+
+        mInstrumentation.runOnMainSync(() -> {
+            resetEmojiCompatToNewMock();
+            when(mEmojiCompatMock.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+            emojiDisabled.setTextOn("text on");
+            emojiDisabled.setShowText(true);
+        });
+        verify(mEmojiCompatMock, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void noInteractions_whenDisnabled_andRepeatedShowText() {
+        SwitchCompat emojiDisabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_disabled);
+
+        mInstrumentation.runOnMainSync(() -> {
+            resetEmojiCompatToNewMock();
+            when(mEmojiCompatMock.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+            emojiDisabled.setTextOn("text on");
+            emojiDisabled.setShowText(true);
+            emojiDisabled.setShowText(true);
+            emojiDisabled.setShowText(true);
+            emojiDisabled.setShowText(true);
+        });
+        verifyNoMoreInteractions(mEmojiCompatMock);
+    }
+
+    public void setupCallbacks_whenLoading_andEnabledLate() throws Throwable {
+        SwitchCompat emojiDisabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_disabled);
+
+        mInstrumentation.runOnMainSync(() -> {
+            resetEmojiCompatToNewMock();
+            when(mEmojiCompatMock.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+            emojiDisabled.setTextOn("text on");
+            emojiDisabled.setShowText(true);
+            verifyNoMoreInteractions(mEmojiCompatMock);
+            // and enable it
+            emojiDisabled.setEmojiCompatEnabled(true);
+        });
+        verify(mEmojiCompatMock).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    public void whenSetShowText_doesTransform() {
+        SwitchCompat emojiEnabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_enabled);
+        mInstrumentation.runOnMainSync(() -> {
+            resetEmojiCompatToNewMock();
+            emojiEnabled.setShowText(true);
+        });
+        verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+    }
+
+    public void whenSetTextOn_doesTransform() {
+        SwitchCompat emojiEnabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_enabled);
+        mInstrumentation.runOnMainSync(() -> {
+            emojiEnabled.setShowText(true);
+            resetEmojiCompatToNewMock();
+            emojiEnabled.setTextOn("Hi");
+        });
+        verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+    }
+
+    public void whenSetTextOff_doesTransform() {
+        SwitchCompat emojiEnabled =
+                mActivityTestRule.getActivity().findViewById(R.id.emoji_enabled);
+        mInstrumentation.runOnMainSync(() -> {
+            emojiEnabled.setShowText(true);
+            resetEmojiCompatToNewMock();
+            emojiEnabled.setTextOff("Hi");
+        });
+        verify(mEmojiCompatMock, atLeastOnce()).getLoadState();
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatTest.java
index 954047c..12a4d54 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/SwitchCompatTest.java
@@ -29,6 +29,9 @@
 
 import android.graphics.Typeface;
 import android.os.Build;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityNodeInfo;
 
@@ -167,4 +170,40 @@
         }
         info.recycle();
     }
+
+    @Test
+    public void testSetCustomSelectionActionModeCallback() {
+        final SwitchCompat view = new SwitchCompat(mActivity);
+        final ActionMode.Callback callback = new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                return false;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        };
+
+        // Default value is documented as null.
+        assertNull(view.getCustomSelectionActionModeCallback());
+
+        // Setter and getter should be symmetric.
+        view.setCustomSelectionActionModeCallback(callback);
+        assertEquals(callback, view.getCustomSelectionActionModeCallback());
+
+        // Argument is nullable.
+        view.setCustomSelectionActionModeCallback(null);
+        assertNull(view.getCustomSelectionActionModeCallback());
+    }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java
deleted file mode 100644
index 6213985..0000000
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/TintResourcesTest.java
+++ /dev/null
@@ -1,78 +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.appcompat.widget;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.MediumTest;
-import androidx.test.rule.ActivityTestRule;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class TintResourcesTest {
-    @Rule
-    public final ActivityTestRule<AppCompatActivity> mActivityTestRule =
-            new ActivityTestRule<>(AppCompatActivity.class);
-
-    @Test
-    public void testTintResourcesDelegateBackToOriginalResources() {
-        final TestResources testResources =
-                new TestResources(mActivityTestRule.getActivity().getResources());
-        // First make sure that the flag is false
-        assertFalse(testResources.wasGetDrawableCalled());
-
-        // Now wrap in a TintResources instance and get a Drawable
-        final Resources tintResources =
-                new TintResources(mActivityTestRule.getActivity(), testResources);
-        tintResources.getDrawable(android.R.drawable.ic_delete);
-
-        // ...and assert that the flag was flipped
-        assertTrue(testResources.wasGetDrawableCalled());
-    }
-
-    /**
-     * Special Resources class which returns a known Drawable instance from a special ID
-     */
-    private static class TestResources extends Resources {
-        private boolean mGetDrawableCalled;
-
-        public TestResources(Resources res) {
-            super(res.getAssets(), res.getDisplayMetrics(), res.getConfiguration());
-        }
-
-        @Override
-        public Drawable getDrawable(int id) throws NotFoundException {
-            mGetDrawableCalled = true;
-            return super.getDrawable(id);
-        }
-
-        public boolean wasGetDrawableCalled() {
-            return mGetDrawableCalled;
-        }
-    }
-
-}
diff --git a/appcompat/appcompat/src/androidTest/res/layout/appcompat_autocompletetextview_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/appcompat_autocompletetextview_activity.xml
new file mode 100644
index 0000000..7e8ed0a
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/appcompat_autocompletetextview_activity.xml
@@ -0,0 +1,112 @@
+<?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"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_tinted_no_background"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text1"
+            android:background="@null"
+            app:backgroundTint="@color/color_state_list_lilac"
+            app:backgroundTintMode="src_in"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_tinted_background"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:background="@drawable/test_drawable"
+            app:backgroundTint="@color/color_state_list_lilac"
+            app:backgroundTintMode="src_in"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_untinted_no_background"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@null"
+            android:text="@string/sample_text2"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_untinted_background"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:background="@drawable/test_background_green"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_untinted_deferred"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:background="@drawable/black_rect"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_color_hex"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:textColor="#FF0000"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_color_csl"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:textColor="@color/color_state_list_ocean"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_color_primary"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text1"
+            android:textColor="?android:attr/textColorPrimary"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_color_secondary"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/sample_text2"
+            android:textColor="?android:attr/textColorSecondary"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_link_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/text_link_enabled"
+            android:textColor="?android:attr/textColorSecondary"/>
+
+        <androidx.appcompat.widget.AppCompatAutoCompleteTextView
+            android:id="@+id/view_text_link_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:enabled="false"
+            android:text="@string/text_link_disabled"/>
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/layout/appcompat_button_emoji_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/appcompat_button_emoji_activity.xml
new file mode 100644
index 0000000..e16f89c
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/appcompat_button_emoji_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <androidx.appcompat.widget.AppCompatButton
+            android:id="@+id/emoji_default"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.appcompat.widget.AppCompatButton
+            android:id="@+id/emoji_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="true" />
+
+        <androidx.appcompat.widget.AppCompatButton
+            android:id="@+id/emoji_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="false" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/layout/appcompat_checkedtextview_emoji_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/appcompat_checkedtextview_emoji_activity.xml
new file mode 100644
index 0000000..417be73
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/appcompat_checkedtextview_emoji_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <androidx.appcompat.widget.AppCompatCheckedTextView
+            android:id="@+id/emoji_default"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.appcompat.widget.AppCompatCheckedTextView
+            android:id="@+id/emoji_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="true" />
+
+        <androidx.appcompat.widget.AppCompatCheckedTextView
+            android:id="@+id/emoji_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="false" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/layout/appcompat_textview_emoji_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/appcompat_textview_emoji_activity.xml
new file mode 100644
index 0000000..bc0f969
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/appcompat_textview_emoji_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/emoji_default"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/emoji_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="true" />
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/emoji_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="false" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/layout/appcompat_togglebutton_emoji_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/appcompat_togglebutton_emoji_activity.xml
new file mode 100644
index 0000000..d42c890
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/appcompat_togglebutton_emoji_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <androidx.appcompat.widget.AppCompatToggleButton
+            android:id="@+id/emoji_default"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.appcompat.widget.AppCompatToggleButton
+            android:id="@+id/emoji_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="true" />
+
+        <androidx.appcompat.widget.AppCompatToggleButton
+            android:id="@+id/emoji_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="false" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/layout/switch_compat_emoji_activity.xml b/appcompat/appcompat/src/androidTest/res/layout/switch_compat_emoji_activity.xml
new file mode 100644
index 0000000..460f441
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/layout/switch_compat_emoji_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <androidx.appcompat.widget.SwitchCompat
+            android:id="@+id/emoji_default"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <androidx.appcompat.widget.SwitchCompat
+            android:id="@+id/emoji_enabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="true" />
+
+        <androidx.appcompat.widget.SwitchCompat
+            android:id="@+id/emoji_disabled"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:emojiCompatEnabled="false" />
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/appcompat/appcompat/src/androidTest/res/values/donottranslate-strings.xml b/appcompat/appcompat/src/androidTest/res/values/donottranslate-strings.xml
new file mode 100644
index 0000000..87f3f8e
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/res/values/donottranslate-strings.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+    <string name="drawer_layout_activity">Drawer layout</string>
+    <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the starting edge, which is left on left-to-right locales, with an edge swipe. You can tap the hamburger (three horizontal lines) icon at the starting side of the action bar to open the drawer as well.</string>
+    <string name="drawer_title">Navigation</string>
+    <string name="drawer_open">Open navigation drawer</string>
+    <string name="drawer_close">Close navigation drawer</string>
+
+    <string name="popup_activity">Popup activity</string>
+    <string name="popup_show">Show popup</string>
+    <string name="popup_menu_highlight">Highlight</string>
+    <string name="popup_menu_highlight_description">Highlight description</string>
+    <string name="popup_menu_highlight_tooltip">Highlight tooltip</string>
+    <string name="popup_menu_edit">Edit</string>
+    <string name="popup_menu_edit_description">Edit description</string>
+    <string name="popup_menu_edit_tooltip">Edit tooltip</string>
+    <string name="popup_menu_delete">Delete</string>
+    <string name="popup_menu_ignore">Ignore</string>
+    <string name="popup_menu_share">Share</string>
+    <string name="popup_menu_share_email">Via email</string>
+    <string name="popup_menu_share_circles">To my circles</string>
+    <string name="popup_menu_print">Print</string>
+
+    <string name="alert_dialog_activity">Alert dialog</string>
+    <string name="alert_dialog_show">Show alert dialog</string>
+    <string name="alert_dialog_title">Dialog title</string>
+    <string name="alert_dialog_content">Dialog content</string>
+    <string-array name="alert_dialog_items">
+        <item>Albania</item>
+        <item>Belize</item>
+        <item>Chad</item>
+        <item>Djibouti</item>
+    </string-array>
+    <string name="alert_dialog_positive_button">Forward</string>
+    <string name="alert_dialog_negative_button">Backward</string>
+    <string name="alert_dialog_neutral_button">Stall</string>
+    <string name="alert_dialog_custom_title">Dialog custom title</string>
+    <string name="alert_dialog_custom_text1">Dialog custom text</string>
+    <string name="alert_dialog_custom_text2">Dialog more custom text</string>
+
+    <string name="app_compat_spinner_activity">AppCompat spinner</string>
+    <string name="app_compat_auto_complete_text_view_activity">
+        AppCompat auto-complete text view
+    </string>
+    <string name="app_compat_text_view_activity">AppCompat text view</string>
+    <string name="app_compat_text_view_auto_size_activity">AppCompat text view auto-size</string>
+    <string name="app_compat_text_view_emoji_activity">AppCompat text view emoji</string>
+    <string name="app_compat_edit_text_activity">AppCompat edit text</string>
+    <string name="app_compat_edit_text_receive_content_activity">
+        AppCompat edit text receive content activity
+    </string>
+    <string name="app_compat_button_auto_size_activity">AppCompat button auto-size</string>
+    <string name="sample_text1">Sample text 1</string>
+    <string name="sample_text2">Sample text 2</string>
+    <string name="app_compat_image_button_activity">AppCompat image button</string>
+    <string name="app_compat_image_view_activity">AppCompat image view</string>
+    <string name="app_compat_button_activity">AppCompat button</string>
+    <string name="app_compat_checkbox_activity">AppCompat checkbox</string>
+    <string name="app_compat_checkedtextview_activity">AppCompat checked text view</string>
+    <string name="app_compat_radio_button_activity">AppCompat radio button</string>
+    <string name="app_compat_toggle_button_activity">AppCompat toggle button</string>
+    <string name="app_compat_icons_activity">AppCompat icons</string>
+    <string name="switch_compat_activity">Switch compat</string>
+    <string-array name="planets_array">
+        <item>Mercury</item>
+        <item>Venus</item>
+        <item>Earth</item>
+        <item>Mars</item>
+        <item>Jupiter</item>
+        <item>Saturn</item>
+        <item>Uranus</item>
+        <item>Neptune</item>
+        <item>Pluto</item>
+    </string-array>
+    <string-array name="numbers_array">
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+        <item>3</item>
+        <item>4</item>
+        <item>5</item>
+        <item>6</item>
+        <item>7</item>
+        <item>8</item>
+        <item>9</item>
+        <item>10</item>
+        <item>11</item>
+        <item>12</item>
+        <item>13</item>
+        <item>14</item>
+        <item>15</item>
+        <item>16</item>
+        <item>17</item>
+        <item>18</item>
+        <item>19</item>
+        <item>20</item>
+        <item>21</item>
+        <item>22</item>
+        <item>23</item>
+        <item>24</item>
+        <item>25</item>
+        <item>26</item>
+        <item>27</item>
+        <item>28</item>
+        <item>29</item>
+        <item>30</item>
+        <item>31</item>
+        <item>32</item>
+        <item>33</item>
+        <item>34</item>
+        <item>35</item>
+        <item>36</item>
+        <item>37</item>
+        <item>38</item>
+        <item>39</item>
+    </string-array>
+    <string-array name="numbers_array_small">
+        <item>0</item>
+        <item>1</item>
+        <item>2</item>
+    </string-array>
+
+    <string name="night_mode">DAY</string>
+
+    <string name="search_menu_description">Search description</string>
+    <string name="search_menu_tooltip">Search tooltip</string>
+    <string name="search_query_hint">query hint</string>
+    <string name="search_view_activity">SearchView activity</string>
+
+    <string name="alpha_menu_title">Alpha</string>
+    <string name="alpha_menu_description">Alpha description</string>
+    <string name="alpha_menu_tooltip">Alpha tooltip</string>
+
+    <string name="text_link_enabled">With <a href="http://www.google.com">link</a> enabled</string>
+    <string name="text_link_disabled">With <a href="http://www.google.com">link</a> disabled</string>
+    <string name="text_hint_enabled">Enabled hint</string>
+    <string name="text_hint_disabled">Disabled hint</string>
+
+    <string name="menu1">menu one</string>
+    <string name="menu2">menu two</string>
+    <string name="menu3">menu three</string>
+    <string name="menu4">menu four</string>
+    <string name="menu5">menu five</string>
+    <string name="menu6">menu six</string>
+
+    <string name="font_sans_serif">sans-serif</string>
+    <string name="font_serif">serif</string>
+
+    <string name="toolbar_collapse">Toolbar collapse</string>
+</resources>
diff --git a/appcompat/appcompat/src/androidTest/res/values/strings.xml b/appcompat/appcompat/src/androidTest/res/values/strings.xml
deleted file mode 100644
index 34698e7..0000000
--- a/appcompat/appcompat/src/androidTest/res/values/strings.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <string name="drawer_layout_activity">Drawer layout</string>
-    <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the starting edge, which is left on left-to-right locales, with an edge swipe. You can tap the hamburger (three horizontal lines) icon at the starting side of the action bar to open the drawer as well.</string>
-    <string name="drawer_title">Navigation</string>
-    <string name="drawer_open">Open navigation drawer</string>
-    <string name="drawer_close">Close navigation drawer</string>
-
-    <string name="popup_activity">Popup activity</string>
-    <string name="popup_show">Show popup</string>
-    <string name="popup_menu_highlight">Highlight</string>
-    <string name="popup_menu_highlight_description">Highlight description</string>
-    <string name="popup_menu_highlight_tooltip">Highlight tooltip</string>
-    <string name="popup_menu_edit">Edit</string>
-    <string name="popup_menu_edit_description">Edit description</string>
-    <string name="popup_menu_edit_tooltip">Edit tooltip</string>
-    <string name="popup_menu_delete">Delete</string>
-    <string name="popup_menu_ignore">Ignore</string>
-    <string name="popup_menu_share">Share</string>
-    <string name="popup_menu_share_email">Via email</string>
-    <string name="popup_menu_share_circles">To my circles</string>
-    <string name="popup_menu_print">Print</string>
-
-    <string name="alert_dialog_activity">Alert dialog</string>
-    <string name="alert_dialog_show">Show alert dialog</string>
-    <string name="alert_dialog_title">Dialog title</string>
-    <string name="alert_dialog_content">Dialog content</string>
-    <string-array name="alert_dialog_items">
-        <item>Albania</item>
-        <item>Belize</item>
-        <item>Chad</item>
-        <item>Djibouti</item>
-    </string-array>
-    <string name="alert_dialog_positive_button">Forward</string>
-    <string name="alert_dialog_negative_button">Backward</string>
-    <string name="alert_dialog_neutral_button">Stall</string>
-    <string name="alert_dialog_custom_title">Dialog custom title</string>
-    <string name="alert_dialog_custom_text1">Dialog custom text</string>
-    <string name="alert_dialog_custom_text2">Dialog more custom text</string>
-
-    <string name="app_compat_spinner_activity">AppCompat spinner</string>
-    <string name="app_compat_text_view_activity">AppCompat text view</string>
-    <string name="app_compat_text_view_auto_size_activity">AppCompat text view auto-size</string>
-    <string name="app_compat_edit_text_activity">AppCompat edit text</string>
-    <string name="app_compat_edit_text_receive_content_activity">
-        AppCompat edit text receive content activity
-    </string>
-    <string name="app_compat_button_auto_size_activity">AppCompat button auto-size</string>
-    <string name="sample_text1">Sample text 1</string>
-    <string name="sample_text2">Sample text 2</string>
-    <string name="app_compat_image_button_activity">AppCompat image button</string>
-    <string name="app_compat_image_view_activity">AppCompat image view</string>
-    <string name="app_compat_button_activity">AppCompat button</string>
-    <string name="app_compat_checkbox_activity">AppCompat checkbox</string>
-    <string name="app_compat_checkedtextview_activity">AppCompat checked text view</string>
-    <string name="app_compat_radio_button_activity">AppCompat radio button</string>
-    <string name="app_compat_toggle_button_activity">AppCompat toggle button</string>
-    <string name="app_compat_icons_activity">AppCompat icons</string>
-    <string name="switch_compat_activity">Switch compat</string>
-    <string-array name="planets_array">
-        <item>Mercury</item>
-        <item>Venus</item>
-        <item>Earth</item>
-        <item>Mars</item>
-        <item>Jupiter</item>
-        <item>Saturn</item>
-        <item>Uranus</item>
-        <item>Neptune</item>
-        <item>Pluto</item>
-    </string-array>
-    <string-array name="numbers_array">
-        <item>0</item>
-        <item>1</item>
-        <item>2</item>
-        <item>3</item>
-        <item>4</item>
-        <item>5</item>
-        <item>6</item>
-        <item>7</item>
-        <item>8</item>
-        <item>9</item>
-        <item>10</item>
-        <item>11</item>
-        <item>12</item>
-        <item>13</item>
-        <item>14</item>
-        <item>15</item>
-        <item>16</item>
-        <item>17</item>
-        <item>18</item>
-        <item>19</item>
-        <item>20</item>
-        <item>21</item>
-        <item>22</item>
-        <item>23</item>
-        <item>24</item>
-        <item>25</item>
-        <item>26</item>
-        <item>27</item>
-        <item>28</item>
-        <item>29</item>
-        <item>30</item>
-        <item>31</item>
-        <item>32</item>
-        <item>33</item>
-        <item>34</item>
-        <item>35</item>
-        <item>36</item>
-        <item>37</item>
-        <item>38</item>
-        <item>39</item>
-    </string-array>
-    <string-array name="numbers_array_small">
-        <item>0</item>
-        <item>1</item>
-        <item>2</item>
-    </string-array>
-
-    <string name="night_mode">DAY</string>
-
-    <string name="search_menu_description">Search description</string>
-    <string name="search_menu_tooltip">Search tooltip</string>
-    <string name="search_query_hint">query hint</string>
-    <string name="search_view_activity">SearchView activity</string>
-
-    <string name="alpha_menu_title">Alpha</string>
-    <string name="alpha_menu_description">Alpha description</string>
-    <string name="alpha_menu_tooltip">Alpha tooltip</string>
-
-    <string name="text_link_enabled">With <a href="http://www.google.com">link</a> enabled</string>
-    <string name="text_link_disabled">With <a href="http://www.google.com">link</a> disabled</string>
-    <string name="text_hint_enabled">Enabled hint</string>
-    <string name="text_hint_disabled">Disabled hint</string>
-
-    <string name="menu1">menu one</string>
-    <string name="menu2">menu two</string>
-    <string name="menu3">menu three</string>
-    <string name="menu4">menu four</string>
-    <string name="menu5">menu five</string>
-    <string name="menu6">menu six</string>
-
-    <string name="font_sans_serif">sans-serif</string>
-    <string name="font_serif">serif</string>
-
-    <string name="toolbar_collapse">Toolbar collapse</string>
-</resources>
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index ff1d0ad..08f06a8 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -592,16 +592,17 @@
         if (ab != null) {
             ab.onDestroy();
         }
+        mActionBar = null;
 
         if (toolbar != null) {
             final ToolbarActionBar tbab = new ToolbarActionBar(toolbar, getTitle(),
                     mAppCompatWindowCallback);
             mActionBar = tbab;
-            mWindow.setCallback(tbab.getWrappedWindowCallback());
+            // Set the nested action bar window callback so that it receive menu events
+            mAppCompatWindowCallback.setActionBarCallback(tbab.mMenuCallback);
         } else {
-            mActionBar = null;
-            // Re-set the original window callback since we may have already set a Toolbar wrapper
-            mWindow.setCallback(mAppCompatWindowCallback);
+            // Clear the nested action bar window callback
+            mAppCompatWindowCallback.setActionBarCallback(null);
         }
 
         invalidateOptionsMenu();
@@ -3069,12 +3070,28 @@
         }
     }
 
+    /**
+     * Interface which allows ToolbarActionBar to receive menu events without
+     * needing to wrap the Window.Callback
+     */
+    interface ActionBarMenuCallback {
+        boolean onPreparePanel(int featureId);
+
+        @Nullable
+        View onCreatePanelView(int featureId);
+    }
 
     class AppCompatWindowCallback extends WindowCallbackWrapper {
+        private ActionBarMenuCallback mActionBarCallback;
+
         AppCompatWindowCallback(Window.Callback callback) {
             super(callback);
         }
 
+        void setActionBarCallback(@Nullable ActionBarMenuCallback callback) {
+            mActionBarCallback = callback;
+        }
+
         @Override
         public boolean dispatchKeyEvent(KeyEvent event) {
             return AppCompatDelegateImpl.this.dispatchKeyEvent(event)
@@ -3098,6 +3115,17 @@
         }
 
         @Override
+        public View onCreatePanelView(int featureId) {
+            if (mActionBarCallback != null) {
+                View created = mActionBarCallback.onCreatePanelView(featureId);
+                if (created != null) {
+                    return created;
+                }
+            }
+            return super.onCreatePanelView(featureId);
+        }
+
+        @Override
         public void onContentChanged() {
             // We purposely do not propagate this call as this is called when we install
             // our sub-decor rather than the user's content
@@ -3121,7 +3149,13 @@
                 mb.setOverrideVisibleItems(true);
             }
 
-            final boolean handled = super.onPreparePanel(featureId, view, menu);
+            boolean handled = false;
+            if (mActionBarCallback != null && mActionBarCallback.onPreparePanel(featureId)) {
+                handled = true;
+            }
+            if (!handled) {
+                handled = super.onPreparePanel(featureId, view, menu);
+            }
 
             if (mb != null) {
                 mb.setOverrideVisibleItems(false);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
index f898efc..d2565a5 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
@@ -32,20 +32,21 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appcompat.view.WindowCallbackWrapper;
 import androidx.appcompat.view.menu.MenuBuilder;
 import androidx.appcompat.view.menu.MenuPresenter;
 import androidx.appcompat.widget.DecorToolbar;
 import androidx.appcompat.widget.Toolbar;
 import androidx.appcompat.widget.ToolbarWidgetWrapper;
+import androidx.core.util.Preconditions;
 import androidx.core.view.ViewCompat;
 
 import java.util.ArrayList;
 
 class ToolbarActionBar extends ActionBar {
-    DecorToolbar mDecorToolbar;
+    final DecorToolbar mDecorToolbar;
+    final Window.Callback mWindowCallback;
+    final AppCompatDelegateImpl.ActionBarMenuCallback mMenuCallback;
     boolean mToolbarMenuPrepared;
-    Window.Callback mWindowCallback;
     private boolean mMenuCallbackSet;
 
     private boolean mLastMenuVisibility;
@@ -66,16 +67,17 @@
                 }
             };
 
-    ToolbarActionBar(Toolbar toolbar, CharSequence title, Window.Callback windowCallback) {
+    ToolbarActionBar(@NonNull Toolbar toolbar, @Nullable CharSequence title,
+            @NonNull Window.Callback windowCallback) {
+        Preconditions.checkNotNull(toolbar);
         mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
-        mWindowCallback = new ToolbarCallbackWrapper(windowCallback);
-        mDecorToolbar.setWindowCallback(mWindowCallback);
+
+        mWindowCallback = Preconditions.checkNotNull(windowCallback);
+        mDecorToolbar.setWindowCallback(windowCallback);
         toolbar.setOnMenuItemClickListener(mMenuClicker);
         mDecorToolbar.setWindowTitle(title);
-    }
 
-    public Window.Callback getWrappedWindowCallback() {
-        return mWindowCallback;
+        mMenuCallback = new ToolbarMenuCallback();
     }
 
     @Override
@@ -513,19 +515,18 @@
         }
     }
 
-    private class ToolbarCallbackWrapper extends WindowCallbackWrapper {
-        public ToolbarCallbackWrapper(Window.Callback wrapped) {
-            super(wrapped);
-        }
+    private class ToolbarMenuCallback implements AppCompatDelegateImpl.ActionBarMenuCallback {
+        ToolbarMenuCallback() {}
 
         @Override
-        public boolean onPreparePanel(int featureId, View view, Menu menu) {
-            final boolean result = super.onPreparePanel(featureId, view, menu);
-            if (result && !mToolbarMenuPrepared) {
+        public boolean onPreparePanel(int featureId) {
+            if (featureId == Window.FEATURE_OPTIONS_PANEL && !mToolbarMenuPrepared) {
                 mDecorToolbar.setMenuPrepared();
                 mToolbarMenuPrepared = true;
+                // We don't want the stop the AppCompat/Window receiving the event, so don't
+                // return true
             }
-            return result;
+            return false;
         }
 
         @Override
@@ -536,7 +537,7 @@
                 // preparing a default one.
                 return new View(mDecorToolbar.getContext());
             }
-            return super.onCreatePanelView(featureId);
+            return null;
         }
     }
 
@@ -557,11 +558,8 @@
 
         @Override
         public boolean onOpenSubMenu(@NonNull MenuBuilder subMenu) {
-            if (mWindowCallback != null) {
-                mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, subMenu);
-                return true;
-            }
-            return false;
+            mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, subMenu);
+            return true;
         }
 
         @Override
@@ -572,9 +570,7 @@
 
             mClosingActionMenu = true;
             mDecorToolbar.dismissPopupMenus();
-            if (mWindowCallback != null) {
-                mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
-            }
+            mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
             mClosingActionMenu = false;
         }
     }
@@ -591,13 +587,10 @@
 
         @Override
         public void onMenuModeChange(@NonNull MenuBuilder menu) {
-            if (mWindowCallback != null) {
-                if (mDecorToolbar.isOverflowMenuShowing()) {
-                    mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
-                } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL,
-                        null, menu)) {
-                    mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
-                }
+            if (mDecorToolbar.isOverflowMenuShowing()) {
+                mWindowCallback.onPanelClosed(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
+            } else if (mWindowCallback.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu)) {
+                mWindowCallback.onMenuOpened(AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, menu);
             }
         }
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
index 3190ebc..5fbc731 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
@@ -199,8 +199,16 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
     }
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
index 7f3a37e..977a74b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
@@ -23,6 +23,7 @@
 import android.content.res.ColorStateList;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.text.InputFilter;
 import android.util.AttributeSet;
 import android.view.ActionMode;
 import android.view.accessibility.AccessibilityEvent;
@@ -57,10 +58,12 @@
  * You should only need to manually use this class when writing custom views.</p>
  */
 public class AppCompatButton extends Button implements TintableBackgroundView,
-        AutoSizeableTextView, TintableCompoundDrawablesView {
+        AutoSizeableTextView, TintableCompoundDrawablesView, EmojiCompatConfigurationView {
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
+    @NonNull
+    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
 
     public AppCompatButton(@NonNull Context context) {
         this(context, null);
@@ -82,6 +85,9 @@
         mTextHelper = new AppCompatTextHelper(this);
         mTextHelper.loadFromAttributes(attrs, defStyleAttr);
         mTextHelper.applyCompoundDrawablesTints();
+
+        AppCompatEmojiTextHelper emojiTextViewHelper = getEmojiTextViewHelper();
+        emojiTextViewHelper.loadFromAttributes(attrs, defStyleAttr);
     }
 
     @Override
@@ -372,9 +378,17 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
     }
 
     /**
@@ -420,4 +434,40 @@
     public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
+
+
+    @Override
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+        super.setFilters(getEmojiTextViewHelper().getFilters(filters));
+    }
+
+
+    /**
+     * This may be called from super constructors.
+     */
+    @NonNull
+    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+        //noinspection ConstantConditions
+        if (mAppCompatEmojiTextHelper == null) {
+            mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
+        }
+        return mAppCompatEmojiTextHelper;
+    }
+
+    @Override
+    public void setAllCaps(boolean allCaps) {
+        super.setAllCaps(allCaps);
+        getEmojiTextViewHelper().setAllCaps(allCaps);
+    }
+
+
+    @Override
+    public void setEmojiCompatEnabled(boolean enabled) {
+        getEmojiTextViewHelper().setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEmojiCompatEnabled() {
+        return getEmojiTextViewHelper().isEnabled();
+    }
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
index 39d75d1..7755d6c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
@@ -62,11 +62,13 @@
  * You should only need to manually use this class when writing custom views.</p>
  */
 public class AppCompatCheckedTextView extends CheckedTextView implements TintableCheckedTextView,
-        TintableBackgroundView {
+        TintableBackgroundView, EmojiCompatConfigurationView {
 
     private final AppCompatCheckedTextViewHelper mCheckedHelper;
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
+    @NonNull
+    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
 
     public AppCompatCheckedTextView(@NonNull Context context) {
         this(context, null);
@@ -91,6 +93,9 @@
 
         mCheckedHelper = new AppCompatCheckedTextViewHelper(this);
         mCheckedHelper.loadFromAttributes(attrs, defStyleAttr);
+
+        AppCompatEmojiTextHelper emojiTextViewHelper = getEmojiTextViewHelper();
+        emojiTextViewHelper.loadFromAttributes(attrs, defStyleAttr);
     }
 
     @Override
@@ -265,8 +270,45 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
+    }
+
+    /**
+     * This may be called from super constructors.
+     */
+    @NonNull
+    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+        //noinspection ConstantConditions
+        if (mAppCompatEmojiTextHelper == null) {
+            mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
+        }
+        return mAppCompatEmojiTextHelper;
+    }
+
+    @Override
+    public void setAllCaps(boolean allCaps) {
+        super.setAllCaps(allCaps);
+        getEmojiTextViewHelper().setAllCaps(allCaps);
+    }
+
+
+    @Override
+    public void setEmojiCompatEnabled(boolean enabled) {
+        getEmojiTextViewHelper().setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEmojiCompatEnabled() {
+        return getEmojiTextViewHelper().isEnabled();
     }
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
index 03a59f1..fcc465a 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
@@ -238,9 +238,17 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
     }
 
     /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java
new file mode 100644
index 0000000..28621fe
--- /dev/null
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.text.InputFilter;
+import android.text.method.TransformationMethod;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.R;
+import androidx.emoji2.viewshelper.EmojiTextViewHelper;
+
+/**
+ * Helper for using EmojiCompat from TextView in appcompat.
+ */
+class AppCompatEmojiTextHelper {
+
+    @NonNull
+    private final TextView mView;
+    @NonNull
+    private final EmojiTextViewHelper mEmojiTextViewHelper;
+
+    AppCompatEmojiTextHelper(@NonNull TextView view) {
+        mView = view;
+        mEmojiTextViewHelper = new EmojiTextViewHelper(view, false);
+    }
+
+    /**
+     * Load enabled behavior based on {@link R.styleable#AppCompatTextView_emojiCompatEnabled}.
+     * @param attrs from view
+     * @param defStyleAttr from view
+     */
+    void loadFromAttributes(@Nullable AttributeSet attrs, int defStyleAttr) {
+        Context context = mView.getContext();
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppCompatTextView,
+                defStyleAttr, 0);
+        boolean enabled = true;
+        try {
+            if (a.hasValue(R.styleable.AppCompatTextView_emojiCompatEnabled)) {
+                enabled = a.getBoolean(R.styleable.AppCompatTextView_emojiCompatEnabled, true);
+            }
+        } finally {
+            a.recycle();
+        }
+        setEnabled(enabled);
+    }
+
+    /**
+     * When set to false, this helper will do no emoji processing.
+     *
+     * After calling this method, the TextView will always be configured to display emoji (or
+     * not) based on disabled state and you don't need to call other methods.
+     *
+     * You may call this method again to enable EmojiCompat on a TextView after EmojiCompat is
+     * configured, if the configuration happened after the TextView loaded attributes. Doing so
+     * will update the TextView to correctly display emoji.
+     */
+    void setEnabled(boolean enabled) {
+        mEmojiTextViewHelper.setEnabled(enabled);
+    }
+
+    /**
+     * @return current enabled state
+     */
+    public boolean isEnabled() {
+        return mEmojiTextViewHelper.isEnabled();
+    }
+
+    /**
+     * Get filters with appropriate emoji processing.
+     *
+     * TextViews using this helper should always call this is setFilters.
+     *
+     * @param filters current filters on the TextView
+     * @return filters with optional emoji span filter depending on enabled state and system
+     * availability
+     */
+    @SuppressWarnings("ArrayReturn")
+    @NonNull
+    InputFilter[] getFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+        return mEmojiTextViewHelper.getFilters(filters);
+    }
+
+    /**
+     * Call this from TextView.setAllCaps to ensure the transformation method remains accurate
+     * for emoji spans.
+     *
+     * @param allCaps if text should be all caps
+     */
+    void setAllCaps(boolean allCaps) {
+        mEmojiTextViewHelper.setAllCaps(allCaps);
+    }
+
+    /**
+     * Wrap an existing transformation method, or null, to display emoji using EmojiCompat.
+     *
+     * @param transformationMethod if not null, call this transformation method before emoji
+     *                             transform
+     * @return the correct transformation based on isEnabled, may be null
+     */
+    @Nullable
+    public TransformationMethod wrapTransformationMethod(
+            @Nullable TransformationMethod transformationMethod) {
+        return mEmojiTextViewHelper.wrapTransformationMethod(transformationMethod);
+    }
+}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
index 8e63673..e9e0794 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
@@ -26,6 +26,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Build.VERSION_CODES;
+import android.text.InputFilter;
 import android.util.AttributeSet;
 import android.view.ActionMode;
 import android.view.inputmethod.EditorInfo;
@@ -78,11 +79,14 @@
  * You should only need to manually use this class when writing custom views.</p>
  */
 public class AppCompatTextView extends TextView implements TintableBackgroundView,
-        TintableCompoundDrawablesView, AutoSizeableTextView {
+        TintableCompoundDrawablesView, AutoSizeableTextView, EmojiCompatConfigurationView {
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
     private final AppCompatTextClassifierHelper mTextClassifierHelper;
+    @SuppressWarnings("NotNullFieldNotInitialized") // initialized in getter
+    @NonNull
+    private AppCompatEmojiTextHelper mEmojiTextViewHelper;
 
     private boolean mIsSetTypefaceProcessing = false;
 
@@ -111,6 +115,21 @@
         mTextHelper.applyCompoundDrawablesTints();
 
         mTextClassifierHelper = new AppCompatTextClassifierHelper(this);
+
+        AppCompatEmojiTextHelper emojiTextViewHelper = getEmojiTextViewHelper();
+        emojiTextViewHelper.loadFromAttributes(attrs, defStyleAttr);
+    }
+
+    /**
+     * This may be called from super constructors.
+     */
+    @NonNull
+    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+        //noinspection ConstantConditions
+        if (mEmojiTextViewHelper == null) {
+            mEmojiTextViewHelper = new AppCompatEmojiTextHelper(this);
+        }
+        return mEmojiTextViewHelper;
     }
 
     @Override
@@ -194,6 +213,27 @@
     }
 
     @Override
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+        super.setFilters(getEmojiTextViewHelper().getFilters(filters));
+    }
+
+    @Override
+    public void setAllCaps(boolean allCaps) {
+        super.setAllCaps(allCaps);
+        getEmojiTextViewHelper().setAllCaps(allCaps);
+    }
+
+    @Override
+    public void setEmojiCompatEnabled(boolean enabled) {
+        getEmojiTextViewHelper().setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEmojiCompatEnabled() {
+        return getEmojiTextViewHelper().isEnabled();
+    }
+
+    @Override
     protected void drawableStateChanged() {
         super.drawableStateChanged();
         if (mBackgroundTintHelper != null) {
@@ -443,9 +483,17 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
     }
 
     /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
index f03aab1..5cfb037 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
@@ -22,6 +22,7 @@
 import android.content.res.ColorStateList;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.text.InputFilter;
 import android.util.AttributeSet;
 import android.widget.ToggleButton;
 
@@ -29,7 +30,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
-import androidx.appcompat.R;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
 
@@ -39,18 +39,21 @@
  * <ul>
  *     <li>Allows dynamic tint of its background via the background tint methods in
  *     {@link androidx.core.view.ViewCompat}.</li>
- *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
- *     {@link R.attr#backgroundTintMode}.</li>
+ *     <li>Allows setting of the background tint using
+ *     {@link androidx.appcompat.R.attr#backgroundTint} and
+ *     {@link androidx.appcompat.R.attr#backgroundTintMode}.</li>
  *     <li>Allows setting of the font family using {@link android.R.attr#fontFamily}</li>
  * </ul>
  *
  * <p>This will automatically be used when you use {@link ToggleButton} in your layouts.
  * You should only need to manually use this class when writing custom views.</p>
  */
-public class AppCompatToggleButton extends ToggleButton implements TintableBackgroundView {
+public class AppCompatToggleButton extends ToggleButton implements TintableBackgroundView,
+        EmojiCompatConfigurationView {
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
+    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
 
     public AppCompatToggleButton(@NonNull Context context) {
         this(context, null);
@@ -71,6 +74,9 @@
 
         mTextHelper = new AppCompatTextHelper(this);
         mTextHelper.loadFromAttributes(attrs, defStyleAttr);
+
+        AppCompatEmojiTextHelper emojiTextViewHelper = getEmojiTextViewHelper();
+        emojiTextViewHelper.loadFromAttributes(attrs, defStyleAttr);
     }
 
     @Override
@@ -155,4 +161,38 @@
             mTextHelper.applyCompoundDrawablesTints();
         }
     }
+
+    @Override
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+        super.setFilters(getEmojiTextViewHelper().getFilters(filters));
+    }
+
+
+    /**
+     * This may be called from super constructors.
+     */
+    @NonNull
+    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+        //noinspection ConstantConditions
+        if (mAppCompatEmojiTextHelper == null) {
+            mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
+        }
+        return mAppCompatEmojiTextHelper;
+    }
+
+    @Override
+    public void setAllCaps(boolean allCaps) {
+        super.setAllCaps(allCaps);
+        getEmojiTextViewHelper().setAllCaps(allCaps);
+    }
+
+    @Override
+    public void setEmojiCompatEnabled(boolean enabled) {
+        getEmojiTextViewHelper().setEnabled(enabled);
+    }
+
+    @Override
+    public boolean isEmojiCompatEnabled() {
+        return getEmojiTextViewHelper().isEnabled();
+    }
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/EmojiCompatConfigurationView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/EmojiCompatConfigurationView.java
new file mode 100644
index 0000000..35c0503
--- /dev/null
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/EmojiCompatConfigurationView.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.widget;
+
+/**
+ * Interface for Views that expose EmojiCompat configuration.
+ */
+public interface EmojiCompatConfigurationView {
+
+    /**
+     * Configure emoji fallback behavior using EmojiCompat.
+     *
+     * When enabled, this View will attempt to use EmojiCompat to enabled missing emojis.
+     * When disabled, this View will not display missing emojis using EmojiCompat.
+     *
+     * EmojiCompat must be correctly configured on a device for this to have an effect, which
+     * will happen by default if a correct downloadable fonts provider is installed on the device.
+     *
+     * If you manually configure EmojiCompat by calling EmojiCompat init after this View is
+     * constructed, you may call this method again to enable EmojiCompat on this text view.
+     *
+     * For more information about EmojiCompat configuration see the emoji2 module.
+     *
+     * @param enabled if true, display missing emoji using EmojiCompat, otherwise display
+     *                missing emoji using a fallback glyph "□" (known as tofu)
+     */
+    void setEmojiCompatEnabled(boolean enabled);
+
+    /**
+     * @return the current enabled state, set via
+     * {@link EmojiCompatConfigurationView#setEmojiCompatEnabled(boolean)}
+     */
+    boolean isEmojiCompatEnabled();
+}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
index f4d72a52..19acd49 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
@@ -28,6 +28,7 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.text.InputFilter;
 import android.text.Layout;
 import android.text.StaticLayout;
 import android.text.TextPaint;
@@ -54,6 +55,10 @@
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TextViewCompat;
+import androidx.emoji2.text.EmojiCompat;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
 
 /**
  * SwitchCompat is a complete backport of the core {@link android.widget.Switch} widget that
@@ -97,7 +102,7 @@
  * {@link androidx.appcompat.R.attr#trackTint}
  * {@link androidx.appcompat.R.attr#trackTintMode}
  */
-public class SwitchCompat extends CompoundButton {
+public class SwitchCompat extends CompoundButton implements EmojiCompatConfigurationView {
     private static final int THUMB_ANIMATION_DURATION = 250;
 
     private static final int TOUCH_MODE_IDLE = 0;
@@ -143,7 +148,9 @@
     private int mSwitchPadding;
     private boolean mSplitTrack;
     private CharSequence mTextOn;
+    private CharSequence mTextOnTransformed;
     private CharSequence mTextOff;
+    private CharSequence mTextOffTransformed;
     private boolean mShowText;
 
     private int mTouchMode;
@@ -189,9 +196,14 @@
     private ColorStateList mTextColors;
     private Layout mOnLayout;
     private Layout mOffLayout;
+    @Nullable
     private TransformationMethod mSwitchTransformationMethod;
     ObjectAnimator mPositionAnimator;
     private final AppCompatTextHelper mTextHelper;
+    @NonNull
+    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
+    @Nullable
+    private EmojiCompatInitCallback mEmojiCompatInitCallback;
 
     @SuppressWarnings("hiding")
     private final Rect mTempRect = new Rect();
@@ -254,8 +266,8 @@
         if (mTrackDrawable != null) {
             mTrackDrawable.setCallback(this);
         }
-        mTextOn = a.getText(R.styleable.SwitchCompat_android_textOn);
-        mTextOff = a.getText(R.styleable.SwitchCompat_android_textOff);
+        setTextOnInternal(a.getText(R.styleable.SwitchCompat_android_textOn));
+        setTextOffInternal(a.getText(R.styleable.SwitchCompat_android_textOff));
         mShowText = a.getBoolean(R.styleable.SwitchCompat_showText, true);
         mThumbTextPadding = a.getDimensionPixelSize(
                 R.styleable.SwitchCompat_thumbTextPadding, 0);
@@ -310,6 +322,9 @@
         mTouchSlop = config.getScaledTouchSlop();
         mMinFlingVelocity = config.getScaledMinimumFlingVelocity();
 
+        AppCompatEmojiTextHelper emojiTextViewHelper = getEmojiTextViewHelper();
+        emojiTextViewHelper.loadFromAttributes(attrs, defStyleAttr);
+
         // Refresh display with current params
         refreshDrawableState();
         setChecked(isChecked());
@@ -356,6 +371,9 @@
         } else {
             mSwitchTransformationMethod = null;
         }
+        // apply the new transform to current text
+        setTextOnInternal(mTextOn);
+        setTextOffInternal(mTextOff);
 
         appearance.recycle();
     }
@@ -768,12 +786,26 @@
     }
 
     /**
+     * Call this whenever setting mTextOn or mTextOnTransformed to ensure we maintain
+     * consistent state
+     */
+    private void setTextOnInternal(CharSequence textOn) {
+        mTextOn = textOn;
+        mTextOnTransformed = doTransformForOnOffText(textOn);
+        mOnLayout = null;
+        if (mShowText) {
+            setupEmojiCompatLoadCallback();
+        }
+    }
+
+
+    /**
      * Sets the text displayed when the button is in the checked state.
      *
      * {@link android.R.attr#textOn}
      */
     public void setTextOn(CharSequence textOn) {
-        mTextOn = textOn;
+        setTextOnInternal(textOn);
         requestLayout();
         if (isChecked()) {
             // Default state is derived from on/off-text, so state has to be updated when
@@ -792,12 +824,25 @@
     }
 
     /**
+     * Call this whenever setting mTextOff or mTextOffTransformed to ensure we maintain
+     * consistent state
+     */
+    private void setTextOffInternal(CharSequence textOff) {
+        mTextOff = textOff;
+        mTextOffTransformed = doTransformForOnOffText(textOff);
+        mOffLayout = null;
+        if (mShowText) {
+            setupEmojiCompatLoadCallback();
+        }
+    }
+
+    /**
      * Sets the text displayed when the button is not in the checked state.
      *
      * {@link android.R.attr#textOff}
      */
     public void setTextOff(CharSequence textOff) {
-        mTextOff = textOff;
+        setTextOffInternal(textOff);
         requestLayout();
         if (!isChecked()) {
             // Default state is derived from on/off-text, so state has to be updated when
@@ -806,6 +851,15 @@
         }
     }
 
+    @Nullable
+    private CharSequence doTransformForOnOffText(@Nullable CharSequence onOffText) {
+        TransformationMethod transformationMethod =
+                getEmojiTextViewHelper().wrapTransformationMethod(mSwitchTransformationMethod);
+        return ((transformationMethod != null)
+                ? transformationMethod.getTransformation(onOffText, this)
+                : onOffText);
+    }
+
     /**
      * Sets whether the on/off text should be displayed.
      *
@@ -816,6 +870,9 @@
         if (mShowText != showText) {
             mShowText = showText;
             requestLayout();
+            if (showText) {
+                setupEmojiCompatLoadCallback();
+            }
         }
     }
 
@@ -831,11 +888,11 @@
     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         if (mShowText) {
             if (mOnLayout == null) {
-                mOnLayout = makeLayout(mTextOn);
+                mOnLayout = makeLayout(mTextOnTransformed);
             }
 
             if (mOffLayout == null) {
-                mOffLayout = makeLayout(mTextOff);
+                mOffLayout = makeLayout(mTextOffTransformed);
             }
         }
 
@@ -905,14 +962,10 @@
         }
     }
 
-    private Layout makeLayout(CharSequence text) {
-        final CharSequence transformed = (mSwitchTransformationMethod != null)
-                ? mSwitchTransformationMethod.getTransformation(text, this)
-                : text;
-
-        return new StaticLayout(transformed, mTextPaint,
-                transformed != null ?
-                        (int) Math.ceil(Layout.getDesiredWidth(transformed, mTextPaint)) : 0,
+    private Layout makeLayout(CharSequence transformedText) {
+        return new StaticLayout(transformedText, mTextPaint,
+                transformedText != null
+                        ? (int) Math.ceil(Layout.getDesiredWidth(transformedText, mTextPaint)) : 0,
                 Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true);
     }
 
@@ -1457,9 +1510,17 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
-        super.setCustomSelectionActionModeCallback(TextViewCompat
-                .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    public void setCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback actionModeCallback) {
+        super.setCustomSelectionActionModeCallback(
+                TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
+    }
+
+    @Override
+    @Nullable
+    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+        return TextViewCompat.unwrapCustomSelectionActionModeCallback(
+                super.getCustomSelectionActionModeCallback());
     }
 
     /**
@@ -1486,4 +1547,103 @@
             );
         }
     }
+
+    @Override
+    public void setAllCaps(boolean allCaps) {
+        super.setAllCaps(allCaps);
+        getEmojiTextViewHelper().setAllCaps(allCaps);
+    }
+
+    @Override
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+        super.setFilters(getEmojiTextViewHelper().getFilters(filters));
+    }
+
+    /**
+     * This may be called from super constructors.
+     */
+    @NonNull
+    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+        //noinspection ConstantConditions
+        if (mAppCompatEmojiTextHelper == null) {
+            mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
+        }
+        return mAppCompatEmojiTextHelper;
+    }
+
+    @Override
+    public void setEmojiCompatEnabled(boolean enabled) {
+        getEmojiTextViewHelper().setEnabled(enabled);
+        // the transformation method may have changed for on/off text so call again
+        setTextOnInternal(mTextOn);
+        setTextOffInternal(mTextOff);
+        requestLayout();
+    }
+
+    @Override
+    public boolean isEmojiCompatEnabled() {
+        return getEmojiTextViewHelper().isEnabled();
+    }
+
+
+    /**
+     * Call this before caching the text in mOnLayout or mOffLayout to ensure the layouts get
+     * updated when emojicompat loads
+     */
+    private void setupEmojiCompatLoadCallback() {
+        // Note: This is called again from onEmojiCompatInitializedForSwitchText, do not remove
+        // null check of mEmojiCompatInitCallback without refactoring.
+        if (mEmojiCompatInitCallback != null || !mAppCompatEmojiTextHelper.isEnabled()) {
+            return;
+        }
+        if (EmojiCompat.isConfigured()) {
+            EmojiCompat emojiCompat = EmojiCompat.get();
+            int loadState = emojiCompat.getLoadState();
+            if (loadState == EmojiCompat.LOAD_STATE_DEFAULT
+                    || loadState == EmojiCompat.LOAD_STATE_LOADING) {
+                // we can eventually load from default and loading
+                mEmojiCompatInitCallback = new EmojiCompatInitCallback(this);
+                emojiCompat.registerInitCallback(mEmojiCompatInitCallback);
+            }
+        }
+    }
+
+    /**
+     * Update cached transformed text in mTextOn and mTextOff
+     */
+    void onEmojiCompatInitializedForSwitchText() {
+        // this is required since we manage our own transformation method in this class during
+        // setTextOn and setTextOff
+
+        // if makeLayout, mOnLayout, or mOffLayout are removed, this can likely be removed
+        setTextOnInternal(mTextOn);
+        setTextOffInternal(mTextOff);
+        requestLayout();
+    }
+
+
+    static class EmojiCompatInitCallback extends EmojiCompat.InitCallback {
+        private final Reference<SwitchCompat> mOuterWeakRef;
+
+        EmojiCompatInitCallback(SwitchCompat view) {
+            mOuterWeakRef = new WeakReference<>(view);
+        }
+
+
+        @Override
+        public void onInitialized() {
+            SwitchCompat view = mOuterWeakRef.get();
+            if (view != null) {
+                view.onEmojiCompatInitializedForSwitchText();
+            }
+        }
+
+        @Override
+        public void onFailed(@Nullable Throwable throwable) {
+            SwitchCompat view = mOuterWeakRef.get();
+            if (view != null) {
+                view.onEmojiCompatInitializedForSwitchText();
+            }
+        }
+    }
 }
diff --git a/appcompat/appcompat/src/main/res-public/values/public_attrs.xml b/appcompat/appcompat/src/main/res-public/values/public_attrs.xml
index 8255ddc..89d5640 100644
--- a/appcompat/appcompat/src/main/res-public/values/public_attrs.xml
+++ b/appcompat/appcompat/src/main/res-public/values/public_attrs.xml
@@ -237,4 +237,5 @@
      <public type="attr" name="windowActionBarOverlay"/>
      <public type="attr" name="windowActionModeOverlay"/>
      <public type="attr" name="windowNoTitle"/>
+     <public type="attr" name="emojiCompatEnabled"/>
 </resources>
diff --git a/appcompat/appcompat/src/main/res/values-es/strings.xml b/appcompat/appcompat/src/main/res/values-es/strings.xml
index 663ddd6..27126dd 100644
--- a/appcompat/appcompat/src/main/res/values-es/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-es/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4692188335987374352">"Listo"</string>
+    <string name="abc_action_mode_done" msgid="4692188335987374352">"Hecho"</string>
     <string name="abc_action_bar_home_description" msgid="5976598919945601918">"Ir a inicio"</string>
     <string name="abc_action_bar_up_description" msgid="8388173803310557296">"Desplazarse hacia arriba"</string>
     <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"Más opciones"</string>
diff --git a/appcompat/appcompat/src/main/res/values-gl/strings.xml b/appcompat/appcompat/src/main/res/values-gl/strings.xml
index ae38a7e..a059d8e 100644
--- a/appcompat/appcompat/src/main/res/values-gl/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-gl/strings.xml
@@ -31,8 +31,8 @@
     <string name="abc_activity_chooser_view_see_all" msgid="1189761859438369441">"Ver todo"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="9055268688411532828">"Comparte contido coa aplicación <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="8875138169939072951">"Comparte contido con"</string>
-    <string name="abc_capital_on" msgid="884982626291842264">"ACTIVAR"</string>
-    <string name="abc_capital_off" msgid="4215997306490295099">"DESACTIVAR"</string>
+    <string name="abc_capital_on" msgid="884982626291842264">"ACTIVADO"</string>
+    <string name="abc_capital_off" msgid="4215997306490295099">"DESACTIVADO"</string>
     <string name="search_menu_title" msgid="6264217191555673260">"Buscar"</string>
     <string name="abc_prepend_shortcut_label" msgid="5520303668377388990">"Menú +"</string>
     <string name="abc_menu_meta_shortcut_label" msgid="4192209724446364286">"Meta +"</string>
diff --git a/appcompat/appcompat/src/main/res/values-my/strings.xml b/appcompat/appcompat/src/main/res/values-my/strings.xml
index 76c3833..511c41a 100644
--- a/appcompat/appcompat/src/main/res/values-my/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-my/strings.xml
@@ -31,8 +31,8 @@
     <string name="abc_activity_chooser_view_see_all" msgid="1189761859438369441">"အားလုံး ကြည့်ရန်"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="9055268688411532828">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ဖြင့် မျှဝေရန်"</string>
     <string name="abc_shareactionprovider_share_with" msgid="8875138169939072951">"နှင့် မျှဝေရန်"</string>
-    <string name="abc_capital_on" msgid="884982626291842264">"ဖွင့်ရန်"</string>
-    <string name="abc_capital_off" msgid="4215997306490295099">"ပိတ်ရန်"</string>
+    <string name="abc_capital_on" msgid="884982626291842264">"ဖွင့်"</string>
+    <string name="abc_capital_off" msgid="4215997306490295099">"ပိတ်"</string>
     <string name="search_menu_title" msgid="6264217191555673260">"ရှာဖွေမှု"</string>
     <string name="abc_prepend_shortcut_label" msgid="5520303668377388990">"Menu+"</string>
     <string name="abc_menu_meta_shortcut_label" msgid="4192209724446364286">"Meta+"</string>
diff --git a/appcompat/appcompat/src/main/res/values-te/strings.xml b/appcompat/appcompat/src/main/res/values-te/strings.xml
index 9a284b7..9d7b606 100644
--- a/appcompat/appcompat/src/main/res/values-te/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-te/strings.xml
@@ -19,7 +19,7 @@
     <string name="abc_action_mode_done" msgid="4692188335987374352">"పూర్తయింది"</string>
     <string name="abc_action_bar_home_description" msgid="5976598919945601918">"హోమ్‌కు నావిగేట్ చేస్తుంది"</string>
     <string name="abc_action_bar_up_description" msgid="8388173803310557296">"పైకి నావిగేట్ చేస్తుంది"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"మరిన్ని ఎంపికలు"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"కుదిస్తుంది"</string>
     <string name="abc_searchview_description_search" msgid="3417662926640357176">"సెర్చ్"</string>
     <string name="abc_search_hint" msgid="7208076849092622260">"వెతకండి…"</string>
diff --git a/appcompat/appcompat/src/main/res/values/attrs.xml b/appcompat/appcompat/src/main/res/values/attrs.xml
index 1f7cb89..8c49ab6 100644
--- a/appcompat/appcompat/src/main/res/values/attrs.xml
+++ b/appcompat/appcompat/src/main/res/values/attrs.xml
@@ -930,6 +930,8 @@
                  result to valid color values. Saturate(S + D) -->
             <enum name="add" value="16" />
         </attr>
+        <!-- Display the emoji if emojicompat has this character for emoji not on the system -->
+        <attr name="emojiCompatEnabled" format="boolean" />
     </declare-styleable>
 
     <declare-styleable name="LinearLayoutCompat">
@@ -1334,6 +1336,10 @@
         <attr name="android:textAppearance" />
     </declare-styleable>
 
+    <declare-styleable name="AppCompatEmojiHelper">
+
+    </declare-styleable>
+
     <declare-styleable name="RecycleListView">
         <!-- Bottom padding to use when no buttons are present. -->
         <attr name="paddingBottomNoButtons" format="dimension" />
diff --git a/appcompat/integration-tests/receive-content-testapp/lint-baseline.xml b/appcompat/integration-tests/receive-content-testapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/appcompat/integration-tests/receive-content-testapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/res/values/strings.xml b/appcompat/integration-tests/receive-content-testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from appcompat/integration-tests/receive-content-testapp/src/main/res/values/strings.xml
rename to appcompat/integration-tests/receive-content-testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/appsearch/appsearch/lint-baseline.xml b/appsearch/appsearch/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/appsearch/appsearch/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GenericDocumentCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GenericDocumentCtsTest.java
index 164adad..4fa033a 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GenericDocumentCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GenericDocumentCtsTest.java
@@ -22,6 +22,7 @@
 
 import androidx.appsearch.app.GenericDocument;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class GenericDocumentCtsTest {
@@ -174,6 +175,7 @@
                 .containsExactly(sDocumentProperties1, sDocumentProperties2);
     }
 
+    @Ignore
     @Test
     public void testDocument_toString() {
         GenericDocument document = new GenericDocument.Builder<>("uri1", "schemaType1")
diff --git a/appsearch/compiler/build.gradle b/appsearch/compiler/build.gradle
index 7d67114..6a5f3d9 100644
--- a/appsearch/compiler/build.gradle
+++ b/appsearch/compiler/build.gradle
@@ -36,7 +36,7 @@
     testImplementation(GOOGLE_COMPILE_TESTING)
 }
 
-tasks.findByName('compileJava').dependsOn(":appsearch:appsearch:jarDebug")
+tasks.findByName('compileJava').dependsOn(":appsearch:appsearch:jarRelease")
 
 androidx {
     name = 'AndroidX AppSearch Compiler'
diff --git a/appsearch/compiler/lint-baseline.xml b/appsearch/compiler/lint-baseline.xml
index 42911d1..dcbc206 100644
--- a/appsearch/compiler/lint-baseline.xml
+++ b/appsearch/compiler/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/appsearch/local-storage/build.gradle b/appsearch/local-storage/build.gradle
index 62ccb52..7016e47 100644
--- a/appsearch/local-storage/build.gradle
+++ b/appsearch/local-storage/build.gradle
@@ -69,8 +69,7 @@
 )
 
 dependencies {
-    releaseBundleInside(project(path: ":icing", configuration: "exportRelease"))
-    debugBundleInside(project(path: ":icing", configuration: "exportDebug"))
+    bundleInside(project(path: ":icing", configuration: "exportRelease"))
 
     api("androidx.annotation:annotation:1.1.0")
 
diff --git a/appsearch/local-storage/lint-baseline.xml b/appsearch/local-storage/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/appsearch/local-storage/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/arch/core/core-common/build.gradle b/arch/core/core-common/build.gradle
index 07d4498..d02da56 100644
--- a/arch/core/core-common/build.gradle
+++ b/arch/core/core-common/build.gradle
@@ -32,9 +32,6 @@
     testImplementation(MOCKITO_CORE)
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 androidx {
     name = "Android Arch-Common"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/arch/core/core-common/lint-baseline.xml b/arch/core/core-common/lint-baseline.xml
index 8a303d6..510c0dd 100644
--- a/arch/core/core-common/lint-baseline.xml
+++ b/arch/core/core-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -8,7 +8,7 @@
         errorLine2="              ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="40"
+            line="41"
             column="15"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                              ~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="40"
+            line="41"
             column="31"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="           ~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="45"
+            line="46"
             column="12"/>
     </issue>
 
@@ -41,7 +41,7 @@
         errorLine2="           ~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="55"
+            line="56"
             column="12"/>
     </issue>
 
@@ -52,7 +52,7 @@
         errorLine2="                            ~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="65"
+            line="66"
             column="29"/>
     </issue>
 
@@ -63,7 +63,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="74"
+            line="75"
             column="12"/>
     </issue>
 
@@ -74,7 +74,7 @@
         errorLine2="                                ~">
         <location
             file="src/main/java/androidx/arch/core/internal/FastSafeIterableMap.java"
-            line="74"
+            line="75"
             column="33"/>
     </issue>
 
@@ -107,7 +107,7 @@
         errorLine2="              ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="45"
+            line="46"
             column="15"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="                              ~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="45"
+            line="46"
             column="31"/>
     </issue>
 
@@ -129,7 +129,7 @@
         errorLine2="           ~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="65"
+            line="66"
             column="12"/>
     </issue>
 
@@ -140,7 +140,7 @@
         errorLine2="           ~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="97"
+            line="98"
             column="12"/>
     </issue>
 
@@ -151,7 +151,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="149"
+            line="150"
             column="12"/>
     </issue>
 
@@ -162,7 +162,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="158"
+            line="159"
             column="12"/>
     </issue>
 
@@ -173,7 +173,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="168"
+            line="169"
             column="12"/>
     </issue>
 
@@ -184,7 +184,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="175"
+            line="176"
             column="12"/>
     </issue>
 
@@ -195,7 +195,7 @@
         errorLine2="               ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/arch/core/internal/SafeIterableMap.java"
-            line="344"
+            line="345"
             column="16"/>
     </issue>
 
diff --git a/arch/core/core-runtime/build.gradle b/arch/core/core-runtime/build.gradle
index 32c8667..9459162 100644
--- a/arch/core/core-runtime/build.gradle
+++ b/arch/core/core-runtime/build.gradle
@@ -30,13 +30,6 @@
     api(project(":arch:core:core-common"))
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 androidx {
     name = "Android Arch-Runtime"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/arch/core/core-runtime/lint-baseline.xml b/arch/core/core-runtime/lint-baseline.xml
index c28b1da..74d03e4 100644
--- a/arch/core/core-runtime/lint-baseline.xml
+++ b/arch/core/core-runtime/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.arch.core.executor.DefaultTaskExecutor is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.arch.core.executor.DefaultTaskExecutor is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return Handler.createAsync(looper);"
         errorLine2="                           ~~~~~~~~~~~">
         <location
diff --git a/arch/core/core-testing/build.gradle b/arch/core/core-testing/build.gradle
index f94fa7a..af6d38f 100644
--- a/arch/core/core-testing/build.gradle
+++ b/arch/core/core-testing/build.gradle
@@ -29,7 +29,7 @@
     api(project(":arch:core:core-runtime"))
     api("androidx.annotation:annotation:1.1.0")
     api(JUNIT)
-    api(MOCKITO_CORE, libs.exclude_bytebuddy)
+    api(MOCKITO_CORE, excludes.bytebuddy)
 
     testImplementation(JUNIT)
 
@@ -40,13 +40,6 @@
     androidTestImplementation(ESPRESSO_CORE)
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 androidx {
     name = "Android Core-Testing"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/arch/core/core-testing/lint-baseline.xml b/arch/core/core-testing/lint-baseline.xml
index cf2d418..e123b88 100644
--- a/arch/core/core-testing/lint-baseline.xml
+++ b/arch/core/core-testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/asynclayoutinflater/asynclayoutinflater/lint-baseline.xml b/asynclayoutinflater/asynclayoutinflater/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/asynclayoutinflater/asynclayoutinflater/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/autofill/autofill/api/current.txt b/autofill/autofill/api/current.txt
index 988cdcf..60d5da5 100644
--- a/autofill/autofill/api/current.txt
+++ b/autofill/autofill/api/current.txt
@@ -3,6 +3,7 @@
 
   public final class HintConstants {
     method public static String generateSmsOtpHintForCharacterPosition(int);
+    field public static final String AUTOFILL_HINT_2FA_APP_OTP = "2faAppOTPCode";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_DAY = "birthDateDay";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_FULL = "birthDateFull";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_MONTH = "birthDateMonth";
@@ -45,7 +46,6 @@
     field public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
     field public static final String AUTOFILL_HINT_PROMO_CODE = "promoCode";
     field public static final String AUTOFILL_HINT_SMS_OTP = "smsOTPCode";
-    field public static final String AUTOFILL_HINT_TFA_APP_OTP = "tfaAppOTPCode";
     field public static final String AUTOFILL_HINT_UPI_VPA = "upiVirtualPaymentAddress";
     field public static final String AUTOFILL_HINT_USERNAME = "username";
     field public static final String AUTOFILL_HINT_WIFI_PASSWORD = "wifiPassword";
diff --git a/autofill/autofill/api/public_plus_experimental_current.txt b/autofill/autofill/api/public_plus_experimental_current.txt
index 988cdcf..60d5da5 100644
--- a/autofill/autofill/api/public_plus_experimental_current.txt
+++ b/autofill/autofill/api/public_plus_experimental_current.txt
@@ -3,6 +3,7 @@
 
   public final class HintConstants {
     method public static String generateSmsOtpHintForCharacterPosition(int);
+    field public static final String AUTOFILL_HINT_2FA_APP_OTP = "2faAppOTPCode";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_DAY = "birthDateDay";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_FULL = "birthDateFull";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_MONTH = "birthDateMonth";
@@ -45,7 +46,6 @@
     field public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
     field public static final String AUTOFILL_HINT_PROMO_CODE = "promoCode";
     field public static final String AUTOFILL_HINT_SMS_OTP = "smsOTPCode";
-    field public static final String AUTOFILL_HINT_TFA_APP_OTP = "tfaAppOTPCode";
     field public static final String AUTOFILL_HINT_UPI_VPA = "upiVirtualPaymentAddress";
     field public static final String AUTOFILL_HINT_USERNAME = "username";
     field public static final String AUTOFILL_HINT_WIFI_PASSWORD = "wifiPassword";
diff --git a/autofill/autofill/api/restricted_current.txt b/autofill/autofill/api/restricted_current.txt
index 60c1d8d..402b80f 100644
--- a/autofill/autofill/api/restricted_current.txt
+++ b/autofill/autofill/api/restricted_current.txt
@@ -3,6 +3,7 @@
 
   public final class HintConstants {
     method public static String generateSmsOtpHintForCharacterPosition(int);
+    field public static final String AUTOFILL_HINT_2FA_APP_OTP = "2faAppOTPCode";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_DAY = "birthDateDay";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_FULL = "birthDateFull";
     field public static final String AUTOFILL_HINT_BIRTH_DATE_MONTH = "birthDateMonth";
@@ -45,7 +46,6 @@
     field public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
     field public static final String AUTOFILL_HINT_PROMO_CODE = "promoCode";
     field public static final String AUTOFILL_HINT_SMS_OTP = "smsOTPCode";
-    field public static final String AUTOFILL_HINT_TFA_APP_OTP = "tfaAppOTPCode";
     field public static final String AUTOFILL_HINT_UPI_VPA = "upiVirtualPaymentAddress";
     field public static final String AUTOFILL_HINT_USERNAME = "username";
     field public static final String AUTOFILL_HINT_WIFI_PASSWORD = "wifiPassword";
diff --git a/autofill/autofill/lint-baseline.xml b/autofill/autofill/lint-baseline.xml
index c82b5e4..2cd1fdc 100644
--- a/autofill/autofill/lint-baseline.xml
+++ b/autofill/autofill/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Style is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Style is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            singleIconChipView.setLayoutDirection(getLayoutDirection());"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Style is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Style is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            chipView.setLayoutDirection(getLayoutDirection());"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            for (SliceItem sliceItem : slice.getItems()) {"
         errorLine2="                                             ~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mTitle = sliceItem.getText().toString();"
         errorLine2="                                           ~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mSubtitle = sliceItem.getText().toString();"
         errorLine2="                                              ~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mStartIcon = sliceItem.getIcon();"
         errorLine2="                                               ~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mEndIcon = sliceItem.getIcon();"
         errorLine2="                                             ~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mAttributionIntent = sliceItem.getAction();"
         errorLine2="                                                       ~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mContentDescription = sliceItem.getText();"
         errorLine2="                                                        ~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            switch (sliceItem.getFormat()) {"
         errorLine2="                              ~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (sliceItem.getIcon() == null) {"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (sliceItem.getHints().contains(HINT_INLINE_START_ICON)) {"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    } else if (sliceItem.getHints().contains(HINT_INLINE_END_ICON)) {"
         errorLine2="                                         ~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (TextUtils.isEmpty(sliceItem.getText())) {"
         errorLine2="                                                    ~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (sliceItem.getHints().contains(HINT_INLINE_TITLE)) {"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    } else if (sliceItem.getHints().contains(HINT_INLINE_SUBTITLE)) {"
         errorLine2="                                         ~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    } else if (sliceItem.getHints().contains(HINT_INLINE_CONTENT_DESCRIPTION)) {"
         errorLine2="                                         ~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (sliceItem.getAction() != null &amp;&amp; sliceItem.getHints().contains("
         errorLine2="                                  ~~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (sliceItem.getAction() != null &amp;&amp; sliceItem.getHints().contains("
         errorLine2="                                                                   ~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addIcon(mStartIcon, null,"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addText(mTitle, null,"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addText(mSubtitle, null,"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addIcon(mEndIcon, null,"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addAction(mAttributionIntent, new Slice.Builder("
         errorLine2="                                  ~~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addAction(mAttributionIntent, new Slice.Builder("
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                    mSliceBuilder).addHints("
         errorLine2="                                                   ~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            Collections.singletonList(HINT_INLINE_ATTRIBUTION_INTENT)).build(),"
         errorLine2="                                                                                       ~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addText(mContentDescription, null,"
         errorLine2="                                  ~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mSliceBuilder.addHints(mHints);"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return new Content(mSliceBuilder.build());"
         errorLine2="                                                 ~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.common.SlicedContent.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.common.SlicedContent.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mSliceBuilder = new Slice.Builder(INLINE_SLICE_URI, new SliceSpec(version, 1));"
         errorLine2="                            ~~~~~~~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.autofill.inline.common.SlicedContent.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.autofill.inline.common.SlicedContent.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mSliceBuilder = new Slice.Builder(INLINE_SLICE_URI, new SliceSpec(version, 1));"
         errorLine2="                                                                ~~~~~~~~~~~~~">
         <location
diff --git a/autofill/autofill/src/main/java/androidx/autofill/HintConstants.java b/autofill/autofill/src/main/java/androidx/autofill/HintConstants.java
index c72cd28..ebc4328 100644
--- a/autofill/autofill/src/main/java/androidx/autofill/HintConstants.java
+++ b/autofill/autofill/src/main/java/androidx/autofill/HintConstants.java
@@ -637,12 +637,12 @@
      *
      * <p>Can be used with either {@link android.view.View#setAutofillHints(String[])} or <a
      * href="#attr_android:autofillHint">{@code android:autofillHint}</a> (in which case the value
-     * should be <code>{@value #AUTOFILL_HINT_TFA_APP_OTP}</code>).
+     * should be <code>{@value #AUTOFILL_HINT_2FA_APP_OTP}</code>).
      *
      * <p>See {@link android.view.View#setAutofillHints(String...)} for more info about autofill
      * hints.
      */
-    public static final String AUTOFILL_HINT_TFA_APP_OTP = "tfaAppOTPCode";
+    public static final String AUTOFILL_HINT_2FA_APP_OTP = "2faAppOTPCode";
 
     /**
      * Hint indicating that this view is not eligible for autofill.
@@ -669,7 +669,8 @@
     public static final String AUTOFILL_HINT_PROMO_CODE = "promoCode";
 
     /**
-     * Hint indicating that this view can be autofilled with an UPI Virtual Payment Address.
+     * Hint indicating that this view can be autofilled with an Unified Payments Interface (UPI)
+     * Virtual Payment Address.
      *
      * <p>Can be used with either {@link android.view.View#setAutofillHints(String[])} or <a
      * href="#attr_android:autofillHint">{@code android:autofillHint}</a> (in which case the value
diff --git a/benchmark/common/lint-baseline.xml b/benchmark/common/lint-baseline.xml
index a6e93ad..9408bc3 100644
--- a/benchmark/common/lint-baseline.xml
+++ b/benchmark/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.benchmark.Errors is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.benchmark.Errors is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                Build.VERSION.SDK_INT >= 29 &amp;&amp; !context.applicationInfo.isProfileableByShell"
         errorLine2="                                                                        ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.benchmark.IsolationActivity.Companion is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.benchmark.IsolationActivity.Companion is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                powerManager.isSustainedPerformanceModeSupported"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    activity.window.setSustainedPerformanceMode(true)"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class null is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    keyguardManager.requestDismissKeyguard(activity, null)"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class null is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    activity.setShowWhenLocked(true)"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class null is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    activity.setTurnScreenOn(true)"
         errorLine2="                             ~~~~~~~~~~~~~~~">
         <location
@@ -111,4 +111,37 @@
             column="30"/>
     </issue>
 
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.benchmark.Outputs is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                InstrumentationRegistry.getInstrumentation().context.externalMediaDirs"
+        errorLine2="                                                                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/benchmark/Outputs.kt"
+            line="59"
+            column="70"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.benchmark.Outputs is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        Environment.getExternalStorageState(it) == Environment.MEDIA_MOUNTED"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/benchmark/Outputs.kt"
+            line="61"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.benchmark.ProfilerKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        Debug.startMethodTracingSampling(path, bufferSize, Arguments.profilerSampleFrequency)"
+        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/benchmark/Profiler.kt"
+            line="100"
+            column="15"/>
+    </issue>
+
 </issues>
diff --git a/benchmark/common/src/main/java/androidx/benchmark/Outputs.kt b/benchmark/common/src/main/java/androidx/benchmark/Outputs.kt
index e23d0a98..2fbbcaa 100644
--- a/benchmark/common/src/main/java/androidx/benchmark/Outputs.kt
+++ b/benchmark/common/src/main/java/androidx/benchmark/Outputs.kt
@@ -52,8 +52,8 @@
 
         @SuppressLint("UnsafeNewApiCall", "NewApi")
         @Suppress("DEPRECATION")
-        dirUsableByAppAndShell = when (Build.VERSION.SDK_INT) {
-            Build.VERSION_CODES.R -> {
+        dirUsableByAppAndShell = when {
+            Build.VERSION.SDK_INT == 30 -> {
                 // On Android R, we are using the media directory because that is the directory
                 // that the shell has access to. Context: b/181601156
                 InstrumentationRegistry.getInstrumentation().context.externalMediaDirs
@@ -61,6 +61,10 @@
                         Environment.getExternalStorageState(it) == Environment.MEDIA_MOUNTED
                     }
             }
+            Build.VERSION.SDK_INT <= 22 -> {
+                // prior to API 23, shell didn't have access to externalCacheDir
+                InstrumentationRegistry.getInstrumentation().context.cacheDir
+            }
             else -> InstrumentationRegistry.getInstrumentation().context.externalCacheDir
         } ?: throw IllegalStateException(
             "Unable to read externalCacheDir for writing files, " +
diff --git a/benchmark/gradle-plugin/build.gradle b/benchmark/gradle-plugin/build.gradle
index 4223fd2..49db110 100644
--- a/benchmark/gradle-plugin/build.gradle
+++ b/benchmark/gradle-plugin/build.gradle
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+import androidx.build.BuildOnServerKt
 import androidx.build.BuildServerConfigurationKt
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
@@ -44,17 +45,20 @@
 
 SdkResourceGenerator.generateForHostTest(project)
 
-task buildOnServer(type: Copy) {
-  from {
+def buildOnServer = tasks.register("buildOnServer", Copy.class) {
+  it.from {
     def f = project.file("src/main/resources/scripts/lockClocks.sh")
     if (!f.exists()) {
         throw new GradleException(f.toString() + " does not exist")
     }
     return f
   }
-  destinationDir BuildServerConfigurationKt.getDistributionDirectory(rootProject)
+  it.destinationDir BuildServerConfigurationKt.getDistributionDirectory(rootProject)
+
 }
 
+BuildOnServerKt.addToBuildOnServer(project, buildOnServer)
+
 gradlePlugin {
     plugins {
         benchmark {
diff --git a/benchmark/gradle-plugin/lint-baseline.xml b/benchmark/gradle-plugin/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/benchmark/gradle-plugin/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/benchmark/integration-tests/crystalball-experiment/lint-baseline.xml b/benchmark/integration-tests/crystalball-experiment/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/benchmark/integration-tests/crystalball-experiment/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/benchmark/integration-tests/dry-run-benchmark/lint-baseline.xml b/benchmark/integration-tests/dry-run-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/benchmark/integration-tests/dry-run-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml b/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from benchmark/integration-tests/macrobenchmark-target/src/main/res/values/strings.xml
rename to benchmark/integration-tests/macrobenchmark-target/src/main/res/values/donottranslate-strings.xml
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index 7ce9cba..3067b8a 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -37,6 +37,7 @@
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
+    androidTestImplementation(project(":internal-testutils-macrobenchmark"))
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/MacrobenchUtils.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/MacrobenchUtils.kt
deleted file mode 100644
index 8a3b2aa..0000000
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/MacrobenchUtils.kt
+++ /dev/null
@@ -1,80 +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.benchmark.integration.macrobenchmark
-
-import android.content.Intent
-import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.StartupMode
-import androidx.benchmark.macro.StartupTimingMetric
-import androidx.benchmark.macro.isSupportedWithVmSettings
-import androidx.benchmark.macro.junit4.MacrobenchmarkRule
-
-const val TARGET_PACKAGE = "androidx.benchmark.integration.macrobenchmark.target"
-
-fun MacrobenchmarkRule.measureStartup(
-    compilationMode: CompilationMode,
-    startupMode: StartupMode,
-    iterations: Int = 3,
-    setupIntent: Intent.() -> Unit = {}
-) = measureRepeated(
-    packageName = TARGET_PACKAGE,
-    metrics = listOf(StartupTimingMetric()),
-    compilationMode = compilationMode,
-    iterations = iterations,
-    startupMode = startupMode
-) {
-    pressHome()
-    val intent = Intent()
-    intent.setPackage(TARGET_PACKAGE)
-    setupIntent(intent)
-    startActivityAndWait(intent)
-}
-
-fun createStartupCompilationParams(
-    startupModes: List<StartupMode> = listOf(StartupMode.HOT, StartupMode.WARM, StartupMode.COLD),
-    compilationModes: List<CompilationMode> = listOf(
-        CompilationMode.None,
-        CompilationMode.Interpreted,
-        CompilationMode.SpeedProfile()
-    )
-): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
-    for (startupMode in startupModes) {
-        for (compilationMode in compilationModes) {
-            // Skip configs that can't run, so they don't clutter Studio benchmark
-            // output with AssumptionViolatedException dumps
-            if (compilationMode.isSupportedWithVmSettings()) {
-                add(arrayOf(startupMode, compilationMode))
-            }
-        }
-    }
-}
-
-fun createCompilationParams(
-    compilationModes: List<CompilationMode> = listOf(
-        CompilationMode.None,
-        CompilationMode.Interpreted,
-        CompilationMode.SpeedProfile()
-    )
-): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
-    for (compilationMode in compilationModes) {
-        // Skip configs that can't run, so they don't clutter Studio benchmark
-        // output with AssumptionViolatedException dumps
-        if (compilationMode.isSupportedWithVmSettings()) {
-            add(arrayOf(compilationMode))
-        }
-    }
-}
\ No newline at end of file
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 553c577..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,6 +20,8 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
+import androidx.testutils.createStartupCompilationParams
+import androidx.testutils.measureStartup
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,7 +39,8 @@
     @Test
     fun startup() = benchmarkRule.measureStartup(
         compilationMode = compilationMode,
-        startupMode = startupMode
+        startupMode = startupMode,
+        packageName = "androidx.benchmark.integration.macrobenchmark.target"
     ) {
         action = "androidx.benchmark.integration.macrobenchmark.target.RECYCLER_VIEW"
         putExtra("ITEM_COUNT", 5)
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
index 62ede92..39efe29 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBenchmark.kt
@@ -26,6 +26,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
+import androidx.testutils.createCompilationParams
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
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 29d9be3..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,6 +20,8 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
+import androidx.testutils.createStartupCompilationParams
+import androidx.testutils.measureStartup
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,7 +39,8 @@
     @Test
     fun startup() = benchmarkRule.measureStartup(
         compilationMode = compilationMode,
-        startupMode = startupMode
+        startupMode = startupMode,
+        packageName = "androidx.benchmark.integration.macrobenchmark.target"
     ) {
         action = "androidx.benchmark.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
     }
diff --git a/benchmark/integration-tests/startup-benchmark/lint-baseline.xml b/benchmark/integration-tests/startup-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/benchmark/integration-tests/startup-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/benchmark/macro-junit4/build.gradle b/benchmark/macro-junit4/build.gradle
index 4ee565e..d159e9f 100644
--- a/benchmark/macro-junit4/build.gradle
+++ b/benchmark/macro-junit4/build.gradle
@@ -50,9 +50,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
     // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     // DexMaker has it"s own MockMaker
 }
 
diff --git a/benchmark/macro/api/current.txt b/benchmark/macro/api/current.txt
index c64da75..ea00847 100644
--- a/benchmark/macro/api/current.txt
+++ b/benchmark/macro/api/current.txt
@@ -46,6 +46,9 @@
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -69,5 +72,8 @@
   public final class ShellUtilsKt {
   }
 
+  public final class UiStateKt {
+  }
+
 }
 
diff --git a/benchmark/macro/api/public_plus_experimental_current.txt b/benchmark/macro/api/public_plus_experimental_current.txt
index c64da75..ea00847 100644
--- a/benchmark/macro/api/public_plus_experimental_current.txt
+++ b/benchmark/macro/api/public_plus_experimental_current.txt
@@ -46,6 +46,9 @@
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -69,5 +72,8 @@
   public final class ShellUtilsKt {
   }
 
+  public final class UiStateKt {
+  }
+
 }
 
diff --git a/benchmark/macro/api/restricted_current.txt b/benchmark/macro/api/restricted_current.txt
index 8c72ddc..7743eaee 100644
--- a/benchmark/macro/api/restricted_current.txt
+++ b/benchmark/macro/api/restricted_current.txt
@@ -50,6 +50,9 @@
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -73,5 +76,8 @@
   public final class ShellUtilsKt {
   }
 
+  public final class UiStateKt {
+  }
+
 }
 
diff --git a/benchmark/macro/build.gradle b/benchmark/macro/build.gradle
index 951d73a..947bbd9 100644
--- a/benchmark/macro/build.gradle
+++ b/benchmark/macro/build.gradle
@@ -23,6 +23,7 @@
     id("AndroidXPlugin")
     id("com.android.library")
     id("kotlin-android")
+    id("com.squareup.wire")
 }
 
 android {
@@ -36,6 +37,29 @@
                 SupportConfigKt.getPrebuiltsRoot(project),
                 "androidx/traceprocessor/trace_processor_shell"
         )
+        main.assets.srcDirs += new File(
+                SupportConfigKt.getPrebuiltsRoot(project),
+                "androidx/traceprocessor/perfetto"
+        )
+        main.assets.srcDirs += new File(
+                SupportConfigKt.getPrebuiltsRoot(project),
+                "androidx/traceprocessor/traced"
+        )
+        main.assets.srcDirs += new File(
+                SupportConfigKt.getPrebuiltsRoot(project),
+                "androidx/traceprocessor/traced_probes"
+        )
+        androidTest.assets.srcDirs += new File(
+                SupportConfigKt.getPrebuiltsRoot(project),
+                "androidx/traceprocessor/testdata"
+        )
+    }
+}
+
+wire {
+    kotlin {}
+    sourcePath {
+        srcDir 'src/main/proto'
     }
 }
 
@@ -47,6 +71,7 @@
     implementation(project(":benchmark:benchmark-common"))
     implementation(ANDROIDX_TEST_CORE)
     implementation(ANDROIDX_TEST_UIAUTOMATOR)
+    implementation(libs.wireRuntime)
 
     androidTestImplementation(project(":internal-testutils-ktx"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
diff --git a/benchmark/macro/lint-baseline.xml b/benchmark/macro/lint-baseline.xml
new file mode 100644
index 0000000..6a2e95c
--- /dev/null
+++ b/benchmark/macro/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.benchmark.macro.MacrobenchmarkKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        !applicationInfo.isProfileableByShell"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/benchmark/macro/Macrobenchmark.kt"
+            line="49"
+            column="26"/>
+    </issue>
+
+</issues>
diff --git a/benchmark/macro/src/androidTest/AndroidManifest.xml b/benchmark/macro/src/androidTest/AndroidManifest.xml
index be6e99a..6343b1d 100644
--- a/benchmark/macro/src/androidTest/AndroidManifest.xml
+++ b/benchmark/macro/src/androidTest/AndroidManifest.xml
@@ -36,5 +36,13 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity
+            android:name="androidx.benchmark.macro.ConfigurableActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="androidx.benchmark.macro.CONFIGURABLE_ACTIVITY" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/CompilationModeTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/CompilationModeTest.kt
index 11ae6ab..84d0a07 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/CompilationModeTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/CompilationModeTest.kt
@@ -29,7 +29,7 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class CompilationModeTest {
+public class CompilationModeTest {
     private val vmRunningInterpretedOnly: Boolean
 
     init {
@@ -39,7 +39,7 @@
     }
 
     @Test
-    fun names() {
+    public fun names() {
         // We test these names, as they're likely built into parameterized
         // test strings, so stability/brevity are important
         assertEquals("None", CompilationMode.None.toString())
@@ -49,7 +49,7 @@
     }
 
     @Test
-    fun isSupportedWithVmSettings_jitEnabled() {
+    public fun isSupportedWithVmSettings_jitEnabled() {
         assumeFalse(vmRunningInterpretedOnly)
 
         assertTrue(CompilationMode.None.isSupportedWithVmSettings())
@@ -59,7 +59,7 @@
     }
 
     @Test
-    fun isSupportedWithVmSettings_jitDisabled() {
+    public fun isSupportedWithVmSettings_jitDisabled() {
         assumeTrue(vmRunningInterpretedOnly)
 
         assertFalse(CompilationMode.None.isSupportedWithVmSettings())
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurableActivity.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurableActivity.kt
new file mode 100644
index 0000000..76e5152
--- /dev/null
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurableActivity.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.macro
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.widget.TextView
+
+/**
+ * Activity with configurable text and launch time, for testing.
+ */
+public class ConfigurableActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        setContentView(
+            TextView(this).apply {
+                text = intent.getStringExtra(EXTRA_TEXT)
+            }
+        )
+
+        val sleepDurMs = intent.getLongExtra(EXTRA_SLEEP_DUR_MS, 0)
+        if (sleepDurMs > 0) {
+            Log.d(TAG, "sleeping $sleepDurMs ms")
+            Thread.sleep(sleepDurMs)
+            Log.d(TAG, "sleep complete")
+        }
+    }
+
+    public companion object {
+        private const val TAG = "ConfigurableActivity"
+        public const val ACTION: String = "androidx.benchmark.macro.CONFIGURABLE_ACTIVITY"
+        public const val EXTRA_TEXT: String = "TEXT"
+        public const val EXTRA_SLEEP_DUR_MS: String = "SLEEP_DUR_MS"
+
+        public fun createIntent(text: String, sleepDurMs: Long = 0): Intent {
+            return Intent().apply {
+                action = ACTION
+                putExtra(EXTRA_TEXT, text)
+                putExtra(EXTRA_SLEEP_DUR_MS, sleepDurMs)
+            }
+        }
+    }
+}
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurationErrorTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurationErrorTest.kt
index 4694c9b..202ee88 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurationErrorTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/ConfigurationErrorTest.kt
@@ -28,9 +28,9 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class ConfigurationErrorTest {
+public class ConfigurationErrorTest {
     @Test
-    fun constructor_valid() {
+    public fun constructor_valid() {
         ConfigurationError(
             id = "ID",
             summary = "summary",
@@ -39,7 +39,7 @@
     }
 
     @Test
-    fun constructor_throw() {
+    public fun constructor_throw() {
         assertFailsWith<IllegalArgumentException> {
             ConfigurationError(
                 id = "idCanNotHaveLowercase", // invalid, IDs always uppercase
@@ -65,13 +65,13 @@
     }
 
     @Test
-    fun checkAndGetSuppressionState_empty() {
+    public fun checkAndGetSuppressionState_empty() {
         // no throw or suppressed error
         assertNull(listOf<ConfigurationError>().checkAndGetSuppressionState(setOf()))
     }
 
     @Test
-    fun checkAndGetSuppressionState_suppressed() {
+    public fun checkAndGetSuppressionState_suppressed() {
         // two suppressed errors
         val suppression = listOf(
             ConfigurationError(
@@ -102,7 +102,7 @@
     }
 
     @Test
-    fun checkAndGetSuppressionState_unsuppressed() {
+    public fun checkAndGetSuppressionState_unsuppressed() {
         // one unsuppressed error, so throw
         val exception = assertFailsWith<AssertionError> {
             listOf(
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
index b74eca1..60b8be2 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/IdeSummaryStringTest.kt
@@ -28,7 +28,7 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class IdeSummaryStringTest {
+public class IdeSummaryStringTest {
     private fun createAbsoluteTracePaths(
         @Suppress("SameParameterValue") count: Int
     ) = List(count) {
@@ -36,7 +36,7 @@
     }
 
     @Test
-    fun minimalSample() {
+    public fun minimalSample() {
         val stats = Stats(longArrayOf(0, 1, 2), "Metric")
 
         assertEquals(0, stats.minIndex)
@@ -69,7 +69,7 @@
     }
 
     @Test
-    fun complexSample() {
+    public fun complexSample() {
         val metric1 = Stats(longArrayOf(0, 1, 2), "Metric1")
         val metric2 = Stats(longArrayOf(222, 111, 0), "Metric2")
         val absoluteTracePaths = createAbsoluteTracePaths(3)
@@ -101,7 +101,7 @@
     }
 
     @Test
-    fun warningSample() {
+    public fun warningSample() {
         val stats = Stats(longArrayOf(0, 1, 2), "Metric")
         val absoluteTracePaths = createAbsoluteTracePaths(3)
         val (summaryV1, summaryV2) = ideSummaryStrings(
@@ -134,7 +134,7 @@
     }
 
     @Test
-    fun requireNotEmpty() {
+    public fun requireNotEmpty() {
         assertFailsWith<IllegalArgumentException> {
             ideSummaryStrings(
                 warningLines = "",
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkScopeTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkScopeTest.kt
index f74f5a4..4c8dbb2 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkScopeTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkScopeTest.kt
@@ -20,38 +20,41 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.fail
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import java.lang.IllegalStateException
 import kotlin.test.assertFailsWith
 import kotlin.test.assertNotNull
 import kotlin.test.assertTrue
 
 @RunWith(AndroidJUnit4::class)
 @LargeTest
-class MacrobenchmarkScopeTest {
+public class MacrobenchmarkScopeTest {
     @Test
     @Ignore("Apk dependencies not working in presubmit, b/181810492")
-    fun killTest() {
-        val scope = MacrobenchmarkScope(PACKAGE_NAME, launchWithClearTask = true)
+    public fun killTest() {
+        val scope = MacrobenchmarkScope(TARGET_PACKAGE_NAME, launchWithClearTask = true)
         scope.pressHome()
         scope.startActivityAndWait()
-        assertTrue(isProcessAlive(PACKAGE_NAME))
+        assertTrue(isProcessAlive(TARGET_PACKAGE_NAME))
         scope.killProcess()
-        assertFalse(isProcessAlive(PACKAGE_NAME))
+        assertFalse(isProcessAlive(TARGET_PACKAGE_NAME))
     }
 
     @Test
     @Ignore("Apk dependencies not working in presubmit, b/181810492")
-    fun compile_speedProfile() {
-        val scope = MacrobenchmarkScope(PACKAGE_NAME, launchWithClearTask = true)
+    public fun compile_speedProfile() {
+        val scope = MacrobenchmarkScope(TARGET_PACKAGE_NAME, launchWithClearTask = true)
         val iterations = 1
         var executions = 0
         val compilation = CompilationMode.SpeedProfile(warmupIterations = iterations)
-        compilation.compile(PACKAGE_NAME) {
+        compilation.compile(TARGET_PACKAGE_NAME) {
             executions += 1
             scope.pressHome()
             scope.startActivityAndWait()
@@ -61,22 +64,22 @@
 
     @Test
     @Ignore("Apk dependencies not working in presubmit, b/181810492")
-    fun compile_speed() {
+    public fun compile_speed() {
         val compilation = CompilationMode.Speed
-        compilation.compile(PACKAGE_NAME) {
+        compilation.compile(TARGET_PACKAGE_NAME) {
             fail("Should never be called for $compilation")
         }
     }
 
     @Test
     @Ignore("Apk dependencies not working in presubmit, b/181810492")
-    fun startActivityAndWait_activityNotExported() {
-        val scope = MacrobenchmarkScope(PACKAGE_NAME, launchWithClearTask = true)
+    public fun startActivityAndWait_activityNotExported() {
+        val scope = MacrobenchmarkScope(TARGET_PACKAGE_NAME, launchWithClearTask = true)
         scope.pressHome()
 
         val intent = Intent()
-        intent.setPackage(PACKAGE_NAME)
-        intent.action = "$PACKAGE_NAME.NOT_EXPORTED_ACTIVITY"
+        intent.setPackage(TARGET_PACKAGE_NAME)
+        intent.action = "$TARGET_PACKAGE_NAME.NOT_EXPORTED_ACTIVITY"
 
         // should throw, warning to set exported = true
         val exceptionMessage = assertFailsWith<SecurityException> {
@@ -86,6 +89,49 @@
         assertTrue(exceptionMessage.contains("android:exported=true"))
     }
 
+    @Test
+    public fun startActivityAndWait_sameActivity() {
+        val scope = MacrobenchmarkScope(LOCAL_PACKAGE_NAME, launchWithClearTask = true)
+        val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
+        // Launch first activity, and validate it is displayed
+        scope.startActivityAndWait(ConfigurableActivity.createIntent("InitialText"))
+        assertTrue(device.hasObject(By.text("InitialText")))
+
+        // Launch second activity, and validate it is displayed
+        // By having the activity sleep during launch, we validate that the wait actually occurs,
+        // and that we're not seeing the previous Activity (which could happen if the wait
+        // doesn't occur, or if launch is extremely fast).
+        scope.startActivityAndWait(
+            ConfigurableActivity.createIntent(
+                text = "UpdatedText",
+                sleepDurMs = 1000L
+            )
+        )
+        assertTrue(device.hasObject(By.text("UpdatedText")))
+    }
+
+    @Test
+    public fun waitOnPackage_throw() {
+        val scope = MacrobenchmarkScope(LOCAL_PACKAGE_NAME, launchWithClearTask = true)
+
+        val intent = ConfigurableActivity.createIntent(
+            text = "ignored",
+            sleepDurMs = 10000
+        ).apply {
+            // launch unique intent
+            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
+        }
+        InstrumentationRegistry.getInstrumentation().context.startActivity(intent)
+
+        // validate that 10 second launch triggers 1 second timeout
+        val exception = assertFailsWith<IllegalStateException> {
+            scope.waitOnPackageLaunch(1)
+        }
+        assertTrue(exception.message!!.contains("Unable to detect Activity"))
+    }
+
     private fun processes(): List<String> {
         val instrumentation = InstrumentationRegistry.getInstrumentation()
         val output = instrumentation.device().executeShellCommand("ps -A")
@@ -96,7 +142,12 @@
         return processes().any { it.contains(packageName) }
     }
 
-    companion object {
-        private const val PACKAGE_NAME = "androidx.benchmark.integration.macrobenchmark.target"
+    public companion object {
+        // Separate target app. Use this app/package if killing/compiling target process.
+        private const val TARGET_PACKAGE_NAME =
+            "androidx.benchmark.integration.macrobenchmark.target"
+
+        // This test app. Use this app/package if not killing/compiling target.
+        private const val LOCAL_PACKAGE_NAME = "androidx.benchmark.macro.test"
     }
 }
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
index a4bbb5b..0b97c244 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
@@ -27,9 +27,9 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class MacrobenchmarkTest {
+public class MacrobenchmarkTest {
     @Test
-    fun macrobenchmarkWithStartupMode_emptyMetricList() {
+    public fun macrobenchmarkWithStartupMode_emptyMetricList() {
         val exception = assertFailsWith<IllegalArgumentException> {
             macrobenchmarkWithStartupMode(
                 uniqueName = "uniqueName", // ignored, uniqueness not important
@@ -48,7 +48,7 @@
     }
 
     @Test
-    fun macrobenchmarkWithStartupMode_iterations() {
+    public fun macrobenchmarkWithStartupMode_iterations() {
         val exception = assertFailsWith<IllegalArgumentException> {
             macrobenchmarkWithStartupMode(
                 uniqueName = "uniqueName", // ignored, uniqueness not important
@@ -68,7 +68,7 @@
 
     @SdkSuppress(maxSdkVersion = 28)
     @Test
-    fun macrobenchmarkWithStartupMode_sdkVersion() {
+    public fun macrobenchmarkWithStartupMode_sdkVersion() {
         val exception = assertFailsWith<IllegalArgumentException> {
             macrobenchmarkWithStartupMode(
                 uniqueName = "uniqueName", // ignored, uniqueness not important
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MetricResultExtensionsTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MetricResultExtensionsTest.kt
index fcaeb5b..8f8e211 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MetricResultExtensionsTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/MetricResultExtensionsTest.kt
@@ -28,9 +28,9 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class MetricResultExtensionsTest {
+public class MetricResultExtensionsTest {
     @Test
-    fun mergeToMetricResults_trivial() {
+    public fun mergeToMetricResults_trivial() {
         assertEquals(
             expected = listOf(
                 // note, bar sorted first
@@ -44,7 +44,7 @@
     }
 
     @Test
-    fun mergeToMetricResults_standard() {
+    public fun mergeToMetricResults_standard() {
         assertEquals(
             expected = listOf(
                 // note, bar sorted first
@@ -60,7 +60,7 @@
     }
 
     @Test
-    fun mergeToMetricResults_missingKey() {
+    public fun mergeToMetricResults_missingKey() {
         val exception = assertFailsWith<IllegalStateException> {
             listOf(
                 mapOf("foo" to 100L, "bar" to 101L),
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/OutputsTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/OutputsTest.kt
new file mode 100644
index 0000000..1a72cd3
--- /dev/null
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/OutputsTest.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.
+ */
+
+package androidx.benchmark.macro
+
+import androidx.benchmark.Outputs
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.File
+
+/**
+ * Note - These tests are in benchmark-macro so we can access UiAutomator for shell access.
+ * UiAutomator is minApi 18, lower than minApi of benchmark-common where Outputs resides
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class OutputsTest {
+    @Test
+    public fun dirUsableByAppAndShell_writeAppReadApp() {
+        val dir = Outputs.dirUsableByAppAndShell
+        val file = File.createTempFile("testFile", null, dir)
+        try {
+            file.writeText(file.name) // use name, as it's fairly unique
+            assertEquals(file.name, file.readText())
+        } finally {
+            file.delete()
+        }
+    }
+
+    @Test
+    public fun dirUsableByAppAndShell_writeAppReadShell() {
+        val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+        val dir = Outputs.dirUsableByAppAndShell
+        val file = File.createTempFile("testFile", null, dir)
+        try {
+            file.writeText(file.name) // use name, as it's fairly unique
+            assertEquals(
+                file.name,
+                device.executeShellCommand("cat ${file.absolutePath}")
+            )
+        } finally {
+            file.delete()
+        }
+    }
+}
\ No newline at end of file
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
index 2e23f9b..2d17c2e 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
@@ -18,33 +18,35 @@
 
 import android.content.Intent
 import androidx.benchmark.macro.perfetto.PerfettoCaptureWrapper
-import androidx.benchmark.macro.perfetto.PerfettoTraceProcessor
+import androidx.benchmark.macro.perfetto.PerfettoHelper.Companion.isAbiSupported
+import androidx.benchmark.macro.perfetto.createTempFileFromAsset
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
 import org.junit.Assume.assumeTrue
 import org.junit.Test
 import org.junit.runner.RunWith
 
 @SdkSuppress(minSdkVersion = 29)
 @RunWith(AndroidJUnit4::class)
-class StartupTimingMetricTest {
+public class StartupTimingMetricTest {
     @LargeTest
     @Test
-    fun noResults() {
-        assumeTrue(PerfettoTraceProcessor.isAbiSupported())
+    public fun noResults() {
+        assumeTrue(isAbiSupported())
         val packageName = "fake.package.fiction.nostartups"
         val metrics = measureStartup(packageName) {
             // Do nothing
         }
-        assertEquals(metrics.isEmpty(), true)
+        assertEquals(metrics.metrics.isEmpty(), true)
     }
 
     @LargeTest
     @Test
-    fun validateStartup() {
-        assumeTrue(PerfettoTraceProcessor.isAbiSupported())
+    public fun validateStartup() {
+        assumeTrue(isAbiSupported())
         val packageName = "androidx.benchmark.integration.macrobenchmark.target"
         val scope = MacrobenchmarkScope(packageName = packageName, launchWithClearTask = true)
         val metrics = measureStartup(packageName) {
@@ -58,12 +60,32 @@
                     "androidx.benchmark.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
             }
         }
-        val hasStartupMetrics = "startupMs" in metrics
+        val hasStartupMetrics = "startupMs" in metrics.metrics
         assertEquals(hasStartupMetrics, true)
+        assertNotNull(metrics.timelineStart)
+        assertNotNull(metrics.timelineEnd)
+    }
+
+    @LargeTest
+    @Test
+    public 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)
+
+        // check known values
+        val hasStartupMetrics = "startupMs" in metrics.metrics
+        assertEquals(hasStartupMetrics, true)
+        assertEquals(54L, metrics.metrics["startupMs"])
+        assertEquals(4131145997215L, metrics.timelineStart)
+        assertEquals(4131200817585L, metrics.timelineEnd)
     }
 }
 
-fun measureStartup(packageName: String, measureBlock: () -> Unit): Map<String, Long> {
+internal fun measureStartup(packageName: String, measureBlock: () -> Unit): MetricsWithUiState {
     val wrapper = PerfettoCaptureWrapper()
     val metric = StartupTimingMetric()
     metric.configure(packageName)
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
index ffa8939..b8cbc9f 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoCaptureTest.kt
@@ -16,8 +16,9 @@
 
 package androidx.benchmark.macro.perfetto
 
+import android.os.Build
 import androidx.benchmark.Outputs
-import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.benchmark.macro.perfetto.PerfettoHelper.Companion.isAbiSupported
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.verifyWithPolling
@@ -25,28 +26,32 @@
 import androidx.tracing.trace
 import org.junit.After
 import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
 import java.io.File
 
-@SdkSuppress(minSdkVersion = 29)
-@RunWith(AndroidJUnit4::class)
-class PerfettoCaptureTest {
+@SdkSuppress(minSdkVersion = 29) // Lower to 21 after fixing trace config.
+@RunWith(Parameterized::class)
+public class PerfettoCaptureTest(private val unbundled: Boolean) {
     private val traceFile = File(Outputs.dirUsableByAppAndShell, "PerfettoCaptureTest.trace")
     private val traceFilePath = traceFile.absolutePath
 
     @Before
     @After
-    fun cleanup() {
-        PerfettoCapture().cancel()
+    public fun cleanup() {
+        PerfettoCapture(unbundled).cancel()
         traceFile.delete()
     }
 
     @LargeTest
     @Test
-    fun traceAndCheckFileSize() {
-        val perfettoCapture = PerfettoCapture()
+    public fun traceAndCheckFileSize() {
+        // Change the check to API >=21, once we have the correct Perfetto config.
+        assumeTrue(Build.VERSION.SDK_INT >= 29 && isAbiSupported())
+        val perfettoCapture = PerfettoCapture(unbundled)
 
         verifyTraceEnable(false)
 
@@ -64,9 +69,17 @@
         val length = traceFile.length()
         assertTrue("Expect > 10KiB file, was $length bytes", length > 10 * 1024)
     }
+
+    public companion object {
+        @Parameterized.Parameters(name = "unbundled={0}")
+        @JvmStatic
+        public fun parameters(): Array<Any> {
+            return arrayOf(true, false)
+        }
+    }
 }
 
-fun verifyTraceEnable(enabled: Boolean) {
+public fun verifyTraceEnable(enabled: Boolean) {
     // We poll here, since we may need to wait for enable flags to propagate to apps
     verifyWithPolling(
         "Timeout waiting for Trace.isEnabled == $enabled",
@@ -75,4 +88,4 @@
     ) {
         Trace.isEnabled() == enabled
     }
-}
\ No newline at end of file
+}
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
index c6f4c09..930b391 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessorTest.kt
@@ -17,6 +17,7 @@
 package androidx.benchmark.macro.perfetto
 
 import androidx.benchmark.macro.device
+import androidx.benchmark.macro.perfetto.PerfettoHelper.Companion.isAbiSupported
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
@@ -31,10 +32,10 @@
 @SmallTest
 @SdkSuppress(minSdkVersion = 29)
 @RunWith(AndroidJUnit4::class)
-class PerfettoTraceProcessorTest {
+public class PerfettoTraceProcessorTest {
     @Test
-    fun shellPath() {
-        assumeTrue(PerfettoTraceProcessor.isAbiSupported())
+    public fun shellPath() {
+        assumeTrue(isAbiSupported())
         val shellPath = PerfettoTraceProcessor.shellPath
         val device = InstrumentationRegistry.getInstrumentation().device()
         val out = device.executeShellCommand("$shellPath --version")
@@ -45,24 +46,24 @@
     }
 
     @Test
-    fun getJsonMetrics_tracePathWithSpaces() {
-        assumeTrue(PerfettoTraceProcessor.isAbiSupported())
+    public fun getJsonMetrics_tracePathWithSpaces() {
+        assumeTrue(isAbiSupported())
         assertFailsWith<IllegalArgumentException> {
             PerfettoTraceProcessor.getJsonMetrics("/a b", "ignored")
         }
     }
 
     @Test
-    fun getJsonMetrics_metricWithSpaces() {
-        assumeTrue(PerfettoTraceProcessor.isAbiSupported())
+    public fun getJsonMetrics_metricWithSpaces() {
+        assumeTrue(isAbiSupported())
         assertFailsWith<IllegalArgumentException> {
             PerfettoTraceProcessor.getJsonMetrics("/ignored", "a b")
         }
     }
 
     @Test
-    fun validateAbiNotSupportedBehavior() {
-        assumeFalse(PerfettoTraceProcessor.isAbiSupported())
+    public fun validateAbiNotSupportedBehavior() {
+        assumeFalse(isAbiSupported())
         assertFailsWith<IllegalStateException> {
             PerfettoTraceProcessor.shellPath
         }
@@ -73,7 +74,7 @@
     }
 
     @Test
-    fun validateTraceProcessorBinariesExist() {
+    public fun validateTraceProcessorBinariesExist() {
         val context = InstrumentationRegistry.getInstrumentation().targetContext
         val suffixes = listOf("aarch64")
         val entries = suffixes.map { "trace_processor_shell_$it" }.toSet()
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
index 46a95cd..99b8994 100644
--- a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/ShellUtilsTest.kt
@@ -27,45 +27,46 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class ShellUtilsTest {
+public class ShellUtilsTest {
     private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
+    @SdkSuppress(minSdkVersion = 23) // broken below 23
     @Test
-    fun trivial() {
-        // validate piping works
+    public fun trivial() {
         assertEquals("foo\n", device.executeShellScript("echo foo"))
     }
 
     @SdkSuppress(minSdkVersion = 26) // xargs only available before 26
     @Test
-    fun pipe_xargs() {
-        // validate piping works
+    public fun pipe_xargs() {
+        // validate piping works with xargs
         assertEquals("foo\n", device.executeShellScript("echo foo | xargs echo $1"))
     }
 
     @SdkSuppress(minSdkVersion = 29) // `$(</dev/stdin)` doesn't work before 29
     @Test
-    fun pipe_echo() {
+    public fun pipe_echo() {
         // validate piping works
         assertEquals("foo\n", device.executeShellScript("echo foo | echo $(</dev/stdin)"))
     }
 
     @SdkSuppress(minSdkVersion = 26) // xargs only available before 26
     @Test
-    fun stdinArg_xargs() {
+    public fun stdinArg_xargs() {
         // validate stdin to first command in script
         assertEquals("foo\n", device.executeShellScript("xargs echo $1", stdin = "foo"))
     }
 
     @SdkSuppress(minSdkVersion = 29) // `$(</dev/stdin)` doesn't work before 29
     @Test
-    fun stdinArg_echo() {
+    public fun stdinArg_echo() {
         // validate stdin to first command in script
         assertEquals("foo\n", device.executeShellScript("echo $(</dev/stdin)", stdin = "foo"))
     }
 
+    @SdkSuppress(minSdkVersion = 23) // broken below 23
     @Test
-    fun multilineRedirect() {
+    public fun multilineRedirect() {
         assertEquals(
             "foo\n",
             device.executeShellScript(
@@ -79,7 +80,7 @@
 
     @SdkSuppress(minSdkVersion = 26) // xargs only available before 26
     @Test
-    fun multilineRedirectStdin_xargs() {
+    public fun multilineRedirectStdin_xargs() {
         assertEquals(
             "foo\n",
             device.executeShellScript(
@@ -94,7 +95,7 @@
 
     @SdkSuppress(minSdkVersion = 29) // `$(</dev/stdin)` doesn't work before 29
     @Test
-    fun multilineRedirectStdin_echo() {
+    public fun multilineRedirectStdin_echo() {
         assertEquals(
             "foo\n",
             device.executeShellScript(
@@ -107,8 +108,9 @@
         )
     }
 
+    @SdkSuppress(minSdkVersion = 23) // broken below 23
     @Test
-    fun createRunnableExecutable_simpleScript() {
+    public fun createRunnableExecutable_simpleScript() {
         val path = device.createRunnableExecutable(
             name = "myScript.sh",
             inputStream = "echo foo".byteInputStream()
diff --git a/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/UiStateTest.kt b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/UiStateTest.kt
new file mode 100644
index 0000000..f01e787b
--- /dev/null
+++ b/benchmark/macro/src/androidTest/java/androidx/benchmark/macro/perfetto/UiStateTest.kt
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.macro.perfetto
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import okio.ByteString
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import perfetto.protos.Trace
+import perfetto.protos.TracePacket
+import perfetto.protos.UiState
+import java.io.File
+import kotlin.test.assertEquals
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+public class UiStateTest {
+    @Test
+    public fun uiStateConstructor() {
+        assertEquals(
+            UiState(
+                timeline_start_ts = 1,
+                timeline_end_ts = 100,
+                UiState.HighlightProcess(cmdline = "test.package")
+            ),
+            UiState(
+                timelineStart = 1,
+                timelineEnd = 100,
+                highlightPackage = "test.package"
+            )
+        )
+    }
+
+    @Test
+    public fun uiStateCheck() {
+        val uiState = UiState(
+            timelineStart = 1,
+            timelineEnd = 100,
+            highlightPackage = "test.package"
+        )
+
+        val bytes = UiState.ADAPTER.encode(uiState)
+        val uiStateParse = UiState.ADAPTER.decode(bytes)
+        assertEquals(uiState, uiStateParse)
+    }
+
+    @Test
+    public fun append() {
+        val initial = Trace(
+            packet = listOf(
+                TracePacket(
+                    compressed_packets = ByteString.of(0, 1, 3)
+                )
+            )
+        )
+        val file = File.createTempFile("append", ".trace")
+        file.writeBytes(Trace.ADAPTER.encode(initial))
+        file.appendUiState(
+            UiState(
+                timelineStart = 0,
+                timelineEnd = 1,
+                highlightPackage = "test.package"
+            )
+        )
+
+        val final = Trace.ADAPTER.decode(file.readBytes())
+
+        val expected = Trace(
+            packet = listOf(
+                TracePacket(
+                    compressed_packets = ByteString.of(0, 1, 3)
+                ),
+                TracePacket(
+                    UiState(
+                        timeline_start_ts = 0,
+                        timeline_end_ts = 1,
+                        UiState.HighlightProcess(cmdline = "test.package")
+                    )
+                )
+            )
+        )
+        assertEquals(expected, final)
+    }
+
+    @Test
+    public fun actualTraceAppend() {
+        val traceFile = createTempFileFromAsset("WarmStartup", ".trace")
+        val initialSize = traceFile.readBytes().size
+        traceFile.appendUiState(
+            UiState(
+                timelineStart = 2,
+                timelineEnd = 4,
+                highlightPackage = "test.package"
+            )
+        )
+
+        val finalSize = traceFile.readBytes().size
+
+        // file may shrink slightly due to re-encode, but shouldn't be significant
+        assertTrue(finalSize > initialSize * 0.95f)
+    }
+}
+
+@Suppress("SameParameterValue")
+internal fun createTempFileFromAsset(prefix: String, suffix: String): File {
+    val file = File.createTempFile(prefix, suffix)
+    InstrumentationRegistry
+        .getInstrumentation()
+        .context
+        .assets
+        .open(prefix + suffix)
+        .copyTo(file.outputStream())
+    return file
+}
\ No newline at end of file
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
index 9fda7c5..d09755d 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
@@ -20,13 +20,17 @@
 import android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE
 import android.content.pm.PackageManager
 import android.os.Build
+import android.util.Log
 import androidx.annotation.RestrictTo
 import androidx.benchmark.Arguments
 import androidx.benchmark.BenchmarkResult
 import androidx.benchmark.InstrumentationResults
 import androidx.benchmark.ResultWriter
 import androidx.benchmark.macro.perfetto.PerfettoCaptureWrapper
+import androidx.benchmark.macro.perfetto.UiState
+import androidx.benchmark.macro.perfetto.appendUiState
 import androidx.test.platform.app.InstrumentationRegistry
+import java.io.File
 
 internal fun checkErrors(packageName: String): ConfigurationError.SuppressionState? {
     val pm = InstrumentationRegistry.getInstrumentation().context.packageManager
@@ -156,11 +160,23 @@
             }!!
 
             tracePaths.add(tracePath)
-            metrics
+            val metricsWithUiState = metrics
                 // capture list of Map<String,Long> per metric
                 .map { it.getMetrics(packageName, tracePath) }
                 // merge into one map
                 .reduce { sum, element -> sum + element }
+
+            // append UI state to trace, so tools opening trace will highlight relevant part in UI
+            val uiState = UiState(
+                timelineStart = metricsWithUiState.timelineStart,
+                timelineEnd = metricsWithUiState.timelineEnd,
+                highlightPackage = packageName
+            )
+            File(tracePath).appendUiState(uiState)
+            Log.d(TAG, "Iteration $iteration captured $uiState")
+
+            // report just the metrics
+            metricsWithUiState.metrics
         }.mergeToMetricResults(tracePaths)
 
         require(metricResults.isNotEmpty()) {
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
index 0c6e6d2..7341904 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
@@ -23,6 +23,7 @@
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.Until
+import java.util.concurrent.TimeUnit
 
 /**
  * Provides access to common operations in app automation, such as killing the app,
@@ -83,10 +84,40 @@
                 securityException
             )
         }
-        device.wait(
+
+        waitOnPackageLaunch()
+    }
+
+    /**
+     * Wait on the current package to complete an Activity launch.
+     *
+     * Note that [timeoutInSeconds] is for full Activity launch, and UiAutomator detection of
+     * Activity content. This is not just Activity launch time as would be reported by
+     * [StartupTimingMetric] - it must include additional fixed time.
+     *
+     * As an example, when this timeout was 5 seconds, a 2 second activity launch would
+     * frequently hit the timeout. This timeout should be conservatively large to encapsulate
+     * any slow app / hardware combo.
+     */
+    internal fun waitOnPackageLaunch(timeoutInSeconds: Long = 30) {
+        val timeoutInMilliseconds = TimeUnit.SECONDS.toMillis(timeoutInSeconds)
+
+        // Note: if this wait starts during an activity launch, it will wait until the launch
+        // completes. This is why it's safe to simply check package - even if launching from one
+        // activity to another within the package, the launch has to fully complete.
+
+        // Note though, that this wait does not wait for within-activity launch behavior to
+        // complete. that must be done separately.
+        val packageIsDisplayed = device.wait(
             Until.hasObject(By.pkg(packageName).depth(0)),
-            5000 /* ms */
+            timeoutInMilliseconds
         )
+        if (!packageIsDisplayed) {
+            throw IllegalStateException(
+                "Unable to detect Activity of package $packageName after " +
+                    "$timeoutInSeconds second timeout. Did it fail to launch?"
+            )
+        }
     }
 
     /**
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
index b17c427..8a23f8a 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/Metric.kt
@@ -17,7 +17,7 @@
 package androidx.benchmark.macro
 
 import androidx.annotation.RequiresApi
-import androidx.benchmark.macro.perfetto.PerfettoResultsParser.parseResult
+import androidx.benchmark.macro.perfetto.PerfettoResultsParser.parseStartupResult
 import androidx.benchmark.macro.perfetto.PerfettoTraceProcessor
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.UiDevice
@@ -37,7 +37,7 @@
      * 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): Map<String, Long>
+    internal abstract fun getMetrics(packageName: String, tracePath: String): MetricsWithUiState
 }
 
 public class FrameTimingMetric : Metric() {
@@ -114,8 +114,8 @@
         "totalFrameCount"
     )
 
-    internal override fun getMetrics(packageName: String, tracePath: String): Map<String, Long> {
-        return helper.metrics
+    internal override fun getMetrics(packageName: String, tracePath: String) = MetricsWithUiState(
+        metrics = helper.metrics
             .map {
                 val prefix = "gfxinfo_${packageName}_"
                 val keyWithoutPrefix = it.key.removePrefix(prefix)
@@ -131,7 +131,7 @@
             }
             .toMap()
             .filterKeys { keyAllowList.contains(it) }
-    }
+    )
 }
 
 /**
@@ -149,8 +149,36 @@
     internal override fun stop() {
     }
 
-    internal override fun getMetrics(packageName: String, tracePath: String): Map<String, Long> {
+    internal override fun getMetrics(packageName: String, tracePath: String): MetricsWithUiState {
         val json = PerfettoTraceProcessor.getJsonMetrics(tracePath, "android_startup")
-        return parseResult(json, packageName)
+        return parseStartupResult(json, packageName)
     }
 }
+
+internal data class MetricsWithUiState(
+    val metrics: Map<String, Long>,
+    val timelineStart: Long? = null,
+    val timelineEnd: Long? = null
+) {
+    operator fun plus(element: MetricsWithUiState) = MetricsWithUiState(
+        metrics = metrics + element.metrics,
+        timelineStart = minOfNullable(timelineStart, element.timelineStart),
+        timelineEnd = maxOfNullable(timelineEnd, element.timelineEnd)
+    )
+
+    companion object {
+        val EMPTY = MetricsWithUiState(mapOf())
+    }
+}
+
+internal fun minOfNullable(a: Long?, b: Long?): Long? {
+    if (a == null) return b
+    if (b == null) return a
+    return minOf(a, b)
+}
+
+internal fun maxOfNullable(a: Long?, b: Long?): Long? {
+    if (a == null) return b
+    if (b == null) return a
+    return maxOf(a, b)
+}
\ No newline at end of file
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
index 6ffdbf0..97ebc30 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCapture.kt
@@ -16,6 +16,7 @@
 
 package androidx.benchmark.macro.perfetto
 
+import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.benchmark.Outputs
@@ -35,15 +36,16 @@
  * @suppress
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@RequiresApi(29)
-public class PerfettoCapture {
-    private val helper = PerfettoHelper()
+@RequiresApi(21)
+public class PerfettoCapture(private val unbundled: Boolean = Build.VERSION.SDK_INT in 21..28) {
+
+    private val helper: PerfettoHelper = PerfettoHelper(unbundled)
 
     /**
      * Kill perfetto process, if it is running.
      */
     public fun cancel() {
-        if (helper.isPerfettoRunning) {
+        if (helper.isPerfettoRunning()) {
             helper.stopPerfetto()
         }
     }
@@ -76,7 +78,7 @@
     public fun stop(destinationPath: String) {
         if (!helper.stopCollecting(400, destinationPath)) {
             // TODO: move internal failures to be exceptions
-            throw IllegalStateException("Unable to store perfetto trace")
+            throw IllegalStateException("Unable to store perfetto trace in $destinationPath")
         }
     }
 }
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
index 29b9ffd..2c94495 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoCaptureWrapper.kt
@@ -25,28 +25,28 @@
 import androidx.test.platform.app.InstrumentationRegistry
 
 /**
- * Wrapper for PerfettoCapture, which does nothing on API < Q
+ * Wrapper for [PerfettoCapture] which does nothing below L.
  */
 internal class PerfettoCaptureWrapper {
     private var capture: PerfettoCapture? = null
     private val TRACE_ENABLE_PROP = "persist.traced.enable"
 
     init {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             capture = PerfettoCapture()
         }
     }
 
-    @RequiresApi(Build.VERSION_CODES.Q)
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
     private fun start(): Boolean {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             Log.d(PerfettoHelper.LOG_TAG, "Recording perfetto trace")
             capture?.start()
         }
         return true
     }
 
-    @RequiresApi(Build.VERSION_CODES.Q)
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
     private fun stop(benchmarkName: String, iteration: Int): String {
         val iterString = iteration.toString().padStart(3, '0')
         // NOTE: Macrobenchmarks still use legacy .trace name until
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java
deleted file mode 100644
index 8314fcc..0000000
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 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.benchmark.macro.perfetto;
-
-import android.os.SystemClock;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.benchmark.macro.DeviceInfo;
-import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.uiautomator.UiDevice;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-/**
- * PerfettoHelper is used to start and stop the perfetto tracing and move the
- * output perfetto trace file to destination folder.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-@RequiresApi(28)
-public class PerfettoHelper {
-    static final String LOG_TAG = "PerfettoCapture";
-    // Command to start the perfetto tracing in the background.
-    // perfetto -b -c /data/misc/perfetto-traces/trace_config.pb -o
-    // /data/misc/perfetto-traces/trace_output.pb
-    private static final String PERFETTO_TMP_OUTPUT_FILE =
-            "/data/misc/perfetto-traces/trace_output.pb";
-    // Additional arg to indicate that the perfetto config file is text format.
-    private static final String PERFETTO_TXT_PROTO_ARG = " --txt";
-    // Command to check the perfetto process id.
-    private static final String PERFETTO_PROC_ID_CMD = "pidof perfetto";
-    // Command to move the perfetto output trace file to given folder.
-    private static final String MOVE_CMD = "mv %s %s";
-    // Max wait count for checking if perfetto is stopped successfully
-    private static final int PERFETTO_KILL_WAIT_COUNT = 12;
-    // Check if perfetto is stopped every 5 secs.
-    private static final long PERFETTO_KILL_WAIT_TIME = 5000;
-
-    private final UiDevice mUIDevice =
-            UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
-
-    private IllegalStateException perfettoStartupException(String label, Exception cause) {
-        return new IllegalStateException(label + "\n\n"
-                + "Please report a bug, and include a logcat capture of the test run and failure."
-                + DeviceInfo.INSTANCE.getDeviceSummaryString(),
-                cause
-        );
-    }
-
-    /**
-     * Start the perfetto tracing in background using the given config file.
-     *
-     * The output will be written to /data/misc/perfetto-traces/trace_output.pb. Perfetto has
-     * write access only to /data/misc/perfetto-traces/ folder. The config file may be anywhere
-     * readable by shell.
-     *
-     * @param configFilePath used for collecting the perfetto trace.
-     * @param isTextProtoConfig true if the config file is textproto format otherwise false.
-     */
-    public void startCollecting(@Nullable String configFilePath, boolean isTextProtoConfig) {
-        if (configFilePath == null || configFilePath.isEmpty()) {
-            throw new IllegalArgumentException("Perfetto config file name is null or empty.");
-        }
-        try {
-            // Cleanup already existing perfetto process.
-            Log.i(LOG_TAG, "Cleanup perfetto before starting.");
-            if (isPerfettoRunning()) {
-                Log.i(LOG_TAG, "Perfetto tracing is already running. Stopping perfetto.");
-                if (!stopPerfetto()) {
-                    throw perfettoStartupException("Unable to stop Perfetto trace capture", null);
-                }
-            }
-
-            // Remove already existing temporary output trace file if any.
-            String output = mUIDevice.executeShellCommand("rm " + PERFETTO_TMP_OUTPUT_FILE);
-            Log.i(LOG_TAG, String.format("Perfetto output file cleanup - %s", output));
-
-            // Start perfetto tracing. Note that we need to use executeShellScript to be able to
-            // pipe the input via cat, as **Perfetto cannot read from the filesystem without root**.
-            String perfettoCmd = "cat " + configFilePath
-                    + " | perfetto --background -c - -o " + PERFETTO_TMP_OUTPUT_FILE;
-            if (isTextProtoConfig) {
-                perfettoCmd = perfettoCmd + PERFETTO_TXT_PROTO_ARG;
-            }
-            Log.i(LOG_TAG, "Starting perfetto tracing with cmd: " + perfettoCmd);
-            String startOutput = ShellUtilsKt.executeShellScript(mUIDevice, perfettoCmd, null);
-
-            Log.i(LOG_TAG, String.format("Perfetto start command output - %s", startOutput));
-            // TODO : Once the output status is available use that for additional validation.
-            if (!isPerfettoRunning()) {
-                throw perfettoStartupException(
-                        "Perfetto tracing failed to start. Command output = " + startOutput, null);
-            }
-        } catch (IOException ioe) {
-            throw perfettoStartupException("Unable to start perfetto tracing", ioe);
-        }
-        Log.i(LOG_TAG, "Perfetto tracing started successfully.");
-    }
-
-    /**
-     * Stop the perfetto trace collection under /data/misc/perfetto-traces/trace_output.pb after
-     * waiting for given time in msecs and copy the output to the destination file.
-     *
-     * @param waitTimeInMsecs time to wait in msecs before stopping the trace collection.
-     * @param destinationFile file to copy the perfetto output trace.
-     * @return true if the trace collection is successful otherwise false.
-     */
-    public boolean stopCollecting(long waitTimeInMsecs, @NonNull String destinationFile) {
-        // Wait for the dump interval before stopping the trace.
-        Log.i(LOG_TAG, String.format(
-                "Waiting for %d msecs before stopping perfetto.", waitTimeInMsecs));
-        SystemClock.sleep(waitTimeInMsecs);
-
-        // Stop the perfetto and copy the output file.
-        Log.i(LOG_TAG, "Stopping perfetto.");
-        try {
-            if (stopPerfetto()) {
-                Log.i(LOG_TAG, String.format("Writing to %s.", destinationFile));
-                if (!copyFileOutput(destinationFile)) {
-                    return false;
-                }
-            } else {
-                Log.e(LOG_TAG, "Perfetto failed to stop.");
-                return false;
-            }
-        } catch (IOException ioe) {
-            Log.e(LOG_TAG, "Unable to stop the perfetto tracing due to " + ioe.getMessage());
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Utility method for stopping perfetto.
-     *
-     * @return true if perfetto is stopped successfully.
-     */
-    public boolean stopPerfetto() throws IOException {
-        String stopOutput = mUIDevice.executeShellCommand("kill -INT " + perfettoPid());
-        Log.i(LOG_TAG, String.format("Perfetto stop command output - %s", stopOutput));
-        int waitCount = 0;
-        while (isPerfettoRunning()) {
-            // 60 secs timeout for perfetto shutdown.
-            if (waitCount < PERFETTO_KILL_WAIT_COUNT) {
-                // Check every 5 secs if perfetto stopped successfully.
-                SystemClock.sleep(PERFETTO_KILL_WAIT_TIME);
-                waitCount++;
-                continue;
-            }
-            return false;
-        }
-        Log.i(LOG_TAG, "Perfetto stopped successfully.");
-        return true;
-    }
-
-    /**
-     * Returns perfetto process pid if running, or null otherwise.
-     */
-    private String perfettoPid() {
-        try {
-            String perfettoProcId = mUIDevice.executeShellCommand(PERFETTO_PROC_ID_CMD);
-            Log.i(LOG_TAG, String.format("Perfetto process id - %s", perfettoProcId));
-            if (perfettoProcId.isEmpty()) {
-                return null;
-            }
-            return perfettoProcId;
-        } catch (IOException ioe) {
-            Log.e(LOG_TAG, "Not able to check the perfetto status due to:" + ioe.getMessage());
-            return null;
-        }
-    }
-
-    /**
-     * Check if perfetto process is running or not.
-     *
-     * @return true if perfetto is running otherwise false.
-     */
-    public boolean isPerfettoRunning() {
-        return perfettoPid() != null;
-    }
-
-    /**
-     * @return the {@link String} path to the temporary output file used to store the trace file
-     * during collection.
-     */
-    @NonNull
-    public static String getPerfettoTmpOutputFilePath() {
-        return PERFETTO_TMP_OUTPUT_FILE;
-    }
-
-    /**
-     * Copy the temporary perfetto trace output file from /data/misc/perfetto-traces/ to given
-     * destinationFile.
-     *
-     * @param destinationFile file to copy the perfetto output trace.
-     * @return true if the trace file copied successfully otherwise false.
-     */
-    private boolean copyFileOutput(@NonNull String destinationFile) {
-        Path path = Paths.get(destinationFile);
-        String destDirectory = path.getParent().toString();
-        // Check if the directory already exists
-        File directory = new File(destDirectory);
-        if (!directory.exists()) {
-            boolean success = directory.mkdirs();
-            if (!success) {
-                Log.e(LOG_TAG, String.format(
-                        "Result output directory %s not created successfully.", destDirectory));
-                return false;
-            }
-        }
-
-        // Copy the collected trace from /data/misc/perfetto-traces/trace_output.pb to
-        // destinationFile
-        try {
-            String moveResult = mUIDevice.executeShellCommand(String.format(
-                    MOVE_CMD, PERFETTO_TMP_OUTPUT_FILE, destinationFile));
-            if (!moveResult.isEmpty()) {
-                Log.e(LOG_TAG, String.format(
-                        "Unable to move perfetto output file from %s to %s due to %s",
-                        PERFETTO_TMP_OUTPUT_FILE, destinationFile, moveResult));
-                return false;
-            }
-        } catch (IOException ioe) {
-            Log.e(LOG_TAG,
-                    "Unable to move the perfetto trace file to destination file."
-                            + ioe.getMessage());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.kt
new file mode 100644
index 0000000..0d7bd9b
--- /dev/null
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoHelper.kt
@@ -0,0 +1,430 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.benchmark.macro.perfetto
+
+import android.os.Build
+import android.os.SystemClock
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.annotation.RestrictTo
+import androidx.benchmark.macro.DeviceInfo.deviceSummaryString
+import androidx.benchmark.macro.device
+import androidx.test.platform.app.InstrumentationRegistry
+import org.jetbrains.annotations.TestOnly
+import java.io.File
+import java.io.IOException
+
+/**
+ * PerfettoHelper is used to start and stop the perfetto tracing and move the
+ * output perfetto trace file to destination folder.
+ *
+ * @suppress
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RequiresApi(21)
+public class PerfettoHelper(private val unbundled: Boolean = Build.VERSION.SDK_INT in 21..28) {
+
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
+    private val device = instrumentation.device()
+
+    private fun perfettoStartupException(label: String, cause: Exception?): IllegalStateException {
+        return IllegalStateException(
+            """
+            $label
+            Please report a bug, and include a logcat capture of the test run and failure.
+            $deviceSummaryString
+            """.trimIndent(),
+            cause
+        )
+    }
+
+    /**
+     * Start the perfetto tracing in background using the given config file.
+     *
+     * The output will be written to /data/misc/perfetto-traces/trace_output.pb. Perfetto has
+     * write access only to /data/misc/perfetto-traces/ folder. The config file may be anywhere
+     * readable by shell.
+     *
+     * @param configFilePath used for collecting the perfetto trace.
+     * @param isTextProtoConfig true if the config file is textproto format otherwise false.
+     */
+    public fun startCollecting(configFilePath: String, isTextProtoConfig: Boolean) {
+        require(configFilePath.isNotEmpty()) {
+            "Perfetto config cannot be empty."
+        }
+
+        try {
+            // Cleanup already existing perfetto process.
+            Log.i(LOG_TAG, "Cleanup perfetto before starting.")
+            if (isPerfettoRunning()) {
+                Log.i(LOG_TAG, "Perfetto tracing is already running. Stopping perfetto.")
+                if (!stopPerfetto()) {
+                    throw perfettoStartupException(
+                        "Unable to stop Perfetto trace capture",
+                        null
+                    )
+                }
+            }
+
+            // The actual location of the config path.
+            val actualConfigPath = if (unbundled) {
+                val path = "$UNBUNDLED_PERFETTO_ROOT_DIR/config.pb"
+                // Move the config to a directory that unbundled perfetto has permissions for.
+                device.executeShellCommand("rm $path")
+                device.executeShellCommand("mv $configFilePath $path")
+                path
+            } else {
+                configFilePath
+            }
+
+            val outputPath = getPerfettoTmpOutputFilePath()
+            // Remove already existing temporary output trace file if any.
+            val output = device.executeShellCommand("rm $outputPath")
+            Log.i(LOG_TAG, "Perfetto output file cleanup - $output")
+
+            // Setup `traced` and `traced_probes` if necessary.
+            setupTracedAndProbes()
+
+            // Perfetto
+            val perfettoCmd = perfettoCommand(actualConfigPath, isTextProtoConfig)
+            Log.i(LOG_TAG, "Starting perfetto tracing with cmd: $perfettoCmd")
+            val perfettoCmdOutput = device.executeShellScript(perfettoCmd)
+            Log.i(LOG_TAG, "Perfetto pid - $perfettoCmdOutput")
+        } catch (ioe: IOException) {
+            throw perfettoStartupException("Unable to start perfetto tracing", ioe)
+        }
+
+        if (!isPerfettoRunning()) {
+            throw perfettoStartupException("Perfetto tracing failed to start. ", null)
+        }
+
+        Log.i(LOG_TAG, "Perfetto tracing started successfully.")
+    }
+
+    /**
+     * Stop the perfetto trace collection under /data/misc/perfetto-traces/trace_output.pb after
+     * waiting for given time in msecs and copy the output to the destination file.
+     *
+     * @param waitTimeInMsecs time to wait in msecs before stopping the trace collection.
+     * @param destinationFile file to copy the perfetto output trace.
+     * @return true if the trace collection is successful otherwise false.
+     */
+    public fun stopCollecting(waitTimeInMsecs: Long, destinationFile: String): Boolean {
+        // Wait for the dump interval before stopping the trace.
+        Log.i(LOG_TAG, "Waiting for $waitTimeInMsecs millis before stopping perfetto.")
+        SystemClock.sleep(waitTimeInMsecs)
+
+        // Stop the perfetto and copy the output file.
+        Log.i(LOG_TAG, "Stopping perfetto.")
+        try {
+            var stopped = stopPerfetto()
+            if (unbundled) {
+                Log.i(LOG_TAG, "Stopping `traced` and `traced_probes`.")
+                stopped = stopped.or(stopProcess(getProcessId(TRACED)))
+                stopped = stopped.or(stopProcess(getProcessId(TRACED_PROBES)))
+            }
+            if (!stopped) {
+                Log.e(LOG_TAG, "Perfetto failed to stop.")
+                return false
+            }
+            Log.i(LOG_TAG, "Writing to $destinationFile.")
+            if (!copyFileOutput(destinationFile)) {
+                return false
+            }
+        } catch (ioe: IOException) {
+            Log.e(LOG_TAG, "Unable to stop the perfetto tracing due to " + ioe.message, ioe)
+            return false
+        }
+        return true
+    }
+
+    /**
+     * Utility method for stopping perfetto.
+     *
+     * @return true if perfetto is stopped successfully.
+     */
+    @Throws(IOException::class)
+    public fun stopPerfetto(): Boolean = stopProcess(getProcessId(PERFETTO))
+
+    /**
+     * Check if perfetto process is running or not.
+     *
+     * @return true if perfetto is running otherwise false.
+     */
+    public fun isPerfettoRunning(): Boolean {
+        val pid = getProcessId(PERFETTO)
+        return !pid.isNullOrEmpty()
+    }
+
+    /**
+     * Sets up `traced` and `traced_probes` if necessary.
+     */
+    private fun setupTracedAndProbes() {
+        if (!unbundled) {
+            return
+        }
+
+        // Run `traced` and `traced_probes` in background mode.
+
+        // Setup traced
+        val tracedCmd = "$UNBUNDLED_ENV_PREFIX $tracedShellPath --background"
+        Log.i(LOG_TAG, "Starting traced cmd: $tracedCmd")
+        device.executeShellScript(tracedCmd)
+
+        // Setup traced_probes
+        val tracedProbesCmd = "$UNBUNDLED_ENV_PREFIX $tracedProbesShellPath --background"
+        Log.i(LOG_TAG, "Starting traced_probes cmd: $tracedProbesCmd")
+        device.executeShellScript(tracedProbesCmd)
+    }
+
+    /**
+     * @return the shell command that can be used to start Perfetto.
+     */
+    private fun perfettoCommand(configFilePath: String, isTextProtoConfig: Boolean): String {
+        val outputPath = getPerfettoTmpOutputFilePath()
+        var command = if (!unbundled) (
+            // Bundled perfetto reads configuration from stdin.
+            "cat $configFilePath | perfetto --background -c - -o $outputPath"
+            ) else {
+            // Unbundled perfetto can read configuration from a file that it has permissions to
+            // read from. This because it assumes the identity of the shell and therefore has
+            // access to /data/local/tmp directory.
+            "$UNBUNDLED_ENV_PREFIX $perfettoShellPath --background" +
+                " -c $configFilePath" +
+                " -o $outputPath"
+        }
+
+        if (isTextProtoConfig) {
+            command += PERFETTO_TXT_PROTO_ARG
+        }
+        return command
+    }
+
+    /**
+     * @return the [String] path to the temporary output file used to store the trace file
+     * during collection.
+     */
+    private fun getPerfettoTmpOutputFilePath(): String {
+        return if (unbundled) {
+            UNBUNDLED_TEMP_OUTPUT_FILE
+        } else {
+            PERFETTO_TMP_OUTPUT_FILE
+        }
+    }
+
+    /**
+     * @return the [String] process id for a given process name.
+     */
+    private fun getProcessId(processName: String): String? {
+        return try {
+            val processId = device.executeShellCommand("pidof $processName")
+            // We want to pick the most recent invocation of the command.
+            // This is because we may have more than once instance of the process.
+            val pid = processId.split(" ").lastOrNull()?.trim()
+            Log.d(LOG_TAG, "Process id is $pid")
+            pid
+        } catch (ioe: IOException) {
+            Log.i(LOG_TAG, "Unable to check process status due to $ioe.", ioe)
+            null
+        }
+    }
+
+    /**
+     * Utility method for stopping a process with a given `pid`.
+     *
+     * @return true if the process was stopped successfully.
+     */
+    private fun stopProcess(pid: String?): Boolean {
+        val stopOutput = device.executeShellCommand("kill -TERM $pid")
+        Log.i(LOG_TAG, "Stop command output - $stopOutput")
+        var waitCount = 0
+        while (isProcessRunning(pid)) {
+            Log.d(LOG_TAG, "Process ($pid) is running")
+            // 60 secs timeout for perfetto shutdown.
+            if (waitCount < PERFETTO_KILL_WAIT_COUNT) {
+                // Check every 5 secs if process stopped successfully.
+                SystemClock.sleep(PERFETTO_KILL_WAIT_TIME)
+                waitCount++
+                continue
+            }
+            return false
+        }
+        Log.i(LOG_TAG, "Process stopped successfully.")
+        return true
+    }
+
+    /**
+     * Utility method for checking if a process with a given `pid` is still running.
+     *
+     * @return true if still running.
+     */
+    @Throws(IOException::class)
+    private fun isProcessRunning(pid: String?): Boolean {
+        if (pid.isNullOrEmpty()) {
+            return false
+        }
+
+        Log.d(LOG_TAG, "Checking if $pid is running")
+        val output = device.executeShellCommand("ps -A $pid")
+        return output.contains(pid)
+    }
+
+    /**
+     * Copy the temporary perfetto trace output file from /data/local/tmp/trace_output.pb to given
+     * destinationFile.
+     *
+     * @param destinationFile file to copy the perfetto output trace.
+     * @return true if the trace file copied successfully otherwise false.
+     */
+    private fun copyFileOutput(destinationFile: String): Boolean {
+        val sourceFile = getPerfettoTmpOutputFilePath()
+        val filePath = File(destinationFile)
+        val destDirectory = filePath.parent
+        if (destDirectory != null) {
+            // Check if the directory already exists
+            val directory = File(destDirectory)
+            if (!directory.exists()) {
+                val success = directory.mkdirs()
+                if (!success) {
+                    Log.e(
+                        LOG_TAG,
+                        "Result output directory $destDirectory not created successfully."
+                    )
+                    return false
+                }
+            }
+        }
+
+        // Copy the collected trace from /data/misc/perfetto-traces/trace_output.pb to
+        // destinationFile
+        try {
+            val moveResult =
+                device.executeShellCommand("mv $sourceFile $destinationFile")
+            if (moveResult.isNotEmpty()) {
+                Log.e(
+                    LOG_TAG,
+                    """
+                        Unable to move perfetto output file from $sourceFile
+                        to $destinationFile due to $moveResult.
+                    """.trimIndent()
+                )
+                return false
+            }
+        } catch (ioe: IOException) {
+            Log.e(
+                LOG_TAG,
+                "Unable to move the perfetto trace file to destination file.",
+                ioe
+            )
+            return false
+        }
+        return true
+    }
+
+    internal companion object {
+        internal const val LOG_TAG = "PerfettoCapture"
+        // Command to start the perfetto tracing in the background.
+        // perfetto --background -c /data/misc/perfetto-traces/trace_config.pb -o
+        // /data/misc/perfetto-traces/trace_output.pb
+        private const val PERFETTO_TMP_OUTPUT_FILE = "/data/misc/perfetto-traces/trace_output.pb"
+
+        // Additional arg to indicate that the perfetto config file is text format.
+        private const val PERFETTO_TXT_PROTO_ARG = " --txt"
+
+        // Max wait count for checking if perfetto is stopped successfully
+        private const val PERFETTO_KILL_WAIT_COUNT = 12
+
+        // Check if perfetto is stopped every 5 secs.
+        private const val PERFETTO_KILL_WAIT_TIME: Long = 5000
+
+        // Path where perfetto, traced, and traced_probes are copied to if API >= 21 and < 29
+        private const val UNBUNDLED_PERFETTO_ROOT_DIR = "/data/local/tmp"
+
+        private const val UNBUNDLED_TEMP_OUTPUT_FILE =
+            "$UNBUNDLED_PERFETTO_ROOT_DIR/trace_output.pb"
+
+        // The environment variables necessary for unbundled perfetto (unnamed domain sockets).
+        // We need unnamed sockets here because SELinux dictates that we cannot use real, file
+        // based, domain sockets on Platform versions prior to S.
+        private const val UNBUNDLED_ENV_PREFIX =
+            "PERFETTO_PRODUCER_SOCK_NAME=@macrobenchmark_producer " +
+                "PERFETTO_CONSUMER_SOCK_NAME=@macrobenchmark_consumer"
+
+        // A set of supported ABIs
+        private val SUPPORTED_64_ABIS = setOf("arm64-v8a", "x86_64")
+        private val SUPPORTED_32_ABIS = setOf("armeabi")
+
+        // Perfetto executable
+        private const val PERFETTO = "perfetto"
+
+        // Trace daemon
+        private const val TRACED = "traced"
+
+        // Traced probes
+        private const val TRACED_PROBES = "traced_probes"
+
+        @TestOnly
+        fun isAbiSupported(): Boolean {
+            Log.d(LOG_TAG, "Supported ABIs: ${Build.SUPPORTED_ABIS.joinToString()}")
+            // Cuttlefish is x86 but claims support for x86_64
+            return !Build.MODEL.contains("Cuttlefish") && ( // b/180022458
+                Build.SUPPORTED_64_BIT_ABIS.any { SUPPORTED_64_ABIS.contains(it) } ||
+                    Build.SUPPORTED_32_BIT_ABIS.any { SUPPORTED_32_ABIS.contains(it) }
+                )
+        }
+
+        @get:TestOnly
+        val tracedProbesShellPath: String by lazy {
+            createExecutable(TRACED_PROBES)
+        }
+
+        @get:TestOnly
+        val tracedShellPath: String by lazy {
+            createExecutable(TRACED)
+        }
+
+        @get:TestOnly
+        val perfettoShellPath: String by lazy {
+            createExecutable(PERFETTO)
+        }
+
+        internal fun createExecutable(tool: String): String {
+            if (!isAbiSupported()) {
+                throw IllegalStateException(
+                    "Unsupported ABI (${Build.SUPPORTED_ABIS.joinToString()})"
+                )
+            }
+            val suffix = when {
+                // The order is important because `SUPPORTED_64_BIT_ABIS` lists all ABI supported
+                // by a device. That is why we need to search from most specific to least specific.
+                // For e.g. emulators claim to support aarch64, when in reality they can only
+                // support x86 or x86_64.
+                Build.SUPPORTED_64_BIT_ABIS.any { it.startsWith("x86_64") } -> "x86_64"
+                Build.SUPPORTED_64_BIT_ABIS.any { it.startsWith("arm64") } -> "aarch64"
+                Build.SUPPORTED_32_BIT_ABIS.any { it.startsWith("armeabi") } -> "arm"
+                else -> IllegalStateException(
+                    // Perfetto does not support x86 binaries
+                    "Unsupported ABI (${Build.SUPPORTED_ABIS.joinToString()})"
+                )
+            }
+            val instrumentation = InstrumentationRegistry.getInstrumentation()
+            val inputStream = instrumentation.context.assets.open("${tool}_$suffix")
+            val device = instrumentation.device()
+            return device.createRunnableExecutable(tool, inputStream)
+        }
+    }
+}
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
index 71d31f2..ef6a7b2 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoResultsParser.kt
@@ -16,50 +16,37 @@
 
 package androidx.benchmark.macro.perfetto
 
-import org.json.JSONArray
+import androidx.benchmark.macro.MetricsWithUiState
 import org.json.JSONObject
 
 internal object PerfettoResultsParser {
-    fun parseResult(jsonTrace: String, packageName: String): Map<String, Long> {
-        val map = mutableMapOf<String, Long>()
-        val json = JSONObject(jsonTrace)
-        val androidStartup = json.optJSONObject(ANDROID_STARTUP)
-        if (androidStartup != null) {
-            val startup = androidStartup.optJSONArray(STARTUP)
-            if (startup != null && startup.length() > 0) {
-                parseStartupResult(startup, packageName, map)
-            }
-        }
-        return map
-    }
-
-    private fun parseStartupResult(
-        json: JSONArray,
-        packageName: String,
-        map: MutableMap<String, Long>
-    ) {
-        val length = json.length()
-        for (i in 0 until length) {
-            val startupResult = json.getJSONObject(i)
-            val targetPackageName = startupResult.optString(PACKAGE_NAME)
-            if (packageName == targetPackageName) {
-                val firstFrameMetric = startupResult.optJSONObject(TO_FIRST_FRAME)
-                if (firstFrameMetric != null) {
-                    val duration = firstFrameMetric.optDouble(DUR_MS, 0.0)
-                    map[STARTUP_MS] = duration.toLong()
+    fun parseStartupResult(jsonMetricResults: String, packageName: String): MetricsWithUiState {
+        val json = JSONObject(jsonMetricResults)
+        json.optJSONObject("android_startup")?.let { androidStartup ->
+            androidStartup.optJSONArray("startup")?.let { startup ->
+                for (i in 0 until startup.length()) {
+                    val startupResult = startup.getJSONObject(i)
+                    if (startupResult.optString("package_name") == packageName) {
+                        // NOTE: we return the startup for this process, and ignore any more
+                        return startupResult.parseStartupMetricsWithUiState()
+                    }
                 }
             }
         }
+
+        return MetricsWithUiState.EMPTY
     }
 
-    private const val ANDROID_STARTUP = "android_startup"
-    private const val STARTUP = "startup"
-    private const val PACKAGE_NAME = "package_name"
-    private const val TO_FIRST_FRAME = "to_first_frame"
-    private const val DUR_MS = "dur_ms"
-    private const val TIME_ACTIVITY_START = "time_activity_start"
-    private const val TIME_ACTIVITY_RESUME = "time_activity_resume"
+    private fun JSONObject.parseStartupMetricsWithUiState(): MetricsWithUiState {
+        val durMs = getJSONObject("to_first_frame").getDouble("dur_ms")
 
-    // Metric Keys
-    private const val STARTUP_MS = "startupMs"
+        val eventTimestamps = optJSONObject("event_timestamps")
+        val timelineStart = eventTimestamps?.optLong("intent_received")
+        val timelineEnd = eventTimestamps?.optLong("first_frame")
+        return MetricsWithUiState(
+            metrics = mapOf("startupMs" to durMs.toLong()),
+            timelineStart = timelineStart,
+            timelineEnd = timelineEnd
+        )
+    }
 }
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
index 14c32cf..cf9bef7 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
@@ -16,7 +16,6 @@
 
 package androidx.benchmark.macro.perfetto
 
-import android.os.Build
 import android.util.Log
 import androidx.annotation.RequiresApi
 import androidx.benchmark.macro.device
@@ -31,13 +30,6 @@
 internal object PerfettoTraceProcessor {
     private const val TAG = "PerfettoTraceProcessor"
 
-    @TestOnly
-    fun isAbiSupported(): Boolean {
-        Log.d(TAG, "Supported ABIs: ${Build.SUPPORTED_ABIS.joinToString()}")
-        return !Build.MODEL.contains("Cuttlefish") && // b/180022458
-            Build.SUPPORTED_64_BIT_ABIS.any { it == "arm64-v8a" }
-    }
-
     /**
      * The actual [File] path to the `trace_processor_shell`.
      *
@@ -45,21 +37,8 @@
      */
     @get:TestOnly
     val shellPath: String by lazy {
-        if (!isAbiSupported()) {
-            throw IllegalStateException("Unsupported ABI (${Build.SUPPORTED_ABIS.joinToString()})")
-        }
-
-        val suffix = when {
-            Build.SUPPORTED_64_BIT_ABIS.any { it.startsWith("arm") } -> "aarch64"
-            else -> IllegalStateException(
-                "Unsupported ABI (${Build.SUPPORTED_ABIS.joinToString()})"
-            )
-        }
-
-        val instrumentation = InstrumentationRegistry.getInstrumentation()
-        val inputStream = instrumentation.context.assets.open("trace_processor_shell_$suffix")
-        val device = instrumentation.device()
-        device.createRunnableExecutable("trace_processor_shell", inputStream)
+        // Checks for ABI support
+        PerfettoHelper.createExecutable("trace_processor_shell")
     }
 
     fun getJsonMetrics(absoluteTracePath: String, metric: String): String {
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
index f3d404f..507bfa4 100644
--- a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/ShellUtils.kt
@@ -40,7 +40,7 @@
     // so we copy to /data/local/tmp
     val externalDir = Outputs.dirUsableByAppAndShell
     val stdinFile = File.createTempFile("temporaryStdin", null, externalDir)
-    val writableScriptFile = File.createTempFile("temporaryScript", "sh", externalDir)
+    val writableScriptFile = File.createTempFile("temporaryScript", ".sh", externalDir)
     val runnableScriptPath = "/data/local/tmp/" + writableScriptFile.name
 
     try {
diff --git a/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/UiState.kt b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/UiState.kt
new file mode 100644
index 0000000..9c583ae
--- /dev/null
+++ b/benchmark/macro/src/main/java/androidx/benchmark/macro/perfetto/UiState.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.
+ */
+
+package androidx.benchmark.macro.perfetto
+
+import perfetto.protos.Trace
+import perfetto.protos.TracePacket
+import perfetto.protos.UiState
+import java.io.File
+
+/**
+ * Convenience for UiState construction with specified package
+ */
+@Suppress("FunctionName") // constructor convenience
+internal fun UiState(
+    timelineStart: Long?,
+    timelineEnd: Long?,
+    highlightPackage: String?
+) = UiState(
+    timeline_start_ts = timelineStart,
+    timeline_end_ts = timelineEnd,
+    highlight_process = highlightPackage?.run {
+        UiState.HighlightProcess(cmdline = highlightPackage)
+    }
+)
+
+internal fun File.appendUiState(state: UiState) {
+    val trace = Trace.ADAPTER.decode(inputStream())
+    val appendedTrace = Trace(packet = trace.packet + listOf(TracePacket(ui_state = state)))
+    Trace.ADAPTER.encode(outputStream(), appendedTrace)
+}
diff --git a/benchmark/macro/src/main/java/perfetto/protos/package-info.java b/benchmark/macro/src/main/java/perfetto/protos/package-info.java
new file mode 100644
index 0000000..4654d20
--- /dev/null
+++ b/benchmark/macro/src/main/java/perfetto/protos/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+/**
+ * Hide the perfetto.protos package, as it's an implementation detail of benchmark.macro
+ *
+ * Note: other attempts to use these protos in the macrobench process will clash with our
+ * definitions. If this becomes an issue, we can move ours to a separate, internal package.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package perfetto.protos;
+
+import androidx.annotation.RestrictTo;
diff --git a/benchmark/macro/src/main/proto/perfetto_trace.proto b/benchmark/macro/src/main/proto/perfetto_trace.proto
new file mode 100644
index 0000000..cd9f23b
--- /dev/null
+++ b/benchmark/macro/src/main/proto/perfetto_trace.proto
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package perfetto.protos;
+
+///////////////////////////////////////////////////////////////////////////////
+// NOTE: THIS FILE IS A MANUALLY MINIFIED VERSION OF PERFETTO_TRACE.PROTO
+// This minification reduces library size drastically:
+// * minified   - {"method_count": 1204,"bytecode_size": 175023}
+// * full proto - {"method_count":64386,"bytecode_size":3832136}
+//
+// Measured with `./gradlew benchmark:benchmark-macro:reportLibraryMetrics`
+///////////////////////////////////////////////////////////////////////////////
+// UiState - kept in entirety
+///////////////////////////////////////////////////////////////////////////////
+
+// Common state for UIs visualizing Perfetto traces.
+// This message can be appended as a TracePacket by UIs to save the
+// visible state (e.g. scroll position/zoom state) for future opening
+// of the trace.
+// Design doc: go/trace-ui-state.
+message UiState {
+  // The start and end bounds of the viewport of the UI in nanoseconds.
+  //
+  // This is the absolute time associated to slices and other events in
+  // trace processor tables (i.e. the |ts| column of most tables)
+  optional int64 timeline_start_ts = 1;
+  optional int64 timeline_end_ts = 2;
+
+  // Indicates that the given process should be highlighted by the UI.
+  message HighlightProcess {
+    oneof selector {
+      // The pid of the process to highlight. This is useful for UIs to focus
+      // on tracks of a particular process in the trace.
+      //
+      // If more than one process in a trace has the same pid, it is UI
+      // implementation specific how the process to be focused will be
+      // chosen.
+      uint32 pid = 1;
+
+      // The command line of the process to highlight; for most Android apps,
+      // this is the package name of the app. This is useful for UIs to focus
+      // on a particular app in the trace.
+      //
+      // If more than one process hasthe same cmdline, it is UI implementation
+      // specific how the process to be focused will be chosen.
+      string cmdline = 2;
+    }
+  }
+  optional HighlightProcess highlight_process = 3;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Others - kept only what is necessary
+///////////////////////////////////////////////////////////////////////////////
+
+message TracePacket {
+  oneof data {
+    UiState ui_state = 78;
+    bytes compressed_packets = 50; // kept for testing purposes
+  }
+}
+
+message Trace {
+  repeated TracePacket packet = 1;
+}
diff --git a/biometric/biometric-ktx/lint-baseline.xml b/biometric/biometric-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/biometric/biometric-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/biometric/biometric-ktx/samples/lint-baseline.xml b/biometric/biometric-ktx/samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/biometric/biometric-ktx/samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt b/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
index 9d9368e..d49de2e 100644
--- a/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
+++ b/biometric/biometric-ktx/samples/src/main/java/androidx/biometric/samples/auth/CoroutineSamples.kt
@@ -102,7 +102,7 @@
 }
 
 @Sampled
-@Suppress("UnsafeNewApiCall", "NewApi")
+@Suppress("NewApi", "ClassVerificationFailure")
 suspend fun Fragment.class3BiometricAuth() {
     // To use Class3 authentication, we need to create a CryptoObject.
     // First create a spec for the key to be generated.
@@ -163,7 +163,7 @@
 }
 
 @Sampled
-@Suppress("UnsafeNewApiCall", "NewApi")
+@Suppress("NewApi", "ClassVerificationFailure")
 suspend fun Fragment.class3BiometricOrCredentialAuth() {
     // To use Class3 authentication, we need to create a CryptoObject.
     // First create a spec for the key to be generated.
@@ -224,7 +224,7 @@
 }
 
 @Sampled
-@Suppress("UnsafeNewApiCall", "NewApi")
+@Suppress("NewApi", "ClassVerificationFailure")
 suspend fun Fragment.credentialAuth() {
     // To use credential authentication, we need to create a CryptoObject.
     // First create a spec for the key to be generated.
diff --git a/biometric/biometric/build.gradle b/biometric/biometric/build.gradle
index 0933892..cde60f3 100644
--- a/biometric/biometric/build.gradle
+++ b/biometric/biometric/build.gradle
@@ -46,8 +46,8 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
     androidTestImplementation(TRUTH)
 }
 
@@ -59,12 +59,6 @@
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
-
-    compileOptions {
-        sourceCompatibility(JavaVersion.VERSION_1_7)
-        targetCompatibility(JavaVersion.VERSION_1_7)
-    }
-
     testOptions.unitTests.includeAndroidResources = true
 }
 
diff --git a/biometric/biometric/lint-baseline.xml b/biometric/biometric/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/biometric/biometric/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index 3121f90..9c1fc3e 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -39,7 +39,6 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -259,12 +258,12 @@
      * fragment.
      */
     private void connectViewModel() {
-        final FragmentActivity activity = getActivity();
-        if (activity == null) {
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        if (host == null) {
             return;
         }
-        mViewModel = new ViewModelProvider(getActivity()).get(BiometricViewModel.class);
-        mViewModel.setClientActivity(activity);
+        mViewModel = BiometricPrompt.getViewModel(host);
+        mViewModel.setClientActivity(getActivity());
         mViewModel.getAuthenticationResult().observe(
                 this,
                 new Observer<BiometricPrompt.AuthenticationResult>() {
@@ -356,9 +355,9 @@
             @NonNull BiometricPrompt.PromptInfo info,
             @Nullable BiometricPrompt.CryptoObject crypto) {
 
-        final FragmentActivity activity = getActivity();
-        if (activity == null) {
-            Log.e(TAG, "Not launching prompt. Client activity was null.");
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        if (host == null) {
+            Log.e(TAG, "Not launching prompt. Client context was null.");
             return;
         }
 
@@ -387,7 +386,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(activity).canAuthenticate(Authenticators.BIOMETRIC_WEAK)
+                && BiometricManager.from(host).canAuthenticate(Authenticators.BIOMETRIC_WEAK)
                         != BiometricManager.BIOMETRIC_SUCCESS) {
             mViewModel.setAwaitingResult(true);
             launchConfirmCredentialActivity();
@@ -784,14 +783,14 @@
      */
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
     private void launchConfirmCredentialActivity() {
-        final FragmentActivity activity = getActivity();
-        if (activity == null) {
-            Log.e(TAG, "Failed to check device credential. Client FragmentActivity not found.");
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        if (host == null) {
+            Log.e(TAG, "Failed to check device credential. Client Context not found.");
             return;
         }
 
         // Get the KeyguardManager service in whichever way the platform supports.
-        final KeyguardManager keyguardManager = KeyguardUtils.getKeyguardManager(activity);
+        final KeyguardManager keyguardManager = KeyguardUtils.getKeyguardManager(host);
         if (keyguardManager == null) {
             sendErrorAndDismiss(
                     BiometricPrompt.ERROR_HW_NOT_PRESENT,
@@ -1011,11 +1010,11 @@
      * @see DeviceUtils#shouldUseFingerprintForCrypto(Context, String, String)
      */
     private boolean isFingerprintDialogNeededForCrypto() {
-        final FragmentActivity activity = getActivity();
-        return activity != null
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        return host != null
                 && mViewModel.getCryptoObject() != null
                 && DeviceUtils.shouldUseFingerprintForCrypto(
-                        activity, Build.MANUFACTURER, Build.MODEL);
+                        host, Build.MANUFACTURER, Build.MODEL);
     }
 
     /**
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricPrompt.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
index ef779fc..e4cedf4 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -17,6 +17,7 @@
 package androidx.biometric;
 
 import android.annotation.SuppressLint;
+import android.content.Context;
 import android.os.Build;
 import android.text.TextUtils;
 import android.util.Log;
@@ -34,6 +35,7 @@
 import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.OnLifecycleEvent;
 import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -801,9 +803,8 @@
             throw new IllegalArgumentException("AuthenticationCallback must not be null.");
         }
 
-        final FragmentActivity activity = fragment.getActivity();
         final FragmentManager fragmentManager = fragment.getChildFragmentManager();
-        final BiometricViewModel viewModel = getViewModel(activity);
+        final BiometricViewModel viewModel = getViewModel(getHostActivityOrContext(fragment));
         addObservers(fragment, viewModel);
         init(fragmentManager, viewModel, null /* executor */, callback);
     }
@@ -883,9 +884,8 @@
             throw new IllegalArgumentException("AuthenticationCallback must not be null.");
         }
 
-        final FragmentActivity activity = fragment.getActivity();
         final FragmentManager fragmentManager = fragment.getChildFragmentManager();
-        final BiometricViewModel viewModel = getViewModel(activity);
+        final BiometricViewModel viewModel = getViewModel(getHostActivityOrContext(fragment));
         addObservers(fragment, viewModel);
         init(fragmentManager, viewModel, executor, callback);
     }
@@ -1019,19 +1019,36 @@
     }
 
     /**
-     * Gets the biometric view model instance for the given activity, creating one if necessary.
+     * Gets the biometric view model instance for the given context, creating one if necessary.
      *
-     * @param activity The client activity that will (directly or indirectly) host the prompt.
+     * @param context The client context that will (directly or indirectly) host the prompt.
      * @return A biometric view model tied to the lifecycle of the given activity.
      */
     @Nullable
-    private static BiometricViewModel getViewModel(@Nullable FragmentActivity activity) {
-        return activity != null
-                ? new ViewModelProvider(activity).get(BiometricViewModel.class)
+    static BiometricViewModel getViewModel(@Nullable Context context) {
+        return  context instanceof ViewModelStoreOwner
+                ? new ViewModelProvider((ViewModelStoreOwner) context).get(BiometricViewModel.class)
                 : null;
     }
 
     /**
+     * Gets the host Activity or Context the given Fragment.
+     *
+     * @param fragment The fragment.
+     * @return The Activity or Context that hosts the Fragment.
+     */
+    @Nullable
+    static Context getHostActivityOrContext(@NonNull Fragment fragment) {
+        final FragmentActivity activity = fragment.getActivity();
+        if (activity != null) {
+            return activity;
+        } else {
+            // If the host activity is null, return the host context instead
+            return fragment.getContext();
+        }
+    }
+
+    /**
      * Adds the necessary lifecycle observers to the given fragment host.
      *
      * @param fragment  The fragment of the client application that will host the prompt.
diff --git a/biometric/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java b/biometric/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
index 13ae176..240e6a2 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
@@ -43,9 +43,7 @@
 import androidx.appcompat.app.AlertDialog;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.Observer;
-import androidx.lifecycle.ViewModelProvider;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -251,12 +249,12 @@
      * fragment.
      */
     private void connectViewModel() {
-        final FragmentActivity activity = getActivity();
-        if (activity == null) {
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        if (host == null) {
             return;
         }
 
-        mViewModel = new ViewModelProvider(activity).get(BiometricViewModel.class);
+        mViewModel = BiometricPrompt.getViewModel(host);
 
         mViewModel.getFingerprintDialogState().observe(this, new Observer<Integer>() {
             @Override
@@ -360,8 +358,8 @@
      */
     private int getThemedColorFor(int attr) {
         final Context context = getContext();
-        final FragmentActivity activity = getActivity();
-        if (context == null || activity == null) {
+        final Context host = BiometricPrompt.getHostActivityOrContext(this);
+        if (context == null || host == null) {
             Log.w(TAG, "Unable to get themed color. Context or activity is null.");
             return 0;
         }
@@ -369,7 +367,7 @@
         TypedValue tv = new TypedValue();
         Resources.Theme theme = context.getTheme();
         theme.resolveAttribute(attr, tv, true /* resolveRefs */);
-        TypedArray arr = activity.obtainStyledAttributes(tv.data, new int[] {attr});
+        TypedArray arr = host.obtainStyledAttributes(tv.data, new int[] {attr});
 
         final int color = arr.getColor(0 /* index */, 0 /* defValue */);
         arr.recycle();
diff --git a/biometric/biometric/src/main/res/values-iw/strings.xml b/biometric/biometric/src/main/res/values-iw/strings.xml
index b8cc6ea..170d50f 100644
--- a/biometric/biometric/src/main/res/values-iw/strings.xml
+++ b/biometric/biometric/src/main/res/values-iw/strings.xml
@@ -21,7 +21,7 @@
     <string name="fingerprint_not_recognized" msgid="3873359464293253009">"לא זוהתה"</string>
     <string name="fingerprint_error_hw_not_available" msgid="8216738333501875566">"החומרה בשביל טביעת אצבע אינה זמינה."</string>
     <string name="fingerprint_error_no_fingerprints" msgid="7520712796891883488">"לא נרשמו טביעות אצבע."</string>
-    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"במכשיר זה אין חיישן טביעות אצבע"</string>
+    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"במכשיר הזה אין חיישן טביעות אצבע"</string>
     <string name="fingerprint_error_user_canceled" msgid="7627716295344353987">"פעולת טביעת האצבע בוטלה בידי המשתמש."</string>
     <string name="fingerprint_error_lockout" msgid="7291787166416782245">"ניסית יותר מדי פעמים. יש לנסות שוב מאוחר יותר."</string>
     <string name="default_error_msg" msgid="4776854077120974966">"שגיאה לא ידועה"</string>
diff --git a/biometric/biometric/src/main/res/values-ja/strings.xml b/biometric/biometric/src/main/res/values-ja/strings.xml
index a7ff803..2187bed 100644
--- a/biometric/biometric/src/main/res/values-ja/strings.xml
+++ b/biometric/biometric/src/main/res/values-ja/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="fingerprint_dialog_touch_sensor" msgid="1072308044213194243">"指紋認証センサーをタップ"</string>
+    <string name="fingerprint_dialog_touch_sensor" msgid="1072308044213194243">"指紋認証センサーをタッチ"</string>
     <string name="fingerprint_not_recognized" msgid="3873359464293253009">"認識されませんでした"</string>
     <string name="fingerprint_error_hw_not_available" msgid="8216738333501875566">"指紋認証ハードウェアは使用できません。"</string>
     <string name="fingerprint_error_no_fingerprints" msgid="7520712796891883488">"指紋が登録されていません。"</string>
diff --git a/biometric/biometric/src/main/res/values-ne/strings.xml b/biometric/biometric/src/main/res/values-ne/strings.xml
index 46c454c..86727dc 100644
--- a/biometric/biometric/src/main/res/values-ne/strings.xml
+++ b/biometric/biometric/src/main/res/values-ne/strings.xml
@@ -21,13 +21,13 @@
     <string name="fingerprint_not_recognized" msgid="3873359464293253009">"पहिचान भएन"</string>
     <string name="fingerprint_error_hw_not_available" msgid="8216738333501875566">"फिंगरप्रिन्ट हार्डवेयर उपलब्ध छैन।"</string>
     <string name="fingerprint_error_no_fingerprints" msgid="7520712796891883488">"कुनै पनि फिंगरप्रिन्ट दर्ता गरिएको छैन।"</string>
-    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"यो यन्त्रमा कुनै फिंगरप्रिन्ट सेन्सर छैन"</string>
+    <string name="fingerprint_error_hw_not_present" msgid="6306988885793029438">"यो डिभाइसमा कुनै फिंगरप्रिन्ट सेन्सर छैन"</string>
     <string name="fingerprint_error_user_canceled" msgid="7627716295344353987">"प्रयोगकर्ताले फिंगरप्रिन्टसम्बन्धी कारबाही रद्द गर्नुभयो।"</string>
     <string name="fingerprint_error_lockout" msgid="7291787166416782245">"अत्यधिक पटक प्रयासहरू गरिए। कृपया पछि फेरि प्रयास गर्नुहोस्।"</string>
     <string name="default_error_msg" msgid="4776854077120974966">"अज्ञात त्रुटि"</string>
     <string name="generic_error_user_canceled" msgid="7309881387583143581">"प्रयोगकर्ताले प्रमाणीकरण सेवा रद्द गर्नुभयो।"</string>
     <string name="confirm_device_credential_password" msgid="5912733858573823945">"पासवर्ड प्रयोग गर्नुहोस्"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"कुनै पनि PIN, ढाँचा वा पासवर्ड सेट गरिएको छैन।"</string>
-    <string name="generic_error_no_keyguard" msgid="1807436368654974044">"यस यन्त्रमा PIN, ढाँचा वा पासवर्ड प्रयोग गर्न मिल्दैन।"</string>
+    <string name="generic_error_no_keyguard" msgid="1807436368654974044">"यस डिभाइसमा PIN, ढाँचा वा पासवर्ड प्रयोग गर्न मिल्दैन।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फिंगरप्रिन्ट जनाउने आइकन"</string>
 </resources>
diff --git a/biometric/integration-tests/testapp/lint-baseline.xml b/biometric/integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/biometric/integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/biometric/integration-tests/testapp/src/main/res/values/strings.xml b/biometric/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from biometric/integration-tests/testapp/src/main/res/values/strings.xml
rename to biometric/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/browser/browser/build.gradle b/browser/browser/build.gradle
index 5359fed..c98ffa8 100644
--- a/browser/browser/build.gradle
+++ b/browser/browser/build.gradle
@@ -40,9 +40,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
 }
 
diff --git a/browser/browser/lint-baseline.xml b/browser/browser/lint-baseline.xml
index bc3c366..97ab8ed 100644
--- a/browser/browser/lint-baseline.xml
+++ b/browser/browser/lint-baseline.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.browser.browseractions.BrowserActionsIntent is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        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="469"
+            line="470"
             column="38"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.browser.trusted.NotificationApiHelperForM is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        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
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        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
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.browser.trusted.NotificationApiHelperForO is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        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
diff --git a/build.gradle b/build.gradle
index 6475889..12f31bc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,7 +22,6 @@
     SdkHelperKt.setSupportRootFolder(project, project.projectDir)
 
     apply from: "buildSrc/repos.gradle"
-    apply from: "buildSrc/build_dependencies.gradle"
     repos.addMavenRepositories(repositories)
 
     SdkHelperKt.writeSdkPathToLocalPropertiesFile(project)
diff --git a/buildSrc-tests/lint-baseline.xml b/buildSrc-tests/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/buildSrc-tests/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
index cef9eac..4dc84a6 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/AffectedModuleDetectorImplTest.kt
@@ -34,6 +34,7 @@
 
 @RunWith(JUnit4::class)
 class AffectedModuleDetectorImplTest {
+
     @Rule
     @JvmField
     val attachLogsRule = AttachLogsTestRule()
@@ -165,7 +166,6 @@
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -173,53 +173,23 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
-            )
-        )
-    }
-
-    @Test
-    fun noChangeCLsOnlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = emptyList()
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
-            )
-        )
-    }
-
-    @Test
-    fun noChangeCLsOnlyChanged() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = emptyList()
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p11)
             )
         )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.buildAll,
+            CoreMatchers.`is`(
+                true
+            )
+        )
     }
 
     @Test
@@ -228,7 +198,6 @@
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -236,53 +205,17 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p3, p4, p5, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInOneOnlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p3, p4, p5, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInOneOnlyChanged() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p1, p11)
             )
         )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p3, p4, p5, p11)
+            )
+        )
     }
 
     @Test
@@ -291,7 +224,6 @@
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -302,59 +234,17 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInTwoOnlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(
-                    convertToFilePath("p1", "foo.java"),
-                    convertToFilePath("p2", "bar.java")
-                )
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p3, p4, p5, p6, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInTwoOnlyChanged() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(
-                    convertToFilePath("p1", "foo.java"),
-                    convertToFilePath("p2", "bar.java")
-                )
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p1, p2, p11)
             )
         )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p3, p4, p5, p6, p11)
+            )
+        )
     }
 
     @Test
@@ -363,7 +253,6 @@
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -371,62 +260,31 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInRootOnlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf("foo.java")
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
-            )
-        )
-    }
-
-    @Test
-    fun changeInRootOnlyChanged() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf("foo.java")
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p11)
             )
         )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.buildAll,
+            CoreMatchers.`is`(
+                true
+            )
+        )
     }
 
     @Test
-    fun changeInRootAndSubproject_onlyChanged() {
+    fun changeInRootAndSubproject() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -434,30 +292,21 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p7, p11)
             )
         )
-    }
-
-    @Test
-    fun changeInRootAndSubproject_onlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf("foo.java", convertToFilePath("p7", "bar.java"))
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.buildAll,
             CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
+                true
             )
         )
     }
@@ -468,7 +317,6 @@
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             cobuiltTestPaths = cobuiltTestPaths,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -480,70 +328,25 @@
             )
         )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p8, p9, p11)
             )
         )
-    }
-
-    @Test
-    fun changeInCobuiltOnlyDependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(
-                    convertToFilePath(
-                        "p8", "foo.java"
-                    )
-                )
-            )
-        )
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.dependentProjects,
             CoreMatchers.`is`(
                 setOf(p11)
             )
         )
     }
 
-    @Test
-    fun changeInCobuiltOnlyChanged() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
-            cobuiltTestPaths = cobuiltTestPaths,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(
-                    convertToFilePath(
-                        "p8", "foo.java"
-                    )
-                )
-            )
-        )
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p8, p9, p11)
-            )
-        )
-    }
-
     @Test(expected = IllegalStateException::class)
-    fun changeInCobuiltOnlyChangedMissingCobuilt() {
+    fun changeInCobuiltMissingCobuilt() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
             cobuiltTestPaths = setOf(setOf("cobuilt1", "cobuilt2", "cobuilt3")),
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -555,16 +358,15 @@
             )
         )
         // This should trigger IllegalStateException due to missing cobuilt3
-        detector.affectedProjects
+        detector.changedProjects
     }
 
     @Test
-    fun changeInCobuiltOnlyChangedAllCobuiltsMissing() {
+    fun changeInCobuiltAllCobuiltsMissing() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
             cobuiltTestPaths = setOf(setOf("cobuilt3", "cobuilt4", "cobuilt5")),
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
@@ -576,71 +378,30 @@
             )
         )
         // There should be no exception thrown here because *all* cobuilts are missing.
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p8, p11)
-            )
-        )
+        detector.changedProjects
     }
 
     @Test
-    fun projectSubset_changed() {
+    fun projectSubset() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.CHANGED_PROJECTS,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
                 changedFiles = listOf(convertToFilePath("p1", "foo.java"))
-            )
+            ),
+            isPresubmit = false
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
                 setOf(p1, p11)
             )
         )
-        // Test changed
         MatcherAssert.assertThat(
-            detector.getSubset(p1),
-            CoreMatchers.`is`(
-                ProjectSubset.CHANGED_PROJECTS
-            )
-        )
-        // Test dependent
-        MatcherAssert.assertThat(
-            detector.getSubset(p3),
-            CoreMatchers.`is`(
-                ProjectSubset.DEPENDENT_PROJECTS
-            )
-        )
-        // Random unrelated project should return none
-        MatcherAssert.assertThat(
-            detector.getSubset(p7),
-            CoreMatchers.`is`(
-                ProjectSubset.NONE
-            )
-        )
-    }
-
-    @Test
-    fun projectSubset_dependent() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
-            )
-        )
-        // Verify expectations on affected projects
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.dependentProjects,
             CoreMatchers.`is`(
                 setOf(p3, p4, p5, p11)
             )
@@ -669,77 +430,134 @@
     }
 
     @Test
-    fun projectSubset_all() {
-        val detector = AffectedModuleDetectorImpl(
-            rootProject = root,
-            logger = logger,
-            ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
-            injectedGitClient = MockGitClient(
-                lastMergeSha = "foo",
-                changedFiles = listOf(convertToFilePath("p1", "foo.java"))
-            )
-        )
-        // Verify expectations on affected projects
-        MatcherAssert.assertThat(
-            detector.affectedProjects,
-            CoreMatchers.`is`(
-                setOf(p1, p3, p4, p5, p11)
-            )
-        )
-        // Test changed
-        MatcherAssert.assertThat(
-            detector.getSubset(p1),
-            CoreMatchers.`is`(
-                ProjectSubset.CHANGED_PROJECTS
-            )
-        )
-        // Test dependent
-        MatcherAssert.assertThat(
-            detector.getSubset(p3),
-            CoreMatchers.`is`(
-                ProjectSubset.DEPENDENT_PROJECTS
-            )
-        )
-        // Random unrelated project should return none
-        MatcherAssert.assertThat(
-            detector.getSubset(p7),
-            CoreMatchers.`is`(
-                ProjectSubset.NONE
-            )
-        )
-    }
-
-    @Test
     fun projectSubset_noChangedFiles() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
                 changedFiles = emptyList()
-            )
+            ),
+            isPresubmit = false
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
             detector.affectedProjects,
             CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
+                setOf(p11)
             )
         )
-        // Everything should return dependent in postsubmit case
+        // No changed files in postsubmit -> return all
         MatcherAssert.assertThat(
             detector.getSubset(p1),
             CoreMatchers.`is`(
-                ProjectSubset.ALL_AFFECTED_PROJECTS
+                ProjectSubset.NONE
             )
         )
         MatcherAssert.assertThat(
             detector.getSubset(p3),
             CoreMatchers.`is`(
-                ProjectSubset.ALL_AFFECTED_PROJECTS
+                ProjectSubset.NONE
+            )
+        )
+        // Only the placeholder test should return CHANGED_PROJECTS
+        MatcherAssert.assertThat(
+            detector.getSubset(p11),
+            CoreMatchers.`is`(
+                ProjectSubset.CHANGED_PROJECTS
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.buildAll,
+            CoreMatchers.`is`(
+                true
+            )
+        )
+    }
+
+    @Test
+    fun projectSubset_noChangedFiles_presubmit() {
+        val detector = AffectedModuleDetectorImpl(
+            rootProject = root,
+            logger = logger,
+            ignoreUnknownProjects = false,
+            injectedGitClient = MockGitClient(
+                lastMergeSha = "foo",
+                changedFiles = emptyList()
+            ),
+            isPresubmit = true
+        )
+        // Verify expectations on affected projects
+        MatcherAssert.assertThat(
+            detector.affectedProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.getSubset(p1),
+            CoreMatchers.`is`(
+                ProjectSubset.DEPENDENT_PROJECTS
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.getSubset(p3),
+            CoreMatchers.`is`(
+                ProjectSubset.DEPENDENT_PROJECTS
+            )
+        )
+        // Only the placeholder test should return CHANGED_PROJECTS
+        MatcherAssert.assertThat(
+            detector.getSubset(p11),
+            CoreMatchers.`is`(
+                ProjectSubset.CHANGED_PROJECTS
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.buildAll,
+            CoreMatchers.`is`(
+                true
+            )
+        )
+    }
+
+    @Test
+    fun projectSubset_unknownChangedFiles() {
+        val detector = AffectedModuleDetectorImpl(
+            rootProject = root,
+            logger = logger,
+            ignoreUnknownProjects = false,
+            injectedGitClient = MockGitClient(
+                lastMergeSha = "foo",
+                changedFiles = listOf(convertToFilePath("unknown", "file.java"))
+            ),
+            isPresubmit = false
+        )
+        // Verify expectations on affected projects
+        MatcherAssert.assertThat(
+            detector.changedProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
+            )
+        )
+        // Everything should return dependent in presubmit case
+        MatcherAssert.assertThat(
+            detector.getSubset(p1),
+            CoreMatchers.`is`(
+                ProjectSubset.DEPENDENT_PROJECTS
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.getSubset(p3),
+            CoreMatchers.`is`(
+                ProjectSubset.DEPENDENT_PROJECTS
             )
         )
         // Only the placeholder test should return CHANGED_PROJECTS
@@ -752,22 +570,28 @@
     }
 
     @Test
-    fun projectSubset_unknownChangedFiles() {
+    fun projectSubset_unknownChangedFiles_presubmit() {
         val detector = AffectedModuleDetectorImpl(
             rootProject = root,
             logger = logger,
             ignoreUnknownProjects = false,
-            projectSubset = ProjectSubset.DEPENDENT_PROJECTS,
             injectedGitClient = MockGitClient(
                 lastMergeSha = "foo",
                 changedFiles = listOf(convertToFilePath("unknown", "file.java"))
-            )
+            ),
+            isPresubmit = true
         )
         // Verify expectations on affected projects
         MatcherAssert.assertThat(
-            detector.affectedProjects,
+            detector.changedProjects,
             CoreMatchers.`is`(
-                setOf(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
+                setOf(p11)
+            )
+        )
+        MatcherAssert.assertThat(
+            detector.dependentProjects,
+            CoreMatchers.`is`(
+                setOf(p11)
             )
         )
         // Everything should return dependent in presubmit case
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 9e2ccc4..711d182 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -8,16 +8,14 @@
         }
     }
 
-    apply from: "build_dependencies.gradle"
-
     dependencies {
-        classpath build_libs.kotlin.gradle_plugin
+        classpath libs.kotlinGradlePlugin
     }
 
     configurations.classpath.resolutionStrategy {
         eachDependency { details ->
             if (details.requested.group == "org.jetbrains.kotlin") {
-                details.useVersion build_versions.kotlin
+                details.useVersion libs.versions.kotlin.get()
             }
         }
     }
@@ -29,7 +27,6 @@
 ext.supportRootFolder = project.projectDir.getParentFile()
 apply from: "local_dokka.gradle"
 apply from: "repos.gradle"
-apply from: "build_dependencies.gradle"
 apply plugin: "kotlin"
 apply from: "kotlin-dsl-dependency.gradle"
 
@@ -64,22 +61,21 @@
 }
 
 dependencies {
-    cacheableApi(build_libs.agp)
-    cacheableImplementation(build_libs.dex_member_list)
-    cacheableApi(build_libs.kotlin.gradle_plugin)
-    cacheableImplementation(build_libs.kotlinpoet)
+    cacheableApi(libs.androidGradlePlugin)
+    cacheableImplementation(libs.dexMemberList)
+    cacheableApi(libs.kotlinGradlePlugin)
+    cacheableImplementation(libs.kotlinPoet)
     cacheableImplementation(gradleApi())
-    cacheableApi(build_libs.dokka_gradle)
+    cacheableApi(libs.dokkaGradlePlugin)
     // needed by inspection plugin
     cacheableImplementation("com.google.protobuf:protobuf-gradle-plugin:0.8.13")
-    // TODO(aurimas): remove when b/174658825 is fixed
-    cacheableImplementation("org.anarres.jarjar:jarjar-gradle:1.0.1")
-    cacheableImplementation("com.github.jengelman.gradle.plugins:shadow:5.2.0")
+    cacheableImplementation(libs.wireGradlePlugin)
+    cacheableImplementation(libs.shadow)
     // dependencies that aren't used by buildSrc directly but that we resolve here so that the
     // root project doesn't need to re-resolve them and their dependencies on every build
-    cacheableRuntimeOnly(build_libs.hilt_plugin)
+    cacheableRuntimeOnly(libs.hiltAndroidGradlePlugin)
     // room kotlintestapp uses the ksp plugin but it does not publish a plugin marker yet
-    cacheableRuntimeOnly(build_libs.kotlin.ksp_gradle_plugin)
+    cacheableRuntimeOnly(libs.kspGradlePlugin)
     // dependencies whose resolutions we don't need to cache
     compileOnly(findGradleKotlinDsl()) // Only one file in this configuration, no need to cache it
     implementation(project("jetpad-integration")) // Doesn't have a .pom, so not slow to load
@@ -123,12 +119,23 @@
 }
 
 // Parses a file into a list of Dependency objects representing a ResolvedConfiguration
-def parseConfigurationResolution(savedFile) {
+def parseConfigurationResolution(savedFile, throwOnError) {
     def savedText = savedFile.text
     def filenames = savedText.split("\n")
+    def valid = true
     def dependencies = filenames.collect { filename ->
+        if (!project.file(filename).exists()) {
+            if (throwOnError) {
+                throw new GradleException("\nFile " + filename + " listed as a resolved dependency in " + savedFile + " does not exist!\n\nFor more information, see b/187075069")
+            } else {
+                valid = false
+            }
+        }
         project.dependencies.create(project.files(filename))
     }
+    if (!valid) {
+        return null
+    }
     return dependencies
 }
 
@@ -140,13 +147,22 @@
     def outputsFile = new File(cacheDir, "/result")
 
     def inputText = fingerprintConfiguration(configuration)
-    if (!inputsFile.exists() || inputsFile.text != inputText) {
+    def parsed = null
+    if (inputsFile.exists() && inputsFile.text == inputText) {
+        // Try to parse the previously resolved configuration, but don't give up if it mentions a
+        // nonexistent file. If something has since deleted one of the referenced files, we will
+        // try to reresolve that file later
+        parsed = parseConfigurationResolution(outputsFile, false)
+    }
+    // If the configuration has changed or if any of its files have been deleted, reresolve it
+    if (parsed == null) {
         cacheDir.mkdirs()
         saveConfigurationResolution(configuration, outputsFile)
         inputsFile.text = inputText
+        // confirm that the resolved configuration parses successfully
+        parsed = parseConfigurationResolution(outputsFile, true)
     }
-    def result = parseConfigurationResolution(outputsFile)
-    return result
+    return parsed
 }
 
 // Computes a unique string from a Configuration based on its dependencies
diff --git a/buildSrc/build_dependencies.gradle b/buildSrc/build_dependencies.gradle
deleted file mode 100644
index 1b61f83..0000000
--- a/buildSrc/build_dependencies.gradle
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-def build_versions = [:]
-
-build_versions.studio = new Properties()
-new File(buildscript.sourceFile.parentFile, "studio_versions.properties").withInputStream { build_versions.studio.load(it) }
-
-build_versions.agp = build_versions.studio["agp"]
-build_versions.lint = build_versions.studio["lint"]
-
-build_versions.kotlin = "1.4.32"
-build_versions.kotlin_coroutines = "1.4.3"
-build_versions.ksp = "1.4.32-1.0.0-alpha07"
-
-build_versions.hilt = "2.34-beta"
-
-def agpOverride = System.getenv("GRADLE_PLUGIN_VERSION")
-if (agpOverride != null) {
-    logger.warn("Using custom version ${agpOverride} of AGP due to GRADLE_PLUGIN_VERSION being set.")
-    build_versions.agp = agpOverride
-}
-
-// gets the version of Dokka defined in source
-def getSourceDokkaVersion() {
-    def dokkaProps = new Properties()
-    FileInputStream f = new FileInputStream(project.file("${project.ext.supportRootFolder}/../../external/dokka/gradle.properties"))
-    dokkaProps.load(f)
-    f.close()
-
-    return dokkaProps["dokka_version"]
-}
-
-if (System.getenv("BUILD_DOKKA") != null) {
-    build_versions.dokka = getSourceDokkaVersion()
-} else {
-    build_versions.dokka = "0.9.17-g013"
-}
-
-rootProject.ext["build_versions"] = build_versions
-
-def build_libs = [:]
-
-build_libs.agp = "com.android.tools.build:gradle:${build_versions.agp}"
-
-build_libs.lint = [
-    core: "com.android.tools.lint:lint:${build_versions.lint}",
-    api: "com.android.tools.lint:lint-api:${build_versions.lint}",
-    tests: "com.android.tools.lint:lint-tests:${build_versions.lint}"
-]
-
-build_libs.kotlin = [
-    stdlib: "org.jetbrains.kotlin:kotlin-stdlib:${build_versions.kotlin}",
-    gradle_plugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:${build_versions.kotlin}",
-    ksp_gradle_plugin: "com.google.devtools.ksp:symbol-processing-gradle-plugin:${build_versions.ksp}"
-]
-build_libs.dex_member_list = "com.jakewharton.dex:dex-member-list:4.1.1"
-build_libs.dokka_gradle = [
-    "org.jetbrains.dokka:dokka-android-gradle-plugin:${build_versions.dokka}",
-]
-build_libs.kotlinpoet = "com.squareup:kotlinpoet:1.4.0"
-
-build_libs.hilt_plugin = "com.google.dagger:hilt-android-gradle-plugin:${build_versions.hilt}"
-
-rootProject.ext["build_libs"] = build_libs
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 0eb002e..23c0358 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 // Add ext.libs for library versions
-def libs = [:]
+def excludes = [:]
 
-libs.exclude_bytebuddy = {
+excludes.bytebuddy = {
     exclude group: "net.bytebuddy"
 }
 
-libs.exclude_for_espresso = {
+excludes.espresso = {
     exclude group: "androidx.annotation"
     exclude group: "androidx.appcompat"
     exclude group: "androidx.recyclerview"
@@ -31,4 +31,4 @@
     exclude group: "androidx.core"
 }
 
-rootProject.ext["libs"] = libs
+rootProject.ext["excludes"] = excludes
diff --git a/buildSrc/settings.gradle b/buildSrc/settings.gradle
index 9849f62..c613f21 100644
--- a/buildSrc/settings.gradle
+++ b/buildSrc/settings.gradle
@@ -15,3 +15,18 @@
  */
 
 include ":jetpad-integration"
+
+enableFeaturePreview("VERSION_CATALOGS")
+
+dependencyResolutionManagement {
+    versionCatalogs {
+        libs {
+            from(files("../gradle/libs.versions.toml"))
+            def agpOverride = System.getenv("GRADLE_PLUGIN_VERSION")
+            if (agpOverride != null) {
+                logger.warn("Using custom version ${agpOverride} of AGP due to GRADLE_PLUGIN_VERSION being set.")
+                version('androidGradlePlugin', agpOverride)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/AgpExtensions.kt b/buildSrc/src/main/kotlin/androidx/build/AgpExtensions.kt
index a0bf93c..be89926 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AgpExtensions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AgpExtensions.kt
@@ -21,6 +21,7 @@
 import com.android.build.gradle.LibraryExtension
 import com.android.build.gradle.api.BaseVariant
 import org.gradle.api.DomainObjectSet
+import org.gradle.api.Project
 
 val BaseExtension.variants: DomainObjectSet<out BaseVariant>
     get() = when (this) {
@@ -28,3 +29,11 @@
         is LibraryExtension -> libraryVariants
         else -> error("Unhandled plugin ${this::class.java}")
     }
+
+val Project.agpVariants: DomainObjectSet<out BaseVariant>
+    get() {
+        val extension = checkNotNull(project.extensions.findByType(BaseExtension::class.java)) {
+            "${project.name} has no BaseExtension"
+        }
+        return extension.variants
+    }
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
index b8a6a40..ea6c673 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
@@ -132,7 +132,7 @@
             }
             // TODO: rework this to use LibraryType. Fork Library and KolinOnlyLibrary?
             if (project.path.contains("-ktx")) return false
-            if (project.path.startsWith(":compose")) return false
+            if (project.path.contains("compose")) return false
             if (project.path.startsWith(":ui")) return false
             return field
         }
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
index f5146b1885..c7eda52 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
@@ -111,6 +111,12 @@
  */
 const val VALIDATE_NO_UNRECOGNIZED_MESSAGES = "androidx.validateNoUnrecognizedMessages"
 
+/**
+ * Specifies to run the build twice and validate that the second build doesn't run more
+ * tasks than expected.
+ */
+const val VERIFY_UP_TO_DATE = "androidx.verifyUpToDate"
+
 const val EXPERIMENTAL_KOTLIN_BACKEND_ENABLED = "androidx.experimentalKotlinBackendEnabled"
 
 val ALL_ANDROIDX_PROPERTIES = setOf(
@@ -127,11 +133,9 @@
     USE_MAX_DEP_VERSIONS,
     TEST_FAILURES_DO_NOT_FAIL_TEST_TASK,
     VALIDATE_NO_UNRECOGNIZED_MESSAGES,
+    VERIFY_UP_TO_DATE,
     WRITE_VERSIONED_API_FILES,
-    AffectedModuleDetector.CHANGED_PROJECTS_ARG,
     AffectedModuleDetector.ENABLE_ARG,
-    AffectedModuleDetector.DEPENDENT_PROJECTS_ARG,
-    AffectedModuleDetector.CHANGED_PROJECTS_ARG,
     AffectedModuleDetector.BASE_COMMIT_ARG,
     PLAYGROUND_SNAPSHOT_BUILD_ID,
     PLAYGROUND_METALAVA_BUILD_ID,
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
index ebf8a0b..e229ac9 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlaygroundRootPlugin.kt
@@ -17,7 +17,11 @@
 package androidx.build
 
 import androidx.build.AndroidXRootPlugin.Companion.PROJECT_OR_ARTIFACT_EXT_NAME
+import androidx.build.ftl.FirebaseTestLabHelper
+import androidx.build.gradle.getByType
 import androidx.build.gradle.isRoot
+import com.android.build.gradle.LibraryExtension
+import com.android.build.gradle.LibraryPlugin
 import groovy.xml.DOMBuilder
 import org.gradle.api.GradleException
 import org.gradle.api.Plugin
@@ -67,12 +71,38 @@
         config = PlaygroundProperties.load(rootProject)
         repos = PlaygroundRepositories(config)
         rootProject.repositories.addPlaygroundRepositories()
+        val ftlUtilities = FirebaseTestLabHelper(target)
         rootProject.subprojects {
-            configureSubProject(it)
+            configureSubProject(it, ftlUtilities)
+        }
+
+        // TODO(b/185539993): Re-enable InvalidFragmentVersionForActivityResult which was
+        //  temporarily disabled for navigation-dynamic-features-fragment since it depends on an old
+        //  (stable) version of activity, which doesn't include aosp/1670206, allowing use of
+        //  Fragment 1.4.x.
+        target.findProject(":navigation:navigation-dynamic-features-fragment")
+            ?.disableInvalidFragmentVersionForActivityResultLint()
+    }
+
+    private fun Project.disableInvalidFragmentVersionForActivityResultLint() {
+        plugins.all { plugin ->
+            when (plugin) {
+                is LibraryPlugin -> {
+                    val libraryExtension = extensions.getByType<LibraryExtension>()
+                    afterEvaluate {
+                        libraryExtension.lintOptions.apply {
+                            disable("InvalidFragmentVersionForActivityResult")
+                        }
+                    }
+                }
+            }
         }
     }
 
-    private fun configureSubProject(project: Project) {
+    private fun configureSubProject(
+        project: Project,
+        firebaseTestLabHelper: FirebaseTestLabHelper
+    ) {
         project.repositories.addPlaygroundRepositories()
         project.extra.set(PROJECT_OR_ARTIFACT_EXT_NAME, projectOrArtifactClosure)
         project.configurations.all { configuration ->
@@ -80,6 +110,7 @@
                 substitution.replaceIfSnapshot()
             }
         }
+        firebaseTestLabHelper.setupFTL(project)
     }
 
     /**
@@ -174,6 +205,7 @@
         }
         google()
         mavenCentral()
+        @Suppress("DEPRECATION") // b/181908259
         jcenter()
     }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index d417f2c..1259191 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -451,10 +451,6 @@
 
         project.configureErrorProneForAndroid(variants)
 
-        // Set the officially published version to be the debug version with minimum dependency
-        // versions.
-        defaultPublishConfig(Release.DEFAULT_PUBLISH_CONFIG)
-
         // workaround for b/120487939
         project.configurations.all { configuration ->
             // Gradle seems to crash on androidtest configurations
@@ -466,6 +462,7 @@
 
         if (project.isCoverageEnabled()) {
             Jacoco.registerClassFilesTask(project, this)
+            Jacoco.registerAgentPropertiesFilesGenerateTask(project, this)
         }
 
         project.configureTestConfigGeneration(this)
@@ -673,9 +670,9 @@
         const val EXTENSION_NAME = "androidx"
 
         /**
-         * Fail the build if a non-Studio task runs for more than 30 minutes.
+         * Fail the build if a non-Studio task runs longer than expected
          */
-        const val TASK_TIMEOUT_MINUTES = 30L
+        const val TASK_TIMEOUT_MINUTES = 45L
     }
 }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
index 471adb5..6d4a197 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
@@ -27,10 +27,11 @@
 import androidx.build.uptodatedness.TaskUpToDateValidator
 import com.android.build.gradle.api.AndroidBasePlugin
 import com.android.build.gradle.internal.tasks.factory.dependsOn
+import org.gradle.api.GradleException
 import org.gradle.api.Plugin
 import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
 import org.gradle.api.artifacts.component.ModuleComponentSelector
-import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.plugins.JavaPlugin
 import org.gradle.api.tasks.bundling.Zip
 import org.gradle.api.tasks.bundling.ZipEntryCompression
@@ -81,6 +82,15 @@
         if (partiallyDejetifyArchiveTask != null)
             buildOnServerTask.dependsOn(partiallyDejetifyArchiveTask)
 
+        buildOnServerTask.dependsOn(
+            tasks.register(
+                "saveSystemStats",
+                SaveSystemStatsTask::class.java
+            ) { task ->
+                task.outputFile.set(File(project.getDistributionDirectory(), "system_stats.txt"))
+            }
+        )
+
         extra.set("projects", ConcurrentHashMap<String, String>())
         buildOnServerTask.dependsOn(tasks.named(CheckExternalDependencyLicensesTask.TASK_NAME))
         // Anchor task that invokes running all subprojects :validateProperties tasks which ensure that
@@ -102,10 +112,18 @@
                 )
             )
             project.plugins.withType(AndroidBasePlugin::class.java) {
-                buildOnServerTask.dependsOn("${project.path}:assembleDebug")
-                buildOnServerTask.dependsOn("${project.path}:assembleAndroidTest")
+                buildOnServerTask.dependsOn("${project.path}:assembleRelease")
                 if (!project.usingMaxDepVersions()) {
-                    buildOnServerTask.dependsOn("${project.path}:lintDebug")
+                    project.afterEvaluate {
+                        project.agpVariants.all { variant ->
+                            // in AndroidX, release and debug variants are essentially the same,
+                            // so we don't run the lintRelease task on the build server
+                            if (!variant.name.toLowerCase().contains("release")) {
+                                val taskName = "lint${variant.name.capitalize()}"
+                                buildOnServerTask.dependsOn("${project.path}:$taskName")
+                            }
+                        }
+                    }
                 }
             }
             project.plugins.withType(JavaPlugin::class.java) {
@@ -141,7 +159,7 @@
             buildOnServerTask.dependsOn(Jacoco.createUberJarTask(this))
         }
 
-        val zipTestConfigsWithApks = project.tasks.register(
+        project.tasks.register(
             ZIP_TEST_CONFIGS_WITH_APKS_TASK, Zip::class.java
         ) {
             it.destinationDirectory.set(project.getDistributionDirectory())
@@ -150,7 +168,7 @@
             // We're mostly zipping a bunch of .apk files that are already compressed
             it.entryCompression = ZipEntryCompression.STORED
         }
-        val zipConstrainedTestConfigsWithApks = project.tasks.register(
+        project.tasks.register(
             ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK, Zip::class.java
         ) {
             it.destinationDirectory.set(project.getDistributionDirectory())
@@ -159,11 +177,12 @@
             // We're mostly zipping a bunch of .apk files that are already compressed
             it.entryCompression = ZipEntryCompression.STORED
         }
-        buildOnServerTask.dependsOn(zipTestConfigsWithApks)
-        buildOnServerTask.dependsOn(zipConstrainedTestConfigsWithApks)
 
         AffectedModuleDetector.configure(gradle, this)
 
+        // Needs to be called before evaluationDependsOnChildren in usingMaxDepVersions block
+        publishInspectionArtifacts()
+
         // If useMaxDepVersions is set, iterate through all the project and substitute any androidx
         // artifact dependency with the local tip of tree version of the library.
         if (project.usingMaxDepVersions()) {
@@ -215,22 +234,26 @@
             task.setOutput(File(project.getDistributionDirectory(), "task_outputs.txt"))
             task.removePrefix(project.getCheckoutRoot().path)
         }
-        publishInspectionArtifacts()
     }
 
+    @Suppress("UnstableApiUsage")
     private fun Project.setDependencyVersions() {
-        val buildVersions = (project.rootProject.property("ext") as ExtraPropertiesExtension)
-            .let { it.get("build_versions") as Map<*, *> }
-
-        fun getVersion(key: String) = checkNotNull(buildVersions[key]) {
-            "Could not find a version for `$key`"
-        }.toString()
-
+        val libs = project.extensions.getByType(
+            VersionCatalogsExtension::class.java
+        ).find("libs").get()
+        fun getVersion(key: String): String {
+            val version = libs.findVersion(key)
+            return if (version.isPresent) {
+                version.get().requiredVersion
+            } else {
+                throw GradleException("Could not find a version for `$key`")
+            }
+        }
         androidx.build.dependencies.kotlinVersion = getVersion("kotlin")
-        androidx.build.dependencies.kotlinCoroutinesVersion = getVersion("kotlin_coroutines")
+        androidx.build.dependencies.kotlinCoroutinesVersion = getVersion("kotlinCoroutines")
         androidx.build.dependencies.kspVersion = getVersion("ksp")
-        androidx.build.dependencies.agpVersion = getVersion("agp")
-        androidx.build.dependencies.lintVersion = getVersion("lint")
+        androidx.build.dependencies.agpVersion = getVersion("androidGradlePlugin")
+        androidx.build.dependencies.lintVersion = getVersion("androidLint")
         androidx.build.dependencies.hiltVersion = getVersion("hilt")
     }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
index faec2e5..f0f382f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXUiPlugin.kt
@@ -113,9 +113,16 @@
             return properties.get(COMPOSE_MPP_ENABLED)?.toString()?.toBoolean() ?: false
         }
 
+        /**
+         * @param isMultiplatformEnabled whether this module has a corresponding
+         * multiplatform configuration, or whether it is Android only
+         */
         @JvmStatic
-        fun Project.applyAndConfigureKotlinPlugin() {
-            if (isMultiplatformEnabled()) {
+        @JvmOverloads
+        fun Project.applyAndConfigureKotlinPlugin(
+            isMultiplatformEnabled: Boolean = isMultiplatformEnabled()
+        ) {
+            if (isMultiplatformEnabled) {
                 apply(plugin = "kotlin-multiplatform")
             } else {
                 apply(plugin = "org.jetbrains.kotlin.android")
@@ -123,7 +130,7 @@
 
             configureManifests()
             configureForKotlinMultiplatformSourceStructure()
-            if (isMultiplatformEnabled()) {
+            if (isMultiplatformEnabled) {
                 configureForMultiplatform()
             }
 
@@ -238,6 +245,7 @@
                         "src/commonMain/resources",
                         "src/androidMain/res"
                     )
+                    assets.srcDirs("src/androidMain/assets")
 
                     // Keep Kotlin files in java source sets so the source set is not empty when
                     // running unit tests which would prevent the tests from running in CI.
@@ -254,6 +262,7 @@
                 sourceSets.findByName("androidTest")?.apply {
                     java.srcDirs("src/androidAndroidTest/kotlin")
                     res.srcDirs("src/androidAndroidTest/res")
+                    assets.srcDirs("src/androidAndroidTest/assets")
 
                     // Keep Kotlin files in java source sets so the source set is not empty when
                     // running unit tests which would prevent the tests from running in CI.
diff --git a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
index 5cc80d4..259ef1f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
@@ -35,6 +35,20 @@
 }
 
 /**
+ * Gets set to true when the build id is prefixed with P.
+ *
+ * In AffectedModuleDetector, we return a different ProjectSubset in presubmit vs.
+ * postsubmit, to get the desired test behaviors.
+ */
+fun isPresubmitBuild(): Boolean {
+    return if (System.getenv("BUILD_NUMBER") != null) {
+        System.getenv("BUILD_NUMBER").startsWith("P")
+    } else {
+        false
+    }
+}
+
+/**
  * The DIST_DIR is where you want to save things from the build. The build server will copy
  * the contents of DIST_DIR to somewhere and make it available.
  */
diff --git a/buildSrc/src/main/kotlin/androidx/build/BundleInsideHelper.kt b/buildSrc/src/main/kotlin/androidx/build/BundleInsideHelper.kt
index 7d9d5d0..fb2a49d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/BundleInsideHelper.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/BundleInsideHelper.kt
@@ -20,7 +20,6 @@
 import org.gradle.api.Project
 import org.gradle.api.artifacts.Configuration
 import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.compile.JavaCompile
 import org.gradle.jvm.tasks.Jar
 import java.io.File
 
@@ -29,6 +28,30 @@
  */
 object BundleInsideHelper {
     /**
+     * Creates a configuration for the users to use that will be used to bundle these dependency
+     * jars inside of libs/ directory inside of the aar.
+     *
+     * ```
+     * dependencies {
+     *   bundleInside(project(":foo"))
+     * }
+     * ```
+     *
+     * Used project are expected
+     *
+     * @see forInsideAar(String, String)
+     *
+     * @receiver the project that should bundle jars specified by this configuration
+     * @param relocations a list of package relocations to apply
+     */
+    @JvmStatic
+    fun Project.forInsideAar(relocations: List<Relocation>) {
+        val bundle = configurations.create("bundleInside")
+        val repackage = configureRepackageTaskForType(relocations, bundle)
+        // Add to AGP's configuration so this jar get packaged inside of the aar.
+        dependencies.add("implementation", files(repackage.flatMap { it.archiveFile }))
+    }
+    /**
      * Creates 3 configurations for the users to use that will be used bundle these dependency
      * jars inside of libs/ directory inside of the aar.
      *
@@ -46,28 +69,7 @@
      */
     @JvmStatic
     fun Project.forInsideAar(from: String, to: String) {
-        val bundle = configurations.create("bundleInside")
-        val bundleDebug = configurations.create("debugBundleInside") {
-            it.extendsFrom(bundle)
-        }
-        val bundleRelease = configurations.create("releaseBundleInside") {
-            it.extendsFrom(bundle)
-        }
-        val repackageRelease = configureRepackageTaskForType("Release", from, to, bundleRelease)
-        val repackageDebug = configureRepackageTaskForType("Debug", from, to, bundleDebug)
-
-        // Add to AGP's configurations so these jars get packaged inside of the aar.
-        dependencies.add(
-            "releaseImplementation",
-            files(repackageRelease.flatMap { it.archiveFile })
-        )
-        dependencies.add("debugImplementation", files(repackageDebug.flatMap { it.archiveFile }))
-
-        // Android lint is silly (b/173445333), force build both debug and release
-        tasks.withType(JavaCompile::class.java).configureEach { task ->
-            task.dependsOn(repackageDebug)
-            task.dependsOn(repackageRelease)
-        }
+        forInsideAar(listOf(Relocation(from, to)))
     }
 
     /**
@@ -88,7 +90,10 @@
     @JvmStatic
     fun Project.forInsideJar(from: String, to: String) {
         val bundle = configurations.create("bundleInside")
-        val repackage = configureRepackageTaskForType("jar", from, to, bundle)
+        val repackage = configureRepackageTaskForType(
+            listOf(Relocation(from, to)),
+            bundle
+        )
         dependencies.add("compileOnly", files(repackage.flatMap { it.archiveFile }))
         dependencies.add("testImplementation", files(repackage.flatMap { it.archiveFile }))
 
@@ -165,20 +170,22 @@
         }
     }
 
+    data class Relocation(val from: String, val to: String)
+
     private fun Project.configureRepackageTaskForType(
-        type: String,
-        from: String,
-        to: String,
+        relocations: List<Relocation>,
         configuration: Configuration
     ): TaskProvider<ShadowJar> {
         return tasks.register(
-            "repackageBundledJars$type",
+            "repackageBundledJars",
             ShadowJar::class.java
         ) { task ->
             task.apply {
                 configurations = listOf(configuration)
-                relocate(from, to)
-                archiveBaseName.set("repackaged-$type")
+                for (relocation in relocations) {
+                    relocate(relocation.from, relocation.to)
+                }
+                archiveBaseName.set("repackaged")
                 archiveVersion.set("")
                 destinationDirectory.set(File(buildDir, "repackaged"))
             }
diff --git a/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
index 4e99f61..c42f8b5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/ErrorProneConfiguration.kt
@@ -65,7 +65,7 @@
     val errorProneConfiguration = createErrorProneConfiguration()
     variants.all { variant ->
         // Using getName() instead of name due to b/150427408
-        if (variant.buildType.getName() == BuilderConstants.DEBUG) {
+        if (variant.buildType.getName() == BuilderConstants.RELEASE) {
             val task = variant.javaCompileProvider
             (variant as BaseVariant).annotationProcessorConfiguration.extendsFrom(
                 errorProneConfiguration
diff --git a/buildSrc/src/main/kotlin/androidx/build/InspectionRelease.kt b/buildSrc/src/main/kotlin/androidx/build/InspectionRelease.kt
index 5d0e88e..dadf341 100644
--- a/buildSrc/src/main/kotlin/androidx/build/InspectionRelease.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/InspectionRelease.kt
@@ -16,28 +16,30 @@
 
 package androidx.build
 
-import androidx.inspection.gradle.DexInspectorTask
 import androidx.inspection.gradle.InspectionPlugin
+import androidx.inspection.gradle.createConsumeInspectionConfiguration
 import org.gradle.api.Project
-import org.gradle.api.tasks.Copy
+import org.gradle.api.tasks.Sync
 import java.io.File
 
 /**
  * Copies artifacts prepared by InspectionPlugin into $destDir/inspection
  */
 fun Project.publishInspectionArtifacts() {
-    val copy = tasks.register("copyInspectionArtifacts", Copy::class.java) {
-        it.destinationDir = File(getDistributionDirectory(), "inspection")
-    }
-    addToBuildOnServer(copy)
+    val configuration = createConsumeInspectionConfiguration()
+    val topLevelProject = this
     subprojects { project ->
-        project.plugins.withType(InspectionPlugin::class.java) {
-            project.tasks.withType(DexInspectorTask::class.java) { inspectionTask ->
-                copy.configure {
-                    it.from(inspectionTask.outputFile)
-                    it.dependsOn(inspectionTask)
-                }
+        project.afterEvaluate {
+            if (project.plugins.hasPlugin(InspectionPlugin::class.java)) {
+                topLevelProject.dependencies.add(configuration.name, project)
             }
         }
     }
+
+    val sync = tasks.register("copyInspectionArtifacts", Sync::class.java) {
+        it.dependsOn(configuration)
+        it.from(configuration)
+        it.destinationDir = File(getDistributionDirectory(), "inspection")
+    }
+    addToBuildOnServer(sync)
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
index 5ed7290..4ce2920 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -53,6 +53,7 @@
     val EXIFINTERFACE = LibraryGroup("androidx.exifinterface", LibraryVersions.EXIFINTERFACE)
     val FRAGMENT = LibraryGroup("androidx.fragment", LibraryVersions.FRAGMENT)
     val GRIDLAYOUT = LibraryGroup("androidx.gridlayout", LibraryVersions.GRIDLAYOUT)
+    val HEALTH = LibraryGroup("androidx.health", null)
     val HEIFWRITER = LibraryGroup("androidx.heifwriter", LibraryVersions.HEIFWRITER)
     val HILT = LibraryGroup("androidx.hilt", null)
     val INSPECTION = LibraryGroup("androidx.inspection", LibraryVersions.INSPECTION)
@@ -73,6 +74,7 @@
     val PERCENTLAYOUT = LibraryGroup("androidx.percentlayout", LibraryVersions.PERCENTLAYOUT)
     val PREFERENCE = LibraryGroup("androidx.preference", LibraryVersions.PREFERENCE)
     val PRINT = LibraryGroup("androidx.print", LibraryVersions.PRINT)
+    val PROFILEINSTALLER = LibraryGroup("androidx.profileinstaller", LibraryVersions.PROFILEINSTALLER)
     val RECOMMENDATION = LibraryGroup("androidx.recommendation", LibraryVersions.RECOMMENDATION)
     val RECYCLERVIEW = LibraryGroup("androidx.recyclerview", null)
     val REMOTECALLBACK = LibraryGroup("androidx.remotecallback", LibraryVersions.REMOTECALLBACK)
@@ -98,6 +100,7 @@
     val VIEWPAGER = LibraryGroup("androidx.viewpager", LibraryVersions.VIEWPAGER)
     val VIEWPAGER2 = LibraryGroup("androidx.viewpager2", LibraryVersions.VIEWPAGER2)
     val WEAR = LibraryGroup("androidx.wear", null)
+    val WEAR_COMPOSE = LibraryGroup("androidx.wear.compose", LibraryVersions.WEAR_COMPOSE)
     val WEAR_TILES = LibraryGroup("androidx.wear.tiles", LibraryVersions.WEAR_TILES)
     val WEBKIT = LibraryGroup("androidx.webkit", LibraryVersions.WEBKIT)
     val WINDOW = LibraryGroup("androidx.window", null)
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 553a9f1..b238e0c 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -20,8 +20,8 @@
  * The list of versions codes of all the libraries in this project.
  */
 object LibraryVersions {
-    val ACTIVITY = Version("1.3.0-alpha07")
-    val ADS_IDENTIFIER = Version("1.0.0-alpha04")
+    val ACTIVITY = Version("1.3.0-alpha08")
+    val ADS_IDENTIFIER = Version("1.0.0-alpha05")
     val ANNOTATION = Version("1.3.0-alpha01")
     val ANNOTATION_EXPERIMENTAL = Version("1.2.0-alpha01")
     val APPCOMPAT = Version("1.4.0-alpha01")
@@ -30,34 +30,33 @@
     val ARCH_CORE_TESTING = ARCH_CORE
     val ARCH_RUNTIME = Version("2.2.0-alpha01")
     val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
-    val AUTOFILL = Version("1.2.0-alpha01")
+    val AUTOFILL = Version("1.2.0-alpha02")
     val BENCHMARK = Version("1.1.0-alpha02")
     val BIOMETRIC = Version("1.2.0-alpha03")
     val BROWSER = Version("1.4.0-alpha01")
     val BUILDSRC_TESTS = Version("1.0.0-alpha01")
-    val CAMERA = Version("1.1.0-alpha04")
-    val CAMERA_EXTENSIONS = Version("1.0.0-alpha24")
+    val CAMERA = Version("1.1.0-alpha05")
+    val CAMERA_EXTENSIONS = Version("1.0.0-alpha25")
     val CAMERA_PIPE = Version("1.0.0-alpha01")
     val CAMERA_VIDEO = Version("1.0.0-alpha01")
-    val CAMERA_VIEW = Version("1.0.0-alpha24")
+    val CAMERA_VIEW = Version("1.0.0-alpha25")
     val CARDVIEW = Version("1.1.0-alpha01")
     val CAR_APP = Version("1.1.0-alpha01")
     // Pre-release before confirming to the same version as the rest of the CAR_APP library group.
     val CAR_APP_PRE_RELEASE = Version("1.0.0-alpha01")
     val COLLECTION = Version("1.2.0-alpha02")
     val CONTENTPAGER = Version("1.1.0-alpha01")
-    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-beta05")
-    val COMPOSE_DESKTOP = Version("1.0.0-alpha01")
+    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-beta07")
     val COORDINATORLAYOUT = Version("1.2.0-alpha01")
-    val CORE = Version("1.6.0-alpha02")
+    val CORE = Version("1.6.0-beta01")
     val CORE_ANIMATION = Version("1.0.0-alpha03")
     val CORE_ANIMATION_TESTING = Version("1.0.0-alpha03")
     val CORE_APPDIGEST = Version("1.0.0-alpha01")
-    val CORE_GOOGLE_SHORTCUTS = Version("1.0.0-alpha02")
+    val CORE_GOOGLE_SHORTCUTS = Version("1.0.0-beta01")
     val CORE_ROLE = Version("1.1.0-alpha02")
     val CURSORADAPTER = Version("1.1.0-alpha01")
     val CUSTOMVIEW = Version("1.2.0-alpha01")
-    val DATASTORE = Version("1.0.0-beta01")
+    val DATASTORE = Version("1.0.0-beta02")
     val DOCUMENTFILE = Version("1.1.0-alpha01")
     val DRAWERLAYOUT = Version("1.2.0-alpha01")
     val DYNAMICANIMATION = Version("1.1.0-alpha04")
@@ -69,8 +68,9 @@
     val FRAGMENT = Version("1.4.0-alpha01")
     val FUTURES = Version("1.2.0-alpha01")
     val GRIDLAYOUT = Version("1.1.0-alpha01")
+    val HEALTH_SERVICES_CLIENT = Version("1.0.0-alpha01")
     val HEIFWRITER = Version("1.1.0-alpha02")
-    val HILT = Version("1.0.0-beta01")
+    val HILT = Version("1.1.0-alpha01")
     val HILT_NAVIGATION_COMPOSE = Version("1.0.0-alpha02")
     val INSPECTION = Version("1.0.0")
     val INTERPOLATOR = Version("1.1.0-alpha01")
@@ -82,28 +82,29 @@
     val LEGACY = Version("1.1.0-alpha01")
     val LOCALBROADCASTMANAGER = Version("1.1.0-alpha02")
     val LIFECYCLE = Version("2.4.0-alpha01")
-    val LIFECYCLE_VIEWMODEL_COMPOSE = Version("1.0.0-alpha04")
+    val LIFECYCLE_VIEWMODEL_COMPOSE = Version("1.0.0-alpha05")
     val LIFECYCLE_EXTENSIONS = Version("2.2.0")
     val LOADER = Version("1.2.0-alpha01")
-    val MEDIA = Version("1.4.0-alpha01")
-    val MEDIA2 = Version("1.2.0-alpha01")
-    val MEDIAROUTER = Version("1.3.0-alpha01")
+    val MEDIA = Version("1.4.0-alpha02")
+    val MEDIA2 = Version("1.2.0-alpha02")
+    val MEDIAROUTER = Version("1.3.0-alpha02")
     val NAVIGATION = Version("2.4.0-alpha01")
     val PAGING = Version("3.1.0-alpha01")
-    val PAGING_COMPOSE = Version("1.0.0-alpha08")
+    val PAGING_COMPOSE = Version("1.0.0-alpha09")
     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.0.0-alpha01")
     val RECOMMENDATION = Version("1.1.0-alpha01")
     val RECYCLERVIEW = Version("1.3.0-alpha01")
-    val RECYCLERVIEW_SELECTION = Version("2.0.0-alpha01")
+    val RECYCLERVIEW_SELECTION = Version("1.2.0-alpha02")
     val REMOTECALLBACK = Version("1.0.0-alpha02")
     val RESOURCEINSPECTION = Version("1.0.0-alpha01")
-    val ROOM = Version("2.4.0-alpha01")
+    val ROOM = Version("2.4.0-alpha03")
     val SAVEDSTATE = Version("1.2.0-alpha01")
     val SECURITY = Version("1.1.0-alpha03")
-    val SECURITY_APP_AUTHENTICATOR = Version("1.0.0-alpha01")
+    val SECURITY_APP_AUTHENTICATOR = Version("1.0.0-alpha02")
     val SECURITY_BIOMETRIC = Version("1.0.0-alpha01")
     val SECURITY_IDENTITY_CREDENTIAL = Version("1.0.0-alpha02")
     val SHARETARGET = Version("1.2.0-alpha01")
@@ -111,8 +112,8 @@
     val SLICE_BENCHMARK = Version("1.1.0-alpha02")
     val SLICE_BUILDERS_KTX = Version("1.0.0-alpha08")
     val SLICE_REMOTECALLBACK = Version("1.0.0-alpha01")
-    val SLIDINGPANELAYOUT = Version("1.2.0-alpha01")
-    val STARTUP = Version("1.1.0-alpha02")
+    val SLIDINGPANELAYOUT = Version("1.2.0-alpha03")
+    val STARTUP = Version("1.1.0-beta01")
     val SQLITE = Version("2.2.0-alpha01")
     val SQLITE_INSPECTOR = Version("2.1.0-alpha01")
     val SWIPEREFRESHLAYOUT = Version("1.2.0-alpha01")
@@ -128,25 +129,26 @@
     val VERSIONED_PARCELABLE = Version("1.2.0-alpha01")
     val VIEWPAGER = Version("1.1.0-alpha01")
     val VIEWPAGER2 = Version("1.1.0-alpha02")
-    val WEAR = Version("1.2.0-alpha08")
-    val WEAR_COMPLICATIONS_DATA = Version("1.0.0-alpha12")
-    val WEAR_COMPLICATIONS_PROVIDER = Version("1.0.0-alpha12")
+    val WEAR = Version("1.2.0-alpha09")
+    val WEAR_COMPLICATIONS_DATA = Version("1.0.0-alpha14")
+    val WEAR_COMPLICATIONS_PROVIDER = Version("1.0.0-alpha14")
+    val WEAR_COMPOSE = Version("1.0.0-alpha01")
     val WEAR_INPUT = Version("1.1.0-alpha02")
     val WEAR_INPUT_TESTING = WEAR_INPUT
-    val WEAR_ONGOING = Version("1.0.0-alpha04")
+    val WEAR_ONGOING = Version("1.0.0-alpha05")
     val WEAR_PHONE_INTERACTIONS = Version("1.0.0-alpha05")
     val WEAR_REMOTE_INTERACTIONS = Version("1.0.0-alpha04")
-    val WEAR_TILES = Version("1.0.0-alpha03")
-    val WEAR_WATCHFACE = Version("1.0.0-alpha12")
-    val WEAR_WATCHFACE_CLIENT = Version("1.0.0-alpha12")
+    val WEAR_TILES = Version("1.0.0-alpha05")
+    val WEAR_WATCHFACE = Version("1.0.0-alpha14")
+    val WEAR_WATCHFACE_CLIENT = Version("1.0.0-alpha14")
     val WEAR_WATCHFACE_CLIENT_GUAVA = WEAR_WATCHFACE_CLIENT
-    val WEAR_WATCHFACE_COMPLICATIONS_RENDERING = Version("1.0.0-alpha12")
-    val WEAR_WATCHFACE_DATA = Version("1.0.0-alpha12")
-    val WEAR_WATCHFACE_EDITOR = Version("1.0.0-alpha12")
+    val WEAR_WATCHFACE_COMPLICATIONS_RENDERING = Version("1.0.0-alpha14")
+    val WEAR_WATCHFACE_DATA = Version("1.0.0-alpha14")
+    val WEAR_WATCHFACE_EDITOR = Version("1.0.0-alpha14")
     val WEAR_WATCHFACE_EDITOR_GUAVA = WEAR_WATCHFACE_EDITOR
-    val WEAR_WATCHFACE_STYLE = Version("1.0.0-alpha12")
+    val WEAR_WATCHFACE_STYLE = Version("1.0.0-alpha14")
     val WEBKIT = Version("1.5.0-alpha01")
-    val WINDOW = Version("1.0.0-alpha06")
+    val WINDOW = Version("1.0.0-alpha07")
     val WINDOW_EXTENSIONS = Version("1.0.0-alpha01")
     val WINDOW_SIDECAR = Version("0.1.0-alpha01")
     val WORK = Version("2.6.0-alpha02")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
index 6c4446d..08e2e98 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -56,14 +56,34 @@
 }
 
 fun Project.configureAndroidProjectForLint(lintOptions: LintOptions, extension: AndroidXExtension) {
+    project.afterEvaluate {
+        // makes sure that the lintDebug task will exist, so we can find it by name
+        setUpLintDebugIfNeeded()
+    }
     configureLint(lintOptions, extension)
     tasks.named("lint").configure { task ->
         // We already run lintDebug, we don't need to run lint which lints the release variant
         task.enabled = false
     }
     afterEvaluate {
-        tasks.named("lintDebug").configure { task ->
-            AffectedModuleDetector.configureTaskGuard(task)
+        for (variant in project.agpVariants) {
+            tasks.named("lint${variant.name.capitalize()}").configure { task ->
+                AffectedModuleDetector.configureTaskGuard(task)
+            }
+        }
+    }
+}
+
+private fun Project.setUpLintDebugIfNeeded() {
+    val variants = project.agpVariants
+    val variantNames = variants.map({ v -> v.name })
+    if (!variantNames.contains("debug")) {
+        tasks.register("lintDebug") {
+            for (variantName in variantNames) {
+                if (variantName.toLowerCase().contains("debug")) {
+                    it.dependsOn(tasks.named("lint${variantName.capitalize()}"))
+                }
+            }
         }
     }
 }
@@ -175,22 +195,41 @@
             // be able to burn down existing violations. That's hard to enforce, though, so we'll
             // generally allow teams to update their baseline files with a publicly-known flag.
             if (updateLintBaseline) {
-                // Continue generating baselines regardless of errors
+                // Continue generating baselines regardless of errors.
                 isAbortOnError = false
-                // Avoid printing every single lint error to the terminal
+                // Avoid printing every single lint error to the terminal.
                 textReport = false
-                val lintDebugTask = tasks.named("lintDebug")
-                lintDebugTask.configure {
-                    it.doFirst {
-                        lintBaseline.delete()
+
+                listOf(
+                    tasks.named("lintDebug"),
+                    tasks.named("lint"),
+                ).forEach { task ->
+                    task.configure {
+                        // Delete any existing baseline so that we clear old obsolete entries.
+                        it.doFirst {
+                            lintBaseline.delete()
+                        }
+
+                        // Delete empty generated baselines because they are annoying.
+                        it.doLast {
+                            if (lintBaseline.exists()) {
+                                val hasAnyIssues = lintBaseline.reader().useLines { lines ->
+                                    lines.any { line ->
+                                        line.endsWith("<issue")
+                                    }
+                                }
+                                if (!hasAnyIssues) {
+                                    // Using println is consistent with lint's own output.
+                                    println(
+                                        "Removed empty baseline file ${lintBaseline.absolutePath}"
+                                    )
+                                    lintBaseline.delete()
+                                }
+                            }
+                        }
                     }
                 }
-                val lintTask = tasks.named("lint")
-                lintTask.configure {
-                    it.doFirst {
-                        lintBaseline.delete()
-                    }
-                }
+
                 // Continue running after errors or after creating a new, blank baseline file.
                 System.setProperty(LINT_BASELINE_CONTINUE, "true")
             }
diff --git a/buildSrc/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt b/buildSrc/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
index 23be987..8e63c09 100644
--- a/buildSrc/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
@@ -118,7 +118,10 @@
     "desktopTestProcessResources",
     "processResources",
     "jvmProcessResources",
-    "desktopProcessResources"
+    "desktopProcessResources",
+    // https://github.com/square/wire/issues/1947
+    "generateDebugProtos",
+    "generateReleaseProtos",
 )
 
 // For this project and all subprojects, collects all tasks and creates a map keyed by their output files
diff --git a/buildSrc/src/main/kotlin/androidx/build/SaveSystemStatsTask.kt b/buildSrc/src/main/kotlin/androidx/build/SaveSystemStatsTask.kt
new file mode 100644
index 0000000..3e46290
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/SaveSystemStatsTask.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.build
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.TaskAction
+import java.io.File
+import java.lang.management.ManagementFactory
+import java.lang.Runtime
+import com.sun.management.OperatingSystemMXBean
+
+/**
+ * Saves system stats (cpu, memory) to a file
+ */
+abstract class SaveSystemStatsTask : DefaultTask() {
+    @Input
+    fun getNumProcessors(): Int {
+        return Runtime.getRuntime().availableProcessors()
+    }
+
+    @Input
+    fun getTotalMemory(): Long {
+        val bean = ManagementFactory.getOperatingSystemMXBean() as OperatingSystemMXBean
+        return bean.getTotalPhysicalMemorySize()
+    }
+
+    @OutputFile
+    val outputFile: Property<File> = project.objects.property(File::class.java)
+    @TaskAction
+    fun exec() {
+        val statsText = "num processors = ${getNumProcessors()}, total memory = ${getTotalMemory()}"
+        outputFile.get().writeText(statsText)
+    }
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/SdkResourceGenerator.kt b/buildSrc/src/main/kotlin/androidx/build/SdkResourceGenerator.kt
index 7a31911..5805bc6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SdkResourceGenerator.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SdkResourceGenerator.kt
@@ -121,6 +121,7 @@
                     }
             }
             project.tasks.named("compileTestJava").configure { it.dependsOn(provider) }
+            project.tasks.named("processTestResources").configure { it.dependsOn(provider) }
 
             val convention = project.convention.getPlugin<JavaPluginConvention>()
             val resources = convention.sourceSets.getByName("test").resources
diff --git a/buildSrc/src/main/kotlin/androidx/build/checkInvalidSuppress.kt b/buildSrc/src/main/kotlin/androidx/build/checkInvalidSuppress.kt
index a8da4d9..bb46d82 100644
--- a/buildSrc/src/main/kotlin/androidx/build/checkInvalidSuppress.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/checkInvalidSuppress.kt
@@ -22,7 +22,7 @@
 import org.gradle.api.tasks.Internal
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.options.Option
-import org.jetbrains.kotlin.konan.file.File
+import java.io.File
 
 // first level line filter - we ignore lines that don't contain the following for speed
 const val ROOT_MATCH = "noinspection"
@@ -80,10 +80,11 @@
                 continue
 
             // check file exists
-            if (!File(filename).exists)
+            val file = File(filename)
+            if (!file.exists())
                 continue
 
-            val lines = File(filename).readStrings()
+            val lines = file.readLines(Charsets.UTF_8).toMutableList()
             for ((i, line) in lines.withIndex()) {
                 if (line.contains(ROOT_MATCH)) {
                     val bad = getInvalidSuppression(line)
@@ -94,7 +95,7 @@
                             } else {
                                 lines[i] = line.replaceFirst(bad, MATCHERS[bad]!! + " // ")
                             }
-                            File(filename).writeLines(lines)
+                            file.writeText(lines.joinToString(System.lineSeparator()))
                         } else {
                             report += getReportForLine(filename, i, lines, MATCHERS[bad]!!)
                         }
diff --git a/buildSrc/src/main/kotlin/androidx/build/dackka/DackkaTask.kt b/buildSrc/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
index c73a6ac..3323df1 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
@@ -22,6 +22,7 @@
 import org.gradle.api.provider.ListProperty
 import org.gradle.api.provider.SetProperty
 import org.gradle.api.tasks.Classpath
+import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputFiles
 import org.gradle.api.tasks.OutputDirectory
 import org.gradle.api.tasks.TaskAction
@@ -40,6 +41,10 @@
     @get:Classpath
     abstract val dackkaClasspath: ConfigurableFileCollection
 
+    // Classpath containing dependencys of libraries needed to resolve types in docs
+    @InputFiles
+    lateinit var dependenciesClasspath: FileCollection
+
     // Directory containing the code samples
     @InputFiles
     lateinit var samplesDir: File
@@ -48,6 +53,14 @@
     @InputFiles
     lateinit var sourcesDir: File
 
+    // String representing names of .md files to be included in documentation
+    @Input
+    lateinit var includes: String
+
+    // Directory containing the docs project and package-lists
+    @InputFiles
+    lateinit var docsProjectDir: File
+
     // Location of generated reference docs
     @OutputDirectory
     lateinit var destinationDir: File
@@ -55,6 +68,25 @@
     // Documentation for Dackka command line usage and arguments can be found at
     // https://kotlin.github.io/dokka/1.4.0/user_guide/cli/usage/
     private fun computeArguments(): List<String> {
+
+        // path comes with colons but dokka expects a semicolon delimited string
+        val classPath = dependenciesClasspath.asPath.replace(':', ';')
+
+        var linksConfiguration = ""
+        mapOf(
+            "coroutinesCore"
+                to "https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core",
+            "android" to "https://developer.android.com/reference",
+            "guava" to "https://guava.dev/releases/18.0/api/docs/",
+            "kotlin" to "https://kotlinlang.org/api/latest/jvm/stdlib/"
+        ).map {
+            // Dokka sets this format: url^packageListUrl^^url2...
+            linksConfiguration +=
+                "${it.value}^${docsProjectDir.toPath()}/package-lists/${it.key}/package-list^^"
+        }
+
+        val includesString = if (includes.isNotEmpty()) { "-includes $includes" } else { "" }
+
         return listOf(
 
             // moduleName arg needs to be present but is not used the generated docs
@@ -66,10 +98,14 @@
             "-outputDir",
             "$destinationDir",
 
+            // links to external types
+            "-globalLinks",
+            linksConfiguration,
+
             // Configuration of sources. The generated string looks like this:
             // "-sourceSet -src /path/to/src -samples /path/to/samples ..."
             "-sourceSet",
-            "-src $sourcesDir -samples $samplesDir"
+            "-src $sourcesDir -samples $samplesDir -classpath $classPath $includesString"
         )
     }
 
@@ -106,7 +142,6 @@
         execOperations.javaexec {
             it.args = parameters.args.get()
             it.classpath(parameters.classpath.get())
-
             // b/183989795 tracks moving this away from an environment variable
             it.environment("DEVSITE_TENANT", "androidx")
         }
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index 7f7d4eb5..86c78f0 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -39,8 +39,8 @@
 const val CHECKER_FRAMEWORK = "org.checkerframework:checker-qual:2.5.3"
 const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:2.0.1@aar"
 const val CONSTRAINT_LAYOUT_CORE = "androidx.constraintlayout:constraintlayout-core:1.0.0-alpha1"
-const val DAGGER = "com.google.dagger:dagger:2.34"
-const val DAGGER_COMPILER = "com.google.dagger:dagger-compiler:2.34"
+const val DAGGER = "com.google.dagger:dagger:2.35"
+const val DAGGER_COMPILER = "com.google.dagger:dagger-compiler:2.35"
 const val DEXMAKER_MOCKITO = "com.linkedin.dexmaker:dexmaker-mockito:2.25.0"
 const val DEXMAKER_MOCKITO_INLINE = "com.linkedin.dexmaker:dexmaker-mockito-inline:2.25.0"
 const val ESPRESSO_CONTRIB = "androidx.test.espresso:espresso-contrib:3.3.0"
@@ -72,11 +72,7 @@
 const val JSQLPARSER = "com.github.jsqlparser:jsqlparser:3.1"
 const val JSR250 = "javax.annotation:javax.annotation-api:1.2"
 const val JUNIT = "junit:junit:4.12"
-const val KOTLINPOET = "com.squareup:kotlinpoet:1.4.0"
-const val KOTLINPOET_METADATA = "com.squareup:kotlinpoet-metadata:1.4.0"
-const val KOTLINPOET_METADATA_SPECS = "com.squareup:kotlinpoet-metadata-specs:1.4.0"
-const val KOTLINPOET_CLASSINSPECTOR_ELEMENTS =
-    "com.squareup:kotlinpoet-classinspector-elements:1.4.0"
+const val KOTLINPOET = "com.squareup:kotlinpoet:1.8.0"
 const val KOTLIN_COMPILE_TESTING = "com.github.tschuchortdev:kotlin-compile-testing:1.3.6"
 const val KOTLIN_COMPILE_TESTING_KSP = "com.github.tschuchortdev:kotlin-compile-testing-ksp:1.3.6"
 
@@ -85,10 +81,7 @@
  * build dependencies file.
  */
 internal lateinit var kspVersion: String
-
 val KSP_VERSION get() = kspVersion
-val KOTLIN_KSP_API get() = "com.google.devtools.ksp:symbol-processing-api:$KSP_VERSION"
-val KOTLIN_KSP get() = "com.google.devtools.ksp:symbol-processing:$KSP_VERSION"
 const val KOTLIN_GRADLE_PLUGIN = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
 
 const val KOTLIN_METADATA_JVM = "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.2.0"
@@ -107,7 +100,7 @@
 const val REACTIVE_STREAMS = "org.reactivestreams:reactive-streams:1.0.0"
 const val RX_JAVA = "io.reactivex.rxjava2:rxjava:2.2.9"
 const val RX_JAVA3 = "io.reactivex.rxjava3:rxjava:3.0.0"
-val SKIKO_VERSION = System.getenv("SKIKO_VERSION") ?: "0.2.22"
+val SKIKO_VERSION = System.getenv("SKIKO_VERSION") ?: "0.2.24"
 val SKIKO = "org.jetbrains.skiko:skiko-jvm:$SKIKO_VERSION"
 val SKIKO_LINUX_X64 = "org.jetbrains.skiko:skiko-jvm-runtime-linux-x64:$SKIKO_VERSION"
 val SKIKO_MACOS_X64 = "org.jetbrains.skiko:skiko-jvm-runtime-macos-x64:$SKIKO_VERSION"
@@ -138,13 +131,11 @@
 
 const val ROBOLECTRIC = "org.robolectric:robolectric:4.4-alpha-2"
 
-const val SHADOW_PLUGIN = "com.github.jengelman.gradle.plugins:shadow:5.2.0"
-
 const val PROTOBUF = "com.google.protobuf:protobuf-java:3.4.0"
 const val PROTOBUF_COMPILER = "com.google.protobuf:protoc:3.10.0"
 const val PROTOBUF_LITE = "com.google.protobuf:protobuf-javalite:3.10.0"
 
-const val JARJAR = "org.anarres.jarjar:jarjar-gradle:1.0.1"
+const val WIRE_RUNTIME = "com.squareup.wire:wire-runtime:3.6.0"
 
 // The following versions change depending on whether we are in the main or ui project - the
 // specific versions are configured in build_dependencies.gradle as they are needed during
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index 1943535..1173c37 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -16,13 +16,12 @@
 
 package androidx.build.dependencyTracker
 
-import androidx.build.dependencyTracker.AffectedModuleDetector.Companion.CHANGED_PROJECTS_ARG
-import androidx.build.dependencyTracker.AffectedModuleDetector.Companion.DEPENDENT_PROJECTS_ARG
 import androidx.build.dependencyTracker.AffectedModuleDetector.Companion.ENABLE_ARG
 import androidx.build.getDistributionDirectory
 import androidx.build.gitclient.GitClient
 import androidx.build.gitclient.GitClientImpl
 import androidx.build.gradle.isRoot
+import androidx.build.isPresubmitBuild
 import org.gradle.BuildAdapter
 import org.gradle.api.GradleException
 import org.gradle.api.Project
@@ -45,12 +44,9 @@
  *  DEPENDENT_PROJECTS -- Any projects that have a dependency on any of the projects
  *      in the CHANGED_PROJECTS set.
  *
- *  ALL_AFFECTED_PROJECTS -- The union of CHANGED_PROJECTS and DEPENDENT_PROJECTS,
- *      which encompasses all projects that could possibly break due to the changes.
- *
  *  NONE -- A status to return for a project when it is not supposed to be built.
  */
-enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, ALL_AFFECTED_PROJECTS, NONE }
+enum class ProjectSubset { DEPENDENT_PROJECTS, CHANGED_PROJECTS, NONE }
 
 /**
  * A utility class that can discover which files are changed based on git history.
@@ -58,11 +54,6 @@
  * To enable this, you need to pass [ENABLE_ARG] into the build as a command line parameter
  * (-P<name>)
  *
- * Passing [DEPENDENT_PROJECTS_ARG] will result in only DEPENDENT_PROJECTS being returned (see enum)
- * Passing [CHANGED_PROJECTS_ARG] will behave likewise.
- *
- * If neither of those are passed, ALL_AFFECTED_PROJECTS is returned.
- *
  * Currently, it checks git logs to find last merge CL to discover where the anchor CL is.
  *
  * Eventually, we'll move to the props passed down by the build system when it is available.
@@ -100,18 +91,12 @@
         private const val ROOT_PROP_NAME = "affectedModuleDetector"
         private const val LOG_FILE_NAME = "affected_module_detector_log.txt"
         const val ENABLE_ARG = "androidx.enableAffectedModuleDetection"
-        const val DEPENDENT_PROJECTS_ARG = "androidx.dependentProjects"
-        const val CHANGED_PROJECTS_ARG = "androidx.changedProjects"
         const val BASE_COMMIT_ARG = "androidx.affectedModuleDetector.baseCommit"
+
         @JvmStatic
         fun configure(gradle: Gradle, rootProject: Project) {
             val enabled = rootProject.hasProperty(ENABLE_ARG) &&
                 rootProject.findProperty(ENABLE_ARG) != "false"
-            val subset = when {
-                rootProject.hasProperty(DEPENDENT_PROJECTS_ARG) -> ProjectSubset.DEPENDENT_PROJECTS
-                rootProject.hasProperty(CHANGED_PROJECTS_ARG) -> ProjectSubset.CHANGED_PROJECTS
-                else -> ProjectSubset.ALL_AFFECTED_PROJECTS
-            }
             if (!enabled) {
                 setInstance(rootProject, AcceptAll())
                 return
@@ -136,7 +121,6 @@
                         rootProject = rootProject,
                         logger = logger,
                         ignoreUnknownProjects = false,
-                        projectSubset = subset,
                         baseCommitOverride = baseCommitOverride
                     ).also {
                         if (!enabled) {
@@ -215,6 +199,7 @@
         logger?.info("[AcceptAll] wrapper returned $wrappedResult but I'll return true")
         return true
     }
+
     override fun getSubset(project: Project): ProjectSubset {
         val wrappedResult = wrapped?.getSubset(project)
         logger?.info("[AcceptAll] wrapper returned $wrappedResult but I'll return CHANGED_PROJECTS")
@@ -234,10 +219,10 @@
     logger: Logger?,
     // used for debugging purposes when we want to ignore non module files
     private val ignoreUnknownProjects: Boolean = false,
-    private val projectSubset: ProjectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS,
     private val cobuiltTestPaths: Set<Set<String>> = COBUILT_TEST_PATHS,
     private val alwaysBuildIfExistsPaths: Set<String> = ALWAYS_BUILD_IF_EXISTS,
     private val injectedGitClient: GitClient? = null,
+    private val isPresubmit: Boolean = isPresubmitBuild(),
     private val baseCommitOverride: String? = null
 ) : AffectedModuleDetector(logger) {
     private val git by lazy {
@@ -257,19 +242,23 @@
     }
 
     val affectedProjects by lazy {
-        findAffectedProjects()
+        changedProjects + dependentProjects
     }
 
-    private val changedProjects by lazy {
+    val changedProjects by lazy {
         findChangedProjects()
     }
 
-    private val dependentProjects by lazy {
+    val dependentProjects by lazy {
         findDependentProjects()
     }
 
     private var unknownFiles: MutableSet<String> = mutableSetOf()
 
+    val buildAll by lazy {
+        shouldBuildAll()
+    }
+
     private val cobuiltTestProjects by lazy {
         lookupProjectSetsFromPaths(cobuiltTestPaths)
     }
@@ -281,20 +270,16 @@
         alwaysBuildIfExistsPaths.map { path -> rootProject.findProject(path) }.filterNotNull()
     }
 
-    /**
-     * Gets set to true when there are unknown files in the build. There
-     * are two cases when we want to build all by default, even though the
-     * real detector is in use; in presubmit, or in postsubmit. We know the
-     * build is postsubmit when there are no files changed. Thus, we can
-     * change the behavior of presubmit builds based on this flag.
-     *
-     * In this case, we return a different ProjectSubset in presubmit vs.
-     * postsubmit, to get the desired test behaviors.
-     */
-    private var isPresubmit: Boolean = false
+    private val buildContainsNonProjectFileChanges by lazy {
+        unknownFiles.isNotEmpty()
+    }
 
     override fun shouldInclude(project: Project): Boolean {
-        return (project.isRoot || affectedProjects.contains(project))
+        return if (project.isRoot || buildAll) {
+            true
+        } else {
+            affectedProjects.contains(project)
+        }
     }
 
     override fun getSubset(project: Project): ProjectSubset {
@@ -302,14 +287,11 @@
             changedProjects.contains(project) -> {
                 ProjectSubset.CHANGED_PROJECTS
             }
-            dependentProjects.contains(project) || isPresubmit -> {
+            dependentProjects.contains(project) ||
+                isPresubmit ||
+                buildContainsNonProjectFileChanges -> {
                 ProjectSubset.DEPENDENT_PROJECTS
             }
-            // This should only happen in situations where everything gets built
-            // and there are no changed files (aka postsubmit)
-            affectedProjects.contains(project) -> {
-                ProjectSubset.ALL_AFFECTED_PROJECTS
-            }
             else -> {
                 ProjectSubset.NONE
             }
@@ -367,46 +349,25 @@
     }
 
     /**
-     * By default, finds all modules that are affected by current changes
-     *
-     * With param dependentProjects, finds only modules dependent on directly changed modules
-     *
-     * With param changedProjects, finds only directly changed modules
-     *
-     * If it cannot determine the containing module for a file (e.g. buildSrc or root), it
-     * defaults to all projects unless [ignoreUnknownProjects] is set to true. However,
-     * with param changedProjects, it only returns the placeholder-test (see companion object
-     * below).
-     * This is because we run all tests including @large on the changed set. So when we must
-     * build all, we only want to run @small and @medium tests in the test runner for
-     * DEPENDENT_PROJECTS.
-     *
-     * Also detects modules whose tests are codependent at runtime.
+     * Determines whether we are in a state where we want to build all projects, instead of
+     * only affected ones. This occurs for buildSrc changes, as well as in situations where
+     * we determine there are no changes within our repository (e.g. prebuilts change only)
      */
-    private fun findAffectedProjects(): Set<Project> {
-        // In this case we don't care about any of the logic below, we're only concerned with
-        // running the changed projects in this test runner
-        if (projectSubset == ProjectSubset.CHANGED_PROJECTS) {
-            return changedProjects
-        }
+    private fun shouldBuildAll(): Boolean {
 
-        var buildAll = false
-
+        var shouldBuildAll = false
         // Should only trigger if there are no changedFiles
         if (changedProjects.size == alwaysBuild.size && unknownFiles.isEmpty()) {
-            buildAll = true
+            shouldBuildAll = true
         } else if (unknownFiles.isNotEmpty()) {
-            buildAll = true
-            isPresubmit = true
+            shouldBuildAll = true
         }
         logger?.info(
             "unknownFiles: $unknownFiles, changedProjects: $changedProjects, buildAll: " +
-                "$buildAll"
+                "$shouldBuildAll"
         )
 
-        // If we're in a buildAll state, we return allProjects unless it's the changed target,
-        // Since the changed target runs all tests and we don't want 3+ hour presubmit runs
-        if (buildAll) {
+        if (shouldBuildAll) {
             logger?.info("Building all projects")
             if (unknownFiles.isEmpty()) {
                 logger?.info("because no changed files were detected")
@@ -419,18 +380,8 @@
                     """.trimIndent()
                 )
             }
-            when (projectSubset) {
-                ProjectSubset.DEPENDENT_PROJECTS -> return allProjects
-                ProjectSubset.ALL_AFFECTED_PROJECTS -> return allProjects
-                else -> {}
-            }
         }
-
-        return when (projectSubset) {
-            ProjectSubset.ALL_AFFECTED_PROJECTS -> changedProjects + dependentProjects
-            ProjectSubset.CHANGED_PROJECTS -> changedProjects
-            else -> dependentProjects
-        }
+        return shouldBuildAll
     }
 
     private fun lookupProjectSetsFromPaths(allSets: Set<Set<String>>): Set<Set<Project>> {
diff --git a/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
index e1f77dd..9b6e95d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt
@@ -19,6 +19,7 @@
 import androidx.build.SupportConfig
 import androidx.build.addToBuildOnServer
 import androidx.build.dackka.DackkaTask
+import androidx.build.dependencies.KOTLIN_VERSION
 import androidx.build.doclava.DacOptions
 import androidx.build.doclava.DoclavaTask
 import androidx.build.doclava.GENERATE_DOCS_CONFIG
@@ -45,7 +46,6 @@
 import org.gradle.api.attributes.Usage
 import org.gradle.api.file.FileCollection
 import org.gradle.api.model.ObjectFactory
-import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.plugins.JavaBasePlugin
 import org.gradle.api.tasks.Sync
 import org.gradle.api.tasks.TaskProvider
@@ -114,7 +114,8 @@
             unzippedSourcesForDackka,
             unzipSourcesForDackkaTask,
             unzippedSamplesSources,
-            unzipSamplesTask
+            unzipSamplesTask,
+            dependencyClasspath
         )
         configureDokka(
             unzippedDocsSources,
@@ -264,11 +265,9 @@
         }
         listOf(docsCompileClasspath, docsRuntimeClasspath).forEach { config ->
             config.resolutionStrategy {
-                val versions = (project.rootProject.property("ext") as ExtraPropertiesExtension)
-                    .let { it.get("build_versions") as Map<*, *> }
                 it.eachDependency { details ->
                     if (details.requested.group == "org.jetbrains.kotlin") {
-                        details.useVersion(versions["kotlin"] as String)
+                        details.useVersion(KOTLIN_VERSION)
                     }
                 }
             }
@@ -290,7 +289,8 @@
         unzippedDocsSources: File,
         unzipDocsTask: TaskProvider<Sync>,
         unzippedSamplesSources: File,
-        unzipSamplesTask: TaskProvider<Sync>
+        unzipSamplesTask: TaskProvider<Sync>,
+        dependencyClasspath: FileCollection
     ) {
         val generatedDocsDir = project.file("${project.buildDir}/dackkaDocs")
 
@@ -312,6 +312,11 @@
                 destinationDir = generatedDocsDir
                 samplesDir = unzippedSamplesSources
                 sourcesDir = unzippedDocsSources
+                includes = unzippedDocsSources.walkTopDown()
+                    .filter { it.name.endsWith("documentation.md") }
+                    .joinToString(";")
+                docsProjectDir = File(project.rootDir, "docs-public")
+                dependenciesClasspath = androidJarFile(project) + dependencyClasspath
             }
         }
 
@@ -557,13 +562,14 @@
     }
 }
 
-private const val DACKKA_DEPENDENCY = "com.google.devsite:dackka:0.0.1-alpha01"
+private const val DACKKA_DEPENDENCY = "com.google.devsite:dackka:0.0.4"
 private const val DOCLAVA_DEPENDENCY = "com.android:doclava:1.0.6"
 
 // Allowlist for directories that should be processed by Dackka
 private val dackkaDirsToProcess = listOf(
     "androidx/benchmark/**",
     "androidx/collection/**",
+    "androidx/compose/**",
     "androidx/paging/**"
 )
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt b/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
index e447f23..be841d7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
@@ -89,7 +89,7 @@
             task.noJdkLink = true
             task.noStdlibLink = true
             task.noAndroidSdkLink = true
-            task.dokkaFatJar = "org.jetbrains.dokka:dokka-fatjar:0.9.17-g013"
+            task.dokkaFatJar = "org.jetbrains.dokka:dokka-fatjar:0.9.17-g014"
         }
     }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt
new file mode 100644
index 0000000..d358d4b
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/ftl/FirebaseTestLabHelper.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.build.ftl
+
+import androidx.build.gradle.isRoot
+import com.android.build.gradle.TestedExtension
+import com.android.build.gradle.internal.tasks.factory.dependsOn
+import org.gradle.api.Project
+
+/**
+ * Helper class to setup Firebase Test Lab for instrumentation tests
+ */
+internal class FirebaseTestLabHelper(
+    private val rootProject: Project
+) {
+    init {
+        check(rootProject.isRoot) {
+            "FTL Utilities can only be created for root projects"
+        }
+    }
+
+    private val anchorTask by lazy {
+        rootProject.tasks.register(ANCHOR_TASK_NAME) {
+            it.description = "Anchor task that depends on all firebase test lab tests"
+            it.group = "Verification"
+        }
+    }
+
+    fun setupFTL(project: Project) {
+        AGP_PLUGIN_IDS.forEach { agpPluginId ->
+            // using base plugin at this stage does not work as base plugin is applied before the
+            // Android Extension is created.
+            // see the comment on [AGP_PLUGIN_IDS] for details.
+            project.pluginManager.withPlugin(agpPluginId) {
+                project.extensions.findByType(TestedExtension::class.java)?.let {
+                    configure(project, it)
+                }
+            }
+        }
+    }
+
+    private fun configure(project: Project, testedExtension: TestedExtension) {
+        testedExtension.testVariants.all { testVariant ->
+            RunTestOnFTLTask.create(project, testVariant)?.let { ftlTask ->
+                anchorTask.dependsOn(ftlTask)
+            }
+        }
+    }
+
+    companion object {
+        const val ANCHOR_TASK_NAME = "firebaseTestLabTests"
+
+        /**
+         * AGP base plugin is applied before the extension is created so instead we use plugin
+         * ids here.
+         * see: https://github.com/google/ksp/issues/314
+         * see: https://github.com/google/ksp/pull/318
+         */
+        private val AGP_PLUGIN_IDS = listOf(
+            "com.android.application",
+            // TODO enable library and dynamic feature when we can synthesize
+            //  an APK for them
+            //  "com.android.library",
+            //  "com.android.dynamic-feature"
+        )
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt
new file mode 100644
index 0000000..385e271
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/ftl/GCloudCLIWrapper.kt
@@ -0,0 +1,260 @@
+/*
+ * 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.build.ftl
+
+import androidx.build.ftl.GCloudCLIWrapper.RunTestParameters.Companion.TEST_OUTPUT_FILE_NAME
+import com.google.gson.Gson
+import com.google.gson.annotations.SerializedName
+import com.google.gson.reflect.TypeToken
+import org.gradle.api.GradleException
+import org.gradle.process.ExecOperations
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.util.Locale
+import java.util.UUID
+
+/**
+ * Wrapper around GCloud CLI.
+ *
+ * https://cloud.google.com/sdk/gcloud
+ *
+ * Note that this wrapper requires gcloud to be available on the host machine.
+ *
+ * documentation for FTL:
+ * https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run
+ */
+@Suppress("UnstableApiUsage") // ExecOperations
+internal class GCloudCLIWrapper(
+    private val execOperations: ExecOperations
+) {
+    private val gson = Gson()
+
+    /**
+     * Path to the gcloud executable, derived from `which gcloud` call.
+     */
+    private val gcloud: String by lazy {
+        findExecutable("gcloud")
+    }
+
+    /**
+     * Path to the gsutil executable, derived from `which gsutil` call.
+     */
+    private val gsutil: String by lazy {
+        findExecutable("gsutil")
+    }
+
+    private inline fun <reified T> executeGcloud(
+        vararg params: String
+    ): T {
+        val output = ByteArrayOutputStream()
+        val errorOutput = ByteArrayOutputStream()
+        val execResult = execOperations.exec {
+            it.executable = gcloud
+            it.args = params.toList() + "--format=json"
+            it.standardOutput = output
+            it.errorOutput = errorOutput
+            it.isIgnoreExitValue = true
+        }
+        if (execResult.exitValue != 0) {
+            System.err.println("GCloud command failed: ${errorOutput.toString(Charsets.UTF_8)}")
+        }
+        // still try to parse the because when it fails (e.g. test failure), it returns a non-0
+        // exit code but still prints the output. We are interested in the output.
+        val commandOutput = output.toString(Charsets.UTF_8)
+        return gson.parse(commandOutput)
+    }
+
+    private fun execGsUtil(
+        vararg params: String
+    ): String {
+        val output = ByteArrayOutputStream()
+        execOperations.exec {
+            it.executable = gsutil
+            it.args = params.toList()
+            it.standardOutput = output
+        }
+        return output.toString(Charsets.UTF_8)
+    }
+
+    /**
+     * https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run
+     */
+    fun runTest(
+        params: RunTestParameters
+    ): List<TestResult> {
+        val testResults = executeGcloud<List<TestResult>>(
+            "firebase", "test", "android", "run",
+            "--type", "instrumentation",
+            "--test", params.testApk.canonicalPath,
+            "--app", params.testedApk.canonicalPath,
+            "--num-flaky-test-attempts", "2",
+            "--results-bucket=${params.bucketName}",
+            "--results-dir=${params.resultsBucketDir}",
+            "--results-history-name=${params.projectPath}"
+        )
+        // copy the test results from the bucket to the build directory
+        execGsUtil(
+            "cp", "-r", params.cloudBucketPath() + "/*", params.resultsLocalDir.canonicalPath
+        )
+        // finally, write the command response into the directory as well
+        val testResultOutput = params.resultsLocalDir.resolve(TEST_OUTPUT_FILE_NAME)
+        testResultOutput.bufferedWriter(Charsets.UTF_8).use {
+            gson.toJson(
+                testResults,
+                it
+            )
+        }
+        return testResults
+    }
+
+    /**
+     * find the given executable's path in the PATH via `which` command.
+     */
+    private fun findExecutable(name: String): String {
+        val output = ByteArrayOutputStream()
+        val result = execOperations.exec {
+            it.commandLine("which", name)
+            it.standardOutput = output
+            it.isIgnoreExitValue = true
+        }
+        if (result.exitValue != 0) {
+            throw GradleException(
+                """
+                Unable to find $name CLI executable.
+                `which $name` returned exit code ${result.exitValue}.
+                Make sure gcloud CLI is installed, authenticated and is part of your PATH.
+                See https://cloud.google.com/sdk/gcloud for installation instructions.
+                """.trimIndent()
+            )
+        }
+        return output.toString(Charsets.UTF_8).trim()
+    }
+
+    /**
+     * Data structure format for gcloud FTL command
+     */
+    internal data class TestResult(
+        @SerializedName("axis_value")
+        val axisValue: String,
+        val outcome: String,
+        @SerializedName("test_details")
+        val testDetails: String
+    ) {
+        val passed
+            get() = outcome.toLowerCase(Locale.US) in SUCCESS_OUTCOMES
+
+        companion object {
+            private val SUCCESS_OUTCOMES = listOf("passed", "flaky")
+        }
+    }
+
+    /**
+     * Parameters for invoking a test on the Firebase Test Lab
+     */
+    internal data class RunTestParameters(
+        /**
+         * The project path for which we are executing the tests for.
+         */
+        val projectPath: String,
+        /**
+         * The tested APK file
+         */
+        val testedApk: File,
+        /**
+         * The test APK file which includes the instrumentation tests
+         */
+        val testApk: File,
+        /**
+         * The name of the GS bucket to save the results
+         */
+        val bucketName: String = DEFAULT_BUCKET_NAME,
+        /**
+         * The GS Bucket directory where the results will be saved
+         */
+        val resultsBucketDir: String = buildRelativeResultDirPath(projectPath),
+        /**
+         * The local directory where we will download the test results
+         */
+        val resultsLocalDir: File,
+    ) {
+
+        /**
+         * Returns the path to the Google Cloud bucket where the test run results are saved
+         */
+        fun cloudBucketPath(): String {
+            return "gs://$bucketName/$resultsBucketDir"
+        }
+
+        companion object {
+            const val DEFAULT_BUCKET_NAME = "androidx-ftl-test-results"
+
+            /**
+             * The file into which the result of the gcloud command will be written.
+             */
+            const val TEST_OUTPUT_FILE_NAME = "testResults.json"
+
+            /**
+             * Generates a relative path for test results.
+             *
+             * If run on Github Actions CI, this method will use the environment variables to
+             * create a unique path for the action.
+             * If run locally, this will create a random UUID for the directory.
+             */
+            private fun buildRelativeResultDirPath(
+                projectPath: String
+            ): String {
+                // github action env variables:
+                // https://docs.github.com/en/actions/reference/environment-variables
+                val inGithubActions = System.getenv().containsKey("GITHUB_ACTIONS")
+                val pathValues = if (inGithubActions) {
+                    val workflowName = requireEnvValue("GITHUB_WORKFLOW")
+                    val runNumber = requireEnvValue("GITHUB_RUN_NUMBER")
+                    val runId = requireEnvValue("GITHUB_RUN_ID")
+                    val ref = System.getenv("GITHUB_REF")
+                    listOfNotNull(
+                        "github",
+                        projectPath,
+                        ref,
+                        workflowName,
+                        runNumber,
+                        runId,
+                    )
+                } else {
+                    listOf(
+                        "local",
+                        projectPath,
+                        UUID.randomUUID().toString()
+                    )
+                }
+                return pathValues.joinToString("/")
+            }
+
+            private fun requireEnvValue(name: String): String {
+                return System.getenv(name) ?: throw GradleException(
+                    "Cannot find required environment variable: $name"
+                )
+            }
+        }
+    }
+}
+
+private inline fun <reified T> Gson.parse(
+    input: String
+): T {
+    val typeToken = object : TypeToken<T>() {}.type
+    return this.fromJson(input, typeToken)
+}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt b/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt
new file mode 100644
index 0000000..8ec207d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/ftl/RunTestOnFTLTask.kt
@@ -0,0 +1,185 @@
+/*
+ * 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.build.ftl
+
+import androidx.build.getDistributionDirectory
+import androidx.build.getSupportRootFolder
+import com.android.build.gradle.api.ApkVariant
+import com.android.build.gradle.api.ApkVariantOutput
+import com.android.build.gradle.api.TestVariant
+import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.CacheableTask
+import org.gradle.api.tasks.Copy
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.process.ExecOperations
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+import javax.inject.Inject
+
+/**
+ * Task to run instrumentation tests on FTL.
+ *
+ * This task is only enabled on playground projects and requires gcloud CLI to be available on
+ * the device with the right permissions.
+ *
+ * Due to the limitations of FTL, this task only support application instrumentation tests for now.
+ */
+@Suppress("UnstableApiUsage") // for gradle property APIs
+@CacheableTask
+abstract class RunTestOnFTLTask @Inject constructor(
+    private val workerExecutor: WorkerExecutor
+) : DefaultTask() {
+    /**
+     * The test APK for the instrumentation test.
+     */
+    @get:[InputFile PathSensitive(PathSensitivity.NONE)]
+    abstract val testApk: RegularFileProperty
+
+    /**
+     * The tested application APK.
+     */
+    @get:[InputFile PathSensitive(PathSensitivity.NONE)]
+    abstract val testedApk: RegularFileProperty
+
+    /**
+     * Output file to write the results
+     */
+    @get:OutputDirectory
+    abstract val testResults: DirectoryProperty
+
+    @TaskAction
+    fun executeTest() {
+        workerExecutor.noIsolation().submit(
+            RunFTLTestWorkAction::class.java
+        ) {
+            it.testApk.set(testApk)
+            it.testedApk.set(testedApk)
+            it.testResults.set(testResults)
+            it.projectPath.set(project.relativeResultPath())
+        }
+    }
+
+    interface RunFTLTestParams : WorkParameters {
+        val projectPath: Property<String>
+        val testApk: RegularFileProperty
+        val testedApk: RegularFileProperty
+        val testResults: DirectoryProperty
+    }
+
+    abstract class RunFTLTestWorkAction @Inject constructor(
+        private val execOperations: ExecOperations
+    ) : WorkAction<RunFTLTestParams> {
+        override fun execute() {
+            val localTestResultDir = parameters.testResults.asFile.get()
+            localTestResultDir.apply {
+                deleteRecursively()
+                mkdirs()
+            }
+            val testApk = parameters.testApk.asFile.get()
+            val testedApk = parameters.testedApk.asFile.get()
+            val gcloud = GCloudCLIWrapper(execOperations)
+            val params = GCloudCLIWrapper.RunTestParameters(
+                testedApk = testedApk,
+                testApk = testApk,
+                projectPath = parameters.projectPath.get(),
+                resultsLocalDir = localTestResultDir
+
+            )
+            val result = gcloud.runTest(params)
+            val failed = result.filterNot {
+                it.passed
+            }
+            if (failed.isNotEmpty()) {
+                throw GradleException("These tests failed: $failed")
+            }
+        }
+    }
+
+    companion object {
+        private const val TASK_SUFFIX = "OnFirebaseTestLab"
+
+        /**
+         * Creates an FTL test runner task and returns it.
+         * Note that only application tests are supported hence this will return `null` for
+         * library projects.
+         */
+        fun create(project: Project, testVariant: TestVariant): TaskProvider<RunTestOnFTLTask>? {
+            // TODO add support for library project, which might require synthesizing another
+            //  APK :facepalm:
+            // see: // https://stackoverflow.com/questions/59827750/execute-instrumented-test-for-an-android-library-with-firebase-test-lab
+            val testedVariant = testVariant.testedVariant as? ApkVariant
+                ?: return null
+            val taskName = testVariant.name + TASK_SUFFIX
+            val testResultDir = project.layout.buildDirectory.dir(
+                "ftl-results"
+            )
+            // create task to copy results into dist directory
+            val copyToDistTask = project.tasks.register(
+                "copyResultsOf${taskName}ToDist",
+                Copy::class.java
+            ) {
+                it.description = "Copy test results from $taskName into DIST folder"
+                it.group = "build"
+                it.from(testResultDir)
+                it.into(
+                    project.getDistributionDirectory()
+                        .resolve("ftl-results/${project.relativeResultPath()}/$taskName")
+                )
+            }
+            return project.tasks.register(taskName, RunTestOnFTLTask::class.java) { task ->
+                task.description = "Run ${testVariant.name} tests on Firebase Test Lab"
+                task.group = "Verification"
+                task.testResults.set(testResultDir)
+                task.dependsOn(testVariant.packageApplicationProvider)
+                task.dependsOn(testedVariant.packageApplicationProvider)
+
+                task.testApk.set(
+                    testVariant.outputs
+                        .withType(ApkVariantOutput::class.java)
+                        .firstOrNull()
+                        ?.outputFile
+                )
+                task.testedApk.set(
+                    testedVariant.outputs
+                        .withType(ApkVariantOutput::class.java)
+                        .firstOrNull()
+                        ?.outputFile
+                )
+                task.finalizedBy(copyToDistTask)
+            }
+        }
+    }
+}
+
+/**
+ * Returns the relative path of the project wrt the support root. This path is used for both
+ * local dist path and cloud bucket paths.
+ */
+private fun Project.relativeResultPath() = projectDir.relativeTo(
+    project.getSupportRootFolder()
+).path
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/jacoco/Jacoco.kt b/buildSrc/src/main/kotlin/androidx/build/jacoco/Jacoco.kt
index 2da678f..f3381b1 100644
--- a/buildSrc/src/main/kotlin/androidx/build/jacoco/Jacoco.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/jacoco/Jacoco.kt
@@ -21,15 +21,33 @@
 import androidx.build.gradle.isRoot
 import com.android.build.gradle.TestedExtension
 import com.google.common.base.Preconditions
+import org.gradle.api.DefaultTask
 import org.gradle.api.Project
 import org.gradle.api.Task
 import org.gradle.api.file.ConfigurableFileTree
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.bundling.Jar
 import org.gradle.api.tasks.bundling.Zip
 
+// Generate jacoco-agent.properties file.
+// TODO(ager): Remove once updated to at least AGP 7.0.0-alpha04 where
+// this file will be generated by AGP.
+abstract class JacocoAgentPropertiesGenerateTask : DefaultTask() {
+    @get:OutputDirectory
+    abstract val outputDirectory: DirectoryProperty
+
+    @TaskAction
+    fun run() {
+        val file = outputDirectory.get().file("jacoco-agent.properties").asFile
+        file.writeText("output=none", Charsets.UTF_8)
+    }
+}
+
 object Jacoco {
-    const val VERSION = "0.8.3"
+    const val VERSION = "0.8.7-SNAPSHOT"
     private const val ANT_DEPENDENCY = "org.jacoco:org.jacoco.ant:$VERSION"
     private const val EC_FILE_ZIP_TASK_NAME = "zipEcFiles"
 
@@ -46,6 +64,8 @@
                 copySpec.exclude("META-INF/*.SF")
                 copySpec.exclude("META-INF/*.DSA")
                 copySpec.exclude("META-INF/*.RSA")
+                copySpec.exclude("about.html")
+                copySpec.exclude("module-info.class")
             }
             it.destinationDirectory.set(project.getDistributionDirectory())
             it.archiveFileName.set("jacocoant.jar")
@@ -54,7 +74,7 @@
 
     fun registerClassFilesTask(project: Project, extension: TestedExtension) {
         extension.testVariants.all { v ->
-            if (v.buildType.isTestCoverageEnabled &&
+            if (v.testedVariant.buildType.isTestCoverageEnabled &&
                 v.sourceSets.any { it.javaDirectories.isNotEmpty() }
             ) {
                 val jarifyTask = project.tasks.register(
@@ -78,6 +98,23 @@
         }
     }
 
+    // Generate jacoco-agent.properties file.
+    // TODO(ager): Remove once updated to at least AGP 7.0.0-alpha04 where
+    // this file will be generated by AGP.
+    fun registerAgentPropertiesFilesGenerateTask(project: Project, extension: TestedExtension) {
+        val generator = project.tasks.register(
+            "JacocoAgentPropertiesGenerateTask",
+            JacocoAgentPropertiesGenerateTask::class.java
+        ) {
+            it.outputDirectory.set(project.layout.buildDirectory.dir("jacocoAgentProperties"))
+        }
+        extension.testVariants.all { variant ->
+            variant.registerPostJavacGeneratedBytecode(
+                project.files(generator.flatMap { it.outputDirectory })
+            )
+        }
+    }
+
     fun createCoverageJarTask(project: Project): TaskProvider<Jar> {
         Preconditions.checkArgument(project.isRoot, "Must be root project")
         // Package the individual *-allclasses.jar files together to generate code coverage reports
diff --git a/buildSrc/src/main/kotlin/androidx/build/shadow/AndroidXDontIncludeResourceTransformer.kt b/buildSrc/src/main/kotlin/androidx/build/shadow/AndroidXDontIncludeResourceTransformer.kt
new file mode 100644
index 0000000..23d636e
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/shadow/AndroidXDontIncludeResourceTransformer.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.build.shadow
+
+import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
+import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
+import org.gradle.api.file.FileTreeElement
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Optional
+import shadow.org.apache.tools.zip.ZipOutputStream
+
+/**
+ * Copy of upstream DontIncludeResourceTransformer that has a fix for Gradle 7.0
+ * https://github.com/johnrengelman/shadow/blob/master/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/DontIncludeResourceTransformer.groovy
+ */
+class AndroidXDontIncludeResourceTransformer : Transformer {
+    @get:[Input Optional]
+    var resource: String? = null
+    override fun canTransformResource(element: FileTreeElement?): Boolean {
+        val path = element?.relativePath?.pathString ?: return false
+        val resourceSuffix = resource ?: return false
+        if (resourceSuffix.isNotEmpty() && path.endsWith(resourceSuffix)) {
+            return true
+        }
+        return false
+    }
+
+    override fun transform(context: TransformerContext?) {
+        // No-op
+    }
+
+    override fun hasTransformedResource(): Boolean = false
+
+    override fun modifyOutputStream(p0: ZipOutputStream?, p1: Boolean) {
+        // No-op
+    }
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt b/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
index 7e0e3f3..e52236a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/studio/StudioTask.kt
@@ -22,6 +22,7 @@
 import org.gradle.api.DefaultTask
 import org.gradle.api.GradleException
 import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
 import org.gradle.api.internal.tasks.userinput.UserInputHandler
 import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.tasks.Internal
@@ -60,10 +61,25 @@
     @get:Internal
     protected open val installParentDir: File = project.rootDir
 
-    private val OurStudioVersions: StudioVersions
-        get() {
-            return StudioVersions.loadFrom(installParentDir)
+    @Suppress("UnstableApiUsage") // For use of VersionCatalog
+    private val ourStudioVersions by lazy {
+        val libs = project.extensions.getByType(
+            VersionCatalogsExtension::class.java
+        ).find("libs").get()
+        fun getVersion(key: String): String {
+            val version = libs.findVersion(key)
+            return if (version.isPresent) {
+                version.get().requiredVersion
+            } else {
+                throw GradleException("Could not find a version for `$key`")
+            }
         }
+        StudioVersions(
+            getVersion("androidStudio"),
+            getVersion("androidStudioIdea"),
+            getVersion("androidStudioBuildId")
+        )
+    }
 
     /**
      * Directory name (not path) that Studio will be unzipped into.
@@ -71,7 +87,7 @@
     private val studioDirectoryName: String
         get() {
             val osName = StudioPlatformUtilities.osName
-            with(OurStudioVersions) {
+            with(ourStudioVersions) {
                 return "android-studio-ide-$ideaMajorVersion.$studioBuildNumber-$osName"
             }
         }
@@ -134,7 +150,7 @@
             studioInstallationDir.parentFile.deleteRecursively()
             // Create installation directory and any needed parent directories
             studioInstallationDir.mkdirs()
-            studioArchiveCreator(project, OurStudioVersions, studioArchiveName, studioArchivePath)
+            studioArchiveCreator(project, ourStudioVersions, studioArchiveName, studioArchivePath)
             println("Extracting archive...")
             extractStudioArchive()
             with(platformUtilities) { updateJvmHeapSize() }
diff --git a/buildSrc/src/main/kotlin/androidx/build/studio/StudioVersions.kt b/buildSrc/src/main/kotlin/androidx/build/studio/StudioVersions.kt
index 96a4b78..34ca3f7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/studio/StudioVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/studio/StudioVersions.kt
@@ -16,10 +16,6 @@
 
 package androidx.build.studio
 
-import java.io.File
-import java.io.FileInputStream
-import java.util.Properties
-
 /**
  * Studio version information used for setting up the correct version of Android Studio.
  */
@@ -27,18 +23,4 @@
     val studioVersion: String,
     val ideaMajorVersion: String,
     val studioBuildNumber: String
-) {
-    companion object {
-        fun loadFrom(supportRoot: File): StudioVersions {
-            val versionsFile = File(supportRoot, "buildSrc/studio_versions.properties")
-            val inputStream = FileInputStream(versionsFile)
-            val properties = Properties()
-            properties.load(inputStream)
-            return StudioVersions(
-                properties.get("studio_version")!!.toString(),
-                properties.get("idea_major_version")!!.toString(),
-                properties.get("studio_build_number")!!.toString()
-            )
-        }
-    }
-}
+)
diff --git a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
index becea7a..0cb6f6a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateMediaTestConfigurationTask.kt
@@ -17,6 +17,7 @@
 package androidx.build.testConfiguration
 
 import androidx.build.dependencyTracker.ProjectSubset
+import androidx.build.isPresubmitBuild
 import androidx.build.renameApkForTesting
 import com.android.build.api.variant.BuiltArtifacts
 import com.android.build.api.variant.BuiltArtifactsLoader
@@ -174,28 +175,17 @@
             .isServicePrevious(isServicePrevious)
             .tag("androidx_unit_tests")
             .tag("media_compat")
+        configBuilder.isPostsubmit(!isPresubmitBuild())
         when (affectedModuleDetectorSubset.get()) {
-            ProjectSubset.CHANGED_PROJECTS -> {
-                configBuilder.isPostsubmit(false)
-                configBuilder.runAllTests(true)
-            }
-            ProjectSubset.ALL_AFFECTED_PROJECTS -> {
-                configBuilder.isPostsubmit(true)
-                configBuilder.runAllTests(true)
-            }
             ProjectSubset.DEPENDENT_PROJECTS -> {
-                configBuilder.isPostsubmit(false)
                 if (isConstrained) {
                     configBuilder.runAllTests(false)
                 } else {
-                    configBuilder.runAllTests(false)
+                    configBuilder.runAllTests(true)
                 }
             }
             else -> {
-                throw IllegalStateException(
-                    "$name should not be running if the AffectedModuleDetector is returning " +
-                        "${affectedModuleDetectorSubset.get()} for this project."
-                )
+                configBuilder.runAllTests(true)
             }
         }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
index 0e23046..17c29c3 100644
--- a/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/testConfiguration/GenerateTestConfigurationTask.kt
@@ -17,6 +17,7 @@
 package androidx.build.testConfiguration
 
 import androidx.build.dependencyTracker.ProjectSubset
+import androidx.build.isPresubmitBuild
 import androidx.build.renameApkForTesting
 import com.android.build.api.variant.BuiltArtifactsLoader
 import org.gradle.api.DefaultTask
@@ -85,7 +86,7 @@
 
     private fun writeConfigFileContent(
         outputFile: RegularFileProperty,
-        isConstrained: Boolean = true
+        isConstrained: Boolean = false
     ) {
         /*
         Testing an Android Application project involves 2 APKS: an application to be instrumented,
@@ -107,17 +108,9 @@
                 configBuilder.appApkName(appName)
             }
         }
+        configBuilder.isPostsubmit(!isPresubmitBuild())
         when (affectedModuleDetectorSubset.get()) {
-            ProjectSubset.CHANGED_PROJECTS -> {
-                configBuilder.isPostsubmit(false)
-                configBuilder.runAllTests(true)
-            }
-            ProjectSubset.ALL_AFFECTED_PROJECTS -> {
-                configBuilder.isPostsubmit(true)
-                configBuilder.runAllTests(true)
-            }
             ProjectSubset.DEPENDENT_PROJECTS -> {
-                configBuilder.isPostsubmit(false)
                 // Don't ever run full tests of RV if it is dependent, since they take > 45 minutes
                 if (isConstrained || testProjectPath.get().contains("recyclerview")) {
                     configBuilder.runAllTests(false)
@@ -125,11 +118,9 @@
                     configBuilder.runAllTests(true)
                 }
             }
+            // in all other cases, if we are building this config we want to run all the tests
             else -> {
-                throw IllegalStateException(
-                    "$name should not be running if the AffectedModuleDetector is returning " +
-                        "${affectedModuleDetectorSubset.get()} for this project."
-                )
+                configBuilder.runAllTests(true)
             }
         }
         // This section adds metadata tags that will help filter runners to specific modules.
@@ -137,8 +128,6 @@
             configBuilder.isBenchmark(true)
             if (configBuilder.isPostsubmit) {
                 configBuilder.tag("microbenchmarks")
-            } else {
-                configBuilder.tag("microbenchmarks_presubmit")
             }
         } else if (testProjectPath.get().endsWith("macrobenchmark")) {
             configBuilder.tag("macrobenchmarks")
diff --git a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index d1b7f3c..79c3b66 100644
--- a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -16,6 +16,7 @@
 
 package androidx.build.uptodatedness
 
+import androidx.build.VERIFY_UP_TO_DATE
 import org.gradle.api.GradleException
 import org.gradle.api.Project
 import org.gradle.api.Task
@@ -33,11 +34,11 @@
  */
 
 const val DISALLOW_TASK_EXECUTION_FLAG_NAME = "disallowExecution"
-const val RECORD_FLAG_NAME = "verifyUpToDate"
+const val RECORD_FLAG_NAME = VERIFY_UP_TO_DATE
 
 // Temporary set of exempt tasks that are known to still be out-of-date after running once
-// Entries in this set may be task names (like assembleDebug) or task paths
-// (like :core:core:assembleDebug)
+// Entries in this set may be task names (like assembleRelease) or task paths
+// (like :core:core:assembleRelease)
 // Entries in this set do still get rerun because they might produce files that are needed by
 // subsequent tasks
 val ALLOW_RERUNNING_TASKS = setOf(
@@ -117,6 +118,7 @@
     ":camera:integration-tests:camera-testapp-core:packageDebug",
     ":camera:integration-tests:camera-testapp-extensions:mergeLibDexDebug",
     ":camera:integration-tests:camera-testapp-extensions:packageDebug",
+    ":camera:integration-tests:camera-testapp-extensions:GenerateTestConfigurationdebugAndroidTest",
     ":camera:integration-tests:camera-testapp-uiwidgets:mergeLibDexDebug",
     ":camera:integration-tests:camera-testapp-uiwidgets:packageDebug",
     ":camera:integration-tests:camera-testapp-core:GenerateTestConfigurationdebug",
@@ -125,6 +127,16 @@
     ":camera:integration-tests:camera-testapp-view:GenerateTestConfigurationdebugAndroidTest",
     ":camera:integration-tests:camera-testapp-view:mergeLibDexDebug",
     ":camera:integration-tests:camera-testapp-view:packageDebug",
+    ":benchmark:benchmark-macro:generateReleaseProtos",
+    ":benchmark:benchmark-macro:generateDebugProtos",
+    ":benchmark:benchmark-macro:compileReleaseKotlin",
+    ":benchmark:benchmark-macro:compileDebugKotlin",
+    ":benchmark:benchmark-macro:compileReleaseJavaWithJavac",
+    ":benchmark:benchmark-macro:compileDebugJavaWithJavac",
+    ":benchmark:benchmark-macro:extractReleaseAnnotations",
+    ":benchmark:benchmark-macro:extractDebugAnnotations",
+    ":benchmark:benchmark-macro:generateApi",
+    ":benchmark:benchmark-macro:runErrorProne"
 )
 
 // Additional tasks that are expected to be temporarily out-of-date after running once
@@ -138,6 +150,7 @@
     // More information about the fact that these dokka tasks rerun can be found at b/167569304
     "dokkaKotlinDocs",
     "zipDokkaDocs",
+    "dackkaDocs",
 
     // Flakily not up-to-date, b/176120659
     "doclavaDocs",
@@ -290,7 +303,7 @@
             }
 
             val reproductionMessage = "\nTo reproduce this error you can try running " +
-                "`./gradlew ${task.path} -PverifyUpToDate`\n"
+                "`./gradlew ${task.path} -P$RECORD_FLAG_NAME`\n"
             val readLogsMessage = "\nYou can check why Gradle executed ${task.path} by " +
                 "passing the '--info' flag to Gradle and then searching stdout for output " +
                 "generated immediately before the task began to execute.\n" +
diff --git a/buildSrc/studio_versions.properties b/buildSrc/studio_versions.properties
deleted file mode 100644
index a305f32..0000000
--- a/buildSrc/studio_versions.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# This file specifies the version of the Android Gradle Plugin and Android Studio to use
-# This information is stored in one file to make it hard to forget to update Studio versions
-# when updating AGP versions
-
-# the version of the Android Gradle Plugin
-agp=4.2.0-beta06
-# Note, lint version must be kept in sync with agp
-# NOTE: When updating the lint version we also need to update the `api` version supported
-#  by `IssueRegistry`'s.' For e.g. aosp/1331903
-lint=27.2.0-beta06
-
-# Version properties for Android Studio which should correspond to the version of AGP
-#
-# Once you have a chosen version of AGP to upgrade to, go to
-# https://developer.android.com/studio/archive and find the matching version of Studio.
-# For example, if you are upgrading to AGP 3.6 alpha 05, look for the Studio 3.6 canary 5 build.
-# (alpha maps to canary, beta to beta, rc to rc, and no suffix for stable in both cases)
-#
-# The download url should contain: ...ide-zips/3.6.0.5/android-studio-ide-191.5721125-linux...
-# From this, the first number (3.6.0.5) is [studio_version], the first number in the filename (192)
-# is the [idea_major_version] and the last number (5721125) is the [studio_build_number].
-studio_version=4.2.0.22
-idea_major_version=202
-studio_build_number=7188722
diff --git a/busytown/androidx.sh b/busytown/androidx.sh
index 045cccc8..229170c 100755
--- a/busytown/androidx.sh
+++ b/busytown/androidx.sh
@@ -6,10 +6,17 @@
 cd "$(dirname $0)"
 
 # Run Gradle
-impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
-    --profile "$@"
+EXIT_VALUE=0
+if impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
+    --profile "$@"; then
+  EXIT_VALUE=0
+else
+  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
 impl/parse_profile_htmls.sh
 
-echo "Completing $0 at $(date)"
+echo "Completing $0 at $(date) with exit value $EXIT_VALUE"
+
+exit "$EXIT_VALUE"
diff --git a/busytown/androidx_max_dep_versions.sh b/busytown/androidx_max_dep_versions.sh
index 65717ed..72c6665 100755
--- a/busytown/androidx_max_dep_versions.sh
+++ b/busytown/androidx_max_dep_versions.sh
@@ -5,7 +5,7 @@
 
 cd "$(dirname $0)"
 
-impl/build.sh assembleDebug assembleAndroidTest \
+impl/build.sh assembleRelease assembleAndroidTest \
     -Pandroidx.useMaxDepVersions \
     "$@"
 
diff --git a/busytown/androidx_multiplatform.sh b/busytown/androidx_multiplatform.sh
index 0688787..70493d7 100755
--- a/busytown/androidx_multiplatform.sh
+++ b/busytown/androidx_multiplatform.sh
@@ -1,16 +1,7 @@
 #!/bin/bash
 set -e
 
-echo "Starting $0 at $(date)"
-
 cd "$(dirname $0)"
 
-# Run Gradle
-impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
-    -Pandroidx.compose.multiplatformEnabled=true \
-    --profile "$@"
-
-# Parse performance profile reports (generated with the --profile option above) and re-export the metrics in an easily machine-readable format for tracking
-impl/parse_profile_htmls.sh
-
-echo "Completing $0 at $(date)"
+# Disabled due to b/185938795
+# ./androidx.sh -Pandroidx.compose.multiplatformEnabled=true "$@"
diff --git a/busytown/impl/build.sh b/busytown/impl/build.sh
index ff23e00..34d8330 100755
--- a/busytown/impl/build.sh
+++ b/busytown/impl/build.sh
@@ -3,6 +3,12 @@
 
 # This script runs frameworks/support/gradlew
 
+function showDiskStats() {
+  echo "df -h"
+  df -h
+}
+showDiskStats
+
 # find script
 SCRIPT_DIR="$(cd $(dirname $0) && pwd)"
 
@@ -18,6 +24,12 @@
 # record the build start time
 BUILD_START_MARKER="$OUT_DIR/build.sh.start"
 touch $BUILD_START_MARKER
+# record the build number
+echo "$BUILD_NUMBER" >> "$OUT_DIR/build_number.log"
+# only keep the last 10 build numbers
+tail -n 10 "$OUT_DIR/build_number.log" > "$OUT_DIR/build_number.log.tail"
+mv "$OUT_DIR/build_number.log.tail" "$OUT_DIR/build_number.log"
+cp "$OUT_DIR/build_number.log" "$DIST_DIR/build_number.log"
 
 # runs a given command and prints its result if it fails
 function run() {
@@ -32,6 +44,7 @@
     # Put each argument on its own line because some arguments may be long.
     # Also put "\" at the end of non-final lines so the command can be copy-pasted
     echo "$*" | sed 's/ / \\\n/g' | sed 's/^/    /' >&2
+    showDiskStats
     return 1
   fi
 }
@@ -47,7 +60,7 @@
 # --no-watch-fs disables file system watch, because it does not work on busytown
 # due to our builders using OS that is too old.
 run $PROJECTS_ARG OUT_DIR=$OUT_DIR DIST_DIR=$DIST_DIR ANDROID_HOME=../../prebuilts/fullsdk-linux \
-    ./gradlew --ci "$@"
+    ./gradlew --ci saveSystemStats "$@"
 
 # check that no unexpected modifications were made to the source repository, such as new cache directories
 DIST_DIR=$DIST_DIR $SCRIPT_DIR/verify_no_caches_in_source_repo.sh $BUILD_START_MARKER
diff --git a/busytown/impl/parse_profile_htmls.sh b/busytown/impl/parse_profile_htmls.sh
index 10f358e..bf33244 100755
--- a/busytown/impl/parse_profile_htmls.sh
+++ b/busytown/impl/parse_profile_htmls.sh
@@ -12,4 +12,8 @@
 
 METRICS_DIR="$DIST_DIR/librarymetrics/build"
 
-./parse_profile_html.py --input-profile "$(ls ../../../../out/androidx/build/reports/profile/*.html | sort | tail -n 2 | head -n 1)" --output-summary $METRICS_DIR/build_androidx.json
+# If a profile file exists, parse it. If not, do nothing
+PROFILE_FILES="../../../../out/androidx/build/reports/profile/*.html"
+if ls $PROFILE_FILES >/dev/null 2>&1 ; then
+  ./parse_profile_html.py --input-profile "$(ls $PROFILE_FILES | sort | tail -n 2 | head -n 1)" --output-summary $METRICS_DIR/build_androidx.json
+fi
diff --git a/camera/camera-camera2-pipe-integration/build.gradle b/camera/camera-camera2-pipe-integration/build.gradle
index 20baa76..2c57aeb 100644
--- a/camera/camera-camera2-pipe-integration/build.gradle
+++ b/camera/camera-camera2-pipe-integration/build.gradle
@@ -39,8 +39,7 @@
 
 dependencies {
     implementation("androidx.concurrent:concurrent-listenablefuture-callback:1.0.0-beta01")
-    releaseBundleInside(project(path: ":camera:camera-camera2-pipe", configuration: "exportRelease"))
-    debugBundleInside(project(path: ":camera:camera-camera2-pipe", configuration: "exportDebug"))
+    bundleInside(project(path: ":camera:camera-camera2-pipe", configuration: "exportRelease"))
 
     // Classes and types that are needed at compile & runtime
     api("androidx.annotation:annotation:1.1.0")
@@ -58,6 +57,15 @@
 
     kapt(DAGGER_COMPILER)
 
+    testImplementation(ANDROIDX_TEST_CORE)
+    testImplementation(ANDROIDX_TEST_RUNNER)
+    testImplementation(JUNIT)
+    testImplementation(TRUTH)
+    testImplementation(ROBOLECTRIC)
+    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(project(":camera:camera-camera2-pipe-testing"))
+    testImplementation(project(":internal-testutils-truth"))
+
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
diff --git a/camera/camera-camera2-pipe-integration/lint-baseline.xml b/camera/camera-camera2-pipe-integration/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/camera/camera-camera2-pipe-integration/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
index 0ae6bf1..746fcc6 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
@@ -19,16 +19,16 @@
 import android.annotation.SuppressLint
 import android.graphics.Rect
 import android.hardware.camera2.CameraCharacteristics
-import android.hardware.camera2.CaptureResult
+import android.util.Rational
 import androidx.camera.camera2.pipe.CameraPipe
-import androidx.camera.camera2.pipe.Result3A
 import androidx.camera.camera2.pipe.core.Log.warn
 import androidx.camera.camera2.pipe.integration.config.CameraScope
-import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
 import androidx.camera.camera2.pipe.integration.impl.CameraProperties
 import androidx.camera.camera2.pipe.integration.impl.EvCompControl
+import androidx.camera.camera2.pipe.integration.impl.FocusMeteringControl
 import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera
 import androidx.camera.camera2.pipe.integration.impl.UseCaseManager
+import androidx.camera.camera2.pipe.integration.impl.UseCaseThreads
 import androidx.camera.camera2.pipe.integration.impl.ZoomControl
 import androidx.camera.core.FocusMeteringAction
 import androidx.camera.core.FocusMeteringResult
@@ -68,6 +68,12 @@
     private var interopConfig: Config = MutableOptionsBundle.create()
     private var imageCaptureFlashMode: Int = ImageCapture.FLASH_MODE_OFF
 
+    private val focusMeteringControl = FocusMeteringControl(
+        cameraProperties,
+        useCaseManager,
+        threads
+    )
+
     override fun getSensorRect(): Rect {
         return cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
     }
@@ -108,8 +114,9 @@
     override fun startFocusAndMetering(
         action: FocusMeteringAction
     ): ListenableFuture<FocusMeteringResult> {
-        warn { "TODO: startFocusAndMetering is not yet supported" }
-        return Futures.immediateFuture(FocusMeteringResult.emptyInstance())
+        // TODO(sushilnath@): use preview aspect ratio instead of sensor active array aspect ratio.
+        val sensorAspectRatio = Rational(sensorRect.width(), sensorRect.height())
+        return focusMeteringControl.startFocusAndMetering(action, sensorAspectRatio)
     }
 
     override fun cancelFocusAndMetering(): ListenableFuture<Void> {
@@ -179,26 +186,9 @@
         }.asListenableFuture()
     }
 
-    override fun submitCaptureRequests(captureConfigs: MutableList<CaptureConfig>) {
-        warn { "TODO: submitCaptureRequests is not yet supported" }
-    }
-
-    /**
-     * Give whether auto focus trigger was desired, this method transforms a [Result3A] into
-     * [FocusMeteringResult] by checking if the auto focus was locked in a focused state.
-     *
-     * TODO(sushilnath): Move this to an adapter class specific to 3A operations.
-     */
-    private fun Result3A.toFocusMeteringResult(shouldTriggerAf: Boolean): FocusMeteringResult {
-        if (this.status != Result3A.Status.OK) {
-            return FocusMeteringResult.create(false)
-        }
-        val isFocusSuccessful =
-            if (shouldTriggerAf)
-                this.frameMetadata?.get(CaptureResult.CONTROL_AF_STATE) ==
-                    CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
-            else true
-
-        return FocusMeteringResult.create(isFocusSuccessful)
+    override fun submitCaptureRequests(captureConfigs: List<CaptureConfig>) {
+        val camera = useCaseManager.camera
+        checkNotNull(camera) { "Attempted to issue capture requests while the camera isn't ready." }
+        camera.capture(captureConfigs)
     }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
index 7e753b2..d5242c4 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
@@ -94,7 +94,7 @@
     }
 
     override fun onUseCaseReset(useCase: UseCase) {
-        useCaseManager.update(useCase)
+        useCaseManager.reset(useCase)
     }
 
     override fun onUseCaseInactive(useCase: UseCase) {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
index a276b2c..8645cc2 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
@@ -126,7 +126,15 @@
 
     object DefaultCaptureOptionsUnpacker : CaptureConfig.OptionUnpacker {
         override fun unpack(config: UseCaseConfig<*>, builder: CaptureConfig.Builder) {
-            // Unused.
+            val defaultCaptureConfig = config.defaultCaptureConfig
+            builder.templateType = defaultCaptureConfig.templateType
+            builder.implementationOptions = defaultCaptureConfig.implementationOptions
+            builder.addAllCameraCaptureCallbacks(defaultCaptureConfig.cameraCaptureCallbacks)
+            builder.setUseRepeatingSurface(defaultCaptureConfig.isUseRepeatingSurface)
+            builder.addAllTags(defaultCaptureConfig.tagBundle)
+            defaultCaptureConfig.surfaces.forEach { builder.addSurface(it) }
+
+            // TODO: Add extensions-specific capture request options
         }
     }
 
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt
new file mode 100644
index 0000000..4da13dc
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.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.camera.camera2.pipe.integration.adapter
+
+import android.hardware.camera2.CaptureRequest
+import androidx.camera.camera2.pipe.Request
+import androidx.camera.camera2.pipe.RequestTemplate
+import androidx.camera.camera2.pipe.StreamId
+import androidx.camera.camera2.pipe.integration.impl.CameraCallbackMap
+import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.core.impl.DeferrableSurface
+import java.util.concurrent.Executor
+
+/**
+ * Maps a [CaptureConfig] issued by CameraX (e.g. by the image capture use case) to a [Request]
+ * that CameraPipe can submit to the camera.
+ */
+class CaptureConfigAdapter(
+    private val surfaceToStreamMap: Map<DeferrableSurface, StreamId>,
+    private val callbackExecutor: Executor,
+) {
+
+    fun mapToRequest(captureConfig: CaptureConfig): Request {
+        val surfaces = captureConfig.surfaces
+        check(surfaces.isNotEmpty()) {
+            "Attempted to issue a capture without surfaces using $captureConfig"
+        }
+
+        // TODO: It's assumed a single surface is used per use case, even though capture requests
+        //  can support multiple surfaces. Look into potentially bridging the gap between the two
+        //  in this layer.
+        val streamId = surfaceToStreamMap[surfaces.single()]
+        checkNotNull(streamId) { "Attempted to issue a capture with an unrecognized surface." }
+
+        val callbacks = CameraCallbackMap().apply {
+            captureConfig.cameraCaptureCallbacks.forEach { callback ->
+                addCaptureCallback(callback, callbackExecutor)
+            }
+        }
+
+        val parameters = mutableMapOf<CaptureRequest.Key<*>, Any>()
+        val configOptions = captureConfig.implementationOptions
+
+        // Add potential capture options set through Camera2 interop
+        // TODO: When adding support for Camera2 interop, ensure interop options are correctly
+        //  being added to the capture request
+        for (configOption in configOptions.listOptions()) {
+            val requestKey = configOption.token as? CaptureRequest.Key<*> ?: continue
+            val value = configOptions.retrieveOption(configOption) ?: continue
+            parameters[requestKey] = value
+        }
+
+        // Add capture options defined in CaptureConfig
+        if (configOptions.containsOption(CaptureConfig.OPTION_ROTATION)) {
+            parameters[CaptureRequest.JPEG_ORIENTATION] =
+                configOptions.retrieveOption(CaptureConfig.OPTION_ROTATION)!!
+        }
+        if (configOptions.containsOption(CaptureConfig.OPTION_JPEG_QUALITY)) {
+            parameters[CaptureRequest.JPEG_QUALITY] =
+                configOptions.retrieveOption(CaptureConfig.OPTION_JPEG_QUALITY)!!.toByte()
+        }
+
+        // TODO: When adding support for extensions, also add support for passing capture request
+        //  tags with each request, since extensions may rely on these tags.
+        return Request(
+            streams = listOf(streamId),
+            listeners = listOf(callbacks),
+            parameters = parameters,
+            template = RequestTemplate(captureConfig.templateType)
+        )
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
index 1619e7f..3cd2d2b 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
@@ -80,4 +80,13 @@
             executor.execute { callback.onCaptureCancelled() }
         }
     }
+
+    // TODO(b/186853278): Look into why onComplete isn't called
+    override fun onTotalCaptureResult(
+        requestMetadata: RequestMetadata,
+        frameNumber: FrameNumber,
+        totalCaptureResult: FrameInfo
+    ) {
+        onComplete(requestMetadata, frameNumber, totalCaptureResult)
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
new file mode 100644
index 0000000..235c103
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
@@ -0,0 +1,181 @@
+/*
+ * 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.camera2.pipe.integration.impl
+
+import android.graphics.PointF
+import android.graphics.Rect
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CaptureResult
+import android.hardware.camera2.params.MeteringRectangle
+import android.util.Rational
+import androidx.camera.camera2.pipe.Result3A
+import androidx.camera.core.FocusMeteringAction
+import androidx.camera.core.FocusMeteringResult
+import androidx.camera.core.MeteringPoint
+import androidx.camera.core.impl.CameraControlInternal
+import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.async
+import kotlinx.coroutines.guava.asListenableFuture
+import java.util.ArrayList
+
+/**
+ * Implementation of focus and metering controls exposed by [CameraControlInternal].
+ */
+class FocusMeteringControl(
+    val cameraProperties: CameraProperties,
+    val useCaseManager: UseCaseManager,
+    val threads: UseCaseThreads,
+) {
+    private val sensorRect =
+        cameraProperties.metadata[CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE]!!
+
+    fun startFocusAndMetering(
+        action: FocusMeteringAction,
+        defaultAspectRatio: Rational
+    ): ListenableFuture<FocusMeteringResult> {
+        // TODO(sushilnath): Throw a proper exception when (a). camera is null, (b) all of ae, af
+        return threads.scope.async(start = CoroutineStart.UNDISPATCHED) {
+            useCaseManager.camera!!.startFocusAndMeteringAsync(
+                aeRegions = meteringRegionsFromMeteringPoints(
+                    action.meteringPointsAe,
+                    sensorRect,
+                    defaultAspectRatio
+                ),
+                afRegions = meteringRegionsFromMeteringPoints(
+                    action.meteringPointsAf,
+                    sensorRect,
+                    defaultAspectRatio
+                ),
+                awbRegions = meteringRegionsFromMeteringPoints(
+                    action.meteringPointsAwb,
+                    sensorRect,
+                    defaultAspectRatio
+                )
+            ).await().toFocusMeteringResult(true)
+        }.asListenableFuture()
+    }
+
+    /**
+     * Give whether auto focus trigger was desired, this method transforms a [Result3A] into
+     * [FocusMeteringResult] by checking if the auto focus was locked in a focused state.
+     */
+    private fun Result3A.toFocusMeteringResult(shouldTriggerAf: Boolean): FocusMeteringResult {
+        if (this.status != Result3A.Status.OK) {
+            return FocusMeteringResult.create(false)
+        }
+        val isFocusSuccessful =
+            if (shouldTriggerAf)
+                this.frameMetadata?.get(CaptureResult.CONTROL_AF_STATE) ==
+                    CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
+            else true
+
+        return FocusMeteringResult.create(isFocusSuccessful)
+    }
+
+    companion object {
+        const val METERING_WEIGHT_DEFAULT = MeteringRectangle.METERING_WEIGHT_MAX
+
+        fun meteringRegionsFromMeteringPoints(
+            meteringPoints: List<MeteringPoint>,
+            cropSensorRegion: Rect,
+            defaultAspectRatio: Rational,
+        ): List<MeteringRectangle> {
+            val meteringRegions: MutableList<MeteringRectangle> = ArrayList()
+            val cropRegionAspectRatio =
+                Rational(cropSensorRegion.width(), cropSensorRegion.height())
+
+            // TODO(sushilnath@): limit the number of metering regions to what is supported by the
+            // device.
+            for (meteringPoint in meteringPoints) {
+                if (!isValid(meteringPoint)) {
+                    continue
+                }
+                // TODO(sushilnath@): Use the zoom based crop region aspect ratio instead of sensor
+                // active array aspect ratio.
+                val adjustedPoint: PointF =
+                    getFovAdjustedPoint(meteringPoint, cropRegionAspectRatio, defaultAspectRatio)
+                val meteringRectangle: MeteringRectangle =
+                    getMeteringRect(adjustedPoint, meteringPoint.size, cropSensorRegion)
+                meteringRegions.add(meteringRectangle)
+            }
+            return meteringRegions
+        }
+
+        // Illustration ref : https://source.android.com/devices/camera/camera3_crop_reprocess
+        private fun getFovAdjustedPoint(
+            meteringPoint: MeteringPoint,
+            cropRegionAspectRatio: Rational,
+            defaultAspectRatio: Rational
+        ): PointF {
+            // Use default aspect ratio unless there is a custom aspect ratio in MeteringPoint.
+            val fovAspectRatio = meteringPoint.surfaceAspectRatio ?: defaultAspectRatio
+            if (fovAspectRatio != cropRegionAspectRatio) {
+                if (fovAspectRatio.compareTo(cropRegionAspectRatio) > 0) {
+                    val adjustedPoint = PointF(meteringPoint.x, meteringPoint.y)
+                    // The crop region is taller than the FOV, top and bottom of the crop region is
+                    // cropped.
+                    val verticalPadding =
+                        (fovAspectRatio.toDouble() / cropRegionAspectRatio.toDouble()).toFloat()
+                    val topPadding = ((verticalPadding - 1.0) / 2).toFloat()
+                    adjustedPoint.y = (topPadding + adjustedPoint.y) * (1f / verticalPadding)
+                    return adjustedPoint
+                } else {
+                    val adjustedPoint = PointF(meteringPoint.x, meteringPoint.y)
+                    // The crop region is wider than the FOV, left and right side of crop region is
+                    // cropped
+                    val horizontalPadding =
+                        (cropRegionAspectRatio.toDouble() / fovAspectRatio.toDouble()).toFloat()
+                    val leftPadding = ((horizontalPadding - 1.0) / 2).toFloat()
+                    adjustedPoint.x = (leftPadding + adjustedPoint.x) * (1f / horizontalPadding)
+                    return adjustedPoint
+                }
+            }
+            return PointF(meteringPoint.x, meteringPoint.y)
+        }
+
+        // Given a normalized PointF and normalized size factor for width and height, calculate
+        // the corresponding metering rectangle for the given crop region. The necessary
+        // constraints are applies to make sure that the metering rectangle is bonded within the
+        // crop region.
+        private fun getMeteringRect(
+            normalizedPointF: PointF,
+            normalizedSize: Float,
+            cropRegion: Rect
+        ): MeteringRectangle {
+            val centerX = (cropRegion.left + normalizedPointF.x * cropRegion.width()).toInt()
+            val centerY = (cropRegion.top + normalizedPointF.y * cropRegion.height()).toInt()
+            val width = (normalizedSize * cropRegion.width()).toInt()
+            val height = (normalizedSize * cropRegion.height()).toInt()
+            val focusRect = Rect(
+                centerX - width / 2,
+                centerY - height / 2,
+                centerX + width / 2,
+                centerY + height / 2
+            )
+            focusRect.left = focusRect.left.coerceIn(cropRegion.left, cropRegion.right)
+            focusRect.right = focusRect.right.coerceIn(cropRegion.left, cropRegion.right)
+            focusRect.top = focusRect.top.coerceIn(cropRegion.top, cropRegion.bottom)
+            focusRect.bottom = focusRect.bottom.coerceIn(cropRegion.top, cropRegion.bottom)
+            return MeteringRectangle(focusRect, METERING_WEIGHT_DEFAULT)
+        }
+
+        private fun isValid(pt: MeteringPoint): Boolean {
+            return pt.x >= 0f && pt.x <= 1f && pt.y >= 0f && pt.y <= 1f
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
index e16c2d3..bf7a093 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
@@ -17,18 +17,22 @@
 package androidx.camera.camera2.pipe.integration.impl
 
 import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.params.MeteringRectangle
 import android.view.Surface
 import androidx.camera.camera2.pipe.CameraGraph
 import androidx.camera.camera2.pipe.CameraPipe
 import androidx.camera.camera2.pipe.CameraStream
+import androidx.camera.camera2.pipe.Lock3ABehavior
 import androidx.camera.camera2.pipe.Result3A
 import androidx.camera.camera2.pipe.StreamFormat
 import androidx.camera.camera2.pipe.StreamId
 import androidx.camera.camera2.pipe.TorchState
 import androidx.camera.camera2.pipe.core.Log.debug
+import androidx.camera.camera2.pipe.integration.adapter.CaptureConfigAdapter
 import androidx.camera.camera2.pipe.integration.config.CameraConfig
 import androidx.camera.camera2.pipe.integration.config.UseCaseCameraScope
 import androidx.camera.core.UseCase
+import androidx.camera.core.impl.CaptureConfig
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.utils.futures.FutureCallback
 import androidx.camera.core.impl.utils.futures.Futures
@@ -51,8 +55,14 @@
 
     // 3A
     suspend fun setTorchAsync(enabled: Boolean): Deferred<Result3A>
+    suspend fun startFocusAndMeteringAsync(
+        aeRegions: List<MeteringRectangle>,
+        afRegions: List<MeteringRectangle>,
+        awbRegions: List<MeteringRectangle>
+    ): Deferred<Result3A>
 
     // Capture
+    fun capture(captureSequence: List<CaptureConfig>)
 
     // Lifecycle
     fun close()
@@ -65,7 +75,9 @@
     private val cameraGraph: CameraGraph,
     private val useCases: List<UseCase>,
     private val surfaceToStreamMap: Map<DeferrableSurface, StreamId>,
-    private val state: UseCaseCameraState
+    private val state: UseCaseCameraState,
+    private val configAdapter: CaptureConfigAdapter,
+    private val threads: UseCaseThreads,
 ) : UseCaseCamera {
     private val debugId = useCaseCameraIds.incrementAndGet()
     private val currentParameters = mutableMapOf<CaptureRequest.Key<*>, Any>()
@@ -100,6 +112,21 @@
         }
     }
 
+    override suspend fun startFocusAndMeteringAsync(
+        aeRegions: List<MeteringRectangle>,
+        afRegions: List<MeteringRectangle>,
+        awbRegions: List<MeteringRectangle>
+    ): Deferred<Result3A> {
+        return cameraGraph.acquireSession().use {
+            it.lock3A(
+                aeRegions = aeRegions,
+                afRegions = afRegions,
+                awbRegions = awbRegions,
+                afLockBehavior = Lock3ABehavior.AFTER_NEW_SCAN
+            )
+        }
+    }
+
     override fun <T> setParameter(key: CaptureRequest.Key<T>, value: T) {
         currentParameters[key] = value as Any
         state.update(parameters = currentParameters)
@@ -120,8 +147,15 @@
         return state.updateAsync(parameters = currentParameters)
     }
 
+    override fun capture(captureSequence: List<CaptureConfig>) {
+        val requests = captureSequence.map { configAdapter.mapToRequest(it) }
+        state.capture(requests)
+    }
+
     private fun updateUseCases() {
         val repeatingStreamIds = mutableSetOf<StreamId>()
+        val repeatingListeners = CameraCallbackMap()
+
         for (useCase in activeUseCases) {
             val repeatingCapture = useCase.sessionConfig?.repeatingCaptureConfig
             if (repeatingCapture != null) {
@@ -132,9 +166,14 @@
                     }
                 }
             }
+
+            val repeatingCallbacks = useCase.sessionConfig?.repeatingCameraCaptureCallbacks
+            repeatingCallbacks?.forEach {
+                repeatingListeners.addCaptureCallback(it, threads.backgroundExecutor)
+            }
         }
 
-        state.update(streams = repeatingStreamIds)
+        state.update(streams = repeatingStreamIds, listeners = setOf(repeatingListeners))
     }
 
     override fun toString(): String = "UseCaseCamera-$debugId"
@@ -207,9 +246,18 @@
                 }
 
                 val state = UseCaseCameraState(graph, threads)
+                val configAdapter =
+                    CaptureConfigAdapter(surfaceToStreamMap, threads.backgroundExecutor)
 
                 graph.start()
-                return UseCaseCameraImpl(graph, useCases, surfaceToStreamMap, state)
+                return UseCaseCameraImpl(
+                    graph,
+                    useCases,
+                    surfaceToStreamMap,
+                    state,
+                    configAdapter,
+                    threads
+                )
             }
         }
     }
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
index b1cb05d..20494cb 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
@@ -65,13 +65,17 @@
     private val currentStreams = mutableSetOf<StreamId>()
 
     @GuardedBy("lock")
+    private val currentListeners = mutableSetOf<Request.Listener>()
+
+    @GuardedBy("lock")
     private var currentTemplate: RequestTemplate? = null
 
     fun updateAsync(
         parameters: Map<CaptureRequest.Key<*>, Any>? = null,
         internalParameters: Map<Metadata.Key<*>, Any>? = null,
         streams: Set<StreamId>? = null,
-        template: RequestTemplate? = null
+        template: RequestTemplate? = null,
+        listeners: Set<Request.Listener>? = null
     ): Deferred<Unit> {
         val result: Deferred<Unit>
         synchronized(lock) {
@@ -89,7 +93,7 @@
             //    exit the locked section.
             // 5) If updating, invoke submit without holding the lock.
 
-            updateState(parameters, internalParameters, streams, template)
+            updateState(parameters, internalParameters, streams, template, listeners)
 
             if (updateSignal == null) {
                 updateSignal = CompletableDeferred()
@@ -111,11 +115,12 @@
         parameters: Map<CaptureRequest.Key<*>, Any>? = null,
         internalParameters: Map<Metadata.Key<*>, Any>? = null,
         streams: Set<StreamId>? = null,
-        template: RequestTemplate? = null
+        template: RequestTemplate? = null,
+        listeners: Set<Request.Listener>? = null
     ) {
         synchronized(lock) {
             // See updateAsync for details.
-            updateState(parameters, internalParameters, streams, template)
+            updateState(parameters, internalParameters, streams, template, listeners)
             if (updating) {
                 return
             }
@@ -124,12 +129,21 @@
         submitLatest()
     }
 
+    fun capture(requests: List<Request>) {
+        threads.scope.launch(start = CoroutineStart.UNDISPATCHED) {
+            cameraGraph.acquireSession().use {
+                it.submit(requests)
+            }
+        }
+    }
+
     @GuardedBy("lock")
     private inline fun updateState(
         parameters: Map<CaptureRequest.Key<*>, Any>? = null,
         internalParameters: Map<Metadata.Key<*>, Any>? = null,
         streams: Set<StreamId>? = null,
-        template: RequestTemplate? = null
+        template: RequestTemplate? = null,
+        listeners: Set<Request.Listener>? = null
     ) {
         // TODO: Consider if this should detect changes and only invoke an update if state has
         //  actually changed.
@@ -146,6 +160,10 @@
         if (template != null) {
             currentTemplate = template
         }
+        if (listeners != null) {
+            currentListeners.clear()
+            currentListeners.addAll(listeners)
+        }
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
@@ -154,25 +172,36 @@
         // Since acquireSession is a suspending function, it's possible that subsequent updates
         // can occur while waiting for the acquireSession call to complete. If this happens,
         // updates to the internal state are aggregated together, and the Request is built
-        // synchronously with the latest values. The setRepeating call happens outside of the
-        // synchronized block to avoid holding a lock while updating the camera state.
+        // synchronously with the latest values. The startRepeating/stopRepeating call happens
+        // outside of the synchronized block to avoid holding a lock while updating the camera
+        // state.
 
         threads.scope.launch(start = CoroutineStart.UNDISPATCHED) {
             val result: CompletableDeferred<Unit>?
             cameraGraph.acquireSession().use {
-                val request: Request
+                val request: Request?
                 synchronized(lock) {
-                    request = Request(
-                        template = currentTemplate,
-                        streams = currentStreams.toList(),
-                        parameters = currentParameters.toMap(),
-                        extras = currentInternalParameters.toMap()
-                    )
+                    request = if (currentStreams.isEmpty()) {
+                        null
+                    } else {
+                        Request(
+                            template = currentTemplate,
+                            streams = currentStreams.toList(),
+                            parameters = currentParameters.toMap(),
+                            extras = currentInternalParameters.toMap(),
+                            listeners = currentListeners.toList()
+                        )
+                    }
                     result = updateSignal
                     updateSignal = null
                     updating = false
                 }
-                it.startRepeating(request)
+
+                if (request == null) {
+                    it.stopRepeating()
+                } else {
+                    it.startRepeating(request)
+                }
             }
 
             // Complete the result after the session closes to allow other threads to acquire a
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
index e93305c..8a78385 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
@@ -100,6 +100,12 @@
         }
     }
 
+    fun reset(useCase: UseCase) {
+        if (attachedUseCases.contains(useCase)) {
+            start(attachedUseCases)
+        }
+    }
+
     override fun toString(): String = "UseCaseManager<${cameraConfig.cameraId}>"
 
     private fun invalidate() {
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapterTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapterTest.kt
new file mode 100644
index 0000000..8c846fc
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapterTest.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.camera2.pipe.integration.adapter
+
+import android.hardware.camera2.CameraDevice
+import android.os.Build
+import android.view.Surface
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.impl.CameraCaptureCallback
+import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.core.impl.ImageOutputConfig
+import androidx.camera.core.impl.MutableOptionsBundle
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class CameraUseCaseAdapterTest {
+
+    @Test
+    fun shouldApplyOptionsFromConfigToBuilder_whenDefaultConfigSet() {
+        // Arrange
+        val defaultCaptureConfig = CaptureConfig.Builder()
+            .apply {
+                templateType = CameraDevice.TEMPLATE_STILL_CAPTURE
+                implementationOptions = MutableOptionsBundle.create()
+                    .apply {
+                        insertOption(ImageOutputConfig.OPTION_TARGET_ROTATION, Surface.ROTATION_180)
+                    }
+                addCameraCaptureCallback(object : CameraCaptureCallback() {})
+            }
+            .build()
+        val useCaseConfig = ImageCapture.Builder()
+            .setDefaultCaptureConfig(defaultCaptureConfig)
+            .useCaseConfig
+        val builder = CaptureConfig.Builder()
+
+        // Act
+        CameraUseCaseAdapter.DefaultCaptureOptionsUnpacker.unpack(useCaseConfig, builder)
+
+        // Assert
+        val config = builder.build()
+        config.assertEquals(useCaseConfig.defaultCaptureConfig)
+    }
+
+    private fun CaptureConfig.assertEquals(other: CaptureConfig) {
+        assertThat(templateType).isEqualTo(other.templateType)
+        assertThat(isUseRepeatingSurface).isEqualTo(other.isUseRepeatingSurface)
+        assertThat(cameraCaptureCallbacks).isEqualTo(other.cameraCaptureCallbacks)
+        assertThat(surfaces).isEqualTo(other.surfaces)
+
+        // Implementation options
+        assertThat(implementationOptions.listOptions())
+            .isEqualTo(other.implementationOptions.listOptions())
+        implementationOptions.listOptions().forEach { option ->
+            assertThat(implementationOptions.retrieveOption(option)).isEqualTo(
+                other.implementationOptions.retrieveOption(option)
+            )
+        }
+
+        // Tag bundle
+        assertThat(tagBundle.listKeys()).isEqualTo(other.tagBundle.listKeys())
+        tagBundle.listKeys().forEach { key ->
+            assertThat(tagBundle.getTag(key)).isEqualTo(other.tagBundle.getTag(key))
+        }
+    }
+}
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapterTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapterTest.kt
new file mode 100644
index 0000000..7e82479
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapterTest.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.camera2.pipe.integration.adapter
+
+import android.hardware.camera2.CaptureRequest
+import android.os.Build
+import android.view.Surface
+import androidx.camera.camera2.pipe.StreamId
+import androidx.camera.core.impl.CameraCaptureCallback
+import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.core.impl.DeferrableSurface
+import androidx.camera.core.impl.utils.futures.Futures
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import java.util.concurrent.Executors
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+@DoNotInstrument
+class CaptureConfigAdapterTest {
+
+    @Test
+    fun shouldFail_whenCaptureConfigHasNoSurfaces() {
+        // Arrange
+        val captureConfig = CaptureConfig.defaultEmptyCaptureConfig()
+        val configAdapter = CaptureConfigAdapter(
+            surfaceToStreamMap = emptyMap(),
+            callbackExecutor = Executors.newSingleThreadExecutor()
+        )
+
+        // Act/Assert
+        assertThrows<IllegalStateException> {
+            configAdapter.mapToRequest(captureConfig)
+        }
+    }
+
+    @Test
+    fun shouldFail_whenCaptureConfigSurfaceNotRecognized() {
+        // Arrange
+        val captureConfig = CaptureConfig.Builder()
+            .apply { addSurface(FakeSurface()) }
+            .build()
+        val configAdapter = CaptureConfigAdapter(
+            surfaceToStreamMap = emptyMap(),
+            callbackExecutor = Executors.newSingleThreadExecutor()
+        )
+
+        // Act/Assert
+        assertThrows<IllegalStateException> {
+            configAdapter.mapToRequest(captureConfig)
+        }
+    }
+
+    @Test
+    fun shouldReturnRequestThatIncludesCaptureCallbacks() {
+        // Arrange
+        val surface = FakeSurface()
+        val configAdapter = CaptureConfigAdapter(
+            surfaceToStreamMap = mapOf(surface to StreamId(0)),
+            callbackExecutor = Executors.newSingleThreadExecutor()
+        )
+
+        val callbackAborted = CompletableDeferred<Unit>()
+        val captureCallback = object : CameraCaptureCallback() {
+            override fun onCaptureCancelled() {
+                callbackAborted.complete(Unit)
+            }
+        }
+        val captureConfig = CaptureConfig.Builder()
+            .apply {
+                addSurface(surface)
+                addCameraCaptureCallback(captureCallback)
+            }
+            .build()
+
+        // Act
+        val request = configAdapter.mapToRequest(captureConfig)
+        request.listeners.forEach { listener ->
+            listener.onAborted(request)
+        }
+
+        // Assert
+        runBlocking {
+            callbackAborted.await()
+        }
+    }
+
+    @Test
+    fun shouldReturnRequestThatIncludesCaptureOptions() {
+        // Arrange
+        val surface = FakeSurface()
+        val configAdapter = CaptureConfigAdapter(
+            surfaceToStreamMap = mapOf(surface to StreamId(0)),
+            callbackExecutor = Executors.newSingleThreadExecutor()
+        )
+
+        val captureConfig = CaptureConfig.Builder()
+            .apply {
+                addSurface(surface)
+                addImplementationOption(CaptureConfig.OPTION_ROTATION, 90)
+            }
+            .build()
+
+        // Act
+        val request = configAdapter.mapToRequest(captureConfig)
+
+        // Assert
+        val rotation = request.parameters[CaptureRequest.JPEG_ORIENTATION]
+        assertThat(rotation).isEqualTo(90)
+    }
+}
+
+private class FakeSurface : DeferrableSurface() {
+    override fun provideSurface(): ListenableFuture<Surface> {
+        return Futures.immediateFuture(null)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.kt
new file mode 100644
index 0000000..9c98ee5
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/FocusMeteringControlTest.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.
+ */
+
+package androidx.camera.camera2.pipe.integration.adapter
+
+import android.graphics.Rect
+import android.hardware.camera2.params.MeteringRectangle
+import android.os.Build
+import android.util.Rational
+import androidx.camera.camera2.pipe.integration.impl.FocusMeteringControl
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+@DoNotInstrument
+public class FocusMeteringControlTest {
+    @Test
+    public fun meteringRegionsFromMeteringPoint_fovAspectRatioEqualToCropAspectRatio() {
+        val meteringPoint = FakeMeteringPointFactory().createPoint(0.0f, 0.0f)
+        val meteringRectangles = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint),
+            Rect(0, 0, 800, 600),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles.size).isEqualTo(1)
+        // Aspect ratio of crop region is same as default aspect ratio. So no padding is needed
+        // along width or height. However only the bottom right quadrant of the metering rectangle
+        // will fit inside the crop region.
+        val expectedMeteringRectangle = MeteringRectangle(
+            0, 0, 60, 45, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles[0]).isEqualTo(expectedMeteringRectangle)
+
+        val meteringPoint1 = FakeMeteringPointFactory().createPoint(0.5f, 0.5f)
+        val meteringRectangles1 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint1),
+            Rect(0, 0, 800, 600),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles1.size).isEqualTo(1)
+        // Aspect ratio of crop region is same as default aspect ratio. So no padding is needed
+        // along width or height. The metering region will completely fit inside the crop region.
+        val expectedMeteringRectangle1 = MeteringRectangle(
+            340, 255, 120, 90, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles1[0]).isEqualTo(expectedMeteringRectangle1)
+
+        val meteringPoint2 = FakeMeteringPointFactory().createPoint(1f, 1f)
+        val meteringRectangles2 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint2),
+            Rect(0, 0, 800, 600),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles2.size).isEqualTo(1)
+        // Aspect ratio of crop region is same as default aspect ratio. So no padding is needed
+        // along width or height. However only the top left quadrant of the metering rectangle
+        // will fit inside the crop region.
+        val expectedMeteringRectangle2 = MeteringRectangle(
+            740, 555, 60, 45, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles2[0]).isEqualTo(expectedMeteringRectangle2)
+    }
+
+    @Test
+    public fun meteringRegionsFromMeteringPoint_fovAspectRatioGreaterThanCropAspectRatio() {
+        val meteringPoint = FakeMeteringPointFactory().createPoint(0.0f, 0.0f)
+        val meteringRectangles = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint),
+            Rect(0, 0, 400, 400),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles.size).isEqualTo(1)
+        // Default aspect ratio is greater than the aspect ratio of the crop region. So we need
+        // to add some padding at the top.
+        val expectedMeteringRectangle = MeteringRectangle(
+            0, 20, 30, 60, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles[0]).isEqualTo(expectedMeteringRectangle)
+
+        val meteringPoint1 = FakeMeteringPointFactory().createPoint(0.5f, 0.5f)
+        val meteringRectangles1 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint1),
+            Rect(0, 0, 400, 400),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles1.size).isEqualTo(1)
+        val expectedMeteringRectangle1 = MeteringRectangle(
+            170, 170, 60, 60, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles1[0]).isEqualTo(expectedMeteringRectangle1)
+
+        val meteringPoint2 = FakeMeteringPointFactory().createPoint(1f, 1f)
+        val meteringRectangles2 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint2),
+            Rect(0, 0, 400, 400),
+            Rational(4, 3)
+        )
+        assertThat(meteringRectangles2.size).isEqualTo(1)
+        // Default aspect ratio is greater than the aspect ratio of the crop region. So we need
+        // to add some padding at the bottom.
+        val expectedMeteringRectangle2 = MeteringRectangle(
+            370, 320, 30, 60, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles2[0]).isEqualTo(expectedMeteringRectangle2)
+    }
+
+    @Test
+    public fun meteringRegionsFromMeteringPoint_fovAspectRatioLessThanCropAspectRatio() {
+        val meteringPoint = FakeMeteringPointFactory().createPoint(0.0f, 0.0f)
+        val meteringRectangles = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint),
+            Rect(0, 0, 400, 400),
+            Rational(3, 4)
+        )
+        assertThat(meteringRectangles.size).isEqualTo(1)
+        val expectedMeteringRectangle = MeteringRectangle(
+            20, 0, 60, 30, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles[0]).isEqualTo(expectedMeteringRectangle)
+
+        val meteringPoint1 = FakeMeteringPointFactory().createPoint(0.5f, 0.5f)
+        val meteringRectangles1 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint1),
+            Rect(0, 0, 400, 400),
+            Rational(3, 4)
+        )
+        assertThat(meteringRectangles1.size).isEqualTo(1)
+        val expectedMeteringRectangle1 = MeteringRectangle(
+            170, 170, 60, 60, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles1[0]).isEqualTo(expectedMeteringRectangle1)
+
+        val meteringPoint2 = FakeMeteringPointFactory().createPoint(1f, 1f)
+        val meteringRectangles2 = FocusMeteringControl.meteringRegionsFromMeteringPoints(
+            listOf(meteringPoint2),
+            Rect(0, 0, 400, 400),
+            Rational(3, 4)
+        )
+        assertThat(meteringRectangles2.size).isEqualTo(1)
+        val expectedMeteringRectangle2 = MeteringRectangle(
+            320, 370, 60, 30, FocusMeteringControl.METERING_WEIGHT_DEFAULT
+        )
+        assertThat(meteringRectangles2[0]).isEqualTo(expectedMeteringRectangle2)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeMeteringPointFactory.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeMeteringPointFactory.kt
new file mode 100644
index 0000000..2ebc216
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/FakeMeteringPointFactory.kt
@@ -0,0 +1,26 @@
+/*
+ * 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.camera2.pipe.integration.adapter
+
+import android.graphics.PointF
+import androidx.camera.core.MeteringPointFactory
+
+class FakeMeteringPointFactory : MeteringPointFactory() {
+    override fun convertPoint(x: Float, y: Float): PointF {
+        return PointF(x, y)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/RobolectricCameraPipeTestRunner.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/RobolectricCameraPipeTestRunner.kt
new file mode 100644
index 0000000..f4d8d0f
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/testing/RobolectricCameraPipeTestRunner.kt
@@ -0,0 +1,107 @@
+/*
+ * 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.camera2.pipe.integration.adapter
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.runners.model.FrameworkMethod
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.internal.bytecode.InstrumentationConfiguration
+
+/**
+ * A [RobolectricTestRunner] for [androidx.camera.camera2.pipe] unit tests.
+ *
+ * This test runner disables instrumentation for the [androidx.camera.camera2.pipe] and
+ * [androidx.camera.camera2.pipe.testing] packages.
+ *
+ * Robolectric tries to instrument Kotlin classes, and it throws errors when it encounters
+ * companion objects, constructors with default values for parameters, and data classes with
+ * inline classes. We don't need shadowing of our classes because we want to use the actual
+ * objects in our tests.
+ */
+public class RobolectricCameraPipeTestRunner(testClass: Class<*>) :
+    RobolectricTestRunner(testClass) {
+    override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration {
+        val builder = InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
+        builder.doNotInstrumentPackage("androidx.camera.camera2.pipe")
+        builder.doNotInstrumentPackage("androidx.camera.camera2.pipe.testing")
+        return builder.build()
+    }
+}
+
+@Suppress("EXPERIMENTAL_FEATURE_WARNING")
+public inline class TestValue(public val value: String)
+
+public data class TestData(
+    val value1: TestValue,
+    val value2: String
+)
+
+@RunWith(JUnit4::class)
+public class DataWithInlineClassJUnitTest {
+    @Test
+    public fun inlineClassesAreEqualInJUnit() {
+        assertThat(TestValue("42")).isEqualTo(
+            TestValue("42")
+        )
+    }
+
+    @Test
+    public fun dataWithInlineClassesAreEqualInJUnit() {
+        assertThat(
+            TestData(
+                value1 = TestValue("Test value #1"),
+                value2 = "Test value #2"
+            )
+        ).isEqualTo(
+            TestData(
+                value1 = TestValue("Test value #1"),
+                value2 = "Test value #2"
+            )
+        )
+    }
+}
+
+@RunWith(RobolectricCameraPipeTestRunner::class)
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class DataWithInlineClassRobolectricTest {
+    @Test
+    public fun inlineClassesAreEqualInRobolectric() {
+        assertThat(TestValue("42")).isEqualTo(
+            TestValue("42")
+        )
+    }
+
+    @Test
+    public fun dataWithInlineClassesAreEqualInRobolectric() {
+        assertThat(
+            TestData(
+                value1 = TestValue("Test value #1"),
+                value2 = "Test value #2"
+            )
+        ).isEqualTo(
+            TestData(
+                value1 = TestValue("Test value #1"),
+                value2 = "Test value #2"
+            )
+        )
+    }
+}
diff --git a/camera/camera-camera2-pipe-testing/lint-baseline.xml b/camera/camera-camera2-pipe-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/camera/camera-camera2-pipe-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/camera/camera-camera2-pipe/lint-baseline.xml b/camera/camera-camera2-pipe/lint-baseline.xml
index 8f1aa4b..205967d 100644
--- a/camera/camera-camera2-pipe/lint-baseline.xml
+++ b/camera/camera-camera2-pipe/lint-baseline.xml
@@ -1,4 +1,290 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.Camera2CameraMetadata is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        characteristics.physicalCameraIds.orEmpty().map { CameraId(it) }.toSet()"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt"
+            line="137"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createReprocessableCaptureSession("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="160"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createConstrainedHighSpeedCaptureSession("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="179"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createCaptureSessionByOutputConfigurations("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="197"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createReprocessableCaptureSessionByConfigurations("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="216"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            InputConfiguration(inputConfig.width, inputConfig.height, inputConfig.format),"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="217"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        val sessionConfig = SessionConfiguration("
+        errorLine2="                            ^">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="227"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
+        errorLine2="                                               ^">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="235"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
+        errorLine2="                                               ^">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="235"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            sessionConfig.inputConfiguration = InputConfiguration("
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="235"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        sessionConfig.sessionParameters = requestBuilder.build()"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="255"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createCaptureSession(sessionConfig)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="257"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraDevice is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        cameraDevice.createReprocessCaptureRequest(inputResult)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt"
+            line="270"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return cameraCaptureSession.isReprocessable"
+        errorLine2="                                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
+            line="299"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return cameraCaptureSession.inputSurface"
+        errorLine2="                                            ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
+            line="309"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidCameraCaptureSession is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            cameraCaptureSession.finalizeOutputConfigurations(outputConfigs.map { it.unwrap() })"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt"
+            line="326"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                configuration = OutputConfiguration(size, outputKlass)"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="174"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    configuration.maxSharedSurfaceCount"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="192"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                this.enableSurfaceSharing()"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="203"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration.Companion is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                this.setPhysicalCameraId(physicalCameraId.value)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="210"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return output.surfaces"
+        errorLine2="                              ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="219"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            output.addSurface(surface)"
+        errorLine2="                   ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="231"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.AndroidOutputConfiguration is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            output.removeSurface(surface)"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt"
+            line="238"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.pipe.core.Permissions is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (context.checkSelfPermission(Manifest.permission.CAMERA) == PERMISSION_GRANTED) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt"
+            line="56"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.VirtualCameraManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        instance.openCamera("
+        errorLine2="                                 ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt"
+            line="237"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.camera2.pipe.compat.VirtualCameraManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            manager.registerAvailabilityCallback(threads.camera2Executor, availabilityCallback)"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt"
+            line="328"
+            column="21"/>
+    </issue>
 
 </issues>
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
index f88815d..0e758ae 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
@@ -294,7 +294,7 @@
         request: RequestInfo,
         crossinline fn: (Request.Listener) -> Any
     ) {
-        // Always invoke the internal listener first so that internal sate can be updated before
+        // Always invoke the internal listener first so that internal state can be updated before
         // other listeners ask for it.
         for (i in internalListeners.indices) {
             fn(internalListeners[i])
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index e518985..78ccd42 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -43,8 +43,8 @@
     testImplementation(ROBOLECTRIC)
     testImplementation(MOCKITO_CORE)
     testImplementation(KOTLIN_COROUTINES_TEST)
-    testImplementation(project(":annotation:annotation-experimental"))
-    testImplementation(project(":lifecycle:lifecycle-runtime-testing"))
+    testImplementation("androidx.annotation:annotation-experimental:1.1.0")
+    testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
     testImplementation(project(":camera:camera-testing"))
     testImplementation("androidx.arch.core:core-testing:2.1.0")
 
@@ -55,13 +55,13 @@
     androidTestImplementation(TRUTH)
     androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(project(":annotation:annotation-experimental"))
+    androidTestImplementation("androidx.annotation:annotation-experimental:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
     androidTestImplementation("androidx.exifinterface:exifinterface:1.0.0")
diff --git a/camera/camera-camera2/lint-baseline.xml b/camera/camera-camera2/lint-baseline.xml
index 581fc50..a541188 100644
--- a/camera/camera-camera2/lint-baseline.xml
+++ b/camera/camera-camera2/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.camera.camera2.internal.Camera2CaptureCallbacks.ComboSessionCaptureCallback is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.internal.Camera2CaptureCallbacks.ComboSessionCaptureCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                callback.onCaptureBufferLost(session, request, surface, frame);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.camera.camera2.internal.CameraBurstCaptureCallback is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.camera2.internal.CameraBurstCaptureCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            callback.onCaptureBufferLost(session, request, surface, frame);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mWrappedCallback.onCaptureBufferLost(session, request, target, frameNumber);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class null is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mWrappedCallback.onCaptureQueueEmpty(session);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mWrappedCallback.onSurfacePrepared(session, surface);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.camera.camera2.internal.CameraCaptureSessionStateCallbacks.ComboSessionStateCallback is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.internal.CameraCaptureSessionStateCallbacks.ComboSessionStateCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                callback.onCaptureQueueEmpty(session);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.camera.camera2.internal.CameraCaptureSessionStateCallbacks.ComboSessionStateCallback is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.internal.CameraCaptureSessionStateCallbacks.ComboSessionStateCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                callback.onSurfacePrepared(session, surface);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class null is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mWrappedCallback.onCameraAccessPrioritiesChanged();"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        OutputConfiguration deferredConfig = new OutputConfiguration(surfaceSize, klass);"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,24 +134,24 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.camera.camera2.internal.SynchronizedCaptureSessionStateCallbacks.Adapter is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.camera2.internal.SynchronizedCaptureSessionStateCallbacks.Adapter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mCameraCaptureSessionStateCallback.onSurfacePrepared("
         errorLine2="                                               ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java"
-            line="117"
+            line="124"
             column="48"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.camera.camera2.internal.SynchronizedCaptureSessionStateCallbacks.Adapter is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.camera2.internal.SynchronizedCaptureSessionStateCallbacks.Adapter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mCameraCaptureSessionStateCallback.onCaptureQueueEmpty("
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java"
-            line="136"
+            line="143"
             column="48"/>
     </issue>
 
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraXInitTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraXInitTest.kt
deleted file mode 100644
index e35c679..0000000
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraXInitTest.kt
+++ /dev/null
@@ -1,101 +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.camera.camera2
-
-import android.content.Context
-import android.content.pm.PackageManager
-import android.os.Build
-import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
-import androidx.test.rule.GrantPermissionRule
-import com.google.common.truth.Truth
-import com.google.common.util.concurrent.ListenableFuture
-import org.junit.AfterClass
-import org.junit.Assume.assumeTrue
-import org.junit.Before
-import org.junit.BeforeClass
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@LargeTest
-@RunWith(AndroidJUnit4::class)
-class CameraXInitTest {
-
-    // Please don't use CameraUtil.grantCameraPermissionAndPreTest. This test verifies the CameraX
-    // initialization can successfully done on real device.
-    @get:Rule
-    val permissionRule: GrantPermissionRule =
-        GrantPermissionRule.grant(android.Manifest.permission.CAMERA)
-
-    companion object {
-        private lateinit var cameraXListenableFuture: ListenableFuture<CameraX>
-        private val context = ApplicationProvider.getApplicationContext<Context>()
-        private val pm = context.packageManager
-
-        @BeforeClass
-        @JvmStatic
-        fun classSetup() {
-            cameraXListenableFuture = CameraX.getOrCreateInstance(context)
-        }
-
-        @AfterClass
-        @JvmStatic
-        fun tearDown() {
-            CameraX.shutdown().get()
-        }
-    }
-
-    @Before
-    fun setup() {
-        // Only test the device when it have least one camera. Please don't use the
-        // CameraUtil.deviceHasCamera() to check the camera, it might ignore the test if the
-        // camera device in bad status.
-        assumeTrue(
-            pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) || pm.hasSystemFeature(
-                PackageManager.FEATURE_CAMERA_FRONT
-            )
-        )
-    }
-
-    @Test
-    fun initOnDevice() {
-        cameraXListenableFuture.get()
-
-        Truth.assertThat(CameraX.isInitialized()).isTrue()
-    }
-
-    @Test
-    fun initOnDevice_hasCamera() {
-        val cameraX = cameraXListenableFuture.get()
-
-        try {
-            if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
-                CameraSelector.DEFAULT_BACK_CAMERA.select(cameraX.cameraRepository.cameras)
-            }
-            if (pm.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 java.lang.IllegalArgumentException("CameraIdList_incorrect:" + Build.MODEL, e)
-        }
-    }
-}
\ No newline at end of file
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
deleted file mode 100644
index ea5389f..0000000
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
+++ /dev/null
@@ -1,1491 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.camera.camera2;
-
-import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.Manifest;
-import android.app.Instrumentation;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.graphics.ImageFormat;
-import android.graphics.Rect;
-import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.TotalCaptureResult;
-import android.hardware.camera2.params.StreamConfigurationMap;
-import android.location.Location;
-import android.media.ImageWriter;
-import android.net.Uri;
-import android.os.Environment;
-import android.provider.MediaStore;
-import android.util.Rational;
-import android.util.Size;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.OptIn;
-import androidx.camera.camera2.interop.Camera2Interop;
-import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
-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.ImageCapture.Metadata;
-import androidx.camera.core.ImageCapture.OnImageCapturedCallback;
-import androidx.camera.core.ImageCapture.OnImageSavedCallback;
-import androidx.camera.core.ImageCaptureException;
-import androidx.camera.core.ImageProxy;
-import androidx.camera.core.impl.CaptureBundle;
-import androidx.camera.core.impl.CaptureConfig;
-import androidx.camera.core.impl.CaptureProcessor;
-import androidx.camera.core.impl.CaptureStage;
-import androidx.camera.core.impl.ImageCaptureConfig;
-import androidx.camera.core.impl.ImageOutputConfig;
-import androidx.camera.core.impl.ImageProxyBundle;
-import androidx.camera.core.impl.UseCaseConfig;
-import androidx.camera.core.impl.utils.CameraOrientationUtil;
-import androidx.camera.core.impl.utils.Exif;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
-import androidx.camera.testing.CameraUtil;
-import androidx.camera.testing.fakes.FakeCaptureStage;
-import androidx.concurrent.futures.ResolvableFuture;
-import androidx.core.content.ContextCompat;
-import androidx.test.core.app.ApplicationProvider;
-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.rule.GrantPermissionRule;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-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 org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class ImageCaptureTest {
-    private static final Size DEFAULT_RESOLUTION = new Size(640, 480);
-    private static final Size GUARANTEED_RESOLUTION = new Size(640, 480);
-    @CameraSelector.LensFacing
-    private static final int BACK_LENS_FACING = CameraSelector.LENS_FACING_BACK;
-    private static final CameraSelector BACK_SELECTOR =
-            new CameraSelector.Builder().requireLensFacing(BACK_LENS_FACING).build();
-    private static final int FLASH_MODE_UNKNOWN = -1;
-    private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
-    @Rule
-    public TestRule mCameraRule = CameraUtil.grantCameraPermissionAndPreTest();
-    @Rule
-    public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(
-            Manifest.permission.WRITE_EXTERNAL_STORAGE);
-    private ImageCapture.Builder mDefaultBuilder;
-    private Executor mMainExecutor;
-    private ContentResolver mContentResolver;
-    private Context mContext;
-    private CameraUseCaseAdapter mCamera;
-
-    private ImageCaptureConfig createNonRotatedConfiguration() {
-        // Create a configuration with target rotation that matches the sensor rotation.
-        // This assumes a back-facing camera (facing away from screen)
-        Integer sensorRotation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
-        int surfaceRotation = CameraOrientationUtil.degreesToSurfaceRotation(sensorRotation);
-
-        return new ImageCapture.Builder()
-                .setTargetRotation(surfaceRotation)
-                .getUseCaseConfig();
-    }
-
-    @Before
-    @OptIn(markerClass = ExperimentalCamera2Interop.class)
-    public void setUp() throws ExecutionException, InterruptedException {
-        createDefaultPictureFolderIfNotExist();
-        mContext = ApplicationProvider.getApplicationContext();
-        CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-
-        CameraX.initialize(mContext, cameraXConfig).get();
-        mDefaultBuilder = new ImageCapture.Builder();
-
-        mMainExecutor = ContextCompat.getMainExecutor(mContext);
-        mContentResolver = ApplicationProvider.getApplicationContext().getContentResolver();
-    }
-
-    @After
-    public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        if (mCamera != null) {
-            mInstrumentation.runOnMainSync(() ->
-                    //TODO: The removeUseCases() call might be removed after clarifying the
-                    // abortCaptures() issue in b/162314023.
-                    mCamera.removeUseCases(mCamera.getUseCases())
-            );
-        }
-
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
-    }
-
-    @Test
-    public void capturedImageHasCorrectSize() throws ExecutionException, InterruptedException {
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).setTargetRotation(Surface.ROTATION_0).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        Size sizeEnvelope = imageProperties.get().size;
-        // Some devices may not be able to fit the requested resolution within the image
-        // boundaries. In this case, they should always fall back to a guaranteed resolution of
-        // 640 x 480.
-        if (!Objects.equals(sizeEnvelope, GUARANTEED_RESOLUTION)) {
-            int rotationDegrees = imageProperties.get().rotationDegrees;
-            // If the image data is rotated by 90 or 270, we need to ensure our desired width fits
-            // within the height of this image and our desired height fits in the width.
-            if (rotationDegrees == 270 || rotationDegrees == 90) {
-                sizeEnvelope = new Size(sizeEnvelope.getHeight(), sizeEnvelope.getWidth());
-            }
-
-            // Ensure the width and height can be cropped from the source image
-            assertThat(sizeEnvelope.getWidth()).isAtLeast(DEFAULT_RESOLUTION.getWidth());
-            assertThat(sizeEnvelope.getHeight()).isAtLeast(DEFAULT_RESOLUTION.getHeight());
-        }
-    }
-
-    @Test
-    public void canSupportGuaranteedSizeFront()
-            throws CameraInfoUnavailableException, ExecutionException, InterruptedException {
-        // 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.
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT));
-        assumeTrue(!CameraUtil.requiresCorrectedAspectRatio(CameraSelector.LENS_FACING_FRONT));
-
-        // Checks camera device sensor degrees to set correct target rotation value to make sure
-        // the exactly matching result size 640x480 can be selected if the device supports it.
-        Integer sensorOrientation = CameraUtil.getSensorOrientation(
-                CameraSelector.LENS_FACING_FRONT);
-        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                GUARANTEED_RESOLUTION).setTargetRotation(
-                isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_FRONT_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the captured image exactly matches 640x480 size. This test can also check
-        // whether the guaranteed resolution 640x480 is really supported for JPEG format on the
-        // devices when running the test.
-        assertEquals(GUARANTEED_RESOLUTION, imageProperties.get().size);
-    }
-
-    @Test
-    public void canSupportGuaranteedSizeBack()
-            throws CameraInfoUnavailableException, ExecutionException, InterruptedException {
-        // 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.
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-        assumeTrue(!CameraUtil.requiresCorrectedAspectRatio(CameraSelector.LENS_FACING_BACK));
-
-        // Checks camera device sensor degrees to set correct target rotation value to make sure
-        // the exactly matching result size 640x480 can be selected if the device supports it.
-        Integer sensorOrientation = CameraUtil.getSensorOrientation(
-                CameraSelector.LENS_FACING_BACK);
-        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                GUARANTEED_RESOLUTION).setTargetRotation(
-                isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA,
-                useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the captured image exactly matches 640x480 size. This test can also check
-        // whether the guaranteed resolution 640x480 is really supported for JPEG format on the
-        // devices when running the test.
-        assertEquals(GUARANTEED_RESOLUTION, imageProperties.get().size);
-    }
-
-    @Test
-    public void canCaptureWithFlashOn() throws Exception {
-        ImageCapture imageCapture =
-                new ImageCapture.Builder().setFlashMode(ImageCapture.FLASH_MODE_ON).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR,
-                imageCapture);
-
-        // Take picture after preview is ready for a while. It can cause issue on some devices when
-        // flash is on.
-        Thread.sleep(2000);
-
-        OnImageCapturedCallback callback = mock(OnImageCapturedCallback.class);
-        imageCapture.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-    }
-
-    @Test
-    public void canCaptureWithFlashAuto() throws Exception {
-        ImageCapture imageCapture =
-                new ImageCapture.Builder().setFlashMode(ImageCapture.FLASH_MODE_AUTO).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR,
-                imageCapture);
-
-        // Take picture after preview is ready for a while. It can cause issue on some devices when
-        // flash is auto.
-        Thread.sleep(2000);
-
-        OnImageCapturedCallback callback = mock(OnImageCapturedCallback.class);
-        imageCapture.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-    }
-
-    @Test
-    public void canCaptureMultipleImages() throws InterruptedException {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        int numImages = 5;
-        CountingCallback callback = new CountingCallback(numImages, 50000);
-        for (int i = 0; i < numImages; ++i) {
-            useCase.takePicture(mMainExecutor, callback);
-        }
-
-        assertThat(callback.getNumOnCaptureSuccess()).isEqualTo(numImages);
-    }
-
-    @Test
-    public void canCaptureMultipleImagesWithMaxQuality() throws InterruptedException {
-        ImageCapture useCase = new ImageCapture.Builder()
-                .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
-                .build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        int numImages = 5;
-        CountingCallback callback = new CountingCallback(numImages, 50000);
-        for (int i = 0; i < numImages; ++i) {
-            useCase.takePicture(mMainExecutor, callback);
-        }
-
-        assertThat(callback.getNumOnCaptureSuccess()).isEqualTo(numImages);
-    }
-
-    @Test
-    public void saveCanSucceed_withNonExistingFile() {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = new File(mContext.getCacheDir(),
-                "test" + System.currentTimeMillis() + ".jpg");
-        saveLocation.deleteOnExit();
-        // make sure file does not exist
-        if (saveLocation.exists()) {
-            saveLocation.delete();
-        }
-        assertThat(!saveLocation.exists());
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation).build(),
-                mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-    }
-
-    @Test
-    public void saveCanSucceed_withExistingFile() throws IOException {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        assertThat(saveLocation.exists());
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation).build(),
-                mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-    }
-
-    @Test
-    public void saveToUri() {
-        // Arrange.
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ContentValues contentValues = new ContentValues();
-        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        ImageCapture.OutputFileOptions outputFileOptions =
-                new ImageCapture.OutputFileOptions.Builder(
-                        mContentResolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-                        contentValues).build();
-
-        // Act.
-        useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-
-        // Assert: Wait for the signal that the image has been saved.
-        ArgumentCaptor<ImageCapture.OutputFileResults> outputFileResultsArgumentCaptor =
-                ArgumentCaptor.forClass(ImageCapture.OutputFileResults.class);
-        verify(callback, timeout(10000)).onImageSaved(outputFileResultsArgumentCaptor.capture());
-
-        // Verify save location Uri is available.
-        Uri saveLocationUri = outputFileResultsArgumentCaptor.getValue().getSavedUri();
-        assertThat(saveLocationUri).isNotNull();
-
-        // Clean up.
-        mContentResolver.delete(saveLocationUri, null, null);
-    }
-
-    @Test
-    public void saveToOutputStream() throws IOException {
-        // Arrange.
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        try (OutputStream outputStream = new FileOutputStream(saveLocation)) {
-            // Act.
-            useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(
-                    outputStream).build(), mMainExecutor, callback);
-
-            // Assert: Wait for the signal that the image has been saved.
-            verify(callback, timeout(10000)).onImageSaved(any());
-        }
-    }
-
-    @Test
-    public void canSaveFile_withRotation() throws IOException {
-        // TODO(b/147448711) Add back in once cuttlefish has correct user cropping functionality.
-        Assume.assumeFalse("Cuttlefish does not correctly handle crops. Unable to test.",
-                android.os.Build.MODEL.contains("Cuttlefish"));
-        ImageCapture useCase = new ImageCapture.Builder().setTargetRotation(
-                Surface.ROTATION_0).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(
-                saveLocation).build(), mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        // Retrieve the exif from the image
-        Exif exif = Exif.createFromFile(saveLocation);
-
-        File saveLocationRotated90 = File.createTempFile("testRotated90", ".jpg");
-        saveLocationRotated90.deleteOnExit();
-        OnImageSavedCallback callbackRotated90 = mock(OnImageSavedCallback.class);
-        useCase.setTargetRotation(Surface.ROTATION_90);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(
-                saveLocationRotated90).build(), mMainExecutor, callbackRotated90);
-
-        // Wait for the signal that the image has been saved.
-        verify(callbackRotated90, timeout(10000)).onImageSaved(any());
-
-        // Retrieve the exif from the image
-        Exif exifRotated90 = Exif.createFromFile(saveLocationRotated90);
-
-        // Compare aspect ratio with a threshold due to floating point rounding. Can't do direct
-        // comparison of height and width, because the rotated capture is scaled to fit within
-        // the sensor region
-        double aspectRatioThreshold = 0.01;
-
-        // If rotation is equal then buffers were rotated by HAL so the aspect ratio should be
-        // rotated by 90 degrees. Otherwise the aspect ratio should be the same.
-        if (exif.getRotation() == exifRotated90.getRotation()) {
-            double aspectRatio = (double) exif.getHeight() / exif.getWidth();
-            double aspectRatioRotated90 =
-                    (double) exifRotated90.getWidth() / exifRotated90.getHeight();
-            assertThat(Math.abs(aspectRatio - aspectRatioRotated90)).isLessThan(
-                    aspectRatioThreshold);
-        } else {
-            double aspectRatio = (double) exif.getWidth() / exif.getHeight();
-            double aspectRatioRotated90 =
-                    (double) exifRotated90.getWidth() / exifRotated90.getHeight();
-            assertThat(Math.abs(aspectRatio - aspectRatioRotated90)).isLessThan(
-                    aspectRatioThreshold);
-        }
-    }
-
-    @Test
-    public void canSaveFile_flippedHorizontal()
-            throws IOException, CameraInfoUnavailableException {
-        // Use a non-rotated configuration since some combinations of rotation + flipping vertically
-        // can be equivalent to flipping horizontally
-        ImageCapture useCase = ImageCapture.Builder.fromConfig(
-                createNonRotatedConfiguration()).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        Metadata metadata = new Metadata();
-        metadata.setReversedHorizontal(true);
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        ImageCapture.OutputFileOptions outputFileOptions =
-                new ImageCapture.OutputFileOptions.Builder(
-                        saveLocation).setMetadata(metadata).build();
-        useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        // Retrieve the exif from the image
-        Exif exif = Exif.createFromFile(saveLocation);
-        assertThat(exif.isFlippedHorizontally()).isTrue();
-    }
-
-    @Test
-    public void canSaveFile_flippedVertical()
-            throws IOException, CameraInfoUnavailableException {
-        // Use a non-rotated configuration since some combinations of rotation + flipping
-        // horizontally can be equivalent to flipping vertically
-        ImageCapture useCase = ImageCapture.Builder.fromConfig(
-                createNonRotatedConfiguration()).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        Metadata metadata = new Metadata();
-        metadata.setReversedVertical(true);
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        ImageCapture.OutputFileOptions outputFileOptions =
-                new ImageCapture.OutputFileOptions.Builder(
-                        saveLocation).setMetadata(metadata).build();
-        useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        // Retrieve the exif from the image
-        Exif exif = Exif.createFromFile(saveLocation);
-        assertThat(exif.isFlippedVertically()).isTrue();
-    }
-
-    @Test
-    public void canSaveFile_withAttachedLocation() throws IOException {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation = File.createTempFile("test", ".jpg");
-        saveLocation.deleteOnExit();
-        Location location = new Location("ImageCaptureTest");
-        Metadata metadata = new Metadata();
-        metadata.setLocation(location);
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        ImageCapture.OutputFileOptions outputFileOptions =
-                new ImageCapture.OutputFileOptions.Builder(
-                        saveLocation).setMetadata(metadata).build();
-        useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        // Retrieve the exif from the image
-        Exif exif = Exif.createFromFile(saveLocation);
-        assertThat(exif.getLocation().getProvider()).isEqualTo(location.getProvider());
-    }
-
-    @Test
-    public void canSaveMultipleFiles() throws IOException {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        int numImages = 5;
-        for (int i = 0; i < numImages; ++i) {
-            File saveLocation = File.createTempFile("test" + i, ".jpg");
-            saveLocation.deleteOnExit();
-            ImageCapture.OutputFileOptions outputFileOptions =
-                    new ImageCapture.OutputFileOptions.Builder(
-                            saveLocation).build();
-            useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-        }
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(50000).times(numImages)).onImageSaved(any());
-    }
-
-    @Test
-    public void saveWillFail_whenInvalidFilePathIsUsed() {
-        ImageCapture useCase = mDefaultBuilder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        // Note the invalid path
-        File saveLocation = new File("/not/a/real/path.jpg");
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        ImageCapture.OutputFileOptions outputFileOptions =
-                new ImageCapture.OutputFileOptions.Builder(saveLocation).build();
-        useCase.takePicture(outputFileOptions, mMainExecutor, callback);
-
-        final ArgumentCaptor<ImageCaptureException> exceptionCaptor =
-                ArgumentCaptor.forClass(ImageCaptureException.class);
-
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onError(exceptionCaptor.capture());
-        assertThat(exceptionCaptor.getValue().getImageCaptureError()).isEqualTo(
-                ImageCapture.ERROR_FILE_IO);
-    }
-
-    @Test
-    @OptIn(markerClass = ExperimentalCamera2Interop.class)
-    public void camera2InteropCaptureSessionCallbacks() {
-        ImageCapture.Builder builder = new ImageCapture.Builder();
-        CameraCaptureSession.CaptureCallback captureCallback =
-                mock(CameraCaptureSession.CaptureCallback.class);
-        new Camera2Interop.Extender<>(builder).setSessionCaptureCallback(captureCallback);
-        ImageCapture useCase = builder.build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(null);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Note: preview callbacks also fire on interop listener.
-        ArgumentMatcher<CaptureRequest> matcher = new ArgumentMatcher<CaptureRequest>() {
-            @Override
-            public boolean matches(CaptureRequest captureRequest) {
-                return captureRequest.get(CaptureRequest.CONTROL_CAPTURE_INTENT)
-                        == CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
-            }
-        };
-        // Because interop listener will get both image capture and preview callbacks, ensure
-        // that there is one CAPTURE_INTENT_STILL_CAPTURE from all onCaptureCompleted() callbacks.
-        verify(captureCallback, times(1)).onCaptureCompleted(
-                any(CameraCaptureSession.class),
-                argThat(matcher),
-                any(TotalCaptureResult.class));
-    }
-
-    @Test
-    public void takePicture_withBufferFormatRaw10()
-            throws ExecutionException, InterruptedException {
-        CameraCharacteristics cameraCharacteristics =
-                CameraUtil.getCameraCharacteristics(BACK_LENS_FACING);
-        StreamConfigurationMap map =
-                cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-        Size[] resolutions = map.getOutputSizes(ImageFormat.RAW10);
-        // Ignore this tests on devices that do not support RAW10 image format.
-        Assume.assumeTrue(resolutions != null);
-        Assume.assumeTrue(resolutions.length > 0);
-        Assume.assumeTrue(isRawSupported(cameraCharacteristics));
-
-        ImageCapture useCase = new ImageCapture.Builder()
-                .setBufferFormat(ImageFormat.RAW10)
-                .build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        assertThat(imageProperties.get().format).isEqualTo(ImageFormat.RAW10);
-    }
-
-    private boolean isRawSupported(CameraCharacteristics cameraCharacteristics) {
-        int[] capabilities =
-                cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
-        for (int capability : capabilities) {
-            if (CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW ==  capability) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void constructor_withBufferFormatAndCaptureProcessor_throwsException() {
-        new ImageCapture.Builder()
-                .setBufferFormat(ImageFormat.RAW_SENSOR)
-                .setCaptureProcessor(mock(CaptureProcessor.class))
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void constructor_maxCaptureStageInvalid_throwsException() {
-        new ImageCapture.Builder().setMaxCaptureStages(0).build();
-    }
-
-    @Test
-    public void captureStagesAbove1_withoutCaptureProcessor() {
-        CaptureBundle captureBundle = new CaptureBundle() {
-            @Override
-            public List<CaptureStage> getCaptureStages() {
-                return Collections.unmodifiableList(new ArrayList<>(
-                        Arrays.asList(
-                                new FakeCaptureStage(0, new CaptureConfig.Builder().build()),
-                                new FakeCaptureStage(1, new CaptureConfig.Builder().build()))));
-            }
-        };
-
-        ImageCapture imageCapture = new ImageCapture.Builder().setCaptureBundle(
-                captureBundle).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, imageCapture);
-
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(null);
-        imageCapture.takePicture(mMainExecutor, callback);
-
-        final ArgumentCaptor<ImageCaptureException> exceptionCaptor =
-                ArgumentCaptor.forClass(ImageCaptureException.class);
-        verify(callback, timeout(10000)).onError(exceptionCaptor.capture());
-        assertThat(exceptionCaptor.getValue().getCause()).isInstanceOf(
-                IllegalArgumentException.class);
-    }
-
-    @Test
-    public void captureStageExceedMaxCaptureStage_whenIssueTakePicture() {
-        // Initial the captureStages not greater than the maximum count to bypass the
-        // CaptureStage count checking during bindToLifeCycle.
-        List<CaptureStage> captureStages = new ArrayList<>();
-        captureStages.add(new FakeCaptureStage(0, new CaptureConfig.Builder().build()));
-
-        CaptureBundle captureBundle = new CaptureBundle() {
-            @Override
-            public List<CaptureStage> getCaptureStages() {
-                return Collections.unmodifiableList(captureStages);
-            }
-        };
-
-        ImageCapture imageCapture = new ImageCapture.Builder()
-                .setMaxCaptureStages(1)
-                .setCaptureBundle(captureBundle)
-                .setCaptureProcessor(mock(CaptureProcessor.class))
-                .build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, imageCapture);
-
-        // Add an additional capture stage to test the case
-        // captureStage.size() > mMaxCaptureStages during takePicture.
-        captureStages.add(new FakeCaptureStage(1, new CaptureConfig.Builder().build()));
-
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(null);
-
-        // Take 2 photos.
-        imageCapture.takePicture(mMainExecutor, callback);
-        imageCapture.takePicture(mMainExecutor, callback);
-
-        // It should get onError() callback twice.
-        final ArgumentCaptor<ImageCaptureException> exceptionCaptor = ArgumentCaptor.forClass(
-                ImageCaptureException.class);
-        verify(callback, timeout(10000).times(2)).onError(exceptionCaptor.capture());
-        assertThat(exceptionCaptor.getValue().getCause()).isInstanceOf(
-                IllegalArgumentException.class);
-
-    }
-
-    @Test
-    public void onStateOffline_abortAllCaptureRequests() throws InterruptedException {
-        ImageCapture imageCapture = new ImageCapture.Builder().build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, 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
-        // onStateDetached() should also come after onStateAttached(). There is no API to
-        // directly know  onStateAttached() callback has been received. Therefore, taking a
-        // picture and waiting for the capture success callback to know the use case's
-        // onStateAttached() callback has been received.
-        OnImageCapturedCallback callback = mock(OnImageCapturedCallback.class);
-        imageCapture.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        CountingCallback countingCallback = new CountingCallback(3, 500);
-
-        imageCapture.takePicture(mMainExecutor, countingCallback);
-        imageCapture.takePicture(mMainExecutor, countingCallback);
-        imageCapture.takePicture(mMainExecutor, countingCallback);
-
-        mInstrumentation.runOnMainSync(imageCapture::onStateDetached);
-
-        assertThat(countingCallback.getNumOnCaptureSuccess()
-                + countingCallback.getNumOnError()).isEqualTo(3);
-
-        for (Integer imageCaptureError : countingCallback.getImageCaptureErrors()) {
-            assertThat(imageCaptureError).isEqualTo(ImageCapture.ERROR_CAMERA_CLOSED);
-        }
-    }
-
-    @Test
-    public void unbind_abortAllCaptureRequests() throws InterruptedException {
-        ImageCapture imageCapture = new ImageCapture.Builder().build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, imageCapture);
-
-        CountingCallback callback = new CountingCallback(3, 10000);
-
-        imageCapture.takePicture(mMainExecutor, callback);
-        imageCapture.takePicture(mMainExecutor, callback);
-        imageCapture.takePicture(mMainExecutor, callback);
-
-        // Needs to run on main thread because takePicture gets posted on main thread if it isn't
-        // running on the main thread. Which means the internal ImageRequests likely get issued
-        // after ImageCapture is removed so errors out with a different error from
-        // ERROR_CAMERA_CLOSED
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(() ->
-                mCamera.removeUseCases(Collections.singleton(imageCapture))
-        );
-
-        assertThat(callback.getNumOnCaptureSuccess() + callback.getNumOnError()).isEqualTo(3);
-
-        for (Integer imageCaptureError : callback.getImageCaptureErrors()) {
-            assertThat(imageCaptureError).isEqualTo(ImageCapture.ERROR_CAMERA_CLOSED);
-        }
-    }
-
-    @Test
-    public void takePictureReturnsErrorNO_CAMERA_whenNotBound() {
-        ImageCapture imageCapture = new ImageCapture.Builder().build();
-
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(null);
-        imageCapture.takePicture(mMainExecutor, callback);
-
-        final ArgumentCaptor<ImageCaptureException> exceptionCaptor = ArgumentCaptor.forClass(
-                ImageCaptureException.class);
-        verify(callback, timeout(10000)).onError(exceptionCaptor.capture());
-        assertThat(exceptionCaptor.getValue().getImageCaptureError()).isEqualTo(
-                ImageCapture.ERROR_INVALID_CAMERA);
-    }
-
-    @SuppressWarnings("deprecation")
-    private void createDefaultPictureFolderIfNotExist() {
-        File pictureFolder = Environment.getExternalStoragePublicDirectory(
-                Environment.DIRECTORY_PICTURES);
-        if (!pictureFolder.exists()) {
-            pictureFolder.mkdir();
-        }
-    }
-
-    @Test
-    public void defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() {
-        ImageCapture useCase = new ImageCapture.Builder().build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-        ImageOutputConfig config = (ImageOutputConfig) useCase.getCurrentConfig();
-        assertThat(config.getTargetAspectRatio()).isEqualTo(AspectRatio.RATIO_4_3);
-    }
-
-    @Test
-    public void defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).build();
-
-        assertThat(useCase.getCurrentConfig().containsOption(
-                ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO)).isFalse();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        assertThat(useCase.getCurrentConfig().containsOption(
-                ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO)).isFalse();
-    }
-
-    @Test
-    public void targetRotationCanBeUpdatedAfterUseCaseIsCreated() {
-        ImageCapture imageCapture = new ImageCapture.Builder().setTargetRotation(
-                Surface.ROTATION_0).build();
-        imageCapture.setTargetRotation(Surface.ROTATION_90);
-
-        assertThat(imageCapture.getTargetRotation()).isEqualTo(Surface.ROTATION_90);
-    }
-
-    @Test
-    public void targetResolutionIsUpdatedAfterTargetRotationIsUpdated() {
-        ImageCapture imageCapture = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).setTargetRotation(Surface.ROTATION_0).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, imageCapture);
-
-        // Updates target rotation from ROTATION_0 to ROTATION_90.
-        imageCapture.setTargetRotation(Surface.ROTATION_90);
-
-        ImageOutputConfig newConfig = (ImageOutputConfig) imageCapture.getCurrentConfig();
-        Size expectedTargetResolution = new Size(DEFAULT_RESOLUTION.getHeight(),
-                DEFAULT_RESOLUTION.getWidth());
-
-        // Expected targetResolution will be reversed from original target resolution.
-        assertThat(newConfig.getTargetResolution().equals(expectedTargetResolution)).isTrue();
-    }
-
-    @Test
-    public void capturedImageHasCorrectCroppingSizeWithoutSettingRotation()
-            throws ExecutionException, InterruptedException {
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imagePropertiesFuture = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imagePropertiesFuture);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // After target rotation is updated, the result cropping aspect ratio should still the
-        // same as original one.
-        Rational expectedCroppingRatio = new Rational(DEFAULT_RESOLUTION.getWidth(),
-                DEFAULT_RESOLUTION.getHeight());
-        ImageProperties imageProperties = imagePropertiesFuture.get();
-        Rect cropRect = imageProperties.cropRect;
-        Rational resultCroppingRatio;
-
-        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
-        // displayed image
-        if ((imageProperties.rotationDegrees % 180) != 0) {
-            resultCroppingRatio = new Rational(cropRect.height(), cropRect.width());
-        } else {
-            resultCroppingRatio = new Rational(cropRect.width(), cropRect.height());
-        }
-
-        if (imageProperties.format == ImageFormat.JPEG) {
-            assertThat(imageProperties.rotationDegrees).isEqualTo(
-                    imageProperties.exif.getRotation());
-        }
-        assertThat(resultCroppingRatio).isEqualTo(expectedCroppingRatio);
-    }
-
-    @Test
-    public void capturedImageHasCorrectCroppingSizeSetRotationBuilder() throws ExecutionException,
-            InterruptedException {
-        // Checks camera device sensor degrees to set correct target rotation value to make sure
-        // that the initial set target cropping aspect ratio matches the sensor orientation.
-        Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
-        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).setTargetRotation(
-                isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imagePropertiesFuture = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imagePropertiesFuture);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // After target rotation is updated, the result cropping aspect ratio should still the
-        // same as original one.
-        Rational expectedCroppingRatio = new Rational(DEFAULT_RESOLUTION.getWidth(),
-                DEFAULT_RESOLUTION.getHeight());
-        ImageProperties imageProperties = imagePropertiesFuture.get();
-        Rect cropRect = imageProperties.cropRect;
-        Rational resultCroppingRatio;
-
-        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
-        // displayed image
-        if ((imageProperties.rotationDegrees % 180) != 0) {
-            resultCroppingRatio = new Rational(cropRect.height(), cropRect.width());
-        } else {
-            resultCroppingRatio = new Rational(cropRect.width(), cropRect.height());
-        }
-
-        if (imageProperties.format == ImageFormat.JPEG) {
-            assertThat(imageProperties.rotationDegrees).isEqualTo(
-                    imageProperties.exif.getRotation());
-        }
-        assertThat(resultCroppingRatio).isEqualTo(expectedCroppingRatio);
-    }
-
-    @Test
-    public void capturedImageHasCorrectCroppingSize_setUseCaseRotation90FromRotationInBuilder()
-            throws ExecutionException,
-            InterruptedException {
-        // Checks camera device sensor degrees to set correct target rotation value to make sure
-        // that the initial set target cropping aspect ratio matches the sensor orientation.
-        Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
-        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
-        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
-                DEFAULT_RESOLUTION).setTargetRotation(
-                isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
-
-        // Updates target rotation to opposite one.
-        useCase.setTargetRotation(isRotateNeeded ? Surface.ROTATION_0 : Surface.ROTATION_90);
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imagePropertiesFuture = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imagePropertiesFuture);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // After target rotation is updated, the result cropping aspect ratio should still the
-        // same as original one.
-        Rational expectedCroppingRatio = new Rational(DEFAULT_RESOLUTION.getWidth(),
-                DEFAULT_RESOLUTION.getHeight());
-
-        ImageProperties imageProperties = imagePropertiesFuture.get();
-        Rect cropRect = imageProperties.cropRect;
-        Rational resultCroppingRatio;
-
-        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
-        // displayed image. When setting the rotation on the ImageCapture use case it will rotate
-        // the crop aspect ratio relative to the previously set target rotation. Hence in this
-        // case if the rotation degrees is divisible by 180 then aspect ratio needs to be inverted.
-        if ((imageProperties.rotationDegrees % 180) == 0) {
-            resultCroppingRatio = new Rational(cropRect.height(), cropRect.width());
-        } else {
-            resultCroppingRatio = new Rational(cropRect.width(), cropRect.height());
-        }
-
-        if (imageProperties.format == ImageFormat.JPEG) {
-            assertThat(imageProperties.rotationDegrees).isEqualTo(
-                    imageProperties.exif.getRotation());
-        }
-        assertThat(resultCroppingRatio).isEqualTo(expectedCroppingRatio);
-    }
-
-    @Test
-    public void capturedImageHasCorrectCroppingSize_setCropAspectRatioAfterBindToLifecycle()
-            throws ExecutionException, InterruptedException {
-        ImageCapture useCase = new ImageCapture.Builder().build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imagePropertiesFuture = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imagePropertiesFuture);
-
-        // Checks camera device sensor degrees to set target cropping aspect ratio match the
-        // sensor orientation.
-        Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
-        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
-        // Set the default aspect ratio of ImageCapture to the target cropping aspect ratio.
-        Rational targetCroppingAspectRatio =
-                isRotateNeeded ? new Rational(3, 4) : new Rational(4, 3);
-        useCase.setCropAspectRatio(targetCroppingAspectRatio);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // After target rotation is updated, the result cropping aspect ratio should still the
-        // same as original one.
-        ImageProperties imageProperties = imagePropertiesFuture.get();
-        Rect cropRect = imageProperties.cropRect;
-        Rational resultCroppingRatio;
-
-        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
-        // displayed image
-        if ((imageProperties.rotationDegrees % 180) != 0) {
-            resultCroppingRatio = new Rational(cropRect.height(), cropRect.width());
-        } else {
-            resultCroppingRatio = new Rational(cropRect.width(), cropRect.height());
-        }
-
-        if (imageProperties.format == ImageFormat.JPEG) {
-            assertThat(imageProperties.rotationDegrees).isEqualTo(
-                    imageProperties.exif.getRotation());
-        }
-        // Compare aspect ratio with a threshold due to floating point rounding. Can't do direct
-        // comparison of height and width, because the target aspect ratio of ImageCapture will
-        // be corrected in API 21 Legacy devices and the captured image will be scaled to fit
-        // within the cropping aspect ratio.
-        double aspectRatioThreshold = 0.01;
-        assertThat(Math.abs(resultCroppingRatio.doubleValue()
-                - targetCroppingAspectRatio.doubleValue())).isLessThan(aspectRatioThreshold);
-    }
-
-    @Test
-    public void useCaseConfigCanBeReset_afterUnbind() {
-        final ImageCapture useCase = mDefaultBuilder.build();
-        UseCaseConfig<?> initialConfig = useCase.getCurrentConfig();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        mInstrumentation.runOnMainSync(() -> {
-            mCamera.removeUseCases(Collections.singleton(useCase));
-        });
-
-        UseCaseConfig<?> configAfterUnbinding = useCase.getCurrentConfig();
-        assertThat(initialConfig.equals(configAfterUnbinding)).isTrue();
-    }
-
-    @Test
-    public void targetRotationIsRetained_whenUseCaseIsReused() {
-        ImageCapture useCase = mDefaultBuilder.build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        // Generally, the device can't be rotated to Surface.ROTATION_180. Therefore,
-        // use it to do the test.
-        useCase.setTargetRotation(Surface.ROTATION_180);
-
-        mInstrumentation.runOnMainSync(() -> {
-            // Unbind the use case.
-            mCamera.removeUseCases(Collections.singleton(useCase));
-        });
-
-        // Check the target rotation is kept when the use case is unbound.
-        assertThat(useCase.getTargetRotation()).isEqualTo(Surface.ROTATION_180);
-
-        // Check the target rotation is kept when the use case is rebound to the
-        // lifecycle.
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-        assertThat(useCase.getTargetRotation()).isEqualTo(Surface.ROTATION_180);
-    }
-
-    @Test
-    public void cropAspectRatioIsRetained_whenUseCaseIsReused() throws ExecutionException,
-            InterruptedException {
-        ImageCapture useCase = mDefaultBuilder.build();
-        Rational cropAspectRatio = new Rational(1, 1);
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-        useCase.setCropAspectRatio(cropAspectRatio);
-
-        mInstrumentation.runOnMainSync(() -> {
-            // Unbind the use case.
-            mCamera.removeUseCases(Collections.singleton(useCase));
-        });
-
-        // Rebind the use case.
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        ResolvableFuture<ImageProperties> imagePropertiesFuture = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imagePropertiesFuture);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        ImageProperties imageProperties = imagePropertiesFuture.get();
-        Rect cropRect = imageProperties.cropRect;
-        Rational cropRectAspectRatio = new Rational(cropRect.height(), cropRect.width());
-
-        // The crop aspect ratio could be kept after the use case is reused. So that the aspect
-        // of the result cropRect is 1:1.
-        assertThat(cropRectAspectRatio).isEqualTo(cropAspectRatio);
-    }
-
-    @Test
-    public void useCaseCanBeReusedInSameCamera() throws IOException {
-        ImageCapture useCase = mDefaultBuilder.build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        File saveLocation1 = File.createTempFile("test1", ".jpg");
-        saveLocation1.deleteOnExit();
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation1).build(),
-                mMainExecutor, callback);
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        mInstrumentation.runOnMainSync(() -> {
-            // Unbind the use case.
-            mCamera.removeUseCases(Collections.singleton(useCase));
-        });
-
-        // Rebind the use case to the same camera.
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, useCase);
-
-        File saveLocation2 = File.createTempFile("test2", ".jpg");
-        saveLocation2.deleteOnExit();
-        OnImageSavedCallback callback2 = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation2).build(),
-                mMainExecutor, callback2);
-        // Wait for the signal that the image has been saved.
-        verify(callback2, timeout(10000)).onImageSaved(any());
-    }
-
-    @Test
-    public void useCaseCanBeReusedInDifferentCamera() throws IOException {
-        ImageCapture useCase = mDefaultBuilder.build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        File saveLocation1 = File.createTempFile("test1", ".jpg");
-        saveLocation1.deleteOnExit();
-        OnImageSavedCallback callback = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation1).build(),
-                mMainExecutor, callback);
-        // Wait for the signal that the image has been saved.
-        verify(callback, timeout(10000)).onImageSaved(any());
-
-        mInstrumentation.runOnMainSync(() -> {
-            // Unbind the use case.
-            mCamera.removeUseCases(Collections.singleton(useCase));
-        });
-
-        // Rebind the use case to different camera.
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_FRONT_CAMERA, useCase);
-
-        File saveLocation2 = File.createTempFile("test2", ".jpg");
-        saveLocation2.deleteOnExit();
-        OnImageSavedCallback callback2 = mock(OnImageSavedCallback.class);
-        useCase.takePicture(new ImageCapture.OutputFileOptions.Builder(saveLocation2).build(),
-                mMainExecutor, callback2);
-        // Wait for the signal that the image has been saved.
-        verify(callback2, timeout(10000)).onImageSaved(any());
-    }
-
-    @Test
-    public void returnValidTargetRotation_afterUseCaseIsCreated() {
-        ImageCapture imageCapture = new ImageCapture.Builder().build();
-        assertThat(imageCapture.getTargetRotation()).isNotEqualTo(
-                ImageOutputConfig.INVALID_ROTATION);
-    }
-
-    @Test
-    public void returnCorrectTargetRotation_afterUseCaseIsAttached() {
-        ImageCapture imageCapture = new ImageCapture.Builder().setTargetRotation(
-                Surface.ROTATION_180).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, imageCapture);
-        assertThat(imageCapture.getTargetRotation()).isEqualTo(Surface.ROTATION_180);
-    }
-
-    @Test
-    public void returnDefaultFlashMode_beforeUseCaseIsAttached() {
-        ImageCapture imageCapture = new ImageCapture.Builder().build();
-        assertThat(imageCapture.getFlashMode()).isEqualTo(ImageCapture.FLASH_MODE_OFF);
-    }
-
-    @Test
-    public void returnCorrectFlashMode_afterUseCaseIsAttached() {
-        ImageCapture imageCapture = new ImageCapture.Builder().setFlashMode(
-                ImageCapture.FLASH_MODE_ON).build();
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, BACK_SELECTOR, imageCapture);
-        assertThat(imageCapture.getFlashMode()).isEqualTo(ImageCapture.FLASH_MODE_ON);
-    }
-
-    @Test
-    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices that
-    // API level is at least 29.
-    @SdkSuppress(minSdkVersion = 29)
-    public void returnJpegImage_whenSoftwareJpegIsEnabled()
-            throws ExecutionException, InterruptedException {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageCapture.Builder builder = new ImageCapture.Builder();
-
-        // Enables software Jpeg
-        builder.getMutableConfig().insertOption(OPTION_USE_SOFTWARE_JPEG_ENCODER, true);
-
-        ImageCapture useCase = builder.build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the output image rotation degrees value is correct.
-        assertThat(imageProperties.get().rotationDegrees).isEqualTo(
-                mCamera.getCameraInfo().getSensorRotationDegrees(useCase.getTargetRotation()));
-        // Check the output format is correct.
-        assertThat(imageProperties.get().format).isEqualTo(ImageFormat.JPEG);
-    }
-
-    @Test
-    @SdkSuppress(minSdkVersion = 26)
-    public void returnYuvImage_whenSoftwareJpegIsEnabledWithYuvBufferFormat()
-            throws ExecutionException, InterruptedException {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageCapture.Builder builder = new ImageCapture.Builder().setBufferFormat(
-                ImageFormat.YUV_420_888);
-
-        // Enables software Jpeg
-        builder.getMutableConfig().insertOption(OPTION_USE_SOFTWARE_JPEG_ENCODER, true);
-
-        ImageCapture useCase = builder.build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the output image rotation degrees value is correct.
-        assertThat(imageProperties.get().rotationDegrees).isEqualTo(
-                mCamera.getCameraInfo().getSensorRotationDegrees(useCase.getTargetRotation()));
-        // Check the output format is correct.
-        assertThat(imageProperties.get().format).isEqualTo(ImageFormat.YUV_420_888);
-    }
-
-    @Test
-    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices that
-    // API level is at least 29.
-    @SdkSuppress(minSdkVersion = 29)
-    public void returnJpegImage_whenCaptureProcessorIsSet() throws ExecutionException,
-            InterruptedException {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageCapture.Builder builder = new ImageCapture.Builder();
-        SimpleCaptureProcessor simpleCaptureProcessor = new SimpleCaptureProcessor();
-
-        // Set a CaptureProcessor to directly pass the image to output surface.
-        ImageCapture useCase = builder.setCaptureProcessor(simpleCaptureProcessor).build();
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the output image rotation degrees value is correct.
-        assertThat(imageProperties.get().rotationDegrees).isEqualTo(
-                mCamera.getCameraInfo().getSensorRotationDegrees(useCase.getTargetRotation()));
-        // Check the output format is correct.
-        assertThat(imageProperties.get().format).isEqualTo(ImageFormat.JPEG);
-
-        simpleCaptureProcessor.close();
-    }
-
-    @Test
-    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices that
-    // API level is at least 29.
-    @SdkSuppress(minSdkVersion = 29)
-    public void returnJpegImage_whenSoftwareJpegIsEnabledWithCaptureProcessor()
-            throws ExecutionException, InterruptedException {
-        assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
-
-        ImageCapture.Builder builder = new ImageCapture.Builder();
-        SimpleCaptureProcessor simpleCaptureProcessor = new SimpleCaptureProcessor();
-
-        // Set a CaptureProcessor to directly pass the image to output surface.
-        ImageCapture useCase = builder.setCaptureProcessor(simpleCaptureProcessor).build();
-
-        // Enables software Jpeg
-        builder.getMutableConfig().insertOption(OPTION_USE_SOFTWARE_JPEG_ENCODER, true);
-
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext,
-                CameraSelector.DEFAULT_BACK_CAMERA, useCase);
-
-        ResolvableFuture<ImageProperties> imageProperties = ResolvableFuture.create();
-        OnImageCapturedCallback callback = createMockOnImageCapturedCallback(imageProperties);
-        useCase.takePicture(mMainExecutor, callback);
-        // Wait for the signal that the image has been captured.
-        verify(callback, timeout(10000)).onCaptureSuccess(any(ImageProxy.class));
-
-        // Check the output image rotation degrees value is correct.
-        assertThat(imageProperties.get().rotationDegrees).isEqualTo(
-                mCamera.getCameraInfo().getSensorRotationDegrees(useCase.getTargetRotation()));
-        // Check the output format is correct.
-        assertThat(imageProperties.get().format).isEqualTo(ImageFormat.JPEG);
-
-        simpleCaptureProcessor.close();
-    }
-
-    private OnImageCapturedCallback createMockOnImageCapturedCallback(
-            @Nullable ResolvableFuture<ImageProperties> resultProperties) {
-        OnImageCapturedCallback callback = mock(OnImageCapturedCallback.class);
-        doAnswer(
-                i -> {
-                    ImageProxy image = i.getArgument(0);
-                    if (resultProperties != null) {
-                        ImageProperties imageProperties = new ImageProperties();
-                        imageProperties.size = new Size(image.getWidth(), image.getHeight());
-                        imageProperties.format = image.getFormat();
-                        imageProperties.rotationDegrees =
-                                image.getImageInfo().getRotationDegrees();
-                        imageProperties.cropRect = image.getCropRect();
-
-                        if (imageProperties.format == ImageFormat.JPEG) {
-                            ImageProxy.PlaneProxy[] planes = image.getPlanes();
-                            ByteBuffer buffer = planes[0].getBuffer();
-                            byte[] data = new byte[buffer.capacity()];
-                            buffer.get(data);
-
-                            imageProperties.exif = Exif.createFromInputStream(
-                                    new ByteArrayInputStream(data));
-                        }
-
-                        resultProperties.set(imageProperties);
-                    }
-                    image.close();
-                    return null;
-                }).when(callback).onCaptureSuccess(any(ImageProxy.class));
-
-        return callback;
-    }
-
-    private static final class ImageProperties {
-        public Size size;
-        public int format;
-        public int rotationDegrees;
-        public Rect cropRect;
-
-        public Exif exif;
-    }
-
-    private static class CountingCallback extends OnImageCapturedCallback {
-        CountDownLatch mCountDownLatch;
-        long mTimeout;
-        List<Integer> mImageCaptureErrors = new ArrayList<>();
-        private int mNumOnCaptureSuccess = 0;
-        private int mNumOnErrorSuccess = 0;
-
-        CountingCallback(int numTakePictures, long timeout) {
-            mTimeout = timeout;
-            mCountDownLatch = new CountDownLatch(numTakePictures);
-        }
-
-        int getNumOnCaptureSuccess() throws InterruptedException {
-            mCountDownLatch.await(mTimeout, TimeUnit.MILLISECONDS);
-            return mNumOnCaptureSuccess;
-        }
-
-        int getNumOnError() throws InterruptedException {
-            mCountDownLatch.await(mTimeout, TimeUnit.MILLISECONDS);
-            return mNumOnErrorSuccess;
-        }
-
-        List<Integer> getImageCaptureErrors() throws InterruptedException {
-            mCountDownLatch.await(mTimeout, TimeUnit.MILLISECONDS);
-            return mImageCaptureErrors;
-        }
-
-        @Override
-        public void onCaptureSuccess(@NonNull ImageProxy image) {
-            mNumOnCaptureSuccess++;
-            mCountDownLatch.countDown();
-            image.close();
-        }
-
-        @Override
-        public void onError(@NonNull final ImageCaptureException exception) {
-            mNumOnErrorSuccess++;
-            mImageCaptureErrors.add(exception.getImageCaptureError());
-            mCountDownLatch.countDown();
-        }
-    }
-
-    private static class SimpleCaptureProcessor implements CaptureProcessor {
-        private ImageWriter mImageWriter = null;
-
-        @Override
-        public void onOutputSurface(Surface surface, int imageFormat) {
-            mImageWriter = ImageWriter.newInstance(surface, 2);
-        }
-
-        @Override
-        public void process(ImageProxyBundle bundle) {
-            ListenableFuture<ImageProxy> imageProxyListenableFuture =
-                    bundle.getImageProxy(bundle.getCaptureIds().get(0));
-            try {
-                ImageProxy imageProxy = imageProxyListenableFuture.get();
-                // Directly passing the input YUV image to the output surface.
-                mImageWriter.queueInputImage(imageProxy.getImage());
-            } catch (ExecutionException | InterruptedException e) {
-                throw new IllegalArgumentException("Can't extract ImageProxy from the"
-                        + " ImageProxyBundle." + e);
-            }
-        }
-
-        @Override
-        public void onResolutionUpdate(Size size) {
-
-        }
-
-        public void close() {
-            if (mImageWriter != null) {
-                mImageWriter.close();
-            }
-        }
-    }
-}
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 c076f83..1b1d237 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
@@ -21,6 +21,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
@@ -36,6 +37,8 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.camera2.internal.compat.quirk.SamsungPreviewTargetAspectRatioQuirk;
 import androidx.camera.core.AspectRatio;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
@@ -44,6 +47,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Preview;
 import androidx.camera.core.SurfaceRequest;
+import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.ImageOutputConfig;
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -253,6 +257,9 @@
                 GUARANTEED_RESOLUTION).setTargetRotation(
                 isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
 
+        // Skips the test if the SamsungPreviewTargetAspectRatioQuirk is applied on the device.
+        assumeFalse(isSamsungPreviewTargetAspectRatioQuirkApplied(preview.getCurrentConfig()));
+
         // TODO(b/160261462) move off of main thread when setSurfaceProvider does not need to be
         //  done on the main thread
         mInstrumentation.runOnMainSync(() -> preview.setSurfaceProvider(getSurfaceProvider(null)));
@@ -286,6 +293,9 @@
                 GUARANTEED_RESOLUTION).setTargetRotation(
                 isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
 
+        // Skips the test if the SamsungPreviewTargetAspectRatioQuirk is applied on the device.
+        assumeFalse(isSamsungPreviewTargetAspectRatioQuirkApplied(preview.getCurrentConfig()));
+
         // TODO(b/160261462) move off of main thread when setSurfaceProvider does not need to be
         //  done on the main thread
         mInstrumentation.runOnMainSync(() -> preview.setSurfaceProvider(getSurfaceProvider(null)));
@@ -301,6 +311,13 @@
         assertEquals(GUARANTEED_RESOLUTION, mPreviewResolution);
     }
 
+    private boolean isSamsungPreviewTargetAspectRatioQuirkApplied(@NonNull Config config) {
+        SamsungPreviewTargetAspectRatioQuirk samsungQuirk =
+                DeviceQuirks.get(SamsungPreviewTargetAspectRatioQuirk.class);
+
+        return samsungQuirk != null && samsungQuirk.require16_9(config);
+    }
+
     @Test
     public void setMultipleNonNullSurfaceProviders_getsFrame() throws InterruptedException {
         final Preview preview = mDefaultBuilder.build();
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 71554f9..21832b4 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
@@ -20,16 +20,22 @@
 import android.content.ContentResolver
 import android.content.ContentValues
 import android.content.Context
+import android.graphics.SurfaceTexture
 import android.os.Build
 import android.os.ParcelFileDescriptor
 import android.provider.MediaStore
+import android.util.Size
+import androidx.annotation.NonNull
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraX
+import androidx.camera.core.Preview
 import androidx.camera.core.UseCase
 import androidx.camera.core.VideoCapture
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
+import androidx.camera.testing.SurfaceTextureProvider.createSurfaceTextureProvider
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.FlakyTest
@@ -53,32 +59,30 @@
 import org.mockito.Mockito.timeout
 import org.mockito.Mockito.verify
 import java.io.File
-import java.util.Collections
 import java.util.concurrent.TimeUnit
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class VideoCaptureTest {
+    @get:Rule
+    val useCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
 
     @get:Rule
-    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
-
-    @get:Rule
-    val mPermissionRule: GrantPermissionRule =
+    val permissionRule: GrantPermissionRule =
         GrantPermissionRule.grant(
             Manifest.permission.WRITE_EXTERNAL_STORAGE,
             Manifest.permission.RECORD_AUDIO
         )
 
-    private val mInstrumentation = InstrumentationRegistry.getInstrumentation()
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
 
-    private val mContext = ApplicationProvider.getApplicationContext<Context>()
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
-    private lateinit var mCameraSelector: CameraSelector
+    private lateinit var cameraSelector: CameraSelector
 
-    private var mCamera: CameraUseCaseAdapter? = null
+    private lateinit var cameraUseCaseAdapter: CameraUseCaseAdapter
 
-    private lateinit var mContentResolver: ContentResolver
+    private lateinit var contentResolver: ContentResolver
 
     @Before
     fun setUp() {
@@ -88,35 +92,25 @@
             Build.MODEL.contains("Cuttlefish") && Build.VERSION.SDK_INT == 29
         )
 
-        // TODO(b/168187087): Video: Unable to record Video on Pixel 1 API 26,27 when only
-        //  VideoCapture is bound
-        assumeFalse(
-            "Pixel running API 26 has CameraDevice.onError when set repeating request",
-            Build.DEVICE.equals(
-                "sailfish",
-                true
-            ) && (Build.VERSION.SDK_INT == 26 || Build.VERSION.SDK_INT == 27)
-        )
-
         assumeTrue(CameraUtil.deviceHasCamera())
 
-        if (CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)) {
-            mCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+        cameraSelector = if (CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)) {
+            CameraSelector.DEFAULT_BACK_CAMERA
         } else {
-            mCameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
+            CameraSelector.DEFAULT_FRONT_CAMERA
         }
 
-        CameraX.initialize(mContext, Camera2Config.defaultConfig()).get()
-        mCamera = CameraUtil.createCameraUseCaseAdapter(mContext, mCameraSelector)
+        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
 
-        mContentResolver = mContext.contentResolver
+        contentResolver = context.contentResolver
     }
 
     @After
     fun tearDown() {
-        mCamera?.apply {
-            mInstrumentation.runOnMainSync {
-                removeUseCases(useCases)
+        instrumentation.runOnMainSync {
+            if (this::cameraUseCaseAdapter.isInitialized) {
+                cameraUseCaseAdapter.removeUseCases(cameraUseCaseAdapter.useCases)
             }
         }
 
@@ -151,10 +145,24 @@
         val parcelFileDescriptor =
             ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE)
         val fileDescriptor = parcelFileDescriptor.fileDescriptor
-        val useCase = VideoCapture.Builder().build()
 
-        mInstrumentation.runOnMainSync {
-            mCamera!!.addUseCases(Collections.singleton<UseCase>(useCase))
+        val preview = Preview.Builder().build()
+        val videocapture = VideoCapture.Builder().build()
+
+        assumeTrue(
+            "This combination (videocapture, preview) is not supported.",
+            checkUseCasesCombinationSupported(videocapture, preview)
+        )
+
+        instrumentation.runOnMainSync {
+            preview.setSurfaceProvider(
+                CameraXExecutors.mainThreadExecutor(),
+                getSurfaceProvider()
+            )
+            // b/168187087 if there is only VideoCapture , VideoCapture will failed when setting the
+            // repeating request with the surface, the workaround is binding one more usecase
+            // Preview.
+            cameraUseCaseAdapter.addUseCases(listOf(videocapture, preview))
         }
 
         val outputFileOptions = VideoCapture.OutputFileOptions.Builder(fileDescriptor).build()
@@ -162,13 +170,17 @@
         val callback = mock(VideoCapture.OnVideoSavedCallback::class.java)
 
         // Start recording with FileDescriptor
-        useCase.startRecording(outputFileOptions, CameraXExecutors.mainThreadExecutor(), callback)
+        videocapture.startRecording(
+            outputFileOptions,
+            CameraXExecutors.mainThreadExecutor(),
+            callback
+        )
 
         // Recording for seconds
         Thread.sleep(3000)
 
         // Stop recording
-        useCase.stopRecording()
+        videocapture.stopRecording()
 
         verify(callback, timeout(10000)).onVideoSaved(any())
         parcelFileDescriptor.close()
@@ -181,23 +193,36 @@
             deleteOnExit()
         }
 
-        val useCase = VideoCapture.Builder().build()
+        val preview = Preview.Builder().build()
+        val videocapture = VideoCapture.Builder().build()
 
-        mInstrumentation.runOnMainSync {
-            mCamera!!.addUseCases(Collections.singleton<UseCase>(useCase))
+        assumeTrue(
+            "This combination (videocapture, preview) is not supported.",
+            checkUseCasesCombinationSupported(videocapture, preview)
+        )
+        instrumentation.runOnMainSync {
+            preview.setSurfaceProvider(
+                CameraXExecutors.mainThreadExecutor(),
+                getSurfaceProvider()
+            )
+            cameraUseCaseAdapter.addUseCases(listOf(videocapture, preview))
         }
 
         val outputFileOptions = VideoCapture.OutputFileOptions.Builder(file).build()
 
         val callback = mock(VideoCapture.OnVideoSavedCallback::class.java)
 
-        useCase.startRecording(outputFileOptions, CameraXExecutors.mainThreadExecutor(), callback)
+        videocapture.startRecording(
+            outputFileOptions,
+            CameraXExecutors.mainThreadExecutor(),
+            callback
+        )
 
         // Recording for seconds
         Thread.sleep(3000)
 
-        mInstrumentation.runOnMainSync {
-            mCamera!!.removeUseCases(Collections.singletonList<UseCase>(useCase))
+        instrumentation.runOnMainSync {
+            cameraUseCaseAdapter.removeUseCases(listOf(videocapture, preview))
         }
 
         verify(callback, timeout(10000)).onVideoSaved(any())
@@ -206,21 +231,30 @@
     @Test
     @SdkSuppress(minSdkVersion = 26)
     fun startRecordingWithUri_whenAPILevelLargerThan26() {
-        val useCase = VideoCapture.Builder().build()
+        val preview = Preview.Builder().build()
+        val videocapture = VideoCapture.Builder().build()
 
-        mInstrumentation.runOnMainSync {
-            mCamera?.addUseCases(Collections.singleton<UseCase>(useCase))
+        assumeTrue(
+            "This combination (videocapture, preview) is not supported.",
+            checkUseCasesCombinationSupported(videocapture, preview)
+        )
+        instrumentation.runOnMainSync {
+            preview.setSurfaceProvider(
+                CameraXExecutors.mainThreadExecutor(),
+                getSurfaceProvider()
+            )
+            cameraUseCaseAdapter.addUseCases(listOf(videocapture, preview))
         }
 
         val callback = mock(VideoCapture.OnVideoSavedCallback::class.java)
-        useCase.startRecording(
-            getNewVideoOutputFileOptions(mContentResolver),
+        videocapture.startRecording(
+            getNewVideoOutputFileOptions(contentResolver),
             CameraXExecutors.mainThreadExecutor(),
             callback
         )
         Thread.sleep(3000)
 
-        useCase.stopRecording()
+        videocapture.stopRecording()
 
         // Assert: Wait for the signal that the image has been saved.
         val outputFileResultsArgumentCaptor =
@@ -235,21 +269,32 @@
         assertThat(saveLocationUri).isNotNull()
 
         // Remove temp test file
-        mContentResolver.delete(saveLocationUri!!, null, null)
+        contentResolver.delete(saveLocationUri!!, null, null)
     }
 
     @Test
     fun videoCapture_saveResultToFile() {
-        val useCase = VideoCapture.Builder().build()
         val file = File.createTempFile("CameraX", ".tmp").apply {
             deleteOnExit()
         }
 
-        mInstrumentation.runOnMainSync {
-            mCamera?.addUseCases(Collections.singleton<UseCase>(useCase))
+        val preview = Preview.Builder().build()
+        val videocapture = VideoCapture.Builder().build()
+
+        assumeTrue(
+            "This combination (videocapture, preview) is not supported.",
+            checkUseCasesCombinationSupported(videocapture, preview)
+        )
+        instrumentation.runOnMainSync {
+            preview.setSurfaceProvider(
+                CameraXExecutors.mainThreadExecutor(),
+                getSurfaceProvider()
+            )
+            cameraUseCaseAdapter.addUseCases(listOf(videocapture, preview))
         }
+
         val callback = mock(VideoCapture.OnVideoSavedCallback::class.java)
-        useCase.startRecording(
+        videocapture.startRecording(
             VideoCapture.OutputFileOptions.Builder(file).build(),
             CameraXExecutors.mainThreadExecutor(),
             callback
@@ -257,7 +302,7 @@
 
         Thread.sleep(3000)
 
-        useCase.stopRecording()
+        videocapture.stopRecording()
 
         // Wait for the signal that the video has been saved.
         verify(callback, timeout(10000)).onVideoSaved(any())
@@ -279,4 +324,28 @@
             MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues
         ).build()
     }
-}
\ No newline at end of file
+
+    private fun getSurfaceProvider(): Preview.SurfaceProvider {
+        return createSurfaceTextureProvider(object : SurfaceTextureCallback {
+            override fun onSurfaceTextureReady(surfaceTexture: SurfaceTexture, resolution: Size) {
+                // No-op
+            }
+
+            override fun onSafeToRelease(surfaceTexture: SurfaceTexture) {
+                surfaceTexture.release()
+            }
+        })
+    }
+
+    private fun checkUseCasesCombinationSupported(@NonNull vararg useCases: UseCase): Boolean {
+        val useCaseList = useCases.asList()
+
+        try {
+            cameraUseCaseAdapter.checkAttachUseCases(useCaseList)
+        } catch (e: CameraUseCaseAdapter.CameraException) {
+            // This use combination is not supported. on this device, abort this test.
+            return false
+        }
+        return true
+    }
+}
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
index db9ad4c..5049cad 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
@@ -589,16 +589,18 @@
     public void closeCaptureSessionImmediateAfterCreateCaptureSession()
             throws InterruptedException {
         mCamera2CameraImpl.open();
+        // Create another use case to keep the camera open.
+        UseCase useCaseDummy = createUseCase();
         UseCase useCase = createUseCase();
-        mCamera2CameraImpl.attachUseCases(Arrays.asList(useCase));
+        mCamera2CameraImpl.attachUseCases(Arrays.asList(useCase, useCaseDummy));
         mCamera2CameraImpl.onUseCaseActive(useCase);
 
         // Wait a little bit for the camera to open.
-        assertTrue(mSessionStateCallback.waitForOnConfigured(1));
+        assertTrue(mSessionStateCallback.waitForOnConfigured(2));
 
         // Remove the useCase and trigger the CaptureSession#close().
         mCamera2CameraImpl.detachUseCases(Arrays.asList(useCase));
-        assertTrue(mSessionStateCallback.waitForOnClosed(1));
+        assertTrue(mSessionStateCallback.waitForOnClosed(2));
     }
 
     // Blocks the camera thread handler.
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
index 9127af3..7f5348d 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
@@ -247,7 +247,8 @@
     }
 
     @Test
-    public void captureSessionIncreasesSurfaceUseCountAfterOpen_andDecreasesAfterRelease() {
+    public void captureSessionIncreasesSurfaceUseCountAfterOpen_andDecreasesAfterCameraIsClosed()
+            throws InterruptedException, ExecutionException, TimeoutException {
         CaptureSession captureSession = createCaptureSession();
 
         captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
@@ -270,6 +271,13 @@
                 CameraXExecutors.mainThreadExecutor());
 
         verify(mockFutureCallback, timeout(3000)).onSuccess(any());
+
+        // Release the CaptureSession will not wait for the CameraCaptureSession close, the use
+        // count of the surface will be decreased after the camera is closed or the new
+        // CaptureSession is created. Close the CameraDevice to verify the surface use count
+        // will actually decrease.
+        CameraUtil.releaseCameraDevice(mCameraDeviceHolder);
+
         int useCountAfterRelease = surface.getUseCount();
 
         assertThat(useCountAfterOpen).isGreaterThan(useCountBeforeOpen);
@@ -277,6 +285,64 @@
     }
 
     @Test
+    public void captureSessionSurfaceUseCount_decreaseAllAfterCameraClose()
+            throws InterruptedException, ExecutionException, TimeoutException {
+
+        DeferrableSurface surface = mTestParameters0.mSessionConfig.getSurfaces().get(0);
+        int useCount0BeforeOpen = surface.getUseCount();
+        CaptureSession captureSession = createSessionAndWaitOpened(mTestParameters0, 3000);
+        int useCount0AfterOpen = surface.getUseCount();
+
+        captureSession.release(false);
+
+        DeferrableSurface surface1 = mTestParameters1.mSessionConfig.getSurfaces().get(0);
+        int useCount1BeforeOpen = surface1.getUseCount();
+        CaptureSession captureSession1 = createSessionAndWaitOpened(mTestParameters1, 3000);
+        int useCount1AfterOpen = surface1.getUseCount();
+
+        captureSession1.release(false);
+
+        CameraUtil.releaseCameraDevice(mCameraDeviceHolder);
+
+        assertThat(useCount0AfterOpen).isGreaterThan(useCount0BeforeOpen);
+        assertThat(useCount1AfterOpen).isGreaterThan(useCount1BeforeOpen);
+
+        assertThat(surface.getUseCount()).isEqualTo(0);
+        assertThat(surface1.getUseCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void captureSessionSurfaceUseCount_decreaseAfterNewCaptureSessionConfigured() {
+        DeferrableSurface surface = mTestParameters0.mSessionConfig.getSurfaces().get(0);
+        int useCountBeforeOpen = surface.getUseCount();
+        CaptureSession captureSession = createSessionAndWaitOpened(mTestParameters0, 3000);
+        int useCountAfterOpen = surface.getUseCount();
+
+        captureSession.release(false);
+
+        createSessionAndWaitOpened(mTestParameters1, 3000);
+        int useCountAfterNewCaptureSessionConfigured = surface.getUseCount();
+
+        assertThat(useCountAfterOpen).isGreaterThan(useCountBeforeOpen);
+        assertThat(useCountAfterNewCaptureSessionConfigured).isEqualTo(useCountBeforeOpen);
+    }
+
+    @NonNull
+    private CaptureSession createSessionAndWaitOpened(
+            @NonNull CaptureSessionTestParameters parameters, long waitTimeout) {
+        CaptureSession captureSession = createCaptureSession();
+        captureSession.setSessionConfig(parameters.mSessionConfig);
+        FutureCallback<Void> mockFutureCallback = mock(FutureCallback.class);
+        Futures.addCallback(captureSession.open(parameters.mSessionConfig,
+                mCameraDeviceHolder.get(), mCaptureSessionOpenerBuilder.build()),
+                mockFutureCallback, CameraXExecutors.mainThreadExecutor());
+
+        verify(mockFutureCallback, timeout(waitTimeout)).onSuccess(any());
+
+        return captureSession;
+    }
+
+    @Test
     public void openCaptureSessionWithOptionOverride() throws InterruptedException {
         CaptureSession captureSession = createCaptureSession();
 
@@ -369,7 +435,7 @@
         assertThat(captureSession.getState()).isEqualTo(State.RELEASED);
 
         // StateCallback.onClosed() should be called to signal the session is closed.
-        verify(mTestParameters0.mSessionStateCallback, timeout(1000).times(1))
+        verify(mTestParameters0.mSessionStateCallback, timeout(3000).times(1))
                 .onClosed(any(CameraCaptureSession.class));
     }
 
@@ -832,7 +898,7 @@
 
         // Open the CameraCaptureSession without waiting for the onConfigured() callback.
         synchronizedCaptureSessionOpener.openCaptureSession(mCameraDeviceHolder.get(),
-                sessionConfigCompat);
+                sessionConfigCompat, mTestParameters0.mSessionConfig.getSurfaces());
 
         // Open the camera again to simulate the cameraDevice is disconnected
         CountDownLatch countDownLatch = new CountDownLatch(1);
@@ -982,7 +1048,7 @@
 
         // Open the CameraCaptureSession without waiting for the onConfigured() callback.
         synchronizedCaptureSessionOpener.openCaptureSession(mCameraDeviceHolder.get(),
-                sessionConfigCompat);
+                sessionConfigCompat, mTestParameters0.mSessionConfig.getSurfaces());
 
         CaptureSession captureSession1 = createCaptureSession();
         captureSession1.open(mTestParameters1.mSessionConfig, mCameraDeviceHolder.get(),
@@ -1047,7 +1113,7 @@
 
     @Test
     public void closePreviousClosingCaptureSession_afterNewCaptureSessionCreated_runningRepeating()
-            throws ExecutionException, InterruptedException {
+            throws ExecutionException, InterruptedException, TimeoutException {
 
         CaptureSession captureSession = createCaptureSession();
         captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
@@ -1068,7 +1134,11 @@
 
         verify(mTestParameters1.mSessionStateCallback, timeout(3000).times(1))
                 .onConfigured(any(CameraCaptureSession.class));
-        assertThat(mCaptureSessionRepository.getCaptureSessions().size()).isEqualTo(1);
+
+        CameraUtil.releaseCameraDevice(mCameraDeviceHolder);
+
+        // Close camera device should close all sessions.
+        assertThat(mCaptureSessionRepository.getCaptureSessions().size()).isEqualTo(0);
         assertThat(captureSession.getState()).isEqualTo(State.RELEASED);
     }
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
index 8e4bbb0..28bcdf2 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
@@ -65,6 +65,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -318,20 +319,22 @@
         };
 
         SessionConfig.Builder builder = new SessionConfig.Builder();
-        builder.addNonRepeatingSurface(new ImmediateSurface(surface));
+        DeferrableSurface deferrableSurface = new ImmediateSurface(surface);
+        builder.addNonRepeatingSurface(deferrableSurface);
         builder.setTemplateType(CameraDevice.TEMPLATE_PREVIEW);
         debugLog("Start configAndClose.");
         ListenableFuture<Void> openNoOpCaptureSession = noOpSession.open(builder.build(),
                 Preconditions.checkNotNull(mCameraDevice), mCaptureSessionOpenerBuilder.build());
         openNoOpCaptureSession.addListener(() -> {
             // Release the no-op Session and continue closing camera when in correct state.
-            releaseNoOpSession(noOpSession, closeAndCleanupRunner);
+            releaseNoOpSession(noOpSession, deferrableSurface, closeAndCleanupRunner);
         }, mExecutor);
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     @ExecutedBy("mExecutor")
-    void releaseNoOpSession(CaptureSession noOpSession, Runnable closeAndCleanupRunner) {
+    void releaseNoOpSession(@NonNull CaptureSession noOpSession,
+            @NonNull DeferrableSurface deferrableSurface, @NonNull Runnable closeAndCleanupRunner) {
         // Config complete and remove the noOpSession from the mConfiguringForClose map
         // after resetCaptureSession and before release the noOpSession.
         mConfiguringForClose.remove(noOpSession);
@@ -340,8 +343,11 @@
         ListenableFuture<Void> releaseFuture = releaseSession(
                 noOpSession, /*abortInFlightCaptures=*/false);
 
+        deferrableSurface.close();
         // Add a listener to clear the no-op surfaces
-        releaseFuture.addListener(closeAndCleanupRunner, CameraXExecutors.directExecutor());
+        Futures.successfulAsList(
+                Arrays.asList(releaseFuture, deferrableSurface.getTerminationFuture())).addListener(
+                closeAndCleanupRunner, CameraXExecutors.directExecutor());
     }
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -1130,8 +1136,12 @@
                 config.getDeviceStateCallbacks();
         List<CameraDevice.StateCallback> allStateCallbacks =
                 new ArrayList<>(configuredStateCallbacks);
-        allStateCallbacks.add(mStateCallback);
+        // The CaptureSessionRepository is an internal module of the Camera2CameraImpl, it needs
+        // to be updated before Camera2CameraImpl receives the camera status change. Set the
+        // state callback for CaptureSessionRepository before the Camera2CameraImpl, so the
+        // CaptureSessionRepository can update first.
         allStateCallbacks.add(mCaptureSessionRepository.getCameraStateCallback());
+        allStateCallbacks.add(mStateCallback);
         return CameraDeviceStateCallbacks.createComboCallback(allStateCallbacks);
     }
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
index 3fa60a5..acd439c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
@@ -39,7 +39,6 @@
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.DeferrableSurface;
-import androidx.camera.core.impl.DeferrableSurfaces;
 import androidx.camera.core.impl.MutableOptionsBundle;
 import androidx.camera.core.impl.OptionsBundle;
 import androidx.camera.core.impl.SessionConfig;
@@ -273,15 +272,6 @@
                     return Futures.immediateFailedFuture(new IllegalStateException(
                             "openCaptureSession() should not be possible in state: " + mState));
                 case GET_SURFACE:
-                    // Attempt to increase the usage count of all the configured deferrable
-                    // surfaces before adding them to the session.
-                    try {
-                        DeferrableSurfaces.incrementAll(mConfiguredDeferrableSurfaces);
-                    } catch (DeferrableSurface.SurfaceClosedException e) {
-                        mConfiguredDeferrableSurfaces.clear();
-                        return Futures.immediateFailedFuture(e);
-                    }
-
                     // Establishes the mapping of DeferrableSurface to Surface. Capture request
                     // will use this mapping to get the Surface from DeferrableSurface.
                     mConfiguredSurfaceMap.clear();
@@ -343,7 +333,7 @@
                     }
 
                     return mSynchronizedCaptureSessionOpener.openCaptureSession(cameraDevice,
-                            sessionConfigCompat);
+                            sessionConfigCompat, mConfiguredDeferrableSurfaces);
                 default:
                     return Futures.immediateFailedFuture(new CancellationException(
                             "openCaptureSession() not execute in state: " + mState));
@@ -480,16 +470,6 @@
         return Futures.immediateFuture(null);
     }
 
-    // Notify the surface is detached from current capture session.
-    @GuardedBy("mStateLock")
-    void clearConfiguredSurfaces() {
-        DeferrableSurfaces.decrementAll(mConfiguredDeferrableSurfaces);
-
-        // Clears the mConfiguredDeferrableSurfaces to prevent from duplicate
-        // decrement calls.
-        mConfiguredDeferrableSurfaces.clear();
-    }
-
     /**
      * Issues capture requests.
      *
@@ -545,8 +525,6 @@
         mState = State.RELEASED;
         mSynchronizedCaptureSession = null;
 
-        clearConfiguredSurfaces();
-
         if (mReleaseCompleter != null) {
             mReleaseCompleter.set(null);
             mReleaseCompleter = null;
@@ -888,13 +866,13 @@
         }
 
         @Override
-        public void onClosed(@NonNull SynchronizedCaptureSession session) {
+        public void onSessionFinished(@NonNull SynchronizedCaptureSession session) {
             synchronized (mStateLock) {
                 if (mState == State.UNINITIALIZED) {
                     throw new IllegalStateException(
-                            "onClosed() should not be possible in state: " + mState);
+                            "onSessionFinished() should not be possible in state: " + mState);
                 }
-                Logger.d(TAG, "CameraCaptureSession.onClosed()");
+                Logger.d(TAG, "onSessionFinished()");
 
                 finishClose();
             }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
index d18fb00..d012fbc 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
@@ -22,13 +22,10 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.camera.camera2.internal.annotation.CameraExecutor;
-import androidx.camera.core.impl.DeferrableSurface;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executor;
 
@@ -53,9 +50,6 @@
     final Set<SynchronizedCaptureSession> mClosingCaptureSession = new LinkedHashSet<>();
     @GuardedBy("mLock")
     final Set<SynchronizedCaptureSession> mCreatingCaptureSessions = new LinkedHashSet<>();
-    @GuardedBy("mLock")
-    final Map<SynchronizedCaptureSession, List<DeferrableSurface>> mDeferrableSurfaceMap =
-            new HashMap<>();
 
     CaptureSessionRepository(@NonNull @CameraExecutor Executor executor) {
         mExecutor = executor;
@@ -74,6 +68,12 @@
                     // error state. The CameraCaptureSession.close() may not invoke the onClosed()
                     // callback so it has to finish the close process forcibly.
                     forceOnClosedCaptureSessions();
+                    cameraClosed();
+                }
+
+                @Override
+                public void onClosed(@NonNull CameraDevice camera) {
+                    cameraClosed();
                 }
 
                 @Override
@@ -90,18 +90,29 @@
                     // The CameraCaptureSession will call its close() automatically once the
                     // onDisconnected callback is invoked.
                     forceOnClosedCaptureSessions();
+                    cameraClosed();
                 }
 
                 private void forceOnClosedCaptureSessions() {
-                    mExecutor.execute(() -> {
-                        LinkedHashSet<SynchronizedCaptureSession> sessions = new LinkedHashSet<>();
-                        synchronized (mLock) {
-                            sessions.addAll(new LinkedHashSet<>(mCreatingCaptureSessions));
-                            sessions.addAll(new LinkedHashSet<>(mCaptureSessions));
-                        }
-                        forceOnClosed(sessions);
-                    });
+                    LinkedHashSet<SynchronizedCaptureSession> sessions = new LinkedHashSet<>();
+                    synchronized (mLock) {
+                        sessions.addAll(mCreatingCaptureSessions);
+                        sessions.addAll(mCaptureSessions);
+                    }
+                    mExecutor.execute(() -> forceOnClosed(sessions));
+                }
 
+                private void cameraClosed() {
+                    List<SynchronizedCaptureSession> sessions;
+                    synchronized (mLock) {
+                        sessions = getSessionsInOrder();
+                        mCreatingCaptureSessions.clear();
+                        mCaptureSessions.clear();
+                        mClosingCaptureSession.clear();
+                    }
+                    for (SynchronizedCaptureSession s : sessions) {
+                        s.finishClose();
+                    }
                 }
             };
 
@@ -116,6 +127,24 @@
         }
     }
 
+    /**
+     * Finish close the sessions that are created before the current session.
+     *
+     * @param session the current session that is configured at this moment.
+     */
+    private void forceFinishCloseStaleSessions(@NonNull SynchronizedCaptureSession session) {
+        List<SynchronizedCaptureSession> sessions = getSessionsInOrder();
+        for (SynchronizedCaptureSession s : sessions) {
+            // Collect the sessions that started configuring before the current session. The
+            // current session and the session that starts configure after the current session
+            // are not included.
+            if (s == session) {
+                break;
+            }
+            s.finishClose();
+        }
+    }
+
     @NonNull
     List<SynchronizedCaptureSession> getCaptureSessions() {
         synchronized (mLock) {
@@ -138,39 +167,20 @@
     }
 
     /**
-     * To register a DeferrableSurface list that is using by the SynchronizedCaptureSession.
+     * Return the session list in the insertion-ordered, It represents the creation order of the
+     * sessions. All the opened sessions (including under closing sessions) are in
+     * getCaptureSessions() and all the opening sessions are in getCreatingCaptureSessions(). The
+     * returned result contains all the opening and opened sessions in the creation-ordered.
      *
-     *  <p>To register the deferrableSurface list means to identifying the list of
-     *  deferrableSurfaces is already occupied by the SynchronizedCaptureSession.The
-     *  registration information is shared between SynchronizedCaptureSession. Every
-     *  SynchronizedCaptureSessions can get the registered information to know if a
-     *  DeferrableSurface is already occupied by the another SynchronizedCaptureSession.
-     *
-     * @param synchronizedCaptureSession The SynchronizedCaptureSession that is going to configure
-     *                                   a DeferrableSurfaceList.
-     * @param deferrableSurfaces         The deferrable surface list that is configured to the
-     *                                   SynchronizedCaptureSession.
-     * @return a map of all the registered SynchronizedCaptureSession to the DeferrableSurfaceList.
+     * @return the SynchronizedCaptureSession list in the insertion-ordered
      */
-    Map<SynchronizedCaptureSession, List<DeferrableSurface>> registerDeferrableSurface(
-            @NonNull SynchronizedCaptureSession synchronizedCaptureSession,
-            @NonNull List<DeferrableSurface> deferrableSurfaces) {
+    @NonNull
+    List<SynchronizedCaptureSession> getSessionsInOrder() {
         synchronized (mLock) {
-            mDeferrableSurfaceMap.put(synchronizedCaptureSession, deferrableSurfaces);
-            return new HashMap<>(mDeferrableSurfaceMap);
-        }
-    }
-
-    /**
-     * Unregister the {@link SynchronizedCaptureSession} you previously registered using
-     * {@link #registerDeferrableSurface}.
-     *
-     * @param synchronizedCaptureSession the SynchronizedCaptureSession to be removed from the list.
-     */
-    void unregisterDeferrableSurface(
-            @NonNull SynchronizedCaptureSession synchronizedCaptureSession) {
-        synchronized (mLock) {
-            mDeferrableSurfaceMap.remove(synchronizedCaptureSession);
+            List<SynchronizedCaptureSession> sessions = new ArrayList<>();
+            sessions.addAll(getCaptureSessions());
+            sessions.addAll(getCreatingCaptureSessions());
+            return sessions;
         }
     }
 
@@ -182,6 +192,7 @@
 
     void onCaptureSessionConfigureFail(
             @NonNull SynchronizedCaptureSession synchronizedCaptureSession) {
+        forceFinishCloseStaleSessions(synchronizedCaptureSession);
         synchronized (mLock) {
             mCreatingCaptureSessions.remove(synchronizedCaptureSession);
         }
@@ -193,6 +204,7 @@
             mCaptureSessions.add(synchronizedCaptureSession);
             mCreatingCaptureSessions.remove(synchronizedCaptureSession);
         }
+        forceFinishCloseStaleSessions(synchronizedCaptureSession);
     }
 
     void onCaptureSessionClosed(@NonNull SynchronizedCaptureSession synchronizedCaptureSession) {
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 db9ab4c8..7d968fc 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
@@ -38,6 +38,7 @@
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
 import androidx.camera.camera2.internal.compat.CameraManagerCompat;
 import androidx.camera.camera2.internal.compat.workaround.ExcludedSupportedSizesContainer;
+import androidx.camera.camera2.internal.compat.workaround.ExtraSupportedSurfaceCombinationsContainer;
 import androidx.camera.camera2.internal.compat.workaround.TargetAspectRatio;
 import androidx.camera.core.AspectRatio;
 import androidx.camera.core.CameraUnavailableException;
@@ -88,6 +89,8 @@
     private final CamcorderProfileHelper mCamcorderProfileHelper;
     private final CameraCharacteristicsCompat mCharacteristics;
     private final ExcludedSupportedSizesContainer mExcludedSupportedSizesContainer;
+    private final ExtraSupportedSurfaceCombinationsContainer
+            mExtraSupportedSurfaceCombinationsContainer;
     private final int mHardwareLevel;
     private final boolean mIsSensorLandscapeResolution;
     private final Map<Integer, List<Size>> mExcludedSizeListCache = new HashMap<>();
@@ -105,6 +108,8 @@
         WindowManager windowManager =
                 (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
         mExcludedSupportedSizesContainer = new ExcludedSupportedSizesContainer(cameraId);
+        mExtraSupportedSurfaceCombinationsContainer =
+                new ExtraSupportedSurfaceCombinationsContainer(cameraId);
 
         try {
             mCharacteristics = cameraManagerCompat.getCameraCharacteristicsCompat(mCameraId);
@@ -1153,6 +1158,8 @@
         if (mHardwareLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) {
             mSurfaceCombinations.addAll(getLevel3SupportedCombinationList());
         }
+
+        mSurfaceCombinations.addAll(mExtraSupportedSurfaceCombinationsContainer.get());
     }
 
     private void checkCustomization() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
index 083c1e5..768af0f 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
@@ -64,8 +64,7 @@
      * Get a {@link ListenableFuture} which indicate the progress of specific task on this
      * SynchronizedCaptureSession.
      *
-     * @param feature the key to get the ListenableFuture. The key can be one of the
-     *                {@link SynchronizedSessionFeature#FEATURE_DEFERRABLE_SURFACE_CLOSE},
+     * @param feature the key to get the ListenableFuture. The key can be
      *                {@link SynchronizedSessionFeature#FEATURE_WAIT_FOR_REQUEST}.
      * @return the ListenableFuture which completes when the specific task is completed.
      */
@@ -256,9 +255,24 @@
 
     void abortCaptures() throws CameraAccessException;
 
+    /**
+     * To speed up the camera switching, the close method will close the configured session and post
+     * run the {@link StateCallback#onSessionFinished(SynchronizedCaptureSession)} to
+     * inform the SynchronizedCaptureSession is already in the closed state.
+     * The {@link StateCallback#onSessionFinished(SynchronizedCaptureSession)} means the session
+     * is changed to a closed state, any further operations on this object is not acceptable.
+     */
     void close();
 
     /**
+     * Set the session has already been completely closed.
+     *
+     * <p>This is an internal state control method for SynchronizedSession and
+     * CaptureSessionRepository, so you may not need to call this method outside.
+     */
+    void finishClose();
+
+    /**
      * A callback object interface to adapting the updates from
      * {@link CameraCaptureSession.StateCallback}.
      *
@@ -294,8 +308,45 @@
 
         }
 
+        /**
+         * This onClosed callback is a wrap of the CameraCaptureSession.StateCallback.onClosed, it
+         * will be invoked when:
+         * (1) CameraCaptureSession.StateCallback.onClosed is called.
+         * (2) The CameraDevice is disconnected. When the CameraDevice.StateCallback#onDisconnect
+         * is called, we will invoke this onClosed callback. Please see b/140955560.
+         * (3) When a new CameraCaptureSession is created, all the previous opened
+         * CameraCaptureSession can be treated as closed. Please see more detail in b/144817309.
+         *
+         * <p>Please note: The onClosed callback might not been called when the CameraDevice is
+         * closed before the CameraCaptureSession is closed.
+         *
+         * @param session the SynchronizedCaptureSession that is created by
+         * {@link SynchronizedCaptureSessionImpl#openCaptureSession}
+         */
         void onClosed(@NonNull SynchronizedCaptureSession session) {
 
         }
+
+        /**
+         * This callback will be invoked in the following condition:
+         * (1) After the {@link SynchronizedCaptureSession#close()} is called. It means the
+         * SynchronizedCaptureSession is changed to a closed state. Any further operations are not
+         * expected for this SynchronizedCaptureSession.
+         * (2) When the {@link SynchronizedCaptureSession.StateCallback#onClosed} is called.
+         * This means the session is already detached from the camera device. For
+         * example, close the camera device or open a second session, which should cause the first
+         * one to be closed.
+         *
+         * <p>This callback only would be invoked at most one time for a configured
+         * SynchronizedCaptureSession. Once the callback is called, we can treat this
+         * SynchronizedCaptureSession is no longer active and further operations on this object
+         * will fail.
+         *
+         * @param session the SynchronizedCaptureSession that is created by
+         * {@link SynchronizedCaptureSessionImpl#openCaptureSession}
+         */
+        void onSessionFinished(@NonNull SynchronizedCaptureSession session) {
+
+        }
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
index 09ac978..dd04d80 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
@@ -38,6 +38,7 @@
 import androidx.camera.core.impl.DeferrableSurface;
 import androidx.camera.core.impl.DeferrableSurfaces;
 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;
@@ -95,10 +96,16 @@
     @GuardedBy("mLock")
     private ListenableFuture<List<Surface>> mStartingSurface;
 
+    @Nullable
+    @GuardedBy("mLock")
+    private List<DeferrableSurface> mHeldDeferrableSurfaces = null;
+
     @GuardedBy("mLock")
     private boolean mClosed = false;
     @GuardedBy("mLock")
     private boolean mOpenerDisabled = false;
+    @GuardedBy("mLock")
+    private boolean mSessionFinished = false;
 
     SynchronizedCaptureSessionBaseImpl(@NonNull CaptureSessionRepository repository,
             @NonNull @CameraExecutor Executor executor,
@@ -126,7 +133,8 @@
     @NonNull
     @Override
     public ListenableFuture<Void> openCaptureSession(@NonNull CameraDevice cameraDevice,
-            @NonNull SessionConfigurationCompat sessionConfigurationCompat) {
+            @NonNull SessionConfigurationCompat sessionConfigurationCompat,
+            @NonNull List<DeferrableSurface> deferrableSurfaces) {
         synchronized (mLock) {
             if (mOpenerDisabled) {
                 return Futures.immediateFailedFuture(
@@ -138,6 +146,10 @@
             mOpenCaptureSessionFuture = CallbackToFutureAdapter.getFuture(
                     completer -> {
                         synchronized (mLock) {
+                            // Attempt to set all the configured deferrable surfaces is in used
+                            // before adding them to the session.
+                            holdDeferrableSurfaces(deferrableSurfaces);
+
                             Preconditions.checkState(mOpenCaptureSessionCompleter == null,
                                     "The openCaptureSessionCompleter can only set once!");
 
@@ -148,6 +160,20 @@
                         }
                     });
 
+            Futures.addCallback(mOpenCaptureSessionFuture, new FutureCallback<Void>() {
+                @Override
+                public void onSuccess(@Nullable Void result) {
+                    // Nothing to do.
+                }
+
+                @Override
+                public void onFailure(Throwable t) {
+                    SynchronizedCaptureSessionBaseImpl.this.finishClose();
+                    mCaptureSessionRepository.onCaptureSessionConfigureFail(
+                            SynchronizedCaptureSessionBaseImpl.this);
+                }
+            }, CameraXExecutors.directExecutor());
+
             return Futures.nonCancellationPropagating(mOpenCaptureSessionFuture);
         }
     }
@@ -274,7 +300,9 @@
             mStartingSurface = FutureChain.from(
                     DeferrableSurfaces.surfaceListWithTimeout(deferrableSurfaces, false, timeout,
                             getExecutor(), mScheduledExecutorService)).transformAsync(surfaces -> {
-                                debugLog("getSurface...done");
+                                Logger.d(TAG,
+                                        "[" + SynchronizedCaptureSessionBaseImpl.this
+                                                + "] getSurface...done");
                                 // If a Surface in configuredSurfaces is null it means the
                                 // Surface was not retrieved from the ListenableFuture. Only
                                 // handle the first failed Surface since subsequent calls to
@@ -433,6 +461,9 @@
                 + "before using this API.");
         mCaptureSessionRepository.onCaptureSessionClosing(this);
         mCameraCaptureSessionCompat.toCameraCaptureSession().close();
+        // Invoke the onSessionFinished callback directly to inform the closing
+        // step can be finished.
+        getExecutor().execute(() -> onSessionFinished(this));
     }
 
     @Override
@@ -466,10 +497,21 @@
 
     @Override
     public void onConfigureFailed(@NonNull SynchronizedCaptureSession session) {
+        finishClose();
         mCaptureSessionRepository.onCaptureSessionConfigureFail(this);
         mCaptureSessionStateCallback.onConfigureFailed(session);
     }
 
+    /**
+     * The onClosed will be invoked when the CameraCaptureSession is closed or when we apply the
+     * workaround the issues like b/140955560, b/144817309 to force close the session.
+     *
+     * <p>This callback will be invoked after the SynchronizedCaptureSession#openCaptureSession
+     * is completed, and at most be called once.
+     *
+     * @param session the SynchronizedCaptureSession that is created by
+     * {@link SynchronizedCaptureSessionImpl#openCaptureSession}
+     */
     @Override
     public void onClosed(@NonNull SynchronizedCaptureSession session) {
         ListenableFuture<Void> openFuture = null;
@@ -482,17 +524,78 @@
                 openFuture = mOpenCaptureSessionFuture;
             }
         }
+        finishClose();
         if (openFuture != null) {
             openFuture.addListener(() -> {
                 // Set the CaptureSession closed before invoke the state callback.
                 mCaptureSessionRepository.onCaptureSessionClosed(
                         SynchronizedCaptureSessionBaseImpl.this);
+
+                // Invoke the onSessionFinished since the SynchronizedCaptureSession receives
+                // the onClosed callback, we can treat this session is already in closed state.
+                onSessionFinished(session);
+
                 mCaptureSessionStateCallback.onClosed(session);
             }, CameraXExecutors.directExecutor());
         }
     }
 
-    private void debugLog(String message) {
-        Logger.d(TAG, "[" + SynchronizedCaptureSessionBaseImpl.this + "] " + message);
+    @Override
+    void onSessionFinished(@NonNull SynchronizedCaptureSession session) {
+        ListenableFuture<Void> openFuture = null;
+        synchronized (mLock) {
+            if (!mSessionFinished) {
+                mSessionFinished = true;
+                Preconditions.checkNotNull(mOpenCaptureSessionFuture,
+                        "Need to call openCaptureSession before using this API.");
+                // Only callback onClosed after the capture session is configured.
+                openFuture = mOpenCaptureSessionFuture;
+            }
+        }
+        if (openFuture != null) {
+            openFuture.addListener(() -> {
+                mCaptureSessionStateCallback.onSessionFinished(session);
+            }, CameraXExecutors.directExecutor());
+        }
+    }
+
+    /**
+     * Hold the DeferrableSurfaces to be used for this session to prevent the DeferrableSurfaces
+     * from being released.
+     *
+     * <p>Only one set of DeferrableSurfaces will be set to in used at the same time, it will unset
+     * the previous deferrableSurfaces if it has been set before.
+     *
+     * @param deferrableSurfaces will be set to in used.
+     * @throws DeferrableSurface.SurfaceClosedException if the deferrableSurfaces contains any
+     * closed surface.
+     */
+    void holdDeferrableSurfaces(@NonNull List<DeferrableSurface> deferrableSurfaces)
+            throws DeferrableSurface.SurfaceClosedException {
+        synchronized (mLock) {
+            releaseDeferrableSurfaces();
+            DeferrableSurfaces.incrementAll(deferrableSurfaces);
+            mHeldDeferrableSurfaces = deferrableSurfaces;
+        }
+    }
+
+    /**
+     * Release the DeferrableSurfaces that is held by the holdDeferrableSurfaces()
+     */
+    void releaseDeferrableSurfaces() {
+        synchronized (mLock) {
+            if (mHeldDeferrableSurfaces != null) {
+                DeferrableSurfaces.decrementAll(mHeldDeferrableSurfaces);
+
+                // Clears the mRegisteredDeferrableSurfaces to prevent from duplicate
+                // decrement calls.
+                mHeldDeferrableSurfaces = null;
+            }
+        }
+    }
+
+    @Override
+    public void finishClose() {
+        releaseDeferrableSurfaces();
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
index 9a562c8..5fc9b68 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
@@ -39,10 +39,8 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -77,12 +75,6 @@
     CallbackToFutureAdapter.Completer<Void> mStartStreamingCompleter;
 
     @Nullable
-    private final ListenableFuture<Void> mClosingDeferrableSurfaceFuture;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    @Nullable
-    CallbackToFutureAdapter.Completer<Void> mClosingDeferrableSurfaceCompleter;
-
-    @Nullable
     @GuardedBy("mObjectLock")
     private List<DeferrableSurface> mDeferrableSurfaces;
     @Nullable
@@ -117,23 +109,13 @@
         } else {
             mStartStreamingFuture = Futures.immediateFuture(null);
         }
-
-        if (mEnabledFeature.contains(
-                SynchronizedCaptureSessionOpener.FEATURE_DEFERRABLE_SURFACE_CLOSE)) {
-            mClosingDeferrableSurfaceFuture = CallbackToFutureAdapter.getFuture(completer -> {
-                mClosingDeferrableSurfaceCompleter = completer;
-                return "ClosingDeferrableSurfaceFuture[session="
-                        + SynchronizedCaptureSessionImpl.this + "]";
-            });
-        } else {
-            mClosingDeferrableSurfaceFuture = Futures.immediateFuture(null);
-        }
     }
 
     @NonNull
     @Override
     public ListenableFuture<Void> openCaptureSession(@NonNull CameraDevice cameraDevice,
-            @NonNull SessionConfigurationCompat sessionConfigurationCompat) {
+            @NonNull SessionConfigurationCompat sessionConfigurationCompat,
+            @NonNull List<DeferrableSurface> deferrableSurfaces) {
         synchronized (mObjectLock) {
             List<ListenableFuture<Void>> futureList =
                     getBlockerFuture(SynchronizedCaptureSessionOpener.FEATURE_WAIT_FOR_REQUEST,
@@ -141,7 +123,8 @@
 
             mOpeningCaptureSession =
                     FutureChain.from(Futures.successfulAsList(futureList)).transformAsync(
-                            v -> super.openCaptureSession(cameraDevice, sessionConfigurationCompat),
+                            v -> super.openCaptureSession(cameraDevice,
+                                    sessionConfigurationCompat, deferrableSurfaces),
                             CameraXExecutors.directExecutor());
 
             return Futures.nonCancellationPropagating(mOpeningCaptureSession);
@@ -157,8 +140,6 @@
                 // Returns the future which is completed once the session starts streaming
                 // frames.
                 return Futures.nonCancellationPropagating(mStartStreamingFuture);
-            case SynchronizedCaptureSessionOpener.FEATURE_DEFERRABLE_SURFACE_CLOSE:
-                return Futures.nonCancellationPropagating(mClosingDeferrableSurfaceFuture);
             default:
                 return super.getSynchronizedBlocker(feature);
         }
@@ -180,34 +161,8 @@
             @NonNull List<DeferrableSurface> deferrableSurfaces, long timeout) {
         synchronized (mObjectLock) {
             mDeferrableSurfaces = deferrableSurfaces;
-
-            List<ListenableFuture<Void>> futureList = Collections.emptyList();
-            if (mEnabledFeature.contains(SynchronizedCaptureSessionOpener.FEATURE_FORCE_CLOSE)) {
-                Map<SynchronizedCaptureSession, List<DeferrableSurface>> registeredSurfaceMap =
-                        mCaptureSessionRepository.registerDeferrableSurface(this,
-                                deferrableSurfaces);
-
-                List<SynchronizedCaptureSession> sessionsWithSameSurface = new ArrayList<>();
-                for (Map.Entry<SynchronizedCaptureSession, List<DeferrableSurface>> entry :
-                        registeredSurfaceMap.entrySet()) {
-                    if (entry.getKey() != this && !Collections.disjoint(entry.getValue(),
-                            mDeferrableSurfaces)) {
-                        sessionsWithSameSurface.add(entry.getKey());
-                    }
-                }
-                // Only blocking this method when the other SynchronizedCaptureSessions using the
-                // same deferrableSurface instance.
-                futureList = getBlockerFuture(
-                        SynchronizedCaptureSessionOpener.FEATURE_DEFERRABLE_SURFACE_CLOSE,
-                        sessionsWithSameSurface);
-            }
-
-            mStartingSurface =
-                    FutureChain.from(Futures.successfulAsList(futureList)).transformAsync(
-                            v -> super.startWithDeferrableSurface(deferrableSurfaces, timeout),
-                            getExecutor());
-
-            return Futures.nonCancellationPropagating(mStartingSurface);
+            return Futures.nonCancellationPropagating(
+                    super.startWithDeferrableSurface(deferrableSurfaces, timeout));
         }
     }
 
@@ -223,7 +178,6 @@
                 if (mStartingSurface != null) {
                     mStartingSurface.cancel(true);
                 }
-                stopDeferrableSurface();
             }
             return super.stop();
         }
@@ -327,17 +281,6 @@
                     deferrableSurface.close();
                 }
                 debugLog("deferrableSurface closed");
-                stopDeferrableSurface();
-            }
-        }
-    }
-
-    void stopDeferrableSurface() {
-        if (mEnabledFeature.contains(
-                SynchronizedCaptureSessionOpener.FEATURE_DEFERRABLE_SURFACE_CLOSE)) {
-            mCaptureSessionRepository.unregisterDeferrableSurface(this);
-            if (mClosingDeferrableSurfaceCompleter != null) {
-                mClosingDeferrableSurfaceCompleter.set(null);
             }
         }
     }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
index 214ebf1..56c4671 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
@@ -56,16 +56,10 @@
  * reused to open the second SynchronizedCaptureSession. The {@link #openCaptureSession} can't
  * be called more than once in the same Opener.
  *
- * @see #openCaptureSession(CameraDevice, SessionConfigurationCompat)
+ * @see #openCaptureSession(CameraDevice, SessionConfigurationCompat, List)
  * @see #createSessionConfigurationCompat(int, List, SynchronizedCaptureSession.StateCallback)
  * @see SynchronizedCaptureSession.StateCallback
  *
- * <p>The {@link #startWithDeferrableSurface} method will return a Surface list that
- * is held in the List<DeferrableSurface>. The Opener helps in maintaining the timing to close
- * the returned DeferrableSurface list. Most use case should attempt to use the
- * {@link #startWithDeferrableSurface} method to get the Surface for creating the
- * SynchronizedCaptureSession.
- *
  * <p>The {@link #stop} method should be invoked when the SynchronizedCaptureSession opening flow
  * is interropted.
  * @see #startWithDeferrableSurface
@@ -125,6 +119,11 @@
      * <p>The {@link SessionConfigurationCompat} object that is needed in this method should be
      * created via the {@link #createSessionConfigurationCompat}.
      *
+     * <p>The use count of the input DeferrableSurfaces will be increased. It will be
+     * automatically decreased when the surface is not used by the camera. For instance, when the
+     * opened SynchronizedCaptureSession is closed completely or when the configuration of the
+     * session is failed.
+     *
      * <p>Cancellation of the returned future is a no-op. The opening task can only be
      * cancelled by the {@link #stop()}. The {@link #stop()} only effective when the
      * CameraDevice#createCaptureSession() hasn't been invoked. If the {@link #stop()} is called
@@ -138,6 +137,8 @@
      *                                   SynchronizedCaptureSession
      * @param sessionConfigurationCompat A {@link SessionConfigurationCompat} that is created via
      *                                   the {@link #createSessionConfigurationCompat}.
+     * @param deferrableSurfaces         the list of the DeferrableSurface that be used to
+     *                                   configure the session.
      * @return a ListenableFuture object which completes when the SynchronizedCaptureSession is
      * configured.
      * @see #createSessionConfigurationCompat(int, List, SynchronizedCaptureSession.StateCallback)
@@ -145,8 +146,10 @@
      */
     @NonNull
     ListenableFuture<Void> openCaptureSession(@NonNull CameraDevice cameraDevice,
-            @NonNull SessionConfigurationCompat sessionConfigurationCompat) {
-        return mImpl.openCaptureSession(cameraDevice, sessionConfigurationCompat);
+            @NonNull SessionConfigurationCompat sessionConfigurationCompat,
+            @NonNull List<DeferrableSurface> deferrableSurfaces) {
+        return mImpl.openCaptureSession(cameraDevice, sessionConfigurationCompat,
+                deferrableSurfaces);
     }
 
     /**
@@ -168,13 +171,13 @@
     }
 
     /**
-     * Start to use the DeferrableSurfaces for the SynchronizedCaptureSession.
+     * Get the surface from the DeferrableSurfaces.
      *
-     * <p>When the {@link SynchronizedSessionFeature#FEATURE_DEFERRABLE_SURFACE_CLOSE} is
-     * enabled. The DeferrableSurface list will be tagged as started and cannot be used on any
-     * other SynchronizedCaptureSession instance until it is untagged. The DeferrableSurfaces
-     * will be untagged when the opened SynchronizedCaptureSession is closed or when calling the
-     * {@link #stop()} with a true return value.
+     * <p>The {@link #startWithDeferrableSurface} method will return a Surface list that
+     * is held in the List<DeferrableSurface>. The Opener helps in maintaining the timing to
+     * close the returned DeferrableSurface list. Most use case should attempt to use the
+     * {@link #startWithDeferrableSurface} method to get the Surface for creating the
+     * SynchronizedCaptureSession.
      *
      * @param deferrableSurfaces The deferrable surfaces to open.
      * @param timeout            the timeout to get surfaces from the deferrable surface list.
@@ -196,11 +199,6 @@
      * hasn't been invoked. Once the CameraDevice#createCaptureSession() already been invoked, the
      * task of openCaptureSession() will keep going.
      *
-     * <p>If the DeferrableSurfaces had tagged as started via {@link #startWithDeferrableSurface}
-     * will also be untagged if the SynchronizedCaptureSession doesn't open yet. If the
-     * SynchronizedCaptureSession is already opened, the tagged DeferrableSurfaces will be
-     * untagged when the SynchronizedCaptureSession is closed.
-     *
      * @return true if the CameraCaptureSession creation has not been started yet. Otherwise true
      * false.
      */
@@ -267,7 +265,8 @@
 
         @NonNull
         ListenableFuture<Void> openCaptureSession(@NonNull CameraDevice cameraDevice, @NonNull
-                SessionConfigurationCompat sessionConfigurationCompat);
+                SessionConfigurationCompat sessionConfigurationCompat,
+                @NonNull List<DeferrableSurface> deferrableSurfaces);
 
         @NonNull
         SessionConfigurationCompat createSessionConfigurationCompat(int sessionType,
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
index 8748458..81da773 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
@@ -98,6 +98,13 @@
         }
     }
 
+    @Override
+    void onSessionFinished(@NonNull SynchronizedCaptureSession session) {
+        for (SynchronizedCaptureSession.StateCallback callback : mCallbacks) {
+            callback.onSessionFinished(session);
+        }
+    }
+
     static class Adapter extends SynchronizedCaptureSession.StateCallback {
         @NonNull
         private final CameraCaptureSession.StateCallback mCameraCaptureSessionStateCallback;
@@ -154,5 +161,10 @@
             mCameraCaptureSessionStateCallback.onClosed(
                     session.toCameraCaptureSessionCompat().toCameraCaptureSession());
         }
+
+        @Override
+        void onSessionFinished(@NonNull SynchronizedCaptureSession session) {
+            // This callback is internally used, don't forward.
+        }
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
index 518e3ff..4e54aed 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
@@ -20,16 +20,24 @@
 
 import androidx.camera.core.impl.Quirk;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * Quirk caused by a device bug that occurs on certain devices, like the Samsung A3 devices. It
  * causes the a crash after taking a picture with a
  * {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AE_MODE_ON_AUTO_FLASH}
- * auto-exposure mode. https://issuetracker.google.com/157535165
+ * auto-exposure mode. See https://issuetracker.google.com/157535165 and
+ * https://issuetracker.google.com/161730578
  */
 public class CrashWhenTakingPhotoWithAutoFlashAEModeQuirk implements Quirk {
+    static final List<String> AFFECTED_MODELS = Arrays.asList("5059X");
+
     static boolean load() {
-        return "SAMSUNG".equals(Build.MANUFACTURER.toUpperCase())
-                // Enables it on all A3 models.
-                && android.os.Build.MODEL.toUpperCase().startsWith("SM-A300");
+        // Enables it on all A3 models.
+        boolean isSamsungA3Models = "SAMSUNG".equals(Build.MANUFACTURER.toUpperCase())
+                && Build.MODEL.toUpperCase().startsWith("SM-A300");
+
+        return isSamsungA3Models || AFFECTED_MODELS.contains(Build.MODEL.toUpperCase());
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
index 374c616..5cd48c8 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
@@ -60,6 +60,9 @@
         if (StillCaptureFlashStopRepeatingQuirk.load()) {
             quirks.add(new StillCaptureFlashStopRepeatingQuirk());
         }
+        if (ExtraSupportedSurfaceCombinationsQuirk.load()) {
+            quirks.add(new ExtraSupportedSurfaceCombinationsQuirk());
+        }
 
         return quirks;
     }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java
new file mode 100644
index 0000000..6434a53
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java
@@ -0,0 +1,82 @@
+/*
+ * 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.camera2.internal.compat.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.Quirk;
+import androidx.camera.core.impl.SurfaceCombination;
+import androidx.camera.core.impl.SurfaceConfig;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Quirk required to include extra supported surface combinations which are additional to the
+ * guaranteed supported configurations.
+ *
+ * <p>An example is the Samsung S7 device can support additional YUV/640x480 + PRIV/PREVIEW +
+ * YUV/MAXIMUM combination.
+ */
+public class ExtraSupportedSurfaceCombinationsQuirk implements Quirk {
+    private static final String TAG = "ExtraSupportedSurfaceCombinationsQuirk";
+
+    static boolean load() {
+        return isSamsungS7();
+    }
+
+    private static boolean isSamsungS7() {
+        return "Samsung".equalsIgnoreCase(Build.BRAND) && ("heroqltevzw".equalsIgnoreCase(
+                Build.DEVICE) || "heroqltetmo".equalsIgnoreCase(Build.DEVICE));
+    }
+
+    /**
+     * Returns the extra supported surface combinations for specific camera on the device.
+     */
+    @NonNull
+    public List<SurfaceCombination> getExtraSupportedSurfaceCombinations(@NonNull String cameraId) {
+        if (isSamsungS7()) {
+            return getSamsungS7ExtraCombinations(cameraId);
+        }
+
+        Logger.w(TAG,
+                "Cannot retrieve list of extra supported surface combinations on this device.");
+        return Collections.emptyList();
+    }
+
+    @NonNull
+    private List<SurfaceCombination> getSamsungS7ExtraCombinations(@NonNull String cameraId) {
+        List<SurfaceCombination> extraCombinations = new ArrayList<>();
+
+        if (cameraId.equals("1")) {
+            // (YUV, ANALYSIS) + (PRIV, PREVIEW) + (YUV, MAXIMUM)
+            SurfaceCombination surfaceCombination = new SurfaceCombination();
+            surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.YUV,
+                    SurfaceConfig.ConfigSize.ANALYSIS));
+            surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.PRIV,
+                    SurfaceConfig.ConfigSize.PREVIEW));
+            surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.YUV,
+                    SurfaceConfig.ConfigSize.MAXIMUM));
+            extraCombinations.add(surfaceCombination);
+        }
+
+        return extraCombinations;
+    }
+}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
index c82dabb..2212cc4 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
@@ -16,13 +16,11 @@
 
 package androidx.camera.camera2.internal.compat.quirk;
 
-import android.hardware.camera2.CameraCharacteristics;
 import android.os.Build;
 
 import androidx.annotation.NonNull;
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
 import androidx.camera.core.internal.compat.quirk.SoftwareJpegEncodingPreferredQuirk;
-import androidx.core.util.Preconditions;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -46,23 +44,7 @@
                     "heroqltetmo"
             ));
 
-    // TODO: This quirk is limited to FULL/LEVEL_3 cameras currently since it will use a YUV stream
-    //  for ImageCapture. On LIMITED and LEGACY this would limit the guaranteed surface
-    //  combinations.
-    private static final Set<Integer> SUPPORTED_HARDWARE_LEVELS = new HashSet<>();
-
-    static {
-        SUPPORTED_HARDWARE_LEVELS.add(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL);
-        if (Build.VERSION.SDK_INT >= 24) {
-            SUPPORTED_HARDWARE_LEVELS.add(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3);
-        }
-    }
-
     static boolean load(@NonNull CameraCharacteristicsCompat characteristicsCompat) {
-
-        int hardwareLevel = Preconditions.checkNotNull(
-                characteristicsCompat.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
-        return KNOWN_AFFECTED_DEVICES.contains(Build.DEVICE.toLowerCase(Locale.US))
-                && SUPPORTED_HARDWARE_LEVELS.contains(hardwareLevel);
+        return KNOWN_AFFECTED_DEVICES.contains(Build.DEVICE.toLowerCase(Locale.US));
     }
 }
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 240a564..970ad18 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
@@ -20,7 +20,6 @@
 
 import androidx.camera.core.impl.Quirk;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
@@ -40,7 +39,7 @@
 
     /** The devices that support wysiwyg preview in 3rd party apps (go/p20-wysiwyg-hdr) */
     private static final List<String> SUPPORTED_DEVICES =
-            new ArrayList<>(Arrays.asList("sunfish", "bramble", "redfin"));
+            Arrays.asList("sunfish", "bramble", "redfin");
 
     static boolean load() {
         return "Google".equals(Build.MANUFACTURER) && SUPPORTED_DEVICES.contains(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java
new file mode 100644
index 0000000..cafe58f73
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.camera2.internal.compat.workaround;
+
+import androidx.annotation.NonNull;
+import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.camera2.internal.compat.quirk.ExtraSupportedSurfaceCombinationsQuirk;
+import androidx.camera.core.impl.SurfaceCombination;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Gets the extra supported surface combinations which are additional to the guaranteed supported
+ * configurations.
+ */
+public class ExtraSupportedSurfaceCombinationsContainer {
+
+    @NonNull
+    private final String mCameraId;
+
+    /**
+     * Constructs an instance of {@link ExtraSupportedSurfaceCombinationsContainer} to provide
+     * the extra surface combinations.
+     */
+    public ExtraSupportedSurfaceCombinationsContainer(@NonNull String cameraId) {
+        mCameraId = cameraId;
+    }
+
+    /**
+     * Retrieves the extra surface combinations which can be supported on the device.
+     */
+    @NonNull
+    public List<SurfaceCombination> get() {
+        final ExtraSupportedSurfaceCombinationsQuirk quirk =
+                DeviceQuirks.get(ExtraSupportedSurfaceCombinationsQuirk.class);
+
+        if (quirk == null) {
+            return new ArrayList<>();
+        }
+
+        return quirk.getExtraSupportedSurfaceCombinations(mCameraId);
+    }
+}
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CaptureSessionRepositoryTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CaptureSessionRepositoryTest.java
index 98b9153..48741ab 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CaptureSessionRepositoryTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/CaptureSessionRepositoryTest.java
@@ -28,9 +28,11 @@
 import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
+import android.view.Surface;
 
 import androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat;
 import androidx.camera.camera2.internal.compat.params.SessionConfigurationCompat;
+import androidx.camera.core.impl.ImmediateSurface;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 
 import org.junit.Before;
@@ -41,6 +43,7 @@
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -86,7 +89,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         // Simulate the CameraCaptureSession is configured.
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
         assertThat(mCaptureSessionRepository.getCaptureSessions().size()).isEqualTo(1);
@@ -110,7 +114,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         // Simulate the CameraCaptureSession is configured.
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
         assertThat(mCaptureSessionRepository.getCaptureSessions().size()).isEqualTo(1);
@@ -133,7 +138,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         assertThat(mCaptureSessionRepository.getCreatingCaptureSessions().size()).isEqualTo(0);
@@ -150,7 +156,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
 
         assertThat(mCaptureSessionRepository.getCreatingCaptureSessions().size()).isEqualTo(1);
         assertThat(mCaptureSessionRepository.getCaptureSessions().size()).isEqualTo(0);
@@ -166,7 +173,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
 
         sessionConfigurationCompat.getStateCallback().onConfigureFailed(mMockCaptureSession);
 
@@ -184,7 +192,8 @@
                         mMockStateCallback);
 
         mCaptureSessionCompatBase.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
 
         // Simulate the CameraCaptureSession is configured.
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseTest.java
index 6776683..0c99740 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseTest.java
@@ -31,6 +31,8 @@
 
 import androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat;
 import androidx.camera.camera2.internal.compat.params.SessionConfigurationCompat;
+import androidx.camera.core.impl.ImmediateSurface;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -40,6 +42,7 @@
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -66,7 +69,7 @@
 
         mSyncCaptureSessionBaseImpl =
                 new SynchronizedCaptureSessionBaseImpl(mMockCaptureSessionRepository,
-                        android.os.AsyncTask.THREAD_POOL_EXECUTOR, mScheduledExecutorService,
+                        CameraXExecutors.directExecutor(), mScheduledExecutorService,
                         mock(Handler.class));
 
         mMockCaptureSession = mock(CameraCaptureSession.class);
@@ -142,7 +145,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         verify(mMockStateCallback).onConfigured(any(SynchronizedCaptureSession.class));
@@ -159,7 +163,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigureFailed(mMockCaptureSession);
 
         verify(mMockStateCallback).onConfigureFailed(any(SynchronizedCaptureSession.class));
@@ -174,7 +179,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
         sessionConfigurationCompat.getStateCallback().onClosed(mMockCaptureSession);
 
@@ -184,6 +190,42 @@
     }
 
     @Test
+    public void callClose_onSessionFinished_shouldBeCalled() {
+        SessionConfigurationCompat sessionConfigurationCompat =
+                mSyncCaptureSessionBaseImpl.createSessionConfigurationCompat(
+                        SessionConfigurationCompat.SESSION_REGULAR,
+                        mOutputs,
+                        mMockStateCallback);
+
+        mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
+        sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
+        mSyncCaptureSessionBaseImpl.close();
+
+        verify(mMockStateCallback).onSessionFinished(
+                any(SynchronizedCaptureSession.class));
+    }
+
+    @Test
+    public void callbackShouldWork_onSessionFinished() {
+        SessionConfigurationCompat sessionConfigurationCompat =
+                mSyncCaptureSessionBaseImpl.createSessionConfigurationCompat(
+                        SessionConfigurationCompat.SESSION_REGULAR,
+                        mOutputs,
+                        mMockStateCallback);
+
+        mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
+        sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
+        sessionConfigurationCompat.getStateCallback().onClosed(mMockCaptureSession);
+
+        verify(mMockStateCallback).onSessionFinished(
+                any(SynchronizedCaptureSession.class));
+    }
+
+    @Test
     public void shouldForwardAfterOnConfigured() throws CameraAccessException {
         SessionConfigurationCompat sessionConfigurationCompat =
                 mSyncCaptureSessionBaseImpl.createSessionConfigurationCompat(
@@ -192,7 +234,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.captureSingleRequest(mock(CaptureRequest.class),
@@ -208,7 +251,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.captureBurstRequests(mock(List.class),
@@ -225,7 +269,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.setRepeatingBurstRequests(mock(List.class),
@@ -242,7 +287,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.setSingleRepeatingRequest(mock(CaptureRequest.class),
@@ -259,7 +305,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.abortCaptures();
@@ -275,7 +322,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.stopRepeating();
@@ -290,7 +338,8 @@
                         mMockStateCallback);
 
         mSyncCaptureSessionBaseImpl.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mSyncCaptureSessionBaseImpl.getDevice();
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionTest.java
index 64635f2..b6079a8 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionTest.java
@@ -25,10 +25,12 @@
 import android.hardware.camera2.CameraDevice;
 import android.os.Build;
 import android.os.Handler;
+import android.view.Surface;
 
 import androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat;
 import androidx.camera.camera2.internal.compat.params.SessionConfigurationCompat;
 import androidx.camera.core.impl.DeferrableSurface;
+import androidx.camera.core.impl.ImmediateSurface;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -38,6 +40,7 @@
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -124,10 +127,12 @@
                         mockStateCallback1);
 
         mSynchronizedCaptureSessionOpener.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
         captureSessionUtil1.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat1.getStateCallback().onConfigured(mockCaptureSession1);
 
         verify(mMockStateCallback).onClosed(any(SynchronizedCaptureSession.class));
@@ -151,7 +156,8 @@
                         mMockStateCallback);
 
         mSynchronizedCaptureSessionOpener.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mCaptureSessionRepository.getCameraStateCallback().onDisconnected(mock(CameraDevice.class));
@@ -168,7 +174,8 @@
                         mMockStateCallback);
 
         mSynchronizedCaptureSessionOpener.openCaptureSession(mock(CameraDevice.class),
-                sessionConfigurationCompat);
+                sessionConfigurationCompat,
+                Arrays.asList(new ImmediateSurface(mock(Surface.class))));
         sessionConfigurationCompat.getStateCallback().onConfigured(mMockCaptureSession);
 
         mCaptureSessionRepository.getCameraStateCallback().onDisconnected(mock(CameraDevice.class));
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerTest.java
new file mode 100644
index 0000000..b0c97e4
--- /dev/null
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.camera2.internal.compat.workaround;
+
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.camera.core.impl.SurfaceCombination;
+import androidx.camera.core.impl.SurfaceConfig;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.internal.DoNotInstrument;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Unit test for {@link ExtraSupportedSurfaceCombinationsContainer}
+ */
+@RunWith(ParameterizedRobolectricTestRunner.class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class ExtraSupportedSurfaceCombinationsContainerTest {
+
+    @ParameterizedRobolectricTestRunner.Parameters
+    public static Collection<Object[]> data() {
+        final List<Object[]> data = new ArrayList<>();
+        data.add(new Object[]{new Config("Samsung", "heroqltevzw", "0")});
+        data.add(new Object[]{new Config("Samsung", "heroqltevzw", "1",
+                getExpectedSupportedCombinations())});
+        data.add(new Object[]{new Config("Samsung", "heroqltetmo", "0")});
+        data.add(new Object[]{new Config("Samsung", "heroqltetmo", "1",
+                getExpectedSupportedCombinations())});
+        data.add(new Object[]{new Config(null, null, "0")});
+        return data;
+    }
+
+    @NonNull
+    private final Config mConfig;
+
+    public ExtraSupportedSurfaceCombinationsContainerTest(@NonNull final Config config) {
+        mConfig = config;
+
+    }
+
+    @Test
+    public void checkExtraSupportedSurfaceCombinations() {
+        // Set up device properties
+        if (mConfig.mBrand != null) {
+            ReflectionHelpers.setStaticField(Build.class, "BRAND", mConfig.mBrand);
+            ReflectionHelpers.setStaticField(Build.class, "DEVICE", mConfig.mDevice);
+        }
+
+        // Initializes ExtraSupportedSurfaceCombinationsContainer instance with camera id
+        final ExtraSupportedSurfaceCombinationsContainer
+                extraSupportedSurfaceCombinationsContainer =
+                new ExtraSupportedSurfaceCombinationsContainer(mConfig.mCameraId);
+
+        // Gets the extra supported surface combinations on the device
+        List<SurfaceCombination> extraSurfaceCombinations =
+                extraSupportedSurfaceCombinationsContainer.get();
+
+        for (SurfaceCombination expectedSupportedSurfaceCombination :
+                mConfig.mExpectedSupportedSurfaceCombinations) {
+            boolean isSupported = false;
+
+            // Checks the combination is supported by the list retrieved from the
+            // ExtraSupportedSurfaceCombinationsContainer.
+            for (SurfaceCombination extraSurfaceCombination : extraSurfaceCombinations) {
+                if (extraSurfaceCombination.isSupported(
+                        expectedSupportedSurfaceCombination.getSurfaceConfigList())) {
+                    isSupported = true;
+                    break;
+                }
+            }
+
+            assertThat(isSupported).isTrue();
+        }
+    }
+
+    private static SurfaceCombination[] getExpectedSupportedCombinations() {
+        // (YUV, ANALYSIS) + (PRIV, PREVIEW) + (YUV, MAXIMUM)
+        SurfaceCombination surfaceCombination = new SurfaceCombination();
+        surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.YUV,
+                SurfaceConfig.ConfigSize.ANALYSIS));
+        surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.PRIV,
+                SurfaceConfig.ConfigSize.PREVIEW));
+        surfaceCombination.addSurfaceConfig(SurfaceConfig.create(SurfaceConfig.ConfigType.YUV,
+                SurfaceConfig.ConfigSize.MAXIMUM));
+        return new SurfaceCombination[]{surfaceCombination};
+    }
+
+    static class Config {
+        @Nullable
+        final String mBrand;
+        @Nullable
+        final String mDevice;
+        @NonNull
+        final String mCameraId;
+        @NonNull
+        final SurfaceCombination[] mExpectedSupportedSurfaceCombinations;
+
+        Config(@Nullable String brand, @Nullable String device, @NonNull String cameraId,
+                @NonNull SurfaceCombination... expectedSupportedSurfaceCombinations) {
+            mBrand = brand;
+            mDevice = device;
+            mCameraId = cameraId;
+            mExpectedSupportedSurfaceCombinations = expectedSupportedSurfaceCombinations;
+        }
+    }
+}
diff --git a/camera/camera-core/api/current.ignore b/camera/camera-core/api/current.ignore
new file mode 100644
index 0000000..9cff33a
--- /dev/null
+++ b/camera/camera-core/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraState():
+    Added method androidx.camera.core.CameraInfo.getCameraState()
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index 2388d77..0f9be5f 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -23,6 +23,7 @@
   }
 
   public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method public int getSensorRotationDegrees();
     method public int getSensorRotationDegrees(int);
     method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
@@ -46,6 +47,43 @@
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
 
+  @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
   public class CameraUnavailableException extends java.lang.Exception {
     ctor public CameraUnavailableException(int);
     ctor public CameraUnavailableException(int, String?);
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
index 32b510d..14a591c 100644
--- a/camera/camera-core/api/public_plus_experimental_current.txt
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -28,6 +28,8 @@
   }
 
   public interface CameraInfo {
+    method @androidx.camera.core.ExperimentalCameraFilter public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method @androidx.camera.core.ExperimentalExposureCompensation public androidx.camera.core.ExposureState getExposureState();
     method public int getSensorRotationDegrees();
     method public int getSensorRotationDegrees(int);
@@ -53,6 +55,43 @@
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
 
+  @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
   public class CameraUnavailableException extends java.lang.Exception {
     ctor public CameraUnavailableException(int);
     ctor public CameraUnavailableException(int, String?);
diff --git a/camera/camera-core/api/restricted_current.ignore b/camera/camera-core/api/restricted_current.ignore
new file mode 100644
index 0000000..9cff33a
--- /dev/null
+++ b/camera/camera-core/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.camera.core.CameraInfo#getCameraState():
+    Added method androidx.camera.core.CameraInfo.getCameraState()
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index 2388d77..0f9be5f 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -23,6 +23,7 @@
   }
 
   public interface CameraInfo {
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
     method public int getSensorRotationDegrees();
     method public int getSensorRotationDegrees(int);
     method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
@@ -46,6 +47,43 @@
     method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
   }
 
+  @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
   public class CameraUnavailableException extends java.lang.Exception {
     ctor public CameraUnavailableException(int);
     ctor public CameraUnavailableException(int, String?);
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index 4a8792b..2b4bf00 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -30,7 +30,7 @@
     api("androidx.annotation:annotation:1.0.0")
     api("androidx.lifecycle:lifecycle-livedata:2.1.0")
     api(GUAVA_LISTENABLE_FUTURE)
-    api("androidx.annotation:annotation-experimental:1.1.0-rc01")
+    api("androidx.annotation:annotation-experimental:1.1.0")
     api(KOTLIN_STDLIB) // Added for annotation-experimental
     implementation("androidx.exifinterface:exifinterface:1.0.0")
     implementation("androidx.core:core:1.1.0")
@@ -57,12 +57,12 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
+    androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
 }
 
diff --git a/camera/camera-core/lint-baseline.xml b/camera/camera-core/lint-baseline.xml
index 1df7dc7..ec7e4bf 100644
--- a/camera/camera-core/lint-baseline.xml
+++ b/camera/camera-core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -420,6 +420,28 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.core.VideoCapture is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mediaMuxer = new MediaMuxer(outputFileOptions.getFileDescriptor(),"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/core/VideoCapture.java"
+            line="1039"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.core.VideoCapture is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mediaMuxer = new MediaMuxer(mParcelFileDescriptor.getFileDescriptor(),"
+        errorLine2="                                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/core/VideoCapture.java"
+            line="1066"
+            column="34"/>
+    </issue>
+
+    <issue
         id="PrivateConstructorForUtilityClass"
         message="Utility class with non private constructor"
         errorLine1="    private static final class Speed {"
@@ -547,7 +569,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/core/impl/CaptureProcessor.java"
-            line="35"
+            line="37"
             column="26"/>
     </issue>
 
@@ -558,7 +580,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/core/impl/CaptureProcessor.java"
-            line="47"
+            line="50"
             column="18"/>
     </issue>
 
@@ -569,7 +591,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/camera/core/impl/CaptureProcessor.java"
-            line="54"
+            line="57"
             column="29"/>
     </issue>
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
index 960447f..c2c7f15 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
@@ -17,6 +17,11 @@
 package androidx.camera.core;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.camera.core.impl.CameraConfig;
+import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
+
+import com.google.auto.value.AutoValue;
 
 import java.util.List;
 
@@ -43,4 +48,47 @@
      */
     @NonNull
     List<CameraInfo> filter(@NonNull List<CameraInfo> cameraInfos);
+
+    /**
+     * Returns the id of this camera filter.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @NonNull
+    default Id getId() {
+        return Id.DEFAULT;
+    }
+
+    /**
+     * An identifier for a {@link CameraFilter}.
+     *
+     * <p>A camera filter can be associated with a set of camera configuration options. This
+     * means a camera filter's {@link Id} can be mapped to a unique {@link CameraConfig}. An
+     * example of this is extension modes, where a camera filter can represent an extension mode,
+     * and each extension mode adds a set of camera configurations to the camera that supports it
+     * . {@link ExtendedCameraConfigProviderStore#getConfig(Object)} allows retrieving the
+     * {@link CameraConfig} of an extension mode given the {@link CameraFilter.Id} of its camera
+     * filter.
+     *
+     * <p>The {@link Id} class allows anything to be wrapped as an {@link Id} instance. The
+     * caller should make the input value object unique when calling the {@link #create(Object)}
+     * function. So that the {@link Id} can be recognized and used for specific purposes.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @AutoValue
+    abstract class Id {
+
+        public static final Id DEFAULT = create(new Object());
+
+        @NonNull
+        public static Id create(@NonNull Object value) {
+            return new AutoValue_CameraFilter_Id(value);
+        }
+
+        @NonNull
+        public abstract Object getValue();
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
index 43378ac..5f2a563 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
@@ -157,10 +157,7 @@
      * respectively.
      *
      * @return A {@link LiveData} of the camera's state.
-     * @hide
      */
-    // TODO(b/150921286): Unhide once the camera state implementation is done
-    @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
     LiveData<CameraState> getCameraState();
 
@@ -178,6 +175,15 @@
     @ImplementationType
     String getImplementationType();
 
+    /**
+     * Returns a {@link CameraSelector} unique to this camera.
+     *
+     * @return {@link CameraSelector} unique to this camera.
+     */
+    @ExperimentalCameraFilter
+    @NonNull
+    CameraSelector getCameraSelector();
+
     /** @hide */
     @StringDef(open = true, value = {IMPLEMENTATION_TYPE_UNKNOWN,
             IMPLEMENTATION_TYPE_CAMERA2_LEGACY, IMPLEMENTATION_TYPE_CAMERA2,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
index 5e11df0..a8e42bd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
@@ -50,6 +50,11 @@
      * selected through
      * {@link androidx.camera.core.CameraXConfig.Builder#setAvailableCamerasLimiter(CameraSelector)}
      *
+     * <p>While iterating through all the available {@link CameraInfo}, if one of them meets some
+     * predefined requirements, a {@link CameraSelector} that uniquely identifies its camera
+     * can be retrieved using {@link CameraInfo#getCameraSelector()}, which can then be used to bind
+     * {@linkplain UseCase use cases} to that camera.
+     *
      * @return A list of {@link CameraInfo} instances for the available cameras.
      */
     @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
index 81239d4..e87b5a3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
@@ -21,7 +21,6 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
 
 import com.google.auto.value.AutoValue;
 
@@ -130,11 +129,7 @@
  * the camera state moves to the {@link Type#CLOSED} state.
  *
  * <p>Whenever the camera encounters an error, it reports it through {@link #getError()}.
- *
- * @hide
  */
-// TODO(b/150921286): Unhide once the camera state implementation is done
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @AutoValue
 public abstract class CameraState {
 
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 0ee2ec9..77cbe6f 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
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.res.Resources;
+import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Process;
@@ -39,12 +40,11 @@
 import androidx.camera.core.impl.CameraThreadConfig;
 import androidx.camera.core.impl.CameraValidator;
 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.camera.core.internal.compat.quirk.DeviceQuirks;
-import androidx.camera.core.internal.compat.quirk.IncompleteCameraListQuirk;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.os.HandlerCompat;
 import androidx.core.util.Preconditions;
@@ -396,7 +396,7 @@
         } else {
             // Try to retrieve the CameraXConfig.Provider through the application's resources
             try {
-                Resources resources = context.getApplicationContext().getResources();
+                Resources resources = ContextUtil.getApplicationContext(context).getResources();
                 String defaultProviderClassName =
                         resources.getString(
                                 R.string.androidx_camera_default_config_provider);
@@ -431,19 +431,31 @@
     @Nullable
     private static Application getApplicationFromContext(@NonNull Context context) {
         Application application = null;
-        Context appContext = context.getApplicationContext();
+        Context appContext = ContextUtil.getApplicationContext(context);
         while (appContext instanceof ContextWrapper) {
             if (appContext instanceof Application) {
                 application = (Application) appContext;
                 break;
             } else {
-                appContext = ((ContextWrapper) appContext).getBaseContext();
+                appContext = getBaseContext((ContextWrapper) appContext);
             }
         }
-
         return application;
     }
 
+    /**
+     * Gets the base context and preserves the attribution tag.
+     */
+    private static Context getBaseContext(ContextWrapper context) {
+        Context baseContext = context.getBaseContext();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            return baseContext.createAttributionContext(context.getAttributionTag());
+        } else {
+            return baseContext;
+        }
+    }
+
+
     @NonNull
     private static ListenableFuture<CameraX> getInstance() {
         synchronized (INSTANCE_LOCK) {
@@ -551,7 +563,7 @@
                 //  the context within the called method.
                 mAppContext = getApplicationFromContext(context);
                 if (mAppContext == null) {
-                    mAppContext = context.getApplicationContext();
+                    mAppContext = ContextUtil.getApplicationContext(context);
                 }
                 CameraFactory.Provider cameraFactoryProvider =
                         mCameraXConfig.getCameraFactoryProvider(null);
@@ -595,12 +607,9 @@
 
                 mCameraRepository.init(mCameraFactory);
 
-                // Only verify the devices might have the b/167201193
-                if (DeviceQuirks.get(IncompleteCameraListQuirk.class) != null) {
-                    // Please ensure only validate the camera at the last of the initialization.
-                    CameraValidator.validateCameras(mAppContext, mCameraRepository,
-                            availableCamerasLimiter);
-                }
+                // Please ensure only validate the camera at the last of the initialization.
+                CameraValidator.validateCameras(mAppContext, mCameraRepository,
+                        availableCamerasLimiter);
 
                 // Set completer to null if the init was successful.
                 setStateToInitialized();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
new file mode 100644
index 0000000..2007b49
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
@@ -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.camera.core.impl;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.camera.core.CameraInfo;
+
+/**
+ * Provides the ability to create a {@link CameraConfig} given a {@link CameraInfo}.
+ */
+public interface CameraConfigProvider {
+
+    CameraConfigProvider EMPTY = (cameraInfo, context) -> CameraConfigs.emptyConfig();
+
+    /**
+     * Returns a camera config according to the input camera info.
+     */
+    @NonNull
+    CameraConfig getConfig(@NonNull CameraInfo cameraInfo, @NonNull Context context);
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
index aba76ae..43c07d5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
@@ -19,7 +19,11 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfo;
+import androidx.camera.core.CameraSelector;
+import androidx.camera.core.ExperimentalCameraFilter;
+import androidx.core.util.Preconditions;
 
+import java.util.Collections;
 import java.util.concurrent.Executor;
 
 /**
@@ -70,4 +74,26 @@
     /** Returns the {@link CamcorderProfileProvider} associated with this camera. */
     @NonNull
     CamcorderProfileProvider getCamcorderProfileProvider();
+
+    /** {@inheritDoc} */
+    @ExperimentalCameraFilter
+    @NonNull
+    @Override
+    default CameraSelector getCameraSelector() {
+        return new CameraSelector.Builder()
+                .addCameraFilter(cameraInfos -> {
+                    final String cameraId = getCameraId();
+                    for (CameraInfo cameraInfo : cameraInfos) {
+                        Preconditions.checkArgument(cameraInfo instanceof CameraInfoInternal);
+                        final CameraInfoInternal cameraInfoInternal =
+                                (CameraInfoInternal) cameraInfo;
+                        if (cameraInfoInternal.getCameraId().equals(cameraId)) {
+                            return Collections.singletonList(cameraInfo);
+                        }
+                    }
+                    throw new IllegalStateException("Unable to find camera with id " + cameraId
+                            + " from list of available cameras.");
+                })
+                .build();
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
index 2eb7b46..b09f9dd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
@@ -26,7 +26,8 @@
 import androidx.camera.core.Logger;
 
 /**
- * Validation methods to verify the camera is initialized successfully.
+ * Validation methods to verify the camera is initialized successfully, more info please reference
+ * b/167201193.
  */
 public final class CameraValidator {
     private CameraValidator() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
new file mode 100644
index 0000000..81d48a3
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.core.impl;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Stores {@link CameraConfigProvider} instances which allow building {@link CameraConfig} using
+ * keys (extensions modes for example). The provided {@link CameraConfig}s are unique to the device.
+ */
+public final class ExtendedCameraConfigProviderStore {
+
+    private static final Object LOCK = new Object();
+
+    @GuardedBy("LOCK")
+    private static final Map<Object, CameraConfigProvider> CAMERA_CONFIG_PROVIDERS =
+            new HashMap<>();
+
+    private ExtendedCameraConfigProviderStore() {
+    }
+
+    /**
+     * Associates the specified {@link CameraConfigProvider} with the specified key and stores them.
+     */
+    public static void addConfig(@NonNull Object key, @NonNull CameraConfigProvider provider) {
+        synchronized (LOCK) {
+            CAMERA_CONFIG_PROVIDERS.put(key, provider);
+        }
+    }
+
+    /**
+     * Retrieves the {@link CameraConfigProvider} associated with the specified key.
+     *
+     * <p>A default {@link CameraConfigProvider#EMPTY} will be returned if there isn't a
+     * {@link CameraConfigProvider} associated with the key.
+     */
+    @NonNull
+    public static CameraConfigProvider getConfig(@NonNull Object key) {
+        final CameraConfigProvider provider;
+        synchronized (LOCK) {
+            provider = CAMERA_CONFIG_PROVIDERS.get(key);
+        }
+
+        if (provider == null) {
+            return CameraConfigProvider.EMPTY;
+        }
+        return provider;
+    }
+}
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
new file mode 100644
index 0000000..6964e31
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.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.camera.core.impl.utils;
+
+import android.content.Context;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Utility class for {@link Context} related operations.
+ */
+public final class ContextUtil {
+    /**
+     * Gets the application context and preserves the attribution tag.
+     */
+    @NonNull
+    public static Context getApplicationContext(@NonNull Context context) {
+        Context applicationContext = context.getApplicationContext();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            return applicationContext.createAttributionContext(context.getAttributionTag());
+        } else {
+            return applicationContext;
+        }
+    }
+
+    private ContextUtil() {
+    }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
index debf4f3..1dc5105 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
@@ -38,11 +38,6 @@
     static List<Quirk> loadQuirks() {
         final List<Quirk> quirks = new ArrayList<>();
 
-        // Load all device specific quirks
-        if (IncompleteCameraListQuirk.load()) {
-            quirks.add(new IncompleteCameraListQuirk());
-        }
-
         if (ImageCaptureRotationOptionQuirk.load()) {
             quirks.add(new ImageCaptureRotationOptionQuirk());
         }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/IncompleteCameraListQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/IncompleteCameraListQuirk.java
deleted file mode 100644
index 35779f17..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/IncompleteCameraListQuirk.java
+++ /dev/null
@@ -1,50 +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.camera.core.internal.compat.quirk;
-
-import android.os.Build;
-
-import androidx.camera.core.impl.Quirk;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * A quirk where querying the device for cameras will intermittently report an incomplete camera id
- * list.
- *
- * <p>For instance, if the list of cameras are queried while a Camera HAL has crashed, the HAL may
- * need to restart before the full list can be returned.
- */
-public class IncompleteCameraListQuirk implements Quirk {
-
-    /** The devices have b/167201193 occur */
-    private static final List<String> KNOWN_AFFECTED_DEVICES =
-            new ArrayList<>(Arrays.asList("a5y17lte", "tb-8704x", "a7y17lte", "on7xelte",
-                    "heroqltevzw", "1816", "1814", "1815", "santoni", "htc_oclul", "asus_z01h_1",
-                    "vox_alpha_plus", "a5y17ltecan", "x304l", "hero2qltevzw", "a5y17lteskt",
-                    "1801", "a5y17lteskt", "1801", "a5y17ltelgt", "herolte", "htc_hiau_ml_tuhl",
-                    "a6plte", "hwtrt-q", "co2_sprout", "h3223", "davinci", "vince", "armor_x5",
-                    "a2corelte", "j6lte", "walleye", "taimen", "blueline", "crosshatch", "bonito",
-                    "sargo", "coral", "flame", "sunfish", "bramble", "redfin"));
-
-    static boolean load() {
-        return KNOWN_AFFECTED_DEVICES.contains(Build.DEVICE.toLowerCase(Locale.getDefault()));
-    }
-}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInfoInternalTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInfoInternalTest.kt
new file mode 100644
index 0000000..7c083c9
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/CameraInfoInternalTest.kt
@@ -0,0 +1,55 @@
+/*
+ * 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.core.impl
+
+import android.os.Build
+import androidx.camera.testing.fakes.FakeCamera
+import androidx.camera.testing.fakes.FakeCameraInfoInternal
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+private const val CAMERA_ID = "2"
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+internal class CameraInfoInternalTest {
+
+    @Test
+    fun selector_findsMatchingCamera() {
+        val cameraInfo = FakeCameraInfoInternal(CAMERA_ID)
+        val cameras = createCamerasWithIds(arrayOf(1, CAMERA_ID.toInt(), 3, 4))
+        val filteredCameras = cameraInfo.cameraSelector.filter(LinkedHashSet(cameras))
+
+        assertThat(filteredCameras).hasSize(1)
+        assertThat(filteredCameras.first().cameraInfoInternal.cameraId).isEqualTo(CAMERA_ID)
+    }
+
+    @Test(expected = IllegalStateException::class)
+    fun selector_doesNotFindMatchingCamera() {
+        val cameraInfo = FakeCameraInfoInternal(CAMERA_ID)
+        val cameras = createCamerasWithIds(arrayOf(1, 3, 4))
+        cameraInfo.cameraSelector.filter(LinkedHashSet(cameras))
+    }
+
+    private fun createCamerasWithIds(ids: Array<Int>): List<CameraInternal> {
+        return ids.map { FakeCamera(it.toString()) }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt
new file mode 100644
index 0000000..571126b
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStoreTest.kt
@@ -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.camera.core.impl
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class ExtendedCameraConfigProviderStoreTest {
+
+    @Test
+    public fun canRetrieveStoredCameraConfigProvider() {
+        val id = Object()
+        val cameraConfigProvider =
+            CameraConfigProvider { _, _ -> CameraConfigs.emptyConfig() }
+
+        ExtendedCameraConfigProviderStore.addConfig(id, cameraConfigProvider)
+
+        assertThat(ExtendedCameraConfigProviderStore.getConfig(id)).isEqualTo(cameraConfigProvider)
+    }
+
+    @Test
+    public fun returnDefaultEmptyCameraConfigProvider_whenNoDataStored() {
+        assertThat(ExtendedCameraConfigProviderStore.getConfig(Object())).isEqualTo(
+            CameraConfigProvider.EMPTY
+        )
+    }
+}
diff --git a/camera/camera-extensions-stub/lint-baseline.xml b/camera/camera-extensions-stub/lint-baseline.xml
index da096d5..a79d08a 100644
--- a/camera/camera-extensions-stub/lint-baseline.xml
+++ b/camera/camera-extensions-stub/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -767,7 +767,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java"
-            line="42"
+            line="43"
             column="18"/>
     </issue>
 
@@ -789,7 +789,7 @@
         errorLine2="                ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="17"/>
     </issue>
 
@@ -800,7 +800,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="34"/>
     </issue>
 
@@ -811,7 +811,7 @@
         errorLine2="                                                                              ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="79"/>
     </issue>
 
@@ -822,7 +822,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="59"
+            line="61"
             column="5"/>
     </issue>
 
@@ -833,7 +833,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="70"
+            line="72"
             column="5"/>
     </issue>
 
@@ -844,7 +844,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="80"
+            line="82"
             column="5"/>
     </issue>
 
@@ -1526,7 +1526,7 @@
         errorLine2="                 ~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java"
-            line="39"
+            line="40"
             column="18"/>
     </issue>
 
@@ -1537,7 +1537,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java"
-            line="39"
+            line="40"
             column="31"/>
     </issue>
 
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
index 112eb3e..a364d4b 100755
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.NonNull;
@@ -91,4 +92,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         throw new RuntimeException("Stub, replace with implementation.");
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) {
+        throw new RuntimeException("Stub, replace with implementation.");
+    }
 }
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
index 79dbff6..d68d8eb 100755
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.NonNull;
@@ -91,4 +92,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         throw new RuntimeException("Stub, replace with implementation.");
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) {
+        throw new RuntimeException("Stub, replace with implementation.");
+    }
 }
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
index dc823c1..b943e0a 100644
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.NonNull;
@@ -91,4 +92,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         throw new RuntimeException("Stub, replace with implementation.");
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) {
+        throw new RuntimeException("Stub, replace with implementation.");
+    }
 }
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
index a277fba..66f4a50 100644
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.NonNull;
@@ -91,4 +92,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         throw new RuntimeException("Stub, replace with implementation.");
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) {
+        throw new RuntimeException("Stub, replace with implementation.");
+    }
 }
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
index b95c047..571c2e3 100644
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
@@ -19,6 +19,7 @@
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.Nullable;
@@ -80,4 +81,21 @@
      */
     @Nullable
     List<Pair<Integer, Size[]>> getSupportedResolutions();
+
+    /**
+     * Returns the estimated capture latency range in milliseconds for the target capture
+     * resolution.
+     *
+     * <p>This includes the time spent processing the multi-frame capture request along with any
+     * additional time for encoding of the processed buffer in the framework if necessary.
+     *
+     * @param captureOutputSize size of the capture output surface. If it is null or not in the
+     *                          supported output sizes, maximum capture output size is used for
+     *                          the estimation.
+     * @return the range of estimated minimal and maximal capture latency in milliseconds, or
+     * null if no capture latency info can be provided.
+     * @since 1.2
+     */
+    @Nullable
+    Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize);
 }
diff --git a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
index 8570fd3..3b39cf1 100755
--- a/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
+++ b/camera/camera-extensions-stub/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.NonNull;
@@ -91,4 +92,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         throw new RuntimeException("Stub, replace with implementation.");
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@NonNull Size captureOutputSize) {
+        throw new RuntimeException("Stub, replace with implementation.");
+    }
 }
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 1d55af9..9740be7 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -49,10 +49,11 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation(TRUTH)
+    androidTestImplementation(project(":camera:camera-lifecycle"))
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation(project(":camera:integration-tests:camera-testlib-extensions"))
diff --git a/camera/camera-extensions/lint-baseline.xml b/camera/camera-extensions/lint-baseline.xml
index d1ce9b4..f404e0f 100644
--- a/camera/camera-extensions/lint-baseline.xml
+++ b/camera/camera-extensions/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
index 1ebe218..e2ddb55 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
@@ -38,13 +38,10 @@
 import android.util.Size;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallback;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
 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;
@@ -55,8 +52,10 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
+import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.SurfaceTextureProvider;
+import androidx.camera.testing.fakes.FakeLifecycleOwner;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
@@ -99,7 +98,10 @@
     @CameraSelector.LensFacing
     private final int mLensFacing;
 
-    private CameraUseCaseAdapter mCamera;
+    private ProcessCameraProvider mProcessCameraProvider = null;
+    private FakeLifecycleOwner mFakeLifecycleOwner;
+    private CameraSelector mBaseCameraSelector;
+    private CameraSelector mExtensionsCameraSelector;
 
     public ExtensionTest(EffectMode effectMode, @CameraSelector.LensFacing int lensFacing) {
         mEffectMode = effectMode;
@@ -110,31 +112,40 @@
     @Before
     public void setUp() throws Exception {
         assumeTrue(CameraUtil.deviceHasCamera());
-
-        CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-        CameraX.initialize(mContext, cameraXConfig).get();
-
         assumeTrue(CameraUtil.hasCameraWithLensFacing(mLensFacing));
+
+        mProcessCameraProvider = ProcessCameraProvider.getInstance(mContext).get(10000,
+                TimeUnit.MILLISECONDS);
         assumeTrue(ExtensionsTestUtil.initExtensions(mContext));
         assumeTrue(isTargetDeviceAvailableForExtensions(mLensFacing));
-        CameraSelector cameraSelector =
-                new CameraSelector.Builder().requireLensFacing(mLensFacing).build();
-        mCamera = CameraUtil.createCameraUseCaseAdapter(mContext, cameraSelector);
+        mBaseCameraSelector = new CameraSelector.Builder().requireLensFacing(mLensFacing).build();
         Extensions extensions = ExtensionsManager.getExtensions(mContext);
-        assumeTrue(extensions.isExtensionAvailable(mCamera, mExtensionMode));
+        assumeTrue(extensions.isExtensionAvailable(mProcessCameraProvider, mBaseCameraSelector,
+                mExtensionMode));
+
+        mExtensionsCameraSelector = extensions.getExtensionCameraSelector(mBaseCameraSelector,
+                mExtensionMode);
+
+        mFakeLifecycleOwner = new FakeLifecycleOwner();
+        mFakeLifecycleOwner.startAndResume();
     }
 
     @After
     public void cleanUp() throws InterruptedException, ExecutionException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
-        ExtensionsManager.deinit().get();
+        if (mProcessCameraProvider != null) {
+            mProcessCameraProvider.shutdown().get(10000, TimeUnit.MILLISECONDS);
+            ExtensionsManager.deinit().get(10000, TimeUnit.MILLISECONDS);
+        }
     }
 
     @Test
-    public void testCanBindToLifeCycleAndTakePicture() {
+    public void testCanBindToLifeCycleAndTakePicture_ByExtenderAPI() {
         ImageCapture.OnImageCapturedCallback mockOnImageCapturedCallback = mock(
                 ImageCapture.OnImageCapturedCallback.class);
 
+        CameraUseCaseAdapter camera = CameraUtil.createCameraUseCaseAdapter(mContext,
+                mBaseCameraSelector);
+
         // To test bind/unbind and take picture.
         ImageCapture imageCapture = ExtensionsTestUtil.createImageCaptureWithEffect(mEffectMode,
                 mLensFacing);
@@ -161,7 +172,7 @@
                             }));
 
                     try {
-                        mCamera.addUseCases(Arrays.asList(preview, imageCapture));
+                        camera.addUseCases(Arrays.asList(preview, imageCapture));
                     } catch (CameraUseCaseAdapter.CameraException e) {
                         throw new IllegalArgumentException("Unable to bind preview and image "
                                 + "capture");
@@ -183,7 +194,7 @@
     }
 
     @Test
-    public void testEventCallbackInConfig() {
+    public void testEventCallbackInConfig_ByExtenderAPI() {
         // Verify Preview config should have related callback.
         PreviewConfig previewConfig = ExtensionsTestUtil.createPreviewConfigWithEffect(mEffectMode,
                 mLensFacing);
@@ -207,6 +218,83 @@
         assertThat(callback2.getAllItems().get(0)).isInstanceOf(CameraEventCallback.class);
     }
 
+    @Test
+    public void testCanBindToLifeCycleAndTakePicture() {
+        ImageCapture.OnImageCapturedCallback mockOnImageCapturedCallback = mock(
+                ImageCapture.OnImageCapturedCallback.class);
+
+        // To test bind/unbind and take picture.
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
+        Preview preview = new Preview.Builder().build();
+
+        mInstrumentation.runOnMainSync(
+                () -> {
+                    // To set the update listener and Preview will change to active state.
+                    preview.setSurfaceProvider(createSurfaceTextureProvider(
+                            new SurfaceTextureProvider.SurfaceTextureCallback() {
+                                @Override
+                                public void onSurfaceTextureReady(
+                                        @NonNull SurfaceTexture surfaceTexture,
+                                        @NonNull Size resolution) {
+                                    // No-op.
+                                }
+
+                                @Override
+                                public void onSafeToRelease(
+                                        @NonNull SurfaceTexture surfaceTexture) {
+                                    // No-op.
+                                }
+                            }));
+
+                    mProcessCameraProvider.bindToLifecycle(mFakeLifecycleOwner,
+                            mExtensionsCameraSelector, preview, imageCapture);
+
+                    imageCapture.takePicture(CameraXExecutors.mainThreadExecutor(),
+                            mockOnImageCapturedCallback);
+                });
+
+        // Verify the image captured.
+        ArgumentCaptor<ImageProxy> imageProxy = ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mockOnImageCapturedCallback, timeout(10000)).onCaptureSuccess(
+                imageProxy.capture());
+        assertNotNull(imageProxy.getValue());
+        imageProxy.getValue().close(); // Close the image after verification.
+
+        // Verify the take picture should not have any error happen.
+        verify(mockOnImageCapturedCallback, never()).onError(any(ImageCaptureException.class));
+    }
+
+    @Test
+    public void testEventCallbackInConfig() {
+        Preview preview = new Preview.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
+
+        mInstrumentation.runOnMainSync(
+                () -> mProcessCameraProvider.bindToLifecycle(mFakeLifecycleOwner,
+                        mExtensionsCameraSelector, preview, imageCapture));
+
+        // Verify Preview config should have related callback.
+        PreviewConfig previewConfig = (PreviewConfig) preview.getCurrentConfig();
+        assertNotNull(previewConfig.getUseCaseEventCallback());
+        CameraEventCallbacks callback1 = new Camera2ImplConfig(
+                previewConfig).getCameraEventCallback(
+                null);
+        assertNotNull(callback1);
+        assertEquals(callback1.getAllItems().size(), 1);
+        assertThat(callback1.getAllItems().get(0)).isInstanceOf(CameraEventCallback.class);
+
+        // Verify ImageCapture config should have related callback.
+        ImageCaptureConfig imageCaptureConfig =
+                (ImageCaptureConfig) imageCapture.getCurrentConfig();
+        assertNotNull(imageCaptureConfig.getUseCaseEventCallback());
+        assertNotNull(imageCaptureConfig.getCaptureBundle());
+        CameraEventCallbacks callback2 = new Camera2ImplConfig(
+                imageCaptureConfig).getCameraEventCallback(null);
+        assertNotNull(callback2);
+        assertEquals(callback2.getAllItems().size(), 1);
+        assertThat(callback2.getAllItems().get(0)).isInstanceOf(CameraEventCallback.class);
+    }
+
     /**
      * Returns whether the target camera device can support the test cases.
      *
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
index 0cd4b84..55ffa9f 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsErrorListenerTest.java
@@ -30,11 +30,8 @@
 import android.os.Build;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 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;
 import androidx.camera.core.UseCase;
@@ -45,7 +42,9 @@
 import androidx.camera.extensions.impl.ImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.PreviewExtenderImpl;
 import androidx.camera.extensions.util.ExtensionsTestUtil;
+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.MediumTest;
 import androidx.test.filters.SdkSuppress;
@@ -78,6 +77,8 @@
     @Rule
     public TestRule mUseCamera = CameraUtil.grantCameraPermissionAndPreTest();
 
+    private static final int TIMEOUT_MILLISECONDS = 10000;
+
     private final Context mContext = ApplicationProvider.getApplicationContext();
 
     Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
@@ -95,6 +96,9 @@
     @CameraSelector.LensFacing
     private int mLensFacing;
     private CountDownLatch mLatch;
+    private ProcessCameraProvider mProcessCameraProvider = null;
+    private FakeLifecycleOwner mFakeLifecycleOwner;
+    private CameraSelector mExtensionsCameraSelector;
     private CameraUseCaseAdapter mCamera;
 
     final AtomicReference<ExtensionsErrorCode> mErrorCode = new AtomicReference<>();
@@ -120,8 +124,8 @@
     public void setUp() throws InterruptedException, ExecutionException, TimeoutException {
         assumeTrue(CameraUtil.deviceHasCamera());
 
-        CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-        CameraX.initialize(mContext, cameraXConfig).get();
+        mProcessCameraProvider = ProcessCameraProvider.getInstance(mContext).get(
+                TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS);
 
         assumeTrue(CameraUtil.hasCameraWithLensFacing(mLensFacing));
         assumeTrue(ExtensionsTestUtil.initExtensions(mContext));
@@ -129,6 +133,11 @@
 
         mExtensions = ExtensionsManager.getExtensions(mContext);
         mLatch = new CountDownLatch(1);
+
+        mFakeLifecycleOwner = new FakeLifecycleOwner();
+        mFakeLifecycleOwner.startAndResume();
+        mExtensionsCameraSelector =
+                mExtensions.getExtensionCameraSelector(mCameraSelector, mExtensionMode);
     }
 
     @After
@@ -141,8 +150,10 @@
             );
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
-        ExtensionsManager.deinit().get();
+        if (mProcessCameraProvider != null) {
+            mProcessCameraProvider.shutdown().get(TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS);
+            ExtensionsManager.deinit().get(TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS);
+        }
     }
 
     @Test
@@ -280,10 +291,9 @@
 
         mErrorCode.set(null);
 
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector,
-                imageCapture);
-
-        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+        mInstrumentation.runOnMainSync(
+                () -> mProcessCameraProvider.bindToLifecycle(mFakeLifecycleOwner,
+                        mExtensionsCameraSelector, imageCapture));
 
         // Waits for one second to get error code.
         mLatch.await(1, TimeUnit.SECONDS);
@@ -298,9 +308,9 @@
 
         mErrorCode.set(null);
 
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, preview);
-
-        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+        mInstrumentation.runOnMainSync(
+                () -> mProcessCameraProvider.bindToLifecycle(mFakeLifecycleOwner,
+                        mExtensionsCameraSelector, preview));
 
         // Waits for one second to get error code.
         mLatch.await(1, TimeUnit.SECONDS);
@@ -318,10 +328,9 @@
         ImageCapture imageCapture = new ImageCapture.Builder().build();
         Preview preview = new Preview.Builder().build();
 
-        mCamera = CameraUtil.createCameraAndAttachUseCase(mContext, mCameraSelector, imageCapture,
-                preview);
-
-        mInstrumentation.runOnMainSync(() -> mExtensions.setExtension(mCamera, mExtensionMode));
+        mInstrumentation.runOnMainSync(
+                () -> mProcessCameraProvider.bindToLifecycle(mFakeLifecycleOwner,
+                        mExtensionsCameraSelector, preview, imageCapture));
 
         // Waits for one second to get error code.
         Thread.sleep(1000);
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsTest.kt
index 1b888f7..980c37c 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsTest.kt
@@ -17,17 +17,19 @@
 
 import android.content.Context
 import android.os.Build
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraSelector.LensFacing
-import androidx.camera.core.CameraX
 import androidx.camera.extensions.Extensions.ExtensionMode
 import androidx.camera.extensions.ExtensionsManager.EffectMode
 import androidx.camera.extensions.util.ExtensionsTestUtil
+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.MediumTest
 import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
@@ -40,36 +42,39 @@
 import java.util.concurrent.ExecutionException
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.TimeoutException
-import kotlin.jvm.Throws
 
 @MediumTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M)
 class ExtensionsTest(
-    @field:ExtensionMode @param:ExtensionMode private val mExtensionMode: Int,
-    @field:LensFacing @param:LensFacing private val mLensFacing: Int
+    @field:ExtensionMode @param:ExtensionMode private val extensionMode: Int,
+    @field:LensFacing @param:LensFacing private val lensFacing: Int
 ) {
-    private val mContext =
-        ApplicationProvider.getApplicationContext<Context>()
+    private val context = ApplicationProvider.getApplicationContext<Context>()
 
-    private val mEffectMode: EffectMode =
-        ExtensionsTestUtil.extensionModeToEffectMode(mExtensionMode)
+    private val instrumentation = InstrumentationRegistry.getInstrumentation()
 
-    private lateinit var mExtensions: Extensions
+    private val effectMode: EffectMode =
+        ExtensionsTestUtil.extensionModeToEffectMode(extensionMode)
+
+    private lateinit var extensions: Extensions
+    private lateinit var cameraProvider: ProcessCameraProvider
 
     @Before
     @Throws(Exception::class)
     fun setUp() {
         assumeTrue(CameraUtil.deviceHasCamera())
-        val cameraXConfig = Camera2Config.defaultConfig()
-        CameraX.initialize(mContext, cameraXConfig).get()
+
+        cameraProvider =
+            ProcessCameraProvider.getInstance(context).get(10000, TimeUnit.MILLISECONDS)
+
         assumeTrue(
             CameraUtil.hasCameraWithLensFacing(
-                mLensFacing
+                lensFacing
             )
         )
-        assumeTrue(ExtensionsTestUtil.initExtensions(mContext))
-        mExtensions = ExtensionsManager.getExtensions(mContext)
+        assumeTrue(ExtensionsTestUtil.initExtensions(context))
+        extensions = ExtensionsManager.getExtensions(context)
     }
 
     @After
@@ -79,8 +84,8 @@
         TimeoutException::class
     )
     fun cleanUp() {
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
-        ExtensionsManager.deinit().get()
+        cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+        ExtensionsManager.deinit().get(10000, TimeUnit.MILLISECONDS)
     }
 
     companion object {
@@ -93,37 +98,55 @@
     // TODO: Can be removed after the Extensions class is fully implemented.
     @Test
     fun isExtensionAvailable() {
-        val cameraSelector = CameraSelector.Builder().requireLensFacing(mLensFacing).build()
-        val camera = CameraUtil.createCameraUseCaseAdapter(mContext, cameraSelector)
+        val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
 
-        assertThat(
-            ExtensionsManager.isExtensionAvailable(mEffectMode, mLensFacing) ==
-                mExtensions.isExtensionAvailable(camera, mExtensionMode)
-        ).isTrue()
+        assertThat(ExtensionsManager.isExtensionAvailable(effectMode, lensFacing)).isEqualTo(
+            extensions.isExtensionAvailable(cameraProvider, cameraSelector, extensionMode)
+        )
     }
 
     @Test
     fun setExtensionSucceedsIfAvailable() {
-        val cameraSelector = CameraSelector.Builder().requireLensFacing(mLensFacing).build()
-        val camera = CameraUtil.createCameraUseCaseAdapter(mContext, cameraSelector)
+        val baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
 
-        assumeTrue(mExtensions.isExtensionAvailable(camera, mExtensionMode))
+        assumeTrue(
+            extensions.isExtensionAvailable(
+                cameraProvider,
+                baseCameraSelector,
+                extensionMode
+            )
+        )
 
-        mExtensions.setExtension(camera, mExtensionMode)
-        assertThat(mExtensions.getExtension(camera)).isEqualTo(mExtensionMode)
+        val extensionCameraSelector =
+            extensions.getExtensionCameraSelector(baseCameraSelector, extensionMode)
+
+        lateinit var camera: Camera
+        instrumentation.runOnMainSync {
+            camera = cameraProvider.bindToLifecycle(FakeLifecycleOwner(), extensionCameraSelector)
+        }
+
+        assertThat(extensions.getExtension(camera)).isEqualTo(extensionMode)
     }
 
     @Test
     fun setExtensionFailsIfNotAvailable() {
-        val cameraSelector = CameraSelector.Builder().requireLensFacing(mLensFacing).build()
-        val camera = CameraUtil.createCameraUseCaseAdapter(mContext, cameraSelector)
+        val baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
 
-        assumeFalse(mExtensions.isExtensionAvailable(camera, mExtensionMode))
+        assumeFalse(
+            extensions.isExtensionAvailable(
+                cameraProvider,
+                baseCameraSelector,
+                extensionMode
+            )
+        )
 
-        assertThrows<IllegalArgumentException> {
-            mExtensions.setExtension(camera, mExtensionMode)
+        val extensionCameraSelector =
+            extensions.getExtensionCameraSelector(baseCameraSelector, extensionMode)
+
+        instrumentation.runOnMainSync {
+            assertThrows<IllegalArgumentException> {
+                cameraProvider.bindToLifecycle(FakeLifecycleOwner(), extensionCameraSelector)
+            }
         }
-
-        assertThat(mExtensions.getExtension(camera)).isEqualTo(Extensions.EXTENSION_MODE_NONE)
     }
-}
\ No newline at end of file
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
index 06237ee..811b450 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
@@ -40,25 +40,59 @@
  */
 @OptIn(markerClass = ExperimentalCameraFilter.class)
 public final class ExtensionCameraFilter implements CameraFilter {
+    private final Id mId;
     private final PreviewExtenderImpl mPreviewExtenderImpl;
     private final ImageCaptureExtenderImpl mImageCaptureExtenderImpl;
 
+    // TODO(b/183075483): These three constructors will be removed after new Extensions APIs are
+    //  public and the old extender APIs are removed.
     ExtensionCameraFilter(@Nullable PreviewExtenderImpl previewExtenderImpl) {
+        mId = Id.DEFAULT;
         mPreviewExtenderImpl = previewExtenderImpl;
         mImageCaptureExtenderImpl = null;
     }
 
     ExtensionCameraFilter(@Nullable ImageCaptureExtenderImpl imageCaptureExtenderImpl) {
+        mId = Id.DEFAULT;
         mPreviewExtenderImpl = null;
         mImageCaptureExtenderImpl = imageCaptureExtenderImpl;
     }
 
     ExtensionCameraFilter(@Nullable PreviewExtenderImpl previewExtenderImpl,
             @Nullable ImageCaptureExtenderImpl imageCaptureExtenderImpl) {
+        mId = Id.DEFAULT;
         mPreviewExtenderImpl = previewExtenderImpl;
         mImageCaptureExtenderImpl = imageCaptureExtenderImpl;
     }
 
+    ExtensionCameraFilter(@NonNull String filterId,
+            @Nullable PreviewExtenderImpl previewExtenderImpl) {
+        mId = Id.create(filterId);
+        mPreviewExtenderImpl = previewExtenderImpl;
+        mImageCaptureExtenderImpl = null;
+    }
+
+    ExtensionCameraFilter(@NonNull String filterId,
+            @Nullable ImageCaptureExtenderImpl imageCaptureExtenderImpl) {
+        mId = Id.create(filterId);
+        mPreviewExtenderImpl = null;
+        mImageCaptureExtenderImpl = imageCaptureExtenderImpl;
+    }
+
+    ExtensionCameraFilter(@NonNull String filterId,
+            @Nullable PreviewExtenderImpl previewExtenderImpl,
+            @Nullable ImageCaptureExtenderImpl imageCaptureExtenderImpl) {
+        mId = Id.create(filterId);
+        mPreviewExtenderImpl = previewExtenderImpl;
+        mImageCaptureExtenderImpl = imageCaptureExtenderImpl;
+    }
+
+    @NonNull
+    @Override
+    public Id getId() {
+        return mId;
+    }
+
     @OptIn(markerClass = ExperimentalCamera2Interop.class)
     @NonNull
     @Override
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Extensions.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Extensions.java
index f70b0b3..e13bc80 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Extensions.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Extensions.java
@@ -24,12 +24,12 @@
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraFilter;
-import androidx.camera.core.CameraInfo;
+import androidx.camera.core.CameraProvider;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ExperimentalCameraFilter;
-import androidx.camera.core.UseCase;
+import androidx.camera.core.impl.CameraConfigProvider;
 import androidx.camera.core.impl.CameraFilters;
-import androidx.camera.core.internal.CameraUseCaseAdapter;
+import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
@@ -44,28 +44,25 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.LinkedHashSet;
-import java.util.List;
 
 /**
- * A class for querying and controlling the extensions that are enable for individual
- * {@link Camera} instances.
+ * A class for querying extensions related information.
  *
- * <p> The typical usages is to check whether or not a Camera and/or the {@link UseCase}
- * combinations support the extension by using {@link #isExtensionAvailable(Camera, int)} and
- * {@link #checkUseCases(Camera, List, int)}. Then after it has been determined that the
- * extension can be enable then a {@link #setExtension(Camera, int)} call can be used to set the
- * specified extension on the camera.
+ * <p>The typical usages include checking whether or not a camera exists that supports an extension
+ * by using {@link #isExtensionAvailable(CameraProvider, CameraSelector, int)}. Then after it has
+ * been determined that the extension can be enabled, a
+ * {@link #getExtensionCameraSelector(CameraSelector, int)} call can be used to get the
+ * specified {@link CameraSelector} to bind use cases and enable the extension mode on the camera.
  *
- * <p> When the Camera has been set to a particular extension it might require the camera to
- * restart which can cause the preview to temporarily stop. Once the extension has been enable
+ * <p>When the Camera has been set to a particular extension it might require the camera to
+ * restart which can cause the preview to momentarily stop. Once the extension has been enabled
  * for a Camera instance then it will stay in that extension mode until the extension has been
- * disabled. Setting extension modes is separate for each camera instance.
+ * disabled.
  *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class Extensions {
+public final class Extensions {
     private static final String TAG = "Extensions";
 
     /** Normal mode without any specific effect applied. */
@@ -93,14 +90,14 @@
      */
     public static final int EXTENSION_MODE_AUTO = 5;
 
-    private final Context mContext;
-
+    private static final String EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX = ":camera:camera"
+            + "-extensions-";
     /**
      * The different extension modes that a {@link Camera} can be configured for.
      *
-     * <p>Not all devices and camera support the different extension modes. To query whether or
+     * <p>Not all devices and cameras support the different extension modes. To query whether or
      * not a specific Camera supports an extension mode use
-     * {@link Extensions#isExtensionAvailable(Camera, int)}.
+     * {@link Extensions#isExtensionAvailable(CameraProvider, CameraSelector, int)}.
      *
      * @hide
      */
@@ -112,63 +109,52 @@
     }
 
     Extensions(@NonNull Context context) {
-        mContext = context;
     }
 
     /**
-     * Sets the specified extension mode for the Camera.
+     * Returns a {@link CameraSelector} for the specific extension mode.
      *
-     * To return to a non-extensions mode Camera set the extension mode as NONE.
-     * For full list of extensions see Extension Modes
-     *
-     * @param camera The camera that the UseCases are attached to
-     * @param mode   The extension mode to set. Setting this to EXTENSION_NONE will
-     *               remove the current extension and will always succeed.
-     * @throws IllegalArgumentException if the specified extension mode can not be set on the
-     *                                  Camera. This can happen if the extension is not supported
-     *                                  on this camera. This might also
-     *                                  because the combination of UseCases attached to the
-     *                                  Camera. Use {@link
-     *                                  #checkUseCases(Camera, List, int)} to verify that the
-     *                                  Camera can support the list of
-     *                                  UseCases for the extension.
+     * @param baseCameraSelector The base {@link CameraSelector} to be applied the extension
+     *                           related configuration on.
+     *                         {@link #isExtensionAvailable(CameraProvider, CameraSelector, int)}
+     *                          can be used to check whether any camera can support the specified
+     *                          extension mode for the base camera selector.
+     * @param mode The target extension mode.
+     * @return a {@link CameraSelector} for the specific Extensions mode.
+     * @throws IllegalArgumentException if the base {@link CameraSelector} has contained
+     * extension related configuration in it.
      */
     @OptIn(markerClass = ExperimentalCameraFilter.class)
-    public void setExtension(@NonNull Camera camera, @ExtensionMode int mode) {
-        if (!isExtensionAvailable(camera, mode)) {
-            throw new IllegalArgumentException("Extension mode not supported on camera: " + mode);
+    @NonNull
+    public CameraSelector getExtensionCameraSelector(@NonNull CameraSelector baseCameraSelector,
+            @ExtensionMode int mode) {
+        // Checks whether there has been Extensions related CameraConfig set in the base
+        // CameraSelector.
+        for (CameraFilter cameraFilter : baseCameraSelector.getCameraFilterSet()) {
+            if (cameraFilter instanceof ExtensionCameraFilter) {
+                throw new IllegalArgumentException(
+                        "An extension is already applied to the base CameraSelector.");
+            }
         }
 
-        CameraSelector cameraSelector =
-                new CameraSelector.Builder().addCameraFilter(getFilter(mode)).build();
-        Camera extensionCamera =
-                cameraSelector.select(new LinkedHashSet<>(camera.getCameraInternals()));
-        CameraInfo extensionsCameraInfo = extensionCamera.getCameraInfo();
+        // Injects CameraConfigProvider for the extension mode to the
+        // ExtendedCameraConfigProviderStore.
+        injectExtensionCameraConfig(mode);
 
-        ExtensionsUseCaseConfigFactory factory = new ExtensionsUseCaseConfigFactory(mode,
-                extensionsCameraInfo, mContext);
+        CameraSelector.Builder builder = CameraSelector.Builder.fromSelector(baseCameraSelector);
 
-        // Set the Camera
-        ExtensionsConfig extensionsConfig =
-                new ExtensionsConfig.Builder()
-                        .setExtensionMode(mode)
-                        .setCameraFilter(getFilter(mode))
-                        .setUseCaseConfigFactory(factory)
-                        .build();
+        // Adds the CameraFilter that determines which cameras can support the Extensions mode
+        // to the CameraSelector.
+        builder.addCameraFilter(getFilter(mode));
 
-        // Set the config on the camera
-        try {
-            camera.setExtendedConfig(extensionsConfig);
-        } catch (CameraUseCaseAdapter.CameraException e) {
-            throw new IllegalArgumentException("Camera unable to support the extension with the "
-                    + "attached UseCases. " + e);
-        }
+        return builder.build();
     }
 
     /**
      * Returns the extension mode that is currently set on the camera.
      */
-    public @ExtensionMode int getExtension(@NonNull Camera camera) {
+    @ExtensionMode
+    public int getExtension(@NonNull Camera camera) {
         Object extensionsConfigObject = camera.getExtendedConfig();
 
         if (extensionsConfigObject instanceof ExtensionsConfig) {
@@ -180,53 +166,55 @@
 
     /**
      * Returns true if the particular extension mode is available for the specified
-     * Camera.
+     * {@link CameraSelector}.
      *
-     * <p> This check is independent of the {@link UseCase} which are currently attached to the
-     * {@link Camera}. To check whether the Camera can support the attached UseCases use {@link
-     * #checkUseCases(Camera, List, int)}.
-     *
-     * @param camera The Camera to check if it supports the extension.
-     * @param mode   The extension mode to check
+     * @param cameraProvider The {@link CameraProvider} which will be used to bind use cases.
+     * @param baseCameraSelector The base {@link CameraSelector} to find a camera to use.
+     * @param mode The target extension mode to support.
      */
     @OptIn(markerClass = ExperimentalCameraFilter.class)
-    public boolean isExtensionAvailable(@NonNull Camera camera, @ExtensionMode int mode) {
-        CameraSelector cameraSelector =
-                new CameraSelector.Builder().addCameraFilter(getFilter(mode)).build();
-
-        // Extension is available for the camera if it contains a CameraInternal which supports
-        // the extension
+    public boolean isExtensionAvailable(
+            @NonNull CameraProvider cameraProvider,
+            @NonNull CameraSelector baseCameraSelector,
+            @ExtensionMode int mode) {
         try {
-            cameraSelector.select(new LinkedHashSet<>(camera.getCameraInternals()));
+            CameraSelector.Builder builder = CameraSelector.Builder.fromSelector(
+                    baseCameraSelector);
+            builder.addCameraFilter(getFilter(mode));
+
+            builder.build().filter(cameraProvider.getAvailableCameraInfos());
         } catch (IllegalArgumentException e) {
             return false;
         }
+
         return true;
     }
 
     @OptIn(markerClass = ExperimentalCameraFilter.class)
     private CameraFilter getFilter(@ExtensionMode int mode) {
         CameraFilter filter;
+        String id = getExtendedCameraConfigProviderId(mode);
+
         try {
             switch (mode) {
                 case EXTENSION_MODE_BOKEH:
-                    filter = new ExtensionCameraFilter(new BokehPreviewExtenderImpl(),
+                    filter = new ExtensionCameraFilter(id, new BokehPreviewExtenderImpl(),
                             new BokehImageCaptureExtenderImpl());
                     break;
                 case EXTENSION_MODE_HDR:
-                    filter = new ExtensionCameraFilter(new HdrPreviewExtenderImpl(),
+                    filter = new ExtensionCameraFilter(id, new HdrPreviewExtenderImpl(),
                             new HdrImageCaptureExtenderImpl());
                     break;
                 case EXTENSION_MODE_NIGHT:
-                    filter = new ExtensionCameraFilter(new NightPreviewExtenderImpl(),
+                    filter = new ExtensionCameraFilter(id, new NightPreviewExtenderImpl(),
                             new NightImageCaptureExtenderImpl());
                     break;
                 case EXTENSION_MODE_BEAUTY:
-                    filter = new ExtensionCameraFilter(new BeautyPreviewExtenderImpl(),
+                    filter = new ExtensionCameraFilter(id, new BeautyPreviewExtenderImpl(),
                             new BeautyImageCaptureExtenderImpl());
                     break;
                 case EXTENSION_MODE_AUTO:
-                    filter = new ExtensionCameraFilter(new AutoPreviewExtenderImpl(),
+                    filter = new ExtensionCameraFilter(id, new AutoPreviewExtenderImpl(),
                             new AutoImageCaptureExtenderImpl());
                     break;
                 case EXTENSION_MODE_NONE:
@@ -241,20 +229,49 @@
     }
 
     /**
-     * Checks if the list of UseCases attached to the Camera can support the
-     * extension.
-     *
-     * If the list of UseCases exceeds the capacity of Surfaces for the Camera then
-     * it returns a list of UseCase lists that can be removed in order to allow for
-     * the extension to be enabled. Any of the individual lists can be removed.
-     *
-     * @return null if the Camera supports the extension using the list of UseCases, otherwise a
-     * list of UseCase list to remove.
+     * Injects {@link CameraConfigProvider} for specific extension mode to the
+     * {@link ExtendedCameraConfigProviderStore}.
      */
-    @NonNull
-    public List<List<UseCase>> checkUseCases(@NonNull Camera camera,
-            @NonNull List<UseCase> useCases,
-            @ExtensionMode int mode) {
-        throw new UnsupportedOperationException("not yet implemented");
+    private void injectExtensionCameraConfig(@ExtensionMode int mode) {
+        CameraFilter.Id id = CameraFilter.Id.create(getExtendedCameraConfigProviderId(mode));
+
+        if (ExtendedCameraConfigProviderStore.getConfig(id) == CameraConfigProvider.EMPTY) {
+            ExtendedCameraConfigProviderStore.addConfig(id, (cameraInfo, context) -> {
+                ExtensionsUseCaseConfigFactory factory = new
+                        ExtensionsUseCaseConfigFactory(mode, cameraInfo, context);
+                return new ExtensionsConfig.Builder()
+                        .setExtensionMode(mode)
+                        .setUseCaseConfigFactory(factory)
+                        .build();
+            });
+        }
+    }
+
+    private String getExtendedCameraConfigProviderId(@ExtensionMode int mode) {
+        String id;
+
+        switch (mode) {
+            case EXTENSION_MODE_BOKEH:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_BOKEH";
+                break;
+            case EXTENSION_MODE_HDR:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_HDR";
+                break;
+            case EXTENSION_MODE_NIGHT:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_NIGHT";
+                break;
+            case EXTENSION_MODE_BEAUTY:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_BEAUTY";
+                break;
+            case EXTENSION_MODE_AUTO:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_AUTO";
+                break;
+            case EXTENSION_MODE_NONE:
+                id = EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX + "EXTENSION_MODE_NONE";
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid extension mode!");
+        }
+        return id;
     }
 }
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_current.txt b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
index cdd3299..58a2fdc 100644
--- a/camera/camera-lifecycle/api/public_plus_experimental_current.txt
+++ b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
@@ -9,7 +9,7 @@
 
   public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
     method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
-    method @MainThread @androidx.camera.lifecycle.ExperimentalUseCaseGroupLifecycle public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method @MainThread @androidx.camera.core.ExperimentalUseCaseGroup public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
     method @androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration public static void configureInstance(androidx.camera.core.CameraXConfig);
     method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
     method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 69a63fd..c6c7cea 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -43,8 +43,8 @@
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
-    androidTestImplementation(project(":annotation:annotation-experimental"))
-    androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
+    androidTestImplementation("androidx.annotation:annotation-experimental:1.1.0")
+    androidTestImplementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
 }
diff --git a/camera/camera-lifecycle/lint-baseline.xml b/camera/camera-lifecycle/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/camera/camera-lifecycle/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
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 ec2261c..7df9fcc 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
@@ -594,6 +594,10 @@
     override fun getResources(): Resources {
         return testResources
     }
+
+    override fun createAttributionContext(attributionTag: String?): Context {
+        return this
+    }
 }
 
 private class TestApplication(val pm: PackageManager) : Application(), CameraXConfig.Provider {
@@ -609,6 +613,10 @@
     override fun getPackageManager(): PackageManager {
         return pm
     }
+
+    override fun createAttributionContext(attributionTag: String?): Context {
+        return this
+    }
 }
 
 @Suppress("DEPRECATION")
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 9b2455d..5233c98 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
@@ -42,7 +42,11 @@
 import androidx.camera.core.UseCase;
 import androidx.camera.core.UseCaseGroup;
 import androidx.camera.core.ViewPort;
+import androidx.camera.core.impl.CameraConfig;
+import androidx.camera.core.impl.CameraConfigs;
 import androidx.camera.core.impl.CameraInternal;
+import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
+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.Futures;
@@ -83,6 +87,7 @@
     private final LifecycleCameraRepository
             mLifecycleCameraRepository = new LifecycleCameraRepository();
     private CameraX mCameraX;
+    private Context mContext;
 
     /**
      * Retrieves the {@link ProcessCameraProvider} associated with the current process.
@@ -152,6 +157,7 @@
         Preconditions.checkNotNull(context);
         return Futures.transform(CameraX.getOrCreateInstance(context), cameraX ->  {
             sAppInstance.setCameraX(cameraX);
+            sAppInstance.setContext(ContextUtil.getApplicationContext(context));
             return sAppInstance;
         }, CameraXExecutors.directExecutor());
     }
@@ -213,6 +219,10 @@
         mCameraX = cameraX;
     }
 
+    private void setContext(Context context) {
+        mContext = context;
+    }
+
     /**
      * Binds the collection of {@link UseCase} to a {@link LifecycleOwner}.
      *
@@ -292,11 +302,10 @@
      * the {@link UseCaseGroup} in the latest
      * {@link #bindToLifecycle(LifecycleOwner, CameraSelector, UseCaseGroup)} call.
      */
-    @ExperimentalUseCaseGroupLifecycle
+    @ExperimentalUseCaseGroup
     @SuppressWarnings({"lambdaLast", "deprecation"})
     @MainThread
     @NonNull
-    @OptIn(markerClass = ExperimentalUseCaseGroup.class)
     public Camera bindToLifecycle(@NonNull LifecycleOwner lifecycleOwner,
             @NonNull CameraSelector cameraSelector,
             @NonNull UseCaseGroup useCaseGroup) {
@@ -422,6 +431,33 @@
                                     mCameraX.getDefaultConfigFactory()));
         }
 
+        CameraConfig cameraConfig = CameraConfigs.emptyConfig();
+
+        // Retrieves extended camera configs from ExtendedCameraConfigProviderStore
+        for (CameraFilter cameraFilter : cameraSelector.getCameraFilterSet()) {
+            if (cameraFilter.getId() != CameraFilter.Id.DEFAULT) {
+                CameraConfig extendedCameraConfig = ExtendedCameraConfigProviderStore.getConfig(
+                        cameraFilter.getId()).getConfig(lifecycleCameraToBind.getCameraInfo(),
+                        mContext);
+
+                // Only allows one camera config now.
+                if (extendedCameraConfig != CameraConfigs.emptyConfig()
+                        && cameraConfig != CameraConfigs.emptyConfig()) {
+                    throw new IllegalArgumentException(
+                            "Cannot apply multiple extended camera configs at the same time.");
+                } else {
+                    cameraConfig = extendedCameraConfig;
+                }
+            }
+        }
+
+        // Applies extended camera configs to the camera
+        try {
+            lifecycleCameraToBind.setExtendedConfig(cameraConfig);
+        } catch (CameraUseCaseAdapter.CameraException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+
         if (useCases.length == 0) {
             return lifecycleCameraToBind;
         }
diff --git a/camera/camera-testing/lint-baseline.xml b/camera/camera-testing/lint-baseline.xml
index c65d0d8..344fc4a 100644
--- a/camera/camera-testing/lint-baseline.xml
+++ b/camera/camera-testing/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.camera.testing.compat.LooperCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.testing.compat.LooperCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return looper.getQueue();"
         errorLine2="                          ~~~~~~~~">
         <location
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
index d1b6cb9e..876b212 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
@@ -25,6 +25,7 @@
 import android.os.RemoteException;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.camera.core.Logger;
 import androidx.camera.testing.activity.ForegroundTestActivity;
 import androidx.test.espresso.Espresso;
@@ -186,4 +187,42 @@
             super(message);
         }
     }
+
+    /**
+     * Launch activity and return the activity instance for testing.
+     *
+     * @param instrumentation The instrumentation used to run the test
+     * @param activityClass   The activity under test. This must be a class in the instrumentation
+     *                        targetPackage specified in the AndroidManifest.xml
+     * @param startIntent     The Intent that will be used to start the Activity under test. If
+     *                        {@code startIntent} is null, a default launch Intent for the
+     *                        {@code activityClass} is used.
+     * @param <T>             The Activity class under test
+     * @return Returns the reference to the activity for test.
+     */
+    @Nullable
+    public static <T extends Activity> T launchActivity(@NonNull Instrumentation instrumentation,
+            @NonNull Class<T> activityClass, @Nullable Intent startIntent) {
+        Context context = instrumentation.getTargetContext();
+
+        // inject custom intent, if provided
+        if (null == startIntent) {
+            startIntent = new Intent(Intent.ACTION_MAIN);
+        }
+
+        // Set target component if not set Intent
+        if (null == startIntent.getComponent()) {
+            startIntent.setClassName(context.getPackageName(), activityClass.getName());
+        }
+
+        // Set launch flags where if not set Intent
+        if (0 /* No flags set */ == startIntent.getFlags()) {
+            startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+
+        T activityRef = activityClass.cast(instrumentation.startActivitySync(startIntent));
+        instrumentation.waitForIdleSync();
+
+        return activityRef;
+    }
 }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt b/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt
new file mode 100644
index 0000000..4645b33
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt
@@ -0,0 +1,73 @@
+/*
+ * 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.util.Log
+import org.junit.Assume.assumeTrue
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * A [TestRule] which can be used to limit the test only run on CameraX lab environment. It
+ * throws the AssumptionViolatedException to ignore the test if the test environment is not in the
+ * lab. Useful for the tests not needed to run on the PostSubmit.
+ *
+ * To use this [TestRule] do the following. <br></br><br></br>
+ *
+ * Add the Rule to your JUnit test. <br></br><br></br>
+ * `LabTestRule mLabTestRule = new LabTestRule();
+` *
+ * <br></br><br></br>
+ *
+ * Add the [LabTestOnly] annotation to your test case. <br></br><br></br>
+ * `public void yourTestCase() {
+ *
+ * }
+` *
+ * <br></br><br></br>
+ */
+class LabTestRule : TestRule {
+
+    /**
+     * The annotation for tests that only want to run on the CameraX lab environment
+     */
+    @Target(AnnotationTarget.FUNCTION)
+    @Retention(AnnotationRetention.RUNTIME)
+    annotation class LabTestOnly()
+
+    class LabTestStatement(private val statement: Statement) :
+        Statement() {
+
+        @Throws(Throwable::class)
+        override fun evaluate() {
+            // Only test in CameraX lab environment and throw AssumptionViolatedException if not
+            // in the lab environment. The loggable tag will be set when running the CameraX
+            // daily testing.
+            assumeTrue(Log.isLoggable("MH", Log.DEBUG))
+            statement.evaluate()
+        }
+    }
+
+    override fun apply(base: Statement, description: Description): Statement {
+        return if (description.getAnnotation(LabTestOnly::class.java) != null) {
+            LabTestStatement(base)
+        } else {
+            base
+        }
+    }
+}
diff --git a/camera/camera-video/build.gradle b/camera/camera-video/build.gradle
index d2d4178..4527837 100644
--- a/camera/camera-video/build.gradle
+++ b/camera/camera-video/build.gradle
@@ -53,8 +53,8 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":camera:camera-testing"))
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
diff --git a/camera/camera-video/lint-baseline.xml b/camera/camera-video/lint-baseline.xml
index 8f1aa4b..f288d94 100644
--- a/camera/camera-video/lint-baseline.xml
+++ b/camera/camera-video/lint-baseline.xml
@@ -1,4 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.video.internal.AudioSource is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (mAudioRecord.getTimestamp(audioTimestamp, AudioTimestamp.TIMEBASE_MONOTONIC)"
+        errorLine2="                             ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/video/internal/AudioSource.java"
+            line="269"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.video.internal.encoder.EncoderImpl.SurfaceInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mSurface = MediaCodec.createPersistentInputSurface();"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java"
+            line="1087"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.camera.video.internal.encoder.EncoderImpl.SurfaceInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mMediaCodec.setInputSurface(mSurface);"
+        errorLine2="                                ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java"
+            line="1092"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.video.VideoCaptureLegacy is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mediaMuxer = new MediaMuxer(outputFileOptions.getFileDescriptor(),"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/video/VideoCaptureLegacy.java"
+            line="1044"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.video.VideoCaptureLegacy is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mediaMuxer = new MediaMuxer(mParcelFileDescriptor.getFileDescriptor(),"
+        errorLine2="                                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/video/VideoCaptureLegacy.java"
+            line="1071"
+            column="34"/>
+    </issue>
 
 </issues>
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index 694c4b8..f773e6c 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -34,6 +34,10 @@
 @RunWith(AndroidJUnit4::class)
 class OutputOptionsTest {
 
+    companion object {
+        private const val FILE_SIZE_LIMIT = 1024
+    }
+
     @Test
     fun canBuildFileOutputOptions() {
         val savedFile = File.createTempFile("CameraX", ".tmp")
@@ -41,13 +45,13 @@
 
         val fileOutputOptions = FileOutputOptions.builder()
             .setFile(savedFile)
-            .setFileSizeLimit(0)
+            .setFileSizeLimit(FILE_SIZE_LIMIT)
             .build()
 
         assertThat(fileOutputOptions).isNotNull()
         assertThat(fileOutputOptions.type).isEqualTo(OutputOptions.Type.FILE)
         assertThat(fileOutputOptions.file).isNotNull()
-        assertThat(fileOutputOptions.fileSizeLimit).isEqualTo(0)
+        assertThat(fileOutputOptions.fileSizeLimit).isEqualTo(FILE_SIZE_LIMIT)
         savedFile.delete()
     }
 
@@ -71,13 +75,13 @@
 
         val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
             .setContentResolver(contentResolver)
-            .setFileSizeLimit(0)
+            .setFileSizeLimit(FILE_SIZE_LIMIT)
             .setUri(uri!!)
             .build()
 
         assertThat(mediaStoreOutputOptions.uri).isNotNull()
         assertThat(mediaStoreOutputOptions.type).isEqualTo(OutputOptions.Type.MEDIA_STORE)
-        assertThat(mediaStoreOutputOptions.fileSizeLimit).isEqualTo(0)
+        assertThat(mediaStoreOutputOptions.fileSizeLimit).isEqualTo(FILE_SIZE_LIMIT)
         contentResolver.delete(uri, null, null)
     }
 
@@ -91,15 +95,68 @@
         )
         val fd: FileDescriptor = pfd.fileDescriptor
 
-        val fileOutputOptions = FileDescriptorOutputOptions.builder()
+        val fdOutputOptions = FileDescriptorOutputOptions.builder()
             .setFileDescriptor(fd)
-            .setFileSizeLimit(0)
+            .setFileSizeLimit(FILE_SIZE_LIMIT)
             .build()
 
-        assertThat(fileOutputOptions).isNotNull()
-        assertThat(fileOutputOptions.type).isEqualTo(OutputOptions.Type.FILE_DESCRIPTOR)
-        assertThat(fileOutputOptions.fileDescriptor).isNotNull()
-        assertThat(fileOutputOptions.fileSizeLimit).isEqualTo(0)
+        assertThat(fdOutputOptions).isNotNull()
+        assertThat(fdOutputOptions.type).isEqualTo(OutputOptions.Type.FILE_DESCRIPTOR)
+        assertThat(fdOutputOptions.fileDescriptor).isNotNull()
+        assertThat(fdOutputOptions.fileSizeLimit).isEqualTo(FILE_SIZE_LIMIT)
+        pfd.close()
+        savedFile.delete()
+    }
+
+    @Test
+    fun file_builderContainsCorrectDefaults() {
+        val savedFile = File.createTempFile("CameraX", ".tmp")
+        savedFile.deleteOnExit()
+        val fileOutputOptions = FileOutputOptions.builder()
+            .setFile(savedFile)
+            .build()
+
+        assertThat(fileOutputOptions.fileSizeLimit).isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
+        savedFile.delete()
+    }
+
+    @Test
+    fun mediaStore_builderContainsCorrectDefaults() {
+        val context: Context = ApplicationProvider.getApplicationContext()
+        val contentResolver: ContentResolver = context.contentResolver
+        val fileName = "OutputOptionTest"
+        val contentValues = ContentValues().apply {
+            put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
+            put(MediaStore.Video.Media.TITLE, fileName)
+            put(MediaStore.Video.Media.DISPLAY_NAME, fileName)
+        }
+        val uri = contentResolver.insert(
+            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
+            contentValues
+        )
+        val mediaStoreOutputOptions = MediaStoreOutputOptions.builder()
+            .setContentResolver(contentResolver)
+            .setUri(uri!!)
+            .build()
+
+        assertThat(mediaStoreOutputOptions.fileSizeLimit)
+            .isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
+        contentResolver.delete(uri, null, null)
+    }
+
+    @Test
+    fun fileDescriptor_builderContainsCorrectDefaults() {
+        val savedFile = File.createTempFile("CameraX", ".tmp")
+        val pfd: ParcelFileDescriptor = ParcelFileDescriptor.open(
+            savedFile,
+            ParcelFileDescriptor.MODE_READ_WRITE
+        )
+        val fd: FileDescriptor = pfd.fileDescriptor
+        val fdOutputOptions = FileDescriptorOutputOptions.builder()
+            .setFileDescriptor(fd)
+            .build()
+
+        assertThat(fdOutputOptions.fileSizeLimit).isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
         pfd.close()
         savedFile.delete()
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
index 99663f9..1dace0c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
@@ -38,7 +38,8 @@
     /** Returns a builder for this FileDescriptorOutputOptions. */
     @NonNull
     public static Builder builder() {
-        return new AutoValue_FileDescriptorOutputOptions.Builder();
+        return new AutoValue_FileDescriptorOutputOptions.Builder()
+                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
     }
 
     /**
@@ -62,7 +63,12 @@
         public abstract Builder setFileDescriptor(
                 @NonNull FileDescriptor fileDescriptor);
 
-        /** Sets the limit for the file length in bytes. */
+        /**
+         * Sets the limit for the file length in bytes. Zero or negative values are considered
+         * unlimited.
+         *
+         * <p>If not set, defaults to {@link #FILE_SIZE_UNLIMITED}.
+         */
         @NonNull
         public abstract Builder setFileSizeLimit(int bytes);
 
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
index 5c208ba..5e7f313 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
@@ -37,7 +37,8 @@
     /** Returns a builder for this FileOutputOptions. */
     @NonNull
     public static Builder builder() {
-        return new AutoValue_FileOutputOptions.Builder();
+        return new AutoValue_FileOutputOptions.Builder()
+                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
     }
 
     /**
@@ -60,7 +61,12 @@
         @NonNull
         public abstract Builder setFile(@NonNull File file);
 
-        /** Sets the limit for the file length in bytes. */
+        /**
+         * Sets the limit for the file length in bytes. Zero or negative values are considered
+         * unlimited.
+         *
+         * <p>If not set, defaults to {@link #FILE_SIZE_UNLIMITED}.
+         */
         @NonNull
         public abstract Builder setFileSizeLimit(int bytes);
 
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
index fb08bdb..6be768d0 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
@@ -41,7 +41,8 @@
     /** Returns a builder for this MediaStoreOutputOptions. */
     @NonNull
     public static Builder builder() {
-        return new AutoValue_MediaStoreOutputOptions.Builder();
+        return new AutoValue_MediaStoreOutputOptions.Builder()
+                .setFileSizeLimit(FILE_SIZE_UNLIMITED);
     }
 
     /**
@@ -74,7 +75,12 @@
         @NonNull
         public abstract Builder setUri(@NonNull Uri uri);
 
-        /** Sets the limit for the file length in bytes. */
+        /**
+         * Sets the limit for the file length in bytes. Zero or negative values are considered
+         * unlimited.
+         *
+         * <p>If not set, defaults to {@link #FILE_SIZE_UNLIMITED}.
+         */
         @NonNull
         public abstract Builder setFileSizeLimit(int bytes);
 
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
index 62e3dee..f94eb96 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
@@ -23,6 +23,8 @@
  */
 public abstract class OutputOptions {
 
+    public static final int FILE_SIZE_UNLIMITED = 0;
+
     Type mType;
 
     public OutputOptions(@NonNull Type type) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
new file mode 100644
index 0000000..3864c8d
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.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.camera.video;
+
+import androidx.annotation.NonNull;
+import androidx.core.util.Preconditions;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * RecordingStats keeps track of the current recording’s statistics. It is a snapshot of things
+ * like recorded duration and recorded file size.
+ */
+@AutoValue
+public abstract class RecordingStats {
+
+    @NonNull
+    static RecordingStats of(long duration, long bytes) {
+        Preconditions.checkArgument(duration >= 0, "duration must be positive value.");
+        Preconditions.checkArgument(bytes >= 0, "bytes must be positive value.");
+        return new AutoValue_RecordingStats(duration, bytes);
+    }
+
+    /** Returns current recorded duration in nano seconds. */
+    public abstract long getRecordedDurationNs();
+
+    /** Returns current recorded bytes. */
+    public abstract long getNumBytesRecorded();
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index 900c7f8..fb8b43a 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -53,7 +53,9 @@
 import androidx.camera.core.Logger;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.UseCase;
+import androidx.camera.core.ViewPort;
 import androidx.camera.core.impl.CameraInfoInternal;
+import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.CaptureConfig;
 import androidx.camera.core.impl.Config;
 import androidx.camera.core.impl.ConfigProvider;
@@ -110,6 +112,10 @@
 
     private DeferrableSurface mDeferrableSurface;
     private SurfaceRequest mSurfaceRequest;
+    // The attached surface size. Same as getAttachedSurfaceResolution() but is available during
+    // createPipeline().
+    @Nullable
+    private Size mSurfaceSize;
 
     /**
      * Create a VideoCapture builder with a {@link VideoOutput}.
@@ -141,15 +147,38 @@
     }
 
     /**
+     * Returns the desired rotation of the output video.
+     *
+     * <p>The rotation can be set by calling {@link VideoCapture#setTargetRotation(int)}. If not
+     * set, the target rotation defaults to the value of {@link Display#getRotation()} of the
+     * default display at the time the use case is created. The use case is fully created once it
+     * has been attached to a camera.
+     *
+     * @return The rotation of the intended target.
+     */
+    @RotationValue
+    public int getTargetRotation() {
+        return getTargetRotationInternal();
+    }
+
+    /**
      * Sets the desired rotation of the output video.
      *
-     * <p>In most cases this should be set to the current rotation returned by {@link
-     * Display#getRotation()}.
+     * <p>This is one of four valid values: {@link Surface#ROTATION_0},
+     * {@link Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
+     * Rotation values are relative to the "natural" rotation, {@link Surface#ROTATION_0}.
+     *
+     * <p>If not set, the target rotation will default to the value of
+     * {@link Display#getRotation()} of the default display at the time the use case is
+     * created. The use case is fully created once it has been attached to a camera.
      *
      * @param rotation Desired rotation of the output video.
      */
+    @OptIn(markerClass = ExperimentalUseCaseGroup.class)
     public void setTargetRotation(@RotationValue int rotation) {
-        setTargetRotationInternal(rotation);
+        if (setTargetRotationInternal(rotation)) {
+            sendTransformationInfoIfReady();
+        }
     }
 
     @Override
@@ -168,6 +197,7 @@
     @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
     protected Size onSuggestedResolutionUpdated(@NonNull Size suggestedResolution) {
+        mSurfaceSize = suggestedResolution;
         String cameraId = getCameraId();
         VideoCaptureConfig<T> config = (VideoCaptureConfig<T>) getCurrentConfig();
 
@@ -187,7 +217,7 @@
     @Override
     public void onDetached() {
         clearPipeline();
-
+        mSurfaceSize = null;
         getOutput().getStreamState().removeObserver(mStreamStateObserver);
     }
 
@@ -245,6 +275,34 @@
         return Builder.fromConfig(config);
     }
 
+    @ExperimentalUseCaseGroup
+    private void sendTransformationInfoIfReady() {
+        CameraInternal cameraInternal = getCamera();
+        SurfaceRequest surfaceRequest = mSurfaceRequest;
+        Rect cropRect = getCropRect(mSurfaceSize);
+        if (cameraInternal != null && surfaceRequest != null && cropRect != null) {
+            surfaceRequest.updateTransformationInfo(SurfaceRequest.TransformationInfo.of(cropRect,
+                    getRelativeRotation(cameraInternal), getTargetRotationInternal()));
+        }
+    }
+
+    /**
+     * Gets the crop rect for {@link VideoCapture}.
+     *
+     * <p>Fall back to the full {@link Surface} rect if {@link ViewPort} crop rect is not
+     * available. Returns null if no valid crop rect. This could happen if the
+     * {@link VideoCapture} is not attached to a camera.
+     */
+    @Nullable
+    private Rect getCropRect(@Nullable Size surfaceResolution) {
+        if (getViewPortCropRect() != null) {
+            return getViewPortCropRect();
+        } else if (surfaceResolution != null) {
+            return new Rect(0, 0, surfaceResolution.getWidth(), surfaceResolution.getHeight());
+        }
+        return null;
+    }
+
     @UiThread
     @OptIn(markerClass = ExperimentalUseCaseGroup.class)
     @NonNull
@@ -255,10 +313,7 @@
 
         mSurfaceRequest = new SurfaceRequest(resolution, getCamera(), false);
         config.getVideoOutput().onSurfaceRequested(mSurfaceRequest);
-        Rect cropRect = getViewPortCropRect() != null ? getViewPortCropRect() : new Rect(0, 0,
-                resolution.getWidth(), resolution.getHeight());
-        mSurfaceRequest.updateTransformationInfo(SurfaceRequest.TransformationInfo.of(cropRect,
-                getRelativeRotation(getCamera()), getTargetRotationInternal()));
+        sendTransformationInfoIfReady();
         mDeferrableSurface = mSurfaceRequest.getDeferrableSurface();
 
         SessionConfig.Builder sessionConfigBuilder = SessionConfig.Builder.createFrom(config);
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
index 36a6cbd..75b071b 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
@@ -20,6 +20,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.core.util.Preconditions;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -27,8 +28,8 @@
 /**
  * VideoRecordEvent is used to report the video recording events and status.
  *
- * <p>There are {@link Start}, {@link Stop} and {@link Status} events. The {@link #getEventType()}
- * can be used to check what type of event is.
+ * <p>There are {@link Start}, {@link Finalize}, {@link Status}, {@link Pause} and {@link Resume}
+ * events. The {@link #getEventType()} can be used to check what type of event is.
  *
  * Example: typical way to determine the event type and cast to the event class
  *
@@ -39,27 +40,33 @@
  * case START:
  *     VideoRecordEvent.Start start = (VideoRecordEvent.Start) videoRecordEvent;
  *     break;
- * case STOP:
- *     VideoRecordEvent.Stop stop = (VideoRecordEvent.Stop) videoRecordEvent;
+ * case FINALIZE:
+ *     VideoRecordEvent.Finalize finalize = (VideoRecordEvent.Finalize) videoRecordEvent;
  *     break;
  * case STATUS:
  *     VideoRecordEvent.Status status = (VideoRecordEvent.Status) videoRecordEvent;
  *     break;
+ * case PAUSE:
+ *     VideoRecordEvent.Pause pause = (VideoRecordEvent.Pause) videoRecordEvent;
+ *     break;
+ * case RESUME:
+ *     VideoRecordEvent.Resume resume = (VideoRecordEvent.Resume) videoRecordEvent;
+ *     break;
  * }
  *
  * }</pre>
  *
  * <p>When a video recording is requested, {@link Start} event will be reported at first and
- * {@link Stop} event will be reported when the recording is finished. The stop reason can be
- * obtained via {@link Stop#getError()}. {@link #ERROR_NONE} means that the video was recorded
+ * {@link Finalize} event will be reported when the recording is finished. The stop reason can be
+ * obtained via {@link Finalize#getError()}. {@link #ERROR_NONE} means that the video was recorded
  * successfully, and other error code indicate the recording is failed or stopped due to a certain
  * reason. Please note that a failed result does not mean that the video file has not been
  * generated. In some cases, the file can still be successfully generated. For example,
  * the result {@link #ERROR_INSUFFICIENT_DISK} will still have video file.
  *
  * <p>The {@link Status} event will be triggered continuously during the recording process,
- * {@link Status#getNumBytesRecorded()} can be used to get the total record size when reporting
- * status. And {@link Status#getRecordedDurationNs()} can be used to get the total duration.
+ * {@link #getRecordingStats} can be used to get the recording state such as total recorded bytes
+ * and total duration when the event is triggered.
  */
 public abstract class VideoRecordEvent {
 
@@ -73,18 +80,32 @@
         START,
 
         /**
-         * Indicates the stop of recording.
+         * Indicates the finalization of recording.
          *
-         * @see Stop
+         * @see Finalize
          */
-        STOP,
+        FINALIZE,
 
         /**
          * The status report of the recording in progress.
          *
          * @see Status
          */
-        STATUS
+        STATUS,
+
+        /**
+         * Indicates the pause event of recording.
+         *
+         * @see Pause
+         */
+        PAUSE,
+
+        /**
+         * Indicates the resume event of recording.
+         *
+         * @see Resume
+         */
+        RESUME
     }
 
     /**
@@ -122,7 +143,7 @@
     /**
      * Describes the error that occurred during a video recording.
      *
-     * <p>This is the error code returning from {@link Stop#getError()}.
+     * <p>This is the error code returning from {@link Finalize#getError()}.
      *
      * @hide
      */
@@ -133,6 +154,17 @@
     public @interface VideoRecordError {
     }
 
+    private final OutputOptions mOutputOptions;
+    private final RecordingStats mRecordingStats;
+
+    // Restrict access to emulate sealed class
+    // Classes will be constructed with static factory methods
+    VideoRecordEvent(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        mOutputOptions = Preconditions.checkNotNull(outputOptions);
+        mRecordingStats = Preconditions.checkNotNull(recordingStats);
+    }
+
     /**
      * Gets the event type.
      */
@@ -140,11 +172,39 @@
     public abstract EventType getEventType();
 
     /**
+     * Gets the recording status of current event.
+     */
+    @NonNull
+    public RecordingStats getRecordingStats() {
+        return mRecordingStats;
+    }
+
+    /**
+     * Gets the {@link OutputOptions} associated with this event.
+     */
+    @NonNull
+    public OutputOptions getOutputOptions() {
+        return mOutputOptions;
+    }
+
+    @NonNull
+    static Start start(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        return new Start(outputOptions, recordingStats);
+    }
+
+    /**
      * Indicates the start of recording.
      *
      * <p>When a video recording is requested, start event will be reported at first.
      */
     public static final class Start extends VideoRecordEvent {
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        Start(@NonNull OutputOptions outputOptions, @NonNull RecordingStats recordingStats) {
+            super(outputOptions, recordingStats);
+        }
+
         /** {@inheritDoc} */
         @NonNull
         @Override
@@ -153,23 +213,44 @@
         }
     }
 
+    @NonNull
+    static Finalize finalize(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        return new Finalize(outputOptions, recordingStats, ERROR_NONE, null);
+    }
+
+    @NonNull
+    static Finalize finalizeWithError(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats,
+            @VideoRecordError int error,
+            @Nullable Throwable cause) {
+        Preconditions.checkArgument(error != ERROR_NONE, "An error type is required.");
+        return new Finalize(outputOptions, recordingStats, error, cause);
+    }
+
     /**
      * Indicates the stop of recording.
      *
      * <p>The stop event will be triggered regardless of whether the recording succeeds or
-     * fails. Use {@link Stop#getError()} to obtain the error type and {@link Stop#getCause()} to
-     * get the error cause. If there is no error, {@link #ERROR_NONE} will be returned. Other
-     * error code indicate the recording is failed or stopped due to a certain reason. Please
-     * note that a failed result does not mean that the video file has not been generated. In
-     * some cases, the file can still be successfully generated. For example, the result
-     * {@link #ERROR_INSUFFICIENT_DISK} will still have video file.
+     * fails. Use {@link Finalize#getError()} to obtain the error type and
+     * {@link Finalize#getCause()} to get the error cause. If there is no error,
+     * {@link #ERROR_NONE} will be returned. Other error code indicate the recording is failed or
+     * stopped due to a certain reason. Please note that a failed result does not mean that the
+     * video file has not been generated. In some cases, the file can still be successfully
+     * generated. For example, the result {@link #ERROR_INSUFFICIENT_DISK} will still have video
+     * file.
      */
-    public static final class Stop extends VideoRecordEvent {
+    public static final class Finalize extends VideoRecordEvent {
         @VideoRecordError
         private final int mError;
         private final Throwable mCause;
 
-        Stop(@VideoRecordError int error, @Nullable Throwable cause) {
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        Finalize(@NonNull OutputOptions outputOptions,
+                @NonNull RecordingStats recordingStats,
+                @VideoRecordError int error,
+                @Nullable Throwable cause) {
+            super(outputOptions, recordingStats);
             mError = error;
             mCause = cause;
         }
@@ -178,7 +259,17 @@
         @NonNull
         @Override
         public EventType getEventType() {
-            return EventType.STOP;
+            return EventType.FINALIZE;
+        }
+
+        /**
+         * Indicates whether an error occurred.
+         *
+         * <p>Returns {@code true} if {@link #getError()} returns {@link #ERROR_NONE}, otherwise
+         * {@code false}.
+         */
+        public boolean hasError() {
+            return mError != ERROR_NONE;
         }
 
         /**
@@ -192,8 +283,9 @@
         }
 
         /**
-         * Gets the error cause. Returns {@code null} if {@link #getError()} returns
-         * {@link #ERROR_NONE}.
+         * Gets the error cause.
+         *
+         * <p>Returns {@code null} if {@link #hasError()} returns {@code false}.
          */
         @Nullable
         public Throwable getCause() {
@@ -201,16 +293,20 @@
         }
     }
 
+    @NonNull
+    static Status status(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        return new Status(outputOptions, recordingStats);
+    }
+
     /**
      * The status report of the recording in progress.
      */
     public static final class Status extends VideoRecordEvent {
-        private final long mDurationNs;
-        private final long mBytes;
 
-        Status(long durationNs, long bytes) {
-            mDurationNs = durationNs;
-            mBytes = bytes;
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        Status(@NonNull OutputOptions outputOptions, @NonNull RecordingStats recordingStats) {
+            super(outputOptions, recordingStats);
         }
 
         /** {@inheritDoc} */
@@ -219,21 +315,53 @@
         public EventType getEventType() {
             return EventType.STATUS;
         }
+    }
 
-        /**
-         * Gets the total recording duration in nanoseconds.
-         *
-         * <p>The duration will not include the duration of pause.
-         */
-        public long getRecordedDurationNs() {
-            return mDurationNs;
+    @NonNull
+    static Pause pause(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        return new Pause(outputOptions, recordingStats);
+    }
+
+    /**
+     * Indicates the pause event of recording.
+     */
+    public static final class Pause extends VideoRecordEvent {
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        Pause(@NonNull OutputOptions outputOptions, @NonNull RecordingStats recordingStats) {
+            super(outputOptions, recordingStats);
         }
 
-        /**
-         * Gets the total recorded byte count.
-         */
-        public long getNumBytesRecorded() {
-            return mBytes;
+        /** {@inheritDoc} */
+        @NonNull
+        @Override
+        public EventType getEventType() {
+            return EventType.PAUSE;
+        }
+    }
+
+    @NonNull
+    static Resume resume(@NonNull OutputOptions outputOptions,
+            @NonNull RecordingStats recordingStats) {
+        return new Resume(outputOptions, recordingStats);
+    }
+
+    /**
+     * Indicates the resume event of recording.
+     */
+    public static final class Resume extends VideoRecordEvent {
+
+        @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+        Resume(@NonNull OutputOptions outputOptions, @NonNull RecordingStats recordingStats) {
+            super(outputOptions, recordingStats);
+        }
+
+        /** {@inheritDoc} */
+        @NonNull
+        @Override
+        public EventType getEventType() {
+            return EventType.RESUME;
         }
     }
 }
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 a22f778..268ffd2 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
@@ -278,6 +278,18 @@
     }
 
     @Test
+    fun setTargetRotation_rotationIsChanged() {
+        // Arrange.
+        val videoCapture = VideoCapture.withOutput(createVideoOutput())
+
+        // Act.
+        videoCapture.targetRotation = Surface.ROTATION_180
+
+        // Assert.
+        assertThat(videoCapture.targetRotation).isEqualTo(Surface.ROTATION_180)
+    }
+
+    @Test
     fun addUseCases_transformationInfoUpdated() {
         // Arrange.
         val listener = mock(SurfaceRequest.TransformationInfoListener::class.java)
@@ -301,6 +313,38 @@
         verify(listener).onTransformationInfoUpdate(any())
     }
 
+    @Test
+    fun setTargetRotation_transformationInfoUpdated() {
+        // Arrange.
+        var transformationInfo: SurfaceRequest.TransformationInfo? = null
+        val videoOutput = createVideoOutput(
+            surfaceRequestListener = { surfaceRequest ->
+                surfaceRequest.setTransformationInfoListener(
+                    CameraXExecutors.directExecutor(),
+                    {
+                        transformationInfo = it
+                    }
+                )
+            }
+        )
+        val videoCapture = VideoCapture.Builder(videoOutput)
+            .setTargetRotation(Surface.ROTATION_90)
+            .setSessionOptionUnpacker { _, _ -> }
+            .build()
+
+        // Act.
+        cameraUseCaseAdapter0.addUseCases(listOf(videoCapture))
+
+        // Assert.
+        assertThat(transformationInfo!!.targetRotation).isEqualTo(Surface.ROTATION_90)
+
+        // Act.
+        videoCapture.targetRotation = Surface.ROTATION_180
+
+        // Assert.
+        assertThat(transformationInfo!!.targetRotation).isEqualTo(Surface.ROTATION_180)
+    }
+
     private fun createVideoOutput(
         streamState: StreamState = StreamState.ACTIVE,
         mediaSpec: MediaSpec? = MediaSpec.builder().build(),
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
new file mode 100644
index 0000000..1afa049
--- /dev/null
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.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.camera.video
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import java.io.File
+import java.lang.RuntimeException
+
+private const val INVALID_FILE_PATH = "/invalid/file/path"
+private val TEST_OUTPUT_OPTION =
+    FileOutputOptions.builder().setFile(File(INVALID_FILE_PATH)).build()
+private val TEST_RECORDING_STATE = RecordingStats.of(0, 0)
+
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class VideoRecordEventTest {
+
+    @Test
+    fun canCreateStart() {
+        val event = VideoRecordEvent.start(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.START)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+    }
+
+    @Test
+    fun canCreateFinalize() {
+        val event = VideoRecordEvent.finalize(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.FINALIZE)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+        assertThat(event.hasError()).isFalse()
+        assertThat(event.error).isEqualTo(VideoRecordEvent.ERROR_NONE)
+        assertThat(event.cause).isNull()
+    }
+
+    @Test
+    fun canCreateFinalizeWithError() {
+        val error = VideoRecordEvent.ERROR_UNKNOWN
+        val cause = RuntimeException()
+        val event = VideoRecordEvent.finalizeWithError(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE,
+            error,
+            cause
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.FINALIZE)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+        assertThat(event.hasError()).isTrue()
+        assertThat(event.error).isEqualTo(error)
+        assertThat(event.cause).isEqualTo(cause)
+    }
+
+    @Test
+    fun createFinalizeWithError_withErrorNone_throwException() {
+        Assert.assertThrows(IllegalArgumentException::class.java) {
+            VideoRecordEvent.finalizeWithError(
+                TEST_OUTPUT_OPTION,
+                TEST_RECORDING_STATE,
+                VideoRecordEvent.ERROR_NONE,
+                RuntimeException()
+            )
+        }
+    }
+
+    @Test
+    fun canCreateStatus() {
+        val event = VideoRecordEvent.status(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.STATUS)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+    }
+
+    @Test
+    fun canCreatePause() {
+        val event = VideoRecordEvent.pause(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.PAUSE)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+    }
+
+    @Test
+    fun canCreateResume() {
+        val event = VideoRecordEvent.resume(
+            TEST_OUTPUT_OPTION,
+            TEST_RECORDING_STATE
+        )
+
+        assertThat(event.eventType).isEqualTo(VideoRecordEvent.EventType.RESUME)
+        assertThat(event.outputOptions).isEqualTo(TEST_OUTPUT_OPTION)
+        assertThat(event.recordingStats).isEqualTo(TEST_RECORDING_STATE)
+    }
+}
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index aef81d0..06c00c8 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -73,8 +73,8 @@
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(TRUTH)
     androidTestImplementation("androidx.camera:camera-camera2:${VIEW_ATOMIC_GROUP_PINNED_VER}")
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
 }
 android {
     defaultConfig {
diff --git a/camera/camera-view/dependencies.gradle b/camera/camera-view/dependencies.gradle
index ce7090a..c5650a5 100644
--- a/camera/camera-view/dependencies.gradle
+++ b/camera/camera-view/dependencies.gradle
@@ -16,5 +16,5 @@
 
 ext {
     // camera-view temporarily pins same-group depenencies to RC/stable until beta
-    VIEW_ATOMIC_GROUP_PINNED_VER = "1.0.0-rc04"
+    VIEW_ATOMIC_GROUP_PINNED_VER = "1.0.0-rc05"
 }
diff --git a/camera/camera-view/lint-baseline.xml b/camera/camera-view/lint-baseline.xml
index 964d790..c958ff5 100644
--- a/camera/camera-view/lint-baseline.xml
+++ b/camera/camera-view/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -13,19 +13,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.camera.view.PreviewView is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.camera.view.PreviewView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            saveAttributeDataForStyleable(context, R.styleable.PreviewView, attrs, attributes,"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/view/PreviewView.java"
-            line="226"
+            line="234"
             column="13"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.camera.view.SurfaceViewImplementation is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.view.SurfaceViewImplementation is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PixelCopy.request(mSurfaceView, bitmap, copyResult -> {"
         errorLine2="                  ~~~~~~~">
         <location
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
index 87a66489..f573b8e 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
@@ -19,6 +19,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.hardware.display.DisplayManager;
+import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
 import android.view.Display;
@@ -161,7 +162,7 @@
     private ImageAnalysis.Analyzer mAnalysisAnalyzer;
 
     @NonNull
-    private ImageAnalysis mImageAnalysis;
+    ImageAnalysis mImageAnalysis;
 
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
@@ -219,7 +220,7 @@
     private final ListenableFuture<Void> mInitializationFuture;
 
     CameraController(@NonNull Context context) {
-        mAppContext = context.getApplicationContext();
+        mAppContext = getApplicationContext(context);
         mPreview = new Preview.Builder().build();
         mImageCapture = new ImageCapture.Builder().build();
         mImageAnalysis = new ImageAnalysis.Builder().build();
@@ -242,6 +243,7 @@
         mSensorRotationListener = new SensorRotationListener(mAppContext) {
             @Override
             public void onRotationChanged(int rotation) {
+                mImageAnalysis.setTargetRotation(rotation);
                 mImageCapture.setTargetRotation(rotation);
                 mVideoCapture.setTargetRotation(rotation);
             }
@@ -249,6 +251,21 @@
     }
 
     /**
+     * Gets the application context and preserves the attribution tag.
+     *
+     * TODO(b/185272953): instrument test getting attribution tag once the view artifact depends
+     * on a core version that has the fix.
+     */
+    private static Context getApplicationContext(@NonNull Context context) {
+        Context applicationContext = context.getApplicationContext();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            return applicationContext.createAttributionContext(context.getAttributionTag());
+        } else {
+            return applicationContext;
+        }
+    }
+
+    /**
      * Gets a {@link ListenableFuture} that completes when camera initialization completes.
      *
      * <p> This future may fail with an {@link InitializationException} and associated cause that
@@ -355,17 +372,6 @@
         return (mEnabledUseCases & useCaseMask) != 0;
     }
 
-    /**
-     * Same as {@link #isVideoCaptureEnabled()}.
-     *
-     * <p> This wrapper method is to workaround the limitation that currently only one
-     * UseExperimental mark class is allowed per method.
-     */
-    @OptIn(markerClass = ExperimentalVideo.class)
-    private boolean isVideoCaptureEnabledInternal() {
-        return isVideoCaptureEnabled();
-    }
-
     // ------------------
     // Preview use case.
     // ------------------
@@ -1125,7 +1131,7 @@
      */
     @Nullable
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @OptIn(markerClass = ExperimentalUseCaseGroup.class)
+    @OptIn(markerClass = {ExperimentalUseCaseGroup.class, ExperimentalVideo.class})
     protected UseCaseGroup createUseCaseGroup() {
         if (!isCameraInitialized()) {
             Logger.d(TAG, CAMERA_NOT_INITIALIZED);
@@ -1151,7 +1157,7 @@
             mCameraProvider.unbind(mImageAnalysis);
         }
 
-        if (isVideoCaptureEnabledInternal()) {
+        if (isVideoCaptureEnabled()) {
             builder.addUseCase(mVideoCapture);
         } else {
             mCameraProvider.unbind(mVideoCapture);
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
index b686559..f376bd2 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
@@ -110,6 +110,9 @@
      *
      * @return null if failed to start camera.
      */
+    // ExperimentalUseCaseGroupLifecycle is removed and has to be replaced with
+    // ExperimentalUseCaseGroup when the dependency to camera-lifecycle is updated to alpha
+    // versions.
     @OptIn(markerClass = ExperimentalUseCaseGroupLifecycle.class)
     @RequiresPermission(Manifest.permission.CAMERA)
     @Override
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 1327ddb..916d316 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
@@ -18,6 +18,7 @@
 
 import android.content.Context
 import android.os.Build
+import android.view.Surface
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
@@ -58,6 +59,21 @@
 
     @UiThreadTest
     @Test
+    public fun sensorRotationChanges_useCaseTargetRotationUpdated() {
+        // Arrange.
+        val controller = LifecycleCameraController(context)
+
+        // Act.
+        controller.mSensorRotationListener.onRotationChanged(Surface.ROTATION_180)
+
+        // Assert.
+        assertThat(controller.mImageAnalysis.targetRotation).isEqualTo(Surface.ROTATION_180)
+        assertThat(controller.mImageCapture.targetRotation).isEqualTo(Surface.ROTATION_180)
+        // TODO(b/177276479): verify VideoCapture once it supports getTargetRotation().
+    }
+
+    @UiThreadTest
+    @Test
     public fun setSelectorBeforeBound_selectorSet() {
         // Arrange.
         val controller = LifecycleCameraController(context)
diff --git a/camera/integration-tests/camerapipetestapp/lint-baseline.xml b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
index d415296..a23af71 100644
--- a/camera/integration-tests/camerapipetestapp/lint-baseline.xml
+++ b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
@@ -1,5 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.camera.integration.camera2.pipe.CameraPipeApplication is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            val elapsedRealtime = Process.getStartElapsedRealtime()"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/integration/camera2/pipe/CameraPipeApplication.kt"
+            line="47"
+            column="43"/>
+    </issue>
 
     <issue
         id="MissingTestSizeAnnotation"
@@ -13,17 +24,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.camera.integration.camera2.pipe.CameraPipeApplication is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            val elapsedRealtime = Process.getStartElapsedRealtime()"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/camera2/pipe/CameraPipeApplication.kt"
-            line="47"
-            column="43"/>
-    </issue>
-
-    <issue
         id="PermissionImpliesUnsupportedChromeOsHardware"
         message="Permission exists without corresponding hardware `&lt;uses-feature android:name=&quot;android.hardware.camera&quot; required=&quot;false&quot;>` tag"
         errorLine1="    &lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; />"
diff --git a/camera/integration-tests/camerapipetestapp/src/main/res/values/strings.xml b/camera/integration-tests/camerapipetestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/camerapipetestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/camerapipetestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/camera/integration-tests/coretestapp/lint-baseline.xml b/camera/integration-tests/coretestapp/lint-baseline.xml
index 8664df8..444e113 100644
--- a/camera/integration-tests/coretestapp/lint-baseline.xml
+++ b/camera/integration-tests/coretestapp/lint-baseline.xml
@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
         message="VideoCapture.startRecording can only be called from within the same library group (groupId=androidx.camera)"
-        errorLine1="                getVideoCapture().startRecording(mVideoFileSaver.getNewVideoOutputFileOptions("
-        errorLine2="                                  ~~~~~~~~~~~~~~">
+        errorLine1="                    getVideoCapture().startRecording(mVideoFileSaver.getNewVideoOutputFileOptions("
+        errorLine2="                                      ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="335"
-            column="35"/>
+            line="355"
+            column="39"/>
     </issue>
 
     <issue
@@ -19,7 +19,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="343"
+            line="367"
             column="35"/>
     </issue>
 
@@ -52,7 +52,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="177"
+            line="182"
             column="13"/>
     </issue>
 
@@ -63,7 +63,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="180"
+            line="185"
             column="22"/>
     </issue>
 
@@ -74,7 +74,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="181"
+            line="186"
             column="21"/>
     </issue>
 
@@ -85,7 +85,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="360"
+            line="384"
             column="25"/>
     </issue>
 
@@ -96,7 +96,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="363"
+            line="387"
             column="25"/>
     </issue>
 
@@ -107,7 +107,7 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="372"
+            line="396"
             column="33"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="381"
+            line="405"
             column="45"/>
     </issue>
 
@@ -129,62 +129,18 @@
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="403"
+            line="427"
             column="45"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` field `mViewFinder` of class `CameraXActivity` requires synthetic accessor"
-        errorLine1="                Display viewFinderDisplay = mViewFinder.getDisplay();"
-        errorLine2="                                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="589"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCamera` of class `CameraXActivity` requires synthetic accessor"
-        errorLine1="                    if (mCamera == null) {"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="867"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCamera` of class `CameraXActivity` requires synthetic accessor"
-        errorLine1="                    CameraInfo cameraInfo = mCamera.getCameraInfo();"
-        errorLine2="                                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="871"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCamera` of class `CameraXActivity` requires synthetic accessor"
-        errorLine1="                    CameraControl cameraControl = mCamera.getCameraControl();"
-        errorLine2="                                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/core/CameraXActivity.java"
-            line="872"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` field `mCameraProvider` of class `OpenGLActivity` requires synthetic accessor"
         errorLine1="                            if (mCameraProvider != null) {"
         errorLine2="                                ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/OpenGLActivity.java"
-            line="261"
+            line="262"
             column="33"/>
     </issue>
 
@@ -195,7 +151,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/core/OpenGLActivity.java"
-            line="262"
+            line="263"
             column="33"/>
     </issue>
 
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 45de9b6..f600a24 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
@@ -27,6 +27,7 @@
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.activity.Camera2TestActivity
 import androidx.camera.testing.activity.CameraXTestActivity
+import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.IdlingPolicies
@@ -35,7 +36,6 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
-import com.google.common.truth.Truth
 import kotlinx.coroutines.runBlocking
 import org.junit.After
 import org.junit.Before
@@ -65,19 +65,8 @@
         )
     }
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val cameraXTestActivityRule = androidx.test.rule.ActivityTestRule(
-        CameraXTestActivity::class.java, true, false
-    )
-
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val camera2ActivityRule = androidx.test.rule.ActivityTestRule(
-        Camera2TestActivity::class.java, true, false
-    )
-
     private val context: Context = ApplicationProvider.getApplicationContext()
+    private lateinit var cameraXActivityScenario: ActivityScenario<CameraXTestActivity>
 
     @Before
     fun setUp() {
@@ -95,12 +84,8 @@
 
     @After
     fun tearDown() {
-        if (cameraXTestActivityRule.activity != null) {
-            cameraXTestActivityRule.finishActivity()
-        }
-
-        if (camera2ActivityRule.activity != null) {
-            camera2ActivityRule.finishActivity()
+        if (::cameraXActivityScenario.isInitialized) {
+            cameraXActivityScenario.close()
         }
 
         runBlocking {
@@ -112,38 +97,49 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) // Known issue, checkout b/147393563.
     fun testCameraDisconnect() {
 
-        // TODO(b/184603071): Migrate the ActivityTestRule to ActivityScenario
         // Launch CameraX test activity
-        with(cameraXTestActivityRule.launchActivity(Intent())) {
+        cameraXActivityScenario = ActivityScenario.launch(CameraXTestActivity::class.java)
+        with(cameraXActivityScenario) {
 
             // Wait for preview to become active
             waitForCameraXPreview()
 
-            // Get id of camera opened by CameraX test activity
-            Truth.assertThat(cameraId).isNotNull()
-
             // Launch Camera2 test activity. It should cause the camera to disconnect from CameraX.
             val intent = Intent(
                 context,
                 Camera2TestActivity::class.java
             ).apply {
-                putExtra(Camera2TestActivity.EXTRA_CAMERA_ID, cameraId)
+                putExtra(Camera2TestActivity.EXTRA_CAMERA_ID, getCameraId())
             }
-            camera2ActivityRule.launchActivity(intent)
 
-            // Wait for preview to become active
-            camera2ActivityRule.activity.waitForCamera2Preview()
+            CoreAppTestUtil.launchActivity(
+                InstrumentationRegistry.getInstrumentation(),
+                Camera2TestActivity::class.java,
+                intent
+            )?.apply {
+                // Wait for preview to become active
+                waitForCamera2Preview()
 
-            // Close Camera2 test activity, and verify the CameraX Preview resumes successfully.
-            camera2ActivityRule.finishActivity()
+                // Close Camera2 test activity, and verify the CameraX Preview resumes successfully.
+                finish()
+            }
 
             // Verify the CameraX Preview can resume successfully.
             waitForCameraXPreview()
         }
     }
 
-    private fun CameraXTestActivity.waitForCameraXPreview() {
-        waitFor(previewReady)
+    private fun ActivityScenario<CameraXTestActivity>.getCameraId(): String {
+        var cameraId: String? = null
+        onActivity { cameraId = it.cameraId }
+        return cameraId!!
+    }
+
+    private fun ActivityScenario<CameraXTestActivity>.waitForCameraXPreview() {
+        var idlingResource: IdlingResource? = null
+        onActivity { idlingResource = it.previewReady }
+
+        waitFor(idlingResource!!)
     }
 
     private fun Camera2TestActivity.waitForCamera2Preview() {
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
new file mode 100644
index 0000000..d18c243
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXInitTest.kt
@@ -0,0 +1,100 @@
+/*
+ * 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.integration.core
+
+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.test.core.app.ApplicationProvider
+import androidx.test.filters.LargeTest
+import androidx.test.rule.GrantPermissionRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@RunWith(Parameterized::class)
+class CameraXInitTest(private val implName: String, private val cameraXConfig: CameraXConfig) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    // Don't use CameraUtil.grantCameraPermissionAndPreTest. This test verifies the CameraX
+    // initialization can be successfully done on a real device.
+    @get:Rule
+    val permissionRule: GrantPermissionRule =
+        GrantPermissionRule.grant(android.Manifest.permission.CAMERA)
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private val packageManager = context.packageManager
+
+    @Before
+    fun setup() {
+        // Only test the device when it has at least 1 camera. Don't use CameraUtil
+        // .deviceHasCamera() to check the camera, it might ignore the test if the camera device
+        // is in a bad state.
+        assumeTrue(
+            packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
+                packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)
+        )
+        CameraX.configureInstance(cameraXConfig)
+    }
+
+    @After
+    fun tearDown() {
+        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun initOnDevice() {
+        CameraX.getOrCreateInstance(context).get(10, TimeUnit.SECONDS)
+        assertThat(CameraX.isInitialized()).isTrue()
+    }
+
+    @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)
+        }
+    }
+}
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 2b2530f..73c6571 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
@@ -32,6 +32,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.rule.GrantPermissionRule
 import androidx.test.uiautomator.UiDevice
+import androidx.testutils.RepeatRule
 import androidx.testutils.withActivity
 import kotlinx.coroutines.runBlocking
 import org.junit.After
@@ -97,6 +98,7 @@
 
     // Check if Preview screen is updated or not, after Destroy-Create lifecycle.
     @Test
+    @RepeatRule.Repeat(times = 5)
     fun checkPreviewUpdatedAfterDestroyRecreate() {
         with(ActivityScenario.launch(CameraXActivity::class.java)) { // Launch activity.
             use { // Ensure ActivityScenario is cleaned up properly
@@ -111,6 +113,7 @@
 
     // Check if Preview screen is updated or not, after Stop-Resume lifecycle.
     @Test
+    @RepeatRule.Repeat(times = 5)
     fun checkPreviewUpdatedAfterStopResume() {
         with(ActivityScenario.launch(CameraXActivity::class.java)) { // Launch activity.
             use { // Ensure ActivityScenario is cleaned up properly
@@ -140,6 +143,7 @@
     // Check if Preview screen is updated or not, after toggling camera,
     // then a Destroy-Create lifecycle.
     @Test
+    @RepeatRule.Repeat(times = 5)
     fun checkPreviewUpdatedAfterToggleCameraAndStopResume() = runBlocking {
         // check have front camera
         Assume.assumeTrue(
@@ -172,6 +176,7 @@
 
     // Check if Preview screen is updated or not, after rotate device, and Stop-Resume lifecycle.
     @Test
+    @RepeatRule.Repeat(times = 5)
     fun checkPreviewUpdatedAfterRotateDeviceAndStopResume() {
         with(ActivityScenario.launch(CameraXActivity::class.java)) { // Launch activity.
             use { // Ensure ActivityScenario is cleaned up properly
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
new file mode 100644
index 0000000..cc4004b
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
@@ -0,0 +1,1540 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.camera.integration.core
+
+import android.Manifest
+import android.content.ContentValues
+import android.content.Context
+import android.graphics.ImageFormat
+import android.graphics.Rect
+import android.hardware.camera2.CameraCaptureSession
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.TotalCaptureResult
+import android.location.Location
+import android.media.ImageWriter
+import android.os.Build
+import android.os.Environment
+import android.provider.MediaStore
+import android.util.Rational
+import android.util.Size
+import android.view.Surface
+import androidx.annotation.OptIn
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.interop.ExperimentalCamera2Interop
+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.ImageCapture
+import androidx.camera.core.ImageCaptureException
+import androidx.camera.core.ImageProxy
+import androidx.camera.core.impl.CaptureBundle
+import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.core.impl.CaptureProcessor
+import androidx.camera.core.impl.CaptureStage
+import androidx.camera.core.impl.ImageCaptureConfig
+import androidx.camera.core.impl.ImageOutputConfig
+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.testing.CameraUtil
+import androidx.camera.testing.fakes.FakeCaptureStage
+import androidx.core.content.ContextCompat
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.rule.GrantPermissionRule
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+import kotlinx.coroutines.withTimeout
+import org.junit.After
+import org.junit.Assert
+import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeNotNull
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.io.ByteArrayInputStream
+import java.io.File
+import java.io.FileOutputStream
+import java.util.concurrent.ExecutionException
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.atomic.AtomicInteger
+import kotlin.math.abs
+
+private val DEFAULT_RESOLUTION = Size(640, 480)
+private val GUARANTEED_RESOLUTION = Size(640, 480)
+private val BACK_SELECTOR = CameraSelector.DEFAULT_BACK_CAMERA
+private const val BACK_LENS_FACING = CameraSelector.LENS_FACING_BACK
+private const val CAPTURE_TIMEOUT = 10_000.toLong() //  10 seconds
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ImageCaptureTest(private val implName: String, private val cameraXConfig: CameraXConfig) {
+
+    @get:Rule
+    val cameraRule = CameraUtil.grantCameraPermissionAndPreTest()
+
+    @get:Rule
+    val externalStorageRule: GrantPermissionRule =
+        GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private val mainExecutor = ContextCompat.getMainExecutor(context)
+    private val defaultBuilder = ImageCapture.Builder()
+    private lateinit var camera: CameraUseCaseAdapter
+
+    @Before
+    fun setUp() {
+        assumeTrue(CameraUtil.hasCameraWithLensFacing(BACK_LENS_FACING))
+        createDefaultPictureFolderIfNotExist()
+        CameraX.initialize(context, cameraXConfig).get(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
+            withContext(Dispatchers.Main) {
+                camera.removeUseCases(camera.useCases)
+            }
+        }
+        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @Test
+    fun capturedImageHasCorrectSize() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .setTargetRotation(Surface.ROTATION_0)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+        var sizeEnvelope = imageProperties.size
+
+        // Some devices may not be able to fit the requested resolution within the image
+        // boundaries. In this case, they should always fall back to a guaranteed resolution of
+        // 640 x 480.
+        if (sizeEnvelope != GUARANTEED_RESOLUTION) {
+            val rotationDegrees = imageProperties.rotationDegrees
+
+            // If the image data is rotated by 90 or 270, we need to ensure our desired width fits
+            // within the height of this image and our desired height fits in the width.
+            if (rotationDegrees == 270 || rotationDegrees == 90) {
+                sizeEnvelope = Size(sizeEnvelope!!.height, sizeEnvelope.width)
+            }
+
+            // Ensure the width and height can be cropped from the source image
+            assertThat(sizeEnvelope!!.width).isAtLeast(DEFAULT_RESOLUTION.width)
+            assertThat(sizeEnvelope.height).isAtLeast(DEFAULT_RESOLUTION.height)
+        }
+    }
+
+    @Test
+    fun canSupportGuaranteedSizeFront() {
+        skipTestOnCameraPipeConfig()
+
+        canSupportGuaranteedSize(
+            CameraSelector.LENS_FACING_FRONT,
+            CameraSelector.DEFAULT_FRONT_CAMERA
+        )
+    }
+
+    @Test
+    fun canSupportGuaranteedSizeBack() {
+        skipTestOnCameraPipeConfig()
+
+        canSupportGuaranteedSize(
+            CameraSelector.LENS_FACING_BACK,
+            CameraSelector.DEFAULT_BACK_CAMERA
+        )
+    }
+
+    /** check both front and back device cameras can support the guaranteed 640x480 size. */
+    private fun canSupportGuaranteedSize(lensFacing: Int, selector: CameraSelector) = runBlocking {
+        assumeTrue(CameraUtil.hasCameraWithLensFacing(lensFacing))
+        assumeTrue(!CameraUtil.requiresCorrectedAspectRatio(lensFacing))
+
+        // Checks camera device sensor degrees to set correct target rotation value to make sure
+        // the exactly matching result size 640x480 can be selected if the device supports it.
+        val sensorOrientation = CameraUtil.getSensorOrientation(lensFacing)
+        val isRotateNeeded = sensorOrientation!! % 180 != 0
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(GUARANTEED_RESOLUTION)
+            .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, selector, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        // Check the captured image exactly matches 640x480 size. This test can also check
+        // whether the guaranteed resolution 640x480 is really supported for JPEG format on the
+        // devices when running the test.
+        val imageProperties = callback.results.first()
+        Assert.assertEquals(GUARANTEED_RESOLUTION, imageProperties.size)
+    }
+
+    @Test
+    fun canCaptureWithFlashOn() {
+        skipTestOnCameraPipeConfig()
+
+        canTakePictureWithFlashMode(ImageCapture.FLASH_MODE_ON)
+    }
+
+    @Test
+    fun canCaptureWithFlashAuto() {
+        skipTestOnCameraPipeConfig()
+
+        canTakePictureWithFlashMode(ImageCapture.FLASH_MODE_AUTO)
+    }
+
+    private fun canTakePictureWithFlashMode(flashMode: Int) = runBlocking {
+        val imageCapture = ImageCapture.Builder()
+            .setFlashMode(flashMode)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+
+        // Take picture after preview is ready for a while. It can cause issue on some devices when
+        // flash is on.
+        delay(2_000)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+    }
+
+    @Test
+    fun canCaptureMultipleImages() {
+        skipTestOnCameraPipeConfig()
+
+        canTakeMultipleImages(defaultBuilder)
+    }
+
+    @Test
+    fun canCaptureMultipleImagesWithMaxQuality() {
+        skipTestOnCameraPipeConfig()
+
+        canTakeMultipleImages(
+            ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
+        )
+    }
+
+    private fun canTakeMultipleImages(builder: ImageCapture.Builder): Unit = runBlocking {
+        val useCase = builder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val numImages = 5
+        val callback = FakeImageCaptureCallback(capturesCount = numImages)
+        for (i in 0 until numImages) {
+            useCase.takePicture(mainExecutor, callback)
+        }
+
+        callback.awaitCapturesAndAssert(
+            timeout = numImages * CAPTURE_TIMEOUT,
+            capturedImagesCount = numImages
+        )
+    }
+
+    @Test
+    fun saveCanSucceed_withNonExistingFile() {
+        skipTestOnCameraPipeConfig()
+
+        val saveLocation = File(context.cacheDir, "test" + System.currentTimeMillis() + ".jpg")
+        saveLocation.deleteOnExit()
+
+        // make sure file does not exist
+        if (saveLocation.exists()) {
+            saveLocation.delete()
+        }
+        assertThat(!saveLocation.exists())
+
+        canSaveToFile(saveLocation)
+    }
+
+    @Test
+    fun saveCanSucceed_withExistingFile() {
+        skipTestOnCameraPipeConfig()
+
+        val saveLocation = File.createTempFile("test", ".jpg")
+        saveLocation.deleteOnExit()
+        assertThat(saveLocation.exists())
+
+        canSaveToFile(saveLocation)
+    }
+
+    private fun canSaveToFile(saveLocation: File) = runBlocking {
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation).build(),
+            mainExecutor,
+            callback
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+    }
+
+    @Test
+    fun saveToUri(): Unit = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // Arrange.
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val contentValues = ContentValues()
+        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
+        val outputFileOptions = ImageCapture.OutputFileOptions.Builder(
+            context.contentResolver,
+            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+            contentValues
+        ).build()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        // Act.
+        useCase.takePicture(outputFileOptions, mainExecutor, callback)
+
+        // Assert: Wait for the signal that the image has been saved
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        // Verify save location Uri is available.
+        val saveLocationUri = callback.results.first().savedUri
+        assertThat(saveLocationUri).isNotNull()
+
+        // Clean up.
+        context.contentResolver.delete(saveLocationUri!!, null, null)
+    }
+
+    @Test
+    fun saveToOutputStream() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // Arrange.
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation = File.createTempFile("test", ".jpg")
+        saveLocation.deleteOnExit()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        FileOutputStream(saveLocation).use { outputStream ->
+            // Act.
+            useCase.takePicture(
+                ImageCapture.OutputFileOptions.Builder(outputStream).build(),
+                mainExecutor,
+                callback
+            )
+
+            // Assert: Wait for the signal that the image has been saved.
+            callback.awaitCapturesAndAssert(savedImagesCount = 1)
+        }
+    }
+
+    @Test
+    fun canSaveFile_withRotation() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // TODO(b/147448711) Add back in once cuttlefish has correct user cropping functionality.
+        assumeFalse(
+            "Cuttlefish does not correctly handle crops. Unable to test.",
+            Build.MODEL.contains("Cuttlefish")
+        )
+
+        val useCase = ImageCapture.Builder()
+            .setTargetRotation(Surface.ROTATION_0)
+            .build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation = File.createTempFile("test", ".jpg")
+        saveLocation.deleteOnExit()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation).build(),
+            mainExecutor,
+            callback
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        // Retrieve the exif from the image
+        val exif = Exif.createFromFile(saveLocation)
+
+        val saveLocationRotated90 = File.createTempFile("testRotated90", ".jpg")
+        saveLocationRotated90.deleteOnExit()
+
+        val callbackRotated90 = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.targetRotation = Surface.ROTATION_90
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocationRotated90).build(),
+            mainExecutor,
+            callbackRotated90
+        )
+
+        // Wait for the signal that the image has been saved.
+        callbackRotated90.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        // Retrieve the exif from the image
+        val exifRotated90 = Exif.createFromFile(saveLocationRotated90)
+
+        // Compare aspect ratio with a threshold due to floating point rounding. Can't do direct
+        // comparison of height and width, because the rotated capture is scaled to fit within
+        // the sensor region
+        val aspectRatioThreshold = 0.01
+
+        // If rotation is equal then buffers were rotated by HAL so the aspect ratio should be
+        // rotated by 90 degrees. Otherwise the aspect ratio should be the same.
+        if (exif.rotation == exifRotated90.rotation) {
+            val aspectRatio = exif.height.toDouble() / exif.width
+            val aspectRatioRotated90 = exifRotated90.width.toDouble() / exifRotated90.height
+            assertThat(abs(aspectRatio - aspectRatioRotated90)).isLessThan(aspectRatioThreshold)
+        } else {
+            val aspectRatio = exif.width.toDouble() / exif.height
+            val aspectRatioRotated90 = exifRotated90.width.toDouble() / exifRotated90.height
+            assertThat(abs(aspectRatio - aspectRatioRotated90)).isLessThan(aspectRatioThreshold)
+        }
+    }
+
+    @Test
+    fun canSaveFile_flippedHorizontal() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // Use a non-rotated configuration since some combinations of rotation + flipping vertically
+        // can be equivalent to flipping horizontally
+        val configBuilder = ImageCapture.Builder.fromConfig(createNonRotatedConfiguration())
+
+        val metadata = ImageCapture.Metadata()
+        metadata.isReversedHorizontal = true
+
+        canSaveFileWithMetadata(
+            configBuilder = configBuilder,
+            metadata = metadata,
+            verifyExif = { exif ->
+                assertThat(exif.isFlippedHorizontally).isTrue()
+            }
+        )
+    }
+
+    @Test
+    fun canSaveFile_flippedVertical() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // Use a non-rotated configuration since some combinations of rotation + flipping
+        // horizontally can be equivalent to flipping vertically
+        val configBuilder = ImageCapture.Builder.fromConfig(createNonRotatedConfiguration())
+
+        val metadata = ImageCapture.Metadata()
+        metadata.isReversedVertical = true
+
+        canSaveFileWithMetadata(
+            configBuilder = configBuilder,
+            metadata = metadata,
+            verifyExif = { exif ->
+                assertThat(exif.isFlippedVertically).isTrue()
+            }
+        )
+    }
+
+    @Test
+    fun canSaveFile_withAttachedLocation() {
+        skipTestOnCameraPipeConfig()
+
+        val location = Location("ImageCaptureTest")
+        val metadata = ImageCapture.Metadata()
+        metadata.location = location
+        canSaveFileWithMetadata(
+            configBuilder = defaultBuilder,
+            metadata = metadata,
+            verifyExif = { exif ->
+                assertThat(exif.location!!.provider).isEqualTo(location.provider)
+            }
+        )
+    }
+
+    private fun canSaveFileWithMetadata(
+        configBuilder: ImageCapture.Builder,
+        metadata: ImageCapture.Metadata,
+        verifyExif: (Exif) -> Unit
+    ) = runBlocking {
+        val useCase = configBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation = File.createTempFile("test", ".jpg")
+        saveLocation.deleteOnExit()
+        val outputFileOptions = ImageCapture.OutputFileOptions
+            .Builder(saveLocation)
+            .setMetadata(metadata)
+            .build()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(outputFileOptions, mainExecutor, callback)
+
+        // Wait for the signal that the image has been saved.
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        // Retrieve the exif from the image
+        val exif = Exif.createFromFile(saveLocation)
+        verifyExif(exif)
+    }
+
+    @Test
+    fun canSaveMultipleFiles() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val numImages = 5
+        val callback = FakeImageSavedCallback(capturesCount = numImages)
+
+        for (i in 0 until numImages) {
+            val saveLocation = File.createTempFile("test$i", ".jpg")
+            saveLocation.deleteOnExit()
+            useCase.takePicture(
+                ImageCapture.OutputFileOptions.Builder(saveLocation).build(),
+                mainExecutor,
+                callback
+            )
+        }
+
+        // Wait for the signal that all the images have been saved.
+        callback.awaitCapturesAndAssert(
+            timeout = numImages * CAPTURE_TIMEOUT,
+            savedImagesCount = numImages
+        )
+    }
+
+    @Test
+    fun saveWillFail_whenInvalidFilePathIsUsed() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        // Note the invalid path
+        val saveLocation = File("/not/a/real/path.jpg")
+        val outputFileOptions = ImageCapture.OutputFileOptions.Builder(saveLocation).build()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(outputFileOptions, mainExecutor, callback)
+
+        // Wait for the signal that saving the image has failed
+        callback.awaitCapturesAndAssert(errorsCount = 1)
+
+        val error = callback.errors.first().imageCaptureError
+        assertThat(error).isEqualTo(ImageCapture.ERROR_FILE_IO)
+    }
+
+    @Test
+    @OptIn(markerClass = [ExperimentalCamera2Interop::class])
+    fun camera2InteropCaptureSessionCallbacks() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val stillCaptureCount = AtomicInteger(0)
+        val captureCallback = object : CaptureCallback() {
+            override fun onCaptureCompleted(
+                session: CameraCaptureSession,
+                request: CaptureRequest,
+                result: TotalCaptureResult
+            ) {
+                super.onCaptureCompleted(session, request, result)
+                if (request.get(CaptureRequest.CONTROL_CAPTURE_INTENT) ==
+                    CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE
+                ) {
+                    stillCaptureCount.incrementAndGet()
+                }
+            }
+        }
+        val builder = ImageCapture.Builder()
+        Camera2Interop.Extender(builder).setSessionCaptureCallback(captureCallback)
+        val useCase = builder.build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        // Because interop listener will get both image capture and preview callbacks, ensure
+        // that there is one CAPTURE_INTENT_STILL_CAPTURE from all onCaptureCompleted() callbacks.
+        assertThat(stillCaptureCount.get()).isEqualTo(1)
+    }
+
+    @Test
+    fun takePicture_withBufferFormatRaw10() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val cameraCharacteristics = CameraUtil.getCameraCharacteristics(BACK_LENS_FACING)
+        val map = cameraCharacteristics!!.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
+        val resolutions = map!!.getOutputSizes(ImageFormat.RAW10)
+
+        // Ignore this tests on devices that do not support RAW10 image format.
+        assumeNotNull(resolutions)
+        assumeTrue(resolutions!!.isNotEmpty())
+        assumeTrue(isRawSupported(cameraCharacteristics))
+
+        val useCase = ImageCapture.Builder()
+            .setBufferFormat(ImageFormat.RAW10)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+        assertThat(imageProperties.format).isEqualTo(ImageFormat.RAW10)
+    }
+
+    private fun isRawSupported(cameraCharacteristics: CameraCharacteristics): Boolean {
+        val capabilities =
+            cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
+                ?: IntArray(0)
+        return capabilities.any { capability ->
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW == capability
+        }
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun constructor_withBufferFormatAndCaptureProcessor_throwsException() {
+        val captureProcessor = object : CaptureProcessor {
+            override fun onOutputSurface(surface: Surface?, imageFormat: Int) {}
+            override fun process(bundle: ImageProxyBundle?) {}
+            override fun onResolutionUpdate(size: Size?) {}
+        }
+        ImageCapture.Builder()
+            .setBufferFormat(ImageFormat.RAW_SENSOR)
+            .setCaptureProcessor(captureProcessor)
+            .build()
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun constructor_maxCaptureStageInvalid_throwsException() {
+        ImageCapture.Builder().setMaxCaptureStages(0).build()
+    }
+
+    @Test
+    fun captureStagesAbove1_withoutCaptureProcessor() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val captureBundle = CaptureBundle {
+            listOf(
+                FakeCaptureStage(0, CaptureConfig.Builder().build()),
+                FakeCaptureStage(1, CaptureConfig.Builder().build())
+            )
+        }
+
+        val imageCapture = ImageCapture.Builder()
+            .setCaptureBundle(captureBundle)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image capture has failed.
+        callback.awaitCapturesAndAssert(errorsCount = 1)
+
+        val error = callback.errors.first()
+        assertThat(error).isInstanceOf(ImageCaptureException::class.java)
+        assertThat(error.cause).isInstanceOf(IllegalArgumentException::class.java)
+    }
+
+    @Test
+    fun captureStageExceedMaxCaptureStage_whenIssueTakePicture() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        // Initial the captureStages not greater than the maximum count to bypass the CaptureStage
+        // count checking during bindToLifeCycle.
+        val captureStages = mutableListOf<CaptureStage>()
+        captureStages.add(FakeCaptureStage(0, CaptureConfig.Builder().build()))
+
+        val captureBundle = CaptureBundle { captureStages.toList() }
+        val captureProcessor = object : CaptureProcessor {
+            override fun onOutputSurface(surface: Surface?, imageFormat: Int) {}
+            override fun process(bundle: ImageProxyBundle?) {}
+            override fun onResolutionUpdate(size: Size?) {}
+        }
+        val imageCapture = ImageCapture.Builder()
+            .setMaxCaptureStages(1)
+            .setCaptureBundle(captureBundle)
+            .setCaptureProcessor(captureProcessor)
+            .build()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+
+        // Add an additional capture stage to test the case
+        // captureStage.size() > mMaxCaptureStages during takePicture.
+        captureStages.add(FakeCaptureStage(1, CaptureConfig.Builder().build()))
+
+        val callback = FakeImageCaptureCallback(capturesCount = 2)
+
+        // Take 2 photos.
+        imageCapture.takePicture(mainExecutor, callback)
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // It should get onError() callback twice.
+        callback.awaitCapturesAndAssert(errorsCount = 2)
+
+        callback.errors.forEach { error ->
+            assertThat(error.cause).isInstanceOf(IllegalArgumentException::class.java)
+        }
+    }
+
+    @Test
+    fun onStateOffline_abortAllCaptureRequests() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val imageCapture = ImageCapture.Builder().build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, 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
+        // onStateDetached() should also come after onStateAttached(). There is no API to
+        // directly know  onStateAttached() callback has been received. Therefore, taking a
+        // picture and waiting for the capture success callback to know the use case's
+        // onStateAttached() callback has been received.
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val callback2 = FakeImageCaptureCallback(capturesCount = 3)
+        imageCapture.takePicture(mainExecutor, callback2)
+        imageCapture.takePicture(mainExecutor, callback2)
+        imageCapture.takePicture(mainExecutor, callback2)
+
+        withContext(Dispatchers.Main) {
+            imageCapture.onStateDetached()
+        }
+
+        callback2.awaitCaptures()
+        assertThat(callback2.results.size + callback2.errors.size).isEqualTo(3)
+
+        for (error in callback2.errors) {
+            assertThat(error.imageCaptureError).isEqualTo(ImageCapture.ERROR_CAMERA_CLOSED)
+        }
+    }
+
+    @Test
+    fun unbind_abortAllCaptureRequests() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val imageCapture = ImageCapture.Builder().build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 3)
+        imageCapture.takePicture(mainExecutor, callback)
+        imageCapture.takePicture(mainExecutor, callback)
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // Needs to run on main thread because takePicture gets posted on main thread if it isn't
+        // running on the main thread. Which means the internal ImageRequests likely get issued
+        // after ImageCapture is removed so errors out with a different error from
+        // ERROR_CAMERA_CLOSED
+        withContext(Dispatchers.Main) {
+            camera.removeUseCases(setOf(imageCapture))
+        }
+
+        // Wait for the signal that the image capture has failed.
+        callback.awaitCapturesAndAssert(errorsCount = 3)
+
+        assertThat(callback.results.size + callback.errors.size).isEqualTo(3)
+        for (error in callback.errors) {
+            assertThat(error.imageCaptureError).isEqualTo(ImageCapture.ERROR_CAMERA_CLOSED)
+        }
+    }
+
+    @Test
+    fun takePictureReturnsErrorNO_CAMERA_whenNotBound() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val imageCapture = ImageCapture.Builder().build()
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+
+        imageCapture.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image capture has failed.
+        callback.awaitCapturesAndAssert(errorsCount = 1)
+
+        val error = callback.errors.first()
+        assertThat(error.imageCaptureError).isEqualTo(ImageCapture.ERROR_INVALID_CAMERA)
+    }
+
+    @Test
+    fun defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() {
+        val useCase = ImageCapture.Builder().build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val config = useCase.currentConfig as ImageOutputConfig
+        assertThat(config.targetAspectRatio).isEqualTo(AspectRatio.RATIO_4_3)
+    }
+
+    @Test
+    fun defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() {
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .build()
+
+        assertThat(
+            useCase.currentConfig.containsOption(
+                ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO
+            )
+        ).isFalse()
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        assertThat(
+            useCase.currentConfig.containsOption(
+                ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO
+            )
+        ).isFalse()
+    }
+
+    @Test
+    fun targetRotationCanBeUpdatedAfterUseCaseIsCreated() {
+        val imageCapture = ImageCapture.Builder()
+            .setTargetRotation(Surface.ROTATION_0)
+            .build()
+        imageCapture.targetRotation = Surface.ROTATION_90
+        assertThat(imageCapture.targetRotation).isEqualTo(Surface.ROTATION_90)
+    }
+
+    @Test
+    fun targetResolutionIsUpdatedAfterTargetRotationIsUpdated() {
+        val imageCapture = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .setTargetRotation(Surface.ROTATION_0)
+            .build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+
+        // Updates target rotation from ROTATION_0 to ROTATION_90.
+        imageCapture.targetRotation = Surface.ROTATION_90
+
+        val newConfig = imageCapture.currentConfig as ImageOutputConfig
+        val expectedTargetResolution = Size(DEFAULT_RESOLUTION.height, DEFAULT_RESOLUTION.width)
+
+        // Expected targetResolution will be reversed from original target resolution.
+        assertThat(newConfig.targetResolution).isEqualTo(expectedTargetResolution)
+    }
+
+    @Test
+    fun capturedImageHasCorrectCroppingSizeWithoutSettingRotation() {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .build()
+
+        capturedImageHasCorrectCroppingSize(
+            useCase,
+            rotateCropRect = { capturedImageRotationDegrees ->
+                capturedImageRotationDegrees % 180 != 0
+            }
+        )
+    }
+
+    @Test
+    fun capturedImageHasCorrectCroppingSizeSetRotationBuilder() {
+        skipTestOnCameraPipeConfig()
+
+        // Checks camera device sensor degrees to set correct target rotation value to make sure
+        // that the initial set target cropping aspect ratio matches the sensor orientation.
+        val sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING)
+        val isRotateNeeded = sensorOrientation!! % 180 != 0
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
+            .build()
+
+        capturedImageHasCorrectCroppingSize(
+            useCase,
+            rotateCropRect = { capturedImageRotationDegrees ->
+                capturedImageRotationDegrees % 180 != 0
+            }
+        )
+    }
+
+    @Test
+    fun capturedImageHasCorrectCroppingSize_setUseCaseRotation90FromRotationInBuilder() {
+        skipTestOnCameraPipeConfig()
+
+        // Checks camera device sensor degrees to set correct target rotation value to make sure
+        // that the initial set target cropping aspect ratio matches the sensor orientation.
+        val sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING)
+        val isRotateNeeded = sensorOrientation!! % 180 != 0
+        val useCase = ImageCapture.Builder()
+            .setTargetResolution(DEFAULT_RESOLUTION)
+            .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
+            .build()
+
+        // Updates target rotation to opposite one.
+        useCase.targetRotation = if (isRotateNeeded) Surface.ROTATION_0 else Surface.ROTATION_90
+
+        capturedImageHasCorrectCroppingSize(
+            useCase,
+            rotateCropRect = { capturedImageRotationDegrees ->
+                capturedImageRotationDegrees % 180 == 0
+            }
+        )
+    }
+
+    private fun capturedImageHasCorrectCroppingSize(
+        useCase: ImageCapture,
+        rotateCropRect: (Int) -> Boolean
+    ) = runBlocking {
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        // After target rotation is updated, the result cropping aspect ratio should still the
+        // same as original one.
+        val expectedCroppingRatio = Rational(DEFAULT_RESOLUTION.width, DEFAULT_RESOLUTION.height)
+
+        val imageProperties = callback.results.first()
+        val cropRect = imageProperties.cropRect
+
+        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
+        // displayed image
+        val resultCroppingRatio: Rational = if (rotateCropRect(imageProperties.rotationDegrees)) {
+            Rational(cropRect!!.height(), cropRect.width())
+        } else {
+            Rational(cropRect!!.width(), cropRect.height())
+        }
+
+        assertThat(resultCroppingRatio).isEqualTo(expectedCroppingRatio)
+        if (imageProperties.format == ImageFormat.JPEG) {
+            assertThat(imageProperties.rotationDegrees).isEqualTo(imageProperties.exif!!.rotation)
+        }
+    }
+
+    @Test
+    fun capturedImageHasCorrectCroppingSize_setCropAspectRatioAfterBindToLifecycle() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = ImageCapture.Builder().build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+
+        // Checks camera device sensor degrees to set target cropping aspect ratio match the
+        // sensor orientation.
+        val sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING)
+        val isRotateNeeded = sensorOrientation!! % 180 != 0
+
+        // Set the default aspect ratio of ImageCapture to the target cropping aspect ratio.
+        val targetCroppingAspectRatio = if (isRotateNeeded) Rational(3, 4) else Rational(4, 3)
+
+        useCase.setCropAspectRatio(targetCroppingAspectRatio)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        // After target rotation is updated, the result cropping aspect ratio should still the
+        // same as original one.
+        val imageProperties = callback.results.first()
+        val cropRect = imageProperties.cropRect
+
+        // Rotate the captured ImageProxy's crop rect into the coordinate space of the final
+        // displayed image
+        val resultCroppingRatio: Rational = if (imageProperties.rotationDegrees % 180 != 0) {
+            Rational(cropRect!!.height(), cropRect.width())
+        } else {
+            Rational(cropRect!!.width(), cropRect.height())
+        }
+
+        if (imageProperties.format == ImageFormat.JPEG) {
+            assertThat(imageProperties.rotationDegrees).isEqualTo(
+                imageProperties.exif!!.rotation
+            )
+        }
+
+        // Compare aspect ratio with a threshold due to floating point rounding. Can't do direct
+        // comparison of height and width, because the target aspect ratio of ImageCapture will
+        // be corrected in API 21 Legacy devices and the captured image will be scaled to fit
+        // within the cropping aspect ratio.
+        val aspectRatioThreshold = 0.01
+        assertThat(
+            abs(resultCroppingRatio.toDouble() - targetCroppingAspectRatio.toDouble())
+        ).isLessThan(aspectRatioThreshold)
+    }
+
+    @Test
+    fun useCaseConfigCanBeReset_afterUnbind() = runBlocking {
+        val useCase = defaultBuilder.build()
+        val initialConfig = useCase.currentConfig
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        withContext(Dispatchers.Main) {
+            camera.removeUseCases(setOf(useCase))
+        }
+
+        val configAfterUnbinding = useCase.currentConfig
+        assertThat(initialConfig == configAfterUnbinding).isTrue()
+    }
+
+    @Test
+    fun targetRotationIsRetained_whenUseCaseIsReused() = runBlocking {
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, 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))
+        }
+
+        // Check the target rotation is kept when the use case is unbound.
+        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, BACK_SELECTOR, useCase)
+        assertThat(useCase.targetRotation).isEqualTo(Surface.ROTATION_180)
+    }
+
+    @Test
+    fun cropAspectRatioIsRetained_whenUseCaseIsReused() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = defaultBuilder.build()
+        val cropAspectRatio = Rational(1, 1)
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        useCase.setCropAspectRatio(cropAspectRatio)
+
+        withContext(Dispatchers.Main) {
+            // Unbind the use case.
+            camera.removeUseCases(setOf(useCase))
+        }
+
+        // Rebind the use case.
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+        val cropRect = imageProperties.cropRect
+        val cropRectAspectRatio = Rational(cropRect!!.height(), cropRect.width())
+
+        // The crop aspect ratio could be kept after the use case is reused. So that the aspect
+        // of the result cropRect is 1:1.
+        assertThat(cropRectAspectRatio).isEqualTo(cropAspectRatio)
+    }
+
+    @Test
+    fun useCaseCanBeReusedInSameCamera() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation1 = File.createTempFile("test1", ".jpg")
+        saveLocation1.deleteOnExit()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation1).build(),
+            mainExecutor,
+            callback
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        withContext(Dispatchers.Main) {
+            // Unbind the use case.
+            camera.removeUseCases(setOf(useCase))
+        }
+
+        // Rebind the use case to the same camera.
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation2 = File.createTempFile("test2", ".jpg")
+        saveLocation2.deleteOnExit()
+
+        val callback2 = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation2).build(),
+            mainExecutor,
+            callback2
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback2.awaitCapturesAndAssert(savedImagesCount = 1)
+    }
+
+    @Test
+    fun useCaseCanBeReusedInDifferentCamera() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val useCase = defaultBuilder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val saveLocation1 = File.createTempFile("test1", ".jpg")
+        saveLocation1.deleteOnExit()
+
+        val callback = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation1).build(),
+            mainExecutor,
+            callback
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback.awaitCapturesAndAssert(savedImagesCount = 1)
+
+        withContext(Dispatchers.Main) {
+            // Unbind the use case.
+            camera.removeUseCases(setOf(useCase))
+        }
+
+        // Rebind the use case to different camera.
+        camera = CameraUtil.createCameraAndAttachUseCase(
+            context,
+            CameraSelector.DEFAULT_FRONT_CAMERA,
+            useCase
+        )
+
+        val saveLocation2 = File.createTempFile("test2", ".jpg")
+        saveLocation2.deleteOnExit()
+
+        val callback2 = FakeImageSavedCallback(capturesCount = 1)
+
+        useCase.takePicture(
+            ImageCapture.OutputFileOptions.Builder(saveLocation2).build(),
+            mainExecutor,
+            callback2
+        )
+
+        // Wait for the signal that the image has been saved.
+        callback2.awaitCapturesAndAssert(savedImagesCount = 1)
+    }
+
+    @Test
+    fun returnValidTargetRotation_afterUseCaseIsCreated() {
+        val imageCapture = ImageCapture.Builder().build()
+        assertThat(imageCapture.targetRotation).isNotEqualTo(ImageOutputConfig.INVALID_ROTATION)
+    }
+
+    @Test
+    fun returnCorrectTargetRotation_afterUseCaseIsAttached() {
+        val imageCapture = ImageCapture.Builder()
+            .setTargetRotation(Surface.ROTATION_180)
+            .build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        assertThat(imageCapture.targetRotation).isEqualTo(Surface.ROTATION_180)
+    }
+
+    @Test
+    fun returnDefaultFlashMode_beforeUseCaseIsAttached() {
+        val imageCapture = ImageCapture.Builder().build()
+        assertThat(imageCapture.flashMode).isEqualTo(ImageCapture.FLASH_MODE_OFF)
+    }
+
+    @Test
+    fun returnCorrectFlashMode_afterUseCaseIsAttached() {
+        val imageCapture = ImageCapture.Builder()
+            .setFlashMode(ImageCapture.FLASH_MODE_ON)
+            .build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        assertThat(imageCapture.flashMode).isEqualTo(ImageCapture.FLASH_MODE_ON)
+    }
+
+    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices whose
+    // API level is at least 29.
+    @Test
+    @SdkSuppress(minSdkVersion = 29)
+    fun returnJpegImage_whenSoftwareJpegIsEnabled() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val builder = ImageCapture.Builder()
+
+        // Enables software Jpeg
+        builder.mutableConfig.insertOption(
+            ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER,
+            true
+        )
+
+        val useCase = builder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+
+        // Check the output image rotation degrees value is correct.
+        assertThat(imageProperties.rotationDegrees).isEqualTo(
+            camera.cameraInfo.getSensorRotationDegrees(useCase.targetRotation)
+        )
+
+        // Check the output format is correct.
+        assertThat(imageProperties.format).isEqualTo(ImageFormat.JPEG)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun returnYuvImage_whenSoftwareJpegIsEnabledWithYuvBufferFormat() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val builder = ImageCapture.Builder().setBufferFormat(ImageFormat.YUV_420_888)
+
+        // Enables software Jpeg
+        builder.mutableConfig.insertOption(
+            ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER,
+            true
+        )
+
+        val useCase = builder.build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+
+        // Check the output image rotation degrees value is correct.
+        assertThat(imageProperties.rotationDegrees).isEqualTo(
+            camera.cameraInfo.getSensorRotationDegrees(useCase.targetRotation)
+        )
+        // Check the output format is correct.
+        assertThat(imageProperties.format).isEqualTo(ImageFormat.YUV_420_888)
+    }
+
+    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices that
+    // API level is at least 29.
+    @Test
+    @SdkSuppress(minSdkVersion = 29)
+    fun returnJpegImage_whenCaptureProcessorIsSet() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val builder = ImageCapture.Builder()
+        val simpleCaptureProcessor = SimpleCaptureProcessor()
+
+        // Set a CaptureProcessor to directly pass the image to output surface.
+        val useCase = builder.setCaptureProcessor(simpleCaptureProcessor).build()
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+
+        // Check the output image rotation degrees value is correct.
+        assertThat(imageProperties.rotationDegrees).isEqualTo(
+            camera.cameraInfo.getSensorRotationDegrees(useCase.targetRotation)
+        )
+        // Check the output format is correct.
+        assertThat(imageProperties.format).isEqualTo(ImageFormat.JPEG)
+        simpleCaptureProcessor.close()
+    }
+
+    // Output JPEG format image when setting a CaptureProcessor is only enabled for devices that
+    // API level is at least 29.
+    @Test
+    @SdkSuppress(minSdkVersion = 29)
+    fun returnJpegImage_whenSoftwareJpegIsEnabledWithCaptureProcessor() = runBlocking {
+        skipTestOnCameraPipeConfig()
+
+        val builder = ImageCapture.Builder()
+        val simpleCaptureProcessor = SimpleCaptureProcessor()
+
+        // Set a CaptureProcessor to directly pass the image to output surface.
+        val useCase = builder.setCaptureProcessor(simpleCaptureProcessor).build()
+
+        // Enables software Jpeg
+        builder.mutableConfig.insertOption(
+            ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER,
+            true
+        )
+
+        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+
+        val callback = FakeImageCaptureCallback(capturesCount = 1)
+        useCase.takePicture(mainExecutor, callback)
+
+        // Wait for the signal that the image has been captured.
+        callback.awaitCapturesAndAssert(capturedImagesCount = 1)
+
+        val imageProperties = callback.results.first()
+
+        // Check the output image rotation degrees value is correct.
+        assertThat(imageProperties.rotationDegrees).isEqualTo(
+            camera.cameraInfo.getSensorRotationDegrees(useCase.targetRotation)
+        )
+        // Check the output format is correct.
+        assertThat(imageProperties.format).isEqualTo(ImageFormat.JPEG)
+        simpleCaptureProcessor.close()
+    }
+
+    private fun createNonRotatedConfiguration(): ImageCaptureConfig {
+        // Create a configuration with target rotation that matches the sensor rotation.
+        // This assumes a back-facing camera (facing away from screen)
+        val sensorRotation = CameraUtil.getSensorOrientation(BACK_LENS_FACING)
+        val surfaceRotation = CameraOrientationUtil.degreesToSurfaceRotation(
+            sensorRotation!!
+        )
+        return ImageCapture.Builder()
+            .setTargetRotation(surfaceRotation)
+            .useCaseConfig
+    }
+
+    @Suppress("DEPRECATION")
+    private fun createDefaultPictureFolderIfNotExist() {
+        val pictureFolder = Environment.getExternalStoragePublicDirectory(
+            Environment.DIRECTORY_PICTURES
+        )
+        if (!pictureFolder.exists()) {
+            pictureFolder.mkdir()
+        }
+    }
+
+    // TODO(b/185260678): Remove when image capture support is added to Camera-pipe-integration
+    private fun skipTestOnCameraPipeConfig() {
+        assumeFalse(
+            "Image capture isn't supported on Camera-pipe-integration (b/185260678)",
+            implName == CameraPipeConfig::class.simpleName
+        )
+    }
+
+    private class ImageProperties(
+        val size: Size? = null,
+        val format: Int = -1,
+        val rotationDegrees: Int = -1,
+        val cropRect: Rect? = null,
+        val exif: Exif? = null,
+    )
+
+    private class FakeImageCaptureCallback(capturesCount: Int) :
+        ImageCapture.OnImageCapturedCallback() {
+
+        private val latch = CountdownDeferred(capturesCount)
+        val results = mutableListOf<ImageProperties>()
+        val errors = mutableListOf<ImageCaptureException>()
+
+        override fun onCaptureSuccess(image: ImageProxy) {
+            results.add(
+                ImageProperties(
+                    size = Size(image.width, image.height),
+                    format = image.format,
+                    rotationDegrees = image.imageInfo.rotationDegrees,
+                    cropRect = image.cropRect,
+                    exif = getExif(image),
+                )
+            )
+            image.close()
+            latch.countDown()
+        }
+
+        override fun onError(exception: ImageCaptureException) {
+            errors.add(exception)
+            latch.countDown()
+        }
+
+        private fun getExif(image: ImageProxy): Exif? {
+            if (image.format == ImageFormat.JPEG) {
+                val planes = image.planes
+                val buffer = planes[0].buffer
+                val data = ByteArray(buffer.capacity())
+                buffer[data]
+                return Exif.createFromInputStream(ByteArrayInputStream(data))
+            }
+            return null
+        }
+
+        suspend fun awaitCaptures(timeout: Long = CAPTURE_TIMEOUT) {
+            withTimeout(timeout) {
+                latch.await()
+            }
+        }
+
+        suspend fun awaitCapturesAndAssert(
+            timeout: Long = CAPTURE_TIMEOUT,
+            capturedImagesCount: Int = 0,
+            errorsCount: Int = 0
+        ) {
+            withTimeout(timeout) {
+                latch.await()
+            }
+            assertThat(results.size).isEqualTo(capturedImagesCount)
+            assertThat(errors.size).isEqualTo(errorsCount)
+        }
+    }
+
+    private class FakeImageSavedCallback(capturesCount: Int) :
+        ImageCapture.OnImageSavedCallback {
+
+        private val latch = CountdownDeferred(capturesCount)
+        val results = mutableListOf<ImageCapture.OutputFileResults>()
+        val errors = mutableListOf<ImageCaptureException>()
+
+        override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
+            results.add(outputFileResults)
+            latch.countDown()
+        }
+
+        override fun onError(exception: ImageCaptureException) {
+            errors.add(exception)
+            latch.countDown()
+        }
+
+        suspend fun awaitCapturesAndAssert(
+            timeout: Long = CAPTURE_TIMEOUT,
+            savedImagesCount: Int = 0,
+            errorsCount: Int = 0
+        ) {
+            withTimeout(timeout) {
+                latch.await()
+            }
+            assertThat(results.size).isEqualTo(savedImagesCount)
+            assertThat(errors.size).isEqualTo(errorsCount)
+        }
+    }
+
+    private class SimpleCaptureProcessor : CaptureProcessor {
+
+        private var imageWriter: ImageWriter? = null
+
+        override fun onOutputSurface(surface: Surface, imageFormat: Int) {
+            imageWriter = ImageWriter.newInstance(surface, 2)
+        }
+
+        override fun process(bundle: ImageProxyBundle) {
+            val imageProxyListenableFuture = bundle.getImageProxy(bundle.captureIds[0])
+            try {
+                val imageProxy = imageProxyListenableFuture.get()
+                // Directly passing the input YUV image to the output surface.
+                imageWriter!!.queueInputImage(imageProxy.image)
+            } catch (exception: ExecutionException) {
+                throw IllegalArgumentException(
+                    "Can't extract ImageProxy from the ImageProxyBundle.",
+                    exception
+                )
+            } catch (exception: InterruptedException) {
+                throw IllegalArgumentException(
+                    "Can't extract ImageProxy from the ImageProxyBundle.",
+                    exception
+                )
+            }
+        }
+
+        override fun onResolutionUpdate(size: Size) {}
+
+        fun close() {
+            imageWriter?.close()
+        }
+    }
+
+    private class CountdownDeferred(count: Int) {
+
+        private val deferredItems = mutableListOf<CompletableDeferred<Unit>>().apply {
+            repeat(count) { add(CompletableDeferred()) }
+        }
+        private var index = 0
+
+        fun countDown() {
+            deferredItems[index++].complete(Unit)
+        }
+
+        suspend fun await() {
+            deferredItems.forEach { it.await() }
+        }
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..3d518ba
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/YuvToRgbConverterTest.kt
@@ -0,0 +1,127 @@
+/*
+ * 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.integration.core
+
+import android.content.Context
+import android.graphics.Bitmap
+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.testing.CameraUtil
+import androidx.camera.testing.LabTestRule
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.LargeTest
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.asExecutor
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+import org.junit.After
+import org.junit.Assert.assertTrue
+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 org.junit.runners.Parameterized
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+// Test the YubToRgbConverter to convert the input image from CameraX
+@LargeTest
+@RunWith(Parameterized::class)
+class YuvToRgbConverterTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig
+) {
+    @get:Rule
+    val useCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+
+    @get:Rule
+    val labTest: LabTestRule = LabTestRule()
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var camera: CameraUseCaseAdapter
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "{0}")
+        fun data() = listOf(
+            arrayOf(Camera2Config::class.simpleName, Camera2Config.defaultConfig()),
+            arrayOf(CameraPipeConfig::class.simpleName, CameraPipeConfig.defaultConfig())
+        )
+    }
+
+    @Before
+    fun setUp() {
+        Assume.assumeTrue(CameraUtil.deviceHasCamera())
+        CameraX.initialize(context, cameraXConfig).get(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
+            withContext(Dispatchers.Main) {
+                camera.removeUseCases(camera.useCases)
+            }
+        }
+        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+    }
+
+    @LabTestRule.LabTestOnly
+    @Test
+    fun yubToRgbConverterTest() {
+        val yuvToRgbConverter = YuvToRgbConverter(context)
+        val countDownLatch = CountDownLatch(30)
+        val imageAnalyzer = ImageAnalysis.Builder().build().also {
+            it.setAnalyzer(
+                Dispatchers.Main.asExecutor(),
+                { image ->
+                    var bitmap: Bitmap? = null
+                    try {
+                        bitmap = Bitmap.createBitmap(
+                            image.width, image.height, Bitmap.Config.ARGB_8888
+                        )
+                        yuvToRgbConverter.yuvToRgb(image.image!!, bitmap)
+
+                        // Test the YuvToRgbConverter#yuvToRgb can convert the image to bitmap
+                        // successfully without any exception.
+                        countDownLatch.countDown()
+                    } finally {
+                        bitmap?.recycle()
+                        image.close()
+                    }
+                }
+            )
+        }
+
+        camera = CameraUtil.createCameraAndAttachUseCase(
+            context,
+            CameraSelector.DEFAULT_BACK_CAMERA,
+            imageAnalyzer
+        )
+
+        assertTrue(countDownLatch.await(60, TimeUnit.SECONDS))
+    }
+}
\ No newline at end of file
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/YuvToRgbConverter.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/YuvToRgbConverter.kt
new file mode 100644
index 0000000..424f50c
--- /dev/null
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/YuvToRgbConverter.kt
@@ -0,0 +1,191 @@
+/*
+ * 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.integration.core.util
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.ImageFormat
+import android.graphics.Rect
+import android.media.Image
+import java.nio.ByteBuffer
+
+/**
+ * Copy from the github for testing.
+ * Please reference: https://github.com/android/camera-samples/
+ *
+ * Helper class used to efficiently convert a Media.Image object from
+ * [ImageFormat.YUV_420_888] format to an RGB [Bitmap] object.
+ *
+ * The [yuvToRgb] method is able to achieve the same FPS as the CameraX image
+ * analysis use case on a Pixel 3 XL device at the default analyzer resolution,
+ * which is 30 FPS with 640x480.
+ *
+ * NOTE: This has been tested in a limited number of devices and is not
+ * considered production-ready code. It was created for illustration purposes,
+ * since this is not an efficient camera pipeline due to the multiple copies
+ * required to convert each frame.
+ */
+@Suppress("DEPRECATION")
+class YuvToRgbConverter(context: Context) {
+    private val rs = android.renderscript.RenderScript.create(context)
+    private val scriptYuvToRgb = android.renderscript.ScriptIntrinsicYuvToRGB.create(
+        rs,
+        android.renderscript.Element.U8_4(rs)
+    )
+
+    private var pixelCount: Int = -1
+    private lateinit var yuvBuffer: ByteBuffer
+    private lateinit var inputAllocation: android.renderscript.Allocation
+    private lateinit var outputAllocation: android.renderscript.Allocation
+
+    @SuppressLint("BanSynchronizedMethods")
+    @Synchronized
+    fun yuvToRgb(image: Image, output: Bitmap) {
+
+        // Ensure that the intermediate output byte buffer is allocated
+        if (!::yuvBuffer.isInitialized) {
+            pixelCount = image.cropRect.width() * image.cropRect.height()
+            yuvBuffer = ByteBuffer.allocateDirect(
+                pixelCount * ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8
+            )
+        }
+
+        // Get the YUV data in byte array form
+        imageToByteBuffer(image, yuvBuffer)
+
+        // Ensure that the RenderScript inputs and outputs are allocated
+        if (!::inputAllocation.isInitialized) {
+            inputAllocation = android.renderscript.Allocation.createSized(
+                rs,
+                android.renderscript.Element.U8(rs),
+                yuvBuffer.array().size
+            )
+        }
+        if (!::outputAllocation.isInitialized) {
+            outputAllocation = android.renderscript.Allocation.createFromBitmap(rs, output)
+        }
+
+        // Convert YUV to RGB
+        inputAllocation.copyFrom(yuvBuffer.array())
+        scriptYuvToRgb.setInput(inputAllocation)
+        scriptYuvToRgb.forEach(outputAllocation)
+        outputAllocation.copyTo(output)
+    }
+
+    private fun imageToByteBuffer(image: Image, outputBuffer: ByteBuffer) {
+        if (image.format != ImageFormat.YUV_420_888)
+            throw AssertionError("ImageFormat incorrect")
+
+        val imageCrop = image.cropRect
+        val imagePlanes = image.planes
+        val rowData = ByteArray(imagePlanes.first().rowStride)
+
+        imagePlanes.forEachIndexed { planeIndex, plane ->
+
+            // How many values are read in input for each output value written
+            // Only the Y plane has a value for every pixel, U and V have half the resolution i.e.
+            //
+            // Y Plane            U Plane    V Plane
+            // ===============    =======    =======
+            // Y Y Y Y Y Y Y Y    U U U U    V V V V
+            // Y Y Y Y Y Y Y Y    U U U U    V V V V
+            // Y Y Y Y Y Y Y Y    U U U U    V V V V
+            // Y Y Y Y Y Y Y Y    U U U U    V V V V
+            // Y Y Y Y Y Y Y Y
+            // Y Y Y Y Y Y Y Y
+            // Y Y Y Y Y Y Y Y
+            val outputStride: Int
+
+            // The index in the output buffer the next value will be written at
+            // For Y it's zero, for U and V we start at the end of Y and interleave them i.e.
+            //
+            // First chunk        Second chunk
+            // ===============    ===============
+            // Y Y Y Y Y Y Y Y    U V U V U V U V
+            // Y Y Y Y Y Y Y Y    U V U V U V U V
+            // Y Y Y Y Y Y Y Y    U V U V U V U V
+            // Y Y Y Y Y Y Y Y    U V U V U V U V
+            // Y Y Y Y Y Y Y Y
+            // Y Y Y Y Y Y Y Y
+            // Y Y Y Y Y Y Y Y
+            var outputOffset: Int
+
+            when (planeIndex) {
+                0 -> {
+                    outputStride = 1
+                    outputOffset = 0
+                }
+                1 -> {
+                    outputStride = 2
+                    outputOffset = pixelCount + 1
+                }
+                2 -> {
+                    outputStride = 2
+                    outputOffset = pixelCount
+                }
+                else -> {
+                    // Image contains more than 3 planes, something strange is going on
+                    return@forEachIndexed
+                }
+            }
+
+            val buffer = plane.buffer
+            val rowStride = plane.rowStride
+            val pixelStride = plane.pixelStride
+
+            // We have to divide the width and height by two if it's not the Y plane
+            val planeCrop = if (planeIndex == 0) {
+                imageCrop
+            } else {
+                Rect(
+                    imageCrop.left / 2,
+                    imageCrop.top / 2,
+                    imageCrop.right / 2,
+                    imageCrop.bottom / 2
+                )
+            }
+
+            val planeWidth = planeCrop.width()
+            val planeHeight = planeCrop.height()
+
+            buffer.position(rowStride * planeCrop.top + pixelStride * planeCrop.left)
+            for (row in 0 until planeHeight) {
+                val length: Int
+                if (pixelStride == 1 && outputStride == 1) {
+                    // When there is a single stride value for pixel and output, we can just copy
+                    // the entire row in a single step
+                    length = planeWidth
+                    buffer.get(outputBuffer.array(), outputOffset, length)
+                    outputOffset += length
+                } else {
+                    // When either pixel or output have a stride > 1 we must copy pixel by pixel
+                    length = (planeWidth - 1) * pixelStride + 1
+                    buffer.get(rowData, 0, length)
+                    for (col in 0 until planeWidth) {
+                        outputBuffer.array()[outputOffset] = rowData[col * pixelStride]
+                        outputOffset += outputStride
+                    }
+                }
+
+                if (row < planeHeight - 1) {
+                    buffer.position(buffer.position() + rowStride - length)
+                }
+            }
+        }
+    }
+}
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 6c2f515..c990c34 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -39,6 +39,7 @@
 import android.util.Range;
 import android.util.Rational;
 import android.view.Display;
+import android.view.GestureDetector;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.View;
@@ -58,18 +59,21 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
 import androidx.annotation.VisibleForTesting;
-import androidx.annotation.experimental.UseExperimental;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
+import androidx.camera.core.DisplayOrientedMeteringPointFactory;
 import androidx.camera.core.ExperimentalUseCaseGroup;
 import androidx.camera.core.ExposureState;
+import androidx.camera.core.FocusMeteringAction;
+import androidx.camera.core.FocusMeteringResult;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.ImageProxy;
+import androidx.camera.core.MeteringPointFactory;
 import androidx.camera.core.Preview;
 import androidx.camera.core.TorchState;
 import androidx.camera.core.UseCase;
@@ -77,7 +81,6 @@
 import androidx.camera.core.VideoCapture;
 import androidx.camera.core.ViewPort;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.camera.lifecycle.ExperimentalUseCaseGroupLifecycle;
 import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.core.content.ContextCompat;
 import androidx.core.math.MathUtils;
@@ -142,10 +145,10 @@
 
     // TODO: Move the analysis processing, capture processing to separate threads, so
     // there is smaller impact on the preview.
-    private View mViewFinder;
+    View mViewFinder;
     private List<UseCase> mUseCases;
     private ExecutorService mImageCaptureExecutorService;
-    private Camera mCamera;
+    Camera mCamera;
 
     private ToggleButton mVideoToggle;
     private ToggleButton mPhotoToggle;
@@ -583,7 +586,7 @@
         mTextView = findViewById(R.id.textView);
 
         setUpButtonEvents();
-        setupPinchToZoom();
+        setupViewFinderGestureControls();
 
         mImageAnalysisResult.observe(
                 this,
@@ -837,21 +840,10 @@
     }
 
     /**
-     * Workaround method for an AndroidX issue where {@link UseExperimental} doesn't support 2 or
-     * more annotations.
-     */
-    @OptIn(markerClass = ExperimentalUseCaseGroupLifecycle.class)
-    private Camera bindToLifecycleSafely(List<UseCase> useCases) {
-        Log.e(TAG, "Binding use cases " + useCases);
-        return bindToLifecycleSafelyWithExperimental(useCases);
-    }
-
-    /**
      * Binds use cases to the current lifecycle.
      */
     @OptIn(markerClass = ExperimentalUseCaseGroup.class)
-    @ExperimentalUseCaseGroupLifecycle
-    private Camera bindToLifecycleSafelyWithExperimental(List<UseCase> useCases) {
+    private Camera bindToLifecycleSafely(List<UseCase> useCases) {
         ViewPort viewPort = new ViewPort.Builder(new Rational(mViewFinder.getWidth(),
                 mViewFinder.getHeight()),
                 mViewFinder.getDisplay().getRotation())
@@ -914,19 +906,39 @@
                 }
             };
 
-    private void setupPinchToZoom() {
-        ScaleGestureDetector scaleDetector = new ScaleGestureDetector(this, mScaleGestureListener);
-        mViewFinder.setOnTouchListener(new View.OnTouchListener() {
-            @Override
-            public boolean onTouch(View view, MotionEvent motionEvent) {
-                scaleDetector.onTouchEvent(motionEvent);
+    GestureDetector.OnGestureListener onTapGestureListener =
+            new GestureDetector.SimpleOnGestureListener() {
+                @Override
+                public boolean onSingleTapUp(MotionEvent e) {
+                    // Since we are showing full camera preview we will be using
+                    // DisplayOrientedMeteringPointFactory to map the view's (x, y) to a
+                    // metering point.
+                    MeteringPointFactory factory =
+                            new DisplayOrientedMeteringPointFactory(
+                                    mViewFinder.getDisplay(),
+                                    mCamera.getCameraInfo(),
+                                    mViewFinder.getWidth(),
+                                    mViewFinder.getHeight());
+                    FocusMeteringAction action = new FocusMeteringAction.Builder(
+                            factory.createPoint(e.getX(), e.getY())
+                    ).build();
+                    Futures.addCallback(
+                            mCamera.getCameraControl().startFocusAndMetering(action),
+                            new FutureCallback<FocusMeteringResult>() {
+                                @Override
+                                public void onSuccess(FocusMeteringResult result) {
+                                    Log.d(TAG, "Focus and metering succeeded.");
+                                }
 
-                return true;
-            }
-        });
-
-
-    }
+                                @Override
+                                public void onFailure(Throwable t) {
+                                    Log.e(TAG, "Focus and metering failed.", t);
+                                }
+                            },
+                            CameraXExecutors.mainThreadExecutor());
+                    return true;
+                }
+            };
 
     private void setupZoomSeeker() {
         CameraControl cameraControl = mCamera.getCameraControl();
@@ -981,6 +993,16 @@
             });
     }
 
+    private void setupViewFinderGestureControls() {
+        GestureDetector tapGestureDetector = new GestureDetector(this, onTapGestureListener);
+        ScaleGestureDetector scaleDetector = new ScaleGestureDetector(this, mScaleGestureListener);
+        mViewFinder.setOnTouchListener((view, e) -> {
+            boolean tapEventProcessed = tapGestureDetector.onTouchEvent(e);
+            boolean scaleEventProcessed = scaleDetector.onTouchEvent(e);
+            return tapEventProcessed || scaleEventProcessed;
+        });
+    }
+
     /** Gets the absolute path from a Uri. */
     @Nullable
     @SuppressWarnings("deprecation")
diff --git a/camera/integration-tests/coretestapp/src/main/res/values/strings.xml b/camera/integration-tests/coretestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/coretestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/coretestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/camera/integration-tests/extensionstestapp/lint-baseline.xml b/camera/integration-tests/extensionstestapp/lint-baseline.xml
index b628f0e..ce123d0 100644
--- a/camera/integration-tests/extensionstestapp/lint-baseline.xml
+++ b/camera/integration-tests/extensionstestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnsupportedChromeOsHardware"
@@ -30,7 +30,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java"
-            line="261"
+            line="277"
             column="29"/>
     </issue>
 
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index a121fac..d84d77d 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -184,15 +184,19 @@
         // Check that extension can be enabled and if so enable it
         @Extensions.ExtensionMode
         int extensionMode = extensionModeFrom(imageCaptureType);
-        boolean extensionAvailable = mExtensions.isExtensionAvailable(mCamera, extensionMode);
-        if (extensionAvailable) {
-            Log.d(TAG, "Enabling extension mode: " + imageCaptureType.name());
-            mExtensions.setExtension(mCamera, extensionMode);
-        } else {
-            Log.d(TAG, "Unable to enable extension mode, skipping: " + imageCaptureType.name());
+
+        if (!mExtensions.isExtensionAvailable(mCameraProvider, mCurrentCameraSelector,
+                extensionMode)) {
             return false;
         }
 
+        CameraSelector cameraSelector = mExtensions.getExtensionCameraSelector(
+                mCurrentCameraSelector, extensionMode);
+
+        mCameraProvider.unbindAll();
+
+        mCameraProvider.bindToLifecycle(this, cameraSelector, mImageCapture, mPreview);
+
         // Update the UI and save location for ImageCapture
         Button toggleButton = findViewById(R.id.PhotoToggle);
         toggleButton.setText(mCurrentImageCaptureType.toString());
diff --git a/camera/integration-tests/extensionstestapp/src/main/res/values/strings.xml b/camera/integration-tests/extensionstestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/extensionstestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/extensionstestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/camera/integration-tests/extensionstestlib/lint-baseline.xml b/camera/integration-tests/extensionstestlib/lint-baseline.xml
index e747a11..bafcebb 100644
--- a/camera/integration-tests/extensionstestlib/lint-baseline.xml
+++ b/camera/integration-tests/extensionstestlib/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mImageWriter.queueInputImage(image);"
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mImageWriter.queueInputImage(image);"
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mImageWriter.queueInputImage(image);"
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            Image outputImage = mImageWriter.dequeueInputImage();"
         errorLine2="                                                             ~~~~~~~~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter.queueInputImage(outputImage);"
         errorLine2="                                         ~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mImageWriter = ImageWriter.newInstance(surface, 1);"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                Image image = mImageWriter.dequeueInputImage();"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mImageWriter.queueInputImage(image);"
         errorLine2="                                             ~~~~~~~~~~~~~~~">
         <location
@@ -261,7 +261,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="163"
+            line="169"
             column="12"/>
     </issue>
 
@@ -272,7 +272,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="173"
+            line="179"
             column="12"/>
     </issue>
 
@@ -283,7 +283,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java"
-            line="188"
+            line="194"
             column="12"/>
     </issue>
 
@@ -294,7 +294,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="46"
+            line="47"
             column="22"/>
     </issue>
 
@@ -305,7 +305,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="46"
+            line="47"
             column="39"/>
     </issue>
 
@@ -316,7 +316,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="62"
+            line="63"
             column="12"/>
     </issue>
 
@@ -327,7 +327,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="72"
+            line="73"
             column="12"/>
     </issue>
 
@@ -338,7 +338,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="77"
+            line="78"
             column="12"/>
     </issue>
 
@@ -349,7 +349,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="82"
+            line="83"
             column="12"/>
     </issue>
 
@@ -360,7 +360,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="87"
+            line="88"
             column="24"/>
     </issue>
 
@@ -371,7 +371,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="87"
+            line="88"
             column="41"/>
     </issue>
 
@@ -382,7 +382,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="88"
+            line="89"
             column="13"/>
     </issue>
 
@@ -393,7 +393,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="98"
+            line="99"
             column="12"/>
     </issue>
 
@@ -404,7 +404,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="108"
+            line="115"
             column="12"/>
     </issue>
 
@@ -415,7 +415,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java"
-            line="118"
+            line="125"
             column="12"/>
     </issue>
 
@@ -514,7 +514,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="168"
+            line="174"
             column="12"/>
     </issue>
 
@@ -525,7 +525,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="178"
+            line="184"
             column="12"/>
     </issue>
 
@@ -536,7 +536,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java"
-            line="193"
+            line="199"
             column="12"/>
     </issue>
 
@@ -547,7 +547,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="51"
+            line="52"
             column="22"/>
     </issue>
 
@@ -558,7 +558,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="51"
+            line="52"
             column="39"/>
     </issue>
 
@@ -569,7 +569,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="68"
+            line="69"
             column="12"/>
     </issue>
 
@@ -580,7 +580,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="78"
+            line="79"
             column="12"/>
     </issue>
 
@@ -591,7 +591,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="83"
+            line="84"
             column="12"/>
     </issue>
 
@@ -602,7 +602,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="88"
+            line="89"
             column="12"/>
     </issue>
 
@@ -613,7 +613,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="108"
+            line="109"
             column="24"/>
     </issue>
 
@@ -624,7 +624,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="108"
+            line="109"
             column="41"/>
     </issue>
 
@@ -635,7 +635,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="109"
+            line="110"
             column="13"/>
     </issue>
 
@@ -646,7 +646,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="119"
+            line="120"
             column="12"/>
     </issue>
 
@@ -657,7 +657,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="129"
+            line="136"
             column="12"/>
     </issue>
 
@@ -668,7 +668,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java"
-            line="139"
+            line="146"
             column="12"/>
     </issue>
 
@@ -767,7 +767,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="164"
+            line="170"
             column="12"/>
     </issue>
 
@@ -778,7 +778,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="174"
+            line="180"
             column="12"/>
     </issue>
 
@@ -789,7 +789,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java"
-            line="189"
+            line="195"
             column="12"/>
     </issue>
 
@@ -800,7 +800,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="49"
+            line="50"
             column="22"/>
     </issue>
 
@@ -811,7 +811,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="49"
+            line="50"
             column="39"/>
     </issue>
 
@@ -822,7 +822,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="68"
+            line="69"
             column="12"/>
     </issue>
 
@@ -833,7 +833,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="73"
+            line="74"
             column="12"/>
     </issue>
 
@@ -844,7 +844,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="116"
+            line="117"
             column="12"/>
     </issue>
 
@@ -855,7 +855,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="121"
+            line="122"
             column="12"/>
     </issue>
 
@@ -866,7 +866,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="126"
+            line="127"
             column="24"/>
     </issue>
 
@@ -877,7 +877,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="126"
+            line="127"
             column="41"/>
     </issue>
 
@@ -888,7 +888,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="127"
+            line="128"
             column="13"/>
     </issue>
 
@@ -899,7 +899,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="137"
+            line="138"
             column="12"/>
     </issue>
 
@@ -910,7 +910,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="147"
+            line="154"
             column="12"/>
     </issue>
 
@@ -921,7 +921,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java"
-            line="157"
+            line="164"
             column="12"/>
     </issue>
 
@@ -932,7 +932,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java"
-            line="40"
+            line="41"
             column="26"/>
     </issue>
 
@@ -943,7 +943,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java"
-            line="52"
+            line="53"
             column="18"/>
     </issue>
 
@@ -954,7 +954,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java"
-            line="61"
+            line="62"
             column="29"/>
     </issue>
 
@@ -976,7 +976,7 @@
         errorLine2="                ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="17"/>
     </issue>
 
@@ -987,7 +987,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="34"/>
     </issue>
 
@@ -998,7 +998,7 @@
         errorLine2="                                                                              ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="41"
+            line="42"
             column="79"/>
     </issue>
 
@@ -1009,7 +1009,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="59"
+            line="62"
             column="5"/>
     </issue>
 
@@ -1020,7 +1020,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="70"
+            line="73"
             column="5"/>
     </issue>
 
@@ -1031,7 +1031,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java"
-            line="80"
+            line="83"
             column="5"/>
     </issue>
 
@@ -1152,7 +1152,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="237"
+            line="243"
             column="12"/>
     </issue>
 
@@ -1163,7 +1163,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="243"
+            line="249"
             column="12"/>
     </issue>
 
@@ -1174,7 +1174,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java"
-            line="254"
+            line="260"
             column="12"/>
     </issue>
 
@@ -1471,7 +1471,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="163"
+            line="169"
             column="12"/>
     </issue>
 
@@ -1482,7 +1482,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="173"
+            line="179"
             column="12"/>
     </issue>
 
@@ -1493,7 +1493,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java"
-            line="188"
+            line="194"
             column="12"/>
     </issue>
 
@@ -1504,7 +1504,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="46"
+            line="47"
             column="22"/>
     </issue>
 
@@ -1515,7 +1515,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="46"
+            line="47"
             column="39"/>
     </issue>
 
@@ -1526,7 +1526,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="62"
+            line="63"
             column="12"/>
     </issue>
 
@@ -1537,7 +1537,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="72"
+            line="73"
             column="12"/>
     </issue>
 
@@ -1548,7 +1548,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="77"
+            line="78"
             column="12"/>
     </issue>
 
@@ -1559,7 +1559,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="82"
+            line="83"
             column="12"/>
     </issue>
 
@@ -1570,7 +1570,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="87"
+            line="88"
             column="24"/>
     </issue>
 
@@ -1581,7 +1581,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="87"
+            line="88"
             column="41"/>
     </issue>
 
@@ -1592,7 +1592,7 @@
         errorLine2="            ~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="88"
+            line="89"
             column="13"/>
     </issue>
 
@@ -1603,7 +1603,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="98"
+            line="99"
             column="12"/>
     </issue>
 
@@ -1614,7 +1614,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="108"
+            line="115"
             column="12"/>
     </issue>
 
@@ -1625,7 +1625,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java"
-            line="118"
+            line="125"
             column="12"/>
     </issue>
 
@@ -1713,7 +1713,7 @@
         errorLine2="                 ~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java"
-            line="39"
+            line="40"
             column="18"/>
     </issue>
 
@@ -1724,7 +1724,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java"
-            line="39"
+            line="40"
             column="31"/>
     </issue>
 
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
index 7c9077f..6154482 100755
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -194,4 +195,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         return null;
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
+        return new Range<>(300L, 1000L);
+    }
 }
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
index e23aeb9..8380a7f 100755
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
@@ -26,6 +26,7 @@
 import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -220,4 +221,10 @@
 
         return formatResolutionsPairList;
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
+        return new Range<>(300L, 1000L);
+    }
 }
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
index eff6232..f0f7c59 100644
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -196,4 +197,9 @@
         return null;
     }
 
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
+        return new Range<>(300L, 1000L);
+    }
 }
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
index 2ac4548..d2ea323 100644
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -261,4 +262,9 @@
         return null;
     }
 
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
+        return new Range<>(300L, 1000L);
+    }
 }
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
index a488f14..884c0dd 100644
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
@@ -19,6 +19,7 @@
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 
 import androidx.annotation.Nullable;
@@ -80,5 +81,22 @@
      */
     @Nullable
     List<Pair<Integer, Size[]>> getSupportedResolutions();
+
+    /**
+     * Returns the estimated capture latency range in milliseconds for the target capture
+     * resolution.
+     *
+     * <p> This includes the time spent processing the multi-frame capture request along with any
+     * additional time for encoding of the processed buffer in the framework if necessary.
+     *
+     * @param captureOutputSize size of the capture output surface. If it is null or not in the
+     *                          supported output sizes, maximum capture output size is used for
+     *                          the estimation.
+     * @return the range of estimated minimal and maximal capture latency in milliseconds.
+     * Returns null if no capture latency info can be provided.
+     * @since 1.2
+     */
+    @Nullable
+    Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize);
 }
 
diff --git a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
index 1434871..405da8d 100755
--- a/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
+++ b/camera/integration-tests/extensionstestlib/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.Size;
 import android.view.Surface;
 
@@ -194,4 +195,10 @@
     public List<Pair<Integer, Size[]>> getSupportedResolutions() {
         return null;
     }
+
+    @Nullable
+    @Override
+    public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
+        return new Range<>(300L, 1000L);
+    }
 }
diff --git a/camera/integration-tests/timingtestapp/lint-baseline.xml b/camera/integration-tests/timingtestapp/lint-baseline.xml
index ee8072e..61d8df2 100644
--- a/camera/integration-tests/timingtestapp/lint-baseline.xml
+++ b/camera/integration-tests/timingtestapp/lint-baseline.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.camera.integration.antelope.CameraUtilsKt is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.camera.integration.antelope.CameraUtilsKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    physicalCameras = cameraChars.physicalCameraIds"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/camera/integration/antelope/CameraUtils.kt"
-            line="178"
+            line="190"
             column="51"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.camera.integration.antelope.cameracontrollers.CameraXControllerKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.camera.integration.antelope.cameracontrollers.CameraXControllerKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        released = texture.isReleased"
         errorLine2="                           ~~~~~~~~~~">
         <location
@@ -47,6 +47,149 @@
 
     <issue
         id="UnusedResources"
+        message="The resource `R.string.label_camera1` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_camera1&quot;>Camera1&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="21"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_camera2` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_camera2&quot;>Camera2&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="22"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_camerax` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_camerax&quot;>CameraX&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="23"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_size_max` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_size_max&quot;>Max image size&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="24"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_size_min` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_size_min&quot;>Min image size&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="25"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_focus_auto` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_focus_auto&quot;>Auto-focus&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="26"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_focus_continuous` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_focus_continuous&quot;>Continuous focus&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="27"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_camera` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_camera&quot;>Camera:&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="28"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.label_log` appears to be unused"
+        errorLine1="    &lt;string name=&quot;label_log&quot;>Log: &lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="32"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.settings_numtests_summary` appears to be unused"
+        errorLine1="    &lt;string name=&quot;settings_numtests_summary&quot;>Number of repetitions to do for repeated tests&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="46"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.settings_previewbuffer_summary` appears to be unused"
+        errorLine1="    &lt;string name=&quot;settings_previewbuffer_summary&quot;>Length of time to allow the preview buffer to run before trying to capture an image. Longer values will ensure the hardware frame buffer is full to offer accurate capture-only latency.&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="50"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.settings_autotest_header` appears to be unused"
+        errorLine1="    &lt;string name=&quot;settings_autotest_header&quot;>Auto-test settings&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="52"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.settings_autotest_header_key` appears to be unused"
+        errorLine1="    &lt;string name=&quot;settings_autotest_header_key&quot;>settings_autotest_header_key&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="53"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
         message="The resource `R.color.ic_launcher_background` appears to be unused"
         errorLine1="    &lt;color name=&quot;ic_launcher_background&quot;>#A617A1&lt;/color>"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -67,147 +210,4 @@
             column="1"/>
     </issue>
 
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera1` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera1&quot;>Camera1&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="21"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera2` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera2&quot;>Camera2&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="22"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camerax` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camerax&quot;>CameraX&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="23"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_size_max` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_size_max&quot;>Max image size&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="24"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_size_min` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_size_min&quot;>Min image size&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="25"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_focus_auto` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_focus_auto&quot;>Auto-focus&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="26"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_focus_continuous` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_focus_continuous&quot;>Continuous focus&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="27"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_camera` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_camera&quot;>Camera:&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="28"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.label_log` appears to be unused"
-        errorLine1="    &lt;string name=&quot;label_log&quot;>Log: &lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="32"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_numtests_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_numtests_summary&quot;>Number of repetitions to do for repeated tests&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="46"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_previewbuffer_summary` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_previewbuffer_summary&quot;>Length of time to allow the preview buffer to run before trying to capture an image. Longer values will ensure the hardware frame buffer is full to offer accurate capture-only latency.&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="50"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_autotest_header` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_autotest_header&quot;>Auto-test settings&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="52"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnusedResources"
-        message="The resource `R.string.settings_autotest_header_key` appears to be unused"
-        errorLine1="    &lt;string name=&quot;settings_autotest_header_key&quot;>settings_autotest_header_key&lt;/string>"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/values/strings.xml"
-            line="53"
-            column="13"/>
-    </issue>
-
 </issues>
diff --git a/camera/integration-tests/timingtestapp/src/main/res/values/strings.xml b/camera/integration-tests/timingtestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/timingtestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/timingtestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/camera/integration-tests/uiwidgetstestapp/build.gradle b/camera/integration-tests/uiwidgetstestapp/build.gradle
index 7d8e90f..e52e977 100644
--- a/camera/integration-tests/uiwidgetstestapp/build.gradle
+++ b/camera/integration-tests/uiwidgetstestapp/build.gradle
@@ -39,10 +39,6 @@
     }
 
     buildTypes {
-        debug {
-            testCoverageEnabled true
-        }
-
         release {
             minifyEnabled true
             shrinkResources true
diff --git a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml b/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
index 62b521c..c0a96b9 100644
--- a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
+++ b/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="PermissionImpliesUnsupportedChromeOsHardware"
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/res/values/strings.xml b/camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/uiwidgetstestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/camera/integration-tests/viewtestapp/lint-baseline.xml b/camera/integration-tests/viewtestapp/lint-baseline.xml
index adc33a7..2c3854f 100644
--- a/camera/integration-tests/viewtestapp/lint-baseline.xml
+++ b/camera/integration-tests/viewtestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
@@ -95,7 +95,7 @@
         errorLine1="    &lt;string name=&quot;preview&quot;>Preview&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="20"
             column="13"/>
     </issue>
@@ -106,8 +106,8 @@
         errorLine1="    &lt;string name=&quot;btn_confirm&quot;>Confirm&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
-            line="41"
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="42"
             column="13"/>
     </issue>
 
@@ -117,8 +117,8 @@
         errorLine1="    &lt;string name=&quot;btn_cancel&quot;>Cancel&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
-            line="42"
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="43"
             column="13"/>
     </issue>
 
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 4215020..5ee2e66 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
@@ -53,6 +53,7 @@
 import org.junit.Assume
 import org.junit.Assume.assumeTrue
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.ExpectedException
@@ -183,6 +184,7 @@
         fragment.assertAnalysisStreaming(true)
     }
 
+    @Ignore
     @Test
     fun analyzerCleared_isNotStreaming() {
         fragment.assertAnalysisStreaming(true)
@@ -229,6 +231,7 @@
     }
 
     @Test
+    @Ignore
     fun capturedImage_sameAsPreviewSnapshot() {
         // TODO(b/147448711) Add back in once cuttlefish has correct user cropping functionality.
         Assume.assumeFalse(
@@ -520,11 +523,14 @@
         val analysisStreaming = Semaphore(0)
         instrumentation.runOnMainSync {
             setWrappedAnalyzer {
-                it.close()
                 analysisStreaming.release()
             }
         }
-        assertThat(analysisStreaming.tryAcquire(TIMEOUT_SECONDS, TimeUnit.SECONDS)).isEqualTo(
+        // Wait for 2 analysis frames. It's necessary because even after the analyzer is removed on
+        // the main thread, there could already be a frame posted on user call back thread. For the
+        // default non-blocking mode, the max number of frame posted on user thread at the same
+        // time is 1. So we wait for one additional frame to make sure the analyzer has stopped.
+        assertThat(analysisStreaming.tryAcquire(2, TIMEOUT_SECONDS, TimeUnit.SECONDS)).isEqualTo(
             streaming
         )
     }
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraViewFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraViewFragment.java
index 4cf40a6..6a5e574 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraViewFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraViewFragment.java
@@ -20,6 +20,8 @@
 import android.content.pm.PackageManager;
 import android.graphics.Rect;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -58,6 +60,9 @@
     // strings (case-insensitive): "image", "video", "mixed"
     private static final String INTENT_EXTRA_CAPTURE_MODE = "captureMode";
 
+    // The time-out to wait for the ready of CameraProver in the CameraXModule of CameraView.
+    private static final int CAMERA_PROVIDER_READY_TIMEOUT = 2000;
+
     // Argument key which determines the lifecycle used to control the camera of CameraView.
     // Possible values for this argument key are LIFECYCLE_TYPE_ACTIVITY, LIFECYCLE_TYPE_FRAGMENT,
     // LIFECYCLE_TYPE_FRAGMENT_VIEW, LIFECYCLE_TYPE_CUSTOM. If using LIFECYCLE_TYPE_DEBUG, then
@@ -197,16 +202,23 @@
         // Set clickable, Let the cameraView can be interacted by Voice Access
         mCameraView.setClickable(true);
 
-        if (mToggleCameraButton != null) {
-            mToggleCameraButton.setVisibility(
-                    (mCameraView.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)
-                            && mCameraView.hasCameraWithLensFacing(
-                            CameraSelector.LENS_FACING_FRONT))
-                            ? View.VISIBLE
-                            : View.INVISIBLE);
-            mToggleCameraButton.setChecked(
-                    mCameraView.getCameraLensFacing() == CameraSelector.LENS_FACING_FRONT);
-        }
+        // CameraView.hasCameraWithLensFacing need to wait for the ready of CameraProvider. Check
+        // the b/183916771 for the workaround.
+        Handler handler = new Handler(Looper.getMainLooper());
+        handler.postDelayed(() -> {
+            if (mToggleCameraButton != null) {
+                if (mToggleCameraButton != null) {
+                    mToggleCameraButton.setVisibility(
+                            (mCameraView.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)
+                                    && mCameraView.hasCameraWithLensFacing(
+                                    CameraSelector.LENS_FACING_FRONT))
+                                    ? View.VISIBLE
+                                    : View.INVISIBLE);
+                    mToggleCameraButton.setChecked(
+                            mCameraView.getCameraLensFacing() == CameraSelector.LENS_FACING_FRONT);
+                }
+            }
+        }, CAMERA_PROVIDER_READY_TIMEOUT);
 
         // Set listeners here, or else restoring state will trigger them.
         if (mToggleCameraButton != null) {
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
index 762eda3..504277c 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
@@ -34,6 +34,7 @@
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
 
 /** The main activity. */
 public class MainActivity extends AppCompatActivity {
@@ -158,10 +159,14 @@
 
     private void startFragment(int titleRes, Fragment fragment) {
         getSupportActionBar().setTitle(titleRes);
-        getSupportFragmentManager()
-                .beginTransaction()
-                .replace(R.id.content, fragment)
-                .commit();
+        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
+        fragmentTransaction.replace(R.id.content, fragment);
+        if (mCheckedPermissions && Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
+            // For the codes, check the b/182981155 for the detail.
+            fragmentTransaction.commitAllowingStateLoss();
+        } else {
+            fragmentTransaction.commit();
+        }
     }
 
     private void report(String msg) {
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
index fce0f3e..328622d 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
@@ -50,6 +50,7 @@
 import androidx.camera.core.Preview;
 import androidx.camera.core.UseCaseGroup;
 import androidx.camera.core.ViewPort;
+import androidx.camera.lifecycle.ExperimentalUseCaseGroupLifecycle;
 import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.view.PreviewView;
 import androidx.core.content.ContextCompat;
@@ -328,8 +329,10 @@
     }
 
     @SuppressWarnings("WeakerAccess")
-    @OptIn(markerClass = ExperimentalUseCaseGroup.class)
-    @SuppressLint("UnsafeOptInUsageError")
+    // ExperimentalUseCaseGroupLifecycle is removed and has to be replaced with
+    // ExperimentalUseCaseGroup when the dependency to camera-lifecycle is updated to alpha
+    // versions.
+    @OptIn(markerClass = {ExperimentalUseCaseGroup.class, ExperimentalUseCaseGroupLifecycle.class})
     void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
         if (mPreview == null) {
             return;
diff --git a/camera/integration-tests/viewtestapp/src/main/res/values/strings.xml b/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from camera/integration-tests/viewtestapp/src/main/res/values/strings.xml
rename to camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
diff --git a/car/app/app-activity/api/current.txt b/car/app/app-activity/api/current.txt
index 81fee8f..74fbbf3 100644
--- a/car/app/app-activity/api/current.txt
+++ b/car/app/app-activity/api/current.txt
@@ -14,6 +14,7 @@
   }
 
   public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
     method public void onTouchEvent(android.view.MotionEvent);
     method public void onWindowFocusChanged(boolean, boolean);
     method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
diff --git a/car/app/app-activity/api/public_plus_experimental_current.txt b/car/app/app-activity/api/public_plus_experimental_current.txt
index bcdeaf7..2549890 100644
--- a/car/app/app-activity/api/public_plus_experimental_current.txt
+++ b/car/app/app-activity/api/public_plus_experimental_current.txt
@@ -14,6 +14,7 @@
   }
 
   public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
     method public void onTouchEvent(android.view.MotionEvent);
     method public void onWindowFocusChanged(boolean, boolean);
     method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
diff --git a/car/app/app-activity/api/restricted_current.txt b/car/app/app-activity/api/restricted_current.txt
index bcdeaf7..2549890 100644
--- a/car/app/app-activity/api/restricted_current.txt
+++ b/car/app/app-activity/api/restricted_current.txt
@@ -14,6 +14,7 @@
   }
 
   public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
     method public void onTouchEvent(android.view.MotionEvent);
     method public void onWindowFocusChanged(boolean, boolean);
     method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
diff --git a/car/app/app-activity/build.gradle b/car/app/app-activity/build.gradle
index 15e8c74..c1b1ed2 100644
--- a/car/app/app-activity/build.gradle
+++ b/car/app/app-activity/build.gradle
@@ -26,8 +26,8 @@
 dependencies {
     api(project(":car:app:app"))
     implementation("androidx.fragment:fragment:1.3.0")
-    implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
-    implementation 'androidx.annotation:annotation:1.1.0'
+    implementation("androidx.lifecycle:lifecycle-common-java8:2.2.0")
+    implementation("androidx.annotation:annotation:1.1.0")
 
     annotationProcessor(NULLAWAY)
 
@@ -37,6 +37,7 @@
     testImplementation(MOCKITO_CORE)
     testImplementation(ROBOLECTRIC)
     testImplementation(TRUTH)
+    testImplementation("androidx.fragment:fragment-testing:1.2.3")
 }
 
 android {
diff --git a/car/app/app-activity/lint-baseline.xml b/car/app/app-activity/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/car/app/app-activity/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/car/app/app-activity/src/main/AndroidManifest.xml b/car/app/app-activity/src/main/AndroidManifest.xml
index 60ff113..ddef73e 100644
--- a/car/app/app-activity/src/main/AndroidManifest.xml
+++ b/car/app/app-activity/src/main/AndroidManifest.xml
@@ -23,6 +23,11 @@
             <action android:name="android.car.template.host.RendererService" />
         </intent>
     </queries>
+
+    <!--
+     singleTop so that if a new Intent is sent targeting this activity, we will use the same
+     instance instead of creating a new one.
+    -->
     <application>
         <activity
             android:name=".CarAppActivity"
diff --git a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/IRendererService.aidl b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/IRendererService.aidl
index 3753ce8..ecbf0de 100644
--- a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/IRendererService.aidl
+++ b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/IRendererService.aidl
@@ -56,11 +56,4 @@
    * @param serviceName the service that is associated with the activity
    */
   void terminate(in ComponentName serviceName) = 3;
-
-  /**
-   * Returns whether the given version is supported.
-   *
-   * @return true if the version is supported
-   */
-  boolean isVersionSupported(String version) = 4;
 }
diff --git a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceControl.aidl b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceControl.aidl
index 4399a6d..e913ecd 100644
--- a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceControl.aidl
+++ b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceControl.aidl
@@ -8,7 +8,7 @@
  *
  * @hide
  */
-interface ISurfaceControl {
+oneway interface ISurfaceControl {
   /** Notifies that the underlying surface changed. */
   void setSurfaceWrapper(in Bundleable surfaceWrapper) = 1;
 
diff --git a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceListener.aidl b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceListener.aidl
index f2f7486..e97c626 100644
--- a/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceListener.aidl
+++ b/car/app/app-activity/src/main/aidl/androidx/car/app/activity/renderer/surface/ISurfaceListener.aidl
@@ -7,7 +7,7 @@
  *
  * @hide
  */
-interface ISurfaceListener {
+oneway interface ISurfaceListener {
   /**
    * Notifies that the surface has become available.
    *
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/ActivityLifecycleDelegate.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/ActivityLifecycleDelegate.java
index f9863bf..0df1174 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/ActivityLifecycleDelegate.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/ActivityLifecycleDelegate.java
@@ -21,8 +21,6 @@
 import android.app.Activity;
 import android.app.Application.ActivityLifecycleCallbacks;
 import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -34,12 +32,17 @@
  * IRendererCallback}.
  */
 final class ActivityLifecycleDelegate implements ActivityLifecycleCallbacks {
-    public static final String TAG = "ActivityLifecycleListener";
+    @NonNull
+    private ServiceDispatcher mServiceDispatcher;
     @Nullable
     private IRendererCallback mRendererCallback;
     @NonNull
     private Event mLastObservedEvent = Event.ON_ANY;
 
+    ActivityLifecycleDelegate(@NonNull ServiceDispatcher serviceDispatcher) {
+        mServiceDispatcher = serviceDispatcher;
+    }
+
     /**
      * Registers a {@link IRendererCallback} that is notified of lifecycle method invocations.
      */
@@ -83,9 +86,13 @@
     }
 
     @Override
+    public void onActivityPreDestroyed(@NonNull Activity activity) {
+        // No-op as the view model will call terminate on the service when needed.
+    }
+
+    @Override
     public void onActivityDestroyed(@NonNull Activity activity) {
-        requireNonNull(activity);
-        notifyEvent(Event.ON_DESTROY);
+        // No-op as the activity is already unbound at this time.
     }
 
     @Override
@@ -96,36 +103,35 @@
     private void notifyEvent(Event event) {
         mLastObservedEvent = event;
 
-        if (mRendererCallback == null) {
+        IRendererCallback callback = mRendererCallback;
+        if (callback == null) {
             return;
         }
 
-        try {
+        mServiceDispatcher.dispatch(() -> {
             switch (event) {
                 case ON_CREATE:
-                    mRendererCallback.onCreate();
+                    callback.onCreate();
                     break;
                 case ON_START:
-                    mRendererCallback.onStart();
+                    callback.onStart();
                     break;
                 case ON_RESUME:
-                    mRendererCallback.onResume();
+                    callback.onResume();
                     break;
                 case ON_PAUSE:
-                    mRendererCallback.onPause();
+                    callback.onPause();
                     break;
                 case ON_STOP:
-                    mRendererCallback.onStop();
+                    callback.onStop();
                     break;
                 case ON_DESTROY:
-                    mRendererCallback.onDestroyed();
+                    callback.onDestroyed();
                     break;
                 case ON_ANY:
                     break;
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-        }
+        });
     }
 }
 
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppActivity.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppActivity.java
index 7928b66..1130a27 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppActivity.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppActivity.java
@@ -22,15 +22,10 @@
 
 import android.annotation.SuppressLint;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
-import android.content.ServiceConnection;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
 import android.util.Log;
 import android.view.View;
 
@@ -46,10 +41,10 @@
 import androidx.car.app.activity.renderer.surface.SurfaceWrapperProvider;
 import androidx.car.app.activity.renderer.surface.TemplateSurfaceView;
 import androidx.car.app.serialization.Bundleable;
+import androidx.car.app.serialization.BundlerException;
 import androidx.car.app.utils.ThreadUtils;
 import androidx.fragment.app.FragmentActivity;
-
-import java.util.List;
+import androidx.lifecycle.ViewModelProvider;
 
 /**
  * The class representing a car app activity.
@@ -95,33 +90,60 @@
 public final class CarAppActivity extends FragmentActivity {
     @VisibleForTesting
     static final String SERVICE_METADATA_KEY = "androidx.car.app.CAR_APP_SERVICE";
-    private static final String TAG = "CarAppActivity";
 
     @SuppressLint({"ActionValue"})
     @VisibleForTesting
     static final String ACTION_RENDER = "android.car.template.host.RendererService";
 
-    @Nullable
-    private ComponentName mServiceComponentName;
     TemplateSurfaceView mSurfaceView;
-    SurfaceHolderListener mSurfaceHolderListener;
-    ActivityLifecycleDelegate mActivityLifecycleDelegate;
-    @Nullable
-    OnBackPressedListener mOnBackPressedListener;
-    @Nullable
-    IRendererService mRendererService;
+    @Nullable SurfaceHolderListener mSurfaceHolderListener;
+    @Nullable ActivityLifecycleDelegate mActivityLifecycleDelegate;
+    @Nullable OnBackPressedListener mOnBackPressedListener;
+    @Nullable CarAppViewModel mViewModel;
     private int mDisplayId;
 
     /**
+     * Handles the service connection errors by presenting a message the user and potentially
+     * finishing the activity.
+     */
+    final ErrorHandler mErrorHandler = (errorType, exception) -> {
+        requireNonNull(errorType);
+
+        Log.e(LogTags.TAG, "Service error: " + errorType, exception);
+
+        requireNonNull(mViewModel).unbind();
+
+        ThreadUtils.runOnMain(() -> {
+            Log.d(LogTags.TAG, "Showing error fragment");
+
+            if (mSurfaceView != null) {
+                mSurfaceView.setVisibility(View.GONE);
+            }
+
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .add(
+                            R.id.error_message_container,
+                            ErrorMessageFragment.newInstance(errorType))
+                    .commit();
+        });
+    };
+
+    /**
      * {@link ICarAppActivity} implementation that allows the {@link IRendererService} to
      * communicate with this {@link CarAppActivity}.
      */
     private final ICarAppActivity.Stub mCarActivity =
             new ICarAppActivity.Stub() {
                 @Override
-                public void setSurfacePackage(@NonNull Bundleable surfacePackage) {
-                    requireNonNull(surfacePackage);
-                    ThreadUtils.runOnMain(() -> mSurfaceView.setSurfacePackage(surfacePackage));
+                public void setSurfacePackage(@NonNull Bundleable bundleable) {
+                    requireNonNull(bundleable);
+                    try {
+                        Object surfacePackage = bundleable.get();
+                        ThreadUtils.runOnMain(() -> mSurfaceView.setSurfacePackage(surfacePackage));
+                    } catch (BundlerException e) {
+                        mErrorHandler.onError(ErrorHandler.ErrorType.HOST_ERROR, e);
+                    }
                 }
 
                 @Override
@@ -129,34 +151,17 @@
                     requireNonNull(callback);
                     ThreadUtils.runOnMain(
                             () -> {
-                                mSurfaceView.setOnCreateInputConnectionListener(
-                                        editorInfo -> {
-                                            try {
-                                                return callback.onCreateInputConnection(editorInfo);
-                                            } catch (RemoteException e) {
-                                                onServiceConnectionError(
-                                                        "Failed to send onCreateInputConnection"
-                                                            + " event to renderer: "
-                                                            + e.getMessage(),
-                                                        ErrorActionType.FINISH);
-                                            }
+                                mSurfaceView.setOnCreateInputConnectionListener(editorInfo ->
+                                        getServiceDispatcher().fetch(null, () ->
+                                                callback.onCreateInputConnection(
+                                                        editorInfo)));
 
-                                            return null;
-                                        });
+                                mOnBackPressedListener = () ->
+                                        getServiceDispatcher().dispatch(callback::onBackPressed);
 
-                                mOnBackPressedListener =
-                                        () -> {
-                                            try {
-                                                callback.onBackPressed();
-                                            } catch (RemoteException e) {
-                                                onServiceConnectionError(
-                                                        "Failed to send onBackPressed event to"
-                                                            + " renderer: "
-                                                            + e.getMessage(),
-                                                        ErrorActionType.FINISH);
-                                            }
-                                        };
-                                mActivityLifecycleDelegate.registerRendererCallback(callback);
+                                requireNonNull(mActivityLifecycleDelegate)
+                                        .registerRendererCallback(callback);
+                                requireNonNull(mViewModel).setRendererCallback(callback);
                             });
                 }
 
@@ -164,7 +169,8 @@
                 public void setSurfaceListener(@NonNull ISurfaceListener listener) {
                     requireNonNull(listener);
                     ThreadUtils.runOnMain(
-                            () -> mSurfaceHolderListener.setSurfaceListener(listener));
+                            () -> requireNonNull(mSurfaceHolderListener)
+                                    .setSurfaceListener(listener));
                 }
 
                 @Override
@@ -188,63 +194,41 @@
                 }
             };
 
-    /** The service connection for the renderer service. */
-    private ServiceConnection mServiceConnectionImpl =
-            new ServiceConnection() {
-                @Override
-                public void onServiceConnected(
-                        @NonNull ComponentName name, @NonNull IBinder service) {
-                    requireNonNull(name);
-                    requireNonNull(service);
-                    IRendererService rendererService = IRendererService.Stub.asInterface(service);
-                    if (rendererService == null) {
-                        onServiceConnectionError(
-                                String.format(
-                                        "Failed to get IRenderService binder from host: %s",
-                                        name.flattenToShortString()),
-                                ErrorActionType.FINISH);
-                        return;
-                    }
-
-                    verifyServiceVersion(rendererService);
-                    initializeService(rendererService);
-                    updateIntent(rendererService);
-                    CarAppActivity.this.mRendererService = rendererService;
-                }
-
-                @Override
-                public void onServiceDisconnected(@NonNull ComponentName name) {
-                    onServiceConnectionError(
-                            String.format("Host service %s is disconnected", requireNonNull(name)),
-                            ErrorActionType.DISCONNECT);
-                }
-            };
-
     @SuppressWarnings("deprecation")
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_template);
         mSurfaceView = requireViewById(R.id.template_view_surface);
-        mActivityLifecycleDelegate = new ActivityLifecycleDelegate();
-        mSurfaceHolderListener =
-                new SurfaceHolderListener(new SurfaceWrapperProvider(mSurfaceView));
 
-        mServiceComponentName = serviceComponentName();
-        if (mServiceComponentName == null) {
-            Log.e(TAG, "Unspecified service class name");
+        ComponentName serviceComponentName = retrieveServiceComponentName();
+        if (serviceComponentName == null) {
+            Log.e(LogTags.TAG, "Unspecified service class name");
             finish();
             return;
         }
+        mDisplayId = getWindowManager().getDefaultDisplay().getDisplayId();
 
-        registerActivityLifecycleCallbacks(mActivityLifecycleDelegate);
+        CarAppViewModelFactory factory = CarAppViewModelFactory.getInstance(getApplication(),
+                serviceComponentName);
+        mViewModel = new ViewModelProvider(this, factory).get(CarAppViewModel.class);
+        mViewModel.getErrorEvent().observe(this,
+                errorEvent -> mErrorHandler.onError(errorEvent.getErrorType(),
+                        errorEvent.getException()));
+
+        mActivityLifecycleDelegate = new ActivityLifecycleDelegate(getServiceDispatcher());
+        mSurfaceHolderListener = new SurfaceHolderListener(getServiceDispatcher(),
+                new SurfaceWrapperProvider(mSurfaceView));
+
+        registerActivityLifecycleCallbacks(requireNonNull(mActivityLifecycleDelegate));
 
         // Set the z-order to receive the UI events on the surface.
         mSurfaceView.setZOrderOnTop(true);
-
+        mSurfaceView.setServiceDispatcher(getServiceDispatcher());
+        mSurfaceView.setErrorHandler(mErrorHandler);
         mSurfaceView.getHolder().addCallback(mSurfaceHolderListener);
-        mDisplayId = getWindowManager().getDefaultDisplay().getDisplayId();
-        bindService();
+
+        mViewModel.bind(getIntent(), mCarActivity, mDisplayId);
     }
 
     @Override
@@ -263,13 +247,6 @@
         }
     }
 
-    @Override
-    protected void onDestroy() {
-        if (isFinishing()) {
-            unbindService();
-        }
-        super.onDestroy();
-    }
 
     @Override
     public void onBackPressed() {
@@ -281,21 +258,7 @@
     @Override
     protected void onNewIntent(@NonNull Intent intent) {
         super.onNewIntent(intent);
-        if (mRendererService == null) {
-            bindService();
-        } else {
-            updateIntent(mRendererService);
-        }
-    }
-
-    @VisibleForTesting
-    ServiceConnection getServiceConnection() {
-        return mServiceConnectionImpl;
-    }
-
-    @VisibleForTesting
-    void setServiceConnection(ServiceConnection serviceConnection) {
-        mServiceConnectionImpl = serviceConnection;
+        requireNonNull(mViewModel).bind(intent, mCarActivity, mDisplayId);
     }
 
     @VisibleForTesting
@@ -303,15 +266,20 @@
         return mDisplayId;
     }
 
+    @VisibleForTesting
+    ServiceDispatcher getServiceDispatcher() {
+        return requireNonNull(mViewModel).getServiceDispatcher();
+    }
+
     @Nullable
-    private ComponentName serviceComponentName() {
+    private ComponentName retrieveServiceComponentName() {
         ActivityInfo activityInfo = null;
         try {
             activityInfo =
                     getPackageManager()
                             .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
         } catch (NameNotFoundException e) {
-            Log.e(TAG, "Unable to find component: " + getComponentName(), e);
+            Log.e(LogTags.TAG, "Unable to find component: " + getComponentName(), e);
         }
 
         if (activityInfo == null) {
@@ -321,7 +289,7 @@
         String serviceName = activityInfo.metaData.getString(SERVICE_METADATA_KEY);
         if (serviceName == null) {
             Log.e(
-                    TAG,
+                    LogTags.TAG,
                     "Unable to find required metadata tag with name "
                             + SERVICE_METADATA_KEY
                             + ". App manifest must include metadata tag with name "
@@ -332,147 +300,4 @@
 
         return new ComponentName(this, serviceName);
     }
-
-    /** Binds to the renderer service. */
-    private void bindService() {
-        Intent rendererIntent = new Intent(ACTION_RENDER);
-        List<ResolveInfo> resolveInfoList =
-                getPackageManager()
-                        .queryIntentServices(rendererIntent, PackageManager.GET_META_DATA);
-        if (resolveInfoList.size() == 1) {
-            rendererIntent.setPackage(resolveInfoList.get(0).serviceInfo.packageName);
-            if (!bindService(
-                    rendererIntent,
-                    mServiceConnectionImpl,
-                    Context.BIND_AUTO_CREATE | Context.BIND_INCLUDE_CAPABILITIES)) {
-                onServiceConnectionError(
-                        "Cannot bind to the renderer host with intent: " + rendererIntent,
-                        ErrorActionType.FINISH);
-            }
-        } else if (resolveInfoList.isEmpty()) {
-            onServiceConnectionError("Host was not found", ErrorActionType.REDIRECT);
-        } else {
-            StringBuilder logMessage =
-                    new StringBuilder("Multiple hosts found, only one is allowed");
-            for (ResolveInfo resolveInfo : resolveInfoList) {
-                logMessage.append(
-                        String.format("\nFound host %s", resolveInfo.serviceInfo.packageName));
-            }
-            onServiceConnectionError(logMessage.toString(), ErrorActionType.FINISH);
-            // TODO("b/177083268: Multiple hosts support is not implemented")
-        }
-    }
-
-    /**
-     * Handles the service connection errors by unbinding from the service and finishing the
-     * activity.
-     *
-     * @param errorMessage the error message to be shown in the logs
-     */
-    void onServiceConnectionError(@Nullable String errorMessage, ErrorActionType type) {
-        if (type == ErrorActionType.DISCONNECT) {
-            Log.d(TAG, "Disconnect by user, don't kill the CarAppActivity");
-            return;
-        }
-
-        // Remove the renderer callback since there is no need to communicate the state with
-        // the host.
-        mActivityLifecycleDelegate.registerRendererCallback(null);
-        unbindService();
-        if (errorMessage != null && type != null && !isFinishing()) {
-            getSupportFragmentManager()
-                    .beginTransaction()
-                    .add(
-                            R.id.error_message_container,
-                            ErrorMessageFragment.newInstance(errorMessage, type))
-                    .commit();
-        } else {
-            finish();
-        }
-    }
-
-    /**
-     * Verifies that the renderer service supports the current version.
-     *
-     * @param rendererService the renderer service which should verify the version
-     */
-    void verifyServiceVersion(IRendererService rendererService) {
-        // TODO(169604451) Add version support logic
-        boolean isCompatible = true;
-
-        if (!isCompatible) {
-            onServiceConnectionError("Renderer service unsupported", ErrorActionType.REDIRECT);
-        }
-    }
-
-    /**
-     * Initializes the {@code rendererService} for the current activity with {@code carActivity},
-     * {@code serviceComponentName} and {@code displayId}.
-     *
-     * @param rendererService the renderer service that needs to be initialized
-     */
-    void initializeService(@NonNull IRendererService rendererService) {
-        requireNonNull(rendererService);
-        requireNonNull(mServiceComponentName);
-        try {
-            if (!rendererService.initialize(mCarActivity, mServiceComponentName, mDisplayId)) {
-                throw new IllegalArgumentException(
-                        "Cannot create renderer for" + mServiceComponentName);
-            }
-        } catch (RemoteException e) {
-            onServiceConnectionError(
-                    "Failed to call onCreateActivity on renderer: " + e.getMessage(),
-                    ErrorActionType.FINISH);
-        }
-    }
-
-    /** Closes the connection to the connected {@code rendererService} if any. */
-    private void unbindService() {
-        mSurfaceView.getHolder().removeCallback(mSurfaceHolderListener);
-        // If host has already disconnected, there is no need for an unbind.
-        if (mRendererService == null) {
-            return;
-        }
-        try {
-            mRendererService.terminate(requireNonNull(mServiceComponentName));
-        } catch (RemoteException e) {
-            // We are already unbinding (maybe because the host has already cut the connection)
-            // Let's not log more errors unnecessarily.
-        }
-
-        unbindService(mServiceConnectionImpl);
-        mRendererService = null;
-    }
-
-    /**
-     * Updates the activity intent for the {@code rendererService}.
-     *
-     * @param rendererService the renderer service that needs to handle the new intent
-     */
-    void updateIntent(@NonNull IRendererService rendererService) {
-        requireNonNull(rendererService);
-        requireNonNull(mServiceComponentName);
-        Intent intent = getIntent();
-        try {
-            if (!rendererService.onNewIntent(intent, mServiceComponentName, mDisplayId)) {
-                throw new IllegalArgumentException("Renderer cannot handle the intent: " + intent);
-            }
-        } catch (RemoteException e) {
-            onServiceConnectionError(
-                    "Failed to send new intent to renderer: "
-                        + e.getMessage(), ErrorActionType.FINISH);
-        }
-    }
-
-    /** Indicate the action type when server connection hit error */
-    enum ErrorActionType {
-        /** Redirect to PlayStore */
-        REDIRECT,
-
-        /** Finish the CarAppActivity */
-        FINISH,
-
-        /** Finish the CarAppActivity */
-        DISCONNECT,
-    }
 }
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModel.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModel.java
new file mode 100644
index 0000000..aa48ca9
--- /dev/null
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModel.java
@@ -0,0 +1,130 @@
+/*
+ * 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.car.app.activity;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Intent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.car.app.activity.renderer.ICarAppActivity;
+import androidx.car.app.activity.renderer.IRendererCallback;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.MutableLiveData;
+
+/**
+ * The view model to keep track of the CarAppActivity data.
+ *
+ * This main role of this class is to extent the life of a service connection beyond the regular
+ * lifecycle of an activity. This is done by making sure the unbind happens when the view model
+ * clears instead of when the activity calls onDestroy.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class CarAppViewModel extends AndroidViewModel implements ErrorHandler {
+    /** Holds the information about an error event. */
+    public static class ErrorEvent {
+        private final ErrorType mErrorType;
+        private final Throwable mException;
+
+        public ErrorEvent(@NonNull ErrorType errorType, @NonNull Throwable exception) {
+            mErrorType = errorType;
+            mException = exception;
+        }
+
+        /** Returns the type of error. */
+        @NonNull ErrorType getErrorType() {
+            return mErrorType;
+        }
+
+        /** Returns the exception associated with this error event. */
+        @NonNull Throwable getException() {
+            return mException;
+        }
+    }
+
+    private final MutableLiveData<ErrorEvent> mErrorEvent = new MutableLiveData<>();
+    private ServiceConnectionManager mServiceConnectionManager;
+    @Nullable private IRendererCallback mIRendererCallback;
+
+    public CarAppViewModel(@NonNull Application application, @NonNull ComponentName componentName) {
+        super(application);
+
+        mServiceConnectionManager = new ServiceConnectionManager(application, componentName, this);
+    }
+
+    @VisibleForTesting
+    @NonNull ServiceConnectionManager getServiceConnectionManager() {
+        return mServiceConnectionManager;
+    }
+
+    @VisibleForTesting
+    void setServiceConnectionManager(ServiceConnectionManager serviceConnectionManager) {
+        mServiceConnectionManager = serviceConnectionManager;
+    }
+
+    @NonNull ServiceDispatcher getServiceDispatcher() {
+        return mServiceConnectionManager.getServiceDispatcher();
+    }
+
+    /** Updates the rendeer callback. */
+    void setRendererCallback(@NonNull IRendererCallback rendererCallback) {
+        mIRendererCallback = rendererCallback;
+    }
+
+    /**
+     * Binds to the renderer service and initializes the service if not bound already.
+     *
+     * Initializes the renderer service with given properties if already bound to the renderer
+     * service.
+     */
+    void bind(@NonNull Intent intent, @NonNull ICarAppActivity iCarAppActivity,
+            int displayId) {
+        mServiceConnectionManager.bind(intent, iCarAppActivity, displayId);
+    }
+
+    /** Closes the connection to the renderer service if any. */
+    void unbind() {
+        mServiceConnectionManager.unbind();
+    }
+
+    @NonNull
+    MutableLiveData<ErrorEvent> getErrorEvent() {
+        return mErrorEvent;
+    }
+
+    @Override
+    protected void onCleared() {
+        super.onCleared();
+        if (mIRendererCallback != null) {
+            mServiceConnectionManager.getServiceDispatcher()
+                    .dispatch(mIRendererCallback::onDestroyed);
+        }
+        mServiceConnectionManager.unbind();
+    }
+
+    @Override
+    public void onError(@NonNull ErrorHandler.ErrorType errorType, @NonNull Throwable exception) {
+        mErrorEvent.setValue(new ErrorEvent(errorType, exception));
+    }
+}
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java
new file mode 100644
index 0000000..3c9627d
--- /dev/null
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/CarAppViewModelFactory.java
@@ -0,0 +1,72 @@
+/*
+ * 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.car.app.activity;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.app.Application;
+import android.content.ComponentName;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A factory to provide a unique {@link CarAppViewModel} for each given {@link ComponentName}.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+class CarAppViewModelFactory implements ViewModelProvider.Factory {
+    private static final Map<ComponentName, CarAppViewModelFactory> sInstances = new HashMap<>();
+
+    Application mApplication;
+    ComponentName mComponentName;
+
+    private CarAppViewModelFactory(@NonNull ComponentName componentName,
+            @NonNull Application application) {
+        mComponentName = componentName;
+        mApplication = application;
+    }
+
+    /**
+     * Retrieve a singleton instance of CarAppViewModelFactory for the given key.
+     *
+     * @return A valid {@link CarAppViewModelFactory}
+     */
+    @NonNull
+    static CarAppViewModelFactory getInstance(Application application,
+            ComponentName componentName) {
+        CarAppViewModelFactory instance = sInstances.get(componentName);
+        if (instance == null) {
+            instance = new CarAppViewModelFactory(componentName, application);
+            sInstances.put(componentName, instance);
+        }
+        return instance;
+    }
+
+    @SuppressWarnings("unchecked")
+    @NonNull
+    @Override
+    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+        return (T) new CarAppViewModel(mApplication, mComponentName);
+    }
+}
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorHandler.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorHandler.java
new file mode 100644
index 0000000..3d9f610
--- /dev/null
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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.car.app.activity;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.StringRes;
+
+/**
+ * Error handling abstraction
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public interface ErrorHandler {
+    /**
+     * Possible actions to take when the user clicks on the action button associated with an
+     * error
+     */
+    enum ActionType {
+        /** Redirect the user to the "vending application" (e.g.: Google Play Store) */
+        UPDATE_HOST(R.string.error_action_update_host),
+        /** Finish the application */
+        FINISH(R.string.error_action_finish),
+        ;
+
+        private final @StringRes int mActionResId;
+
+        ActionType(@StringRes int actionResId) {
+            mActionResId = actionResId;
+        }
+
+        /** Returns the title of the action button for this type of error */
+        public @StringRes int getActionResId() {
+            return mActionResId;
+        }
+    }
+
+    /**
+     * All possible error conditions
+     */
+    enum ErrorType {
+        CLIENT_SIDE_ERROR(R.string.error_message_client_side_error, ActionType.FINISH),
+        HOST_ERROR(R.string.error_message_host_error, ActionType.FINISH),
+        HOST_CONNECTION_LOST(R.string.error_message_host_connection_lost, ActionType.FINISH),
+        HOST_NOT_FOUND(R.string.error_message_host_not_found, ActionType.UPDATE_HOST),
+        HOST_INCOMPATIBLE(R.string.error_message_host_incompatible, ActionType.UPDATE_HOST),
+        MULTIPLE_HOSTS(R.string.error_message_multiple_hosts, ActionType.FINISH),
+        UNKNOWN_ERROR(R.string.error_message_unknown_error, ActionType.FINISH),
+        ;
+
+        private final @StringRes int mMessageResId;
+        private final @NonNull ActionType mActionType;
+
+        ErrorType(@StringRes int messageResId, @NonNull ActionType actionType) {
+            mMessageResId = messageResId;
+            mActionType = actionType;
+        }
+
+        /** Returns a human-readable message to show for this type of error */
+        public @StringRes int getMessageResId() {
+            return mMessageResId;
+        }
+
+        /** Returns the type of action to execute when the user clicks on the associated button */
+        public @NonNull ActionType getActionType() {
+            return mActionType;
+        }
+    }
+
+    /**
+     * Notifies of an error condition to be displayed to the user. While the error is presented,
+     * the {@link CarAppActivity} will be disconnected from the host service.
+     *
+     * @param errorType type of error to display
+     * @param exception additional error information, used for logging
+     */
+    void onError(@NonNull ErrorType errorType, @NonNull Throwable exception);
+}
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
index a07bf6f..6619209 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/ErrorMessageFragment.java
@@ -27,12 +27,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
-import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 
 import java.util.List;
@@ -44,29 +44,27 @@
  */
 @RestrictTo(LIBRARY)
 public final class ErrorMessageFragment extends Fragment {
-    private static final String MESSAGE_ARGS_KEY = "message";
     private static final String ERROR_TYPE_ARGS_KEY = "errorType";
     private static final String VENDING_PACKAGE = "com.android.vending";
     static final String ACTION_RENDER = "android.car.template.host.RendererService";
 
     /** Returns an new Instance of {@link ErrorMessageFragment} */
     @NonNull
-    static ErrorMessageFragment newInstance(
-            @NonNull String text,
-            @NonNull CarAppActivity.ErrorActionType type) {
-
+    static ErrorMessageFragment newInstance(@NonNull ErrorHandler.ErrorType errorType) {
         ErrorMessageFragment errorMessageFragment = new ErrorMessageFragment();
-
-        Bundle bundle = new Bundle();
-        bundle.putString(MESSAGE_ARGS_KEY, text);
-        bundle.putSerializable(ERROR_TYPE_ARGS_KEY, type);
-
-        errorMessageFragment.setArguments(bundle);
-
+        errorMessageFragment.setArguments(getBundle(errorType));
         return errorMessageFragment;
     }
 
-    @Nullable
+    @VisibleForTesting
+    @NonNull
+    static Bundle getBundle(ErrorHandler.ErrorType errorType) {
+        Bundle bundle = new Bundle();
+        bundle.putInt(ERROR_TYPE_ARGS_KEY, errorType.ordinal());
+        return bundle;
+    }
+
+    @NonNull
     @Override
     public View onCreateView(
             @NonNull LayoutInflater inflater,
@@ -77,31 +75,32 @@
         return rootView;
     }
 
-    private void update(View rootView) {
+    private void update(@NonNull View rootView) {
+        ErrorHandler.ErrorType errorType = getErrorType();
         TextView errorMessage = rootView.findViewById(R.id.error_message);
-        errorMessage.setText(
-                requireArguments().getString(MESSAGE_ARGS_KEY));
-        ImageView errorIcon = rootView.findViewById(R.id.message_icon);
-        errorIcon.setImageDrawable(requireActivity().getDrawable(R.drawable.car_app_icon_error));
-
         Button actionButton = rootView.findViewById(R.id.action_button);
-        CarAppActivity.ErrorActionType errorActionType =
-                (CarAppActivity.ErrorActionType) requireArguments()
-                                                         .getSerializable(ERROR_TYPE_ARGS_KEY);
-        actionButton.setText(getExitString(errorActionType));
-        actionButton.setOnClickListener(
-                v -> {
-                    onClick((CarAppActivity.ErrorActionType)
-                                requireArguments()
-                                            .getSerializable(ERROR_TYPE_ARGS_KEY));
-                });
+        errorMessage.setText(getString(errorType.getMessageResId()));
+        actionButton.setText(getString(errorType.getActionType().getActionResId()));
+        actionButton.setOnClickListener(v -> onClick(errorType.getActionType()));
     }
 
-    private void onClick(@NonNull CarAppActivity.ErrorActionType type) {
-        if (type == CarAppActivity.ErrorActionType.REDIRECT) {
-            startActivity(getVendingIntent());
+    @VisibleForTesting
+    @NonNull
+    ErrorHandler.ErrorType getErrorType() {
+        Bundle args = requireArguments();
+        return ErrorHandler.ErrorType.values()[args.getInt(ERROR_TYPE_ARGS_KEY)];
+    }
+
+    private void onClick(@NonNull ErrorHandler.ActionType actionType) {
+        switch (actionType) {
+            case UPDATE_HOST:
+                startActivity(getVendingIntent());
+                // Fall through
+            case FINISH:
+                requireActivity().finish();
+                return;
         }
-        requireActivity().finish();
+        throw new IllegalArgumentException("Unknown action type: " + actionType);
     }
 
     private Intent getVendingIntent() {
@@ -126,12 +125,4 @@
             return requireActivity().getPackageManager().getLaunchIntentForPackage(VENDING_PACKAGE);
         }
     }
-
-    private int getExitString(CarAppActivity.ErrorActionType errorActionType) {
-        if (errorActionType == CarAppActivity.ErrorActionType.REDIRECT) {
-            return R.string.redirect;
-        } else {
-            return R.string.exit;
-        }
-    }
 }
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceConnectionManager.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceConnectionManager.java
new file mode 100644
index 0000000..93f9b5d
--- /dev/null
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceConnectionManager.java
@@ -0,0 +1,267 @@
+/*
+ * 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.car.app.activity;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.SuppressLint;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.car.app.activity.renderer.ICarAppActivity;
+import androidx.car.app.activity.renderer.IRendererService;
+
+import java.util.List;
+
+/**
+ * Manages the renderer service connection state.
+ *
+ * This class handles binding and unbinding to the renderer service and make sure the renderer
+ * service gets initialized and terminated properly.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ServiceConnectionManager {
+    @SuppressLint({"ActionValue"})
+    @VisibleForTesting
+    static final String ACTION_RENDER = "android.car.template.host.RendererService";
+
+    final ErrorHandler mErrorHandler;
+    private final ComponentName mServiceComponentName;
+    private final Context mContext;
+    private final ServiceDispatcher mServiceDispatcher;
+    private int mDisplayId;
+    @Nullable private Intent mIntent;
+    @Nullable private ICarAppActivity mICarAppActivity;
+
+    @Nullable IRendererService mRendererService;
+
+    public ServiceConnectionManager(@NonNull Context context,
+            @NonNull ComponentName serviceComponentName, @NonNull ErrorHandler errorHandler) {
+        mContext = context;
+        mErrorHandler = errorHandler;
+        mServiceComponentName = serviceComponentName;
+        mServiceDispatcher = new ServiceDispatcher(mErrorHandler, this::isBound);
+    }
+
+    /**
+     * Returns a {@link ServiceDispatcher} that can be used to communicate with the renderer
+     * service.
+     */
+    @NonNull ServiceDispatcher getServiceDispatcher() {
+        return mServiceDispatcher;
+    }
+
+    @VisibleForTesting
+    ComponentName getServiceComponentName() {
+        return mServiceComponentName;
+    }
+
+    @VisibleForTesting
+    ErrorHandler getErrorHandler() {
+        return mErrorHandler;
+    }
+
+    @VisibleForTesting
+    ServiceConnection getServiceConnection() {
+        return mServiceConnectionImpl;
+    }
+
+    @VisibleForTesting
+    void setServiceConnection(ServiceConnection serviceConnection) {
+        mServiceConnectionImpl = serviceConnection;
+    }
+
+    @VisibleForTesting
+    void setRendererService(@Nullable IRendererService rendererService) {
+        mRendererService = rendererService;
+    }
+
+    /** Returns true if the service is currently bound and able to receive messages */
+    boolean isBound() {
+        return mRendererService != null;
+    }
+
+    /** The service connection for the renderer service. */
+    private ServiceConnection mServiceConnectionImpl =
+            new ServiceConnection() {
+                @Override
+                public void onServiceConnected(
+                        @NonNull ComponentName name, @NonNull IBinder service) {
+                    requireNonNull(name);
+                    requireNonNull(service);
+                    Log.i(LogTags.TAG, String.format("Host service %s is connected",
+                            name.flattenToShortString()));
+                    IRendererService rendererService = IRendererService.Stub.asInterface(service);
+                    if (rendererService == null) {
+                        mErrorHandler.onError(ErrorHandler.ErrorType.HOST_INCOMPATIBLE,
+                                new Exception("Failed to get IRenderService binder from host: "
+                                        + name));
+                        return;
+                    }
+
+                    mRendererService = rendererService;
+                    initializeService();
+                }
+
+                @Override
+                public void onServiceDisconnected(@NonNull ComponentName name) {
+                    requireNonNull(name);
+
+                    // Connection lost, but it might reconnect.
+                    Log.w(LogTags.TAG, String.format("Host service %s is disconnected",
+                            name.flattenToShortString()));
+                }
+
+                @Override
+                public void onBindingDied(@NonNull ComponentName name) {
+                    requireNonNull(name);
+
+                    // Connection permanently lost
+                    mErrorHandler.onError(ErrorHandler.ErrorType.HOST_CONNECTION_LOST,
+                            new Exception("Host service " + name + " is permanently disconnected"));
+                }
+
+                @Override
+                public void onNullBinding(@NonNull ComponentName name) {
+                    requireNonNull(name);
+
+                    // Host rejected the binding.
+                    mErrorHandler.onError(ErrorHandler.ErrorType.HOST_INCOMPATIBLE,
+                            new Exception("Host service " + name + " rejected the binding "
+                                    + "request"));
+                }
+            };
+
+    /**
+     * Binds to the renderer service and initializes the service if not bound already.
+     *
+     * Initializes the renderer service with given properties if already bound to the renderer
+     * service.
+     */
+    void bind(@NonNull Intent intent, @NonNull ICarAppActivity iCarAppActivity, int displayId) {
+        mIntent = requireNonNull(intent);
+        mICarAppActivity = requireNonNull(iCarAppActivity);
+        mDisplayId = displayId;
+
+        if (isBound()) {
+            initializeService();
+            return;
+        }
+
+        Intent rendererIntent = new Intent(ACTION_RENDER);
+        List<ResolveInfo> resolveInfoList =
+                mContext.getPackageManager()
+                        .queryIntentServices(rendererIntent, PackageManager.GET_META_DATA);
+        if (resolveInfoList.size() == 1) {
+            rendererIntent.setPackage(resolveInfoList.get(0).serviceInfo.packageName);
+            if (!mContext.bindService(
+                    rendererIntent,
+                    mServiceConnectionImpl,
+                    Context.BIND_AUTO_CREATE | Context.BIND_INCLUDE_CAPABILITIES)) {
+                mErrorHandler.onError(ErrorHandler.ErrorType.HOST_INCOMPATIBLE,
+                        new Exception("Cannot bind to the renderer host with intent: "
+                                + rendererIntent));
+            }
+        } else if (resolveInfoList.isEmpty()) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.HOST_NOT_FOUND, new Exception("No "
+                    + "handlers found for intent: " + rendererIntent));
+        } else {
+            StringBuilder logMessage =
+                    new StringBuilder("Multiple hosts found, only one is allowed");
+            for (ResolveInfo resolveInfo : resolveInfoList) {
+                logMessage.append(
+                        String.format("\nFound host %s", resolveInfo.serviceInfo.packageName));
+            }
+            mErrorHandler.onError(ErrorHandler.ErrorType.MULTIPLE_HOSTS,
+                    new Exception(logMessage.toString()));
+        }
+    }
+
+    /** Closes the connection to the connected {@code rendererService} if any. */
+    void unbind() {
+        if (mRendererService == null) {
+            return;
+        }
+        try {
+            mRendererService.terminate(requireNonNull(mServiceComponentName));
+        } catch (RemoteException e) {
+            // We are already unbinding (maybe because the host has already cut the connection)
+            // Let's not log more errors unnecessarily.
+        }
+
+        Log.i(LogTags.TAG, "Unbinding from " + mServiceComponentName);
+        mContext.unbindService(mServiceConnectionImpl);
+        mRendererService = null;
+    }
+
+    /**
+     * Initializes the {@code rendererService} for the current {@code carIAppActivity},
+     * {@code serviceComponentName} and {@code displayId}.
+     */
+    void initializeService() {
+        ICarAppActivity carAppActivity = requireNonNull(mICarAppActivity);
+        IRendererService rendererService = requireNonNull(mRendererService);
+        ComponentName serviceComponentName = requireNonNull(mServiceComponentName);
+
+        Boolean success = mServiceDispatcher.fetch(false,
+                () -> rendererService.initialize(carAppActivity,
+                        serviceComponentName, mDisplayId));
+        if (success == null || !success) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.HOST_ERROR,
+                    new Exception("Cannot create renderer for" + serviceComponentName));
+            return;
+        }
+        updateIntent();
+    }
+
+    /**
+     * Updates the activity intent for the connected {@code rendererService}.
+     */
+    private void updateIntent() {
+        ComponentName serviceComponentName = requireNonNull(mServiceComponentName);
+        Intent intent = requireNonNull(mIntent);
+
+        IRendererService service = mRendererService;
+        if (service == null) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.CLIENT_SIDE_ERROR,
+                    new Exception("Service dispatcher is not connected"));
+            return;
+        }
+
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                service.onNewIntent(intent, serviceComponentName, mDisplayId));
+        if (success == null || !success) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.HOST_ERROR, new Exception("Renderer "
+                    + "cannot handle the intent: " + intent));
+        }
+    }
+}
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceDispatcher.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceDispatcher.java
new file mode 100644
index 0000000..83c575f
--- /dev/null
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/ServiceDispatcher.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.car.app.activity;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import android.os.RemoteException;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.car.app.activity.renderer.IRendererService;
+import androidx.car.app.serialization.BundlerException;
+
+/**
+ * {@link IRendererService} messages dispatcher, responsible for IPC error handling.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ServiceDispatcher {
+
+    /** An interface for monitoring the binding state of a service connection. */
+    public interface OnBindingListener {
+        /** Returns true if the service connection is bound. */
+        boolean isBound();
+    }
+
+    private final ErrorHandler mErrorHandler;
+    private OnBindingListener mOnBindingListener;
+
+    /** A one way call to the service */
+    public interface OneWayCall {
+        /** Remote invocation to execute */
+        void invoke() throws RemoteException, BundlerException;
+    }
+
+    /**
+     * A call to fetch a value from the service. This call will block the thread until the value
+     * is received
+     *
+     * @param <T> Type of value to be returned
+     */
+    // TODO(b/184697399): Remove blocking return callbacks.
+    public interface ReturnCall<T> {
+        /** Remote invocation to execute */
+        @Nullable
+        T invoke() throws RemoteException, BundlerException;
+    }
+
+    public ServiceDispatcher(@NonNull ErrorHandler errorHandler,
+            @NonNull OnBindingListener onBindingListener) {
+        mErrorHandler = errorHandler;
+        mOnBindingListener = onBindingListener;
+    }
+
+    @VisibleForTesting
+    public void setOnBindingListener(@NonNull OnBindingListener onBindingListener) {
+        mOnBindingListener = onBindingListener;
+    }
+
+    /** Dispatches the given {@link OneWayCall}. This is a non-blocking call. */
+    public void dispatch(@NonNull OneWayCall call) {
+        fetch(null, (ReturnCall<Void>) () -> {
+            call.invoke();
+            return null;
+        });
+    }
+
+    /**
+     * Retrieves a value from the service. This is a blocking call.
+     *
+     * @param call code to execute to retrieve the value
+     * @param fallbackValue value to return in case the call is unsuccessful
+     * @param <T> type of value to retrieve
+     * @return the value retrieved
+     */
+    // TODO(b/184697399): Remove two-way calls as these are blocking.
+    @Nullable
+    public <T> T fetch(@Nullable T fallbackValue, @NonNull ReturnCall<T> call) {
+        if (!mOnBindingListener.isBound()) {
+            // Avoid dispatching messages if we are not bound to the service
+            return fallbackValue;
+        }
+        try {
+            // TODO(b/184697267): Implement ANR (application not responding) checks
+            return call.invoke();
+        } catch (RemoteException e) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.HOST_ERROR, e);
+        } catch (BundlerException e) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.CLIENT_SIDE_ERROR, e);
+        } catch (RuntimeException e) {
+            mErrorHandler.onError(ErrorHandler.ErrorType.UNKNOWN_ERROR, e);
+        }
+        return fallbackValue;
+    }
+}
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
index 23ed385..82a4175 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
@@ -16,12 +16,9 @@
 
 package androidx.car.app.activity.renderer.surface;
 
-import static androidx.car.app.activity.LogTags.TAG;
-
 import static java.util.Objects.requireNonNull;
 
 import android.annotation.SuppressLint;
-import android.util.Log;
 import android.view.MotionEvent;
 
 import androidx.annotation.Keep;
@@ -51,35 +48,30 @@
      */
     @SuppressLint("ExecutorRegistration")
     public LegacySurfacePackage(@NonNull SurfaceControlCallback callback) {
+        requireNonNull(callback);
+
         mISurfaceControl = new ISurfaceControl.Stub() {
             final SurfaceControlCallback mCallback = callback;
 
             @Override
             public void setSurfaceWrapper(@NonNull Bundleable surfaceWrapper) {
                 requireNonNull(surfaceWrapper);
-                if (mCallback != null) {
-                    try {
-                        mCallback.setSurfaceWrapper((SurfaceWrapper) surfaceWrapper.get());
-                    } catch (BundlerException e) {
-                        //TODO(b/179930319): Surface error on the CarAppActivity
-                        Log.e(TAG, "Unable to deserialize surface wrapper", e);
-                    }
+                try {
+                    mCallback.setSurfaceWrapper((SurfaceWrapper) surfaceWrapper.get());
+                } catch (BundlerException e) {
+                    mCallback.onError("Unable to deserialize surface wrapper", e);
                 }
             }
 
             @Override
             public void onWindowFocusChanged(boolean hasFocus, boolean isInTouchMode) {
-                if (mCallback != null) {
-                    mCallback.onWindowFocusChanged(hasFocus, isInTouchMode);
-                }
+                mCallback.onWindowFocusChanged(hasFocus, isInTouchMode);
             }
 
             @Override
             public void onTouchEvent(@NonNull MotionEvent event) {
                 requireNonNull(event);
-                if (mCallback != null) {
-                    mCallback.onTouchEvent(event);
-                }
+                mCallback.onTouchEvent(event);
             }
         };
     }
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/RemoteProxyInputConnection.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/RemoteProxyInputConnection.java
index ec29a88..1ed5516 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/RemoteProxyInputConnection.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/RemoteProxyInputConnection.java
@@ -16,14 +16,10 @@
 
 package androidx.car.app.activity.renderer.surface;
 
-import static androidx.car.app.activity.LogTags.TAG;
-
 import static java.util.Objects.requireNonNull;
 
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.RemoteException;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.inputmethod.CompletionInfo;
 import android.view.inputmethod.CorrectionInfo;
@@ -33,321 +29,184 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.car.app.activity.ServiceDispatcher;
 import androidx.car.app.activity.renderer.IProxyInputConnection;
 
 /** Proxies input connection calls to the provided {@link IProxyInputConnection}. */
 final class RemoteProxyInputConnection extends InputConnectionWrapper {
+    private final ServiceDispatcher mServiceDispatcher;
     private final IProxyInputConnection mProxyInputConnection;
 
-    RemoteProxyInputConnection(@NonNull IProxyInputConnection proxyInputConnection) {
+    RemoteProxyInputConnection(@NonNull ServiceDispatcher serviceDispatcher,
+            @NonNull IProxyInputConnection proxyInputConnection) {
         super(null, true);
+        mServiceDispatcher = serviceDispatcher;
         mProxyInputConnection = proxyInputConnection;
     }
 
     @Nullable
     @Override
     public CharSequence getTextBeforeCursor(int n, int flags) {
-        CharSequence text;
-        try {
-            text = mProxyInputConnection.getTextBeforeCursor(n, flags);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            text = null;
-        }
-        return text;
+        return mServiceDispatcher.fetch(null, () ->
+                mProxyInputConnection.getTextBeforeCursor(n, flags));
     }
 
     @Nullable
     @Override
     public CharSequence getTextAfterCursor(int n, int flags) {
-        CharSequence text;
-        try {
-            text = mProxyInputConnection.getTextAfterCursor(n, flags);
-        } catch (RemoteException e) {
-            Log.w(TAG, "Remote connection lost", e);
-            text = null;
-        }
-
-        return text;
+        return mServiceDispatcher.fetch(null, () ->
+                mProxyInputConnection.getTextAfterCursor(n, flags));
     }
 
     @Nullable
     @Override
     public CharSequence getSelectedText(int flags) {
-        CharSequence text;
-        try {
-            text = mProxyInputConnection.getSelectedText(flags);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            text = null;
-        }
-
-        return text;
+        return mServiceDispatcher.fetch(null, () ->
+                mProxyInputConnection.getSelectedText(flags));
     }
 
     @Override
     public int getCursorCapsMode(int reqModes) {
-        int text;
-        try {
-            text = mProxyInputConnection.getCursorCapsMode(reqModes);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            text = 0;
-        }
-
-        return text;
+        Integer res = mServiceDispatcher.fetch(0, () ->
+                mProxyInputConnection.getCursorCapsMode(reqModes));
+        return res != null ? res : 0;
     }
 
     @Nullable
     @Override
     public ExtractedText getExtractedText(@NonNull ExtractedTextRequest request, int flags) {
         requireNonNull(request);
-        ExtractedText text;
-        try {
-            text = mProxyInputConnection.getExtractedText(request, flags);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            text = null;
-        }
-
-        return text;
+        return mServiceDispatcher.fetch(null, () ->
+                        mProxyInputConnection.getExtractedText(request, flags));
     }
 
     @Override
     public boolean deleteSurroundingText(int beforeLength, int afterLength) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.deleteSurroundingText(beforeLength, afterLength);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.deleteSurroundingText(beforeLength, afterLength));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean setComposingText(@NonNull CharSequence text, int newCursorPosition) {
         requireNonNull(text);
-        boolean success;
-        try {
-            success = mProxyInputConnection.setComposingText(text, newCursorPosition);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.setComposingText(text, newCursorPosition));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean setComposingRegion(int start, int end) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.setComposingRegion(start, end);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.setComposingRegion(start, end));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean finishComposingText() {
-        boolean success;
-        try {
-            success = mProxyInputConnection.finishComposingText();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false,
+                mProxyInputConnection::finishComposingText);
+        return success != null ? success : false;
     }
 
     @Override
     public boolean commitText(@NonNull CharSequence text, int newCursorPosition) {
         requireNonNull(text);
-        boolean success;
-        try {
-            success = mProxyInputConnection.commitText(text, newCursorPosition);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.commitText(text, newCursorPosition));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean commitCompletion(@NonNull CompletionInfo text) {
         requireNonNull(text);
-        boolean success;
-        try {
-            success = mProxyInputConnection.commitCompletion(text);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.commitCompletion(text));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean commitCorrection(@NonNull CorrectionInfo correctionInfo) {
         requireNonNull(correctionInfo);
-        boolean success;
-        try {
-            success = mProxyInputConnection.commitCorrection(correctionInfo);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.commitCorrection(correctionInfo));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean setSelection(int start, int end) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.setSelection(start, end);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.setSelection(start, end));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean performEditorAction(int editorAction) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.performEditorAction(editorAction);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.performEditorAction(editorAction));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean performContextMenuAction(int id) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.performContextMenuAction(id);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.performContextMenuAction(id));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean beginBatchEdit() {
-        boolean success;
-        try {
-            success = mProxyInputConnection.beginBatchEdit();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, mProxyInputConnection::beginBatchEdit);
+        return success != null ? success : false;
     }
 
     @Override
     public boolean endBatchEdit() {
-        boolean success;
-        try {
-            success = mProxyInputConnection.endBatchEdit();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, mProxyInputConnection::endBatchEdit);
+        return success != null ? success : false;
     }
 
     @Override
     public boolean sendKeyEvent(@NonNull KeyEvent event) {
         requireNonNull(event);
-        boolean success;
-        try {
-            success = mProxyInputConnection.sendKeyEvent(event);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.sendKeyEvent(event));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean clearMetaKeyStates(int states) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.clearMetaKeyStates(states);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.clearMetaKeyStates(states));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean reportFullscreenMode(boolean enabled) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.reportFullscreenMode(enabled);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.reportFullscreenMode(enabled));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean performPrivateCommand(@NonNull String action, @NonNull Bundle data) {
         requireNonNull(action);
         requireNonNull(data);
-        boolean success;
-        try {
-            success = mProxyInputConnection.performPrivateCommand(action, data);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.performPrivateCommand(action, data));
+        return success != null ? success : false;
     }
 
     @Override
     public boolean requestCursorUpdates(int cursorUpdateMode) {
-        boolean success;
-        try {
-            success = mProxyInputConnection.requestCursorUpdates(cursorUpdateMode);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            success = false;
-        }
-
-        return success;
+        Boolean success = mServiceDispatcher.fetch(false, () ->
+                mProxyInputConnection.requestCursorUpdates(cursorUpdateMode));
+        return success != null ? success : false;
     }
 
     @Override
     public void closeConnection() {
-        try {
-            mProxyInputConnection.closeConnection();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-        }
+        mServiceDispatcher.dispatch(mProxyInputConnection::closeConnection);
     }
 
     @Nullable
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceControlCallback.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceControlCallback.java
index 3a805ec..f4e62f0 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceControlCallback.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceControlCallback.java
@@ -16,7 +16,10 @@
 
 package androidx.car.app.activity.renderer.surface;
 
+import static androidx.car.app.activity.LogTags.TAG;
+
 import android.annotation.SuppressLint;
+import android.util.Log;
 import android.view.MotionEvent;
 
 import androidx.annotation.NonNull;
@@ -35,4 +38,9 @@
 
     /** Notifies when the window focus changes. */
     void onWindowFocusChanged(boolean hasFocus, boolean isInTouchMode);
+
+    /** Notifies when there is an error. Provide default implementation for easier transition. */
+    default void onError(@NonNull String msg, @NonNull Throwable e) {
+        Log.e(TAG, msg, e);
+    }
 }
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceHolderListener.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceHolderListener.java
index 61db2a6..2f7a4e4 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceHolderListener.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceHolderListener.java
@@ -17,19 +17,16 @@
 package androidx.car.app.activity.renderer.surface;
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-import static androidx.car.app.activity.LogTags.TAG;
 
 import static java.util.Objects.requireNonNull;
 
-import android.os.RemoteException;
-import android.util.Log;
 import android.view.SurfaceHolder;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.activity.ServiceDispatcher;
 import androidx.car.app.serialization.Bundleable;
-import androidx.car.app.serialization.BundlerException;
 
 /**
  * A listener of {@link SurfaceHolder}.
@@ -38,14 +35,17 @@
  */
 @RestrictTo(LIBRARY)
 public class SurfaceHolderListener implements SurfaceHolder.Callback {
+    private final ServiceDispatcher mServiceDispatcher;
     @Nullable
     private ISurfaceListener mSurfaceListener;
     private boolean mIsSurfaceAvailable;
     private final SurfaceWrapperProvider mSurfaceWrapperProvider;
 
-    public SurfaceHolderListener(@NonNull SurfaceWrapperProvider surfaceWrapperProvider) {
+    public SurfaceHolderListener(@NonNull ServiceDispatcher serviceDispatcher,
+            @NonNull SurfaceWrapperProvider surfaceWrapperProvider) {
         super();
         mSurfaceWrapperProvider = surfaceWrapperProvider;
+        mServiceDispatcher = serviceDispatcher;
     }
 
     /**
@@ -81,29 +81,18 @@
     }
 
     private void notifySurfaceCreated() {
-        try {
-            if (mSurfaceListener != null) {
-                mSurfaceListener.onSurfaceAvailable(
-                        Bundleable.create(mSurfaceWrapperProvider.createSurfaceWrapper()));
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-        } catch (BundlerException e) {
-            Log.e(TAG, "Unable to serialize surface wrapper", e);
+        ISurfaceListener surfaceListener = mSurfaceListener;
+        if (surfaceListener != null) {
+            mServiceDispatcher.dispatch(() -> surfaceListener.onSurfaceAvailable(
+                    Bundleable.create(mSurfaceWrapperProvider.createSurfaceWrapper())));
         }
-
     }
 
     private void notifySurfaceChanged() {
-        try {
-            if (mSurfaceListener != null) {
-                mSurfaceListener.onSurfaceChanged(
-                        Bundleable.create(mSurfaceWrapperProvider.createSurfaceWrapper()));
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-        } catch (BundlerException e) {
-            Log.e(TAG, "Unable to serialize surface wrapper", e);
+        ISurfaceListener surfaceListener = mSurfaceListener;
+        if (surfaceListener != null) {
+            mServiceDispatcher.dispatch(() -> surfaceListener.onSurfaceChanged(
+                    Bundleable.create(mSurfaceWrapperProvider.createSurfaceWrapper())));
         }
     }
 }
diff --git a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/TemplateSurfaceView.java b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/TemplateSurfaceView.java
index d9e8eba..41090d4 100644
--- a/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/TemplateSurfaceView.java
+++ b/car/app/app-activity/src/main/java/androidx/car/app/activity/renderer/surface/TemplateSurfaceView.java
@@ -27,7 +27,6 @@
 import android.os.Build;
 import android.os.Build.VERSION;
 import android.os.IBinder;
-import android.os.RemoteException;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.MotionEvent;
@@ -45,9 +44,10 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.activity.ErrorHandler;
+import androidx.car.app.activity.ServiceDispatcher;
 import androidx.car.app.activity.renderer.IProxyInputConnection;
 import androidx.car.app.serialization.Bundleable;
-import androidx.car.app.serialization.BundlerException;
 
 /**
  * A surface view suitable for template rendering.
@@ -67,6 +67,11 @@
     ISurfaceControl mSurfaceControl;
     private boolean mIsInInputMode;
 
+    // Package public to avoid synthetic accessor
+    @Nullable
+    ServiceDispatcher mServiceDispatcher;
+    @Nullable
+    private ErrorHandler mErrorHandler;
     private final InputMethodManager mInputMethodManager =
             (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
     private final SurfaceWrapperProvider mSurfaceWrapperProvider =
@@ -75,12 +80,12 @@
             new ViewTreeObserver.OnTouchModeChangeListener() {
                 @Override
                 public void onTouchModeChanged(boolean isInTouchMode) {
-                    try {
-                        if (mSurfaceControl != null) {
-                            mSurfaceControl.onWindowFocusChanged(hasFocus(), isInTouchMode);
-                        }
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Remote connection lost", e);
+                    requireNonNull(mServiceDispatcher);
+
+                    ISurfaceControl surfaceControl = mSurfaceControl;
+                    if (surfaceControl != null) {
+                        mServiceDispatcher.dispatch(() ->
+                                surfaceControl.onWindowFocusChanged(hasFocus(), isInTouchMode));
                     }
                 }
             };
@@ -90,6 +95,20 @@
     }
 
     /**
+     * Sets the {@link ServiceDispatcher} to be used to communicate with the host.
+     */
+    public void setServiceDispatcher(@NonNull ServiceDispatcher serviceDispatcher) {
+        mServiceDispatcher = serviceDispatcher;
+    }
+
+    /**
+     * Sets the {@link ErrorHandler} to be used to handle errors.
+     */
+    public void setErrorHandler(@NonNull ErrorHandler errorHandler) {
+        mErrorHandler = errorHandler;
+    }
+
+    /**
      * Registers a {@link OnCreateInputConnectionListener} that is notified of invocations on
      * {@link #onCreateInputConnection(EditorInfo)}.
      */
@@ -115,12 +134,11 @@
     protected void onFocusChanged(boolean gainFocus, int direction,
             @Nullable Rect previouslyFocusedRect) {
         super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
-        try {
-            if (mSurfaceControl != null) {
-                mSurfaceControl.onWindowFocusChanged(gainFocus, isInTouchMode());
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
+        requireNonNull(mServiceDispatcher);
+        ISurfaceControl surfaceControl = mSurfaceControl;
+        if (surfaceControl != null) {
+            mServiceDispatcher.dispatch(() ->
+                    surfaceControl.onWindowFocusChanged(gainFocus, isInTouchMode()));
         }
     }
 
@@ -128,31 +146,32 @@
     @Nullable
     public InputConnection onCreateInputConnection(@NonNull EditorInfo editorInfo) {
         requireNonNull(editorInfo);
+        requireNonNull(mServiceDispatcher);
 
         if (!mIsInInputMode || mOnCreateInputConnectionListener == null) {
             return null;
         }
 
-        try {
-            IProxyInputConnection proxyInputConnection =
-                    mOnCreateInputConnectionListener.onCreateInputConnection(editorInfo);
+        IProxyInputConnection proxyInputConnection =
+                mOnCreateInputConnectionListener.onCreateInputConnection(editorInfo);
 
-            // Clear the input and return null if inputConnectionListener is null or there is no
-            // open input connection on the host.
-            if (proxyInputConnection == null) {
-                Log.e(TAG,
-                        "InputConnectionListener has not been received yet. Canceling the input");
-                onStopInput();
-                return null;
-            }
-            copyEditorInfo(proxyInputConnection.getEditorInfo(), editorInfo);
-            return new RemoteProxyInputConnection(proxyInputConnection);
-
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
+        // Clear the input and return null if inputConnectionListener is null or there is no
+        // open input connection on the host.
+        if (proxyInputConnection == null) {
+            Log.e(TAG,
+                    "InputConnectionListener has not been received yet. Canceling the input");
+            onStopInput();
+            return null;
         }
 
-        return null;
+        EditorInfo hostEditorInfo =
+                mServiceDispatcher.fetch(null, proxyInputConnection::getEditorInfo);
+        if (hostEditorInfo == null) {
+            Log.e(TAG, "Unable to retrieve host EditorInfo");
+            return null;
+        }
+        copyEditorInfo(hostEditorInfo, editorInfo);
+        return new RemoteProxyInputConnection(mServiceDispatcher, proxyInputConnection);
     }
 
     private void copyEditorInfo(@NonNull EditorInfo from, @NonNull EditorInfo to) {
@@ -215,14 +234,8 @@
      * Updates the surface package. The surface package can be either a
      * {@link android.view.SurfaceControlViewHost.SurfacePackage} or a {@link LegacySurfacePackage}.
      */
-    public void setSurfacePackage(@NonNull Bundleable bundle) {
-        Object surfacePackage;
-        try {
-            surfacePackage = bundle.get();
-        } catch (BundlerException e) {
-            Log.e(TAG, "Unable to deserialize surface package.");
-            return;
-        }
+    public void setSurfacePackage(@NonNull Object surfacePackage) {
+        requireNonNull(mErrorHandler);
 
         if (SUPPORTS_SURFACE_CONTROL && surfacePackage instanceof SurfacePackage) {
             Api30Impl.setSurfacePackage(this, (SurfacePackage) surfacePackage);
@@ -230,6 +243,9 @@
             setSurfacePackage((LegacySurfacePackage) surfacePackage);
         } else {
             Log.e(TAG, "Unrecognized surface package");
+            mErrorHandler.onError(ErrorHandler.ErrorType.HOST_INCOMPATIBLE,
+                    new IllegalArgumentException("Unrecognized surface package: "
+                            + surfacePackage));
         }
     }
 
@@ -240,16 +256,12 @@
      */
     @SuppressLint({"ClickableViewAccessibility"})
     private void setSurfacePackage(LegacySurfacePackage surfacePackage) {
+        requireNonNull(mServiceDispatcher);
+
         ISurfaceControl surfaceControl = surfacePackage.getSurfaceControl();
         SurfaceWrapper surfaceWrapper = mSurfaceWrapperProvider.createSurfaceWrapper();
-        try {
-            surfaceControl.setSurfaceWrapper(Bundleable.create(surfaceWrapper));
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
-            return;
-        } catch (BundlerException e) {
-            Log.e(TAG, "Unable to serialize surface wrapper", e);
-        }
+        mServiceDispatcher.dispatch(() ->
+                surfaceControl.setSurfaceWrapper(Bundleable.create(surfaceWrapper)));
         mSurfaceControl = surfaceControl;
         setOnTouchListener((view, event) -> handleTouchEvent(event));
     }
@@ -268,17 +280,15 @@
 
     /** Passes the touch events to the host. */
     boolean handleTouchEvent(@NonNull MotionEvent event) {
+        requireNonNull(mServiceDispatcher);
+
         // Make a copy to avoid double recycling of the event.
         MotionEvent eventCopy = MotionEvent.obtain(requireNonNull(event));
-        try {
-            if (mSurfaceControl != null) {
-                mSurfaceControl.onTouchEvent(eventCopy);
-                return true;
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Remote connection lost", e);
+        ISurfaceControl surfaceControl = mSurfaceControl;
+        if (surfaceControl != null) {
+            mServiceDispatcher.dispatch(() -> surfaceControl.onTouchEvent(eventCopy));
+            return true;
         }
-
         return false;
     }
 
diff --git a/car/app/app-activity/src/main/res/layout/activity_template.xml b/car/app/app-activity/src/main/res/layout/activity_template.xml
index 09c432f..7054403 100644
--- a/car/app/app-activity/src/main/res/layout/activity_template.xml
+++ b/car/app/app-activity/src/main/res/layout/activity_template.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <merge xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/fragment_container">
 
     <androidx.car.app.activity.renderer.surface.TemplateSurfaceView
@@ -11,6 +10,7 @@
         android:focusableInTouchMode="true" />
 
     <LinearLayout
+        android:background="#000000"
         android:id="@+id/error_message_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/car/app/app-activity/src/main/res/layout/error_message_fragment.xml b/car/app/app-activity/src/main/res/layout/error_message_fragment.xml
index a40e550..c206351 100644
--- a/car/app/app-activity/src/main/res/layout/error_message_fragment.xml
+++ b/car/app/app-activity/src/main/res/layout/error_message_fragment.xml
@@ -39,6 +39,7 @@
                 android:id="@+id/message_icon"
                 android:layout_width="@dimen/car_app_message_icon_size"
                 android:layout_height="@dimen/car_app_message_icon_size"
+                android:src="@drawable/car_app_icon_error"
                 tools:ignore="ContentDescription" />
 
             <TextView
diff --git a/car/app/app-activity/src/main/res/values/strings.xml b/car/app/app-activity/src/main/res/values/strings.xml
index cdf02d0..c8ef518 100644
--- a/car/app/app-activity/src/main/res/values/strings.xml
+++ b/car/app/app-activity/src/main/res/values/strings.xml
@@ -15,8 +15,33 @@
   -->
 
 <resources>
-    <string name="error_message_key">error message key</string>
-    <string name="error_type_key">Error type key</string>
-    <string name="exit">Exit</string>
-    <string name="redirect">PlayStore</string>
+    <!-- Action titles -->
+    <!-- Title of a button that allows the user to exit the application [CHAR_LIMIT=50] -->
+    <string name="error_action_finish">Exit application</string>
+    <!-- Title of a button that allows the user to check for updates [CHAR_LIMIT=50] -->
+    <string name="error_action_update_host">Check for updates</string>
+
+    <!-- Error messages -->
+    <!-- Message displayed when there is an error on the client side [CHAR_LIMIT=200] -->
+    <string name="error_message_client_side_error">Application error. Please close and try
+        again. If the problem persists, please contact the application developer.</string>
+    <!-- Message displayed when there is an error on the host side [CHAR_LIMIT=200] -->
+    <string name="error_message_host_error">System error. Please close and try again.
+        If the problem persists, please contact the device manufacturer.</string>
+    <!-- Message displayed when the connection to the host is interrupted [CHAR_LIMIT=200] -->
+    <string name="error_message_host_connection_lost">Unable to connect with the system. Please
+        close and try again. If the problem persists, please contact the system
+        manufacturer.</string>
+    <!-- Message displayed when no host is found in the system [CHAR_LIMIT=200] -->
+    <string name="error_message_host_not_found">System requires update. Please check for
+        updates, or contact your device manufacturer.</string>
+    <!-- Message displayed when the host is not compatible with this client [CHAR_LIMIT=200] -->
+    <string name="error_message_host_incompatible">System requires update. Please check for
+        updates, or contact your device manufacturer.</string>
+    <!-- Message displayed when there are multiple hosts in the system [CHAR_LIMIT=200] -->
+    <string name="error_message_multiple_hosts">Incompatible system. Please contact your device
+        manufacturer.</string>
+    <!-- Message displayed when an unknown error is detected [CHAR_LIMIT=200] -->
+    <string name="error_message_unknown_error">Unknown error detected. Please close the app and try
+        again. If the problem persists, please contact the application developer.</string>
 </resources>
\ No newline at end of file
diff --git a/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppActivityTest.java b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
index 65939dd..7ffef3b 100644
--- a/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
+++ b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppActivityTest.java
@@ -197,8 +197,8 @@
                             ActivityLifecycleCallbacks.class);
                     activity.registerActivityLifecycleCallbacks(activityCallback);
                     // Report service connection error.
-                    activity.onServiceConnectionError("fake error",
-                            CarAppActivity.ErrorActionType.FINISH);
+                    activity.mErrorHandler.onError(ErrorHandler.ErrorType.HOST_ERROR,
+                            new Exception("fake error"));
 
                     assertThat(activity.isFinishing()).isEqualTo(false);
 
@@ -239,8 +239,11 @@
                 CarAppActivity.class)) {
             scenario.onActivity(activity -> {
                 try {
-                    ServiceConnection serviceConnection = spy(activity.getServiceConnection());
-                    activity.setServiceConnection(serviceConnection);
+                    ServiceConnectionManager serviceConnectionManager =
+                            activity.mViewModel.getServiceConnectionManager();
+                    ServiceConnection serviceConnection =
+                            spy(serviceConnectionManager.getServiceConnection());
+                    serviceConnectionManager.setServiceConnection(serviceConnection);
 
                     // Destroy activity to force unbind.
                     scenario.moveToState(Lifecycle.State.DESTROYED);
@@ -251,7 +254,7 @@
                     // Verify service connection is closed.
                     verify(serviceConnection, times(1)).onServiceDisconnected(
                             mRendererComponent);
-                    assertThat(activity.mRendererService).isNull();
+                    assertThat(serviceConnectionManager.isBound()).isFalse();
                 } catch (RemoteException e) {
                     fail(Log.getStackTraceString(e));
                 }
@@ -392,11 +395,6 @@
             mService.terminate(serviceName);
         }
 
-        @Override
-        public boolean isVersionSupported(String version) {
-            return true;
-        }
-
         public ICarAppActivity getCarAppActivity() {
             return mCarAppActivity;
         }
diff --git a/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java
new file mode 100644
index 0000000..7650a2d
--- /dev/null
+++ b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelFactoryTest.java
@@ -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.car.app.activity;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Application;
+import android.content.ComponentName;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link CarAppViewModelFactory} */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class CarAppViewModelFactoryTest {
+    private static final ComponentName TEST_COMPONENT_NAME_1 = new ComponentName(
+            ApplicationProvider.getApplicationContext(), "Class1");
+    private static final ComponentName TEST_COMPONENT_NAME_2 = new ComponentName(
+            ApplicationProvider.getApplicationContext(), "Class2");
+
+    private final Application mApplication = ApplicationProvider.getApplicationContext();
+
+    @Test
+    public void getInstance_sameKey_returnsSame() {
+        CarAppViewModelFactory factory1 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1);
+
+        CarAppViewModelFactory factory2 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1);
+
+        assertThat(factory1).isEqualTo(factory2);
+    }
+
+    @Test
+    public void getInstance_differentKeys_returnsDifferent() {
+        CarAppViewModelFactory factory1 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1);
+
+        CarAppViewModelFactory factory2 = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_2);
+
+        assertThat(factory1).isNotEqualTo(factory2);
+    }
+
+    @Test
+    public void create_correctComponentName() {
+        CarAppViewModelFactory factory = CarAppViewModelFactory.getInstance(mApplication,
+                TEST_COMPONENT_NAME_1);
+
+        CarAppViewModel viewModel = factory.create(CarAppViewModel.class);
+
+        assertThat(viewModel).isNotNull();
+        assertThat(viewModel.getServiceConnectionManager().getServiceComponentName())
+                .isEqualTo(TEST_COMPONENT_NAME_1);
+    }
+}
diff --git a/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelTest.java b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelTest.java
new file mode 100644
index 0000000..9eda009
--- /dev/null
+++ b/car/app/app-activity/src/test/java/androidx/car/app/activity/CarAppViewModelTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.car.app.activity;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Intent;
+
+import androidx.car.app.activity.renderer.ICarAppActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link CarAppViewModel} */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class CarAppViewModelTest {
+    private static final ComponentName TEST_COMPONENT_NAME = new ComponentName(
+            ApplicationProvider.getApplicationContext(), "Class1");
+    private static final int TEST_DISPLAY_ID = 123;
+    private static final Intent TEST_INTENT = new Intent("TestAction");
+
+    private final Application mApplication = ApplicationProvider.getApplicationContext();
+    private CarAppViewModel mCarAppViewModel;
+    private ICarAppActivity mICarAppActivity;
+
+    @Before
+    public void setUp() {
+        mCarAppViewModel = new CarAppViewModel(mApplication, TEST_COMPONENT_NAME);
+        mICarAppActivity = mock(ICarAppActivity.class);
+    }
+
+    @Test
+    public void testSetup() {
+        assertThat(mCarAppViewModel.getServiceConnectionManager()).isNotNull();
+        assertThat(mCarAppViewModel.getServiceConnectionManager().getServiceComponentName())
+                .isEqualTo(TEST_COMPONENT_NAME);
+        assertThat(mCarAppViewModel.getServiceDispatcher()).isNotNull();
+    }
+
+    @Test
+    public void testBind_serviceConnectionManager_invoke() {
+        ServiceConnectionManager serviceConnectionManager = mock(ServiceConnectionManager.class);
+        mCarAppViewModel.setServiceConnectionManager(serviceConnectionManager);
+        mCarAppViewModel.bind(TEST_INTENT, mICarAppActivity, TEST_DISPLAY_ID);
+
+        verify(serviceConnectionManager).bind(TEST_INTENT, mICarAppActivity, TEST_DISPLAY_ID);
+    }
+
+    @Test
+    public void testUnbind_serviceConnectionManager_invoke() {
+        ServiceConnectionManager serviceConnectionManager = mock(ServiceConnectionManager.class);
+        mCarAppViewModel.setServiceConnectionManager(serviceConnectionManager);
+        mCarAppViewModel.unbind();
+
+        verify(serviceConnectionManager).unbind();
+    }
+
+    @Test
+    public void testErrorHandler_capturesErrorEvent() {
+        ErrorHandler.ErrorType errorType = ErrorHandler.ErrorType.HOST_ERROR;
+        Throwable exception = new IllegalStateException();
+
+        ErrorHandler errorHandler =
+                mCarAppViewModel.getServiceConnectionManager().getErrorHandler();
+        errorHandler.onError(errorType, exception);
+
+        CarAppViewModel.ErrorEvent errorEvent = mCarAppViewModel.getErrorEvent().getValue();
+        assertThat(errorEvent).isNotNull();
+        assertThat(errorEvent.getErrorType()).isEqualTo(errorType);
+        assertThat(errorEvent.getException()).isEqualTo(exception);
+    }
+}
diff --git a/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceConnectionManagerTest.java b/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceConnectionManagerTest.java
new file mode 100644
index 0000000..82bc8c1
--- /dev/null
+++ b/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceConnectionManagerTest.java
@@ -0,0 +1,289 @@
+/*
+ * 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.car.app.activity;
+
+import static android.os.Looper.getMainLooper;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.car.app.activity.renderer.ICarAppActivity;
+import androidx.car.app.activity.renderer.IRendererService;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowPackageManager;
+
+/** Tests for {@link ServiceConnectionManager}. */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class ServiceConnectionManagerTest {
+
+    private static final int TEST_DISPLAY_ID = 123;
+    private static final Intent TEST_INTENT = new Intent("Test");
+
+    private final ComponentName mRendererComponent = new ComponentName(
+            ApplicationProvider.getApplicationContext(), getClass().getName());
+
+    private final String mFakeCarAppServiceClass = "com.fake.FakeCarAppService";
+    private final ComponentName mFakeCarAppServiceComponent = new ComponentName(
+            ApplicationProvider.getApplicationContext(), mFakeCarAppServiceClass);
+    private final IRendererService mRenderService = mock(IRendererService.class);
+    private final RenderServiceDelegate mRenderServiceDelegate =
+            new RenderServiceDelegate(mRenderService);
+
+    private final ErrorHandler mErrorHandler = mock(ErrorHandler.class);
+    private final ServiceConnectionManager mServiceConnectionManager =
+            new ServiceConnectionManager(ApplicationProvider.getApplicationContext(),
+                    mFakeCarAppServiceComponent, mErrorHandler);
+
+    private void setupCarAppActivityForTesting() {
+        try {
+            Application app = ApplicationProvider.getApplicationContext();
+
+            PackageManager packageManager = app.getPackageManager();
+            ShadowPackageManager spm = shadowOf(packageManager);
+
+            // Register fake renderer service which will be simulated by {@code mRenderService}.
+            spm.addServiceIfNotPresent(mRendererComponent);
+            spm.addIntentFilterForService(mRendererComponent,
+                    new IntentFilter(CarAppActivity.ACTION_RENDER));
+
+            when(mRenderService.initialize(any(ICarAppActivity.class),
+                    any(ComponentName.class),
+                    anyInt())).thenReturn(true);
+            when(mRenderService.onNewIntent(any(Intent.class), any(ComponentName.class),
+                    anyInt())).thenReturn(true);
+
+            ShadowApplication sa = shadowOf(app);
+            sa.setComponentNameAndServiceForBindService(mRendererComponent, mRenderServiceDelegate);
+        } catch (Exception e) {
+            fail(Log.getStackTraceString(e));
+        }
+    }
+
+    @Test
+    public void testIsBound_serviceNotNull_returnsTrue() {
+        mServiceConnectionManager.setRendererService(mock(IRendererService.class));
+        assertThat(mServiceConnectionManager.isBound()).isTrue();
+    }
+
+    @Test
+    public void testIsBound_serviceIsNull_returnsFalse() {
+        mServiceConnectionManager.setRendererService(null);
+        assertThat(mServiceConnectionManager.isBound()).isFalse();
+    }
+
+    @Test
+    public void testBind_unbound_bindsToRenderer() {
+        setupCarAppActivityForTesting();
+        ICarAppActivity iCarAppActivity = mock(ICarAppActivity.class);
+
+        mServiceConnectionManager.bind(TEST_INTENT, iCarAppActivity, TEST_DISPLAY_ID);
+        shadowOf(getMainLooper()).idle();
+        try {
+            verify(mErrorHandler, never()).onError(any(), any());
+            verify(mRenderService).initialize(iCarAppActivity, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+            verify(mRenderService).onNewIntent(TEST_INTENT, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+        assertThat(mServiceConnectionManager.isBound()).isTrue();
+    }
+
+    @Test
+    public void testBind_bound_doesNotRebound() {
+        setupCarAppActivityForTesting();
+        ICarAppActivity iCarAppActivity = mock(ICarAppActivity.class);
+
+        IRendererService renderService = createMockRendererService();
+        mServiceConnectionManager.setRendererService(renderService);
+        mServiceConnectionManager.bind(TEST_INTENT, iCarAppActivity, TEST_DISPLAY_ID);
+        shadowOf(getMainLooper()).idle();
+        try {
+            verify(mErrorHandler, never()).onError(any(), any());
+            verify(mRenderService, never()).initialize(iCarAppActivity, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+            verify(mRenderService, never()).onNewIntent(TEST_INTENT, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+        assertThat(mServiceConnectionManager.isBound()).isTrue();
+    }
+
+    @Test
+    public void testBind_bound_initializes() {
+        setupCarAppActivityForTesting();
+        ICarAppActivity iCarAppActivity = mock(ICarAppActivity.class);
+
+        IRendererService renderService = createMockRendererService();
+
+        mServiceConnectionManager.setRendererService(renderService);
+        mServiceConnectionManager.bind(TEST_INTENT, iCarAppActivity, TEST_DISPLAY_ID);
+        shadowOf(getMainLooper()).idle();
+
+        try {
+            verify(mErrorHandler, never()).onError(any(), any());
+            verify(renderService).initialize(iCarAppActivity, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+            verify(renderService).onNewIntent(TEST_INTENT, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+        assertThat(mServiceConnectionManager.isBound()).isTrue();
+    }
+
+    @Test
+    public void testBind_bound_noRebound() {
+        setupCarAppActivityForTesting();
+        ICarAppActivity iCarAppActivity = mock(ICarAppActivity.class);
+        IRendererService renderService = createMockRendererService();
+
+        mServiceConnectionManager.setRendererService(renderService);
+        mServiceConnectionManager.bind(TEST_INTENT, iCarAppActivity, TEST_DISPLAY_ID);
+        shadowOf(getMainLooper()).idle();
+        try {
+            verify(mErrorHandler, never()).onError(any(), any());
+            verify(mRenderService, never()).initialize(iCarAppActivity, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+            verify(mRenderService, never()).onNewIntent(TEST_INTENT, mFakeCarAppServiceComponent,
+                    TEST_DISPLAY_ID);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+        assertThat(mServiceConnectionManager.isBound()).isTrue();
+    }
+
+    @Test
+    public void testBind_unbound_failure() {
+        setupCarAppActivityForTesting();
+        ICarAppActivity iCarAppActivity = mock(ICarAppActivity.class);
+
+        try {
+            when(mRenderService.initialize(any(ICarAppActivity.class),
+                    any(ComponentName.class),
+                    anyInt())).thenReturn(false);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+
+        mServiceConnectionManager.bind(TEST_INTENT, iCarAppActivity, TEST_DISPLAY_ID);
+        shadowOf(getMainLooper()).idle();
+
+        verify(mErrorHandler).onError(eq(ErrorHandler.ErrorType.HOST_ERROR), any());
+    }
+
+    @Test
+    public void testUnBind_bound_terminate() {
+        setupCarAppActivityForTesting();
+
+        IRendererService renderService = mock(IRendererService.class);
+        mServiceConnectionManager.setRendererService(renderService);
+        mServiceConnectionManager.unbind();
+        shadowOf(getMainLooper()).idle();
+
+        try {
+            verify(renderService).terminate(mFakeCarAppServiceComponent);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+
+        assertThat(mServiceConnectionManager.isBound()).isFalse();
+    }
+
+    @Test
+    public void testUnBind_unbound_doNothing() {
+        setupCarAppActivityForTesting();
+
+        mServiceConnectionManager.unbind();
+        shadowOf(getMainLooper()).idle();
+
+        try {
+            verify(mRenderService, never()).terminate(mFakeCarAppServiceComponent);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+
+        assertThat(mServiceConnectionManager.isBound()).isFalse();
+    }
+
+    // Use delegate to forward events to a mock. Mockito interceptor is not maintained on
+    // top-level IBinder after call to IRenderService.Stub.asInterface() in CarAppActivity.
+    private static class RenderServiceDelegate extends IRendererService.Stub {
+        private final IRendererService mService;
+
+        RenderServiceDelegate(IRendererService service) {
+            mService = service;
+        }
+
+        @Override
+        public boolean initialize(ICarAppActivity carActivity, ComponentName serviceName,
+                int displayId) throws RemoteException {
+            return mService.initialize(carActivity, serviceName, displayId);
+        }
+
+        @Override
+        public boolean onNewIntent(Intent intent, ComponentName serviceName, int displayId)
+                throws RemoteException {
+            return mService.onNewIntent(intent, serviceName, displayId);
+        }
+
+        @Override
+        public void terminate(ComponentName serviceName) throws RemoteException {
+            mService.terminate(serviceName);
+        }
+    }
+
+    private IRendererService createMockRendererService() {
+        IRendererService renderService = mock(IRendererService.class);
+        try {
+            when(renderService.initialize(any(ICarAppActivity.class),
+                    any(ComponentName.class),
+                    anyInt())).thenReturn(true);
+            when(renderService.onNewIntent(any(Intent.class), any(ComponentName.class),
+                    anyInt())).thenReturn(true);
+        } catch (RemoteException e) {
+            fail(Log.getStackTraceString(e));
+        }
+        return renderService;
+    }
+}
diff --git a/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceDispatcherTest.java b/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceDispatcherTest.java
new file mode 100644
index 0000000..ea22617
--- /dev/null
+++ b/car/app/app-activity/src/test/java/androidx/car/app/activity/ServiceDispatcherTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.car.app.activity;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.RemoteException;
+
+import androidx.car.app.activity.renderer.IRendererService;
+import androidx.car.app.serialization.BundlerException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link ServiceDispatcher} */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class ServiceDispatcherTest {
+    private ErrorHandler mErrorHandler;
+    private ServiceDispatcher mServiceDispatcher;
+
+    @Before
+    public void setup() {
+        mErrorHandler = mock(ErrorHandler.class);
+        mServiceDispatcher = new ServiceDispatcher(mErrorHandler, () -> false);
+    }
+
+    @Test
+    public void dispatch_serviceBound_invoked() throws RemoteException {
+        IRendererService rendererService = mock(IRendererService.class);
+        Intent intent = mock(Intent.class);
+        ComponentName componentName = mock(ComponentName.class);
+
+
+        ServiceDispatcher.OneWayCall call = () -> rendererService.onNewIntent(intent,
+                componentName, 0);
+
+        mServiceDispatcher.setOnBindingListener(() -> true);
+        mServiceDispatcher.dispatch(call);
+
+        verify(rendererService, times(1)).onNewIntent(intent, componentName, 0);
+    }
+
+    @Test
+    public void dispatch_serviceNotBound_notInvoked() throws BundlerException, RemoteException {
+        ServiceDispatcher.OneWayCall call = mock(ServiceDispatcher.OneWayCall.class);
+
+        mServiceDispatcher.setOnBindingListener(() -> false);
+        mServiceDispatcher.dispatch(call);
+
+        verify(call, never()).invoke();
+    }
+
+    @Test
+    public void dispatch_serviceThrowsError_errorHandlerInvoked() {
+        ServiceDispatcher.OneWayCall call = () -> {
+            throw new RemoteException();
+        };
+
+        mServiceDispatcher.setOnBindingListener(() -> true);
+        mServiceDispatcher.dispatch(call);
+
+        verify(mErrorHandler, times(1))
+                .onError(eq(ErrorHandler.ErrorType.HOST_ERROR), any());
+    }
+
+    @Test
+    public void fetch_serviceBound_valueReturned() {
+        ServiceDispatcher.ReturnCall<Integer> call = () -> 123;
+
+        mServiceDispatcher.setOnBindingListener(() -> true);
+        Integer result = mServiceDispatcher.fetch(234, call);
+
+        assertThat(result).isEqualTo(123);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void fetch_serviceNotBound_notInvokedAndReturnFallback()
+            throws BundlerException, RemoteException {
+        ServiceDispatcher.ReturnCall<Integer> call = mock(ServiceDispatcher.ReturnCall.class);
+
+        mServiceDispatcher.setOnBindingListener(() -> false);
+        Integer result = mServiceDispatcher.fetch(234, call);
+
+        verify(call, never()).invoke();
+        assertThat(result).isEqualTo(234);
+    }
+
+    @Test
+    public void fetch_serviceThrowsError_errorHandlerInvokedAndReturnFallback() {
+        ServiceDispatcher.ReturnCall<Integer> call = () -> {
+            throw new RemoteException();
+        };
+
+        mServiceDispatcher.setOnBindingListener(() -> true);
+        Integer result = mServiceDispatcher.fetch(234, call);
+
+        verify(mErrorHandler, times(1))
+                .onError(eq(ErrorHandler.ErrorType.HOST_ERROR), any());
+        assertThat(result).isEqualTo(234);
+    }
+}
diff --git a/car/app/app-property/api/current.txt b/car/app/app-property/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-property/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-property/api/public_plus_experimental_current.txt b/car/app/app-property/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-property/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-property/api/res-current.txt b/car/app/app-property/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/car/app/app-property/api/res-current.txt
diff --git a/car/app/app-property/api/restricted_current.txt b/car/app/app-property/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-property/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-property/build.gradle b/car/app/app-property/build.gradle
new file mode 100644
index 0000000..07349b8
--- /dev/null
+++ b/car/app/app-property/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    annotationProcessor(NULLAWAY)
+
+    implementation("androidx.annotation:annotation:1.2.0")
+    implementation("androidx.annotation:annotation-experimental:1.1.0")
+}
+
+androidx {
+    name = "androidx.car.app:app-property"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.CAR_APP
+    inceptionYear = "2021"
+    description = "Access car properties such as energy levels and speed"
+}
diff --git a/car/app/app-property/src/androidTest/AndroidManifest.xml b/car/app/app-property/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..75d3534
--- /dev/null
+++ b/car/app/app-property/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?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.car.app.property.test">
+
+</manifest>
diff --git a/car/app/app-property/src/main/AndroidManifest.xml b/car/app/app-property/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..c920c0a
--- /dev/null
+++ b/car/app/app-property/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?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.car.app.property">
+
+</manifest>
\ No newline at end of file
diff --git a/car/app/app-property/src/main/java/androidx/car/app/property/package-info.java b/car/app/app-property/src/main/java/androidx/car/app/property/package-info.java
new file mode 100644
index 0000000..840c4ed
--- /dev/null
+++ b/car/app/app-property/src/main/java/androidx/car/app/property/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Support classes for accessing car properties.
+ */
+package androidx.car.app.property;
diff --git a/car/app/app-samples/README.md b/car/app/app-samples/README.md
index 439ab6e..8cc36205 100644
--- a/car/app/app-samples/README.md
+++ b/car/app/app-samples/README.md
@@ -13,7 +13,7 @@
  left. Each sample app has two build targets, one for the mobile platform and the other for the
   automotive platform.
 
-3. Go to Build -> Make Module 'androidx.car.app.app-samples.<sample_app>-<platform>'. The apks
+3. Go to `Build -> Make Module 'androidx.car.app.app-samples.<sample_app>-<platform>'`. The apks
  will be generated in `<repo root>/out/androidx/car/app/app-samples/<sample_app>-<platform>/build
  /outputs/apk`.
 
@@ -21,11 +21,11 @@
 
 1. Open the [AndroidX project][5] in Android Studio.
 
-2. Go to `Run -> Edit` Configurations, select your app (e.g. `car.app.app-samples.helloworld
-   -mobile`). If you are building for the `mobile` platform, also select `Launch: Nothing` in
-    `General -> Launch Options`. Click OK to close the dialog.
+2. Go to `Run -> Edit Configurations`, select a sample app target (e.g. `car.app.app-samples
+.helloworld-mobile`). If you are building for the `mobile` platform, also select `Launch: Nothing
+` in `General -> Launch Options`. Click `OK` to close the dialog.
 
-3. Select Run -> Run ‘<your app>’, to run the app, which will just install it in the selected
+3. Select `Run -> Run <sample_app>`, to run the app, which will just install it in the selected
  device.
 
 Run From the Command Line
@@ -34,6 +34,7 @@
 
 ```bash
 ./gradlew :car:app:app-samples:helloworld-mobile:assemble
+ ./gradlew :car:app:app-samples:helloworld-automotive:assemble
 ```
 
 The APKs will be generated in `<repo root>/out/androidx/car/app/app-samples/<sample_app>-<platform>/build/outputs/apk`.
@@ -41,7 +42,7 @@
 Install the APK with ADB:
 
 ```bash
-adb install -t <path_to_your_apk>
+adb install <path_to_sample_app_apk>
 ```
 
 In order to install to a device directly, run the `installDebug` or `installRelease` gradle task
@@ -52,7 +53,7 @@
 ./gradlew :car:app:app-samples:helloworld-automotive:installRelease
 ```
 
-Run the Apps in the Desktop Head Unit (DHU)
+Run the Mobile App in the Desktop Head Unit (DHU)
 -------------------------------------------
 Follow the instructions in [Test Android apps for cars][1] to run the sample apps in the DHU.
 
@@ -69,4 +70,15 @@
 [2]: https://developer.android.com/studio/debug/dev-options
 [3]: https://developer.android.com/training/cars/testing#step1
 [4]: https://developer.android.com/training/cars/testing#running-dhu
-[5]: https://android.googlesource.com/platform/frameworks/support/+/ac0c1d466abcfdcab2babb2e10eca574247e3c92/README.md#using-android-studio
\ No newline at end of file
+[5]: https://android.googlesource.com/platform/frameworks/support/+/ac0c1d466abcfdcab2babb2e10eca574247e3c92/README.md#using-android-studio
+
+Run the Automotive App in the Automotive OS Emulator
+-------------------------------------------
+In order to use the Automotive OS emulator, download the Android Studio 4.2 or higher (currently
+ only available in the Beta and Canary tracks), and do the following:
+
+ 1. Select `Tools -> AVD Manager`.
+ 2. Select `Create Virtual Device...`.
+ 3. Select `Automotive` in the device category, and click `Next`.
+ 4. Select `X86 Images`, then download an image for Android Q.
+ 5. Finish creating the emulator, and run it.
\ No newline at end of file
diff --git a/car/app/app-samples/github_README.md b/car/app/app-samples/github_README.md
index c86bf5a..c4d5af0 100644
--- a/car/app/app-samples/github_README.md
+++ b/car/app/app-samples/github_README.md
@@ -13,53 +13,56 @@
 
 1. Open the project in Android Studio: File -> Open -> Select this directory and click OK.
 
-2. Select a sample app directory (e.g. `helloworld-mobile`) in the `Project Structure` UI on the top
+2. Select a sample app directory (e.g. `helloworld/mobile`) in the `Project Structure` UI on the top
  left. Each sample app has two build targets, one for the `mobile` platform and the other for the
   `automotive` platform.
 
-3. Go to Build -> Make Module 'androidx.car.app.app-samples.<sample_app>-<platform>'. The apks
- will be generated in `<sample_app>-<platform>/build/outputs/apk`.
+3. Go to `Build -> Make Module 'androidx.car.app.app-samples.<sample_app>.<platform>'`. The apks
+ will be generated in `<sample_app>/<platform>/build/outputs/apk`.
 
 In order to install and run the apps,
 
 1. Open the AndroidX project in Android Studio.
 
-2. Go to `Run -> Edit` Configurations, select your app (e.g. `car.app.app-samples.helloworld
--mobile`). If you are building for the `mobile` platform, also select `Launch: Nothing` in `General
- -> Launch Options`. Click OK to close the dialog.
+2. Go to `Run -> Edit Configurations`, select a sample app target (e.g. `car.app.app-samples
+.helloworld-mobile`). If you are building for the `mobile` platform, also select `Launch: Nothing
+` in `General -> Launch Options`. Click `OK` to close the dialog.
 
-3. Select Run -> Run ‘your app’, to run the app, which will just install it in the selected device.
+3. Select `Run -> Run <sample_app>`, to run the app, which will just install it in the selected
+ device.
 
 Run From the Command Line
 ---------------------
-1. Run `./gradlew :<sample>-<platform>:assemble` to assemble the APKs. E.g.
+1. Run `./gradlew :<sample_app>:<platform>:assemble` to assemble the APKs. E.g.
 
 ```bash
-./gradlew :showcase-mobile:assemble
+./gradlew :showcase:mobile:assemble
+./gradlew :showcase:automotive:assemble
 ```
 
-The APK should be generated under your app’s build directory, e.g. `<your_app>-<platform>/build
-/outputs/apk/debug`.
+The APK should be generated under the sample app’s build directory, e.g. `<sample_app>/<platform>/build/outputs/apk/debug`.
 
 If you see this error during the build:
 
     ```shell
-    > SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your projects local properties file at <repo_path>/car/car_app_library/local.properties
+    > SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by
+     setting the sdk.dir path in your projects local properties file at <project_path
+     >/local.properties
     ```
 
-Create `local.properties` file under `car_app_library` directory, and copy the following line:
+Create `local.properties` file under the project directory, and copy the following line:
 
     ```
-    sdk.dir = <your_home_directory>/Android/Sdk
+    sdk.dir = <your android sdk directory path>
     ```
 
 2. Install the APK with ADB:
 
 ```bash
-adb install -t <path_to_your_apk>
+adb install <path_to_sample_app_apk>
 ```
 
-Run the Apps in the Desktop Head Unit (DHU)
+Run the Mobile Apps in the Desktop Head Unit (DHU)
 -------------------------------------------
 Follow the instructions in [Test Android apps for cars][1] to run the sample apps in the DHU.
 
@@ -71,6 +74,16 @@
 
 **Note**: In Android Q, there is no Android Auto app in the launcher. The way to get to the settings in that case is through Settings -> Apps & Notifications -> See all apps -> Android Auto -> Advanced -> Additional settings in the app.
 
+Run the Automotive Apps in the Automotive OS Emulator
+-------------------------------------------
+In order to use the Automotive OS emulator, download the Android Studio 4.2 or higher (currently
+ only available in the Beta and Canary tracks), and do the following:
+
+ 1. Select `Tools -> AVD Manager`.
+ 2. Select `Create Virtual Device...`.
+ 3. Select `Automotive` in the device category, and click `Next`.
+ 4. Select `X86 Images`, then download an image for Android Q.
+ 5. Finish creating the emulator, and run it.
 
 [1]: https://developer.android.com/training/cars/testing
 [2]: https://developer.android.com/studio/debug/dev-options
diff --git a/car/app/app-samples/helloworld/automotive/lint-baseline.xml b/car/app/app-samples/helloworld/automotive/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/car/app/app-samples/helloworld/automotive/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/car/app/app-samples/helloworld/automotive/src/main/AndroidManifest.xml b/car/app/app-samples/helloworld/automotive/src/main/AndroidManifest.xml
index f47864d..431920d 100644
--- a/car/app/app-samples/helloworld/automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/helloworld/automotive/src/main/AndroidManifest.xml
@@ -24,31 +24,41 @@
 
     <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
-    <meta-data android:name="com.google.android.gms.car.application"
-        android:resource="@xml/automotive_app_desc"
-        tools:ignore="MetadataTagInsideApplicationTag" />
-    <service
-        android:name="androidx.car.app.sample.helloworld.common.HelloWorldService"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="androidx.car.app.CarAppService" />
-      </intent-filter>
-      <meta-data android:name="androidx.car.app.CAR_APP_ACTIVITY"
-          android:value="androidx.car.app.sample.helloworld.common.HelloWorld" />
-    </service>
-    <activity-alias
-        android:enabled="true"
-        android:exported="true"
-        android:label="Hello World"
-        android:name="HelloWorld"
-        android:targetActivity="androidx.car.app.activity.CarAppActivity" >
-      <intent-filter>
-        <action android:name="android.intent.action.MAIN" />
-        <category android:name="android.intent.category.LAUNCHER" />
-      </intent-filter>
-      <meta-data android:name="androidx.car.app.CAR_APP_SERVICE"
-          android:value="androidx.car.app.sample.helloworld.common.HelloWorldService" />
-    </activity-alias>
-  </application>
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
+
+        <meta-data
+            android:name="com.android.automotive"
+            android:resource="@xml/automotive_app_desc"
+            tools:ignore="MetadataTagInsideApplicationTag" />
+
+        <meta-data android:name="androidx.car.app.minApiLevel"
+            android:value="1"
+            tools:ignore="MetadataTagInsideApplicationTag" />
+
+        <service
+            android:name="androidx.car.app.sample.helloworld.common.HelloWorldService"
+            android:exported="true">
+          <intent-filter>
+            <action android:name="androidx.car.app.CarAppService" />
+          </intent-filter>
+          <meta-data android:name="androidx.car.app.CAR_APP_ACTIVITY"
+              android:value="androidx.car.app.sample.helloworld.common.HelloWorld" />
+        </service>
+
+        <activity-alias
+            android:enabled="true"
+            android:exported="true"
+            android:label="Hello World"
+            android:name="HelloWorld"
+            android:targetActivity="androidx.car.app.activity.CarAppActivity" >
+          <intent-filter>
+            <action android:name="android.intent.action.MAIN" />
+            <category android:name="android.intent.category.LAUNCHER" />
+          </intent-filter>
+          <meta-data android:name="androidx.car.app.CAR_APP_SERVICE"
+              android:value="androidx.car.app.sample.helloworld.common.HelloWorldService" />
+          <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity-alias>
+    </application>
 </manifest>
diff --git a/car/app/app-samples/helloworld/mobile/lint-baseline.xml b/car/app/app-samples/helloworld/mobile/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/car/app/app-samples/helloworld/mobile/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/car/app/app-samples/helloworld/mobile/src/main/AndroidManifest.xml b/car/app/app-samples/helloworld/mobile/src/main/AndroidManifest.xml
index 023175f..7a36a70 100644
--- a/car/app/app-samples/helloworld/mobile/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/helloworld/mobile/src/main/AndroidManifest.xml
@@ -21,10 +21,14 @@
     android:versionName="1.0">
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
     <meta-data android:name="com.google.android.gms.car.application"
         android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
     <service
         android:name="androidx.car.app.sample.helloworld.common.HelloWorldService"
         android:exported="true">
diff --git a/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml b/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
index 07bbd24..be7c611 100644
--- a/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/navigation/automotive/src/main/AndroidManifest.xml
@@ -30,14 +30,20 @@
 
   <uses-feature android:name="android.software.car.templates_host" />
 
-    <application
-      android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+  <application
+    android:label="@string/app_name"
+    android:icon="@drawable/ic_launcher"
+    android:extractNativeLibs="false">
 
-    <meta-data android:name="com.google.android.gms.car.application"
+    <meta-data
+        android:name="com.android.automotive"
         android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
         android:name="androidx.car.app.sample.navigation.common.car.NavigationCarAppService"
         android:foregroundServiceType="location"
@@ -56,17 +62,6 @@
         android:exported="true">
     </service>
 
-    <!-- TODO(b/184079723): investigate whether we need DeepLinkNotificationReceiver
-    in automotive samples -->
-    <receiver
-        android:name="androidx.car.app.sample.navigation.common.nav.DeepLinkNotificationReceiver"
-        android:enabled="true"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="com.navigation.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP"/>
-      </intent-filter>
-    </receiver>
-
     <activity-alias
         android:enabled="true"
         android:exported="true"
@@ -79,6 +74,7 @@
       </intent-filter>
       <meta-data android:name="androidx.car.app.CAR_APP_SERVICE"
           android:value="androidx.car.app.sample.navigation.common.car.NavigationCarAppService" />
+      <meta-data android:name="distractionOptimized" android:value="true"/>
     </activity-alias>
 
   </application>
diff --git a/car/app/app-samples/navigation/common/lint-baseline.xml b/car/app/app-samples/navigation/common/lint-baseline.xml
index fc548a4..e9956c6 100644
--- a/car/app/app-samples/navigation/common/lint-baseline.xml
+++ b/car/app/app-samples/navigation/common/lint-baseline.xml
@@ -2,63 +2,113 @@
 <issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is always >= 29"
-        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.car.NavigationCarAppService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="../src/main/java/androidx/car/app/sample/navigation/common/
-            car/NavigationCarAppService.java"
-            line="102"
-            column="13"/>
+            file="src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java"
+            line="106"
+            column="21"/>
     </issue>
 
     <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is always >= 29"
-        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.car.NavigationCarAppService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            notificationManager.createNotificationChannel(serviceChannel);"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="../src/main/java/androidx/car/app/sample/navigation/common/
-            car/NavigationCarAppService.java"
-            line="118"
-            column="13"/>
+            file="src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java"
+            line="107"
+            column="33"/>
     </issue>
 
     <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is never &lt; 29"
-        errorLine1="        if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.O) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="../src/main/java/androidx/car/app/sample/navigation/common/
-            nav/NavigationService.java"
-            line="423"
-            column="13"/>
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="451"
+            column="17"/>
     </issue>
 
     <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is always >= 29"
-        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setAudioAttributes(audioAttributes)"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~">
         <location
-            file="../src/main/java/androidx/car/app/sample/navigation/common/
-            nav/NavigationService.java"
-            line="500"
-            column="13"/>
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="452"
+            column="26"/>
     </issue>
 
     <issue
-        id="ObsoleteSdkInt"
-        message="Unnecessary; SDK_INT is always >= 29"
-        errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .build();"
+        errorLine2="                         ~~~~~">
         <location
-            file="../src/main/java/androidx/car/app/sample/navigation/common/
-            nav/NavigationService.java"
-            line="535"
-            column="13"/>
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="453"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        audioManager.abandonAudioFocusRequest(request);"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="466"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (audioManager.requestAudioFocus(request) != AUDIOFOCUS_REQUEST_GRANTED) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="471"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            audioManager.abandonAudioFocusRequest(request);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="488"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="505"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.navigation.common.nav.NavigationService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannel(serviceChannel);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java"
+            line="506"
+            column="34"/>
     </issue>
 
 </issues>
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationScreen.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationScreen.java
index 49b6deb..00def13 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationScreen.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationScreen.java
@@ -19,6 +19,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
@@ -42,6 +43,14 @@
 
 /** Simple demo of how to present a trip on the routing screen. */
 public final class NavigationScreen extends Screen {
+    /** Invalid zoom focal point value, used for the zoom buttons. */
+    private static final float INVALID_FOCAL_POINT_VAL = -1f;
+
+    /** Zoom-in scale factor, used for the zoom-in button. */
+    private static final float ZOOM_IN_BUTTON_SCALE_FACTOR = 1.1f;
+
+    /** Zoom-out scale factor, used for the zoom-out button. */
+    private static final float ZOOM_OUT_BUTTON_SCALE_FACTOR = 0.9f;
 
     /** A listener for navigation start and stop signals. */
     public interface Listener {
@@ -80,6 +89,8 @@
     @Nullable
     CarIcon mJunctionImage;
 
+    private boolean mIsInPanMode;
+
     public NavigationScreen(
             @NonNull CarContext carContext,
             @NonNull Action settingsAction,
@@ -125,6 +136,7 @@
         NavigationTemplate.Builder builder = new NavigationTemplate.Builder();
         builder.setBackgroundColor(CarColor.SECONDARY);
 
+        // Set the action strip.
         ActionStrip.Builder actionStripBuilder = new ActionStrip.Builder();
         actionStripBuilder.addAction(mSettingsAction);
         if (mIsNavigating) {
@@ -152,6 +164,59 @@
         }
         builder.setActionStrip(actionStripBuilder.build());
 
+        // Set the map action strip with the pan and zoom buttons.
+        CarIcon.Builder panIconBuilder = new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        R.drawable.ic_pan_24));
+        if (mIsInPanMode) {
+            panIconBuilder.setTint(CarColor.BLUE);
+        }
+
+        builder.setMapActionStrip(new ActionStrip.Builder()
+                .addAction(new Action.Builder(Action.PAN)
+                        .setIcon(panIconBuilder.build())
+                        .build())
+                .addAction(
+                        new Action.Builder()
+                                .setIcon(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        getCarContext(),
+                                                        R.drawable.ic_zoom_out_24))
+                                                .build())
+                                .setOnClickListener(
+                                        () -> mSurfaceRenderer.handleScale(INVALID_FOCAL_POINT_VAL,
+                                                INVALID_FOCAL_POINT_VAL,
+                                                ZOOM_OUT_BUTTON_SCALE_FACTOR))
+                                .build())
+                .addAction(
+                        new Action.Builder()
+                                .setIcon(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        getCarContext(),
+                                                        R.drawable.ic_zoom_in_24))
+                                                .build())
+                                .setOnClickListener(
+                                        () -> mSurfaceRenderer.handleScale(INVALID_FOCAL_POINT_VAL,
+                                                INVALID_FOCAL_POINT_VAL,
+                                                ZOOM_IN_BUTTON_SCALE_FACTOR))
+                                .build())
+                .build());
+
+        // When the user enters the pan mode, remind the user that they can exit the pan mode by
+        // pressing the select button again.
+        builder.setPanModeListener(isInPanMode -> {
+            if (isInPanMode) {
+                CarToast.makeText(getCarContext(),
+                        "Press Select to exit the pan mode",
+                        CarToast.LENGTH_LONG).show();
+            }
+            mIsInPanMode = isInPanMode;
+            invalidate();
+        });
+
         if (mIsNavigating) {
             if (mDestinationTravelEstimate != null) {
                 builder.setDestinationTravelEstimate(mDestinationTravelEstimate);
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
index e898c04..904ac44 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationSession.java
@@ -47,7 +47,6 @@
 import androidx.car.app.navigation.model.TravelEstimate;
 import androidx.car.app.sample.navigation.common.R;
 import androidx.car.app.sample.navigation.common.model.Instruction;
-import androidx.car.app.sample.navigation.common.nav.DeepLinkNotificationReceiver;
 import androidx.car.app.sample.navigation.common.nav.NavigationService;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.lifecycle.DefaultLifecycleObserver;
@@ -287,7 +286,7 @@
 
             Screen top = screenManager.getTop();
             switch (uri.getFragment()) {
-                case DeepLinkNotificationReceiver.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP:
+                case NavigationService.DEEP_LINK_ACTION:
                     if (!(top instanceof NavigationScreen)) {
                         screenManager.popToRoot();
                     }
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/RequestPermissionScreen.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/RequestPermissionScreen.java
index c4f0ded..331ac30 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/RequestPermissionScreen.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/RequestPermissionScreen.java
@@ -19,11 +19,9 @@
 import static android.Manifest.permission.ACCESS_FINE_LOCATION;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.MessageTemplate;
@@ -51,7 +49,6 @@
         mLocationPermissionCheckCallback = callback;
     }
 
-    @OptIn(markerClass = ExperimentalCarApi.class)
     @NonNull
     @Override
     public Template onGetTemplate() {
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
index bc9503b..dd92668 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
@@ -16,12 +16,16 @@
 
 package androidx.car.app.sample.navigation.common.car;
 
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
 import android.graphics.Paint.Style;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.util.Log;
 import android.view.Surface;
 
@@ -31,6 +35,7 @@
 import androidx.car.app.CarContext;
 import androidx.car.app.SurfaceCallback;
 import androidx.car.app.SurfaceContainer;
+import androidx.car.app.sample.navigation.common.R;
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
@@ -39,6 +44,15 @@
 public final class SurfaceRenderer implements DefaultLifecycleObserver {
     private static final String TAG = "SurfaceRenderer";
 
+    /** The maximum scale factor of the background map. */
+    private static final float MAX_SCALE_FACTOR = 5f;
+
+    /** The minimum scale factor of the background map. */
+    private static final float MIN_SCALE_FACTOR = 0.5f;
+
+    /** The scale factor to apply when initializing the background map. */
+    private static final float MAP_ENLARGE_FACTOR = 5f;
+
     @Nullable
     Surface mSurface;
     @Nullable
@@ -57,7 +71,37 @@
     private int mActiveMarker;
     private String mLocationString = "unknown";
 
-    private final SurfaceCallback mSurfaceCallback =
+    /** The bitmap that contains the background map image. */
+    private final Bitmap mBackgroundMap;
+
+    /**
+     * The transformation matrix for the background map image, to reflect the result of the user's
+     * pan and zoom actions.
+     */
+    final Matrix mBackgroundMapMatrix = new Matrix();
+
+    /** The cumulative scale factor for the background map image. */
+    float mCumulativeScaleFactor = 1f;
+
+    /**
+     * The current horizontal center point of the background map, used to prevent the map from
+     * disappearing from pan actions.
+     */
+    float mBackgroundMapCenterX = 0f;
+
+    /**
+     * The current vertical center point of the background map, used to prevent the map from
+     * disappearing from pan actions.
+     */
+    float mBackgroundMapCenterY = 0f;
+
+    /**
+     * The original clip bounds of the background map, used to prevent the map from disappearing
+     * from pan actions.
+     */
+    Rect mBackgroundMapClipBounds = new Rect();
+
+    public final SurfaceCallback mSurfaceCallback =
             new SurfaceCallback() {
                 @Override
                 public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) {
@@ -101,6 +145,28 @@
                         mSurface = null;
                     }
                 }
+
+                @Override
+                public void onScroll(float distanceX, float distanceY) {
+                    synchronized (SurfaceRenderer.this) {
+                        float newBackgroundCenterX = mBackgroundMapCenterX - distanceX;
+                        float newBackgroundCenterY = mBackgroundMapCenterY - distanceY;
+
+                        // If the map stays within the clip bounds, pan the map.
+                        if (mBackgroundMapClipBounds.contains((int) newBackgroundCenterX,
+                                (int) newBackgroundCenterY)) {
+                            mBackgroundMapCenterX = newBackgroundCenterX;
+                            mBackgroundMapCenterY = newBackgroundCenterY;
+                            mBackgroundMapMatrix.postTranslate(-distanceX, -distanceY);
+                            renderFrame();
+                        }
+                    }
+                }
+
+                @Override
+                public void onScale(float focusX, float focusY, float scaleFactor) {
+                    handleScale(focusX, focusY, scaleFactor);
+                }
             };
 
     public SurfaceRenderer(@NonNull CarContext carContext, @NonNull Lifecycle lifecycle) {
@@ -124,6 +190,8 @@
         mMarkerPaint.setStyle(Style.STROKE);
         mMarkerPaint.setStrokeWidth(3);
 
+        mBackgroundMap = BitmapFactory.decodeResource(carContext.getResources(),
+                R.drawable.map);
         lifecycle.addObserver(this);
     }
 
@@ -138,6 +206,34 @@
         renderFrame();
     }
 
+    /** Handles a map zoom-in and zoom-out events. */
+    public void handleScale(float focusX, float focusY, float scaleFactor) {
+        synchronized (this) {
+            float x = focusX;
+            float y = focusY;
+
+            Rect visibleArea = mVisibleArea;
+            if (visibleArea != null) {
+                // If a focal point value is negative, use the center point of the visible area.
+                if (x < 0) {
+                    x = visibleArea.centerX();
+                }
+                if (y < 0) {
+                    y = visibleArea.centerY();
+                }
+            }
+
+            // If the map stays between the maximum and minimum scale factors, scale the map.
+            float newCumulativeScaleFactor = mCumulativeScaleFactor * scaleFactor;
+            if (newCumulativeScaleFactor > MIN_SCALE_FACTOR
+                    && newCumulativeScaleFactor < MAX_SCALE_FACTOR) {
+                mCumulativeScaleFactor = newCumulativeScaleFactor;
+                mBackgroundMapMatrix.postScale(scaleFactor, scaleFactor, x, y);
+                renderFrame();
+            }
+        }
+    }
+
     /** Updates the markers drawn on the surface. */
     public void updateMarkerVisibility(boolean showMarkers, int numMarkers, int activeMarker) {
         mShowMarkers = showMarkers;
@@ -162,6 +258,31 @@
         // Clear the background.
         canvas.drawColor(mCarContext.isDarkMode() ? Color.DKGRAY : Color.LTGRAY);
 
+        // Initialize the background map.
+        if (mBackgroundMapMatrix.isIdentity()) {
+            // Enlarge the original image.
+            RectF backgroundRect = new RectF(0, 0, mBackgroundMap.getWidth(),
+                    mBackgroundMap.getHeight());
+            RectF scaledBackgroundRect = new RectF(0, 0,
+                    backgroundRect.width() * MAP_ENLARGE_FACTOR,
+                    backgroundRect.height() * MAP_ENLARGE_FACTOR);
+
+            // Initialize the cumulative scale factor and map center points.
+            mCumulativeScaleFactor = 1f;
+            mBackgroundMapCenterX = scaledBackgroundRect.centerX();
+            mBackgroundMapCenterY = scaledBackgroundRect.centerY();
+
+            // Move to the center of the enlarged map.
+            mBackgroundMapMatrix.setRectToRect(backgroundRect, scaledBackgroundRect,
+                    Matrix.ScaleToFit.FILL);
+            mBackgroundMapMatrix.postTranslate(
+                    -mBackgroundMapCenterX + canvas.getClipBounds().centerX(),
+                    -mBackgroundMapCenterY + canvas.getClipBounds().centerY());
+            scaledBackgroundRect.round(mBackgroundMapClipBounds);
+        }
+        canvas.drawBitmap(mBackgroundMap, mBackgroundMapMatrix, null);
+
+
         final int horizontalTextMargin = 10;
         final int verticalTextMarginFromTop = 20;
         final int verticalTextMarginFromBottom = 10;
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/DeepLinkNotificationReceiver.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/DeepLinkNotificationReceiver.java
deleted file mode 100644
index c3250d8..0000000
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/DeepLinkNotificationReceiver.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.car.app.sample.navigation.common.nav;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-
-import androidx.annotation.NonNull;
-import androidx.car.app.CarContext;
-import androidx.car.app.sample.navigation.common.car.NavigationCarAppService;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/** A receiver to process notification actions to start the app into a deep linked screen. */
-public class DeepLinkNotificationReceiver extends BroadcastReceiver {
-    // Intent actions for notification actions in car and phone
-    public static final String INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP =
-            "com.navigation.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP";
-
-    private static final Set<String> SUPPORTED_ACTIONS =
-            new HashSet<>(Arrays.asList(INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP));
-
-    @Override
-    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
-        String intentAction = intent.getAction();
-        if (SUPPORTED_ACTIONS.contains(intentAction)) {
-            CarContext.startCarApp(
-                    /* notificationIntent= */ intent,
-
-                    // Once the car app opens, process the deep link action.
-                    /* appIntent= */ new Intent(Intent.ACTION_VIEW)
-                            .setComponent(new ComponentName(context, NavigationCarAppService.class))
-                            .setData(NavigationCarAppService.createDeepLinkUri(intentAction)));
-        }
-    }
-}
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java
index c0382da1b..ca73d03 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/nav/NavigationService.java
@@ -18,8 +18,6 @@
 
 import static android.media.AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
 
-import static androidx.car.app.sample.navigation.common.nav.DeepLinkNotificationReceiver.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP;
-
 import android.annotation.SuppressLint;
 import android.app.Notification;
 import android.app.NotificationChannel;
@@ -54,8 +52,10 @@
 import androidx.car.app.navigation.model.TravelEstimate;
 import androidx.car.app.navigation.model.Trip;
 import androidx.car.app.notification.CarAppExtender;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.car.app.sample.navigation.common.R;
 import androidx.car.app.sample.navigation.common.app.MainActivity;
+import androidx.car.app.sample.navigation.common.car.NavigationCarAppService;
 import androidx.car.app.sample.navigation.common.model.Instruction;
 import androidx.car.app.sample.navigation.common.model.Script;
 import androidx.core.app.NotificationCompat;
@@ -69,6 +69,8 @@
 public class NavigationService extends Service {
     private static final String TAG = "NavigationService";
 
+    public static final String DEEP_LINK_ACTION = "androidx.car.app.samples.navigation.car"
+            + ".NavigationDeepLinkAction";
     public static final String CHANNEL_ID = "NavigationServiceChannel";
 
     /** The identifier for the navigation notification displayed for the foreground service. */
@@ -537,23 +539,15 @@
             builder.setPriority(NotificationManager.IMPORTANCE_HIGH);
         }
         if (showInCar) {
+            Intent intent = new Intent(Intent.ACTION_VIEW)
+                    .setComponent(new ComponentName(this, NavigationCarAppService.class))
+                    .setData(NavigationCarAppService.createDeepLinkUri(Intent.ACTION_VIEW));
             builder.extend(
                     new CarAppExtender.Builder()
                             .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH)
                             .setContentIntent(
-
-                                    // Set an intent to open the car app. The app receives this
-                                    // intent when the
-                                    // user taps the heads-up notification or the rail widget.
-                                    PendingIntent.getBroadcast(
-                                            this,
-                                            INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP.hashCode(),
-                                            new Intent(INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP)
-                                                    .setComponent(
-                                                            new ComponentName(
-                                                                    mCarContext,
-                                                                    DeepLinkNotificationReceiver
-                                                                            .class)),
+                                    CarPendingIntent.getCarApp(this, intent.hashCode(),
+                                            intent,
                                             0))
                             .build());
         }
diff --git a/car/app/app-samples/navigation/common/src/main/res/drawable/ic_pan_24.xml b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_pan_24.xml
new file mode 100644
index 0000000..1dfeed1
--- /dev/null
+++ b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_pan_24.xml
@@ -0,0 +1,28 @@
+<!--
+  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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M15.54,5.54L13.77,7.3 12,5.54 10.23,7.3 8.46,5.54 12,2zM18.46,15.54l-1.76,-1.77L18.46,12l-1.76,-1.77 1.76,-1.77L22,12zM8.46,18.46l1.77,-1.76L12,18.46l1.77,-1.76 1.77,1.76L12,22zM5.54,8.46l1.76,1.77L5.54,12l1.76,1.77 -1.76,1.77L2,12z"/>
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"/>
+</vector>
diff --git a/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_in_24.xml b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_in_24.xml
new file mode 100644
index 0000000..36d3282
--- /dev/null
+++ b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_in_24.xml
@@ -0,0 +1,25 @@
+<!--
+  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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+</vector>
diff --git a/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_out_24.xml b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_out_24.xml
new file mode 100644
index 0000000..089d265
--- /dev/null
+++ b/car/app/app-samples/navigation/common/src/main/res/drawable/ic_zoom_out_24.xml
@@ -0,0 +1,25 @@
+<!--
+  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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M19,13H5v-2h14v2z"/>
+</vector>
diff --git a/car/app/app-samples/navigation/common/src/main/res/drawable/map.png b/car/app/app-samples/navigation/common/src/main/res/drawable/map.png
new file mode 100644
index 0000000..3cfca26
--- /dev/null
+++ b/car/app/app-samples/navigation/common/src/main/res/drawable/map.png
Binary files differ
diff --git a/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml b/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
index f6b54fd..08b4f1f 100644
--- a/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/navigation/mobile/src/main/AndroidManifest.xml
@@ -30,7 +30,8 @@
 
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
 
     <activity
         android:name="androidx.car.app.sample.navigation.common.app.MainActivity"
@@ -45,6 +46,10 @@
         android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
         android:name="androidx.car.app.sample.navigation.common.car.NavigationCarAppService"
         android:foregroundServiceType="location"
@@ -61,14 +66,5 @@
         android:exported="true">
     </service>
 
-    <receiver
-        android:name="androidx.car.app.sample.navigation.common.nav.DeepLinkNotificationReceiver"
-        android:enabled="true"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="com.navigation.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP"/>
-      </intent-filter>
-    </receiver>
-
   </application>
 </manifest>
diff --git a/car/app/app-samples/places/automotive/src/main/AndroidManifest.xml b/car/app/app-samples/places/automotive/src/main/AndroidManifest.xml
index 9ea01b1..679d8e5 100644
--- a/car/app/app-samples/places/automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/places/automotive/src/main/AndroidManifest.xml
@@ -31,16 +31,23 @@
 
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
 
-    <meta-data android:name="com.google.android.gms.car.application"
+    <meta-data
+        android:name="com.android.automotive"
         android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
+
     <meta-data
         android:name="androidx.car.app.theme"
         android:resource="@style/CarAppTheme"
         tools:ignore="MetadataTagInsideApplicationTag"/>
 
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
         android:name="androidx.car.app.sample.places.common.PlacesCarAppService"
         android:exported="true">
@@ -63,6 +70,7 @@
       </intent-filter>
       <meta-data android:name="androidx.car.app.CAR_APP_SERVICE"
           android:value="androidx.car.app.sample.places.common.PlacesCarAppService" />
+      <meta-data android:name="distractionOptimized" android:value="true"/>
     </activity-alias>
 
   </application>
diff --git a/car/app/app-samples/places/common/lint-baseline.xml b/car/app/app-samples/places/common/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/car/app/app-samples/places/common/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/car/app/app-samples/places/common/src/main/java/androidx/car/app/sample/places/common/PlaceDetailsScreen.java b/car/app/app-samples/places/common/src/main/java/androidx/car/app/sample/places/common/PlaceDetailsScreen.java
index 082558e..493552f 100644
--- a/car/app/app-samples/places/common/src/main/java/androidx/car/app/sample/places/common/PlaceDetailsScreen.java
+++ b/car/app/app-samples/places/common/src/main/java/androidx/car/app/sample/places/common/PlaceDetailsScreen.java
@@ -16,6 +16,7 @@
 
 package androidx.car.app.sample.places.common;
 
+import static androidx.car.app.CarToast.LENGTH_LONG;
 import static androidx.car.app.sample.places.common.Executors.BACKGROUND_EXECUTOR;
 import static androidx.car.app.sample.places.common.Executors.UI_EXECUTOR;
 
@@ -31,6 +32,8 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.HostException;
 import androidx.car.app.Screen;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarColor;
@@ -152,7 +155,16 @@
     private void onClickNavigate() {
         Uri uri = Uri.parse("geo:0,0?q=" + mPlace.getAddress(mGeocoder).getAddressLine(0));
         Intent intent = new Intent(CarContext.ACTION_NAVIGATE, uri);
-        getCarContext().startCarApp(intent);
+
+        try {
+            getCarContext().startCarApp(intent);
+        } catch (HostException e) {
+            CarToast.makeText(
+                    getCarContext(),
+                    "Failure starting navigation",
+                    LENGTH_LONG)
+                    .show();
+        }
     }
 
     private static List<CharSequence> getAddressLines(Address address) {
diff --git a/car/app/app-samples/places/mobile/src/main/AndroidManifest.xml b/car/app/app-samples/places/mobile/src/main/AndroidManifest.xml
index 3fba8b8..62d9faf 100644
--- a/car/app/app-samples/places/mobile/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/places/mobile/src/main/AndroidManifest.xml
@@ -29,20 +29,25 @@
 
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
 
     <meta-data android:name="com.google.android.gms.car.application"
       android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
+    <meta-data
+        android:name="androidx.car.app.theme"
+        android:resource= "@style/CarAppTheme"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
         android:name="androidx.car.app.sample.places.common.PlacesCarAppService"
         android:exported="true">
-
-      <meta-data
-          android:name="androidx.car.app.theme"
-          android:resource= "@style/CarAppTheme" />
-
       <intent-filter>
         <action android:name="androidx.car.app.CarAppService" />
       </intent-filter>
diff --git a/car/app/app-samples/showcase/automotive/src/main/AndroidManifest.xml b/car/app/app-samples/showcase/automotive/src/main/AndroidManifest.xml
index d798cf0..45423e3 100644
--- a/car/app/app-samples/showcase/automotive/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/showcase/automotive/src/main/AndroidManifest.xml
@@ -37,10 +37,11 @@
 
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
 
     <meta-data
-        android:name="com.google.android.gms.car.application"
+        android:name="com.android.automotive"
         android:resource="@xml/automotive_app_desc"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
@@ -49,6 +50,10 @@
         android:resource="@style/CarAppTheme"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
         android:name="androidx.car.app.sample.showcase.common.ShowcaseService"
         android:exported="true">
@@ -65,19 +70,6 @@
         android:exported="true">
     </service>
 
-    <!-- TODO(b/184079723): investigate whether we need DeepLinkNotificationReceiver
-    in automotive samples -->
-    <receiver
-        android:name="androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver"
-        android:enabled="true"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="com.showcase.INTENT_ACTION_PHONE"/>
-        <action android:name="com.showcase.INTENT_ACTION_CANCEL_RESERVATION"/>
-        <action android:name="com.showcase.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP"/>
-      </intent-filter>
-    </receiver>
-
     <provider
         android:name="androidx.car.app.sample.showcase.common.textandicons.DelayedFileProvider"
         android:authorities="com.showcase.fileprovider"
@@ -100,6 +92,7 @@
       </intent-filter>
       <meta-data android:name="androidx.car.app.CAR_APP_SERVICE"
           android:value="androidx.car.app.sample.showcase.common.ShowcaseService" />
+      <meta-data android:name="distractionOptimized" android:value="true"/>
     </activity-alias>
 
   </application>
diff --git a/car/app/app-samples/showcase/common/lint-baseline.xml b/car/app/app-samples/showcase/common/lint-baseline.xml
new file mode 100644
index 0000000..89c30e2
--- /dev/null
+++ b/car/app/app-samples/showcase/common/lint-baseline.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.showcase.common.navigation.NavigationNotificationsDemoScreen is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                        context.startForegroundService(intent);"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationNotificationsDemoScreen.java"
+            line="59"
+            column="49"/>
+    </issue>
+
+</issues>
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/DeepLinkNotificationReceiver.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/DeepLinkNotificationReceiver.java
deleted file mode 100644
index df3f75a..0000000
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/DeepLinkNotificationReceiver.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.car.app.sample.showcase.common;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-
-import androidx.annotation.NonNull;
-import androidx.car.app.CarContext;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-/** A receiver to process notification actions to start the app into a deep linked screen. */
-public class DeepLinkNotificationReceiver extends BroadcastReceiver {
-    // Intent actions for notification actions in car and phone
-    public static final String INTENT_ACTION_PHONE = "com.showcase.INTENT_ACTION_PHONE";
-    public static final String INTENT_ACTION_CANCEL_RESERVATION =
-            "com.showcase.INTENT_ACTION_CANCEL_RESERVATION";
-    public static final String INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP =
-            "com.showcase.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP";
-
-    private static final Set<String> SUPPORTED_ACTIONS =
-            new HashSet<>(
-                    Arrays.asList(
-                            INTENT_ACTION_PHONE,
-                            INTENT_ACTION_CANCEL_RESERVATION,
-                            INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP));
-
-    @Override
-    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
-        String intentAction = intent.getAction();
-        if (SUPPORTED_ACTIONS.contains(intentAction)) {
-            CarContext.startCarApp(
-                    /* notificationIntent= */ intent,
-
-                    // Once the car app opens, process the deep link action.
-                    /* appIntent= */ new Intent(Intent.ACTION_VIEW)
-                            .setComponent(new ComponentName(context, ShowcaseService.class))
-                            .setData(ShowcaseService.createDeepLinkUri(intentAction)));
-        }
-    }
-}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
index 6ffe2e7..19090db 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
@@ -35,6 +35,14 @@
     public static final String SHARED_PREF_KEY = "ShowcasePrefs";
     public static final String PRE_SEED_KEY = "PreSeed";
 
+    // Intent actions for notification actions in car and phone
+    public static final String INTENT_ACTION_NAVIGATE =
+            "androidx.car.app.sample.showcase.INTENT_ACTION_PHONE";
+    public static final String INTENT_ACTION_CALL =
+            "androidx.car.app.sample.showcase.INTENT_ACTION_CANCEL_RESERVATION";
+    public static final String INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP =
+            "androidx.car.app.sample.showcase.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP";
+
     /** Creates a deep link URI with the given deep link action. */
     @NonNull
     public static Uri createDeepLinkUri(@NonNull String deepLinkAction) {
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseSession.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseSession.java
index a2858c132..7b337b1 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseSession.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseSession.java
@@ -16,10 +16,10 @@
 
 package androidx.car.app.sample.showcase.common;
 
-import android.content.BroadcastReceiver;
+import static androidx.car.app.sample.showcase.common.ShowcaseService.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP;
+
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.res.Configuration;
 import android.net.Uri;
 import android.util.Log;
@@ -27,13 +27,10 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.CarContext;
-import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
 import androidx.car.app.ScreenManager;
 import androidx.car.app.Session;
-import androidx.car.app.sample.showcase.common.misc.GoToPhoneScreen;
 import androidx.car.app.sample.showcase.common.misc.PreSeedingFlowScreen;
-import androidx.car.app.sample.showcase.common.misc.ReservationCancelledScreen;
 import androidx.car.app.sample.showcase.common.navigation.NavigationNotificationsDemoScreen;
 import androidx.car.app.sample.showcase.common.navigation.SurfaceRenderer;
 import androidx.car.app.sample.showcase.common.navigation.routing.NavigatingDemoScreen;
@@ -41,8 +38,6 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
 
-import java.util.Objects;
-
 /** Session class for the Showcase sample app. */
 class ShowcaseSession extends Session implements DefaultLifecycleObserver {
     static final String URI_SCHEME = "samples";
@@ -51,16 +46,6 @@
     @Nullable
     private SurfaceRenderer mRenderer;
 
-    private final BroadcastReceiver mReceiver =
-            new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    CarToast.makeText(getCarContext(), "Returned from phone", CarToast.LENGTH_LONG)
-                            .show();
-                    getGoToPhoneScreenAndSetItAsTop().onPhoneFlowComplete();
-                }
-            };
-
     @NonNull
     @Override
     public Screen onCreateScreen(@NonNull Intent intent) {
@@ -111,18 +96,6 @@
     }
 
     @Override
-    public void onStart(@NonNull LifecycleOwner owner) {
-        getCarContext()
-                .registerReceiver(
-                        mReceiver, new IntentFilter(GoToPhoneScreen.PHONE_COMPLETE_ACTION));
-    }
-
-    @Override
-    public void onStop(@NonNull LifecycleOwner owner) {
-        getCarContext().unregisterReceiver(mReceiver);
-    }
-
-    @Override
     public void onDestroy(@NonNull LifecycleOwner owner) {
         Log.i("SHOWCASE", "onDestroy");
     }
@@ -148,22 +121,11 @@
                 && URI_HOST.equals(uri.getSchemeSpecificPart())) {
 
             Screen top = screenManager.getTop();
-            switch (uri.getFragment()) {
-                case DeepLinkNotificationReceiver.INTENT_ACTION_PHONE:
-                    getGoToPhoneScreenAndSetItAsTop();
-                    break;
-                case DeepLinkNotificationReceiver.INTENT_ACTION_CANCEL_RESERVATION:
-                    if (!(top instanceof ReservationCancelledScreen)) {
-                        screenManager.push(new ReservationCancelledScreen(getCarContext()));
-                    }
-                    break;
-                case DeepLinkNotificationReceiver.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP:
-                    if (!(top instanceof NavigationNotificationsDemoScreen)) {
-                        screenManager.push(new NavigationNotificationsDemoScreen(getCarContext()));
-                    }
-                    break;
-                default:
-                    // No-op
+            // No-op
+            if (INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP.equals(uri.getFragment())) {
+                if (!(top instanceof NavigationNotificationsDemoScreen)) {
+                    screenManager.push(new NavigationNotificationsDemoScreen(getCarContext()));
+                }
             }
         }
     }
@@ -174,16 +136,4 @@
             mRenderer.onCarConfigurationChanged();
         }
     }
-
-    GoToPhoneScreen getGoToPhoneScreenAndSetItAsTop() {
-        ScreenManager screenManager =
-                Objects.requireNonNull(getCarContext().getCarService(ScreenManager.class));
-
-        Screen top = screenManager.getTop();
-        if (!(top instanceof GoToPhoneScreen)) {
-            top = new GoToPhoneScreen(getCarContext());
-            screenManager.push(top);
-        }
-        return (GoToPhoneScreen) top;
-    }
 }
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceDetailsScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceDetailsScreen.java
index f972036..6125f04 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceDetailsScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceDetailsScreen.java
@@ -16,6 +16,7 @@
 
 package androidx.car.app.sample.showcase.common.common;
 
+import static androidx.car.app.CarToast.LENGTH_LONG;
 import static androidx.car.app.model.Action.BACK;
 
 import android.content.Intent;
@@ -23,6 +24,8 @@
 
 import androidx.annotation.NonNull;
 import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.HostException;
 import androidx.car.app.Screen;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarColor;
@@ -78,13 +81,31 @@
     private void onClickNavigate() {
         Uri uri = Uri.parse("geo:0,0?q=" + mPlace.address);
         Intent intent = new Intent(CarContext.ACTION_NAVIGATE, uri);
-        getCarContext().startCarApp(intent);
+
+        try {
+            getCarContext().startCarApp(intent);
+        } catch (HostException e) {
+            CarToast.makeText(
+                    getCarContext(),
+                    "Failure starting navigation",
+                    LENGTH_LONG)
+                    .show();
+        }
     }
 
     private void onClickDial() {
         Uri uri = Uri.parse("tel:" + mPlace.phoneNumber);
         Intent intent = new Intent(Intent.ACTION_DIAL, uri);
-        getCarContext().startCarApp(intent);
+
+        try {
+            getCarContext().startCarApp(intent);
+        } catch (HostException e) {
+            CarToast.makeText(
+                    getCarContext(),
+                    "Failure starting dialer",
+                    LENGTH_LONG)
+                    .show();
+        }
     }
 
     private PlaceDetailsScreen(@NonNull CarContext carContext, @NonNull PlaceInfo place) {
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/Utils.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/Utils.java
index 8fcf165..cf1760a 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/Utils.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/Utils.java
@@ -20,7 +20,6 @@
 import android.text.SpannableString;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.ClickableSpan;
 import androidx.car.app.model.ForegroundCarColorSpan;
@@ -53,7 +52,6 @@
 
     /** Make the given string clickable. */
     @NonNull
-    @OptIn(markerClass = androidx.car.app.annotations.ExperimentalCarApi.class)
     public static CharSequence clickable(@NonNull String s, int index, int length,
             @NonNull Runnable action) {
         SpannableString ss = new SpannableString(s);
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/GoToPhoneScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/GoToPhoneScreen.java
deleted file mode 100644
index 790e9b1..0000000
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/GoToPhoneScreen.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.car.app.sample.showcase.common.misc;
-
-import static androidx.car.app.model.Action.BACK;
-
-import android.content.Intent;
-
-import androidx.annotation.NonNull;
-import androidx.car.app.CarContext;
-import androidx.car.app.Screen;
-import androidx.car.app.model.Pane;
-import androidx.car.app.model.PaneTemplate;
-import androidx.car.app.model.Row;
-import androidx.car.app.model.Template;
-
-/** A {@link Screen} for controlling UI for allowing user to go to the phone. */
-public class GoToPhoneScreen extends Screen {
-    public static final String PHONE_COMPLETE_ACTION = "ActionComplete";
-
-    private boolean mIsPhoneFlowComplete;
-
-    public GoToPhoneScreen(@NonNull CarContext carContext) {
-        super(carContext);
-    }
-
-    /** Callback called after the phone flow is completed. */
-    public void onPhoneFlowComplete() {
-        mIsPhoneFlowComplete = true;
-        invalidate();
-    }
-
-    @NonNull
-    @Override
-    public Template onGetTemplate() {
-        Pane.Builder pane = new Pane.Builder();
-        if (mIsPhoneFlowComplete) {
-            pane.addRow(new Row.Builder().setTitle("The phone task is now complete").build());
-        } else {
-            getCarContext()
-                    .startActivity(
-                            new Intent(getCarContext(), OnPhoneActivity.class)
-                                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
-            pane.addRow(new Row.Builder().setTitle("Please continue on your phone").build());
-        }
-
-        return new PaneTemplate.Builder(pane.build())
-                .setTitle("Go-to-Phone Screen")
-                .setHeaderAction(BACK)
-                .build();
-    }
-}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/MiscDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/MiscDemoScreen.java
index de1a43b..30a8c03 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/MiscDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/MiscDemoScreen.java
@@ -23,7 +23,6 @@
 import androidx.car.app.Screen;
 import androidx.car.app.model.ItemList;
 import androidx.car.app.model.ListTemplate;
-import androidx.car.app.model.ParkedOnlyOnClickListener;
 import androidx.car.app.model.Row;
 import androidx.car.app.model.Template;
 
@@ -51,19 +50,6 @@
 
         listBuilder.addItem(
                 new Row.Builder()
-                        .setTitle("Go-to-Phone Demo")
-                        .setOnClickListener(
-                                ParkedOnlyOnClickListener.create(
-                                        () ->
-                                                getScreenManager()
-                                                        .push(
-                                                                new GoToPhoneScreen(
-                                                                        getCarContext()))))
-                        .setBrowsable(true)
-                        .build());
-
-        listBuilder.addItem(
-                new Row.Builder()
                         .setTitle("PopTo Demo")
                         .setOnClickListener(
                                 () ->
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/NotificationDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/NotificationDemoScreen.java
index ded1f00..e792847 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/NotificationDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/NotificationDemoScreen.java
@@ -16,14 +16,9 @@
 
 package androidx.car.app.sample.showcase.common.misc;
 
-import static androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver.INTENT_ACTION_CANCEL_RESERVATION;
-import static androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver.INTENT_ACTION_PHONE;
-
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import android.annotation.SuppressLint;
-import android.app.Notification;
-import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -32,8 +27,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.BitmapFactory;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -43,16 +37,19 @@
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
 import androidx.car.app.model.Action;
+import androidx.car.app.model.CarColor;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.GridItem;
 import androidx.car.app.model.GridTemplate;
 import androidx.car.app.model.ItemList;
 import androidx.car.app.model.Template;
 import androidx.car.app.notification.CarAppExtender;
-import androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver;
+import androidx.car.app.notification.CarNotificationManager;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.core.app.NotificationChannelCompat;
 import androidx.core.app.NotificationCompat;
-import androidx.core.app.NotificationManagerCompat;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
@@ -143,7 +140,7 @@
                         .setImage(new CarIcon.Builder(mIcon).build())
                         .setOnClickListener(() -> {
                             mHandler.removeMessages(MSG_SEND_NOTIFICATION);
-                            NotificationManagerCompat.from(getCarContext()).cancelAll();
+                            CarNotificationManager.from(getCarContext()).cancelAll();
                             mNotificationCount = 0;
                         })
                         .build());
@@ -221,16 +218,12 @@
     @SuppressLint({"UnsafeNewApiCall", "ObsoleteSdkInt"})
     private void sendNotification(CharSequence title, CharSequence text, String channelId,
             CharSequence channelName, int notificationId, int importance) {
-        NotificationManagerCompat notificationManagerCompat =
-                NotificationManagerCompat.from(getCarContext());
-        if (VERSION.SDK_INT >= VERSION_CODES.O) {
-            NotificationChannel channel =
-                    new NotificationChannel(
-                            channelId,
-                            channelName,
-                            importance);
-            notificationManagerCompat.createNotificationChannel(channel);
-        }
+        CarNotificationManager carNotificationManager =
+                CarNotificationManager.from(getCarContext());
+
+        NotificationChannelCompat channel = new NotificationChannelCompat.Builder(channelId,
+                importance).setName(channelName).build();
+        carNotificationManager.createNotificationChannel(channel);
 
         NotificationCompat.Builder builder;
         builder = new NotificationCompat.Builder(getCarContext(), channelId);
@@ -239,46 +232,60 @@
         }
         builder.setOngoing(mSetOngoing);
 
-        Notification notification =
-                builder.setSmallIcon(R.drawable.ic_bug_report_24px)
-                        .setContentTitle(title + " (phone)")
-                        .setContentText(text + " (phone)")
-                        .setLargeIcon(
-                                BitmapFactory.decodeResource(
-                                        getCarContext().getResources(), R.drawable.ic_hi))
-                        .addAction(
-                                new NotificationCompat.Action.Builder(
+        builder.setSmallIcon(R.drawable.ic_bug_report_24px)
+                .setContentTitle(title + " (phone)")
+                .setContentText(text + " (phone)")
+                .setColor(getCarContext().getColor(R.color.carColorGreen))
+                .setColorized(true)
+                .setLargeIcon(
+                        BitmapFactory.decodeResource(
+                                getCarContext().getResources(), R.drawable.ic_hi))
+                .addAction(
+                        new NotificationCompat.Action.Builder(
+                                R.drawable.ic_face_24px,
+                                "Action1 (phone)",
+                                createPendingIntent(INTENT_ACTION_PRIMARY_PHONE))
+                                .build())
+                .addAction(
+                        R.drawable.ic_commute_24px,
+                        "Action2 (phone)",
+                        createPendingIntent(INTENT_ACTION_SECONDARY_PHONE))
+                .extend(
+                        new CarAppExtender.Builder()
+                                .setContentTitle(title)
+                                .setContentText(text)
+                                .setContentIntent(
+                                        CarPendingIntent.getCarApp(getCarContext(), 0,
+                                                new Intent(Intent.ACTION_VIEW).setComponent(
+                                                        new ComponentName(getCarContext(),
+                                                                ShowcaseService.class)), 0))
+                                .setColor(CarColor.PRIMARY)
+                                .setSmallIcon(R.drawable.ic_bug_report_24px)
+                                .setLargeIcon(
+                                        BitmapFactory.decodeResource(
+                                                getCarContext().getResources(),
+                                                R.drawable.ic_hi))
+                                .addAction(
+                                        R.drawable.ic_commute_24px,
+                                        "Navigate",
+                                        getPendingIntentForNavigation())
+                                .addAction(
                                         R.drawable.ic_face_24px,
-                                        "Action1 (phone)",
-                                        createPendingIntent(INTENT_ACTION_PRIMARY_PHONE))
-                                        .build())
-                        .addAction(
-                                R.drawable.ic_commute_24px,
-                                "Action2 (phone)",
-                                createPendingIntent(INTENT_ACTION_SECONDARY_PHONE))
-                        .extend(
-                                new CarAppExtender.Builder()
-                                        .setContentTitle(title)
-                                        .setContentText(text)
-                                        .setSmallIcon(R.drawable.ic_bug_report_24px)
-                                        .setLargeIcon(
-                                                BitmapFactory.decodeResource(
-                                                        getCarContext().getResources(),
-                                                        R.drawable.ic_hi))
-                                        .addAction(
-                                                R.drawable.ic_commute_24px,
-                                                "Complete on Phone",
-                                                createDeepLinkActionPendingIntent(
-                                                        INTENT_ACTION_PHONE))
-                                        .addAction(
-                                                R.drawable.ic_face_24px,
-                                                "Cancel",
-                                                createDeepLinkActionPendingIntent(
-                                                        INTENT_ACTION_CANCEL_RESERVATION))
-                                        .build())
-                        .build();
+                                        "Call",
+                                        createPendingIntentForCall())
+                                .build());
 
-        notificationManagerCompat.notify(notificationId, notification);
+        carNotificationManager.notify(notificationId, builder);
+    }
+
+    private PendingIntent createPendingIntentForCall() {
+        Intent intent = new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:+14257232350"));
+        return CarPendingIntent.getCarApp(getCarContext(), intent.hashCode(), intent, 0);
+    }
+
+    private PendingIntent getPendingIntentForNavigation() {
+        Intent intent = new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:0,0?q=Home"));
+        return CarPendingIntent.getCarApp(getCarContext(), intent.hashCode(), intent, 0);
     }
 
     private String getImportanceString() {
@@ -331,16 +338,6 @@
     }
 
     /** Returns a pending intent with the provided intent action. */
-    private PendingIntent createDeepLinkActionPendingIntent(String intentAction) {
-        Intent intent =
-                new Intent(intentAction)
-                        .setComponent(
-                                new ComponentName(
-                                        getCarContext(), DeepLinkNotificationReceiver.class));
-        return PendingIntent.getBroadcast(getCarContext(), intentAction.hashCode(), intent, 0);
-    }
-
-    /** Returns a pending intent with the provided intent action. */
     private PendingIntent createPendingIntent(String intentAction) {
         Intent intent = new Intent(intentAction);
         return PendingIntent.getBroadcast(getCarContext(), intentAction.hashCode(), intent, 0);
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/OnPhoneActivity.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/OnPhoneActivity.java
deleted file mode 100644
index c0d75ea..0000000
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/OnPhoneActivity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.car.app.sample.showcase.common.misc;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.WindowManager.LayoutParams;
-
-import androidx.annotation.Nullable;
-import androidx.car.app.sample.showcase.common.R;
-
-/** Displays a simple {@link Activity} on the phone to show phone/car interaction */
-public class OnPhoneActivity extends Activity {
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Show Activity over lock screen and turn on device screen.
-        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
-
-        setContentView(R.layout.phone_activity);
-
-        View button = findViewById(R.id.button);
-        button.setOnClickListener(this::onClick);
-    }
-
-    private void onClick(View v) {
-        sendBroadcast(
-                new Intent(GoToPhoneScreen.PHONE_COMPLETE_ACTION).setPackage(getPackageName()));
-        finish();
-    }
-}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/RequestPermissionScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/RequestPermissionScreen.java
index 3af7335e..a13e3aa 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/RequestPermissionScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/misc/RequestPermissionScreen.java
@@ -19,11 +19,9 @@
 import static android.Manifest.permission.ACCESS_FINE_LOCATION;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.MessageTemplate;
@@ -42,7 +40,6 @@
         super(carContext);
     }
 
-    @OptIn(markerClass = ExperimentalCarApi.class)
     @NonNull
     @Override
     public Template onGetTemplate() {
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationNotificationService.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationNotificationService.java
index d97914e..8d2b6da 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationNotificationService.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/NavigationNotificationService.java
@@ -16,21 +16,17 @@
 
 package androidx.car.app.sample.showcase.common.navigation;
 
-import static androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP;
+import static androidx.car.app.sample.showcase.common.ShowcaseService.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import android.annotation.SuppressLint;
-import android.app.Notification;
-import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
@@ -39,8 +35,11 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.notification.CarAppExtender;
-import androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver;
+import androidx.car.app.notification.CarNotificationManager;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.core.app.NotificationChannelCompat;
 import androidx.core.app.NotificationCompat;
 import androidx.core.app.NotificationManagerCompat;
 
@@ -75,8 +74,8 @@
     @Override
     public int onStartCommand(@NonNull Intent intent, int flags, int startId) {
         initNotifications(this);
-        Notification notification = getNavigationNotification(this, mNotificationCount);
-        startForeground(NAV_NOTIFICATION_ID, notification);
+        startForeground(NAV_NOTIFICATION_ID,
+                getNavigationNotification(this, mNotificationCount).build());
 
         // Start updating the notification continuously.
         mHandler.sendMessageDelayed(
@@ -107,22 +106,34 @@
     // levels
     @SuppressLint({"UnsafeNewApiCall", "ObsoleteSdkInt"})
     private static void initNotifications(Context context) {
-        if (VERSION.SDK_INT >= VERSION_CODES.O) {
-            NotificationChannel navChannel =
-                    new NotificationChannel(
-                            NAV_NOTIFICATION_CHANNEL_ID,
-                            NAV_NOTIFICATION_CHANNEL_NAME,
-                            NotificationManager.IMPORTANCE_HIGH);
-            NotificationManagerCompat.from(context).createNotificationChannel(navChannel);
-        }
+        NotificationChannelCompat navChannel =
+                new NotificationChannelCompat.Builder(
+                        NAV_NOTIFICATION_CHANNEL_ID,
+                        NotificationManagerCompat.IMPORTANCE_HIGH)
+                        .setName(NAV_NOTIFICATION_CHANNEL_NAME).build();
+        CarNotificationManager.from(context).createNotificationChannel(navChannel);
     }
 
     /** Returns the navigation notification that corresponds to the given notification count. */
-    static Notification getNavigationNotification(
+    static NotificationCompat.Builder getNavigationNotification(
             Context context, int notificationCount) {
         NotificationCompat.Builder builder =
                 new NotificationCompat.Builder(context, NAV_NOTIFICATION_CHANNEL_ID);
         DirectionInfo directionInfo = getDirectionInfo(notificationCount);
+
+        // Set an intent to open the car app. The app receives this intent when the user taps the
+        // heads-up notification or the rail widget.
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(
+                context,
+                INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP.hashCode(),
+                new Intent(
+                        INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP).setComponent(
+                        new ComponentName(context,
+                                ShowcaseService.class)).setData(
+                        ShowcaseService.createDeepLinkUri(
+                                INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP)),
+                0);
+
         return builder
                 // This title, text, and icon will be shown in both phone and car screen. These
                 // values can
@@ -141,33 +152,15 @@
                 .setCategory(NotificationCompat.CATEGORY_NAVIGATION)
 
                 // If set to true, the notification will only show the alert once in both phone and
-                // car
-                // screen. This value cannot be overridden in the extender.
+                // car screen. This value cannot be overridden in the extender.
                 .setOnlyAlertOnce(directionInfo.mOnlyAlertOnce)
 
                 // This extender must be set in order to display the notification in the car screen.
                 // The extender also allows various customizations, such as showing different title
-                // or icon
-                // on the car screen.
-                .extend(
-                        new CarAppExtender.Builder()
-                                .setContentIntent(
-
-                                        // Set an intent to open the car app. The app receives this
-                                        // intent when the
-                                        // user taps the heads-up notification or the rail widget.
-                                        PendingIntent.getBroadcast(
-                                                context,
-                                                INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP.hashCode(),
-                                                new Intent(INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP)
-                                                        .setComponent(
-                                                                new ComponentName(
-                                                                        context,
-                                                                        DeepLinkNotificationReceiver
-                                                                                .class)),
-                                                0))
-                                .build())
-                .build();
+                // or icon on the car screen.
+                .extend(new CarAppExtender.Builder()
+                        .setContentIntent(pendingIntent)
+                        .build());
     }
 
     /**
@@ -178,8 +171,8 @@
         public boolean handleMessage(Message msg) {
             if (msg.what == MSG_SEND_NOTIFICATION) {
                 Context context = NavigationNotificationService.this;
-                Notification notification = getNavigationNotification(context, mNotificationCount);
-                NotificationManagerCompat.from(context).notify(NAV_NOTIFICATION_ID, notification);
+                CarNotificationManager.from(context).notify(NAV_NOTIFICATION_ID,
+                        getNavigationNotification(context, mNotificationCount));
                 mNotificationCount++;
                 mHandler.sendMessageDelayed(
                         mHandler.obtainMessage(MSG_SEND_NOTIFICATION),
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/RoutePreviewDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/RoutePreviewDemoScreen.java
index bd97241..7a38a36 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/RoutePreviewDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/RoutePreviewDemoScreen.java
@@ -21,11 +21,9 @@
 import android.text.SpannableString;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.CarText;
 import androidx.car.app.model.DurationSpan;
@@ -42,7 +40,6 @@
         super(carContext);
     }
 
-    @OptIn(markerClass = ExperimentalCarApi.class)
     @NonNull
     @Override
     public Template onGetTemplate() {
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/NavigatingDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/NavigatingDemoScreen.java
index 2eb638f..0f415845 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/NavigatingDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/NavigatingDemoScreen.java
@@ -46,6 +46,7 @@
                                 .build())
                 .setDestinationTravelEstimate(RoutingDemoModels.getTravelEstimate())
                 .setActionStrip(RoutingDemoModels.getActionStrip(getCarContext(), this::finish))
+                .setMapActionStrip(RoutingDemoModels.getMapActionStrip(getCarContext()))
                 .setBackgroundColor(CarColor.SECONDARY)
                 .build();
     }
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/RoutingDemoModels.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/RoutingDemoModels.java
index b7aed8f..248a8ea 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/RoutingDemoModels.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/navigation/routing/RoutingDemoModels.java
@@ -151,6 +151,47 @@
                 .build();
     }
 
+    /**
+     * Returns the map action strip that contains pan and zoom buttons.
+     */
+    @NonNull
+    public static ActionStrip getMapActionStrip(
+            @NonNull CarContext carContext) {
+        return new ActionStrip.Builder()
+                .addAction(
+                        new Action.Builder()
+                                .setOnClickListener(
+                                        () -> CarToast.makeText(
+                                                carContext,
+                                                "Zoomed in",
+                                                CarToast.LENGTH_SHORT)
+                                                .show())
+                                .setIcon(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        carContext,
+                                                        R.drawable.ic_zoom_in_24))
+                                                .build())
+                                .build())
+                .addAction(
+                        new Action.Builder()
+                                .setOnClickListener(
+                                        () -> CarToast.makeText(
+                                                carContext,
+                                                "Zoomed out",
+                                                CarToast.LENGTH_SHORT)
+                                                .show())
+                                .setIcon(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        carContext,
+                                                        R.drawable.ic_zoom_out_24))
+                                                .build())
+                                .build())
+                .addAction(Action.PAN)
+                .build();
+    }
+
     /** Returns the {@link TravelEstimate} with time and distance information. */
     @NonNull
     public static TravelEstimate getTravelEstimate() {
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 98c6d63..8001ad9 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
@@ -20,11 +20,9 @@
 import static androidx.car.app.model.Action.BACK;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -47,7 +45,6 @@
 
     @NonNull
     @Override
-    @OptIn(markerClass = ExperimentalCarApi.class)
     public Template onGetTemplate() {
         ItemList.Builder listBuilder = new ItemList.Builder();
 
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/LongMessageTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/LongMessageTemplateDemoScreen.java
index 28b8d61..5fbe809 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/LongMessageTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/LongMessageTemplateDemoScreen.java
@@ -20,7 +20,6 @@
 import static androidx.car.app.model.Action.BACK;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
@@ -28,10 +27,12 @@
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.LongMessageTemplate;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.ParkedOnlyOnClickListener;
 import androidx.car.app.model.Template;
+import androidx.car.app.versioning.CarAppApiLevels;
 
 /** A screen that demonstrates the long message template. */
-@OptIn(markerClass = androidx.car.app.annotations.ExperimentalCarApi.class)
 public class LongMessageTemplateDemoScreen extends Screen {
     private static final String TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
             + "Aliquam laoreet ac metus eu commodo. Sed a congue diam, sed dictum lectus. Nam nec"
@@ -83,16 +84,24 @@
     @NonNull
     @Override
     public Template onGetTemplate() {
+        if (getCarContext().getCarAppApiLevel() < CarAppApiLevels.LEVEL_2) {
+            return new MessageTemplate.Builder("Your host doesn't support Long Message template")
+                    .setTitle("Incompatible host")
+                    .setHeaderAction(Action.BACK)
+                    .build();
+        }
         return new LongMessageTemplate.Builder(TEXT)
                 .setTitle("Long Message Template Demo")
                 .setHeaderAction(BACK)
                 .addAction(new Action.Builder()
-                        .setOnClickListener(() -> getScreenManager().pop())
+                        .setOnClickListener(
+                                ParkedOnlyOnClickListener.create(() -> getScreenManager().pop()))
                         .setTitle("Accept")
                         .build())
                 .addAction(new Action.Builder()
                         .setBackgroundColor(CarColor.RED)
-                        .setOnClickListener(() -> getScreenManager().pop())
+                        .setOnClickListener(
+                                ParkedOnlyOnClickListener.create(() -> getScreenManager().pop()))
                         .setTitle("Reject")
                         .build())
                 .setActionStrip(new ActionStrip.Builder()
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/SignInTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/SignInTemplateDemoScreen.java
index 000eb03..3f0c42f 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/SignInTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/SignInTemplateDemoScreen.java
@@ -23,7 +23,6 @@
 
 import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
@@ -41,12 +40,10 @@
 import androidx.car.app.model.signin.SignInTemplate;
 import androidx.car.app.sample.showcase.common.R;
 import androidx.car.app.sample.showcase.common.common.Utils;
+import androidx.car.app.versioning.CarAppApiLevels;
 import androidx.core.graphics.drawable.IconCompat;
 
-import java.util.UUID;
-
 /** A screen that demonstrates the sign-in template. */
-@OptIn(markerClass = androidx.car.app.annotations.ExperimentalCarApi.class)
 public class SignInTemplateDemoScreen extends Screen {
     private enum State {
         USERNAME,
@@ -70,18 +67,18 @@
 
     private final Action mProviderSignInAction = new Action.Builder()
             .setTitle("Google Sign-In")
-            .setOnClickListener(() -> {
+            .setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
                 mState = State.PROVIDER;
                 invalidate();
-            })
+            }))
             .build();
 
     private final Action mPinSignInAction = new Action.Builder()
             .setTitle("Use PIN")
-            .setOnClickListener(() -> {
+            .setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
                 mState = State.PIN;
                 invalidate();
-            })
+            }))
             .build();
 
     public SignInTemplateDemoScreen(@NonNull CarContext carContext) {
@@ -103,11 +100,15 @@
         carContext.getOnBackPressedDispatcher().addCallback(this, callback);
     }
 
-
-
     @NonNull
     @Override
     public Template onGetTemplate() {
+        if (getCarContext().getCarAppApiLevel() < CarAppApiLevels.LEVEL_2) {
+            return new MessageTemplate.Builder("Your host doesn't support Sign In template")
+                    .setTitle("Incompatible host")
+                    .setHeaderAction(Action.BACK)
+                    .build();
+        }
         switch (mState) {
             case USERNAME:
                 return getUsernameSignInTemplate();
@@ -200,7 +201,7 @@
     }
 
     private Template getPinSignInTemplate() {
-        PinSignInMethod pinSignInMethod = new PinSignInMethod.Builder(UUID.randomUUID()
+        PinSignInMethod pinSignInMethod = new PinSignInMethod.Builder("123456789abc"
                 .toString().toUpperCase())
                 .build();
 
diff --git a/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_in_24.xml b/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_in_24.xml
new file mode 100644
index 0000000..36d3282
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_in_24.xml
@@ -0,0 +1,25 @@
+<!--
+  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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+</vector>
diff --git a/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_out_24.xml b/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_out_24.xml
new file mode 100644
index 0000000..089d265
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/res/drawable/ic_zoom_out_24.xml
@@ -0,0 +1,25 @@
+<!--
+  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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M19,13H5v-2h14v2z"/>
+</vector>
diff --git a/car/app/app-samples/showcase/mobile/src/main/AndroidManifest.xml b/car/app/app-samples/showcase/mobile/src/main/AndroidManifest.xml
index 46ef1092..5508c67 100644
--- a/car/app/app-samples/showcase/mobile/src/main/AndroidManifest.xml
+++ b/car/app/app-samples/showcase/mobile/src/main/AndroidManifest.xml
@@ -35,7 +35,8 @@
 
   <application
       android:label="@string/app_name"
-      android:icon="@drawable/ic_launcher">
+      android:icon="@drawable/ic_launcher"
+      android:extractNativeLibs="false">
 
     <meta-data
         android:name="com.google.android.gms.car.application"
@@ -47,12 +48,16 @@
         android:resource="@style/CarAppTheme"
         tools:ignore="MetadataTagInsideApplicationTag" />
 
+    <meta-data android:name="androidx.car.app.minApiLevel"
+        android:value="1"
+        tools:ignore="MetadataTagInsideApplicationTag" />
+
     <service
-        android:name="androidx.car.app.sample.showcase.common.ShowcaseService"
+        android:name=".common.ShowcaseService"
         android:exported="true">
       <intent-filter>
-        <action android:name="androidx.car.app.CarAppService"/>
-        <category android:name="androidx.car.app.category.NAVIGATION"/>
+          <action android:name="androidx.car.app.CarAppService"/>
+          <category android:name="androidx.car.app.category.NAVIGATION"/>
       </intent-filter>
     </service>
 
@@ -61,29 +66,8 @@
         android:exported="true">
     </service>
 
-    <activity
-        android:name="androidx.car.app.sample.showcase.common.misc.OnPhoneActivity"
-        android:label="@string/app_name"
-        android:excludeFromRecents="true"
-        android:noHistory="true"
-        android:launchMode="singleTask"
-        android:showWhenLocked="true"
-        android:turnScreenOn="true"
-        android:exported="false"/>
-
-    <receiver
-        android:name="androidx.car.app.sample.showcase.common.DeepLinkNotificationReceiver"
-        android:enabled="true"
-        android:exported="true">
-      <intent-filter>
-        <action android:name="com.showcase.INTENT_ACTION_PHONE"/>
-        <action android:name="com.showcase.INTENT_ACTION_CANCEL_RESERVATION"/>
-        <action android:name="com.showcase.INTENT_ACTION_NAV_NOTIFICATION_OPEN_APP"/>
-      </intent-filter>
-    </receiver>
-
     <provider
-        android:name="androidx.car.app.sample.showcase.common.textandicons.DelayedFileProvider"
+        android:name=".common.textandicons.DelayedFileProvider"
         android:authorities="com.showcase.fileprovider"
         android:exported="false"
         android:grantUriPermissions="true">
diff --git a/car/app/app-testing/api/current.txt b/car/app/app-testing/api/current.txt
index 3981904..d81d8d6 100644
--- a/car/app/app-testing/api/current.txt
+++ b/car/app/app-testing/api/current.txt
@@ -43,7 +43,6 @@
     method public androidx.car.app.testing.TestCarContext.PermissionRequest? getLastPermissionRequest();
     method public java.util.List<android.content.Intent!> getStartCarAppIntents();
     method public boolean hasCalledFinishCarApp();
-    method public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
     method public void reset();
   }
 
diff --git a/car/app/app-testing/api/restricted_current.txt b/car/app/app-testing/api/restricted_current.txt
index 3981904..d81d8d6 100644
--- a/car/app/app-testing/api/restricted_current.txt
+++ b/car/app/app-testing/api/restricted_current.txt
@@ -43,7 +43,6 @@
     method public androidx.car.app.testing.TestCarContext.PermissionRequest? getLastPermissionRequest();
     method public java.util.List<android.content.Intent!> getStartCarAppIntents();
     method public boolean hasCalledFinishCarApp();
-    method public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
     method public void reset();
   }
 
diff --git a/car/app/app-testing/build.gradle b/car/app/app-testing/build.gradle
index 08896db..d25ee4f 100644
--- a/car/app/app-testing/build.gradle
+++ b/car/app/app-testing/build.gradle
@@ -15,8 +15,6 @@
  */
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
-import androidx.build.Publish
-import androidx.build.LibraryVersions
 
 import static androidx.build.dependencies.DependenciesKt.*
 
@@ -31,6 +29,9 @@
     implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
     implementation 'androidx.annotation:annotation:1.1.0'
     implementation(project(":annotation:annotation-experimental"))
+    implementation(ROBOLECTRIC) {
+        exclude group: 'org.apache.maven', module: 'maven-ant-tasks'
+    }
     api(KOTLIN_STDLIB) // Due to :annotation-experimental
 
     testImplementation("junit:junit:4.13")
diff --git a/car/app/app-testing/lint-baseline.xml b/car/app/app-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/car/app/app-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/car/app/app-testing/src/main/java/androidx/car/app/testing/FakeHost.java b/car/app/app-testing/src/main/java/androidx/car/app/testing/FakeHost.java
index 89bccef..42a5c71b 100644
--- a/car/app/app-testing/src/main/java/androidx/car/app/testing/FakeHost.java
+++ b/car/app/app-testing/src/main/java/androidx/car/app/testing/FakeHost.java
@@ -33,8 +33,11 @@
 import androidx.car.app.ISurfaceCallback;
 import androidx.car.app.Screen;
 import androidx.car.app.navigation.INavigationHost;
+import androidx.car.app.notification.CarAppNotificationBroadcastReceiver;
 import androidx.car.app.serialization.Bundleable;
 
+import org.robolectric.Shadows;
+
 /**
  * A fake that simulates the behavior of the host of a car app.
  *
@@ -53,15 +56,6 @@
     /**
      * Sends the given pending intent as if the user clicked on a notification action.
      *
-     * <p>You can retrieve the sent {@link Intent} using:
-     *
-     * <pre>
-     *   {@code Shadows.shadowOf(TestCarContext.getCarContext()).getBroadcastIntents()}
-     * </pre>
-     *
-     * <p>You can then test your {@link android.content.BroadcastReceiver} by calling {@link
-     * android.content.BroadcastReceiver#onReceive} with the {@link Intent} that was fired.
-     *
      * @throws NullPointerException if {@code pendingIntent} is {@code null}
      */
     public void performNotificationActionClick(@NonNull PendingIntent pendingIntent) {
@@ -78,6 +72,10 @@
         } catch (CanceledException e) {
             throw new IllegalStateException("Unable to broadcast intent " + pendingIntent, e);
         }
+
+        Intent broadcastedIntent = Shadows.shadowOf(mTestCarContext).getBroadcastIntents().get(0);
+
+        new CarAppNotificationBroadcastReceiver().onReceive(mTestCarContext, broadcastedIntent);
     }
 
     FakeHost(TestCarContext testCarContext) {
diff --git a/car/app/app-testing/src/main/java/androidx/car/app/testing/TestCarContext.java b/car/app/app-testing/src/main/java/androidx/car/app/testing/TestCarContext.java
index e2ed8f7..b455fe0 100644
--- a/car/app/app-testing/src/main/java/androidx/car/app/testing/TestCarContext.java
+++ b/car/app/app-testing/src/main/java/androidx/car/app/testing/TestCarContext.java
@@ -26,7 +26,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
 import androidx.car.app.HostDispatcher;
@@ -57,8 +56,7 @@
  *
  * <pre>{@code testCarContext.getCarService(TestScreenManager.class)}</pre>
  *
- * <p>Allows retrieving all {@link Intent}s sent via {@link CarContext#startCarApp(Intent)} and
- * {@link CarContext#startCarApp(Intent, Intent)}.
+ * <p>Allows retrieving all {@link Intent}s sent via {@link CarContext#startCarApp(Intent)}.
  */
 public class TestCarContext extends CarContext {
     private final Map<String, Object> mOverriddenService = new HashMap<>();
@@ -130,7 +128,6 @@
     }
 
     @Override
-    @OptIn(markerClass = androidx.car.app.annotations.ExperimentalCarApi.class)
     public void requestPermissions(@NonNull Executor executor, @NonNull List<String> permissions,
             @NonNull OnRequestPermissionsCallback callback) {
         mLastPermissionRequest = new PermissionRequest(requireNonNull(permissions),
@@ -164,7 +161,7 @@
     }
 
     /**
-     * Returns all {@link Intent}s sent via {@link CarContext#startCarApp}.
+     * Returns all {@link Intent}s sent via {@link CarContext#startCarApp(Intent)}.
      *
      * <p>The {@link Intent}s are stored in the order of when they were sent, where the first
      * intent in the list, is the first intent sent.
@@ -229,7 +226,14 @@
         return mTestLifecycleOwner;
     }
 
-    IStartCarApp getStartCarAppStub() {
+    /**
+     * Returns the {@link IStartCarApp} instance that is being used by this CarContext.
+     *
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP)
+    @NonNull
+    public IStartCarApp getStartCarAppStub() {
         return mStartCarApp;
     }
 
diff --git a/car/app/app-testing/src/test/AndroidManifest.xml b/car/app/app-testing/src/test/AndroidManifest.xml
new file mode 100644
index 0000000..80e2b0f
--- /dev/null
+++ b/car/app/app-testing/src/test/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?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"
+    package="androidx.car.app.testing">
+    <application>
+        <service android:name="androidx.car.app.CarAppService" >
+            <meta-data android:name="androidx.car.app.CAR_APP_ACTIVITY"
+                android:value="androidx.car.app.CarAppActivity" />
+        </service>
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/car/app/app-testing/src/test/java/androidx/car/app/testing/FakeHostTest.java b/car/app/app-testing/src/test/java/androidx/car/app/testing/FakeHostTest.java
index aecef0c..29b35cc 100644
--- a/car/app/app-testing/src/test/java/androidx/car/app/testing/FakeHostTest.java
+++ b/car/app/app-testing/src/test/java/androidx/car/app/testing/FakeHostTest.java
@@ -18,15 +18,19 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.robolectric.Shadows.shadowOf;
+
 import android.app.PendingIntent;
+import android.content.ComponentName;
 import android.content.Intent;
 
+import androidx.car.app.CarAppService;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 /** Tests for {@link FakeHost}. */
@@ -39,12 +43,17 @@
     @Test
     @SuppressWarnings("PendingIntentMutability")
     public void performNotificationActionClick() {
-        Intent broadcast = new Intent("foo");
-        PendingIntent pendingIntent = PendingIntent.getBroadcast(mCarContext, 1, broadcast, 0);
+        ComponentName componentName = new ComponentName(mCarContext,  CarAppService.class);
+        Intent broadcast =
+                new Intent("foo").setComponent(componentName);
+        shadowOf(mCarContext.getPackageManager()).addServiceIfNotPresent(componentName);
+
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(mCarContext, 1, broadcast, 0);
 
         mCarContext.getFakeHost().performNotificationActionClick(pendingIntent);
 
-        assertThat(Shadows.shadowOf(mCarContext).getBroadcastIntents().get(0).getAction())
-                .isEqualTo(broadcast.getAction());
+        assertThat(mCarContext.getStartCarAppIntents().get(0).getComponent())
+                .isEqualTo(componentName);
+        assertThat(mCarContext.getStartCarAppIntents().get(0).getAction()).isEqualTo("foo");
     }
 }
diff --git a/car/app/app-testing/src/test/java/androidx/car/app/testing/TestCarContextTest.java b/car/app/app-testing/src/test/java/androidx/car/app/testing/TestCarContextTest.java
index f70a4ff..17902c3 100644
--- a/car/app/app-testing/src/test/java/androidx/car/app/testing/TestCarContextTest.java
+++ b/car/app/app-testing/src/test/java/androidx/car/app/testing/TestCarContextTest.java
@@ -21,20 +21,20 @@
 import static org.mockito.Mockito.mock;
 
 import android.app.PendingIntent;
+import android.content.ComponentName;
 import android.content.Intent;
 
 import androidx.car.app.AppManager;
-import androidx.car.app.CarContext;
 import androidx.car.app.OnRequestPermissionsCallback;
 import androidx.car.app.ScreenManager;
 import androidx.car.app.navigation.NavigationManager;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.car.app.testing.navigation.TestNavigationManager;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 import java.util.ArrayList;
@@ -74,16 +74,14 @@
 
         assertThat(mCarContext.getStartCarAppIntents()).containsExactly(startApp);
 
-        Intent broadcast = new Intent("foo");
-        PendingIntent pendingIntent = PendingIntent.getBroadcast(mCarContext, 1, broadcast, 0);
+        Intent broadcast =
+                new Intent("foo").setComponent(new ComponentName(mCarContext.getPackageName(),
+                        "bar"));
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(mCarContext, 1, broadcast, 0);
 
         mCarContext.getFakeHost().performNotificationActionClick(pendingIntent);
 
-        Intent broadcastedIntent = Shadows.shadowOf(mCarContext).getBroadcastIntents().get(0);
-        Intent startApp2 = new Intent(Intent.ACTION_SEND);
-        CarContext.startCarApp(broadcastedIntent, startApp2);
-
-        assertThat(mCarContext.getStartCarAppIntents()).containsExactly(startApp, startApp2);
+        assertThat(mCarContext.getStartCarAppIntents()).containsExactly(startApp, broadcast);
     }
 
     @Test
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index f679e33..f1a3156 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -6,6 +6,7 @@
     method public int getLatestCarAppApiLevel();
     method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_MANIFEST_KEY = "androidx.car.app.minApiLevel";
   }
 
   public class AppManager {
@@ -45,11 +46,14 @@
     method public String getCarServiceName(Class<?>);
     method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
+    method public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
     method public void startCarApp(android.content.Intent);
-    method public static void startCarApp(android.content.Intent, android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
     field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
     field public static final String APP_SERVICE = "app";
     field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
     field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
     field public static final String NAVIGATION_SERVICE = "navigation";
     field public static final String SCREEN_SERVICE = "screen";
@@ -143,6 +147,9 @@
   }
 
   public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
     method public void onStableAreaChanged(android.graphics.Rect);
     method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
     method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
@@ -170,6 +177,19 @@
 
 }
 
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
 package androidx.car.app.model {
 
   @androidx.car.app.annotations.CarProtocol public final class Action {
@@ -182,18 +202,22 @@
     method public static String typeToString(int);
     field public static final androidx.car.app.model.Action APP_ICON;
     field public static final androidx.car.app.model.Action BACK;
+    field public static final androidx.car.app.model.Action PAN;
     field public static final int TYPE_APP_ICON = 65538; // 0x10002
     field public static final int TYPE_BACK = 65539; // 0x10003
     field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
   }
 
   public static final class Action.Builder {
     ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
     method public androidx.car.app.model.Action build();
     method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
@@ -237,11 +261,13 @@
     field public static final androidx.car.app.model.CarIcon APP_ICON;
     field public static final androidx.car.app.model.CarIcon BACK;
     field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
     field public static final int TYPE_ALERT = 4; // 0x4
     field public static final int TYPE_APP_ICON = 5; // 0x5
     field public static final int TYPE_BACK = 3; // 0x3
     field public static final int TYPE_CUSTOM = 1; // 0x1
     field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
   }
 
   public static final class CarIcon.Builder {
@@ -275,11 +301,23 @@
 
   @androidx.car.app.annotations.CarProtocol public final class CarText {
     method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
     method public boolean isEmpty();
     method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
     method public CharSequence toCharSequence();
   }
 
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
     method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
     method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
@@ -337,7 +375,9 @@
     method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
     method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
@@ -407,6 +447,23 @@
     method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
@@ -418,6 +475,7 @@
 
   public static final class MessageTemplate.Builder {
     ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
@@ -452,6 +510,14 @@
     method public void onClick();
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedDelegate {
+    method public void sendInputCompleted(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedListener {
+    method public void onInputCompleted(String);
+  }
+
   @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
     method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
   }
@@ -526,6 +592,7 @@
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
@@ -564,6 +631,7 @@
   public static final class Row.Builder {
     ctor public Row.Builder();
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
@@ -571,6 +639,7 @@
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
   }
 
@@ -654,6 +723,81 @@
 
 }
 
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public androidx.car.app.model.OnInputCompletedDelegate getOnInputCompletedDelegate();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.OnInputCompletedListener);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public String getPin();
+  }
+
+  public static final class PinSignInMethod.Builder {
+    ctor public PinSignInMethod.Builder(String);
+    method public androidx.car.app.model.signin.PinSignInMethod build();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  public static final class ProviderSignInMethod.Builder {
+    ctor public ProviderSignInMethod.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.ProviderSignInMethod build();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
 package androidx.car.app.navigation {
 
   public class NavigationManager {
@@ -786,9 +930,11 @@
 
   public static final class MessageInfo.Builder {
     ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo build();
     method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
   }
 
@@ -796,7 +942,9 @@
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
     method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
   }
 
   public static final class NavigationTemplate.Builder {
@@ -805,12 +953,18 @@
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
   }
 
   public static interface NavigationTemplate.NavigationInfo {
   }
 
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -827,6 +981,7 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
@@ -847,6 +1002,7 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
@@ -876,6 +1032,7 @@
 
   public static final class Step.Builder {
     ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
     method public androidx.car.app.navigation.model.Step build();
     method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
@@ -929,6 +1086,7 @@
     ctor public CarAppExtender(android.app.Notification);
     method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
     method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
     method public androidx.car.app.model.CarColor? getColor();
     method public android.app.PendingIntent? getContentIntent();
     method public CharSequence? getContentText();
@@ -944,6 +1102,7 @@
     ctor public CarAppExtender.Builder();
     method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
     method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
@@ -954,6 +1113,34 @@
     method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
   }
 
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
 }
 
 package androidx.car.app.serialization {
@@ -997,6 +1184,7 @@
     method public static int getLatest();
     method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
   }
 
 }
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 31f742d..84930b4 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -6,6 +6,7 @@
     method public int getLatestCarAppApiLevel();
     method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_MANIFEST_KEY = "androidx.car.app.minApiLevel";
   }
 
   public class AppManager {
@@ -45,13 +46,14 @@
     method public String getCarServiceName(Class<?>);
     method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public boolean isDarkMode();
-    method @androidx.car.app.annotations.ExperimentalCarApi public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
-    method @androidx.car.app.annotations.ExperimentalCarApi public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
+    method public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
     method public void startCarApp(android.content.Intent);
-    method public static void startCarApp(android.content.Intent, android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
     field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
     field public static final String APP_SERVICE = "app";
     field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
     field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
     field public static final String NAVIGATION_SERVICE = "navigation";
     field public static final String SCREEN_SERVICE = "screen";
@@ -145,6 +147,9 @@
   }
 
   public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
     method public void onStableAreaChanged(android.graphics.Rect);
     method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
     method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
@@ -175,6 +180,19 @@
 
 }
 
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
 package androidx.car.app.model {
 
   @androidx.car.app.annotations.CarProtocol public final class Action {
@@ -187,19 +205,22 @@
     method public static String typeToString(int);
     field public static final androidx.car.app.model.Action APP_ICON;
     field public static final androidx.car.app.model.Action BACK;
+    field public static final androidx.car.app.model.Action PAN;
     field public static final int TYPE_APP_ICON = 65538; // 0x10002
     field public static final int TYPE_BACK = 65539; // 0x10003
     field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
   }
 
   public static final class Action.Builder {
     ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
     method public androidx.car.app.model.Action build();
     method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
@@ -243,11 +264,13 @@
     field public static final androidx.car.app.model.CarIcon APP_ICON;
     field public static final androidx.car.app.model.CarIcon BACK;
     field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
     field public static final int TYPE_ALERT = 4; // 0x4
     field public static final int TYPE_APP_ICON = 5; // 0x5
     field public static final int TYPE_BACK = 3; // 0x3
     field public static final int TYPE_CUSTOM = 1; // 0x1
     field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
   }
 
   public static final class CarIcon.Builder {
@@ -281,19 +304,19 @@
 
   @androidx.car.app.annotations.CarProtocol public final class CarText {
     method public static androidx.car.app.model.CarText create(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<java.lang.CharSequence!> getVariants();
+    method public java.util.List<java.lang.CharSequence!> getVariants();
     method public boolean isEmpty();
     method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
     method public CharSequence toCharSequence();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi public static final class CarText.Builder {
+  public static final class CarText.Builder {
     ctor public CarText.Builder(CharSequence);
     method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
     method public androidx.car.app.model.CarText build();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
   }
@@ -355,9 +378,9 @@
     method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
     method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
@@ -427,7 +450,7 @@
     method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -435,7 +458,7 @@
     method public androidx.car.app.model.CarText? getTitle();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
     ctor public LongMessageTemplate.Builder(CharSequence);
     method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.LongMessageTemplate build();
@@ -455,7 +478,7 @@
 
   public static final class MessageTemplate.Builder {
     ctor public MessageTemplate.Builder(CharSequence);
-    ctor @androidx.car.app.annotations.ExperimentalCarApi public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
@@ -490,11 +513,11 @@
     method public void onClick();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedDelegate {
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedDelegate {
     method public void sendInputCompleted(String, androidx.car.app.OnDoneCallback);
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedListener {
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedListener {
     method public void onInputCompleted(String);
   }
 
@@ -572,7 +595,7 @@
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
@@ -611,7 +634,7 @@
   public static final class Row.Builder {
     ctor public Row.Builder();
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
@@ -619,7 +642,7 @@
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
   }
 
@@ -705,7 +728,7 @@
 
 package androidx.car.app.model.signin {
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     method public androidx.car.app.model.CarText? getDefaultValue();
     method public androidx.car.app.model.CarText? getErrorMessage();
     method public androidx.car.app.model.CarText? getHint();
@@ -732,7 +755,7 @@
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     method public String getPin();
   }
 
@@ -741,7 +764,7 @@
     method public androidx.car.app.model.signin.PinSignInMethod build();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     method public androidx.car.app.model.Action getAction();
   }
 
@@ -750,7 +773,7 @@
     method public androidx.car.app.model.signin.ProviderSignInMethod build();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getAdditionalText();
@@ -761,7 +784,7 @@
     method public boolean isLoading();
   }
 
-  @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
     ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
     method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.signin.SignInTemplate build();
@@ -910,11 +933,11 @@
 
   public static final class MessageInfo.Builder {
     ctor public MessageInfo.Builder(CharSequence);
-    ctor @androidx.car.app.annotations.ExperimentalCarApi public MessageInfo.Builder(androidx.car.app.model.CarText);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo build();
     method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
   }
 
@@ -922,7 +945,9 @@
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
     method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
   }
 
   public static final class NavigationTemplate.Builder {
@@ -931,12 +956,18 @@
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
   }
 
   public static interface NavigationTemplate.NavigationInfo {
   }
 
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -953,7 +984,7 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
@@ -974,7 +1005,7 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
-    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
@@ -1004,7 +1035,7 @@
 
   public static final class Step.Builder {
     ctor public Step.Builder(CharSequence);
-    ctor @androidx.car.app.annotations.ExperimentalCarApi public Step.Builder(androidx.car.app.model.CarText);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
     method public androidx.car.app.navigation.model.Step build();
     method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
@@ -1058,6 +1089,7 @@
     ctor public CarAppExtender(android.app.Notification);
     method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
     method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
     method public androidx.car.app.model.CarColor? getColor();
     method public android.app.PendingIntent? getContentIntent();
     method public CharSequence? getContentText();
@@ -1073,6 +1105,7 @@
     ctor public CarAppExtender.Builder();
     method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
     method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
@@ -1083,6 +1116,34 @@
     method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
   }
 
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
 }
 
 package androidx.car.app.serialization {
@@ -1126,6 +1187,7 @@
     method public static int getLatest();
     method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
   }
 
 }
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index f679e33..f1a3156 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -6,6 +6,7 @@
     method public int getLatestCarAppApiLevel();
     method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_MANIFEST_KEY = "androidx.car.app.minApiLevel";
   }
 
   public class AppManager {
@@ -45,11 +46,14 @@
     method public String getCarServiceName(Class<?>);
     method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
+    method public void requestPermissions(java.util.concurrent.Executor, java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsCallback);
     method public void startCarApp(android.content.Intent);
-    method public static void startCarApp(android.content.Intent, android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
     field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
     field public static final String APP_SERVICE = "app";
     field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
     field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
     field public static final String NAVIGATION_SERVICE = "navigation";
     field public static final String SCREEN_SERVICE = "screen";
@@ -143,6 +147,9 @@
   }
 
   public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
     method public void onStableAreaChanged(android.graphics.Rect);
     method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
     method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
@@ -170,6 +177,19 @@
 
 }
 
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
 package androidx.car.app.model {
 
   @androidx.car.app.annotations.CarProtocol public final class Action {
@@ -182,18 +202,22 @@
     method public static String typeToString(int);
     field public static final androidx.car.app.model.Action APP_ICON;
     field public static final androidx.car.app.model.Action BACK;
+    field public static final androidx.car.app.model.Action PAN;
     field public static final int TYPE_APP_ICON = 65538; // 0x10002
     field public static final int TYPE_BACK = 65539; // 0x10003
     field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
   }
 
   public static final class Action.Builder {
     ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
     method public androidx.car.app.model.Action build();
     method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
     method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
@@ -237,11 +261,13 @@
     field public static final androidx.car.app.model.CarIcon APP_ICON;
     field public static final androidx.car.app.model.CarIcon BACK;
     field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
     field public static final int TYPE_ALERT = 4; // 0x4
     field public static final int TYPE_APP_ICON = 5; // 0x5
     field public static final int TYPE_BACK = 3; // 0x3
     field public static final int TYPE_CUSTOM = 1; // 0x1
     field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
   }
 
   public static final class CarIcon.Builder {
@@ -275,11 +301,23 @@
 
   @androidx.car.app.annotations.CarProtocol public final class CarText {
     method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
     method public boolean isEmpty();
     method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
     method public CharSequence toCharSequence();
   }
 
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
     method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
     method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
@@ -337,7 +375,9 @@
     method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
     method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
@@ -407,6 +447,23 @@
     method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
@@ -418,6 +475,7 @@
 
   public static final class MessageTemplate.Builder {
     ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
     method public androidx.car.app.model.MessageTemplate build();
     method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
@@ -452,6 +510,14 @@
     method public void onClick();
   }
 
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedDelegate {
+    method public void sendInputCompleted(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface OnInputCompletedListener {
+    method public void onInputCompleted(String);
+  }
+
   @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
     method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
   }
@@ -526,6 +592,7 @@
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
@@ -564,6 +631,7 @@
   public static final class Row.Builder {
     ctor public Row.Builder();
     method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row build();
     method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
     method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
@@ -571,6 +639,7 @@
     method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
     method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
   }
 
@@ -654,6 +723,81 @@
 
 }
 
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public androidx.car.app.model.OnInputCompletedDelegate getOnInputCompletedDelegate();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.OnInputCompletedListener);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public String getPin();
+  }
+
+  public static final class PinSignInMethod.Builder {
+    ctor public PinSignInMethod.Builder(String);
+    method public androidx.car.app.model.signin.PinSignInMethod build();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  public static final class ProviderSignInMethod.Builder {
+    ctor public ProviderSignInMethod.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.ProviderSignInMethod build();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
 package androidx.car.app.navigation {
 
   public class NavigationManager {
@@ -786,9 +930,11 @@
 
   public static final class MessageInfo.Builder {
     ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo build();
     method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
   }
 
@@ -796,7 +942,9 @@
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
     method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
   }
 
   public static final class NavigationTemplate.Builder {
@@ -805,12 +953,18 @@
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
     method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
   }
 
   public static interface NavigationTemplate.NavigationInfo {
   }
 
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
   @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -827,6 +981,7 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
@@ -847,6 +1002,7 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
   @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
@@ -876,6 +1032,7 @@
 
   public static final class Step.Builder {
     ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
     method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
     method public androidx.car.app.navigation.model.Step build();
     method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
@@ -929,6 +1086,7 @@
     ctor public CarAppExtender(android.app.Notification);
     method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
     method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
     method public androidx.car.app.model.CarColor? getColor();
     method public android.app.PendingIntent? getContentIntent();
     method public CharSequence? getContentText();
@@ -944,6 +1102,7 @@
     ctor public CarAppExtender.Builder();
     method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
     method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
     method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
@@ -954,6 +1113,34 @@
     method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
   }
 
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
 }
 
 package androidx.car.app.serialization {
@@ -997,6 +1184,7 @@
     method public static int getLatest();
     method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
   }
 
 }
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index fd0f9dc..e5acbc4 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -27,12 +27,12 @@
 
 dependencies {
     implementation("androidx.activity:activity:1.2.0")
-    implementation("androidx.annotation:annotation:1.2.0-rc01")
-    implementation("androidx.core:core:1.3.0")
+    implementation("androidx.annotation:annotation:1.2.0")
+    implementation("androidx.core:core:1.5.0-rc01")
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.2.0")
     // Session and Screen both implement LifeCycleOwner so this needs to be exposed.
     api("androidx.lifecycle:lifecycle-common-java8:2.2.0")
-    implementation("androidx.annotation:annotation-experimental:1.1.0-rc01")
+    implementation("androidx.annotation:annotation-experimental:1.1.0")
     compileOnly KOTLIN_STDLIB // Due to :annotation-experimental
 
     annotationProcessor(NULLAWAY)
diff --git a/car/app/app/lint-baseline.xml b/car/app/app/lint-baseline.xml
index 067f970..0d7de48 100644
--- a/car/app/app/lint-baseline.xml
+++ b/car/app/app/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -8,7 +8,7 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/car/app/serialization/Bundler.java"
-            line="322"
+            line="343"
             column="33"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/car/app/serialization/Bundler.java"
-            line="405"
+            line="427"
             column="26"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/car/app/serialization/Bundler.java"
-            line="483"
+            line="514"
             column="20"/>
     </issue>
 
diff --git a/car/app/app/src/main/AndroidManifest.xml b/car/app/app/src/main/AndroidManifest.xml
index fb8290d..8d475e4 100644
--- a/car/app/app/src/main/AndroidManifest.xml
+++ b/car/app/app/src/main/AndroidManifest.xml
@@ -21,7 +21,7 @@
         <activity
             android:name=".CarAppInternalActivity"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
-            android:exported="false">
-        </activity>
+            android:exported="false"/>
+        <receiver android:name=".notification.CarAppNotificationBroadcastReceiver" />
     </application>
 </manifest>
\ No newline at end of file
diff --git a/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl b/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
index e8f5a8b..d3465e9 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
+++ b/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
@@ -43,4 +43,19 @@
    * Notifies the app that the surface has destroyed.
    */
   void onSurfaceDestroyed(in Bundleable surfaceContainer, IOnDoneCallback callback) = 4;
+
+  /**
+   * Notifies the app about a surface scroll touch event.
+   */
+  void onScroll(float distanceX, float distanceY) = 5;
+
+  /**
+   * Notifies the app about a surface fling touch event.
+   */
+  void onFling(float velocityX, float velocityY) = 6;
+
+  /**
+   * Notifies the app about a surface scale touch event.
+   */
+  void onScale(float focusX, float focusY, float scaleFactor) = 7;
 }
diff --git a/car/app/app/src/main/aidl/androidx/car/app/constraints/IConstraintHost.aidl b/car/app/app/src/main/aidl/androidx/car/app/constraints/IConstraintHost.aidl
new file mode 100644
index 0000000..3f1b7d4
--- /dev/null
+++ b/car/app/app/src/main/aidl/androidx/car/app/constraints/IConstraintHost.aidl
@@ -0,0 +1,27 @@
+/*
+ * 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.car.app.constraints;
+
+import androidx.car.app.serialization.Bundleable;
+
+/** @hide */
+interface IConstraintHost {
+ /**
+  * Queries the host for the limit for a content type.
+  */
+  int getContentLimit(int contentType) = 1;
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/AppInfo.java b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
index 7fdc8bb..26eabc3 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
@@ -16,14 +16,11 @@
 
 package androidx.car.app;
 
-import static androidx.car.app.utils.LogTags.TAG;
-
 import static java.util.Objects.requireNonNull;
 
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.util.Log;
 
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
@@ -48,7 +45,7 @@
  * <manifest ...>
  *   <application ...>
  *     <meta-data
- *         android:name="androidx.car.app.min-api-level"
+ *         android:name="androidx.car.app.minApiLevel"
  *         android:value="1" />
  *     ...
  *   </application>
@@ -62,10 +59,16 @@
     // TODO(b/174803562): Automatically update the this version using Gradle
     private static final String LIBRARY_VERSION = "1.1.0-alpha01";
 
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY)
-    @VisibleForTesting
-    public static final String MIN_API_LEVEL_MANIFEST_KEY = "androidx.car.app.min-api-level";
+    /**
+     * Application meta-data tag used to define the minimum Car App API level this application is
+     * able to handle.
+     *
+     * <p>If not specified, the library assumes the application can only handle the Car App API
+     * level designed by {@link CarAppApiLevels#getLatest()} at the time of compiling.
+     *
+     * @see CarContext#getCarAppApiLevel()
+     */
+    public static final String MIN_API_LEVEL_MANIFEST_KEY = "androidx.car.app.minApiLevel";
 
     @Keep
     @Nullable
@@ -96,7 +99,6 @@
         return new AppInfo(minApiLevel, CarAppApiLevels.getLatest(), LIBRARY_VERSION);
     }
 
-
     /**
      * Creates an instance of {@link AppInfo} with the provided version information.
      *
@@ -129,17 +131,17 @@
             ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(
                     context.getPackageName(),
                     PackageManager.GET_META_DATA);
-            if (applicationInfo.metaData == null) {
-                Log.i(TAG, "Min API level not found (" + MIN_API_LEVEL_MANIFEST_KEY + "). "
-                        + "Assuming min API level = " + CarAppApiLevels.getLatest());
-                return CarAppApiLevels.getLatest();
+            int apiLevel = applicationInfo.metaData != null
+                                   ? applicationInfo.metaData.getInt(
+                                       MIN_API_LEVEL_MANIFEST_KEY, CarAppApiLevels.UNKNOWN)
+                                   : CarAppApiLevels.UNKNOWN;
+            if (apiLevel == CarAppApiLevels.UNKNOWN) {
+                throw new IllegalArgumentException("Min API level not declared in manifest ("
+                    + MIN_API_LEVEL_MANIFEST_KEY + ")");
             }
-            return applicationInfo.metaData.getInt(MIN_API_LEVEL_MANIFEST_KEY,
-                    CarAppApiLevels.getLatest());
+            return apiLevel;
         } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Unable to read min API level from manifest. Assuming "
-                    + CarAppApiLevels.getLatest(), e);
-            return CarAppApiLevels.getLatest();
+            throw new IllegalArgumentException("Unable to read min API level from manifest");
         }
     }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/AppManager.java b/car/app/app/src/main/java/androidx/car/app/AppManager.java
index 851aa8f..02e3941 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppManager.java
@@ -92,7 +92,7 @@
      *
      * @param text     the text to show
      * @param duration how long to display the message
-     * @throws HostException if the remote call fails
+     * @throws HostException        if the remote call fails
      * @throws NullPointerException if {@code text} is {@code null}
      */
     public void showToast(@NonNull CharSequence text, @CarToast.Duration int duration) {
@@ -144,7 +144,7 @@
             public void getTemplate(IOnDoneCallback callback) {
                 RemoteUtils.dispatchCallFromHost(getLifecycle(), callback, "getTemplate",
                         getCarContext().getCarService(
-                        ScreenManager.class)::getTopTemplate);
+                                ScreenManager.class)::getTopTemplate);
             }
 
             @Override
diff --git a/car/app/app/src/main/java/androidx/car/app/CarAppService.java b/car/app/app/src/main/java/androidx/car/app/CarAppService.java
index 70a0598..c3ac61e 100644
--- a/car/app/app/src/main/java/androidx/car/app/CarAppService.java
+++ b/car/app/app/src/main/java/androidx/car/app/CarAppService.java
@@ -225,7 +225,7 @@
      *
      * <p>Called by the system, do not call this method directly.
      *
-     * @see CarContext#startCarApp
+     * @see CarContext#startCarApp(Intent)
      */
     @NonNull
     public abstract Session onCreateSession();
@@ -315,6 +315,7 @@
         if (!CarAppApiLevels.isValid(apiLevel)) {
             throw new IllegalArgumentException("Invalid Car App API level received: " + apiLevel);
         }
+
         mHandshakeInfo = handshakeInfo;
     }
 
@@ -517,6 +518,19 @@
                                             + packageName + "', uid:" + uid));
                             return;
                         }
+
+                        int appMinApiLevel =
+                                CarAppService.this.getAppInfo().getMinCarAppApiLevel();
+                        int hostApiLevel = deserializedHandshakeInfo.getHostCarAppApiLevel();
+                        if (appMinApiLevel > hostApiLevel) {
+                            RemoteUtils.sendFailureResponseToHost(callback, "onHandshakeCompleted",
+                                    new IllegalArgumentException(
+                                            "Host API level (" + hostApiLevel + ") is "
+                                                    + "less than the app's min API level ("
+                                                    + appMinApiLevel + ")"));
+                            return;
+                        }
+
                         setHostInfo(hostInfo);
                         setHandshakeInfo(deserializedHandshakeInfo);
                         RemoteUtils.sendSuccessResponseToHost(callback, "onHandshakeCompleted",
diff --git a/car/app/app/src/main/java/androidx/car/app/CarContext.java b/car/app/app/src/main/java/androidx/car/app/CarContext.java
index b03ce43..9258d2a 100644
--- a/car/app/app/src/main/java/androidx/car/app/CarContext.java
+++ b/car/app/app/src/main/java/androidx/car/app/CarContext.java
@@ -41,9 +41,10 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringDef;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.constraints.ConstraintManager;
 import androidx.car.app.navigation.NavigationManager;
+import androidx.car.app.notification.CarPendingIntent;
 import androidx.car.app.utils.RemoteUtils;
 import androidx.car.app.utils.ThreadUtils;
 import androidx.car.app.versioning.CarAppApiLevel;
@@ -92,8 +93,9 @@
      *
      * @hide
      */
-    @StringDef({APP_SERVICE, CAR_SERVICE, NAVIGATION_SERVICE, SCREEN_SERVICE})
+    @StringDef({APP_SERVICE, CAR_SERVICE, NAVIGATION_SERVICE, SCREEN_SERVICE, CONSTRAINT_SERVICE})
     @Retention(RetentionPolicy.SOURCE)
+    @RestrictTo(LIBRARY)
     public @interface CarServiceType {
     }
 
@@ -109,6 +111,10 @@
     /** Manages the screens of the app, including the screen stack. */
     public static final String SCREEN_SERVICE = "screen";
 
+    /** Manages constraints for the app as enforced by the connected host. */
+    @RequiresCarApi(2)
+    public static final String CONSTRAINT_SERVICE = "constraints";
+
     /**
      * Internal usage only. Top level binder to host.
      */
@@ -124,7 +130,8 @@
     /**
      * Standard action for navigating to a location.
      *
-     * <p>Used as the {@link Intent}'s action for starting a navigation via {@link #startCarApp}.
+     * <p>Used as the {@link Intent}'s action for starting a navigation via
+     * {@link #startCarApp(Intent)}.
      */
     public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
 
@@ -147,6 +154,7 @@
     private final AppManager mAppManager;
     private final NavigationManager mNavigationManager;
     private final ScreenManager mScreenManager;
+    private final ConstraintManager mConstraintManager;
     private final OnBackPressedDispatcher mOnBackPressedDispatcher;
     private final HostDispatcher mHostDispatcher;
     private final Lifecycle mLifecycle;
@@ -195,6 +203,8 @@
                 return mNavigationManager;
             case SCREEN_SERVICE:
                 return mScreenManager;
+            case CONSTRAINT_SERVICE:
+                return mConstraintManager;
             default: // fall out
         }
 
@@ -237,6 +247,8 @@
             return NAVIGATION_SERVICE;
         } else if (serviceClass.isInstance(mScreenManager)) {
             return SCREEN_SERVICE;
+        } else if (serviceClass.isInstance(mConstraintManager)) {
+            return CONSTRAINT_SERVICE;
         }
 
         throw new IllegalArgumentException("The class does not correspond to a car service");
@@ -272,7 +284,7 @@
      * @param intent the {@link Intent} to send to the target application
      * @throws SecurityException         if the app attempts to start a different app explicitly or
      *                                   does not have permissions for the requested action
-     * @throws InvalidParameterException if {@code intent} does not meet the criteria defined
+     * @throws HostException             if the remote call fails
      * @throws NullPointerException      if {@code intent} is {@code null}
      */
     public void startCarApp(@NonNull Intent intent) {
@@ -302,7 +314,10 @@
      *                                   user in the car
      * @throws NullPointerException      if either {@code notificationIntent} or {@code appIntent
      *                                   } are {@code null}
+     * @deprecated use {@link CarPendingIntent#getCarApp(Context, int, Intent, int)} to create
+     * the pending intent for the notification action.  This API will NOT work for Automotive OS.
      */
+    @Deprecated
     public static void startCarApp(@NonNull Intent notificationIntent, @NonNull Intent appIntent) {
         requireNonNull(notificationIntent);
         requireNonNull(appIntent);
@@ -434,7 +449,6 @@
      * @throws NullPointerException if either {@code permissions} or {@code callback} are {@code
      *                              null}
      */
-    @ExperimentalCarApi
     public void requestPermissions(@NonNull List<String> permissions,
             @NonNull OnRequestPermissionsCallback callback) {
         requestPermissions(ContextCompat.getMainExecutor(this), permissions, callback);
@@ -462,7 +476,6 @@
      * @throws NullPointerException if any of {@code executor}, {@code permissions} or
      *                              {@code callback} are {@code null}
      */
-    @ExperimentalCarApi
     public void requestPermissions(@NonNull /* @CallbackExecutor */ Executor executor,
             @NonNull List<String> permissions, @NonNull OnRequestPermissionsCallback callback) {
         requireNonNull(executor);
@@ -591,6 +604,7 @@
         mAppManager = AppManager.create(this, hostDispatcher, lifecycle);
         mNavigationManager = NavigationManager.create(this, hostDispatcher, lifecycle);
         mScreenManager = ScreenManager.create(this, lifecycle);
+        mConstraintManager = ConstraintManager.create(this, hostDispatcher);
         mOnBackPressedDispatcher =
                 new OnBackPressedDispatcher(() -> getCarService(ScreenManager.class).pop());
         mLifecycle = lifecycle;
diff --git a/car/app/app/src/main/java/androidx/car/app/HostDispatcher.java b/car/app/app/src/main/java/androidx/car/app/HostDispatcher.java
index dc21714..bb974ce 100644
--- a/car/app/app/src/main/java/androidx/car/app/HostDispatcher.java
+++ b/car/app/app/src/main/java/androidx/car/app/HostDispatcher.java
@@ -30,6 +30,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext.CarServiceType;
+import androidx.car.app.constraints.IConstraintHost;
 import androidx.car.app.navigation.INavigationHost;
 import androidx.car.app.utils.LogTags;
 import androidx.car.app.utils.RemoteUtils;
@@ -49,6 +50,8 @@
     @Nullable
     private IAppHost mAppHost;
     @Nullable
+    private IConstraintHost mConstraintHost;
+    @Nullable
     private INavigationHost mNavigationHost;
 
     /**
@@ -57,8 +60,6 @@
      * @param hostType the service to dispatch to
      * @param callName the name of the call for logging purposes
      * @param call     the request to dispatch
-     *
-     * @throws RemoteException   if the host is unresponsive
      * @throws SecurityException if the host has thrown it
      * @throws HostException     if the host throws any exception other than
      *                           {@link SecurityException}
@@ -85,7 +86,6 @@
      * @param hostType the service to dispatch to
      * @param callName the name of the call for logging purposes
      * @param call     the request to dispatch
-     *
      * @throws SecurityException if the host has thrown it
      * @throws HostException     if the host throws any exception other than
      *                           {@link SecurityException}
@@ -150,6 +150,16 @@
                 }
                 host = mAppHost;
                 break;
+            case CarContext.CONSTRAINT_SERVICE:
+                if (mConstraintHost == null) {
+                    mConstraintHost =
+                            RemoteUtils.dispatchCallToHostForResult("getHost(Constraints)", () ->
+                                    IConstraintHost.Stub.asInterface(
+                                            requireNonNull(mCarHost).getHost(
+                                                    CarContext.CONSTRAINT_SERVICE)));
+                }
+                host = mConstraintHost;
+                break;
             case CarContext.NAVIGATION_SERVICE:
                 if (mNavigationHost == null) {
                     mNavigationHost =
diff --git a/car/app/app/src/main/java/androidx/car/app/Screen.java b/car/app/app/src/main/java/androidx/car/app/Screen.java
index 1a8289e..9066d570 100644
--- a/car/app/app/src/main/java/androidx/car/app/Screen.java
+++ b/car/app/app/src/main/java/androidx/car/app/Screen.java
@@ -314,6 +314,12 @@
     void dispatchLifecycleEvent(Event event) {
         ThreadUtils.runOnMain(
                 () -> {
+                    State currentState = mLifecycleRegistry.getCurrentState();
+                    // Avoid handling further events if the screen is already marked as destroyed.
+                    if (!currentState.isAtLeast(State.INITIALIZED)) {
+                        return;
+                    }
+
                     if (event == Event.ON_DESTROY) {
                         mOnScreenResultListener.onScreenResult(mResult);
                     }
diff --git a/car/app/app/src/main/java/androidx/car/app/Session.java b/car/app/app/src/main/java/androidx/car/app/Session.java
index a3acace..2d3aafd 100644
--- a/car/app/app/src/main/java/androidx/car/app/Session.java
+++ b/car/app/app/src/main/java/androidx/car/app/Session.java
@@ -69,8 +69,8 @@
      * <p>Called by the system, do not call this method directly.
      *
      * @param intent the intent that was used to start this app. If the app was started with a
-     *               call to {@link CarContext#startCarApp}, this intent will be equal to the
-     *               intent passed to that method
+     *               call to {@link CarContext#startCarApp(Intent)}, this intent will be equal to
+     *               the intent passed to that method
      */
     @NonNull
     public abstract Screen onCreateScreen(@NonNull Intent intent);
@@ -88,9 +88,9 @@
      * <p>Called by the system, do not call this method directly.
      *
      * @param intent the intent that was used to start this app. If the app was started with a
-     *               call to {@link CarContext#startCarApp}, this intent will be equal to the
-     *               intent passed to that method
-     * @see CarContext#startCarApp
+     *               call to {@link CarContext#startCarApp(Intent)}, this intent will be equal to
+     *               the intent passed to that method
+     * @see CarContext#startCarApp(Intent)
      */
     public void onNewIntent(@NonNull Intent intent) {
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
index 277dba1..d55d1fe 100644
--- a/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
+++ b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
@@ -19,6 +19,7 @@
 import android.graphics.Rect;
 
 import androidx.annotation.NonNull;
+import androidx.car.app.annotations.RequiresCarApi;
 
 /** A callback for changes on the {@link SurfaceContainer} and its attributes. */
 public interface SurfaceCallback {
@@ -69,4 +70,38 @@
      * @param surfaceContainer the {@link SurfaceContainer} being destroyed
      */
     void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer);
+
+    /**
+     * Provides information about a scroll touch event on the car screen.
+     *
+     * @param distanceX The distance in pixels along the X axis that has been scrolled since the
+     *                  last touch position during the scroll event.
+     * @param distanceY The distance in pixels along the Y axis that has been scrolled since the
+     *                  last touch position during the scroll event.
+     */
+    @RequiresCarApi(2)
+    default void onScroll(float distanceX, float distanceY) {
+    }
+
+    /**
+     * Provides information about a fling touch event on the car screen.
+     *
+     * @param velocityX The velocity of this fling measured in pixels per second along the x axis.
+     * @param velocityY The velocity of this fling measured in pixels per second along the y axis.
+     */
+    @RequiresCarApi(2)
+    default void onFling(float velocityX, float velocityY) {
+    }
+
+    /**
+     * Provides information about a scale touch event on the car screen.
+     *
+     * @param focusX X coordinate of the focal point in pixels.
+     * @param focusY Y coordinate of the focal point in pixels.
+     * @param scaleFactor The scaling factor from the previous state to the current
+     *                    state during the scale event.
+     */
+    @RequiresCarApi(2)
+    default void onScale(float focusX, float focusY, float scaleFactor) {
+    }
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/constraints/ConstraintManager.java b/car/app/app/src/main/java/androidx/car/app/constraints/ConstraintManager.java
new file mode 100644
index 0000000..aafbf60
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/constraints/ConstraintManager.java
@@ -0,0 +1,172 @@
+/*
+ * 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.car.app.constraints;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import static java.util.Objects.requireNonNull;
+
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.IntegerRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.car.app.CarContext;
+import androidx.car.app.HostDispatcher;
+import androidx.car.app.HostException;
+import androidx.car.app.R;
+import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.utils.LogTags;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Manages various constraints on the library as enforced by the host.
+ *
+ * <p>Depending on the host the app is connected to, there could be different various limits that
+ * apply, such as the number of items that could be in a list in different templates. An app can
+ * use this manager to query for these limits at runtime and react accordingly.
+ */
+@RequiresCarApi(2)
+public class ConstraintManager {
+    /**
+     * Represents the types of lists that apps can create.
+     *
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @IntDef({CONTENT_LIMIT_TYPE_LIST, CONTENT_LIMIT_TYPE_GRID, CONTENT_LIMIT_TYPE_PLACE_LIST,
+            CONTENT_LIMIT_TYPE_ROUTE_LIST, CONTENT_LIMIT_TYPE_PANE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ContentLimitType {
+    }
+
+    /**
+     * Represents the limit for generic, uniform list contents.
+     *
+     * <p>The limit of this type should be no smaller than the values defined in
+     * {@link androidx.car.app.R.integer#content_limit_list}, but the host may support a larger
+     * limit.
+     */
+    public static final int CONTENT_LIMIT_TYPE_LIST = 0;
+
+    /**
+     * Represents the limit for contents to be shown in a grid format.
+     *
+     * <p>The limit of this type should be no smaller than the values defined in
+     * {@link androidx.car.app.R.integer#content_limit_grid}, but the host may support a larger
+     * limit.
+     */
+    public static final int CONTENT_LIMIT_TYPE_GRID = 1;
+
+    /**
+     * Represents the limit for list contents that are associated with points of interest.
+     *
+     * <p>The limit of this type should be no smaller than the values defined in
+     * {@link androidx.car.app.R.integer#content_limit_place_list}, but the host may support a
+     * larger limit.
+     */
+    public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2;
+
+    /**
+     * Represents the limit for list contents that are associated with navigation routes.
+     *
+     * <p>The limit of this type should be no smaller than the values defined in
+     * {@link androidx.car.app.R.integer#content_limit_route_list}, but the host may support a
+     * larger limit.
+     */
+    public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3;
+
+    /**
+     * Represents the limit for contents to be shown in a pane format.
+     *
+     * <p>The limit of this type should be no smaller than the values defined in
+     * {@link androidx.car.app.R.integer#content_limit_pane}, but the host may support a larger
+     * limit.
+     */
+    public static final int CONTENT_LIMIT_TYPE_PANE = 4;
+
+    @NonNull
+    private final CarContext mCarContext;
+    @NonNull
+    private final HostDispatcher mHostDispatcher;
+
+    /**
+     * Requests for the limit associated with the {@code contentLimitType}.
+     *
+     * @throws HostException if the remote call fails
+     */
+    public int getContentLimit(@ContentLimitType int contentLimitType) {
+        Integer limit = null;
+        try {
+            // TODO(b/185805900): consider caching these values if performance is a concern.
+            limit = mHostDispatcher.dispatchForResult(
+                    CarContext.CONSTRAINT_SERVICE,
+                    "getContentLimit", (IConstraintHost host) -> {
+                        return host.getContentLimit(contentLimitType);
+                    }
+            );
+        } catch (RemoteException e) {
+            // The host is dead, don't crash the app, just log.
+            Log.w(LogTags.TAG, "Failed to retrieve list limit from the host, using defaults", e);
+        }
+
+        if (limit != null) {
+            return limit;
+        }
+
+        // Returns default values as documented if host call failed.
+        return mCarContext.getResources().getInteger(getResourceIdForContentType(contentLimitType));
+    }
+
+    @IntegerRes
+    private int getResourceIdForContentType(@ContentLimitType int contentType) {
+        switch (contentType) {
+            case CONTENT_LIMIT_TYPE_GRID:
+                return R.integer.content_limit_grid;
+            case CONTENT_LIMIT_TYPE_PANE:
+                return R.integer.content_limit_pane;
+            case CONTENT_LIMIT_TYPE_PLACE_LIST:
+                return R.integer.content_limit_place_list;
+            case CONTENT_LIMIT_TYPE_ROUTE_LIST:
+                return R.integer.content_limit_route_list;
+            case CONTENT_LIMIT_TYPE_LIST:
+            default:
+                return R.integer.content_limit_list;
+        }
+    }
+
+    /**
+     * Creates an instance of {@link ConstraintManager}.
+     *
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(LIBRARY)
+    public static ConstraintManager create(@NonNull CarContext context,
+            @NonNull HostDispatcher hostDispatcher) {
+        return new ConstraintManager(requireNonNull(context), requireNonNull(hostDispatcher));
+    }
+
+    private ConstraintManager(CarContext context, HostDispatcher hostDispatcher) {
+        mCarContext = context;
+        mHostDispatcher = hostDispatcher;
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Action.java b/car/app/app/src/main/java/androidx/car/app/model/Action.java
index ad63ff1..b5d4768 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Action.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Action.java
@@ -35,7 +35,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.lifecycle.LifecycleOwner;
 
@@ -64,7 +64,7 @@
 @CarProtocol
 public final class Action {
     /**
-     * The type of action represented by the {@link Action } instance.
+     * The type of action represented by the {@link Action} instance.
      *
      * @hide
      */
@@ -74,6 +74,7 @@
                     TYPE_CUSTOM,
                     TYPE_APP_ICON,
                     TYPE_BACK,
+                    TYPE_PAN,
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ActionType {
@@ -101,6 +102,11 @@
     public static final int TYPE_BACK = 3 | FLAG_STANDARD;
 
     /**
+     * An action to toggle the pan mode in a map-based template.
+     */
+    public static final int TYPE_PAN = 4 | FLAG_STANDARD;
+
+    /**
      * A standard action to show the app's icon.
      *
      * <p>This action is non-interactive.
@@ -121,6 +127,20 @@
     @NonNull
     public static final Action BACK = new Action(TYPE_BACK);
 
+    /**
+     * A standard action to toggle the pan mode in a map-based template.
+     *
+     * <p>If the app does not provide a custom icon, a default pan icon will be used.
+     *
+     * <p>You can set a custom icon in a pan action with the following code:
+     *
+     * <pre>{@code
+     * Action panAction = new Action.Builder(Action.PAN).setIcon(customIcon).build();
+     * }</pre>
+     */
+    @NonNull
+    public static final Action PAN = new Action(TYPE_PAN);
+
     @Keep
     @Nullable
     private final CarText mTitle;
@@ -206,6 +226,8 @@
                 return "APP_ICON";
             case TYPE_BACK:
                 return "BACK";
+            case TYPE_PAN:
+                return "PAN";
             default:
                 return "<unknown>";
         }
@@ -213,7 +235,7 @@
 
     /** Convenience constructor for standard action singletons. */
     private Action(@ActionType int type) {
-        if (!isStandardActionType(type)) {
+        if (type == TYPE_CUSTOM) {
             throw new IllegalArgumentException(
                     "Standard action constructor used with non standard type");
         }
@@ -284,12 +306,10 @@
         /**
          * Sets the title to display in the action.
          *
-         * <p>Custom {@link ForegroundCarColorSpan}s are supported in the input string. See the
-         * documentation on where the {@link Action} is added for more details on any
-         * other restriction(s) that might apply.
+         * <p>Support for text spans depends on where the action is used. See the documentation
+         * of the specific APIs taking an {@link Action} for details.
          *
          * @throws NullPointerException if {@code title} is {@code null}
-         * @see CarText
          */
         @NonNull
         public Builder setTitle(@NonNull CharSequence title) {
@@ -298,16 +318,15 @@
         }
 
         /**
-         * Sets the title to display in the action.
+         * Sets the title to display in the action, with support for multiple length variants.
          *
-         * <p>{@link ForegroundCarColorSpan}s are supported in the input string. See the
-         * documentation on where the {@link Action} is added for more details on any
-         * other restriction(s) that might apply.
+         * <p>Support for text spans depends on where the action is used. For example,
+         * most templates taking an action support {@link ForegroundCarColorSpan}, but this may
+         * vary. See the documentation of the specific APIs taking an {@link Action} for details.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             mTitle = requireNonNull(title);
@@ -365,7 +384,7 @@
          *
          * @param backgroundColor the {@link CarColor} to set as background. Use {@link
          *                        CarColor#DEFAULT} to let the host pick a default
-         * @throws NullPointerException     if {@code backgroundColor} is {@code null}
+         * @throws NullPointerException if {@code backgroundColor} is {@code null}
          */
         @NonNull
         public Builder setBackgroundColor(@NonNull CarColor backgroundColor) {
@@ -393,8 +412,8 @@
             if ((mType == TYPE_APP_ICON || mType == TYPE_BACK)) {
                 if (mOnClickDelegate != null) {
                     throw new IllegalStateException(
-                            "An on-click listener can't be set on the standard back or app-icon "
-                                    + "action");
+                            "An on-click listener can't be set on the standard back or "
+                                    + "app-icon action");
                 }
 
                 if (mIcon != null || (mTitle != null && !TextUtils.isEmpty(mTitle.toString()))) {
@@ -404,11 +423,35 @@
                 }
             }
 
+            if (mType == TYPE_PAN) {
+                if (mOnClickDelegate != null) {
+                    throw new IllegalStateException(
+                            "An on-click listener can't be set on the pan mode action");
+                }
+            }
+
             return new Action(this);
         }
 
         /** Creates an empty {@link Builder} instance. */
         public Builder() {
         }
+
+        /**
+         * Returns a {@link Builder} instance configured with the same data as the given
+         * {@link Action} instance.
+         *
+         * @throws NullPointerException if {@code action} is {@code null}
+         */
+        @RequiresCarApi(2)
+        public Builder(@NonNull Action action) {
+            requireNonNull(action);
+            mType = action.getType();
+            mIcon = action.getIcon();
+            mTitle = action.getTitle();
+            mOnClickDelegate = action.getOnClickDelegate();
+            CarColor backgroundColor = action.getBackgroundColor();
+            mBackgroundColor = backgroundColor == null ? DEFAULT : backgroundColor;
+        }
     }
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java b/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
index 6650c2d..1909ecb 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
@@ -116,8 +116,9 @@
         /**
          * Adds an {@link Action} to the list.
          *
-         * <p>Background colors are not supported on an action inside an {@link ActionStrip}, and
-         * any spans set in the action's title will be ignored.
+         * <p>Background colors are not supported on an action inside an {@link ActionStrip}.
+         *
+         * <p>Spans are not supported in the title of the action and will be ignored.
          *
          * @throws IllegalArgumentException if the background color of the action is specified,
          *                                  or if {@code action} is a standard action and an
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
index d6d0d27..ecc59c9 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
@@ -33,6 +33,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarColorConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.core.graphics.drawable.IconCompat;
@@ -115,6 +116,7 @@
                     TYPE_ALERT,
                     TYPE_APP_ICON,
                     TYPE_ERROR,
+                    TYPE_PAN,
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CarIconType {
@@ -154,6 +156,13 @@
     public static final int TYPE_ERROR = 6;
 
     /**
+     * A pan icon.
+     *
+     * @see #PAN
+     */
+    public static final int TYPE_PAN = 7;
+
+    /**
      * Represents the app's icon, as defined in the app's manifest by the {@code android:icon}
      * attribute of the {@code application} element.
      */
@@ -178,6 +187,13 @@
     @NonNull
     public static final CarIcon ERROR = CarIcon.forStandardType(TYPE_ERROR);
 
+    /**
+     * An icon representing a pan action (for example, in a map surface).
+     */
+    @RequiresCarApi(2)
+    @NonNull
+    public static final CarIcon PAN = CarIcon.forStandardType(TYPE_PAN);
+
     @Keep
     @CarIconType
     private final int mType;
@@ -306,6 +322,8 @@
                 return "ERROR";
             case TYPE_BACK:
                 return "BACK";
+            case TYPE_PAN:
+                return "PAN";
             case TYPE_CUSTOM:
                 return "CUSTOM";
             default:
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarText.java b/car/app/app/src/main/java/androidx/car/app/model/CarText.java
index 12544cf..c43702f 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarText.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarText.java
@@ -28,7 +28,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.utils.CollectionUtils;
 import androidx.car.app.utils.StringUtils;
@@ -51,6 +50,8 @@
  * you can use types such as {@link SpannableString} or {@link android.text.SpannedString} to
  * create the strings with the spans
  *
+ * <h4>Text spans in strings</h4>
+ *
  * <p>The Car App Library only supports a specific set of spans of type {@link CarSpan}. Further,
  * individual APIs in the library that take text as input may only support a certain subset of
  * {@link CarSpan}s. Spans that are not supported will be simply ignored by the host.
@@ -69,6 +70,8 @@
  * whereas the {@link CarText#toCharSequence()} method returns the reconstructed
  * {@link CharSequence}, with the non{@link CarSpan} spans removed.
  *
+ * <h4>Text variants of multiple lengths</h4>
+ *
  * <p>The app is generally agnostic to the width of the views generated by the host that contain
  * the text strings it supplies. For that reason, some models that take text allow the app to
  * pass a list of text variants of different lengths. In those cases the host will pick the
@@ -150,7 +153,6 @@
      *
      * @see Builder#addVariant(CharSequence)
      */
-    @ExperimentalCarApi
     @NonNull
     public List<CharSequence> getVariants() {
         if (mTextVariants.isEmpty()) {
@@ -188,8 +190,6 @@
         mTextVariants = Collections.emptyList();
         mSpansForVariants = Collections.emptyList();
     }
-
-    @ExperimentalCarApi
     CarText(Builder builder) {
         mText = builder.mText.toString();
         mSpans = getSpans(builder.mText);
@@ -325,7 +325,6 @@
     }
 
     /** A builder of {@link CarText}. */
-    @ExperimentalCarApi
     public static final class Builder {
         @Keep
         CharSequence mText;
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java b/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
index 5caaeef..4fa6bd8 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
@@ -25,7 +25,6 @@
 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 java.util.Objects;
@@ -50,7 +49,6 @@
  *     ), 12, 22, Spanned.SPAN_INCLUSIVE_EXCLUSIVE));
  * }</pre>
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 @CarProtocol
 public final class ClickableSpan extends CarSpan {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
index 1510e66..edb7b7a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
@@ -30,7 +30,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.Screen;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 
 import java.lang.annotation.Retention;
@@ -232,7 +231,7 @@
         /**
          * Sets the title of the {@link GridItem}.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty
@@ -248,14 +247,13 @@
         }
 
         /**
-         * Sets the title of the {@link GridItem}.
+         * Sets the title of the {@link GridItem}, with support for multiple length variants.,
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             if (CarText.isNullOrEmpty(title)) {
@@ -284,7 +282,8 @@
         }
 
         /**
-         * Sets a secondary text string to the grid item that is displayed below the title.
+         * Sets a secondary text string to the grid item that is displayed below the title, with
+         * support for multiple length variants.
          *
          * <p>The text's color can be customized with {@link ForegroundCarColorSpan} instances, any
          * other spans will be ignored by the host.
@@ -295,7 +294,6 @@
          *
          * @throws NullPointerException if {@code text} is {@code null}
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setText(@NonNull CarText text) {
             mText = requireNonNull(text);
diff --git a/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
index dc5d15a..24a600c 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
@@ -39,9 +39,9 @@
  * previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or the
- *       number of grid items and the title of each grid item have not changed.
+ *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or
+ *   <li>The template title has not changed, and the number of grid items and the title of each
+ *       grid item have not changed.
  * </ul>
  */
 @CarProtocol
@@ -210,7 +210,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          */
@@ -257,8 +257,10 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 6 {@link GridItem}s total in the {@link ItemList}(s). The host
-         * will ignore any items over that limit.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_GRID}. The
+         * host will ignore any items over that limit.
          *
          * <p>Either a header {@link Action} or title must be set on the template.
          *
@@ -267,6 +269,7 @@
          *                                  have either a title or header {@link Action} set.
          * @throws IllegalArgumentException if the added {@link ItemList} does not meet the
          *                                  template's requirements.
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public GridTemplate build() {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
index 6c37472..20fded4 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
@@ -295,7 +295,7 @@
          * <p>If the list is empty and the app does not explicitly set the message with this
          * method, the host will show a default message.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code noItemsMessage} is {@code null}
          */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
index 0c875fa..65c61a3 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
@@ -43,12 +43,12 @@
  * template is considered a refresh of a previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Builder#setLoading}}, or the
- *       {@link ItemList} structure between the templates have not changed. This means that if the
- *       previous template has multiple {@link ItemList} sections, the new template must have the
- *       same number of sections with the same headers. Further, the number of rows and the string
- *       contents (title, texts, not counting spans) of each row must not have changed.
+ *   <li>The previous template is in a loading state (see {@link Builder#setLoading}}, or
+ *   <li>The template title has not changed, and the {@link ItemList} structure between the
+ *       templates have not changed. This means that if the previous template has multiple
+ *       {@link ItemList} sections, the new template must have the same number of sections with
+ *       the same headers. Further, the number of rows and the string contents (title, texts, not
+ *       counting spans) of each row must not have changed.
  *   <li>For rows that contain a {@link Toggle}, updates to the title or texts are also allowed if
  *       the toggle state has changed between the previous and new templates.
  * </ul>
@@ -241,7 +241,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the title of the action and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          */
@@ -340,9 +340,11 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 6 {@link Row}s total in the {@link ItemList}(s). The host will
-         * ignore any items over that limit. Each {@link Row}s can add up to 2 lines of texts via
-         * {@link Row.Builder#addText}.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_LIST}. The
+         * host will ignore any items over that limit. Each {@link Row}s can add up to 2 lines of
+         * texts via {@link Row.Builder#addText}.
          *
          * <p>Either a header {@link Action} or the title must be set on the template.
          *
@@ -351,6 +353,7 @@
          *                                  not have either a title or header {@link Action} set
          * @throws IllegalArgumentException if the added {@link ItemList}(s) do not meet the
          *                                  template's requirements
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public ListTemplate build() {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
index e233ac0..371815b 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
@@ -24,7 +24,7 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.Screen;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.utils.CollectionUtils;
 
@@ -39,13 +39,13 @@
  *
  * <h4>Template Restrictions</h4>
  *
- * This template's body is only available while the car is parked. While driving the text and the
- * actions will be disabled.
+ * This template's body is only available to the user while the car is parked and does not count
+ * against the template quota.
+ *
+ * @see Screen#onGetTemplate()
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public final class LongMessageTemplate implements Template {
-
     @Keep
     @Nullable
     private final CarText mTitle;
@@ -158,7 +158,6 @@
     }
 
     /** A builder of {@link LongMessageTemplate}. */
-    @ExperimentalCarApi
     @RequiresCarApi(2)
     public static final class Builder {
         @Nullable
@@ -175,7 +174,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
@@ -233,16 +232,25 @@
         /**
          * Adds an {@link Action} to display along with the message.
          *
+         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
+         *
          * <h4>Requirements</h4>
          *
-         * Any actions above the maximum limit of 2 will be ignored. These {@link Action}s will
-         * only be available while the car is parked.
+         * The action must use a {@link androidx.car.app.model.ParkedOnlyOnClickListener}, and any
+         * actions above the maximum limit of 2 will be ignored.
          *
-         * @throws NullPointerException if {@code action} is {@code null}
+         * @throws IllegalArgumentException if {@code action} does not meet the requirements
+         * @throws NullPointerException     if {@code action} is {@code null}
          */
         @NonNull
         public Builder addAction(@NonNull Action action) {
             requireNonNull(action);
+            if (!requireNonNull(action.getOnClickDelegate()).isParkedOnly()) {
+                throw new IllegalArgumentException("The action must use a "
+                        + "ParkedOnlyOnClickListener");
+            }
+
             mActionList.add(action);
             return this;
         }
@@ -277,7 +285,6 @@
          *
          * @param message the text message to display in the template. This message will only be
          *                displayed when the car is parked.
-         *
          * @throws NullPointerException if the {@code message} is {@code null}
          */
         public Builder(@NonNull CharSequence message) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
index 4e87fc6..6744ce4 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
@@ -27,7 +27,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.utils.CollectionUtils;
 
@@ -198,7 +197,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
@@ -293,6 +292,9 @@
         /**
          * Adds an {@link Action} to display along with the message.
          *
+         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
+         *
          * <p>Any actions above the maximum limit of 2 will be ignored.
          *
          * @throws NullPointerException if {@code action} is {@code null}
@@ -354,7 +356,6 @@
          * @param message the text message to display in the template
          * @throws NullPointerException if the {@code message} is {@code null}
          */
-        @ExperimentalCarApi
         public Builder(@NonNull CarText message) {
             mMessage = requireNonNull(message);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegate.java b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegate.java
index 4fcb34d..75203f87 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegate.java
@@ -20,13 +20,11 @@
 
 import androidx.annotation.NonNull;
 import androidx.car.app.OnDoneCallback;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 
 /**
  * A host-side interface for reporting text input events to clients.
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public interface OnInputCompletedDelegate {
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegateImpl.java
index 50b85ad..3ac951db 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedDelegateImpl.java
@@ -29,7 +29,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -39,7 +38,6 @@
  * @hide
  */
 @RestrictTo(LIBRARY)
-@ExperimentalCarApi
 public class OnInputCompletedDelegateImpl implements OnInputCompletedDelegate {
 
     @Keep
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedListener.java b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedListener.java
index 7435ac9..058d711 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedListener.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnInputCompletedListener.java
@@ -17,11 +17,9 @@
 package androidx.car.app.model;
 
 import androidx.annotation.NonNull;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 
 /** A listener for handling text input completion event. */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public interface OnInputCompletedListener {
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Pane.java b/car/app/app/src/main/java/androidx/car/app/model/Pane.java
index b36d8ed5..493f884 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Pane.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Pane.java
@@ -149,6 +149,9 @@
          *
          * <p>By default, no actions are displayed.
          *
+         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
+         *
          * @throws NullPointerException if {@code action} is {@code null}
          */
         @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
index a0191ed..6dfdea8 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
@@ -40,10 +40,10 @@
  * previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Pane.Builder#setLoading}, or the
- *       number of rows and the string contents (title, texts, not counting spans) of each row
- *       between the previous and new {@link Pane}s have not changed.
+ *   <li>The previous template is in a loading state (see {@link Pane.Builder#setLoading}, or
+ *   <li>The template title has not changed, and the number of rows and the string contents
+ *       (title, texts, not counting spans) of each row between the previous and new {@link Pane}s
+ *       have not changed.
  * </ul>
  */
 @CarProtocol
@@ -159,7 +159,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
@@ -218,18 +218,20 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 2 {@link Row}s and 2 {@link Action}s in the {@link Pane}.
-         * The host
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_PANE}. The host
          * will ignore any rows over that limit. Each {@link Row}s can add up to 2 lines of texts
-         * via
-         * {@link Row.Builder#addText} and cannot contain either a {@link Toggle} or a {@link
+         * via {@link Row.Builder#addText} and cannot contain either a {@link Toggle} or a {@link
          * OnClickListener}.
          *
-         * <p>Either a header {@link Action} or title must be set on the template.
+         * <p>Up to 2 {@link Action}s are allowed in the {@link Pane}, and either a header
+         * {@link Action} or title must be set on the template.
          *
          * @throws IllegalArgumentException if the {@link Pane} does not meet the requirements
          * @throws IllegalStateException    if the template does not have either a title or header
          *                                  {@link Action} set
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public PaneTemplate build() {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
index afd3d66..fad5f63 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
@@ -26,7 +26,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 
 import java.util.Collections;
 import java.util.List;
@@ -45,10 +44,10 @@
  * previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or the
- *       number of rows and the string contents (title, texts, not counting spans) of each row
- *       between the previous and new {@link ItemList}s have not changed.
+ *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or
+ *   <li>The template title has not changed, and the number of rows and the string contents
+ *       (title, texts, not counting spans) of each rowbetween the previous and new
+ *       {@link ItemList}s have not changed.
  * </ul>
  */
 @CarProtocol
@@ -261,7 +260,7 @@
         /**
          * Sets the title of the template.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
@@ -273,14 +272,13 @@
         }
 
         /**
-         * Sets the title of the template.
+         * Sets the title of the template, with support for multiple length variants.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          * @see CarText
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             mTitle = requireNonNull(title);
@@ -298,10 +296,12 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 6 {@link Row}s in the {@link ItemList}. The host will
-         * ignore any items over that limit. The list itself cannot be selectable as set via {@link
-         * ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to 2 lines of texts
-         * via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_PLACE_LIST}. The
+         * host will ignore any items over that limit. The list itself cannot be selectable as
+         * set via {@link ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to
+         * 2 lines of texts via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
          *
          * <p>Images of type {@link Row#IMAGE_TYPE_LARGE} are not allowed in this template.
          *
@@ -315,6 +315,7 @@
          * @throws IllegalArgumentException if {@code itemList} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code itemList} is {@code null}
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
index 14b4f6b..5e4b9a2 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
@@ -215,7 +215,7 @@
          *
          * <p>If an icon is specified with {@link #setIcon}, the icon will take precedence.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @param label the text to display inside of the marker. The string must have a maximum
          *              size of 3 characters. Set to {@code null} to let the host choose a
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Row.java b/car/app/app/src/main/java/androidx/car/app/model/Row.java
index d14630a..50b944d 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Row.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Row.java
@@ -30,7 +30,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.utils.CollectionUtils;
 
@@ -298,6 +297,8 @@
         /**
          * Sets the title of the row.
          *
+         * <p>Spans are not supported in the input string and will be ignored.
+         *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty
          */
@@ -312,11 +313,12 @@
         }
 
         /**
-         * Sets the title of the row.
+         * Sets the title of the row, with support for multiple length variants.
+         *
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws IllegalArgumentException if {@code title} is {@code null} or empty
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             if (requireNonNull(title).isEmpty()) {
@@ -398,12 +400,11 @@
         }
 
         /**
-         * Adds a text string to the row below the title.
+         * Adds a text string to the row below the title, with support for multiple length variants.
          *
          * @throws NullPointerException if {@code text} is {@code null}
          * @see Builder#addText(CharSequence)
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder addText(@NonNull CarText text) {
             mTexts.add(requireNonNull(text));
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
index 57c5221..5d0ac3a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
@@ -341,14 +341,17 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 6 {@link Row}s in the {@link ItemList}. The host will
-         * ignore any items over that limit. The list itself cannot be selectable as set via {@link
-         * ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to 2 lines of texts
-         * via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_LIST}. The
+         * host will ignore any items over that limit. The list itself cannot be selectable as set
+         * via {@link ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to 2
+         * lines of texts via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
          *
          * @throws IllegalArgumentException if {@code itemList} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code itemList} is {@code null}
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
index b6f3918..af5bde5 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
@@ -73,6 +73,17 @@
                     .addRequiredActionType(Action.TYPE_CUSTOM)
                     .build();
 
+    /**
+     * Constraints for map action buttons in navigation templates.
+     *
+     * <p>Only buttons with icons are allowed.
+     */
+    @NonNull
+    public static final ActionsConstraints ACTIONS_CONSTRAINTS_NAVIGATION_MAP =
+            new ActionsConstraints.Builder(ACTIONS_CONSTRAINTS_CONSERVATIVE)
+                    .setMaxActions(4)
+                    .build();
+
     private final int mMaxActions;
     private final int mMaxCustomTitles;
     private final Set<Integer> mRequiredActionTypes;
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
index aea8f80..de7a464 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
@@ -28,7 +28,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.CarText;
 import androidx.car.app.model.OnInputCompletedDelegate;
@@ -45,7 +44,6 @@
  *
  * <p>For example, this can be used to request a username, a password or an activation code.
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public final class InputSignInMethod implements SignInTemplate.SignInMethod {
     /**
@@ -330,7 +328,7 @@
          * Error messages can have only up to 2 lines of text, amd additional texts beyond the
          * second line may be truncated.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code message} is {@code null}
          */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
index a44e7c7..9fb57c1 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
@@ -18,12 +18,9 @@
 
 import static java.util.Objects.requireNonNull;
 
-import android.text.TextUtils;
-
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 
 import java.util.Objects;
@@ -32,9 +29,11 @@
  * A {@link SignInTemplate.SignInMethod} that presents a PIN or activation code that the user can
  * use to sign-in.
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public final class PinSignInMethod implements SignInTemplate.SignInMethod {
+    /** Maximum length, in characters, for a PIN. */
+    private static final int MAX_PIN_LENGTH = 12;
+
     @Keep
     @Nullable
     private final String mPin;
@@ -92,18 +91,23 @@
         /**
          * Returns a {@link PinSignInMethod.Builder} instance.
          *
-         * <p>The provided pin must be no more than 20 characters long. To facilitate typing this
+         * <p>The provided pin must be no more than 12 characters long. To facilitate typing this
          * code, it is recommended restricting the string to a limited set (for example, numbers,
          * upper-case letters, hexadecimal, etc.).
          *
-         * @param pin the PIN to display
-         * @throws IllegalArgumentException if {@code pin} is {@code null} or empty
+         * @param pin the PIN to display is empty.
+         * @throws IllegalArgumentException if {@code pin} is empty or longer than 12 characters.
+         * @throws NullPointerException     if {@code pin} is {@code null}
          */
-        // TODO(b/182309112): follow up on how to enforce the 20-character limit.
         public Builder(@NonNull String pin) {
-            if (TextUtils.isEmpty(pin)) {
+            int pinLength = pin.length();
+            if (pinLength == 0) {
                 throw new IllegalArgumentException("PIN must not be empty");
             }
+            if (pinLength > MAX_PIN_LENGTH) {
+                throw new IllegalArgumentException(
+                        "PIN must not be longer than " + MAX_PIN_LENGTH + " characters");
+            }
             mPin = pin;
         }
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
index a49821a..972211d 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
@@ -21,9 +21,9 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Action;
+import androidx.car.app.model.ForegroundCarColorSpan;
 
 import java.util.Objects;
 
@@ -37,7 +37,6 @@
  * <a href="https://developers.google.com/identity/sign-in/android/sign-in">Integrating Google
  * Sign-In into Your Android App</a>).
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public final class ProviderSignInMethod implements SignInTemplate.SignInMethod {
     @Keep
@@ -104,6 +103,9 @@
         /**
          * Returns a {@link ProviderSignInMethod.Builder} instance.
          *
+         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
+         *
          * <h4>Requirements</h4>
          *
          * The provider action must not be a standard action, and it must use a
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
index 7592e7b..ea6221e 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
@@ -25,11 +25,11 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
+import androidx.car.app.model.ForegroundCarColorSpan;
 import androidx.car.app.model.Template;
 import androidx.car.app.utils.CollectionUtils;
 
@@ -43,21 +43,11 @@
  *
  * <h4>Template Restrictions</h4>
  *
- * This template is considered the start of a new task and thus restarts the template quota when an
- * app reaches this template. If this template is sent consecutively, subsequent
- * {@link SignInTemplate}s will not trigger a quota reset, as they will be considered part of the
- * same sign-in flow. The quota will be reduced for these templates unless they are considered
- * a refresh of a previous one.
- *
- * This template is considered a refresh of a previous one if:
- *
- * <ul>
- *   <li>The template's header, sign-in method, instructions and additional text have not changed.
- * </ul>
+ * This template's body is only available to the user while the car is parked and does not count
+ * against the template quota.
  *
  * @see Screen#onGetTemplate()
  */
-@ExperimentalCarApi
 @RequiresCarApi(2)
 public final class SignInTemplate implements Template {
     /**
@@ -66,8 +56,6 @@
     public interface SignInMethod {
     }
 
-    private static final int MAX_ACTIONS_ALLOWED = 2;
-
     @Keep
     private final boolean mIsLoading;
     @Keep
@@ -237,7 +225,6 @@
     }
 
     /** A builder of {@link SignInTemplate}. */
-    @ExperimentalCarApi
     @RequiresCarApi(2)
     public static final class Builder {
         boolean mIsLoading;
@@ -315,20 +302,25 @@
          *
          * <p>By default, no actions are displayed.
          *
+         * <p>The action's title color can be customized with {@link ForegroundCarColorSpan}
+         * instances, any other spans will be ignored by the host.
+         *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 2 {@link Action}s.
+         * The action must use a {@link androidx.car.app.model.ParkedOnlyOnClickListener}, and any
+         * actions above the maximum limit of 2 will be ignored.
          *
          * @throws NullPointerException  if {@code action} is {@code null}
-         * @throws IllegalStateException if more than two actions have been added.
+         * @throws IllegalArgumentException if {@code action} does not meet the requirements
          */
         @NonNull
         public Builder addAction(@NonNull Action action) {
-            if (mActionList.size() >= MAX_ACTIONS_ALLOWED) {
-                throw new IllegalStateException(
-                        "This template allows only up to " + MAX_ACTIONS_ALLOWED + " actions");
-            }
             requireNonNull(action);
+            if (!requireNonNull(action.getOnClickDelegate()).isParkedOnly()) {
+                throw new IllegalArgumentException("The action must use a "
+                        + "ParkedOnlyOnClickListener");
+            }
+
             mActionList.add(action);
             return this;
         }
@@ -338,7 +330,7 @@
          *
          * <p>Unless set with this method, the template will not have a title.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is {@code null}
          */
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
index 1b79b0d..8c18dfa 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
@@ -129,7 +129,7 @@
         /**
          * Sets the destination name formatted for the user's current locale.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code name} is {@code null}
          * @see CarText
@@ -143,7 +143,7 @@
         /**
          * Sets the destination address formatted for the user's current locale.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code address} is {@code null}
          * @see CarText
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
index 57b9526..a4b3eef 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
@@ -22,7 +22,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.CarText;
 import androidx.car.app.model.constraints.CarIconConstraints;
@@ -124,7 +123,7 @@
         /**
          * Sets the title of the message.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code message} is {@code null}
          * @see CarText
@@ -138,7 +137,7 @@
         /**
          * Sets additional text on the message.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code text} is {@code null}
          * @see CarText
@@ -150,14 +149,13 @@
         }
 
         /**
-         * Sets additional text on the message.
+         * Sets additional text on the message, with support for multiple length variants.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code text} is {@code null}
          * @see CarText
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setText(@NonNull CarText text) {
             mText = requireNonNull(text);
@@ -187,6 +185,8 @@
         /**
          * Returns a new instance of a {@link Builder}.
          *
+         * <p>Spans are not supported in the input string and will be ignored.
+         *
          * @throws NullPointerException if {@code title} is {@code null}
          */
         public Builder(@NonNull CharSequence title) {
@@ -196,9 +196,10 @@
         /**
          * Returns a new instance of a {@link Builder}.
          *
+         * <p>Spans are not supported in the input string and will be ignored.
+         *
          * @throws NullPointerException if {@code title} is {@code null}
          */
-        @ExperimentalCarApi
         public Builder(@NonNull CarText title) {
             mTitle = requireNonNull(title);
         }
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
index cd40628..dde9f12 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
@@ -17,20 +17,25 @@
 package androidx.car.app.navigation.model;
 
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_NAVIGATION;
+import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_NAVIGATION_MAP;
 import static androidx.car.app.model.constraints.CarColorConstraints.UNCONSTRAINED;
 
 import static java.util.Objects.requireNonNull;
 
+import android.annotation.SuppressLint;
+
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
 import androidx.car.app.SurfaceCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.Template;
+import androidx.car.app.model.Toggle;
 
 import java.util.Objects;
 
@@ -87,6 +92,12 @@
     @Keep
     @Nullable
     private final ActionStrip mActionStrip;
+    @Keep
+    @Nullable
+    private final ActionStrip mMapActionStrip;
+    @Keep
+    @Nullable
+    private final Toggle mPanModeToggle;
 
     /**
      * Returns the {@link ActionStrip} for this template or {@code null} if not set.
@@ -99,6 +110,24 @@
     }
 
     /**
+     * Returns the map {@link ActionStrip} for this template or {@code null} if not set.
+     *
+     * @see Builder#setMapActionStrip(ActionStrip)
+     */
+    @RequiresCarApi(2)
+    @Nullable
+    public ActionStrip getMapActionStrip() {
+        return mMapActionStrip;
+    }
+
+    /** Returns whether this template is in the pan mode. */
+    @RequiresCarApi(2)
+    @Nullable
+    public Toggle getPanModeToggle() {
+        return mPanModeToggle;
+    }
+
+    /**
      * Returns the navigation information displayed on the template or {@code null} if there is no
      * navigation information on top of the map.
      */
@@ -134,7 +163,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(mNavigationInfo, mBackgroundColor, mDestinationTravelEstimate,
-                mActionStrip);
+                mActionStrip, mMapActionStrip, mPanModeToggle);
     }
 
     @Override
@@ -151,7 +180,9 @@
                 && Objects.equals(mBackgroundColor, otherTemplate.mBackgroundColor)
                 && Objects.equals(mDestinationTravelEstimate,
                 otherTemplate.mDestinationTravelEstimate)
-                && Objects.equals(mActionStrip, otherTemplate.mActionStrip);
+                && Objects.equals(mActionStrip, otherTemplate.mActionStrip)
+                && Objects.equals(mMapActionStrip, otherTemplate.mMapActionStrip)
+                && Objects.equals(mPanModeToggle, otherTemplate.mPanModeToggle);
     }
 
     NavigationTemplate(Builder builder) {
@@ -159,6 +190,8 @@
         mBackgroundColor = builder.mBackgroundColor;
         mDestinationTravelEstimate = builder.mDestinationTravelEstimate;
         mActionStrip = builder.mActionStrip;
+        mMapActionStrip = builder.mMapActionStrip;
+        mPanModeToggle = builder.mPanModeToggle;
     }
 
     /** Constructs an empty instance, used by serialization code. */
@@ -167,6 +200,8 @@
         mBackgroundColor = null;
         mDestinationTravelEstimate = null;
         mActionStrip = null;
+        mMapActionStrip = null;
+        mPanModeToggle = null;
     }
 
     /** A builder of {@link NavigationTemplate}. */
@@ -179,6 +214,10 @@
         TravelEstimate mDestinationTravelEstimate;
         @Nullable
         ActionStrip mActionStrip;
+        @Nullable
+        ActionStrip mMapActionStrip;
+        @Nullable
+        Toggle mPanModeToggle;
 
         /**
          * Sets the navigation information to display on the template.
@@ -249,6 +288,47 @@
         }
 
         /**
+         * Sets an {@link ActionStrip} with a list of map-control related actions for this
+         * template, such as pan or zoom.
+         *
+         * <p>The host will draw the buttons in an area that is associated with map controls.
+         *
+         * <h4>Requirements</h4>
+         *
+         * This template allows up to 4 {@link Action}s in its map {@link ActionStrip}. Only
+         * {@link Action}s with icons set via {@link Action.Builder#setIcon} are allowed.
+         *
+         * @throws IllegalArgumentException if {@code actionStrip} does not meet the template's
+         *                                  requirements
+         * @throws NullPointerException     if {@code actionStrip} is {@code null}
+         */
+        @RequiresCarApi(2)
+        @NonNull
+        public Builder setMapActionStrip(@NonNull ActionStrip actionStrip) {
+            ACTIONS_CONSTRAINTS_NAVIGATION_MAP.validateOrThrow(
+                    requireNonNull(actionStrip).getActions());
+            mMapActionStrip = actionStrip;
+            return this;
+        }
+
+        /**
+         * Sets a {@link PanModeListener} that notifies when the user enters and exits
+         * the pan mode.
+         *
+         * @throws NullPointerException if {@code panModeListener} is {@code null}
+         */
+        @SuppressLint({"MissingGetterMatchingBuilder", "ExecutorRegistration"})
+        @RequiresCarApi(2)
+        @NonNull
+        public Builder setPanModeListener(@NonNull PanModeListener panModeListener) {
+            requireNonNull(panModeListener);
+            mPanModeToggle =
+                    new Toggle.Builder(
+                            (isInPanMode) -> panModeListener.onPanModeChanged(isInPanMode)).build();
+            return this;
+        }
+
+        /**
          * Constructs the {@link NavigationTemplate} defined by this builder.
          *
          * @throws IllegalStateException if an {@link ActionStrip} is not set on this template
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeListener.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeListener.java
new file mode 100644
index 0000000..7496b48
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeListener.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.car.app.navigation.model;
+
+/** A listener for handling the pan mode changes. */
+public interface PanModeListener {
+    /** Callback that notifies when the user enters and exits the pan mode. */
+    void onPanModeChanged(boolean isInPanMode);
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
index c7f7594..6097259 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
@@ -28,7 +28,6 @@
 import androidx.car.app.Screen;
 import androidx.car.app.SurfaceCallback;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -58,10 +57,10 @@
  * is considered a refresh of a previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or the
- *       number of rows and the string contents (title, texts, not counting spans) of each row
- *       between the previous and new {@link ItemList}s have not changed.
+ *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or
+ *   <li>The template title has not changed, and the number of rows and the string contents
+ *       (title, texts, not counting spans) of each row between the previous and new
+ *       {@link ItemList}s have not changed.
  * </ul>
  *
  * <p>In order to use this template your car app <b>MUST</b> declare that it uses the {@code
@@ -195,7 +194,7 @@
         /**
          * Sets the title of the template.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          * @see CarText
@@ -207,14 +206,13 @@
         }
 
         /**
-         * Sets the title of the template.
+         * Sets the title of the template, with support for multiple length variants.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          * @see CarText
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             mTitle = requireNonNull(title);
@@ -268,10 +266,12 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 6 {@link Row}s in the {@link ItemList}. The host will
-         * ignore any items over that limit. The list itself cannot be selectable as set via {@link
-         * ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to 2 lines of texts
-         * via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_PLACE_LIST}. The
+         * host will ignore any items over that limit. The list itself cannot be selectable as
+         * set via {@link ItemList.Builder#setOnSelectedListener}. Each {@link Row} can add up to
+         * 2 lines of texts via {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
          *
          * <p>Images of type {@link Row#IMAGE_TYPE_LARGE} are not allowed in this template.
          *
@@ -284,6 +284,7 @@
          * @throws IllegalArgumentException if {@code itemList} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code itemList} is {@code null}
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
index 6d107dd..1601a08 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
@@ -28,7 +28,6 @@
 import androidx.car.app.Screen;
 import androidx.car.app.SurfaceCallback;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -45,10 +44,9 @@
 /**
  * A template that supports showing a list of routes alongside a custom drawn map.
  *
- * <p>The list must have its {@link
- * ItemList.OnSelectedListener} set, and the template
- * must have its navigate action set (see {@link Builder#setNavigateAction}). These are used in
- * conjunction to inform the app that:
+ * <p>The list must have its {@link ItemList.OnSelectedListener} set, and the template must have
+ * its navigate action set (see {@link Builder#setNavigateAction}). These are used in conjunction
+ * to inform the app that:
  *
  * <ol>
  *   <li>A route has been selected. The app should also highlight the route on the map surface.
@@ -65,10 +63,10 @@
  * is considered a refresh of a previous one if:
  *
  * <ul>
- *   <li>The template title has not changed, and
- *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or the
- *       number of rows and the string contents (title, texts, not counting spans) of each row
- *       between the previous and new {@link ItemList}s have not changed.
+ *   <li>The previous template is in a loading state (see {@link Builder#setLoading}, or
+ *   <li>The template title has not changed, and the number of rows and the string contents
+ *       (title, texts, not counting spans) of each row between the previous and new
+ *       {@link ItemList}s have not changed.
  * </ul>
  *
  * <p>Note that specifically, this means the app can't use this template to continuously refresh
@@ -225,7 +223,7 @@
         /**
          * Sets the title of the template.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          * @see CarText
@@ -237,14 +235,13 @@
         }
 
         /**
-         * Sets the title of the template.
+         * Sets the title of the template, with support for multiple length variants.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code title} is null
          * @see CarText
          */
-        @ExperimentalCarApi
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
             mTitle = requireNonNull(title);
@@ -295,7 +292,7 @@
          * <p>This should not be {@code null} if the template is not in a loading state (see
          * #setIsLoading}), and the {@link Action}'s title must be set.
          *
-         * <p>Any background colors or spans set on the action will be ignored.
+         * <p>Spans are not supported in the navigate action and will be ignored.
          *
          * @throws NullPointerException     if {@code navigateAction} is {@code null}
          * @throws IllegalArgumentException if {@code navigateAction}'s title is {@code null} or
@@ -317,10 +314,12 @@
          *
          * <h4>Requirements</h4>
          *
-         * This template allows up to 3 {@link Row}s in the {@link ItemList}. The host will
-         * ignore any items over that limit. The list must have an {@link OnClickListener} set. Each
-         * {@link Row} can add up to 2 lines of texts via {@link Row.Builder#addText} and cannot
-         * contain a {@link Toggle}.
+         * The number of items in the {@link ItemList} should be smaller or equal than the limit
+         * provided by
+         * {@link androidx.car.app.constraints.ConstraintManager#CONTENT_LIMIT_TYPE_ROUTE_LIST}. The
+         * host will ignore any items over that limit. The list must have an
+         * {@link OnClickListener} set. Each {@link Row} can add up to 2 lines of texts via
+         * {@link Row.Builder#addText} and cannot contain a {@link Toggle}.
          *
          * <p>Images of type {@link Row#IMAGE_TYPE_LARGE} are not allowed in this template.
          *
@@ -332,6 +331,7 @@
          * @throws IllegalArgumentException if {@code itemList} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code itemList} is {@code null}
+         * @see androidx.car.app.constraints.ConstraintManager#getContentLimit(int)
          */
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
index 6974590..5604161 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
@@ -22,7 +22,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
-import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.CarText;
 import androidx.car.app.utils.CollectionUtils;
@@ -187,6 +186,8 @@
          * <p>Some cluster displays do not support UTF-8 encoded characters, in which case
          * unsupported characters will not be displayed properly.
          *
+         * <p>See {@link Builder#setCue} for details on span support in the input string.
+         *
          * @throws NullPointerException if {@code cue} is {@code null}
          * @see Builder#setCue(CharSequence)
          */
@@ -195,12 +196,14 @@
         }
 
         /**
-         * Constructs a new builder of {@link Step} with a cue.
+         * Constructs a new builder of {@link Step} with a cue, with support for multiple length
+         * variants.
+         *
+         * <p>See {@link Builder#setCue} for details on span support in the input string.
          *
          * @throws NullPointerException if {@code cue} is {@code null}
          * @see Builder#Builder(CharSequence)
          */
-        @ExperimentalCarApi
         public Builder(@NonNull CarText cue) {
             mCue = requireNonNull(cue);
         }
@@ -271,7 +274,8 @@
          * the left lane"
          *
          * <p>The {@code cue} string can contain images that replace spans of text by using {@link
-         * androidx.car.app.model.CarIconSpan}.
+         * androidx.car.app.model.CarIconSpan}. All other spans types are not supported and will be
+         * ignored.
          *
          * <p>In the following example, the "520" text is replaced with an icon:
          *
@@ -313,7 +317,7 @@
          *
          * <p>For example, a {@link Step} for a left turn might provide "State Street" for the road.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code destinations} is {@code null}
          * @see CarText
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
index 000859e..e4a620d 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
@@ -233,7 +233,7 @@
         /**
          * Sets a description of the current road.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code currentRoad} is {@code null}
          * @see CarText
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java b/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
index 0c388b9..7fca010 100644
--- a/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarAppExtender.java
@@ -61,8 +61,8 @@
  *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a notification.
  *
  *   <li>Post the notification to the notification system with the {@code
- *       NotificationManagerCompat.notify(...)} methods and not the {@code
- *       NotificationManager.notify(...)} methods.
+ *       CarNotificationManager.notify(...)} methods. Do not use the {@code
+ *       NotificationManager.notify(...)}, nor the NotificationManagerCompat.notify(...)}  methods.
  * </ol>
  *
  * <pre class="prettyprint">
@@ -117,6 +117,7 @@
  *
  *     <li>The heads-up-notification (HUN) can be customized with a background color through
  *     {@link Builder#setColor}.
+ *
  *     <li>The notification will not be displayed in the notification center.
  * </ul>
  *
@@ -141,6 +142,7 @@
     private static final String EXTRA_ACTIONS = "actions";
     private static final String EXTRA_IMPORTANCE = "importance";
     private static final String EXTRA_COLOR = "color";
+    private static final String EXTRA_CHANNEL_ID = "channel_id";
 
     @Nullable
     private CharSequence mContentTitle;
@@ -158,6 +160,8 @@
     private int mImportance;
     @Nullable
     private CarColor mColor;
+    @Nullable
+    private String mChannelId;
 
     /**
      * Creates a {@link CarAppExtender} from the {@link CarAppExtender} of an existing notification.
@@ -193,6 +197,8 @@
                 Log.e(TAG, "Failed to deserialize the notification color", e);
             }
         }
+
+        mChannelId = carBundle.getString(EXTRA_CHANNEL_ID);
     }
 
     CarAppExtender(Builder builder) {
@@ -205,6 +211,7 @@
         mActions = builder.mActions;
         mImportance = builder.mImportance;
         mColor = builder.mColor;
+        mChannelId = builder.mChannelId;
     }
 
     /**
@@ -260,6 +267,10 @@
             }
         }
 
+        if (mChannelId != null) {
+            carExtensions.putString(EXTRA_CHANNEL_ID, mChannelId);
+        }
+
         builder.getExtras().putBundle(EXTRA_CAR_EXTENDER, carExtensions);
         return builder;
     }
@@ -370,6 +381,16 @@
         return mColor;
     }
 
+    /**
+     * Returns the channel id of the notification channel to use in the car.
+     *
+     * @see Builder#setChannelId(String)
+     */
+    @Nullable
+    public String getChannelId() {
+        return mChannelId;
+    }
+
     /** A builder of {@link CarAppExtender}. */
     public static final class Builder {
         @Nullable
@@ -387,6 +408,8 @@
         int mImportance = NotificationManagerCompat.IMPORTANCE_UNSPECIFIED;
         @Nullable
         CarColor mColor;
+        @Nullable
+        String mChannelId;
 
         /**
          * Sets the title of the notification in the car screen.
@@ -397,7 +420,7 @@
          * {@link NotificationCompat.Builder#setContentTitle(CharSequence)} for the car
          * screen.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @throws NullPointerException if {@code contentTitle} is {@code null}
          */
@@ -413,7 +436,7 @@
          * <p>This method is equivalent to
          * {@link NotificationCompat.Builder#setContentText(CharSequence)} for the car screen.
          *
-         * <p>Spans are not supported in the input string.
+         * <p>Spans are not supported in the input string and will be ignored.
          *
          * @param contentText override for the notification's content text. If set to an empty
          *                    string, it will be treated as if there is no context text
@@ -534,14 +557,17 @@
         }
 
         /**
-         * Sets the importance of the notification in the car screen.
+         * For Android Auto only, sets the importance of the notification in the car screen.
          *
-         * <p>The default value is {@link NotificationManagerCompat#IMPORTANCE_UNSPECIFIED}.
+         * <p>The default value is {@link NotificationManagerCompat#IMPORTANCE_UNSPECIFIED},
+         * and will not be used to override.
          *
          * <p>The importance is used to determine whether the notification will show as a HUN on
          * the car screen. See the class description for more details.
          *
          * <p>See {@link NotificationManagerCompat} for all supported importance values.
+         *
+         * @see #setChannelId(String)
          */
         @NonNull
         public Builder setImportance(int importance) {
@@ -567,6 +593,24 @@
         }
 
         /**
+         * For Android Automotive OS only, sets the channel id of the notification channel to be
+         * used in the car.
+         *
+         * <p>This is used in the case where your notification is to have a different importance
+         * in the car then it does on the phone.
+         *
+         * <p>It is used for the same purposes you'd use {@link #setImportance(int)} for
+         * Auto.
+         *
+         * @see #setImportance(int)
+         */
+        @NonNull
+        public Builder setChannelId(@NonNull String channelId) {
+            mChannelId = channelId;
+            return this;
+        }
+
+        /**
          * Constructs the {@link CarAppExtender} defined by this builder.
          */
         @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiver.java b/car/app/app/src/main/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiver.java
new file mode 100644
index 0000000..9a9bd33
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiver.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.car.app.notification;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
+import static androidx.car.app.CarContext.EXTRA_START_CAR_APP_BINDER_KEY;
+
+import static java.util.Objects.requireNonNull;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.car.app.IStartCarApp;
+import androidx.car.app.utils.LogTags;
+import androidx.car.app.utils.RemoteUtils;
+
+/**
+ * Internal only receiver to handle the broadcast sent when a notification action is taken in
+ * order to start the car app.
+ *
+ * <p>This is only used for Android Auto.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY_GROUP)
+public class CarAppNotificationBroadcastReceiver extends BroadcastReceiver {
+    private static final String TAG = LogTags.TAG + ".NBR";
+
+    @Override
+    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
+        ComponentName appComponent =
+                intent.getParcelableExtra(CarPendingIntent.COMPONENT_EXTRA_KEY);
+        intent.removeExtra(CarPendingIntent.COMPONENT_EXTRA_KEY);
+        intent.setComponent(appComponent);
+
+        IBinder binder = null;
+        Bundle extras = intent.getExtras();
+        if (extras != null) {
+            binder = extras.getBinder(EXTRA_START_CAR_APP_BINDER_KEY);
+            extras.remove(EXTRA_START_CAR_APP_BINDER_KEY);
+        }
+
+        if (binder == null) {
+            Log.e(TAG, "Notification intent missing expected extra: " + intent);
+            return;
+        }
+
+        IStartCarApp startCarAppInterface = requireNonNull(IStartCarApp.Stub.asInterface(binder));
+
+        RemoteUtils.dispatchCallToHost(
+                "startCarApp from notification", () -> {
+                    startCarAppInterface.startCarApp(intent);
+                    return null;
+                });
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java b/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java
new file mode 100644
index 0000000..b10b035
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarNotificationManager.java
@@ -0,0 +1,510 @@
+/*
+ * 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.car.app.notification;
+
+import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
+
+import static androidx.car.app.model.CarColor.TYPE_BLUE;
+import static androidx.car.app.model.CarColor.TYPE_CUSTOM;
+import static androidx.car.app.model.CarColor.TYPE_DEFAULT;
+import static androidx.car.app.model.CarColor.TYPE_GREEN;
+import static androidx.car.app.model.CarColor.TYPE_PRIMARY;
+import static androidx.car.app.model.CarColor.TYPE_RED;
+import static androidx.car.app.model.CarColor.TYPE_SECONDARY;
+import static androidx.car.app.model.CarColor.TYPE_YELLOW;
+
+import static java.util.Objects.requireNonNull;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ShortcutInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StyleRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.car.app.R;
+import androidx.car.app.model.CarColor;
+import androidx.core.app.NotificationChannelCompat;
+import androidx.core.app.NotificationChannelGroupCompat;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
+import androidx.core.graphics.drawable.IconCompat;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A manager for car apps to send notifications.
+ *
+ * This class wraps a {@link NotificationManagerCompat} to manage the actual sending of the
+ * {@link Notification}.
+ */
+public final class CarNotificationManager {
+    @NonNull
+    private final Context mContext;
+    @NonNull
+    private final NotificationManagerCompat mNotificationManagerCompat;
+    private final boolean mIsAutomotive;
+    @ColorInt
+    @Nullable
+    private final Integer mPrimaryColor;
+    @ColorInt
+    @Nullable
+    private final Integer mPrimaryColorDark;
+    @ColorInt
+    @Nullable
+    private final Integer mSecondaryColor;
+    @ColorInt
+    @Nullable
+    private final Integer mSecondaryColorDark;
+
+    /**
+     * Returns a {@link CarNotificationManager} instance for a provided context.
+     *
+     * @throws NullPointerException if {@code context} is {@code null}
+     */
+    @NonNull
+    public static CarNotificationManager from(@NonNull Context context) {
+        return new CarNotificationManager(requireNonNull(context));
+    }
+
+    /**
+     * Cancels a previously shown notification.
+     *
+     * @see NotificationManagerCompat#cancel(int)
+     */
+    public void cancel(int id) {
+        mNotificationManagerCompat.cancel(id);
+    }
+
+    /**
+     * Cancels a previously shown notification.
+     *
+     * @see NotificationManagerCompat#cancel(String, int)
+     */
+    public void cancel(@Nullable String tag, int id) {
+        mNotificationManagerCompat.cancel(tag, id);
+    }
+
+    /**
+     * Cancels all previously shown notifications.
+     *
+     * @see NotificationManagerCompat#cancelAll()
+     */
+    public void cancelAll() {
+        mNotificationManagerCompat.cancelAll();
+    }
+
+    /**
+     * Posts a notification.
+     *
+     * <p>Callers are expected to extend the notification with CarAppExtender to ensure the
+     * notification will show up on all car environments. This method will extend the
+     * notification if it is not already extended for the car using a CarAppExtender.
+     *
+     * @throws NullPointerException if {@code notification} is {@code null}
+     *
+     * @see NotificationManagerCompat#notify(int, Notification)
+     */
+    public void notify(int id, @NonNull NotificationCompat.Builder notification) {
+        mNotificationManagerCompat.notify(id, updateForCar(requireNonNull(notification)));
+    }
+
+    /**
+     * Post a notification to be shown in the status bar, stream, etc.
+     *
+     * <p>Callers are expected to extend the notification with CarAppExtender to ensure the
+     * notification will show up on all car environments. This method will extend the
+     * notification if it is not already extended for the car using a CarAppExtender.
+     *
+     * @param tag          the string identifier for a notification. Can be {@code null}.
+     * @param id           the ID of the notification. The pair (tag, id) must be unique within
+     *                     your app.
+     * @param notification the notification to post to the system
+     *
+     * @throws NullPointerException if notification is {@code null}
+     */
+    public void notify(@Nullable String tag, int id,
+            @NonNull NotificationCompat.Builder notification) {
+        mNotificationManagerCompat.notify(tag, id, updateForCar(requireNonNull(notification)));
+    }
+
+    /**
+     * Returns whether notifications from the calling package are not blocked.
+     *
+     * @see NotificationManagerCompat#areNotificationsEnabled()
+     */
+    public boolean areNotificationsEnabled() {
+        return mNotificationManagerCompat.areNotificationsEnabled();
+    }
+
+    /**
+     * Returns the user specified importance for notifications from the calling package.
+     *
+     * @see NotificationManagerCompat#getImportance()
+     */
+    public int getImportance() {
+        return mNotificationManagerCompat.getImportance();
+    }
+
+    /**
+     * Creates a notification channel that notifications can be posted to.
+     *
+     * @throws NullPointerException if {@code channel} is {@code null}
+     *
+     * @see NotificationManagerCompat#createNotificationChannel(NotificationChannelCompat)
+     */
+    public void createNotificationChannel(@NonNull NotificationChannelCompat channel) {
+        mNotificationManagerCompat.createNotificationChannel(requireNonNull(channel));
+    }
+
+    /**
+     * Creates a group container for {@link NotificationChannel} objects.
+     *
+     * @throws NullPointerException if {@code group} is {@code null}
+     *
+     * @see NotificationManagerCompat#createNotificationChannelGroup(NotificationChannelGroupCompat)
+     */
+    public void createNotificationChannelGroup(@NonNull NotificationChannelGroupCompat group) {
+        mNotificationManagerCompat.createNotificationChannelGroup(requireNonNull(group));
+    }
+
+    /**
+     * Creates multiple notification channels that different notifications can be posted to. See
+     * {@link #createNotificationChannel(NotificationChannelCompat)}.
+     *
+     * @throws NullPointerException if {@code channels} is {@code null}
+     *
+     * @see NotificationManagerCompat#createNotificationChannelsCompat(List)
+     */
+    public void createNotificationChannels(
+            @NonNull List<NotificationChannelCompat> channels) {
+        mNotificationManagerCompat.createNotificationChannelsCompat(requireNonNull(channels));
+    }
+
+    /**
+     * Creates multiple notification channel groups. See
+     * {@link #createNotificationChannelGroup(NotificationChannelGroupCompat)}.
+     *
+     * @throws NullPointerException if {@code groups} is {@code null}
+     *
+     * @see NotificationManagerCompat#createNotificationChannelGroupsCompat(List)
+     */
+    public void createNotificationChannelGroups(
+            @NonNull List<NotificationChannelGroupCompat> groups) {
+        mNotificationManagerCompat.createNotificationChannelGroupsCompat(requireNonNull(groups));
+    }
+
+    /**
+     * Deletes the given notification channel.
+     *
+     * @throws NullPointerException if {@code channelId} is {@code null}
+     *
+     * @see NotificationManagerCompat#deleteNotificationChannel(String)
+     */
+    public void deleteNotificationChannel(@NonNull String channelId) {
+        mNotificationManagerCompat.deleteNotificationChannel(requireNonNull(channelId));
+    }
+
+    /**
+     * Deletes the given notification channel group, and all notification channels that
+     * belong to it.
+     *
+     * @throws NullPointerException if {@code groupId} is {@code null}
+     *
+     * @see NotificationManagerCompat#deleteNotificationChannelGroup(String)
+     */
+    public void deleteNotificationChannelGroup(@NonNull String groupId) {
+        mNotificationManagerCompat.deleteNotificationChannelGroup(requireNonNull(groupId));
+    }
+
+    /**
+     * Deletes notification channels for which ids are NOT given.
+     *
+     * @throws NullPointerException if {@code channelIds} is {@code null}
+     *
+     * @see NotificationManagerCompat#deleteUnlistedNotificationChannels(Collection)
+     */
+    public void deleteUnlistedNotificationChannels(@NonNull Collection<String> channelIds) {
+        mNotificationManagerCompat.deleteUnlistedNotificationChannels(requireNonNull(channelIds));
+    }
+
+    /**
+     * Returns the notification channel settings for a given channel id.
+     *
+     * @throws NullPointerException if {@code channelId} is {@code null}
+     *
+     * @see NotificationManagerCompat#getNotificationChannelCompat(String)
+     */
+    @Nullable
+    public NotificationChannelCompat getNotificationChannel(@NonNull String channelId) {
+        return mNotificationManagerCompat.getNotificationChannelCompat(requireNonNull(channelId));
+    }
+
+    /**
+     * Returns the notification channel settings for a given channel and
+     * {@link ShortcutInfo#getId() conversation id}.
+     *
+     * @throws NullPointerException if either {@code channelId} of {@code conversationId} are {@code
+     *                              null}
+     *
+     * @see NotificationManagerCompat#getNotificationChannelCompat(String, String)
+     */
+    @Nullable
+    public NotificationChannelCompat getNotificationChannel(@NonNull String channelId,
+            @NonNull String conversationId) {
+        return mNotificationManagerCompat.getNotificationChannelCompat(requireNonNull(channelId),
+                requireNonNull(conversationId));
+    }
+
+    /**
+     * Returns the notification channel group settings for a given channel group id.
+     *
+     * @throws NullPointerException if {@code channelGroupId} is {@code null}
+     *
+     * @see NotificationManagerCompat#getNotificationChannelGroupCompat(String)
+     */
+    @Nullable
+    public NotificationChannelGroupCompat getNotificationChannelGroup(
+            @NonNull String channelGroupId) {
+        return mNotificationManagerCompat.getNotificationChannelGroupCompat(
+                requireNonNull(channelGroupId));
+    }
+
+    /**
+     * Returns all notification channels belonging to the calling app
+     * or an empty list on older SDKs which don't support Notification Channels.
+     *
+     * @see NotificationManagerCompat#getNotificationChannelsCompat()
+     */
+    @NonNull
+    public List<NotificationChannelCompat> getNotificationChannels() {
+        return mNotificationManagerCompat.getNotificationChannelsCompat();
+    }
+
+    /**
+     * Returns all notification channel groups belonging to the calling app
+     * or an empty list on older SDKs which don't support Notification Channels.
+     *
+     * @see NotificationManagerCompat#getNotificationChannelGroupsCompat()
+     */
+    @NonNull
+    public List<NotificationChannelGroupCompat> getNotificationChannelGroups() {
+        return mNotificationManagerCompat.getNotificationChannelGroupsCompat();
+    }
+
+    /**
+     * Get the set of packages that have an enabled notification listener component within them.
+     *
+     * @throws NullPointerException if {@code context} is {@code null}
+     *
+     * @see NotificationManagerCompat#getEnabledListenerPackages(Context)
+     */
+    @NonNull
+    public static Set<String> getEnabledListenerPackages(@NonNull Context context) {
+        return NotificationManagerCompat.getEnabledListenerPackages(requireNonNull(context));
+    }
+
+    @VisibleForTesting
+    @NonNull
+    Notification updateForCar(@NonNull NotificationCompat.Builder notification) {
+        if (mIsAutomotive) {
+            return upddateForAutomotive(notification);
+        } else if (!CarAppExtender.isExtended(notification.build())) {
+            notification.extend(new CarAppExtender.Builder().build());
+        }
+        return notification.build();
+    }
+
+    private Notification upddateForAutomotive(@NonNull NotificationCompat.Builder notification) {
+        CarAppExtender carAppExtender = new CarAppExtender(notification.build());
+
+        List<Notification.Action> actions = carAppExtender.getActions();
+        if (!actions.isEmpty()) {
+            notification.clearActions();
+            for (Notification.Action action : actions) {
+                notification.addAction(fromAndroidAction(action));
+            }
+        }
+
+        CarColor color = carAppExtender.getColor();
+        if (color != null) {
+            @ColorInt Integer colorInt = getColorInt(color);
+            if (colorInt != null) {
+                notification.setColorized(true);
+                notification.setColor(colorInt);
+            }
+        }
+
+        PendingIntent contentIntent = carAppExtender.getContentIntent();
+        if (contentIntent != null) {
+            notification.setContentIntent(contentIntent);
+        }
+
+        CharSequence contentTitle = carAppExtender.getContentTitle();
+        if (contentTitle != null) {
+            notification.setContentTitle(contentTitle);
+        }
+
+        CharSequence contentText = carAppExtender.getContentText();
+        if (contentText != null) {
+            notification.setContentText(contentText);
+        }
+
+        PendingIntent deleteIntent = carAppExtender.getDeleteIntent();
+        if (deleteIntent != null) {
+            notification.setDeleteIntent(deleteIntent);
+        }
+
+        String channelId = carAppExtender.getChannelId();
+        if (channelId != null) {
+            notification.setChannelId(channelId);
+        }
+
+        Bitmap largeIcon = carAppExtender.getLargeIcon();
+        if (largeIcon != null) {
+            notification.setLargeIcon(largeIcon);
+        }
+
+        int smallIconRes = carAppExtender.getSmallIcon();
+        if (smallIconRes != Resources.ID_NULL) {
+            notification.setSmallIcon(smallIconRes);
+        }
+
+        return notification.build();
+    }
+
+    @VisibleForTesting
+    @ColorInt
+    @Nullable
+    Integer getColorInt(CarColor carColor) {
+        boolean isDarkMode =
+                (mContext.getResources().getConfiguration().uiMode
+                        & Configuration.UI_MODE_NIGHT_MASK)
+                        == Configuration.UI_MODE_NIGHT_YES;
+
+        switch (carColor.getType()) {
+            case TYPE_CUSTOM:
+                return isDarkMode ? carColor.getColorDark() : carColor.getColor();
+            case TYPE_PRIMARY:
+                return isDarkMode ? mPrimaryColorDark : mPrimaryColor;
+            case TYPE_SECONDARY:
+                return isDarkMode ? mSecondaryColorDark : mSecondaryColor;
+            case TYPE_RED:
+                return mContext.getColor(R.color.carColorRed);
+            case TYPE_GREEN:
+                return mContext.getColor(R.color.carColorGreen);
+            case TYPE_BLUE:
+                return mContext.getColor(R.color.carColorBlue);
+            case TYPE_YELLOW:
+                return mContext.getColor(R.color.carColorYellow);
+            case TYPE_DEFAULT:
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * Creates an {@link NotificationCompat.Action} from the {@code action} provided.
+     *
+     * <p>This is copied from {@link NotificationCompat.Action}'s fromAndroidAction method which
+     * is not visible outside the package.
+     */
+    private NotificationCompat.Action fromAndroidAction(@NonNull Notification.Action action) {
+        final NotificationCompat.Action.Builder builder =
+                new NotificationCompat.Action.Builder(action.getIcon() == null ? null
+                        : IconCompat.createFromIcon(mContext, action.getIcon()),
+                        action.title,
+                        action.actionIntent);
+        return builder.build();
+    }
+
+    @StyleRes
+    private static int loadThemeId(Context context) {
+        int theme = Resources.ID_NULL;
+        ApplicationInfo applicationInfo;
+        try {
+            applicationInfo = context.getPackageManager()
+                    .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
+        } catch (PackageManager.NameNotFoundException e) {
+            return theme;
+        }
+
+        if (applicationInfo.metaData != null) {
+            theme = applicationInfo.metaData.getInt("androidx.car.app.theme");
+        }
+
+        return theme;
+    }
+
+    @ColorInt
+    @Nullable
+    private static Integer getColor(int resId, Resources.Theme appTheme) {
+        @ColorInt Integer color = null;
+        if (resId != Resources.ID_NULL) {
+            int[] attr = {resId};
+            TypedArray ta = appTheme.obtainStyledAttributes(attr);
+            color = ta.getColor(0, 0);
+            ta.recycle();
+        }
+        return color;
+    }
+
+    private CarNotificationManager(@NonNull Context context) {
+        mContext = requireNonNull(context);
+        mNotificationManagerCompat = NotificationManagerCompat.from(context);
+        mIsAutomotive = context.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE);
+
+        Context themeableContext = mContext.createConfigurationContext(
+                context.getResources().getConfiguration());
+
+        @StyleRes int themeId = loadThemeId(context);
+        if (themeId != Resources.ID_NULL) {
+            themeableContext.setTheme(themeId);
+        }
+
+        Resources.Theme theme = themeableContext.getTheme();
+        Resources themedResources = theme.getResources();
+
+        int carColorPrimary = themedResources.getIdentifier("carColorPrimary", "attr",
+                context.getPackageName());
+        mPrimaryColor = getColor(carColorPrimary, theme);
+
+        int carColorPrimaryDark = themedResources.getIdentifier("carColorPrimaryDark", "attr",
+                context.getPackageName());
+        mPrimaryColorDark = getColor(carColorPrimaryDark, theme);
+
+        int carColorSecondary = themedResources.getIdentifier("carColorSecondary", "attr",
+                context.getPackageName());
+        mSecondaryColor = getColor(carColorSecondary, theme);
+
+        int carColorSecondaryDark = themedResources.getIdentifier("carColorSecondaryDark", "attr",
+                context.getPackageName());
+        mSecondaryColorDark = getColor(carColorSecondaryDark, theme);
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/notification/CarPendingIntent.java b/car/app/app/src/main/java/androidx/car/app/notification/CarPendingIntent.java
new file mode 100644
index 0000000..55205a1c
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/notification/CarPendingIntent.java
@@ -0,0 +1,270 @@
+/*
+ * 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.car.app.notification;
+
+import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
+
+import static java.util.Objects.requireNonNull;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.car.app.CarContext;
+
+import java.security.InvalidParameterException;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A class which creates {@link PendingIntent}s that will start a car app, to be used in a
+ * notification action.
+ */
+public final class CarPendingIntent {
+    /**
+     * The key for retrieving the original {@link Intent} form the one the OS sent from the user
+     * click.
+     */
+    static final String COMPONENT_EXTRA_KEY =
+            "androidx.car.app.notification.COMPONENT_EXTRA_KEY";
+
+    private static final String ACTIVITY_METADATA_KEY = "androidx.car.app.CAR_APP_ACTIVITY";
+    private static final String NAVIGATION_URI_PREFIX = "geo:";
+    private static final String PHONE_URI_PREFIX = "tel:";
+    private static final String SEARCH_QUERY_PARAMETER = "q";
+    private static final String SEARCH_QUERY_PARAMETER_SPLITTER = SEARCH_QUERY_PARAMETER + "=";
+
+    // TODO(b/185173683): Update to PendingIntent.FLAG_MUTABLE once available (Android S)
+    private static final int FLAG_MUTABLE = 1 << 25;
+
+    /**
+     * Creates a {@link PendingIntent} that can be sent in a notification action which will allow
+     * your car app to be started when the user clicks on the action.
+     *
+     * <p>Here is an example of usage of this method when setting a notification's intent:
+     *
+     * <pre>
+     *     NotificationCompat.Builder builder;
+     *     ...
+     *     builder.setContentIntent(CarPendingIntent.getCarApp(getCarContext(), 0,
+     *             new Intent(Intent.ACTION_VIEW).setComponent(
+     *                     new ComponentName(getCarContext(), MyCarAppService.class)), 0));
+     * </pre>
+     *
+     * @param context     the context in which this PendingIntent should use to start the car app
+     * @param requestCode private request code for the sender
+     * @param intent      the intent that will be sent to the car app
+     * @param flags       may be any of the flags allowed by
+     *                    {@link PendingIntent#getBroadcast(Context, int, Intent, int)} except for
+     *                    {@link PendingIntent#FLAG_IMMUTABLE} as the {@link PendingIntent} needs
+     *                    to be mutable to allow the host to add the necessary extras for
+     *                    starting the car app.  If {@link PendingIntent#FLAG_IMMUTABLE} is set,
+     *                    it will be unset before creating the {@link PendingIntent}
+     * @throws NullPointerException      if either {@code context} or {@code intent} are null
+     * @throws InvalidParameterException if the {@code intent} is not for starting a navigation
+     *                                   or a phone call and does not have the target car app's
+     *                                   component name
+     * @throws SecurityException         if the {@code intent} does not follow the allowed values
+     *                                   as is defined in {@link CarContext#startCarApp(Intent)}
+     *
+     * @return an existing or new PendingIntent matching the given parameters.  May return null
+     * only if {@link PendingIntent#FLAG_NO_CREATE} has been supplied.
+     */
+    @NonNull
+    public static PendingIntent getCarApp(@NonNull Context context, int requestCode,
+            @NonNull Intent intent, int flags) {
+        requireNonNull(context);
+        requireNonNull(intent);
+
+        validateIntent(context, intent);
+
+        flags &= ~PendingIntent.FLAG_IMMUTABLE;
+        flags |= FLAG_MUTABLE;
+
+        if (context.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE)) {
+            return createForAutomotive(context, requestCode, intent, flags);
+        } else {
+            return createForProjected(context, requestCode, intent, flags);
+        }
+    }
+
+    /**
+     * Ensures that the {@link Intent} provided is valid for starting a car app.
+     *
+     * @see CarContext#startCarApp(Intent)
+     */
+    @VisibleForTesting
+    static void validateIntent(Context context, Intent intent) {
+        String packageName = context.getPackageName();
+        String action = intent.getAction();
+        ComponentName intentComponent = intent.getComponent();
+        if (intentComponent != null && Objects.equals(intentComponent.getPackageName(),
+                packageName)) {
+            try {
+                context.getPackageManager().getServiceInfo(intentComponent,
+                        PackageManager.GET_META_DATA);
+            } catch (PackageManager.NameNotFoundException e) {
+                throw new InvalidParameterException("Intent does not have the CarAppService's "
+                        + "ComponentName as its target" + intent);
+            }
+        } else if (Objects.equals(action, CarContext.ACTION_NAVIGATE)) {
+            validateNavigationIntentIsValid(intent);
+        } else if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_CALL.equals(action)) {
+            validatePhoneIntentIsValid(intent);
+        } else if (intentComponent == null) {
+            throw new InvalidParameterException("The intent is not for a supported action");
+        } else {
+            throw new SecurityException("Explicitly starting a separate app is not supported");
+        }
+    }
+
+    private static PendingIntent createForProjected(Context context, int requestCode, Intent intent,
+            int flags) {
+        intent.putExtra(COMPONENT_EXTRA_KEY, intent.getComponent());
+        intent.setClass(context, CarAppNotificationBroadcastReceiver.class);
+
+        return PendingIntent.getBroadcast(context, requestCode, intent, flags);
+    }
+
+    private static PendingIntent createForAutomotive(Context context, int requestCode,
+            Intent intent, int flags) {
+        Intent automotiveIntent = fixIntentForAutomotive(context, intent);
+        return PendingIntent.getActivity(context, requestCode, automotiveIntent, flags);
+    }
+
+    /**
+     * Returns an {@link Intent} that will be able to start the correct activity in the car for
+     * the data provided in the {@code intent}.
+     *
+     * <p>If the {@code intent} is to start this car app, it will replace the target with the
+     * proper activity that is tied to the given car app.
+     */
+    private static Intent fixIntentForAutomotive(Context context, Intent intent) {
+        String packageName = context.getPackageName();
+        ComponentName intentComponent = intent.getComponent();
+        if (intentComponent != null && Objects.equals(intentComponent.getPackageName(),
+                packageName)) {
+            ServiceInfo serviceInfo;
+            try {
+                serviceInfo = context.getPackageManager().getServiceInfo(intentComponent,
+                        PackageManager.GET_META_DATA);
+            } catch (PackageManager.NameNotFoundException e) {
+                throw new InvalidParameterException("Intent does not have the CarAppService's "
+                        + "ComponentName as its target");
+            }
+
+            String activityClass = serviceInfo.metaData.getString(ACTIVITY_METADATA_KEY);
+            intent.setClassName(packageName, activityClass);
+        }
+
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        return intent;
+    }
+
+    /**
+     * Checks that the {@link Intent} is for a phone call by validating it meets the following:
+     *
+     * <ul>
+     *   <li>The data is correctly formatted starting with 'tel:'
+     *   <li>Has no component name set
+     * </ul>
+     */
+    private static void validatePhoneIntentIsValid(Intent intent) {
+        String data = intent.getDataString() == null ? "" : intent.getDataString();
+        if (!data.startsWith(PHONE_URI_PREFIX)) {
+            throw new InvalidParameterException("Phone intent data is not properly formatted");
+        }
+
+        if (intent.getComponent() != null) {
+            throw new SecurityException("Phone intent cannot have a component");
+        }
+    }
+
+    /**
+     * Checks that the {@link Intent} is for navigation by validating it meets the following:
+     *
+     * <ul>
+     *   <li>The data is formatted as described in {@link CarContext#startCarApp(Intent)}
+     *   <li>Has no component name set
+     * </ul>
+     */
+    private static void validateNavigationIntentIsValid(Intent intent) {
+        String data = intent.getDataString() == null ? "" : intent.getDataString();
+        if (!data.startsWith(NAVIGATION_URI_PREFIX)) {
+            throw new InvalidParameterException("Navigation intent has a malformed uri");
+        }
+
+        Uri uri = intent.getData();
+        if (getQueryString(uri) == null) {
+            if (!isLatitudeLongitude(uri.getEncodedSchemeSpecificPart())) {
+                throw new InvalidParameterException(
+                        "Navigation intent has neither a location nor a query string");
+            }
+        }
+    }
+
+    /**
+     * Returns whether the {@code possibleLatitudeLongitude} has a latitude longitude.
+     */
+    @SuppressWarnings("StringSplitter")
+    private static boolean isLatitudeLongitude(String possibleLatitudeLongitude) {
+        String[] parts = possibleLatitudeLongitude.split(",");
+        if (parts.length == 2) {
+            try {
+                // Ensure both parts are doubles.
+                Double.parseDouble(parts[0]);
+                Double.parseDouble(parts[1]);
+                return true;
+            } catch (NumberFormatException e) {
+                // Values are not Doubles.
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the actual query from the {@link Uri}, or {@code null} if none exists.
+     *
+     * <p>The query will be after 'q='.
+     *
+     * <p>For example if Uri string is 'geo:0,0?q=124+Foo+St', return value will be '124+Foo+St'.
+     */
+    @SuppressWarnings("StringSplitter")
+    @Nullable
+    private static String getQueryString(Uri uri) {
+        if (uri.isHierarchical()) {
+            List<String> queries = uri.getQueryParameters(SEARCH_QUERY_PARAMETER);
+            return queries.isEmpty() ? null : queries.get(0);
+        }
+
+        String schemeSpecificPart = uri.getEncodedSchemeSpecificPart();
+        String[] parts = schemeSpecificPart.split(SEARCH_QUERY_PARAMETER_SPLITTER);
+
+        // If we have a valid split on "q=" split on "&" to only get the one parameter.
+        return parts.length < 2 ? null : parts[1].split("&")[0];
+    }
+
+    private CarPendingIntent() {
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java b/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
index 9b6ce95..e605b24 100644
--- a/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
+++ b/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
@@ -34,6 +34,7 @@
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.SurfaceCallback;
 import androidx.car.app.SurfaceContainer;
+import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.serialization.Bundleable;
 import androidx.car.app.serialization.BundlerException;
 import androidx.lifecycle.Lifecycle;
@@ -71,7 +72,6 @@
      * Performs the remote call to the host and handles exceptions thrown by the host.
      *
      * @return the value that the host returns for the IPC
-     *
      * @throws RemoteException   if the host is unresponsive
      * @throws SecurityException as a pass through from the host
      * @throws HostException     if the remote call fails with any other exception
@@ -187,6 +187,30 @@
     }
 
     /**
+     * Dispatches the given {@link HostCall} to the client in the main thread.
+     */
+    public static void dispatchCallFromHost(@Nullable Lifecycle lifecycle,
+            @NonNull String callName, @NonNull HostCall hostCall) {
+        ThreadUtils.runOnMain(
+                () -> {
+                    try {
+                        if (lifecycle == null || !lifecycle.getCurrentState().isAtLeast(CREATED)) {
+                            Log.w(LogTags.TAG_DISPATCH,
+                                    "Lifecycle is not at least created when dispatching "
+                                            + hostCall);
+                            return;
+                        }
+
+                        hostCall.dispatch();
+                    } catch (BundlerException e) {
+                        // Not possible, but catching since BundlerException is not runtime.
+                        Log.e(LogTags.TAG_DISPATCH,
+                                "Serialization failure in " + callName, e);
+                    }
+                });
+    }
+
+    /**
      * Invoke onSuccess on the given {@code callback} instance with the given {@code response}.
      */
     // TODO(b/178748627): the nullable annotation from the AIDL file is not being considered.
@@ -297,6 +321,30 @@
                         return null;
                     });
         }
+        @RequiresCarApi(2)
+        @Override
+        public void onScroll(float distanceX, float distanceY) {
+            dispatchCallFromHost(mLifecycle, "onScroll", () -> {
+                mSurfaceCallback.onScroll(distanceX, distanceY);
+                return null;
+            });
+        }
+        @RequiresCarApi(2)
+        @Override
+        public void onFling(float velocityX, float velocityY) {
+            dispatchCallFromHost(mLifecycle, "onFling", () -> {
+                mSurfaceCallback.onFling(velocityX, velocityY);
+                return null;
+            });
+        }
+        @RequiresCarApi(2)
+        @Override
+        public void onScale(float focusX, float focusY, float scaleFactor) {
+            dispatchCallFromHost(mLifecycle, "onScale", () -> {
+                mSurfaceCallback.onScale(focusX, focusY, scaleFactor);
+                return null;
+            });
+        }
     }
 
     private RemoteUtils() {
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 0da9df6..c75bb85 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
@@ -24,7 +24,7 @@
 
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
-@IntDef(value = {CarAppApiLevels.LEVEL_1})
+@IntDef(value = {CarAppApiLevels.UNKNOWN, CarAppApiLevels.LEVEL_1, CarAppApiLevels.LEVEL_2})
 @Retention(RetentionPolicy.SOURCE)
 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 b2d953a..35e7d9a 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
@@ -30,6 +30,15 @@
 public final class CarAppApiLevels {
 
     /**
+     * API level 2.
+     *
+     * <p>Includes features such as sign-in template, long-message template, and multi-variant
+     * text support.
+     */
+    @CarAppApiLevel
+    public static final int LEVEL_2 = 2;
+
+    /**
      * Initial API level.
      *
      * <p>Includes core API services and managers, and templates for parking, charging, and
@@ -64,7 +73,7 @@
      */
     @CarAppApiLevel
     public static int getLatest() {
-        return LEVEL_1;
+        return LEVEL_2;
     }
 
     /**
diff --git a/car/app/app/src/main/res/values-night/colors.xml b/car/app/app/src/main/res/values-night/colors.xml
new file mode 100644
index 0000000..06fcedc
--- /dev/null
+++ b/car/app/app/src/main/res/values-night/colors.xml
@@ -0,0 +1,22 @@
+<!--
+  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>
+<color name="carColorBlue">#FF3674E0</color>
+<color name="carColorGreen">#FF448B47</color>
+<color name="carColorRed">#FFC5221F</color>
+<color name="carColorYellow">#FFD5792D</color>
+</resources>
\ No newline at end of file
diff --git a/car/app/app/src/main/res/values/colors.xml b/car/app/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..f18d199
--- /dev/null
+++ b/car/app/app/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?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>
+    <color name="carColorBlue">#FF669DF6</color>
+    <color name="carColorGreen">#FF61AC70</color>
+    <color name="carColorRed">#FFEE675C</color>
+    <color name="carColorYellow">#FFE9A240</color>
+</resources>
\ No newline at end of file
diff --git a/car/app/app/src/main/res/values/integers.xml b/car/app/app/src/main/res/values/integers.xml
new file mode 100644
index 0000000..e2a7daf6
--- /dev/null
+++ b/car/app/app/src/main/res/values/integers.xml
@@ -0,0 +1,28 @@
+<?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>
+    <!--
+        the following content limits are defaults for when the app fails to communicate with the
+        host for the actual limits.
+    -->
+    <integer name="content_limit_list">6</integer>
+    <integer name="content_limit_grid">6</integer>
+    <integer name="content_limit_place_list">6</integer>
+    <integer name="content_limit_route_list">3</integer>
+    <integer name="content_limit_pane">2</integer>
+</resources>
diff --git a/car/app/app/src/test/AndroidManifest.xml b/car/app/app/src/test/AndroidManifest.xml
new file mode 100644
index 0000000..b190683
--- /dev/null
+++ b/car/app/app/src/test/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?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"
+    package="androidx.car.app">
+    <application>
+        <service android:name="androidx.car.app.CarAppService" >
+            <meta-data android:name="androidx.car.app.CAR_APP_ACTIVITY"
+                android:value="androidx.car.app.CarAppActivity" />
+        </service>
+
+        <meta-data
+            android:name="androidx.car.app.theme"
+            android:resource= "@style/CarAppTheme" />
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java b/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
index 158e1fc..282a9c7 100644
--- a/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
@@ -55,18 +55,16 @@
                 .thenReturn(mApplicationInfo);
     }
 
-    @Test
-    public void create_minApiLevel_nullMetadata_defaultsToCurrent() {
+    @Test(expected = IllegalArgumentException.class)
+    public void create_minApiLevel_mustNotUseNullMetadata() {
         mApplicationInfo.metaData = null;
-        AppInfo appInfo = AppInfo.create(mContext);
-        assertThat(appInfo.getMinCarAppApiLevel()).isEqualTo(CarAppApiLevels.getLatest());
+        AppInfo.create(mContext);
     }
 
-    @Test
-    public void create_minApiLevel_noMetadataKey_defaultsToCurrent() {
+    @Test(expected = IllegalArgumentException.class)
+    public void create_minApiLevel_mustNotMissMetadataKeyMinApiLevelManifestKey() {
         mApplicationInfo.metaData = new Bundle();
-        AppInfo appInfo = AppInfo.create(mContext);
-        assertThat(appInfo.getMinCarAppApiLevel()).isEqualTo(CarAppApiLevels.getLatest());
+        AppInfo.create(mContext);
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
index 5b3d169..f20adab 100644
--- a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyFloat;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doThrow;
@@ -374,6 +375,75 @@
         verify(mMockOnDoneCallback).onFailure(any());
     }
 
+    @Test
+    public void onSurfaceScroll_dispatches()
+            throws RemoteException, BundlerException {
+        mTestCarContext.getLifecycleOwner().mRegistry.setCurrentState(Lifecycle.State.CREATED);
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onScroll(1, 2);
+
+        verify(mSurfaceCallback).onScroll(1, 2);
+    }
+
+    @Test
+    public void onSurfaceScroll_lifecycleNotCreated_doesNotDispatch()
+            throws RemoteException, BundlerException {
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onScroll(1, 2);
+
+        verify(mSurfaceCallback, never()).onScroll(anyFloat(), anyFloat());
+    }
+
+    @Test
+    public void onSurfaceFling_dispatches()
+            throws RemoteException, BundlerException {
+        mTestCarContext.getLifecycleOwner().mRegistry.setCurrentState(Lifecycle.State.CREATED);
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onFling(1, 2);
+
+        verify(mSurfaceCallback).onFling(1, 2);
+    }
+
+    @Test
+    public void onSurfaceFling_lifecycleNotCreated_doesNotDispatch()
+            throws RemoteException, BundlerException {
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onFling(1, 2);
+
+        verify(mSurfaceCallback, never()).onFling(anyFloat(), anyFloat());
+    }
+
+    @Test
+    public void onSurfaceScale_dispatches()
+            throws RemoteException, BundlerException {
+        mTestCarContext.getLifecycleOwner().mRegistry.setCurrentState(Lifecycle.State.CREATED);
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onScale(1, 2, 3);
+
+        verify(mSurfaceCallback).onScale(1, 2, 3);
+    }
+
+    @Test
+    public void onSurfaceScale_lifecycleNotCreated_doesNotDispatch()
+            throws RemoteException, BundlerException {
+        mAppManager.setSurfaceCallback(mSurfaceCallback);
+        verify(mMockAppHost).setSurfaceCallback(mSurfaceCallbackCaptor.capture());
+
+        mSurfaceCallbackCaptor.getValue().onScale(1, 2, 3);
+
+        verify(mSurfaceCallback, never()).onScale(anyFloat(), anyFloat(), anyFloat());
+    }
+
     private static class NonBundleableTemplate implements Template {
         NonBundleableTemplate(String s) {
         }
diff --git a/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java b/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
index f7c4dfa..b46b476 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
@@ -108,6 +108,10 @@
                     }
                 };
 
+        AppInfo appInfo = new AppInfo(CarAppApiLevels.getOldest(), CarAppApiLevels.getLatest(),
+                "blah");
+        mCarAppService.setAppInfo(appInfo);
+
         // Sets a default handshake info. OnAppCreate depends on this being non-null.
         String hostPackageName = "com.google.projection.gearhead";
         HandshakeInfo handshakeInfo = new HandshakeInfo(hostPackageName,
diff --git a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
index fc1a53c..6eadd11 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
@@ -193,24 +193,6 @@
     }
 
     @Test
-    public void startCarApp_nullIntent_throws() {
-        assertThrows(NullPointerException.class, () -> CarContext.startCarApp(null, null));
-        assertThrows(
-                NullPointerException.class,
-                () -> CarContext.startCarApp(mIntentFromNotification, null));
-        assertThrows(NullPointerException.class, () -> CarContext.startCarApp(null, new Intent()));
-    }
-
-    @Test
-    public void startCarApp_callsTheBinder() throws RemoteException {
-        Intent startCarAppIntent = new Intent("foo");
-
-        CarContext.startCarApp(mIntentFromNotification, startCarAppIntent);
-
-        verify(mMockStartCarApp).startCarApp(startCarAppIntent);
-    }
-
-    @Test
     public void finishCarApp() throws RemoteException {
         mCarContext.finishCarApp();
 
diff --git a/car/app/app/src/test/java/androidx/car/app/ScreenTest.java b/car/app/app/src/test/java/androidx/car/app/ScreenTest.java
index 268afda..cdda07c 100644
--- a/car/app/app/src/test/java/androidx/car/app/ScreenTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/ScreenTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
@@ -29,6 +30,7 @@
 import androidx.car.app.testing.ScreenController;
 import androidx.car.app.testing.TestCarContext;
 import androidx.car.app.testing.TestScreenManager;
+import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle.Event;
 import androidx.lifecycle.Lifecycle.State;
 import androidx.test.core.app.ApplicationProvider;
@@ -128,6 +130,38 @@
     }
 
     @Test
+    public void alreadyDestroyed_willNotDispatchMoreEvents() {
+        mScreen.dispatchLifecycleEvent(Event.ON_DESTROY);
+
+        DefaultLifecycleObserver observer = mock(DefaultLifecycleObserver.class);
+        mScreen.getLifecycle().addObserver(observer);
+
+        mScreen.dispatchLifecycleEvent(Event.ON_CREATE);
+        mScreen.dispatchLifecycleEvent(Event.ON_START);
+        mScreen.dispatchLifecycleEvent(Event.ON_RESUME);
+        mScreen.dispatchLifecycleEvent(Event.ON_PAUSE);
+        mScreen.dispatchLifecycleEvent(Event.ON_STOP);
+        mScreen.dispatchLifecycleEvent(Event.ON_DESTROY);
+
+        assertThat(mScreen.getLifecycle().getCurrentState()).isEqualTo(State.DESTROYED);
+        verify(observer, never()).onCreate(any());
+        verify(observer, never()).onStart(any());
+        verify(observer, never()).onResume(any());
+        verify(observer, never()).onPause(any());
+        verify(observer, never()).onStop(any());
+        verify(observer, never()).onDestroy(any());
+    }
+
+    @Test
+    public void alreadyDestroyed_willNotSendResults() {
+        mScreen.dispatchLifecycleEvent(Event.ON_DESTROY);
+        mScreen.setOnScreenResultListener(mMockOnScreenResultListener);
+        mScreen.dispatchLifecycleEvent(Event.ON_RESUME);
+        mScreen.dispatchLifecycleEvent(Event.ON_DESTROY);
+        verify(mMockOnScreenResultListener, never()).onScreenResult(any());
+    }
+
+    @Test
     public void setResult_callsThemockOnScreenResultCallback() {
         mScreen.setOnScreenResultListener(mMockOnScreenResultListener);
 
diff --git a/car/app/app/src/test/java/androidx/car/app/constraints/ConstraintManagerTest.java b/car/app/app/src/test/java/androidx/car/app/constraints/ConstraintManagerTest.java
new file mode 100644
index 0000000..bb1b0a1
--- /dev/null
+++ b/car/app/app/src/test/java/androidx/car/app/constraints/ConstraintManagerTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.car.app.constraints;
+
+import static androidx.car.app.constraints.ConstraintManager.CONTENT_LIMIT_TYPE_GRID;
+import static androidx.car.app.constraints.ConstraintManager.CONTENT_LIMIT_TYPE_LIST;
+import static androidx.car.app.constraints.ConstraintManager.CONTENT_LIMIT_TYPE_PANE;
+import static androidx.car.app.constraints.ConstraintManager.CONTENT_LIMIT_TYPE_PLACE_LIST;
+import static androidx.car.app.constraints.ConstraintManager.CONTENT_LIMIT_TYPE_ROUTE_LIST;
+import static androidx.car.app.constraints.ConstraintManager.create;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.os.RemoteException;
+
+import androidx.car.app.HostDispatcher;
+import androidx.car.app.ICarHost;
+import androidx.car.app.testing.TestCarContext;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link ConstraintManager}. */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class ConstraintManagerTest {
+    @Mock
+    private ICarHost mMockCarHost;
+    @Mock
+    private IConstraintHost.Stub mMockConstraintHost;
+
+    private final HostDispatcher mHostDispatcher = new HostDispatcher();
+
+    private TestCarContext mTestCarContext;
+
+    private ConstraintManager mConstraintManager;
+
+    @Before
+    public void setUp() throws RemoteException {
+        MockitoAnnotations.initMocks(this);
+
+        mTestCarContext =
+                TestCarContext.createCarContext(ApplicationProvider.getApplicationContext());
+
+        IConstraintHost hostStub =
+                new IConstraintHost.Stub() {
+                    @Override
+                    public int getContentLimit(int contentType) throws RemoteException {
+                        return mMockConstraintHost.getContentLimit(contentType);
+                    }
+                };
+        when(mMockCarHost.getHost(any())).thenReturn(hostStub.asBinder());
+        mHostDispatcher.setCarHost(mMockCarHost);
+
+        mConstraintManager = create(mTestCarContext, mHostDispatcher);
+    }
+
+    @Test
+    public void host_throwsException_returnsDefaultLimits() throws RemoteException {
+        when(mMockConstraintHost.getContentLimit(anyInt())).thenThrow(new RemoteException());
+
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_LIST)).isEqualTo(6);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_GRID)).isEqualTo(6);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_PLACE_LIST)).isEqualTo(6);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_ROUTE_LIST)).isEqualTo(3);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_PANE)).isEqualTo(2);
+    }
+
+    @Test
+    public void host_returnLimits() throws RemoteException {
+        when(mMockConstraintHost.getContentLimit(CONTENT_LIMIT_TYPE_LIST)).thenReturn(1);
+        when(mMockConstraintHost.getContentLimit(CONTENT_LIMIT_TYPE_GRID)).thenReturn(2);
+        when(mMockConstraintHost.getContentLimit(CONTENT_LIMIT_TYPE_PLACE_LIST)).thenReturn(3);
+        when(mMockConstraintHost.getContentLimit(CONTENT_LIMIT_TYPE_ROUTE_LIST)).thenReturn(4);
+        when(mMockConstraintHost.getContentLimit(CONTENT_LIMIT_TYPE_PANE)).thenReturn(5);
+
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_LIST)).isEqualTo(1);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_GRID)).isEqualTo(2);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_PLACE_LIST)).isEqualTo(3);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_ROUTE_LIST)).isEqualTo(4);
+        assertThat(mConstraintManager.getContentLimit(CONTENT_LIMIT_TYPE_PANE)).isEqualTo(5);
+    }
+}
diff --git a/car/app/app/src/test/java/androidx/car/app/model/ActionTest.java b/car/app/app/src/test/java/androidx/car/app/model/ActionTest.java
index 2cfed3d..23f79b1 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/ActionTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/ActionTest.java
@@ -134,6 +134,27 @@
     }
 
     @Test
+    public void create_panMode() {
+        Action action = new Action.Builder(Action.PAN)
+                .setIcon(TestUtils.getTestCarIcon(ApplicationProvider.getApplicationContext(),
+                        "ic_test_1"))
+                .build();
+        assertThat(action.getTitle()).isNull();
+    }
+
+    @Test
+    public void create_panMode_hasOnClickListener_throws() {
+        OnClickListener onClickListener = mock(OnClickListener.class);
+        assertThrows(IllegalStateException.class,
+                () -> new Action.Builder(Action.PAN)
+                        .setIcon(TestUtils.getTestCarIcon(
+                                ApplicationProvider.getApplicationContext(),
+                                "ic_test_1"))
+                        .setOnClickListener(onClickListener)
+                        .build());
+    }
+
+    @Test
     public void equals() {
         String title = "foo";
         CarIcon icon = CarIcon.ALERT;
diff --git a/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
index 9bcaa38..aa7de93 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/LongMessageTemplateTest.java
@@ -16,8 +16,6 @@
 
 package androidx.car.app.model;
 
-import static androidx.car.app.model.CarIcon.BACK;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertThrows;
@@ -34,7 +32,10 @@
 
     private final String mTitle = "header";
     private final String mMessage = "foo";
-    private final Action mAction = Action.BACK;
+    private final Action mAction =
+            new Action.Builder().setTitle("Action").setOnClickListener(
+                    ParkedOnlyOnClickListener.create(() -> {
+                    })).build();
     private final ActionStrip mActionStrip = new ActionStrip.Builder().addAction(mAction).build();
 
     @Test
@@ -52,7 +53,7 @@
 
         // Positive cases.
         new LongMessageTemplate.Builder(mMessage).setTitle(mTitle).build();
-        new LongMessageTemplate.Builder(mMessage).setHeaderAction(mAction).build();
+        new LongMessageTemplate.Builder(mMessage).setHeaderAction(Action.APP_ICON).build();
     }
 
     @Test
@@ -83,25 +84,33 @@
 
     @Test
     public void createWithContents_hasProperValuesSet() {
-        Throwable exception = new IllegalStateException();
-        CarIcon icon = BACK;
-        Action action = new Action.Builder().setOnClickListener(() -> { }).setTitle("foo").build();
         ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         LongMessageTemplate template = new LongMessageTemplate.Builder(mMessage)
                 .setTitle(mTitle)
                 .setHeaderAction(Action.BACK)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
 
         assertThat(template.getMessage().toString()).isEqualTo(mMessage);
         assertThat(template.getTitle().toString()).isEqualTo(mTitle);
         assertThat(template.getHeaderAction()).isEqualTo(Action.BACK);
-        assertThat(template.getActions()).containsExactly(action);
+        assertThat(template.getActions()).containsExactly(mAction);
         assertThat(template.getActionStrip()).isEqualTo(actionStrip);
     }
 
+    @Test
+    public void createInstance_notParkedOnlyAction_throws() {
+        Action action = new Action.Builder()
+                .setOnClickListener(() -> { })
+                .setTitle("foo").build();
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new LongMessageTemplate.Builder(mMessage)
+                        .setTitle("Title")
+                        .addAction(action));
+    }
 
     @Test
     public void equals() {
diff --git a/car/app/app/src/test/java/androidx/car/app/model/signin/PinSignInMethodTest.java b/car/app/app/src/test/java/androidx/car/app/model/signin/PinSignInMethodTest.java
index f1b5de1..147eb22 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/signin/PinSignInMethodTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/signin/PinSignInMethodTest.java
@@ -30,13 +30,6 @@
 @DoNotInstrument
 public class PinSignInMethodTest {
     @Test
-    public void create_emptyPin_throws() {
-        assertThrows(
-                IllegalArgumentException.class,
-                () -> new PinSignInMethod.Builder(""));
-    }
-
-    @Test
     public void create_defaultValues() {
         PinSignInMethod signIn = new PinSignInMethod.Builder("ABC").build();
 
@@ -44,6 +37,21 @@
     }
 
     @Test
+    public void create_checkPinLimits() {
+        // Zero
+        assertThrows(IllegalArgumentException.class, () -> new PinSignInMethod.Builder(""));
+
+        // Over max of 12
+        assertThrows(IllegalArgumentException.class,
+                () -> new PinSignInMethod.Builder("123456123456x"));
+
+        // Just at max
+        PinSignInMethod signIn =
+                new PinSignInMethod.Builder("123456123456").build();
+        assertThat(signIn.getPin().length() == 12);
+    }
+
+    @Test
     public void equals() {
         String pin = "ABC";
         PinSignInMethod signIn = new PinSignInMethod.Builder(pin).build();
diff --git a/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
index bab84ba..cdf6e5d 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/signin/SignInTemplateTest.java
@@ -22,6 +22,7 @@
 
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.ParkedOnlyOnClickListener;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,6 +33,11 @@
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
 public class SignInTemplateTest {
+    private final Action mAction =
+            new Action.Builder().setTitle("Action").setOnClickListener(
+                    ParkedOnlyOnClickListener.create(() -> {
+                    })).build();
+
     @Test
     public void createInstance_noHeaderTitleOrAction_throws() {
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
@@ -128,8 +134,13 @@
 
     @Test
     public void createInstance_addActions() {
-        Action action1 = new Action.Builder().setTitle("Action").build();
-        Action action2 = new Action.Builder().setTitle("Action").build();
+        Action action1 = new Action.Builder()
+                .setTitle("Action")
+                .setOnClickListener(ParkedOnlyOnClickListener.create(() -> { }))
+                .build();
+        Action action2 = new Action.Builder()
+                .setTitle("Action").setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
+                })).build();
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle("Title")
@@ -141,15 +152,16 @@
     }
 
     @Test
-    public void createInstance_moreThanTwoActions_throws() {
-        Action action = new Action.Builder().setTitle("Action").build();
+    public void createInstance_notParkedOnlyAction_throws() {
+        Action action = new Action.Builder()
+                .setTitle("Action")
+                .setOnClickListener(() -> { })
+                .build();
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
-        assertThrows(IllegalStateException.class,
-                () -> new SignInTemplate.Builder(signInMethod)
-                        .setTitle("Title")
-                        .addAction(action)
-                        .addAction(action)
-                        .addAction(action));
+
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> new SignInTemplate.Builder(signInMethod).addAction(action));
     }
 
     @Test
@@ -158,15 +170,14 @@
         String title = "Title";
         String instructions = "instructions";
         String additionalText = "Text";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setLoading(true)
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
 
@@ -177,7 +188,7 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -188,15 +199,14 @@
         String title = "Title";
         String instructions = "instructions";
         String additionalText = "Text";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setLoading(true)
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
 
@@ -207,7 +217,7 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -218,14 +228,13 @@
         String title = "Title";
         String instructions = "instructions";
         String additionalText = "Text";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
 
@@ -236,7 +245,7 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -246,14 +255,13 @@
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
         String instructions = "instructions";
         String additionalText = "Text";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle("Title")
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
         assertThat(template)
@@ -262,7 +270,7 @@
                                 .setTitle("Title2")
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -272,14 +280,13 @@
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
         String title = "Title";
         String additionalText = "Text";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setInstructions("instructions1")
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
         assertThat(template)
@@ -288,7 +295,7 @@
                                 .setTitle(title)
                                 .setInstructions("instructions2")
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -298,14 +305,13 @@
         PinSignInMethod signInMethod = new PinSignInMethod.Builder("ABC").build();
         String instructions = "instructions";
         String title = "Title";
-        Action action = Action.BACK;
-        ActionStrip actionStrip = new ActionStrip.Builder().addAction(action).build();
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setInstructions(instructions)
                 .setAdditionalText("Text")
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
         assertThat(template)
@@ -314,7 +320,7 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText("Text2")
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -331,7 +337,7 @@
                 .setTitle(title)
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(Action.BACK)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
         assertThat(template)
@@ -340,7 +346,6 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(Action.APP_ICON)
                                 .setActionStrip(actionStrip)
                                 .build());
     }
@@ -351,14 +356,13 @@
         String instructions = "instructions";
         String title = "Title";
         String additionalText = "Text";
-        Action action = Action.BACK;
         ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.APP_ICON).build();
 
         SignInTemplate template = new SignInTemplate.Builder(signInMethod)
                 .setTitle(title)
                 .setInstructions(instructions)
                 .setAdditionalText(additionalText)
-                .addAction(action)
+                .addAction(mAction)
                 .setActionStrip(actionStrip)
                 .build();
         ActionStrip actionStrip2 = new ActionStrip.Builder().addAction(Action.BACK).build();
@@ -368,7 +372,7 @@
                                 .setTitle(title)
                                 .setInstructions(instructions)
                                 .setAdditionalText(additionalText)
-                                .addAction(action)
+                                .addAction(mAction)
                                 .setActionStrip(actionStrip2)
                                 .build());
     }
diff --git a/car/app/app/src/test/java/androidx/car/app/navigation/model/NavigationTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/navigation/model/NavigationTemplateTest.java
index d2b8099..3a6fbdd 100644
--- a/car/app/app/src/test/java/androidx/car/app/navigation/model/NavigationTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/navigation/model/NavigationTemplateTest.java
@@ -27,6 +27,7 @@
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.Distance;
+import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,6 +42,11 @@
 public class NavigationTemplateTest {
     private final ActionStrip mActionStrip =
             new ActionStrip.Builder().addAction(TestUtils.createAction("test", null)).build();
+    private final ActionStrip mMapActionStrip =
+            new ActionStrip.Builder().addAction(
+                    TestUtils.createAction(null, TestUtils.getTestCarIcon(
+                            ApplicationProvider.getApplicationContext(),
+                            "ic_test_1"))).build();
     private final Maneuver mManeuver =
             new Maneuver.Builder(Maneuver.TYPE_FERRY_BOAT).setIcon(CarIcon.APP_ICON).build();
     private final Step mCurrentStep =
@@ -53,6 +59,12 @@
         assertThrows(IllegalStateException.class, () -> new NavigationTemplate.Builder().build());
     }
 
+    @Test
+    public void textButtonInMapActionStrip_throws() {
+        assertThrows(IllegalArgumentException.class,
+                () -> new NavigationTemplate.Builder().setMapActionStrip(mActionStrip));
+    }
+
     /** Tests basic construction of a template with a minimal data. */
     @Test
     public void createMinimalInstance() {
@@ -94,6 +106,9 @@
                         .setBackgroundColor(CarColor.BLUE)
                         .setDestinationTravelEstimate(travelEstimate)
                         .setActionStrip(mActionStrip)
+                        .setMapActionStrip(mMapActionStrip)
+                        .setPanModeListener((isInPanMode) -> {
+                        })
                         .build();
         RoutingInfo routingInfo = (RoutingInfo) template.getNavigationInfo();
         assertThat(routingInfo.getCurrentStep()).isEqualTo(mCurrentStep);
@@ -102,6 +117,7 @@
         assertThat(template.getBackgroundColor()).isEqualTo(CarColor.BLUE);
         assertThat(template.getDestinationTravelEstimate()).isEqualTo(travelEstimate);
         assertThat(template.getActionStrip()).isEqualTo(mActionStrip);
+        assertThat(template.getMapActionStrip()).isEqualTo(mMapActionStrip);
     }
 
     @Test
@@ -127,6 +143,9 @@
         NavigationTemplate template =
                 new NavigationTemplate.Builder()
                         .setActionStrip(mActionStrip)
+                        .setMapActionStrip(mMapActionStrip)
+                        .setPanModeListener((isInPanMode) -> {
+                        })
                         .setDestinationTravelEstimate(travelEstimate)
                         .setNavigationInfo(
                                 new RoutingInfo.Builder()
@@ -141,6 +160,9 @@
                 .isEqualTo(
                         new NavigationTemplate.Builder()
                                 .setActionStrip(mActionStrip)
+                                .setMapActionStrip(mMapActionStrip)
+                                .setPanModeListener((isInPanMode) -> {
+                                })
                                 .setDestinationTravelEstimate(travelEstimate)
                                 .setNavigationInfo(
                                         new RoutingInfo.Builder()
@@ -167,6 +189,34 @@
     }
 
     @Test
+    public void notEquals_differentMapActionStrip() {
+        NavigationTemplate template = new NavigationTemplate.Builder().setActionStrip(
+                mActionStrip).setMapActionStrip(mMapActionStrip).build();
+
+        assertThat(template)
+                .isNotEqualTo(
+                        new NavigationTemplate.Builder()
+                                .setActionStrip(mActionStrip)
+                                .setMapActionStrip(new ActionStrip.Builder().addAction(
+                                        TestUtils.createAction(null, TestUtils.getTestCarIcon(
+                                                ApplicationProvider.getApplicationContext(),
+                                                "ic_test_2"))).build())
+                                .build());
+    }
+
+    @Test
+    public void notEquals_panModeListenerChange() {
+        NavigationTemplate template = new NavigationTemplate.Builder().setActionStrip(
+                mActionStrip).setPanModeListener((isInPanMode) -> {}).build();
+
+        assertThat(template)
+                .isNotEqualTo(
+                        new NavigationTemplate.Builder()
+                                .setActionStrip(mActionStrip)
+                                .build());
+    }
+
+    @Test
     public void notEquals_differentTravelEstimate() {
         TravelEstimate travelEstimate =
                 new TravelEstimate.Builder(
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
index d2745ca..1441ba9 100644
--- a/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarAppExtenderTest.java
@@ -82,6 +82,7 @@
         assertThat(carAppExtender.getActions()).isEmpty();
         assertThat(carAppExtender.getImportance())
                 .isEqualTo(NotificationManagerCompat.IMPORTANCE_UNSPECIFIED);
+        assertThat(carAppExtender.getChannelId()).isNull();
     }
 
     @Test
@@ -234,4 +235,18 @@
         assertThat(new CarAppExtender(builder.build()).getColor())
                 .isEqualTo(CarColor.BLUE);
     }
+
+    @Test
+    public void notification_extended_channelId() {
+        String channelId = "foo";
+        NotificationCompat.Builder builder =
+                new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID)
+                        .extend(
+                                new CarAppExtender.Builder()
+                                        .setChannelId(channelId)
+                                        .build());
+
+        assertThat(new CarAppExtender(builder.build()).getChannelId())
+                .isEqualTo(channelId);
+    }
 }
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiverTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiverTest.java
new file mode 100644
index 0000000..f4031ba
--- /dev/null
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarAppNotificationBroadcastReceiverTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.car.app.notification;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Application;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.car.app.CarAppService;
+import androidx.car.app.CarContext;
+import androidx.car.app.testing.TestCarContext;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link CarAppNotificationBroadcastReceiver}. */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class CarAppNotificationBroadcastReceiverTest {
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final TestCarContext mTestCarContext = TestCarContext.createCarContext(mContext);
+
+    private final Intent mIntent =
+            new Intent("fooAction").setComponent(
+                    new ComponentName(mContext, CarAppService.class));
+
+    @Test
+    public void onReceive() throws PendingIntent.CanceledException {
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(mContext, 1,
+                new Intent(mIntent),
+                0);
+
+        Bundle extras = new Bundle(1);
+        extras.putBinder(
+                CarContext.EXTRA_START_CAR_APP_BINDER_KEY,
+                mTestCarContext.getStartCarAppStub().asBinder());
+        Intent extraData = new Intent().putExtras(extras);
+        pendingIntent.send(mContext, 0, extraData);
+
+        Intent broadcastedIntent =
+                Shadows.shadowOf((Application) mContext).getBroadcastIntents().get(0);
+
+        CarAppNotificationBroadcastReceiver receiver = new CarAppNotificationBroadcastReceiver();
+
+        receiver.onReceive(mContext, broadcastedIntent);
+
+        Intent startedIntent = mTestCarContext.getStartCarAppIntents().get(0);
+        assertThat(startedIntent.getComponent()).isEqualTo(mIntent.getComponent());
+        assertThat(startedIntent.getAction()).isEqualTo(mIntent.getAction());
+    }
+}
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java
new file mode 100644
index 0000000..cc01b10
--- /dev/null
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarNotificationManagerTest.java
@@ -0,0 +1,312 @@
+/*
+ * 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.car.app.notification;
+
+import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+
+import androidx.annotation.ColorInt;
+import androidx.car.app.R;
+import androidx.car.app.TestUtils;
+import androidx.car.app.model.CarColor;
+import androidx.core.app.NotificationCompat;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+/** Tests for {@link CarNotificationManager}. */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class CarNotificationManagerTest {
+    private static final String DEFAULT_TITLE = "title";
+    private static final String EXTENDED_TITLE = "carTitle";
+
+    private static final String DEFAULT_TEXT = "text";
+    private static final String EXTENDED_TEXT = "carText";
+
+    private static final String DEFAULT_ACTION_TITLE = "phone";
+    private static final String EXTENDED_ACTION_TITLE = "car";
+
+    private static final String DEFAULT_CHANNEL = "channel1";
+    private static final String EXTENDED_CHANNEL = "channel2";
+
+    @ColorInt
+    private static final int DEFAULT_COLOR = Color.GREEN;
+    private static final CarColor EXTENDED_COLOR = CarColor.BLUE;
+
+    private final Context mContext =
+            ApplicationProvider.getApplicationContext();
+    private final CarNotificationManager mCarNotificationManager = CarNotificationManager.from(
+            mContext);
+
+    private final PendingIntent mDefaultPendingIntent = PendingIntent.getBroadcast(mContext, 1,
+            new Intent("foo"), 0);
+    private final PendingIntent mExtendedPendingIntent = PendingIntent.getBroadcast(mContext, 1,
+            new Intent("bar"), 0);
+
+    private int mDefaultIcon;
+    private int mExtendedIcon;
+
+    private Bitmap mDefaultBitmap;
+    private Bitmap mExtendedBitmap;
+
+    private NotificationCompat.Action mDefaultAction;
+
+    @Before
+    public void setup() {
+        mDefaultIcon = TestUtils.getTestDrawableResId(mContext, "ic_test_1");
+        mExtendedIcon = TestUtils.getTestDrawableResId(mContext, "ic_test_2");
+
+        mDefaultBitmap = BitmapFactory.decodeResource(mContext.getResources(), mDefaultIcon);
+        mExtendedBitmap = BitmapFactory.decodeResource(mContext.getResources(), mExtendedIcon);
+
+        mDefaultAction = new NotificationCompat.Action(mDefaultIcon, DEFAULT_ACTION_TITLE,
+                mDefaultPendingIntent);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void updateForCar_embedded_overridesAsExpected() {
+        setEmbedded();
+
+        Notification changed = CarNotificationManager.from(mContext).updateForCar(
+                extend(createNotification()));
+
+        assertThat(changed.extras.getCharSequence(Notification.EXTRA_TITLE)).isEqualTo(
+                EXTENDED_TITLE);
+        assertThat(changed.extras.getCharSequence(Notification.EXTRA_TEXT)).isEqualTo(
+                EXTENDED_TEXT);
+        assertThat(changed.contentIntent).isSameInstanceAs(mExtendedPendingIntent);
+        assertThat(changed.deleteIntent).isSameInstanceAs(mExtendedPendingIntent);
+        assertThat(changed.color).isEqualTo(mContext.getColor(R.color.carColorBlue));
+        assertThat(changed.getChannelId()).isEqualTo(EXTENDED_CHANNEL);
+        assertThat(changed.icon).isEqualTo(mExtendedIcon);
+        // Comparing the largeIcon does not work due to internally it creating another Bitmap and
+        // then not being able to compare
+
+        Notification.Action[] actions = changed.actions;
+        assertThat(actions).hasLength(1);
+        Notification.Action action = actions[0];
+        assertThat(action.icon).isEqualTo(mExtendedIcon);
+        assertThat(action.actionIntent).isSameInstanceAs(mExtendedPendingIntent);
+        assertThat(action.title).isEqualTo(EXTENDED_ACTION_TITLE);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void updateForCar_notEmbedded_returnsTheSame() {
+        Notification output = mCarNotificationManager.updateForCar(extend(createNotification()));
+
+        assertThat(output.extras.getCharSequence(Notification.EXTRA_TITLE)).isEqualTo(
+                DEFAULT_TITLE);
+        assertThat(output.extras.getCharSequence(Notification.EXTRA_TEXT)).isEqualTo(
+                DEFAULT_TEXT);
+        assertThat(output.contentIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(output.deleteIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(output.color).isEqualTo(Color.GREEN);
+        assertThat(output.getChannelId()).isEqualTo(DEFAULT_CHANNEL);
+        assertThat(output.icon).isEqualTo(mDefaultIcon);
+        // Comparing the largeIcon does not work due to internally it creating another Bitmap and
+        // then not being able to compare
+
+        Notification.Action[] actions = output.actions;
+        assertThat(actions).hasLength(1);
+        Notification.Action action = actions[0];
+        assertThat(action.icon).isEqualTo(mDefaultIcon);
+        assertThat(action.actionIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(action.title).isEqualTo(DEFAULT_ACTION_TITLE);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void updateForCar_notExtended_marksAsExtended()
+            throws NoSuchFieldException {
+        Notification output = mCarNotificationManager.updateForCar(createNotification());
+
+        assertThat(CarAppExtender.isExtended(output)).isTrue();
+
+        assertThat(output.extras.getCharSequence(Notification.EXTRA_TITLE)).isEqualTo(
+                DEFAULT_TITLE);
+        assertThat(output.extras.getCharSequence(Notification.EXTRA_TEXT)).isEqualTo(
+                DEFAULT_TEXT);
+        assertThat(output.contentIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(output.deleteIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(output.color).isEqualTo(Color.GREEN);
+        assertThat(output.getChannelId()).isEqualTo(DEFAULT_CHANNEL);
+        assertThat(output.icon).isEqualTo(mDefaultIcon);
+        // Comparing the largeIcon does not work due to internally it creating another Bitmap and
+        // then not being able to compare
+
+        Notification.Action[] actions = output.actions;
+        assertThat(actions).hasLength(1);
+        Notification.Action action = actions[0];
+        assertThat(action.icon).isEqualTo(mDefaultIcon);
+        assertThat(action.actionIntent).isSameInstanceAs(mDefaultPendingIntent);
+        assertThat(action.title).isEqualTo(DEFAULT_ACTION_TITLE);
+    }
+
+    @Test
+    public void getColorInt_red() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.RED)).isEqualTo(
+                mContext.getColor(R.color.carColorRed));
+    }
+
+    @Test
+    public void getColorInt_red_dark() {
+        setDarkMode();
+        assertThat(mCarNotificationManager.getColorInt(CarColor.RED)).isEqualTo(
+                mContext.getColor(R.color.carColorRed));
+    }
+
+    @Test
+    public void getColorInt_blue() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.BLUE)).isEqualTo(
+                mContext.getColor(R.color.carColorBlue));
+    }
+
+    @Test
+    public void getColorInt_blue_dark() {
+        setDarkMode();
+        assertThat(mCarNotificationManager.getColorInt(CarColor.BLUE)).isEqualTo(
+                mContext.getColor(R.color.carColorBlue));
+    }
+
+    @Test
+    public void getColorInt_green() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.GREEN)).isEqualTo(
+                mContext.getColor(R.color.carColorGreen));
+    }
+
+    @Test
+    public void getColorInt_green_dark() {
+        setDarkMode();
+        assertThat(mCarNotificationManager.getColorInt(CarColor.GREEN)).isEqualTo(
+                mContext.getColor(R.color.carColorGreen));
+    }
+
+    @Test
+    public void getColorInt_yellow() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.YELLOW)).isEqualTo(
+                mContext.getColor(R.color.carColorYellow));
+    }
+
+    @Test
+    public void getColorInt_yellow_dark() {
+        setDarkMode();
+        assertThat(mCarNotificationManager.getColorInt(CarColor.YELLOW)).isEqualTo(
+                mContext.getColor(R.color.carColorYellow));
+    }
+
+    @Test
+    public void getColorInt_custom() {
+        CarColor carColor = CarColor.createCustom(1, 2);
+        assertThat(mCarNotificationManager.getColorInt(carColor)).isEqualTo(1);
+    }
+
+    @Test
+    public void getColorInt_custom_dark() {
+        setDarkMode();
+
+        CarColor carColor = CarColor.createCustom(1, 2);
+        assertThat(mCarNotificationManager.getColorInt(carColor)).isEqualTo(2);
+    }
+
+    @Test
+    public void getColorInt_primary() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.PRIMARY)).isEqualTo(
+                Color.rgb(127, 57, 251));
+        assertThat(mCarNotificationManager.getColorInt(CarColor.PRIMARY)).isNotEqualTo(0);
+    }
+
+    @Test
+    public void getColorInt_primary_dark() {
+        setDarkMode();
+
+        assertThat(mCarNotificationManager.getColorInt(CarColor.PRIMARY)).isEqualTo(
+                Color.rgb(89, 4, 223));
+    }
+
+    @Test
+    public void getColorInt_secondary() {
+        assertThat(mCarNotificationManager.getColorInt(CarColor.SECONDARY)).isEqualTo(
+                Color.rgb(50, 142, 16));
+    }
+
+    @Test
+    public void getColorInt_secondary_dark() {
+        setDarkMode();
+
+        assertThat(mCarNotificationManager.getColorInt(CarColor.SECONDARY)).isEqualTo(
+                Color.rgb(26, 96, 4));
+    }
+
+    private NotificationCompat.Builder createNotification() {
+        NotificationCompat.Builder notification = new NotificationCompat.Builder(mContext,
+                DEFAULT_CHANNEL);
+        notification.setColor(DEFAULT_COLOR);
+        notification.setSmallIcon(mDefaultIcon);
+        notification.setLargeIcon(mDefaultBitmap);
+        notification.setContentText(DEFAULT_TEXT);
+        notification.setContentTitle(DEFAULT_TITLE);
+        notification.setContentIntent(mDefaultPendingIntent);
+        notification.setDeleteIntent(mDefaultPendingIntent);
+        notification.addAction(mDefaultAction);
+
+        return notification;
+    }
+
+    private NotificationCompat.Builder extend(NotificationCompat.Builder notification) {
+        CarAppExtender.Builder extender = new CarAppExtender.Builder();
+        extender.setColor(EXTENDED_COLOR);
+        extender.setContentIntent(mExtendedPendingIntent);
+        extender.setDeleteIntent(mExtendedPendingIntent);
+        extender.setChannelId(EXTENDED_CHANNEL);
+        extender.setContentText(EXTENDED_TEXT);
+        extender.setContentTitle(EXTENDED_TITLE);
+        extender.setLargeIcon(mExtendedBitmap);
+        extender.setSmallIcon(mExtendedIcon);
+        extender.addAction(mExtendedIcon, EXTENDED_ACTION_TITLE, mExtendedPendingIntent);
+
+        notification.extend(extender.build());
+
+        return notification;
+    }
+
+    private void setDarkMode() {
+        mContext.getResources().getConfiguration().uiMode = Configuration.UI_MODE_NIGHT_YES;
+    }
+
+    private void setEmbedded() {
+        shadowOf(mContext.getPackageManager()).setSystemFeature(FEATURE_AUTOMOTIVE, true);
+    }
+}
diff --git a/car/app/app/src/test/java/androidx/car/app/notification/CarPendingIntentTest.java b/car/app/app/src/test/java/androidx/car/app/notification/CarPendingIntentTest.java
new file mode 100644
index 0000000..aadc30d
--- /dev/null
+++ b/car/app/app/src/test/java/androidx/car/app/notification/CarPendingIntentTest.java
@@ -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.
+ */
+
+package androidx.car.app.notification;
+
+import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
+
+import static androidx.car.app.notification.CarPendingIntent.COMPONENT_EXTRA_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.Application;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+
+import androidx.car.app.CarAppService;
+import androidx.car.app.CarContext;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+import java.security.InvalidParameterException;
+
+/** Tests for {@link CarPendingIntent}. */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+public class CarPendingIntentTest {
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final ComponentName mComponentName = new ComponentName(mContext, CarAppService.class);
+    private final Intent mIntent = new Intent("fooAction").setComponent(mComponentName);
+
+    @Test
+    public void getCarApp_returnsTheExpectedPendingIntent() throws PendingIntent.CanceledException {
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(mContext, 1, mIntent,
+                PendingIntent.FLAG_ONE_SHOT);
+
+        pendingIntent.send();
+
+        assertThat(Shadows.shadowOf((Application) mContext).getNextStartedActivity()).isNull();
+
+        Intent broadcastedIntent =
+                Shadows.shadowOf((Application) mContext).getBroadcastIntents().get(0);
+        assertThat(broadcastedIntent.getComponent()).isEqualTo(
+                new ComponentName(mContext, CarAppNotificationBroadcastReceiver.class));
+        assertThat((ComponentName) broadcastedIntent.getParcelableExtra(
+                COMPONENT_EXTRA_KEY)).isEqualTo(mComponentName);
+    }
+
+    @Test
+    public void getCarApp_embedded_returnsTheExpectedPendingIntent()
+            throws PendingIntent.CanceledException {
+        setEmbedded();
+        PendingIntent pendingIntent = CarPendingIntent.getCarApp(mContext, 1, mIntent,
+                PendingIntent.FLAG_ONE_SHOT);
+
+        pendingIntent.send();
+
+        assertThat(Shadows.shadowOf((Application) mContext).getBroadcastIntents()).isEmpty();
+
+        Intent startedActivity = Shadows.shadowOf((Application) mContext).getNextStartedActivity();
+        assertThat(startedActivity.getComponent()).isEqualTo(
+                new ComponentName(mContext, "androidx.car.app.CarAppActivity"));
+    }
+
+    @Test
+    public void validateIntent_self() {
+        CarPendingIntent.validateIntent(mContext, mIntent);
+    }
+
+    @Test
+    public void validateIntent_navigation_query() {
+        CarPendingIntent.validateIntent(mContext,
+                new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:0,0?q=Home")));
+    }
+
+    @Test
+    public void validateIntent_navigation_latLong() {
+        CarPendingIntent.validateIntent(mContext,
+                new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:123.45,234.98")));
+    }
+
+    @Test
+    public void validateIntent_navigation_latLong_query() {
+        CarPendingIntent.validateIntent(mContext,
+                new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:123.45,234"
+                        + ".98?q=Starbucks")));
+    }
+
+    @Test
+    public void validateIntent_navigation_invalidGeo() {
+        assertThrows(InvalidParameterException.class,
+                () -> CarPendingIntent.validateIntent(mContext,
+                        new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:0,r"))));
+    }
+
+    @Test
+    public void validateIntent_phone() {
+        CarPendingIntent.validateIntent(mContext,
+                new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:+1234567")));
+
+        CarPendingIntent.validateIntent(mContext,
+                new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:+1234567")));
+    }
+
+    @Test
+    public void validateIntent_phone_invalidUri() {
+        assertThrows(InvalidParameterException.class,
+                () -> CarPendingIntent.validateIntent(mContext,
+                        new Intent(Intent.ACTION_DIAL).setData(Uri.parse("telrf"))));
+
+        assertThrows(InvalidParameterException.class,
+                () -> CarPendingIntent.validateIntent(mContext,
+                        new Intent(Intent.ACTION_CALL).setData(Uri.parse("telr"))));
+    }
+
+    @Test
+    public void validateIntent_notValid() {
+        assertThrows(SecurityException.class,
+                () -> CarPendingIntent.validateIntent(mContext,
+                        new Intent(Intent.ACTION_VIEW).setComponent(
+                                new ComponentName("foo", "bar"))));
+    }
+
+    @Test
+    public void getCarApp_intentMissingComponent_throwsExpectedException() {
+        assertThrows(InvalidParameterException.class, () -> CarPendingIntent.getCarApp(
+                mContext, 1, mIntent.setComponent(null), 0));
+    }
+
+    @Test
+    public void getCarApp_intentComponentHasWrongPackage_throwsExpectedException() {
+        assertThrows(SecurityException.class, () -> CarPendingIntent.getCarApp(mContext,
+                1, mIntent.setComponent(new ComponentName("foo", "bar")), 0));
+    }
+
+    private void setEmbedded() {
+        shadowOf(mContext.getPackageManager()).setSystemFeature(FEATURE_AUTOMOTIVE, true);
+    }
+}
diff --git a/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java b/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
index 2d5f8ec..6a87fad 100644
--- a/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
@@ -33,6 +33,6 @@
 
     @Test
     public void isValid_apiHigherThanLatest_notValid() {
-        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.getOldest() + 1)).isFalse();
+        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.getLatest() + 1)).isFalse();
     }
 }
diff --git a/car/app/app/src/test/res/values/styles.xml b/car/app/app/src/test/res/values/styles.xml
new file mode 100644
index 0000000..b0e908b
--- /dev/null
+++ b/car/app/app/src/test/res/values/styles.xml
@@ -0,0 +1,24 @@
+<?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="CarAppTheme">
+        <item name="carColorPrimary">#7F39FB</item>
+        <item name="carColorPrimaryDark">#5904DF</item>
+        <item name="carColorSecondary">#328E10</item>
+        <item name="carColorSecondaryDark">#1A6004</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/cardview/cardview/lint-baseline.xml b/cardview/cardview/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/cardview/cardview/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/cleanBuild.sh b/cleanBuild.sh
index 3ee4ae6..5b330b9 100755
--- a/cleanBuild.sh
+++ b/cleanBuild.sh
@@ -1,19 +1,6 @@
 #!/bin/bash
 set -e
 
-echo "IF THIS SCRIPT FIXES YOUR BUILD; OPEN A BUG."
-echo "In nearly all cases, it should not be necessary to run a clean build."
-echo
-echo "You may be more interested in running:"
-echo
-echo "  ./development/diagnose-build-failure/diagnose-build-failure.sh $*"
-echo
-echo "which attempts to diagnose more details about build failures"
-# one case where it is convenient to have a clean build is for double-checking that a build failure isn't due to an incremental build failure
-# another case where it is convenient to have a clean build is for performance testing
-# another case where it is convenient to have a clean build is when you're modifying the build and may have introduced some errors but haven't shared your changes yet (at which point you should have fixed the errors)
-echo
-
 DO_PROMPT=true
 if [ "$1" == "-y" ]; then
   DO_PROMPT=false
@@ -30,7 +17,7 @@
   echo
   echo "For example:"
   echo
-  echo "  $0 assembleDebug # or any other arguments you would normally give to ./gradlew"
+  echo "  $0 assembleRelease # or any other arguments you would normally give to ./gradlew"
   echo
   echo
   echo "-y"
@@ -52,7 +39,7 @@
   # Confirm whether the user wants to run this script instead of diagnose-build-failure.sh
   # Recall that we already mentioned the existence of diagnose-build-failure.sh above
   echo
-  echo "Press <Enter> to run a clean build or Ctrl-C to cancel"
+  echo "Press <Enter> to run a clean build (./gradlew --clean $goals) or Ctrl-C to cancel"
   if [ "$DO_PROMPT" == "true" ]; then
     read response
   fi
@@ -62,25 +49,5 @@
 scriptDir="$(cd $(dirname $0) && pwd)"
 checkoutDir="$(cd $scriptDir/../.. && pwd)"
 export OUT_DIR="$checkoutDir/out"
-function removeCaches() {
-  echo removing caches
-  rm -rf .gradle
-  rm -rf buildSrc/.gradle
-  rm -f local.properties
-  # We move the Gradle cache (via the OUT_DIR) variable during this build to prevent
-  # Other Gradle builds in other directories from sharing it, to be extra-sure that the
-  # build will be clean. However, if the user subsequently runs `./gradlew`, it will use
-  # ~/.gradle as the Gradle cache dir, which could surprise users because it might hold
-  # different state. So, we preemptively remove ~/.gradle too, just in case the user
-  # is going to want that for their following build
-  rm -rf ~/.gradle
-  # AGP should (also) do this automatically (b/170640263)
-  rm -rf appsearch/appsearch/.cxx
-  rm -rf appsearch/local-backend/.cxx
-  rm -rf appsearch/local-storage/.cxx
-  rm -rf $OUT_DIR
-}
-removeCaches
 
-echo running build
-./gradlew --no-daemon $goals
+./gradlew --clean $goals
diff --git a/collection/collection-benchmark/lint-baseline.xml b/collection/collection-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/collection/collection-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/collection/collection-ktx/lint-baseline.xml b/collection/collection-ktx/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/collection/collection-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/collection/collection/build.gradle b/collection/collection/build.gradle
index 3bf83ce..e8acec8 100644
--- a/collection/collection/build.gradle
+++ b/collection/collection/build.gradle
@@ -25,9 +25,6 @@
     id("kotlin")
 }
 
-targetCompatibility = JavaVersion.VERSION_1_7
-sourceCompatibility = JavaVersion.VERSION_1_7
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     annotationProcessor(NULLAWAY)
diff --git a/collection/collection/lint-baseline.xml b/collection/collection/lint-baseline.xml
index 1626564..ec399b3 100644
--- a/collection/collection/lint-baseline.xml
+++ b/collection/collection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -107,7 +107,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/collection/ArrayMap.java"
-            line="76"
+            line="77"
             column="21"/>
     </issue>
 
diff --git a/collection/collection2/README.md b/collection/collection2/README.md
new file mode 100644
index 0000000..106c3b1
--- /dev/null
+++ b/collection/collection2/README.md
@@ -0,0 +1,3 @@
+Prototype implementation of androidx.collection using Kotlin Multiplatform
+
+(Currently blank awaiting successful import)
\ No newline at end of file
diff --git a/collection/integration-tests/testapp/lint-baseline.xml b/collection/integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/collection/integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/compose/androidview/androidview/lint-baseline.xml b/compose/androidview/androidview/lint-baseline.xml
index bf62433..35f9352 100644
--- a/compose/androidview/androidview/lint-baseline.xml
+++ b/compose/androidview/androidview/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/compose/animation/animation-core/api/1.0.0-beta06.txt b/compose/animation/animation-core/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..6ba4265
--- /dev/null
+++ b/compose/animation/animation-core/api/1.0.0-beta06.txt
@@ -0,0 +1,662 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    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;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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/1.0.0-beta07.txt b/compose/animation/animation-core/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..6ba4265
--- /dev/null
+++ b/compose/animation/animation-core/api/1.0.0-beta07.txt
@@ -0,0 +1,662 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    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;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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_1.0.0-beta06.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..67580ac
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,665 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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}) 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    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;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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_1.0.0-beta07.txt b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..67580ac
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,665 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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}) 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    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;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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/res-1.0.0-beta06.txt b/compose/animation/animation-core/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-core/api/res-1.0.0-beta06.txt
diff --git a/compose/animation/animation-core/api/res-1.0.0-beta07.txt b/compose/animation/animation-core/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation-core/api/res-1.0.0-beta07.txt
diff --git a/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..3062208
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,665 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method @kotlin.PublishedApi internal boolean addAnimation(androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?> animation);
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    method @kotlin.PublishedApi internal void removeAnimation(androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?> animation);
+    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;
+    field @kotlin.PublishedApi internal final androidx.compose.runtime.MutableState isSeeking$delegate;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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_1.0.0-beta07.txt b/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..3062208
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,665 @@
+// 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-Lz7ev7o(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-2AXSKHY(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-Cmzki-s(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-t81mtYE(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-rlPqr8Y(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);
+    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);
+    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 get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getValue();
+    method public androidx.compose.animation.core.AnimationVector1D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float value;
+  }
+
+  public final class AnimationVector2D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector2D(float v1, float v2);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public androidx.compose.animation.core.AnimationVector2D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+  }
+
+  public final class AnimationVector3D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector3D(float v1, float v2, float v3);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public androidx.compose.animation.core.AnimationVector3D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float get$metalava_module(int index);
+    method public int getSize$metalava_module();
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    method public androidx.compose.animation.core.AnimationVector4D newVector$metalava_module();
+    method public void reset$metalava_module();
+    method public void set$metalava_module(int index, float value);
+    property public int size;
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    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();
+  }
+
+  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 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.animation.core.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.animation.core.InfiniteAnimationPolicy> {
+  }
+
+  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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 p);
+    method public void setDurationMillis(int p);
+    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 ManualFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public ManualFrameClock(optional long initialTime);
+    method public void advanceClock(long nanos);
+    method public long getCurrentTime();
+    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 currentTime;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class ManualFrameClockKt {
+    method public static void advanceClockMillis(androidx.compose.animation.core.ManualFrameClock, long millis);
+  }
+
+  public final class MutableTransitionState<S> {
+    ctor public MutableTransitionState(S? initialState);
+    method public S! getCurrentState();
+    method public S! getTargetState();
+    method public void setTargetState(S! p);
+    property public final S! currentState;
+    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);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    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 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 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 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;
+  }
+
+  public final class Transition<S> {
+    method @kotlin.PublishedApi internal boolean addAnimation(androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?> animation);
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public boolean isRunning();
+    method @kotlin.PublishedApi internal void removeAnimation(androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?> animation);
+    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;
+    field @kotlin.PublishedApi internal final androidx.compose.runtime.MutableState isSeeking$delegate;
+  }
+
+  public static final class Transition.Segment<S> {
+    ctor public Transition.Segment(S? initialState, S? targetState);
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public infix boolean isTransitioningTo(S?, S? targetState);
+    property public final S! initialState;
+    property public final S! targetState;
+  }
+
+  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);
+    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);
+    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-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
index f3edff4..9dcc564 100644
--- a/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
+++ b/compose/animation/animation-lint/src/main/java/androidx/compose/animation/lint/CrossfadeDetector.kt
@@ -48,7 +48,8 @@
 
     override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (method.isInPackageName(Names.Animation.PackageName)) {
-            val lambdaArgument = node.valueArguments.filterIsInstance<ULambdaExpression>().first()
+            val lambdaArgument = node.valueArguments.filterIsInstance<ULambdaExpression>()
+                .firstOrNull() ?: return
 
             lambdaArgument.findUnreferencedParameters().forEach { unreferencedParameter ->
                 val location = unreferencedParameter.parameter
diff --git a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
index 9b483b1..180b874 100644
--- a/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
+++ b/compose/animation/animation-lint/src/test/java/androidx/compose/animation/lint/CrossfadeDetectorTest.kt
@@ -177,6 +177,9 @@
                 Crossfade(foo) { param -> if (param) { /**/ } else { /**/ } }
                 Crossfade(foo, content = { param -> if (param) { /**/ } else { /**/ } })
 
+                val content : @Composable (Boolean) -> Unit = {}
+                Crossfade(foo, content = content)
+
                 Crossfade(foo) { param ->
                     foo.let {
                         it.let {
diff --git a/compose/animation/animation/api/1.0.0-beta06.txt b/compose/animation/animation/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..165445e
--- /dev/null
+++ b/compose/animation/animation/api/1.0.0-beta06.txt
@@ -0,0 +1,58 @@
+// 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 AnimatedVisibilityKt {
+  }
+
+  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 {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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/1.0.0-beta07.txt b/compose/animation/animation/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..165445e
--- /dev/null
+++ b/compose/animation/animation/api/1.0.0-beta07.txt
@@ -0,0 +1,58 @@
+// 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 AnimatedVisibilityKt {
+  }
+
+  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 {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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.ignore b/compose/animation/animation/api/current.ignore
new file mode 100644
index 0000000..b3595bc
--- /dev/null
+++ b/compose/animation/animation/api/current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.animation.AndroidFlingCalculator_androidKt:
+    Removed class androidx.compose.animation.AndroidFlingCalculator_androidKt
+RemovedClass: androidx.compose.animation.AndroidFlingSpline_androidKt:
+    Removed class androidx.compose.animation.AndroidFlingSpline_androidKt
+
+
+RemovedMethod: androidx.compose.animation.SplineBasedFloatDecayAnimationSpec_androidKt#splineBasedDecay(androidx.compose.ui.unit.Density):
+    Removed method androidx.compose.animation.SplineBasedFloatDecayAnimationSpec_androidKt.splineBasedDecay(androidx.compose.ui.unit.Density)
diff --git a/compose/animation/animation/api/current.txt b/compose/animation/animation/api/current.txt
index 83b6f53..165445e 100644
--- a/compose/animation/animation/api/current.txt
+++ b/compose/animation/animation/api/current.txt
@@ -2,13 +2,7 @@
 package androidx.compose.animation {
 
   public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
-    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
-  }
-
-  public final class AndroidFlingCalculator_androidKt {
-  }
-
-  public final class AndroidFlingSpline_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
   }
 
   public final class AnimatedVisibilityKt {
@@ -29,11 +23,18 @@
   public final class EnterExitTransitionKt {
   }
 
+  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-8_81llA(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
@@ -45,7 +46,7 @@
   }
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
-    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
   }
 
   public final class TransitionKt {
diff --git a/compose/animation/animation/api/public_plus_experimental_1.0.0-beta06.txt b/compose/animation/animation/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..5c07774
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,86 @@
+// 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 AnimatedVisibilityKt {
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  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.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.ui.Alignment expandFrom, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.ui.Alignment.Vertical expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional float initialAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional float targetAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.ui.Alignment shrinkTowards, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi @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);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi @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);
+  }
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationApi {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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_1.0.0-beta07.txt b/compose/animation/animation/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..5c07774
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,86 @@
+// 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 AnimatedVisibilityKt {
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.RowScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static void AnimatedVisibility(androidx.compose.foundation.layout.ColumnScope, boolean visible, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.EnterTransition enter, optional androidx.compose.animation.ExitTransition exit, optional boolean initiallyVisible, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  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.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandHorizontally(optional androidx.compose.ui.Alignment.Horizontal expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandIn(optional androidx.compose.ui.Alignment expandFrom, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> initialSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition expandVertically(optional androidx.compose.ui.Alignment.Vertical expandFrom, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition fadeIn(optional float initialAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition fadeOut(optional float targetAlpha, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkHorizontally(optional androidx.compose.ui.Alignment.Horizontal shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetWidth, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkOut(optional androidx.compose.ui.Alignment shrinkTowards, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntSize> targetSize, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition shrinkVertically(optional androidx.compose.ui.Alignment.Vertical shrinkTowards, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetHeight, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional boolean clip);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideIn(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> initialOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.EnterTransition slideInVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOut(kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,androidx.compose.ui.unit.IntOffset> targetOffset, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutHorizontally(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetX, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Stable public static androidx.compose.animation.ExitTransition slideOutVertically(optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffsetY, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi @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);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi @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);
+  }
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationApi {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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 b18b405..5c07774 100644
--- a/compose/animation/animation/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation/api/public_plus_experimental_current.txt
@@ -2,13 +2,7 @@
 package androidx.compose.animation {
 
   public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
-    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
-  }
-
-  public final class AndroidFlingCalculator_androidKt {
-  }
-
-  public final class AndroidFlingSpline_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
   }
 
   public final class AnimatedVisibilityKt {
@@ -57,11 +51,18 @@
   @kotlin.RequiresOptIn(message="This is an experimental animation API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationApi {
   }
 
+  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-8_81llA(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
@@ -73,7 +74,7 @@
   }
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
-    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
   }
 
   public final class TransitionKt {
diff --git a/compose/animation/animation/api/res-1.0.0-beta06.txt b/compose/animation/animation/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation/api/res-1.0.0-beta06.txt
diff --git a/compose/animation/animation/api/res-1.0.0-beta07.txt b/compose/animation/animation/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/animation/animation/api/res-1.0.0-beta07.txt
diff --git a/compose/animation/animation/api/restricted_1.0.0-beta06.txt b/compose/animation/animation/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..165445e
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,58 @@
+// 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 AnimatedVisibilityKt {
+  }
+
+  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 {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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_1.0.0-beta07.txt b/compose/animation/animation/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..165445e
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,58 @@
+// 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 AnimatedVisibilityKt {
+  }
+
+  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 {
+  }
+
+  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-8_81llA(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
+  }
+
+  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-Baa6hxQ(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.ignore b/compose/animation/animation/api/restricted_current.ignore
new file mode 100644
index 0000000..b3595bc
--- /dev/null
+++ b/compose/animation/animation/api/restricted_current.ignore
@@ -0,0 +1,9 @@
+// Baseline format: 1.0
+RemovedClass: androidx.compose.animation.AndroidFlingCalculator_androidKt:
+    Removed class androidx.compose.animation.AndroidFlingCalculator_androidKt
+RemovedClass: androidx.compose.animation.AndroidFlingSpline_androidKt:
+    Removed class androidx.compose.animation.AndroidFlingSpline_androidKt
+
+
+RemovedMethod: androidx.compose.animation.SplineBasedFloatDecayAnimationSpec_androidKt#splineBasedDecay(androidx.compose.ui.unit.Density):
+    Removed method androidx.compose.animation.SplineBasedFloatDecayAnimationSpec_androidKt.splineBasedDecay(androidx.compose.ui.unit.Density)
diff --git a/compose/animation/animation/api/restricted_current.txt b/compose/animation/animation/api/restricted_current.txt
index 83b6f53..165445e 100644
--- a/compose/animation/animation/api/restricted_current.txt
+++ b/compose/animation/animation/api/restricted_current.txt
@@ -2,13 +2,7 @@
 package androidx.compose.animation {
 
   public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
-    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
-  }
-
-  public final class AndroidFlingCalculator_androidKt {
-  }
-
-  public final class AndroidFlingSpline_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
   }
 
   public final class AnimatedVisibilityKt {
@@ -29,11 +23,18 @@
   public final class EnterExitTransitionKt {
   }
 
+  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-8_81llA(long initialValue);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState-m3E411Q(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();
@@ -45,7 +46,7 @@
   }
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
-    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
   }
 
   public final class TransitionKt {
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 2041280..056774b 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
@@ -49,6 +49,7 @@
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -324,6 +325,7 @@
         }
     }
 
+    @Ignore
     @OptIn(ExperimentalAnimationApi::class)
     @Test
     fun animateVisibilityFadeTest() {
diff --git a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidActualDefaultDecayAnimationSpec.android.kt b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidActualDefaultDecayAnimationSpec.android.kt
index 204e7a1..f1fe969 100644
--- a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidActualDefaultDecayAnimationSpec.android.kt
+++ b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidActualDefaultDecayAnimationSpec.android.kt
@@ -17,17 +17,10 @@
 package androidx.compose.animation
 
 import androidx.compose.animation.core.DecayAnimationSpec
-import androidx.compose.animation.core.generateDecayAnimationSpec
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.LocalDensity
 
 @Composable
+@Deprecated("Replace with rememberSplineBasedDecay<Float>")
 actual fun defaultDecayAnimationSpec(): DecayAnimationSpec<Float> {
-    // This function will internally update the calculation of fling decay when the density changes,
-    // but the reference to the returned spec will not change across calls.
-    val density = LocalDensity.current
-    return remember(density.density) {
-        SplineBasedFloatDecayAnimationSpec(density).generateDecayAnimationSpec()
-    }
-}
\ No newline at end of file
+    return rememberSplineBasedDecay()
+}
diff --git a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.android.kt b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.android.kt
deleted file mode 100644
index b0b18b8..0000000
--- a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.android.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.animation
-
-import androidx.compose.ui.unit.Density
-import kotlin.math.exp
-import kotlin.math.ln
-import kotlin.math.sign
-
-/**
- * Earth's gravity in SI units (m/s^2); used to compute deceleration based on friction.
- */
-private const val GravityEarth = 9.80665f
-private const val InchesPerMeter = 39.37f
-
-/**
- * The default rate of deceleration for a fling if not specified in the
- * [AndroidFlingCalculator] constructor.
- */
-private val DecelerationRate = (ln(0.78) / ln(0.9)).toFloat()
-
-/**
- * Compute the rate of deceleration based on pixel density, physical gravity
- * and a [coefficient of friction][friction].
- */
-private fun computeDeceleration(friction: Float, density: Float): Float =
-    GravityEarth * InchesPerMeter * density * 160f * friction
-
-/**
- * Configuration for Android-feel flinging motion at the given density.
- *
- * @param friction scroll friction.
- * @param density density of the screen. Use LocalDensity to get current density in composition.
- */
-internal class AndroidFlingCalculator(
-    private val friction: Float,
-    val density: Density
-) {
-
-    /**
-     * A density-specific coefficient adjusted to physical values.
-     */
-    private val magicPhysicalCoefficient: Float = computeDeceleration(density)
-
-    /**
-     * Computes the rate of deceleration in pixels based on
-     * the given [density].
-     */
-    private fun computeDeceleration(density: Density) =
-        computeDeceleration(0.84f, density.density)
-
-    private fun getSplineDeceleration(velocity: Float): Double = AndroidFlingSpline.deceleration(
-        velocity,
-        friction * magicPhysicalCoefficient
-    )
-
-    /**
-     * Compute the duration in milliseconds of a fling with an initial velocity of [velocity]
-     */
-    fun flingDuration(velocity: Float): Long {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return (1000.0 * exp(l / decelMinusOne)).toLong()
-    }
-
-    /**
-     * Compute the distance of a fling in units given an initial [velocity] of units/second
-     */
-    fun flingDistance(velocity: Float): Float {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return (
-            friction * magicPhysicalCoefficient
-                * exp(DecelerationRate / decelMinusOne * l)
-            ).toFloat()
-    }
-
-    /**
-     * Compute all interesting information about a fling of initial velocity [velocity].
-     */
-    fun flingInfo(velocity: Float): FlingInfo {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return FlingInfo(
-            initialVelocity = velocity,
-            distance = (
-                friction * magicPhysicalCoefficient
-                    * exp(DecelerationRate / decelMinusOne * l)
-                ).toFloat(),
-            duration = (1000.0 * exp(l / decelMinusOne)).toLong()
-        )
-    }
-
-    /**
-     * Info about a fling started with [initialVelocity]. The units of [initialVelocity]
-     * determine the distance units of [distance] and the time units of [duration].
-     */
-    data class FlingInfo(
-        val initialVelocity: Float,
-        val distance: Float,
-        val duration: Long
-    ) {
-        fun position(time: Long): Float {
-            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
-            return distance * sign(initialVelocity) *
-                AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
-        }
-
-        fun velocity(time: Long): Float {
-            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
-            return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
-                sign(initialVelocity) * distance / duration * 1000.0f
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingSpline.android.kt b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingSpline.android.kt
deleted file mode 100644
index d6d9d8c..0000000
--- a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/AndroidFlingSpline.android.kt
+++ /dev/null
@@ -1,125 +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.compose.animation
-
-import kotlin.math.abs
-import kotlin.math.ln
-
-private const val Inflection = 0.35f // Tension lines cross at (Inflection, 1)
-private const val StartTension = 0.5f
-private const val EndTension = 1.0f
-private const val P1 = StartTension * Inflection
-private const val P2 = 1.0f - EndTension * (1.0f - Inflection)
-
-private fun computeSplineInfo(
-    splinePositions: FloatArray,
-    splineTimes: FloatArray,
-    nbSamples: Int
-) {
-    var xMin = 0.0f
-    var yMin = 0.0f
-    for (i in 0 until nbSamples) {
-        val alpha = i.toFloat() / nbSamples
-        var xMax = 1.0f
-        var x: Float
-        var tx: Float
-        var coef: Float
-        while (true) {
-            x = xMin + (xMax - xMin) / 2.0f
-            coef = 3.0f * x * (1.0f - x)
-            tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x
-            if (abs(tx - alpha) < 1E-5) break
-            if (tx > alpha) xMax = x else xMin = x
-        }
-        splinePositions[i] = coef * ((1.0f - x) * StartTension + x) + x * x * x
-        var yMax = 1.0f
-        var y: Float
-        var dy: Float
-        while (true) {
-            y = yMin + (yMax - yMin) / 2.0f
-            coef = 3.0f * y * (1.0f - y)
-            dy = coef * ((1.0f - y) * StartTension + y) + y * y * y
-            if (abs(dy - alpha) < 1E-5) break
-            if (dy > alpha) yMax = y else yMin = y
-        }
-        splineTimes[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y
-    }
-    splineTimes[nbSamples] = 1.0f
-    splinePositions[nbSamples] = splineTimes[nbSamples]
-}
-
-/**
- * The native Android fling scroll spline and the ability to sample it.
- *
- * Ported from `android.widget.Scroller`.
- */
-internal object AndroidFlingSpline {
-    private const val NbSamples = 100
-    private val SplinePositions = FloatArray(NbSamples + 1)
-    private val SplineTimes = FloatArray(NbSamples + 1)
-
-    init {
-        // TODO This function used to be directly implemented in this init block, but it causes a
-        // crash in the IR compiler.
-        computeSplineInfo(SplinePositions, SplineTimes, NbSamples)
-    }
-
-    /**
-     * Compute an instantaneous fling position along the scroller spline.
-     *
-     * @param time progress through the fling animation from 0-1
-     */
-    fun flingPosition(time: Float): FlingResult {
-        val index = (NbSamples * time).toInt()
-        var distanceCoef = 1f
-        var velocityCoef = 0f
-        if (index < NbSamples) {
-            val tInf = index.toFloat() / NbSamples
-            val tSup = (index + 1).toFloat() / NbSamples
-            val dInf = SplinePositions[index]
-            val dSup = SplinePositions[index + 1]
-            velocityCoef = (dSup - dInf) / (tSup - tInf)
-            distanceCoef = dInf + (time - tInf) * velocityCoef
-        }
-        return FlingResult(
-            distanceCoefficient = distanceCoef,
-            velocityCoefficient = velocityCoef
-        )
-    }
-
-    /**
-     * The rate of deceleration along the spline motion given [velocity] and [friction].
-     */
-    fun deceleration(velocity: Float, friction: Float): Double =
-        ln(Inflection * abs(velocity) / friction.toDouble())
-
-    /**
-     * Result coefficients of a scroll computation
-     */
-    // TODO: pack this into an inline class
-    data class FlingResult(
-        /**
-         * Linear distance traveled from 0-1, from source (0) to destination (1)
-         */
-        val distanceCoefficient: Float,
-        /**
-         * Instantaneous velocity coefficient at this point in the fling expressed in
-         * total distance per unit time
-         */
-        val velocityCoefficient: Float
-    )
-}
\ No newline at end of file
diff --git a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.android.kt b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.android.kt
index 71be999..1e6ace7 100644
--- a/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.android.kt
+++ b/compose/animation/animation/src/androidMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.android.kt
@@ -18,55 +18,11 @@
 
 import android.view.ViewConfiguration
 import androidx.compose.animation.core.DecayAnimationSpec
-import androidx.compose.animation.core.FloatDecayAnimationSpec
 import androidx.compose.animation.core.generateDecayAnimationSpec
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.Density
-import kotlin.math.sign
-
-/**
- * A native Android fling curve decay.
- *
- * @param density density of the display
- */
-class SplineBasedFloatDecayAnimationSpec(density: Density) : FloatDecayAnimationSpec {
-
-    private val flingCalculator = AndroidFlingCalculator(
-        ViewConfiguration.getScrollFriction(),
-        density
-    )
-
-    override val absVelocityThreshold: Float get() = 0f
-
-    private fun flingDistance(startVelocity: Float): Float =
-        flingCalculator.flingDistance(startVelocity) * sign(startVelocity)
-
-    override fun getTargetValue(initialValue: Float, initialVelocity: Float): Float =
-        initialValue + flingDistance(initialVelocity)
-
-    @Suppress("MethodNameUnits")
-    override fun getValueFromNanos(
-        playTimeNanos: Long,
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float {
-        val playTimeMillis = playTimeNanos / 1_000_000L
-        return initialValue + flingCalculator.flingInfo(initialVelocity).position(playTimeMillis)
-    }
-
-    @Suppress("MethodNameUnits")
-    override fun getDurationNanos(initialValue: Float, initialVelocity: Float): Long =
-        flingCalculator.flingDuration(initialVelocity) * 1_000_000L
-
-    @Suppress("MethodNameUnits")
-    override fun getVelocityFromNanos(
-        playTimeNanos: Long,
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float {
-        val playTimeMillis = playTimeNanos / 1_000_000L
-        return flingCalculator.flingInfo(initialVelocity).velocity(playTimeMillis)
-    }
-}
 
 /**
  * Creates a [DecayAnimationSpec] using the native Android fling decay. This can then be used to
@@ -74,5 +30,19 @@
  *
  * @param density density of the display
  */
-fun <T> splineBasedDecay(density: Density): DecayAnimationSpec<T> =
-    SplineBasedFloatDecayAnimationSpec(density).generateDecayAnimationSpec()
\ No newline at end of file
+@Deprecated("Moved to common code", level = DeprecationLevel.HIDDEN)
+@JvmName("splineBasedDecay")
+fun <T> splineBasedDecayDeprecated(density: Density): DecayAnimationSpec<T> =
+    splineBasedDecay(density)
+
+internal actual val platformFlingScrollFriction = ViewConfiguration.getScrollFriction()
+
+@Composable
+actual fun <T> rememberSplineBasedDecay(): DecayAnimationSpec<T> {
+    // This function will internally update the calculation of fling decay when the density changes,
+    // but the reference to the returned spec will not change across calls.
+    val density = LocalDensity.current
+    return remember(density.density) {
+        SplineBasedFloatDecayAnimationSpec(density).generateDecayAnimationSpec()
+    }
+}
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
index b4ea195..5ca4053 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/DefaultDecayAnimationSpec.kt
@@ -23,4 +23,6 @@
  * Create default [DecayAnimationSpec] representing a default fling curve for a platform.
  */
 @Composable
-expect fun defaultDecayAnimationSpec(): DecayAnimationSpec<Float>
\ No newline at end of file
+@Deprecated("Replace with rememberSplineBasedDecay<Float>")
+expect fun defaultDecayAnimationSpec(): DecayAnimationSpec<Float>
+expect fun <T> rememberSplineBasedDecay(): DecayAnimationSpec<T>
\ No newline at end of file
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt
new file mode 100644
index 0000000..0e33a08
--- /dev/null
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/FlingCalculator.kt
@@ -0,0 +1,129 @@
+/*
+ * 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.compose.animation
+
+import androidx.compose.ui.unit.Density
+import kotlin.math.exp
+import kotlin.math.ln
+import kotlin.math.sign
+
+/**
+ * Earth's gravity in SI units (m/s^2); used to compute deceleration based on friction.
+ */
+private const val GravityEarth = 9.80665f
+private const val InchesPerMeter = 39.37f
+
+/**
+ * The default rate of deceleration for a fling if not specified in the
+ * [FlingCalculator] constructor.
+ */
+private val DecelerationRate = (ln(0.78) / ln(0.9)).toFloat()
+
+/**
+ * Compute the rate of deceleration based on pixel density, physical gravity
+ * and a [coefficient of friction][friction].
+ */
+private fun computeDeceleration(friction: Float, density: Float): Float =
+    GravityEarth * InchesPerMeter * density * 160f * friction
+
+/**
+ * Configuration for Android-feel flinging motion at the given density.
+ *
+ * @param friction scroll friction.
+ * @param density density of the screen. Use LocalDensity to get current density in composition.
+ */
+internal class FlingCalculator(
+    private val friction: Float,
+    val density: Density
+) {
+
+    /**
+     * A density-specific coefficient adjusted to physical values.
+     */
+    private val magicPhysicalCoefficient: Float = computeDeceleration(density)
+
+    /**
+     * Computes the rate of deceleration in pixels based on
+     * the given [density].
+     */
+    private fun computeDeceleration(density: Density) =
+        computeDeceleration(0.84f, density.density)
+
+    private fun getSplineDeceleration(velocity: Float): Double = AndroidFlingSpline.deceleration(
+        velocity,
+        friction * magicPhysicalCoefficient
+    )
+
+    /**
+     * Compute the duration in milliseconds of a fling with an initial velocity of [velocity]
+     */
+    fun flingDuration(velocity: Float): Long {
+        val l = getSplineDeceleration(velocity)
+        val decelMinusOne = DecelerationRate - 1.0
+        return (1000.0 * exp(l / decelMinusOne)).toLong()
+    }
+
+    /**
+     * Compute the distance of a fling in units given an initial [velocity] of units/second
+     */
+    fun flingDistance(velocity: Float): Float {
+        val l = getSplineDeceleration(velocity)
+        val decelMinusOne = DecelerationRate - 1.0
+        return (
+            friction * magicPhysicalCoefficient
+                * exp(DecelerationRate / decelMinusOne * l)
+            ).toFloat()
+    }
+
+    /**
+     * Compute all interesting information about a fling of initial velocity [velocity].
+     */
+    fun flingInfo(velocity: Float): FlingInfo {
+        val l = getSplineDeceleration(velocity)
+        val decelMinusOne = DecelerationRate - 1.0
+        return FlingInfo(
+            initialVelocity = velocity,
+            distance = (
+                friction * magicPhysicalCoefficient
+                    * exp(DecelerationRate / decelMinusOne * l)
+                ).toFloat(),
+            duration = (1000.0 * exp(l / decelMinusOne)).toLong()
+        )
+    }
+
+    /**
+     * Info about a fling started with [initialVelocity]. The units of [initialVelocity]
+     * determine the distance units of [distance] and the time units of [duration].
+     */
+    data class FlingInfo(
+        val initialVelocity: Float,
+        val distance: Float,
+        val duration: Long
+    ) {
+        fun position(time: Long): Float {
+            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
+            return distance * sign(initialVelocity) *
+                AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
+        }
+
+        fun velocity(time: Long): Float {
+            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
+            return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
+                sign(initialVelocity) * distance / duration * 1000.0f
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt
new file mode 100644
index 0000000..bebcc8f
--- /dev/null
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedDecay.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.compose.animation
+
+import androidx.compose.animation.core.DecayAnimationSpec
+import androidx.compose.animation.core.generateDecayAnimationSpec
+import androidx.compose.ui.unit.Density
+import kotlin.math.abs
+import kotlin.math.ln
+
+private const val Inflection = 0.35f // Tension lines cross at (Inflection, 1)
+private const val StartTension = 0.5f
+private const val EndTension = 1.0f
+private const val P1 = StartTension * Inflection
+private const val P2 = 1.0f - EndTension * (1.0f - Inflection)
+
+private fun computeSplineInfo(
+    splinePositions: FloatArray,
+    splineTimes: FloatArray,
+    nbSamples: Int
+) {
+    var xMin = 0.0f
+    var yMin = 0.0f
+    for (i in 0 until nbSamples) {
+        val alpha = i.toFloat() / nbSamples
+        var xMax = 1.0f
+        var x: Float
+        var tx: Float
+        var coef: Float
+        while (true) {
+            x = xMin + (xMax - xMin) / 2.0f
+            coef = 3.0f * x * (1.0f - x)
+            tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x
+            if (abs(tx - alpha) < 1E-5) break
+            if (tx > alpha) xMax = x else xMin = x
+        }
+        splinePositions[i] = coef * ((1.0f - x) * StartTension + x) + x * x * x
+        var yMax = 1.0f
+        var y: Float
+        var dy: Float
+        while (true) {
+            y = yMin + (yMax - yMin) / 2.0f
+            coef = 3.0f * y * (1.0f - y)
+            dy = coef * ((1.0f - y) * StartTension + y) + y * y * y
+            if (abs(dy - alpha) < 1E-5) break
+            if (dy > alpha) yMax = y else yMin = y
+        }
+        splineTimes[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y
+    }
+    splineTimes[nbSamples] = 1.0f
+    splinePositions[nbSamples] = splineTimes[nbSamples]
+}
+
+/**
+ * The native Android fling scroll spline and the ability to sample it.
+ *
+ * Ported from `android.widget.Scroller`.
+ */
+internal object AndroidFlingSpline {
+    private const val NbSamples = 100
+    private val SplinePositions = FloatArray(NbSamples + 1)
+    private val SplineTimes = FloatArray(NbSamples + 1)
+
+    init {
+        // TODO This function used to be directly implemented in this init block, but it causes a
+        // crash in the IR compiler.
+        computeSplineInfo(SplinePositions, SplineTimes, NbSamples)
+    }
+
+    /**
+     * Compute an instantaneous fling position along the scroller spline.
+     *
+     * @param time progress through the fling animation from 0-1
+     */
+    fun flingPosition(time: Float): FlingResult {
+        val index = (NbSamples * time).toInt()
+        var distanceCoef = 1f
+        var velocityCoef = 0f
+        if (index < NbSamples) {
+            val tInf = index.toFloat() / NbSamples
+            val tSup = (index + 1).toFloat() / NbSamples
+            val dInf = SplinePositions[index]
+            val dSup = SplinePositions[index + 1]
+            velocityCoef = (dSup - dInf) / (tSup - tInf)
+            distanceCoef = dInf + (time - tInf) * velocityCoef
+        }
+        return FlingResult(
+            distanceCoefficient = distanceCoef,
+            velocityCoefficient = velocityCoef
+        )
+    }
+
+    /**
+     * The rate of deceleration along the spline motion given [velocity] and [friction].
+     */
+    fun deceleration(velocity: Float, friction: Float): Double =
+        ln(Inflection * abs(velocity) / friction.toDouble())
+
+    /**
+     * Result coefficients of a scroll computation
+     */
+    // TODO: pack this into an inline class
+    data class FlingResult(
+        /**
+         * Linear distance traveled from 0-1, from source (0) to destination (1)
+         */
+        val distanceCoefficient: Float,
+        /**
+         * Instantaneous velocity coefficient at this point in the fling expressed in
+         * total distance per unit time
+         */
+        val velocityCoefficient: Float
+    )
+}
+
+fun <T> splineBasedDecay(density: Density): DecayAnimationSpec<T> =
+    SplineBasedFloatDecayAnimationSpec(density).generateDecayAnimationSpec()
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt
new file mode 100644
index 0000000..68e3c8c
--- /dev/null
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/SplineBasedFloatDecayAnimationSpec.kt
@@ -0,0 +1,69 @@
+/*
+ * 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.compose.animation
+
+import androidx.compose.animation.core.FloatDecayAnimationSpec
+import androidx.compose.ui.unit.Density
+import kotlin.math.sign
+
+/**
+ * A native Android fling curve decay.
+ *
+ * @param density density of the display
+ */
+class SplineBasedFloatDecayAnimationSpec(density: Density) :
+    FloatDecayAnimationSpec {
+
+    private val flingCalculator = FlingCalculator(
+        friction = platformFlingScrollFriction,
+        density = density
+    )
+
+    override val absVelocityThreshold: Float get() = 0f
+
+    private fun flingDistance(startVelocity: Float): Float =
+        flingCalculator.flingDistance(startVelocity) * sign(startVelocity)
+
+    override fun getTargetValue(initialValue: Float, initialVelocity: Float): Float =
+        initialValue + flingDistance(initialVelocity)
+
+    @Suppress("MethodNameUnits")
+    override fun getValueFromNanos(
+        playTimeNanos: Long,
+        initialValue: Float,
+        initialVelocity: Float
+    ): Float {
+        val playTimeMillis = playTimeNanos / 1_000_000L
+        return initialValue + flingCalculator.flingInfo(initialVelocity).position(playTimeMillis)
+    }
+
+    @Suppress("MethodNameUnits")
+    override fun getDurationNanos(initialValue: Float, initialVelocity: Float): Long =
+        flingCalculator.flingDuration(initialVelocity) * 1_000_000L
+
+    @Suppress("MethodNameUnits")
+    override fun getVelocityFromNanos(
+        playTimeNanos: Long,
+        initialValue: Float,
+        initialVelocity: Float
+    ): Float {
+        val playTimeMillis = playTimeNanos / 1_000_000L
+        return flingCalculator.flingInfo(initialVelocity).velocity(playTimeMillis)
+    }
+}
+
+internal expect val platformFlingScrollFriction: Float
diff --git a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.desktop.kt b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.desktop.kt
deleted file mode 100644
index 28f71ca..0000000
--- a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingCalculator.desktop.kt
+++ /dev/null
@@ -1,133 +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.compose.animation
-
-import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.unit.Density
-import kotlin.math.exp
-import kotlin.math.ln
-import kotlin.math.sign
-
-// copy-paste of
-// src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingCalculator.android.kt
-
-/**
- * Earth's gravity in SI units (m/s^2); used to compute deceleration based on friction.
- */
-private const val GravityEarth = 9.80665f
-private const val InchesPerMeter = 39.37f
-
-/**
- * The default rate of deceleration for a fling if not specified in the
- * [AndroidFlingCalculator] constructor.
- */
-private val DecelerationRate = (ln(0.78) / ln(0.9)).toFloat()
-
-/**
- * Compute the rate of deceleration based on pixel density, physical gravity
- * and a [coefficient of friction][friction].
- */
-private fun computeDeceleration(friction: Float, density: Float): Float =
-    GravityEarth * InchesPerMeter * density * 160f * friction
-
-/**
- * Configuration for Android-feel flinging motion at the given density.
- *
- * @param friction scroll friction.
- * @param density density of the screen. Use [LocalDensity] to get current density in composition.
- */
-internal class AndroidFlingCalculator(
-    private val friction: Float,
-    val density: Density
-) {
-
-    /**
-     * A density-specific coefficient adjusted to physical values.
-     */
-    private val magicPhysicalCoefficient: Float = computeDeceleration(density)
-
-    /**
-     * Computes the rate of deceleration in pixels based on
-     * the given [density].
-     */
-    private fun computeDeceleration(density: Density) =
-        computeDeceleration(0.84f, density.density)
-
-    private fun getSplineDeceleration(velocity: Float): Double = AndroidFlingSpline.deceleration(
-        velocity,
-        friction * magicPhysicalCoefficient
-    )
-
-    /**
-     * Compute the duration in milliseconds of a fling with an initial velocity of [velocity]
-     */
-    fun flingDuration(velocity: Float): Long {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return (1000.0 * exp(l / decelMinusOne)).toLong()
-    }
-
-    /**
-     * Compute the distance of a fling in units given an initial [velocity] of units/second
-     */
-    fun flingDistance(velocity: Float): Float {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return (
-            friction * magicPhysicalCoefficient
-                * exp(DecelerationRate / decelMinusOne * l)
-            ).toFloat()
-    }
-
-    /**
-     * Compute all interesting information about a fling of initial velocity [velocity].
-     */
-    fun flingInfo(velocity: Float): FlingInfo {
-        val l = getSplineDeceleration(velocity)
-        val decelMinusOne = DecelerationRate - 1.0
-        return FlingInfo(
-            initialVelocity = velocity,
-            distance = (
-                friction * magicPhysicalCoefficient
-                    * exp(DecelerationRate / decelMinusOne * l)
-                ).toFloat(),
-            duration = (1000.0 * exp(l / decelMinusOne)).toLong()
-        )
-    }
-
-    /**
-     * Info about a fling started with [initialVelocity]. The units of [initialVelocity]
-     * determine the distance units of [distance] and the time units of [duration].
-     */
-    data class FlingInfo(
-        val initialVelocity: Float,
-        val distance: Float,
-        val duration: Long
-    ) {
-        fun position(time: Long): Float {
-            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
-            return distance * sign(initialVelocity) *
-                AndroidFlingSpline.flingPosition(splinePos).distanceCoefficient
-        }
-
-        fun velocity(time: Long): Float {
-            val splinePos = if (duration > 0) time / duration.toFloat() else 1f
-            return AndroidFlingSpline.flingPosition(splinePos).velocityCoefficient *
-                distance / duration * 1000.0f
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingSpline.desktop.kt b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingSpline.desktop.kt
deleted file mode 100644
index 163e8ca..0000000
--- a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/AndroidFlingSpline.desktop.kt
+++ /dev/null
@@ -1,128 +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.compose.animation
-
-import kotlin.math.abs
-import kotlin.math.ln
-
-// copy-paste of
-// src/androidMain/kotlin/androidx/compose/foundation/animation/AndroidFlingSpline.android.kt
-
-private const val Inflection = 0.35f // Tension lines cross at (Inflection, 1)
-private const val StartTension = 0.5f
-private const val EndTension = 1.0f
-private const val P1 = StartTension * Inflection
-private const val P2 = 1.0f - EndTension * (1.0f - Inflection)
-
-private fun computeSplineInfo(
-    splinePositions: FloatArray,
-    splineTimes: FloatArray,
-    nbSamples: Int
-) {
-    var xMin = 0.0f
-    var yMin = 0.0f
-    for (i in 0 until nbSamples) {
-        val alpha = i.toFloat() / nbSamples
-        var xMax = 1.0f
-        var x: Float
-        var tx: Float
-        var coef: Float
-        while (true) {
-            x = xMin + (xMax - xMin) / 2.0f
-            coef = 3.0f * x * (1.0f - x)
-            tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x
-            if (abs(tx - alpha) < 1E-5) break
-            if (tx > alpha) xMax = x else xMin = x
-        }
-        splinePositions[i] = coef * ((1.0f - x) * StartTension + x) + x * x * x
-        var yMax = 1.0f
-        var y: Float
-        var dy: Float
-        while (true) {
-            y = yMin + (yMax - yMin) / 2.0f
-            coef = 3.0f * y * (1.0f - y)
-            dy = coef * ((1.0f - y) * StartTension + y) + y * y * y
-            if (abs(dy - alpha) < 1E-5) break
-            if (dy > alpha) yMax = y else yMin = y
-        }
-        splineTimes[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y
-    }
-    splineTimes[nbSamples] = 1.0f
-    splinePositions[nbSamples] = splineTimes[nbSamples]
-}
-
-/**
- * The native Android fling scroll spline and the ability to sample it.
- *
- * Ported from `android.widget.Scroller`.
- */
-internal object AndroidFlingSpline {
-    private const val NbSamples = 100
-    private val SplinePositions = FloatArray(NbSamples + 1)
-    private val SplineTimes = FloatArray(NbSamples + 1)
-
-    init {
-        // TODO This function used to be directly implemented in this init block, but it causes a
-        // crash in the IR compiler.
-        computeSplineInfo(SplinePositions, SplineTimes, NbSamples)
-    }
-
-    /**
-     * Compute an instantaneous fling position along the scroller spline.
-     *
-     * @param time progress through the fling animation from 0-1
-     */
-    fun flingPosition(time: Float): FlingResult {
-        val index = (NbSamples * time).toInt()
-        var distanceCoef = 1f
-        var velocityCoef = 0f
-        if (index < NbSamples) {
-            val tInf = index.toFloat() / NbSamples
-            val tSup = (index + 1).toFloat() / NbSamples
-            val dInf = SplinePositions[index]
-            val dSup = SplinePositions[index + 1]
-            velocityCoef = (dSup - dInf) / (tSup - tInf)
-            distanceCoef = dInf + (time - tInf) * velocityCoef
-        }
-        return FlingResult(
-            distanceCoefficient = distanceCoef,
-            velocityCoefficient = velocityCoef
-        )
-    }
-
-    /**
-     * The rate of deceleration along the spline motion given [velocity] and [friction].
-     */
-    fun deceleration(velocity: Float, friction: Float): Double =
-        ln(Inflection * abs(velocity) / friction.toDouble())
-
-    /**
-     * Result coefficients of a scroll computation
-     */
-    // TODO: pack this into an inline class
-    data class FlingResult(
-        /**
-         * Linear distance traveled from 0-1, from source (0) to destination (1)
-         */
-        val distanceCoefficient: Float,
-        /**
-         * Instantaneous velocity coefficient at this point in the fling expressed in
-         * total distance per unit time
-         */
-        val velocityCoefficient: Float
-    )
-}
\ No newline at end of file
diff --git a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopActualDefaultDecayAnimationSpec.desktop.kt b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopActualDefaultDecayAnimationSpec.desktop.kt
index 9c6af47..f1fe969 100644
--- a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopActualDefaultDecayAnimationSpec.desktop.kt
+++ b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopActualDefaultDecayAnimationSpec.desktop.kt
@@ -17,17 +17,10 @@
 package androidx.compose.animation
 
 import androidx.compose.animation.core.DecayAnimationSpec
-import androidx.compose.animation.core.generateDecayAnimationSpec
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.platform.LocalDensity
 
 @Composable
+@Deprecated("Replace with rememberSplineBasedDecay<Float>")
 actual fun defaultDecayAnimationSpec(): DecayAnimationSpec<Float> {
-    // This function will internally update the calculation of fling decay when the density changes,
-    // but the reference to the returned spec will not change across calls.
-    val density = LocalDensity.current
-    return remember(density.density) {
-        DesktopDefaultDecayAnimationSpec(density).generateDecayAnimationSpec()
-    }
-}
\ No newline at end of file
+    return rememberSplineBasedDecay()
+}
diff --git a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopDefaultDecayAnimationSpec.desktop.kt b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopDefaultDecayAnimationSpec.desktop.kt
deleted file mode 100644
index 728baa9..0000000
--- a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/DesktopDefaultDecayAnimationSpec.desktop.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.compose.animation
-
-import androidx.compose.animation.core.FloatDecayAnimationSpec
-import androidx.compose.ui.unit.Density
-import kotlin.math.sign
-
-internal class DesktopDefaultDecayAnimationSpec(density: Density) : FloatDecayAnimationSpec {
-    // TODO(demin): extract common SplineBasedFlingCalculator if any other OS uses similar
-    //  fling implementation
-    // temporarily we use android implementation of fling decay
-    private val flingCalculator = AndroidFlingCalculator(
-        friction = 0.015f,
-        density = density
-    )
-
-    override val absVelocityThreshold: Float get() = 0f
-
-    private fun flingDistance(startVelocity: Float): Float =
-        flingCalculator.flingDistance(startVelocity) * sign(startVelocity)
-
-    override fun getTargetValue(initialValue: Float, initialVelocity: Float): Float =
-        initialValue + flingDistance(initialVelocity)
-
-    @Suppress("MethodNameUnits")
-    override fun getValueFromNanos(
-        playTimeNanos: Long,
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float {
-        val playTimeMillis = playTimeNanos / 1_000_000L
-        return initialValue + flingCalculator.flingInfo(initialVelocity).position(playTimeMillis)
-    }
-
-    @Suppress("MethodNameUnits")
-    override fun getDurationNanos(initialValue: Float, initialVelocity: Float): Long =
-        flingCalculator.flingDuration(initialVelocity)
-
-    @Suppress("MethodNameUnits")
-    override fun getVelocityFromNanos(
-        playTimeNanos: Long,
-        initialValue: Float,
-        initialVelocity: Float
-    ): Float {
-        val playTimeMillis = playTimeNanos / 1_000_000L
-        return flingCalculator.flingInfo(initialVelocity).velocity(playTimeMillis)
-    }
-}
\ No newline at end of file
diff --git a/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/SplineBasedDecayAnimationSpec.desktop.kt b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/SplineBasedDecayAnimationSpec.desktop.kt
new file mode 100644
index 0000000..de2a36a
--- /dev/null
+++ b/compose/animation/animation/src/desktopMain/kotlin/androidx/compose/animation/SplineBasedDecayAnimationSpec.desktop.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.compose.animation
+
+import androidx.compose.animation.core.DecayAnimationSpec
+import androidx.compose.animation.core.generateDecayAnimationSpec
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalDensity
+
+internal actual val platformFlingScrollFriction = 0.015f
+
+@Composable
+actual fun <T> rememberSplineBasedDecay(): DecayAnimationSpec<T> {
+    // This function will internally update the calculation of fling decay when the density changes,
+    // but the reference to the returned spec will not change across calls.
+    val density = LocalDensity.current
+    return remember(density.density) {
+        SplineBasedFloatDecayAnimationSpec(density).generateDecayAnimationSpec()
+    }
+}
diff --git a/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyBenchmark.kt b/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyBenchmark.kt
deleted file mode 100644
index a3ffd44..0000000
--- a/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyBenchmark.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.testutils.benchmark
-
-import androidx.compose.runtime.Composable
-import androidx.compose.testutils.ComposeTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.benchmarkDrawPerf
-import androidx.compose.testutils.benchmark.benchmarkFirstCompose
-import androidx.compose.testutils.benchmark.benchmarkFirstDraw
-import androidx.compose.testutils.benchmark.benchmarkFirstLayout
-import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
-import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-@LargeTest
-@RunWith(AndroidJUnit4::class)
-class EmptyBenchmark {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val textCaseFactory = { EmptyTestCase() }
-
-    @Test
-    fun first_compose() {
-        benchmarkRule.benchmarkFirstCompose(textCaseFactory)
-    }
-
-    @Test
-    fun first_measure() {
-        benchmarkRule.benchmarkFirstMeasure(textCaseFactory)
-    }
-
-    @Test
-    fun first_layout() {
-        benchmarkRule.benchmarkFirstLayout(textCaseFactory)
-    }
-
-    @Test
-    fun first_draw() {
-        benchmarkRule.benchmarkFirstDraw(textCaseFactory)
-    }
-
-    @Test
-    fun draw() {
-        benchmarkRule.benchmarkDrawPerf(textCaseFactory)
-    }
-}
-
-class EmptyTestCase : ComposeTestCase {
-    @Composable
-    override fun Content() {
-    }
-}
\ No newline at end of file
diff --git a/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyFirstFastBenchmark.kt b/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyFirstFastBenchmark.kt
deleted file mode 100644
index e5b3694..0000000
--- a/compose/benchmark-utils/benchmark/src/androidTest/java/androidx/compose/benchmarkutils/benchmark/EmptyFirstFastBenchmark.kt
+++ /dev/null
@@ -1,73 +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.compose.ui.testutils.benchmark
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.runtime.Composable
-import androidx.compose.testutils.LayeredComposeTestCase
-import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
-import androidx.compose.testutils.benchmark.benchmarkFirstComposeFast
-import androidx.compose.testutils.benchmark.benchmarkFirstDrawFast
-import androidx.compose.testutils.benchmark.benchmarkFirstLayoutFast
-import androidx.compose.testutils.benchmark.benchmarkFirstMeasureFast
-import androidx.test.filters.LargeTest
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-@LargeTest
-@RunWith(AndroidJUnit4::class)
-class EmptyFirstFastBenchmark {
-
-    @get:Rule
-    val benchmarkRule = ComposeBenchmarkRule()
-
-    private val testCaseFactory = { EmptyLayeredTestCase() }
-
-    @Test
-    fun first_compose() {
-        benchmarkRule.benchmarkFirstComposeFast(testCaseFactory)
-    }
-
-    @Test
-    fun first_measure() {
-        benchmarkRule.benchmarkFirstMeasureFast(testCaseFactory)
-    }
-
-    @Test
-    fun first_layout() {
-        benchmarkRule.benchmarkFirstLayoutFast(testCaseFactory)
-    }
-
-    @Test
-    fun first_draw() {
-        benchmarkRule.benchmarkFirstDrawFast(testCaseFactory)
-    }
-}
-
-class EmptyLayeredTestCase : LayeredComposeTestCase {
-    @Composable
-    override fun MeasuredContent() {}
-
-    @Composable
-    override fun ContentWrappers(content: @Composable () -> Unit) {
-        Box {
-            content()
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
index 1765fa0..74f1e03 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarkFirstExtensions.kt
@@ -24,6 +24,7 @@
 import androidx.compose.testutils.ComposeTestCase
 import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.assertNoPendingChanges
+import androidx.compose.testutils.benchmark.android.AndroidTestCase
 import androidx.compose.testutils.doFramesUntilNoChangesPending
 import org.junit.Assert.assertTrue
 
@@ -31,7 +32,7 @@
  * Measures the time of the first composition right after the given test case is added to an
  * already existing hierarchy.
  */
-fun ComposeBenchmarkRule.benchmarkFirstComposeFast(caseFactory: () -> LayeredComposeTestCase) {
+fun ComposeBenchmarkRule.benchmarkFirstCompose(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
         measureRepeated {
             runWithTimingDisabled {
@@ -53,7 +54,7 @@
  * Measures the time of the first measure right after the given test case is added to an already
  * existing hierarchy.
  */
-fun ComposeBenchmarkRule.benchmarkFirstMeasureFast(caseFactory: () -> LayeredComposeTestCase) {
+fun ComposeBenchmarkRule.benchmarkFirstMeasure(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
         measureRepeated {
             runWithTimingDisabled {
@@ -78,7 +79,7 @@
  * Measures the time of the first layout right after the given test case is added to an already
  * existing hierarchy.
  */
-fun ComposeBenchmarkRule.benchmarkFirstLayoutFast(caseFactory: () -> LayeredComposeTestCase) {
+fun ComposeBenchmarkRule.benchmarkFirstLayout(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
         measureRepeated {
             runWithTimingDisabled {
@@ -104,7 +105,7 @@
  * Measures the time of the first draw right after the given test case is added to an already
  * existing hierarchy.
  */
-fun ComposeBenchmarkRule.benchmarkFirstDrawFast(caseFactory: () -> LayeredComposeTestCase) {
+fun ComposeBenchmarkRule.benchmarkFirstDraw(caseFactory: () -> LayeredComposeTestCase) {
     runBenchmarkFor(LayeredCaseAdapter.of(caseFactory)) {
         measureRepeated {
             runWithTimingDisabled {
@@ -130,6 +131,85 @@
 }
 
 /**
+ * Measures the time of the first set content of the given Android test case.
+ */
+fun AndroidBenchmarkRule.benchmarkFirstSetContent(caseFactory: () -> AndroidTestCase) {
+    runBenchmarkFor(caseFactory) {
+        measureRepeated {
+            setupContent()
+            runWithTimingDisabled {
+                disposeContent()
+            }
+        }
+    }
+}
+
+/**
+ * Measures the time of the first measure of the given test case.
+ */
+fun AndroidBenchmarkRule.benchmarkFirstMeasure(caseFactory: () -> AndroidTestCase) {
+    runBenchmarkFor(caseFactory) {
+        measureRepeated {
+            runWithTimingDisabled {
+                setupContent()
+                requestLayout()
+            }
+
+            measure()
+
+            runWithTimingDisabled {
+                disposeContent()
+            }
+        }
+    }
+}
+
+/**
+ * Measures the time of the first layout of the given test case.
+ */
+fun AndroidBenchmarkRule.benchmarkFirstLayout(caseFactory: () -> AndroidTestCase) {
+    runBenchmarkFor(caseFactory) {
+        measureRepeated {
+            runWithTimingDisabled {
+                setupContent()
+                requestLayout()
+                measure()
+            }
+
+            layout()
+
+            runWithTimingDisabled {
+                disposeContent()
+            }
+        }
+    }
+}
+
+/**
+ * Measures the time of the first draw of the given test case.
+ */
+fun AndroidBenchmarkRule.benchmarkFirstDraw(caseFactory: () -> AndroidTestCase) {
+    runBenchmarkFor(caseFactory) {
+        measureRepeated {
+            runWithTimingDisabled {
+                setupContent()
+                requestLayout()
+                measure()
+                layout()
+                drawPrepare()
+            }
+
+            draw()
+
+            runWithTimingDisabled {
+                drawFinish()
+                disposeContent()
+            }
+        }
+    }
+}
+
+/**
  * Runs recompositions until there are no changes pending.
  *
  * @param maxAmountOfStep Max amount of recomposition to perform before giving up and throwing
diff --git a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
index c53a78e..ea64883 100644
--- a/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
+++ b/compose/benchmark-utils/src/main/java/androidx/compose/testutils/benchmark/BenchmarksExtensions.kt
@@ -26,7 +26,6 @@
 import androidx.compose.testutils.benchmark.android.AndroidTestCase
 import androidx.compose.testutils.doFramesUntilNoChangesPending
 import androidx.compose.testutils.recomposeAssertHadChanges
-import androidx.compose.testutils.setupContent
 
 /**
  * Measures measure and layout performance of the given test case by toggling measure constraints.
@@ -146,180 +145,6 @@
 }
 
 /**
- * Measures the time of the first composition of the given compose test case.
- *
- * @param assertNoPendingRecompositions whether the benchmark will fail if there are pending
- * recompositions after the first composition. By default this is true to enforce correctness in
- * the benchmark, but for components that have an initial animation after being composed this can
- * be turned off to benchmark just the first composition without any pending animations.
- */
-fun ComposeBenchmarkRule.benchmarkFirstCompose(
-    caseFactory: () -> ComposeTestCase,
-    assertNoPendingRecompositions: Boolean = true
-) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                createTestCase()
-            }
-
-            emitContent()
-
-            runWithTimingDisabled {
-                if (assertNoPendingRecompositions) {
-                    assertNoPendingChanges()
-                }
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first set content of the given Android test case.
- */
-fun AndroidBenchmarkRule.benchmarkFirstSetContent(caseFactory: () -> AndroidTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            setupContent()
-            runWithTimingDisabled {
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first measure of the given test case.
- */
-fun ComposeBenchmarkRule.benchmarkFirstMeasure(caseFactory: () -> ComposeTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-            }
-
-            measure()
-
-            runWithTimingDisabled {
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first measure of the given test case.
- */
-fun AndroidBenchmarkRule.benchmarkFirstMeasure(caseFactory: () -> AndroidTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-            }
-
-            measure()
-
-            runWithTimingDisabled {
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first layout of the given test case.
- */
-fun ComposeBenchmarkRule.benchmarkFirstLayout(caseFactory: () -> ComposeTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-                measure()
-            }
-
-            layout()
-
-            runWithTimingDisabled {
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first layout of the given test case.
- */
-fun AndroidBenchmarkRule.benchmarkFirstLayout(caseFactory: () -> AndroidTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-                measure()
-            }
-
-            layout()
-
-            runWithTimingDisabled {
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first draw of the given test case.
- */
-fun ComposeBenchmarkRule.benchmarkFirstDraw(caseFactory: () -> ComposeTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-                measure()
-                layout()
-                drawPrepare()
-            }
-
-            draw()
-
-            runWithTimingDisabled {
-                drawFinish()
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
- * Measures the time of the first draw of the given test case.
- */
-fun AndroidBenchmarkRule.benchmarkFirstDraw(caseFactory: () -> AndroidTestCase) {
-    runBenchmarkFor(caseFactory) {
-        measureRepeated {
-            runWithTimingDisabled {
-                setupContent()
-                requestLayout()
-                measure()
-                layout()
-                drawPrepare()
-            }
-
-            draw()
-
-            runWithTimingDisabled {
-                drawFinish()
-                disposeContent()
-            }
-        }
-    }
-}
-
-/**
  *  Measures recomposition time of the hierarchy after changing a state.
  *
  * @param assertOneRecomposition whether the benchmark will fail if there are pending
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
index c091eea..afa7499 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenSignatureTest.kt
@@ -138,7 +138,7 @@
                     override fun clear() { }
                 }
 
-                @OptIn(ComposeCompilerApi::class, InternalComposeApi::class)
+                @OptIn(InternalComposeApi::class)
                 class FakeComposition: ControlledComposition {
                     override val isComposing: Boolean get() = false
                     override val isDisposed: Boolean get() = false
@@ -156,7 +156,7 @@
                     override fun setContent(content: () -> Unit) { }
                 }
 
-                @OptIn(ComposeCompilerApi::class, InternalComposeApi::class)
+                @OptIn(InternalComposeApi::class)
                 class FakeComposer : Composer {
                     override val applier: Applier<*> = FakeApplier()
                     override val inserting: Boolean get() = true
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 64dc648..eb31c69 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
@@ -80,7 +80,6 @@
             """
            @file:OptIn(
              InternalComposeApi::class,
-             ComposeCompilerApi::class
            )
            package test
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
index 97e9519..5f0aad8 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractIrTransformTest.kt
@@ -165,6 +165,7 @@
         @Language("kotlin")
         source: String,
         expectedTransformed: String,
+        @Language("kotlin")
         extra: String = "",
         validator: (element: IrElement) -> Unit = { },
         dumpTree: Boolean = false,
@@ -205,6 +206,11 @@
                     "${it.groupValues[1]}<>"
                 }
             }
+            .replace(
+                Regex("(sourceInformationMarkerStart\\(%composer, )([-\\d]+)")
+            ) {
+                "${it.groupValues[1]}<>"
+            }
             // replace source information with source it references
             .replace(
                 Regex(
@@ -213,10 +219,15 @@
                 )
             ) {
                 "${it.groupValues[1]}\"${
-                generateSourceInfo(it.groupValues[3], source)
+                generateSourceInfo(it.groupValues[4], source)
                 }\")"
             }
             .replace(
+                Regex("(sourceInformation(MarkerStart)?\\(.*)\"(.*)\"\\)")
+            ) {
+                "${it.groupValues[1]}\"${generateSourceInfo(it.groupValues[3], source)}\")"
+            }
+            .replace(
                 Regex(
                     "(composableLambda[N]?\\" +
                         "([^\"\\n]*)\"(.*)\"\\)"
@@ -234,16 +245,15 @@
             ) {
                 "${it.groupValues[1]}<>"
             }
-            // composableLambdaInstance(<>, true, )
+            // composableLambdaInstance(<>, true)
             .replace(
                 Regex(
-                    "(composableLambdaInstance\\()([-\\d]+, (true|false), (null|\"(.*)\")\\))"
+                    "(composableLambdaInstance\\()([-\\d]+, (true|false))"
                 )
             ) {
                 val callStart = it.groupValues[1]
                 val tracked = it.groupValues[3]
-                val sourceInfo = it.groupValues[5]
-                "$callStart<>, $tracked, \"${generateSourceInfo(sourceInfo, source)}\")"
+                "$callStart<>, $tracked"
             }
             // composableLambda(%composer, <>, true)
             .replace(
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
index 0c6ce92..9cddb39 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ClassStabilityTransformTests.kt
@@ -543,7 +543,8 @@
         """
             @Composable
             fun A(y: Any?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<A()>,<A(Empt...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(X(li...>,<A(X(li...>,<A(NonB...>,<A(NonB...>,<A(Stab...>,<A(Unst...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<A()>,<A(Empt...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Sing...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(Doub...>,<A(X(li...>,<A(X(li...>,<A(NonB...>,<A(NonB...>,<A(Stab...>,<A(Unst...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0010
@@ -674,7 +675,8 @@
             }
             @Composable
             fun A(y: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<A(X(li...>,<A(Stab...>,<A(Unst...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<A(X(li...>,<A(Stab...>,<A(Unst...>:Test.kt")
               used(y)
               A(X(listOf(StableClass())), %composer, 0b1000)
               A(StableDelegateProp(), %composer, 0)
@@ -708,7 +710,8 @@
         """
             @Composable
             fun A(y: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<A(Wrap...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<A(Wrap...>:Test.kt")
               used(y)
               A(Wrapper(Foo()), %composer, Wrapper.%stable)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
@@ -746,7 +749,8 @@
         """
             @Composable
             fun <V> B(value: V, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B)<A(Wrap...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B)<A(Wrap...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
@@ -762,7 +766,8 @@
             }
             @Composable
             fun <T> X(items: List<T>, itemContent: Function3<T, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(X)P(1)*<itemCo...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(X)P(1)*<itemCo...>:Test.kt")
               val %dirty = %changed
               val tmp0_iterator = items.iterator()
               while (tmp0_iterator.hasNext()) {
@@ -775,14 +780,16 @@
             }
             @Composable
             fun C(items: List<String>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(C)<X(item...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(C)<X(item...>:Test.kt")
               X(items, ComposableSingletons%TestKt.lambda-1, %composer, 0b1000)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 C(items, %composer, %changed or 0b0001)
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<String, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<A(item...>,<A(Wrap...>:Test.kt") { item: String, %composer: Composer?, %changed: Int ->
+              val lambda-1: Function3<String, Composer, Int, Unit> = composableLambdaInstance(<>, false) { item: String, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<A(item...>,<A(Wrap...>:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(item)) 0b0100 else 0b0010
@@ -837,7 +844,8 @@
             }
             @Composable
             fun A(y: Int, x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)P(1)<B(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
               used(y)
               B(x, %composer, 0b1000)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
@@ -846,7 +854,8 @@
             }
             @Composable
             fun B(x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B):Test.kt")
               used(x)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 B(x, %composer, %changed or 0b0001)
@@ -876,7 +885,8 @@
             }
             @Composable
             fun A(y: Int, x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)P(1)<B(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)P(1)<B(x)>:Test.kt")
               used(y)
               B(x, %composer, 0b1000)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
@@ -885,7 +895,8 @@
             }
             @Composable
             fun B(x: Any, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B):Test.kt")
               used(x)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 B(x, %composer, %changed or 0b0001)
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
index bacb9b6..bfdaddc 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/CodegenMetadataTests.kt
@@ -38,7 +38,7 @@
             object Main { @JvmStatic fun main() { MyClass::class.java.kotlin.primaryConstructor!!.isAccessible = true } }
             """,
             fileName,
-            true
+            false
         )
         val main = loader.loadClass("Main").methods.single { it.name == "main" }
         main.invoke(null)
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
index 4f6b12d..b32e4ce 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
@@ -25,10 +25,11 @@
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import kotlin.reflect.KClass
 
-@RunWith(ComposeRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 23,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeRobolectricTestRunner.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeRobolectricTestRunner.kt
deleted file mode 100644
index b27ef4f..0000000
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeRobolectricTestRunner.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.compiler.plugins.kotlin
-
-import org.junit.runners.model.FrameworkMethod
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.internal.bytecode.InstrumentationConfiguration
-
-class ComposeRobolectricTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
-    override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration {
-        val builder = InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
-        builder.doNotInstrumentPackage("androidx.compose")
-        builder.doNotInstrumentPackage("androidx.ui")
-        return builder.build()
-    }
-}
\ No newline at end of file
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 e36dde9..db49fa0 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
@@ -19,10 +19,11 @@
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 
 /* ktlint-disable max-line-length */
-@RunWith(ComposeRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 23,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
index 91ea302..ae972e1 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
@@ -35,7 +35,6 @@
         """
             @file:OptIn(
               InternalComposeApi::class,
-              ComposeCompilerApi::class
             )
             package test
 
@@ -68,7 +67,8 @@
             val bar: Int
               @Composable @JvmName(name = "getBar")
               get() {
-                %composer.startReplaceableGroup(<>, "C:Test.kt#2487m")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C:Test.kt#2487m")
                 val tmp0 = 123
                 %composer.endReplaceableGroup()
                 return tmp0
@@ -76,7 +76,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<bar>:Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<bar>:Test.kt#2487m")
               bar
               %composer.endReplaceableGroup()
             }
@@ -111,7 +112,8 @@
               @NonRestartableComposable
               @Composable
               override fun bar(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>, "C(bar):Test.kt#2487m")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C(bar):Test.kt#2487m")
                 %composer.endReplaceableGroup()
               }
               static val %stable: Int = 0
@@ -144,18 +146,21 @@
             @NonRestartableComposable
             @Composable
             fun Wat(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Wat):Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Wat):Test.kt#2487m")
               %composer.endReplaceableGroup()
             }
             @NonRestartableComposable
             @Composable
             fun Foo(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Foo)<Wat()>,<goo()>,<baz()>:Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Foo)<Wat()>,<goo()>,<baz()>:Test.kt#2487m")
               Wat(%composer, 0)
               @NonRestartableComposable
               @Composable
               fun goo(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>, "C(goo)<Wat()>:Test.kt#2487m")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C(goo)<Wat()>:Test.kt#2487m")
                 Wat(%composer, 0)
                 %composer.endReplaceableGroup()
               }
@@ -163,7 +168,8 @@
                 @NonRestartableComposable
                 @Composable
                 fun baz(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(baz)<Wat()>:Test.kt#2487m")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(baz)<Wat()>:Test.kt#2487m")
                   Wat(%composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -246,7 +252,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<Exampl...>:Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<Exampl...>:Test.kt#2487m")
               Example(%composer, 0)
               %composer.endReplaceableGroup()
             }
@@ -268,16 +275,19 @@
         """
             @Composable
             fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<conten...>:Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<conten...>:Test.kt#2487m")
               content(%composer, 0b1110 and %changed)
               %composer.endReplaceableGroup()
             }
             @NonRestartableComposable
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Test)<Exampl...>:Test.kt#2487m")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt#2487m")
               Example({ %composer: Composer?, %changed: Int ->
-                %composer.startReplaceableGroup(<>, "C:Test.kt#2487m")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C:Test.kt#2487m")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -301,7 +311,8 @@
             val myProperty: Function0<Unit>
               @Composable @JvmName(name = "getMyProperty")
               get() {
-                %composer.startReplaceableGroup(<>, "C:Test.kt#2487m")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C:Test.kt#2487m")
                 val tmp0 = {
                 }
                 %composer.endReplaceableGroup()
@@ -370,7 +381,8 @@
             """
                 @Composable
                 fun Wrapper(block: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>, "C(Wrapper)<block(...>:Test.kt#2487m")
+                  %composer = %composer.startRestartGroup(<>)
+                  sourceInformation(%composer, "C(Wrapper)<block(...>:Test.kt#2487m")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(block)) 0b0100 else 0b0010
@@ -386,7 +398,8 @@
                 }
                 @Composable
                 fun Leaf(text: String, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>, "C(Leaf):Test.kt#2487m")
+                  %composer = %composer.startRestartGroup(<>)
+                  sourceInformation(%composer, "C(Leaf):Test.kt#2487m")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
@@ -402,14 +415,17 @@
                 }
                 @Composable
                 fun Test(value: Int, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt#2487m")
+                  %composer = %composer.startRestartGroup(<>)
+                  sourceInformation(%composer, "C(Test):Test.kt#2487m")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(value)) 0b0100 else 0b0010
                   }
                   if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
-                    %composer.startMovableGroup(<>, value, "<Wrappe...>")
-                    Wrapper(composableLambda(%composer, <>, true, "C<Leaf("...>:Test.kt#2487m") { %composer: Composer?, %changed: Int ->
+                    %composer.startMovableGroup(<>, value)
+                    sourceInformation(%composer, "<Wrappe...>")
+                    Wrapper(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+                      sourceInformation(%composer, "C<Leaf("...>:Test.kt#2487m")
                       if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                         Leaf("Value %value", %composer, 0)
                       } else {
@@ -487,17 +503,20 @@
             """
                 @Composable
                 fun composeVector(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>, "C(composeVector)<emit>:Test.kt#2487m")
+                  %composer = %composer.startRestartGroup(<>)
+                  sourceInformation(%composer, "C(composeVector)<emit>:Test.kt#2487m")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(composable)) 0b0100 else 0b0010
                   }
                   if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     emit({ %composer: Composer?, %changed: Int ->
-                      %composer.startReplaceableGroup(<>, "C<emit>:Test.kt#2487m")
+                      %composer.startReplaceableGroup(<>)
+                      sourceInformation(%composer, "C<emit>:Test.kt#2487m")
                       if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                         emit({ %composer: Composer?, %changed: Int ->
-                          %composer.startReplaceableGroup(<>, "C<compos...>:Test.kt#2487m")
+                          %composer.startReplaceableGroup(<>)
+                          sourceInformation(%composer, "C<compos...>:Test.kt#2487m")
                           if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                             composable(%composer, 0b1110 and %dirty)
                           } else {
@@ -519,7 +538,8 @@
                 }
                 @Composable
                 fun emit(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(emit)<compos...>:Test.kt#2487m")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(emit)<compos...>:Test.kt#2487m")
                   composable(%composer, 0b1110 and %changed)
                   %composer.endReplaceableGroup()
                 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index d7f5794..943df22 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -35,7 +35,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
                 NA()
               }
@@ -61,9 +62,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 %composer.endReplaceableGroup()
               } else {
@@ -94,13 +97,16 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A(a)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A(a)>")
                 A(a, %composer, 0)
                 %composer.endReplaceableGroup()
               } else {
-                %composer.startReplaceableGroup(<>, "<A(b)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A(b)>")
                 A(b, %composer, 0)
                 %composer.endReplaceableGroup()
               }
@@ -128,7 +134,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<B()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<B()>:Test.kt")
               if (B(%composer, 0)) {
                 NA()
               } else {
@@ -162,13 +169,16 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
-              if (%composer.startReplaceableGroup(<>, "<B(a)>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
+              if (%composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "<B(a)>")
               val tmp0_group = B(a, %composer, 0)
               %composer.endReplaceableGroup()
               tmp0_group) {
                 NA()
-              } else if (%composer.startReplaceableGroup(<>, "<B(b)>")
+              } else if (%composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "<B(b)>")
               val tmp1_group = B(b, %composer, 0)
               %composer.endReplaceableGroup()
               tmp1_group) {
@@ -198,7 +208,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val tmp0_subject = x
               when {
                 tmp0_subject == 0 -> {
@@ -235,21 +246,25 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val tmp0_subject = x
               when {
                 tmp0_subject == 0 -> {
-                  %composer.startReplaceableGroup(<>, "<A(a)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(a)>")
                   A(a, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
                 tmp0_subject == 0b0001 -> {
-                  %composer.startReplaceableGroup(<>, "<A(b)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(b)>")
                   A(b, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
                 else -> {
-                  %composer.startReplaceableGroup(<>, "<A(c)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(c)>")
                   A(c, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -278,23 +293,27 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val y = val tmp0_subject = x
               when {
                 tmp0_subject == 0 -> {
-                  %composer.startReplaceableGroup(<>, "<R(a)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<R(a)>")
                   val tmp0_group = R(a, %composer, 0)
                   %composer.endReplaceableGroup()
                   tmp0_group
                 }
                 tmp0_subject == 0b0001 -> {
-                  %composer.startReplaceableGroup(<>, "<R(b)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<R(b)>")
                   val tmp1_group = R(b, %composer, 0)
                   %composer.endReplaceableGroup()
                   tmp1_group
                 }
                 else -> {
-                  %composer.startReplaceableGroup(<>, "<R(c)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<R(c)>")
                   val tmp2_group = R(c, %composer, 0)
                   %composer.endReplaceableGroup()
                   tmp2_group
@@ -324,20 +343,24 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               when {
                 x < 0 -> {
-                  %composer.startReplaceableGroup(<>, "<A(a)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(a)>")
                   A(a, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
                 x > 30 -> {
-                  %composer.startReplaceableGroup(<>, "<A(b)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(b)>")
                   A(b, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
                 else -> {
-                  %composer.startReplaceableGroup(<>, "<A(c)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(c)>")
                   A(c, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -366,10 +389,12 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               when {
                 x < 0 -> {
-                  %composer.startReplaceableGroup(<>, "<A(a)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(a)>")
                   A(a, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -379,7 +404,8 @@
                   NA()
                 }
                 else -> {
-                  %composer.startReplaceableGroup(<>, "<A(b)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A(b)>")
                   A(b, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -409,15 +435,18 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               when {
-                %composer.startReplaceableGroup(<>, "<R(a)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<R(a)>")
                 val tmp0_group = x == R(a, %composer, 0)
                 %composer.endReplaceableGroup()
                 tmp0_group -> {
                   NA()
                 }
-                %composer.startReplaceableGroup(<>, "<R(b)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<R(b)>")
                 val tmp1_group = x > R(b, %composer, 0)
                 %composer.endReplaceableGroup()
                 tmp1_group -> {
@@ -452,16 +481,20 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "")
               when {
-                %composer.startReplaceableGroup(<>, "<R(a)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<R(a)>")
                 val tmp0_group = x == R(a, %composer, 0)
                 %composer.endReplaceableGroup()
                 tmp0_group -> {
                   NA()
                 }
-                %composer.startReplaceableGroup(<>, "<R(b)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<R(b)>")
                 val tmp1_group = x > R(b, %composer, 0)
                 %composer.endReplaceableGroup()
                 tmp1_group -> {
@@ -492,7 +525,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val tmp0_safe_receiver = x
               when {
                 tmp0_safe_receiver == null -> {
@@ -501,7 +535,8 @@
                   null
                 }
                 else -> {
-                  %composer.startReplaceableGroup(<>, "<A()>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A()>")
                   tmp0_safe_receiver.A(%composer, 0b1110 and %changed)
                   %composer.endReplaceableGroup()
                 }
@@ -525,11 +560,13 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val y = val tmp0_elvis_lhs = x
               when {
                 tmp0_elvis_lhs == null -> {
-                  %composer.startReplaceableGroup(<>, "<R()>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<R()>")
                   val tmp0_group = R(%composer, 0)
                   %composer.endReplaceableGroup()
                   tmp0_group
@@ -562,7 +599,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(i)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
               val tmp0_iterator = items.iterator()
               while (tmp0_iterator.hasNext()) {
                 val i = tmp0_iterator.next()
@@ -590,8 +628,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<P(i)>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<P(i)>")
               val tmp0_iterator = items.iterator()
               while (tmp0_iterator.hasNext()) {
                 val i = tmp0_iterator.next()
@@ -620,7 +660,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<L()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<L()>:Test.kt")
               val tmp0_iterator = L(%composer, 0).iterator()
               while (tmp0_iterator.hasNext()) {
                 val i = tmp0_iterator.next()
@@ -650,7 +691,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(item...>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(item...>:Test.kt")
               while (items.isNotEmpty()) {
                 val item = items.removeAt(items.size - 1)
                 P(item, %composer, 0)
@@ -679,8 +721,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: MutableList<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<P(item...>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<P(item...>")
               while (items.isNotEmpty()) {
                 val item = items.removeAt(items.size - 1)
                 P(item, %composer, 0)
@@ -709,7 +753,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<B()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<B()>:Test.kt")
               while (B(%composer, 0)) {
                 print("hello world")
               }
@@ -735,8 +780,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<B()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<B()>")
               while (B(%composer, 0)) {
                 print("hello world")
               }
@@ -764,7 +811,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<B()>,<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<B()>,<A()>:Test.kt")
               while (B(%composer, 0)) {
                 A(%composer, 0)
               }
@@ -791,8 +839,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A(b)>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<B()>,<A(a)>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<B()>,<A(a)>")
               while (B(%composer, 0)) {
                 A(a, %composer, 0)
               }
@@ -820,9 +870,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 %composer.endReplaceableGroup()
                 %composer.endReplaceableGroup()
@@ -853,7 +905,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
               if (x > 0) {
                 %composer.endReplaceableGroup()
                 return
@@ -880,9 +933,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 val tmp1_return = 1
                 %composer.endReplaceableGroup()
@@ -915,7 +970,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
               if (x > 0) {
                 val tmp1_return = 1
                 %composer.endReplaceableGroup()
@@ -944,7 +1000,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(%composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>,<R()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>,<R()>:Test.kt")
               A(%composer, 0)
               val tmp0 = R(%composer, 0)
               %composer.endReplaceableGroup()
@@ -968,9 +1025,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Example)<R()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<R()>:Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<R()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<R()>")
                 val tmp1_return = R(%composer, 0)
                 %composer.endReplaceableGroup()
                 %composer.endReplaceableGroup()
@@ -1011,7 +1070,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
               while (items.hasNext()) {
                 val i = items.next()
                 val j = i
@@ -1019,13 +1079,15 @@
                 val l = i
                 P(i, %composer, 0)
                 if (i == 0) {
-                  %composer.startReplaceableGroup(<>, "<P(j)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<P(j)>")
                   P(j, %composer, 0)
                   %composer.endReplaceableGroup()
                   %composer.endReplaceableGroup()
                   return
                 } else {
-                  %composer.startReplaceableGroup(<>, "<P(k)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<P(k)>")
                   P(k, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -1060,7 +1122,8 @@
         """
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)*<P(i)>,<P(l)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>,<P(l)>:Test.kt")
               while (items.hasNext()) {
                 val i = items.next()
                 val j = i
@@ -1068,7 +1131,8 @@
                 val l = i
                 P(i, %composer, 0)
                 if (i == 0) {
-                  %composer.startReplaceableGroup(<>, "<P(j)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<P(j)>")
                   P(j, %composer, 0)
                   %composer.endReplaceableGroup()
                   %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
@@ -1076,7 +1140,8 @@
                   }
                   return
                 } else {
-                  %composer.startReplaceableGroup(<>, "<P(k)>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<P(k)>")
                   P(k, %composer, 0)
                   %composer.endReplaceableGroup()
                 }
@@ -1107,7 +1172,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(i)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
               while (items.hasNext()) {
                 val i = items.next()
                 if (i == 0) {
@@ -1138,7 +1204,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(i)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>:Test.kt")
               while (items.hasNext()) {
                 val i = items.next()
                 P(i, %composer, 0)
@@ -1172,7 +1239,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<P(i)>,<P(j)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<P(i)>,<P(j)>:Test.kt")
               while (items.hasNext()) {
                 val i = items.next()
                 val j = i
@@ -1208,8 +1276,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<P(i)>,<P(i)>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<P(i)>,<P(i)>")
               while (items.hasNext()) {
                 val i = items.next()
                 P(i, %composer, 0)
@@ -1243,9 +1313,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>, "<P(i)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<P(i)>")
                 val i = items.next()
                 if (i == 0) {
                   %composer.endReplaceableGroup()
@@ -1278,9 +1350,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>, "<P(i)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<P(i)>")
                 val i = items.next()
                 P(i, %composer, 0)
                 if (i == 0) {
@@ -1314,9 +1388,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(items: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               while (items.hasNext()) {
-                %composer.startReplaceableGroup(<>, "<P(i)>,<P(i)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<P(i)>,<P(i)>")
                 val i = items.next()
                 P(i, %composer, 0)
                 if (i == 0) {
@@ -1349,7 +1425,8 @@
             @NonRestartableComposable
             @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
               while (a.hasNext()) {
                 val x = a.next()
                 if (x > 100) {
@@ -1385,10 +1462,12 @@
             @NonRestartableComposable
             @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
               a@while (a.hasNext()) {
                 val x = a.next()
-                %composer.startReplaceableGroup(<>, "*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<A()>")
                 b@while (b.hasNext()) {
                   val y = b.next()
                   if (y == x) {
@@ -1436,13 +1515,15 @@
             @NonRestartableComposable
             @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A()>:Test.kt")
               a@while (a.hasNext()) {
                 val x = a.next()
                 if (x == 0) {
                   break
                 }
-                %composer.startReplaceableGroup(<>, "*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<A()>")
                 b@while (b.hasNext()) {
                   val y = b.next()
                   if (y == 0) {
@@ -1485,10 +1566,13 @@
             @NonRestartableComposable
             @Composable
             fun Example(a: Iterator<Int>, b: Iterator<Int>, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<A()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<A()>")
               a@while (a.hasNext()) {
-                %composer.startReplaceableGroup(<>, "*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<A()>")
                 b@while (b.hasNext()) {
                   A(%composer, 0)
                 }
@@ -1519,10 +1603,13 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A()>")
-                %composer.startReplaceableGroup(<>, "*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<A()>")
                 while (x > 0) {
                   A(%composer, 0)
                 }
@@ -1555,9 +1642,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A()>,*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A()>,*<A()>")
                 A(%composer, 0)
                 while (x > 0) {
                   A(%composer, 0)
@@ -1588,9 +1677,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "*<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "*<A()>")
                 while (x > 0) {
                   A(%composer, 0)
                 }
@@ -1620,9 +1711,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               while (x > 0) {
-                %composer.startMovableGroup(<>, x, "<A()>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 %composer.endMovableGroup()
               }
@@ -1650,12 +1743,15 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               while (x > 0) {
-                %composer.startMovableGroup(<>, x, "<A(a)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(a)>")
                 A(a, %composer, 0)
                 %composer.endMovableGroup()
-                %composer.startMovableGroup(<>, x + 1, "<A(b)>")
+                %composer.startMovableGroup(<>, x + 1)
+                sourceInformation(%composer, "<A(b)>")
                 A(b, %composer, 0)
                 %composer.endMovableGroup()
               }
@@ -1681,9 +1777,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A(b)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A(b)>:Test.kt")
               while (x > 0) {
-                %composer.startMovableGroup(<>, x, "<A(a)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(a)>")
                 A(a, %composer, 0)
                 %composer.endMovableGroup()
                 A(b, %composer, 0)
@@ -1710,10 +1808,12 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A(a)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A(a)>:Test.kt")
               while (x > 0) {
                 A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x, "<A(b)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(b)>")
                 A(b, %composer, 0)
                 %composer.endMovableGroup()
               }
@@ -1740,10 +1840,12 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<A(a)>,<A(c)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<A(a)>,<A(c)>:Test.kt")
               while (x > 0) {
                 A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x, "<A(b)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(b)>")
                 A(b, %composer, 0)
                 %composer.endMovableGroup()
                 A(c, %composer, 0)
@@ -1767,8 +1869,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
-              %composer.startMovableGroup(<>, x, "<A()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
+              %composer.startMovableGroup(<>, x)
+              sourceInformation(%composer, "<A()>")
               A(%composer, 0)
               %composer.endMovableGroup()
               %composer.endReplaceableGroup()
@@ -1791,8 +1895,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A(b)>:Test.kt")
-              %composer.startMovableGroup(<>, x, "<A(a)>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A(b)>:Test.kt")
+              %composer.startMovableGroup(<>, x)
+              sourceInformation(%composer, "<A(a)>")
               A(a, %composer, 0)
               %composer.endMovableGroup()
               A(b, %composer, 0)
@@ -1816,9 +1922,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<A(a)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<A(a)>:Test.kt")
               A(a, %composer, 0)
-              %composer.startMovableGroup(<>, x, "<A(b)>")
+              %composer.startMovableGroup(<>, x)
+              sourceInformation(%composer, "<A(b)>")
               A(b, %composer, 0)
               %composer.endMovableGroup()
               %composer.endReplaceableGroup()
@@ -1842,10 +1950,13 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "")
-                %composer.startMovableGroup(<>, x, "<A()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 %composer.endMovableGroup()
                 %composer.endReplaceableGroup()
@@ -1875,10 +1986,13 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A(b)>")
-                %composer.startMovableGroup(<>, x, "<A(a)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A(b)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(a)>")
                 A(a, %composer, 0)
                 %composer.endMovableGroup()
                 A(b, %composer, 0)
@@ -1909,11 +2023,14 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (x > 0) {
-                %composer.startReplaceableGroup(<>, "<A(a)>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<A(a)>")
                 A(a, %composer, 0)
-                %composer.startMovableGroup(<>, x, "<A(b)>")
+                %composer.startMovableGroup(<>, x)
+                sourceInformation(%composer, "<A(b)>")
                 A(b, %composer, 0)
                 %composer.endMovableGroup()
                 %composer.endReplaceableGroup()
@@ -1940,8 +2057,10 @@
             @NonRestartableComposable
             @Composable
             fun Example(a: Int, b: Int, c: Int, d: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
-              %composer.startMovableGroup(<>, %composer.joinKey(%composer.joinKey(%composer.joinKey(a, b), c), d), "<A()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
+              %composer.startMovableGroup(<>, %composer.joinKey(%composer.joinKey(%composer.joinKey(a, b), c), d))
+              sourceInformation(%composer, "<A()>")
               A(%composer, 0)
               %composer.endMovableGroup()
               %composer.endReplaceableGroup()
@@ -1965,9 +2084,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)*<R()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)*<R()>:Test.kt")
               while (x > 0) {
-                %composer.startMovableGroup(<>, R(%composer, 0), "<A()>")
+                %composer.startMovableGroup(<>, R(%composer, 0))
+                sourceInformation(%composer, "<A()>")
                 A(%composer, 0)
                 %composer.endMovableGroup()
               }
@@ -1989,9 +2110,11 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<P(y)>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<P(y)>:Test.kt")
               val y =
-              %composer.startMovableGroup(<>, x, "<R()>")
+              %composer.startMovableGroup(<>, x)
+              sourceInformation(%composer, "<R()>")
               val tmp0 = R(%composer, 0)
               %composer.endMovableGroup()
               tmp0
@@ -2017,14 +2140,18 @@
             @NonRestartableComposable
             @Composable
             fun Example(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Example):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val tmp0 = if (x > 0) {
-                %composer.startReplaceableGroup(<>, "")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "")
                 val tmp4_group =
-                val tmp3_group = if (%composer.startReplaceableGroup(<>, "<B()>")
+                val tmp3_group = if (%composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<B()>")
                 val tmp1_group = B(%composer, 0)
                 %composer.endReplaceableGroup()
-                tmp1_group) 1 else if (%composer.startReplaceableGroup(<>, "<B()>")
+                tmp1_group) 1 else if (%composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<B()>")
                 val tmp2_group = B(%composer, 0)
                 %composer.endReplaceableGroup()
                 tmp2_group) 2 else 3
@@ -2091,8 +2218,10 @@
             @NonRestartableComposable
             @Composable
             fun Simple(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Simple)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<A()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Simple)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<A()>")
               run {
                 A(%composer, 0)
               }
@@ -2103,8 +2232,10 @@
             @NonRestartableComposable
             @Composable
             fun WithReturn(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(WithReturn)<A()>:Test.kt")
-              %composer.startReplaceableGroup(<>, "*<A()>")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(WithReturn)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "*<A()>")
               run {
                 A(%composer, 0)
                 %composer.endReplaceableGroup()
@@ -2118,7 +2249,8 @@
             @NonRestartableComposable
             @Composable
             fun NoCalls(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(NoCalls)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(NoCalls)<A()>:Test.kt")
               run {
                 println("hello world")
               }
@@ -2128,7 +2260,8 @@
             @NonRestartableComposable
             @Composable
             fun NoCallsAfter(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(NoCallsAfter)*<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(NoCallsAfter)*<A()>:Test.kt")
               run {
                 A(%composer, 0)
               }
@@ -2154,7 +2287,8 @@
         """
             @Composable
             fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<A(c)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<A(c)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -2168,10 +2302,12 @@
                     null
                   }
                   else -> {
-                    %composer.startReplaceableGroup(<>, "*<A(b)>")
+                    %composer.startReplaceableGroup(<>)
+                    sourceInformation(%composer, "*<A(b)>")
                     tmp0_safe_receiver.let { it: Int ->
                       if (it > 0) {
-                        %composer.startReplaceableGroup(<>, "<A(a)>")
+                        %composer.startReplaceableGroup(<>)
+                        sourceInformation(%composer, "<A(a)>")
                         A(a, %composer, 0)
                         %composer.endReplaceableGroup()
                       } else {
@@ -2211,7 +2347,8 @@
         """
             @Composable
             fun Example(x: Int?, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<A()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<A()>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -2249,7 +2386,8 @@
         """
             @Composable
             fun <T> provided(value: T, %composer: Composer?, %changed: Int): State<T> {
-              %composer.startReplaceableGroup(<>, "C(provided)*<rememb...>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(provided)*<rememb...>:Test.kt")
               val tmp0 = remember({
                 val tmp0_return = mutableStateOf(
                   value = value
@@ -2282,7 +2420,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Test)*<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Test)*<A()>:Test.kt")
               val tmp0 =
               val tmp1_group = x.let { it: Int ->
                 A(%composer, 0)
@@ -2309,7 +2448,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<W>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<W>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 W(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -2320,7 +2460,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<A()>:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<A()>:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   A(%composer, 0)
                 } else {
@@ -2344,10 +2485,12 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<IW>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<IW>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 IW({ %composer: Composer?, %changed: Int ->
-                  %composer.startReplaceableGroup(<>, "C<A()>:Test.kt")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C<A()>:Test.kt")
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     A(%composer, 0)
                   } else {
@@ -2383,7 +2526,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Wrap>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Wrap>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 Wrap(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -2394,9 +2538,11 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<effect>:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<effect>:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
-                  %composer.startReplaceableGroup(<>, "*<effect>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "*<effect>")
                   repeat(number) { it: Int ->
                     effects[it] = effect({
                       0
@@ -2437,7 +2583,8 @@
         """
             @Composable
             fun Test(value: InlineClass, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)P(0:InlineClass)<A()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)P(0:InlineClass)<A()>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(value.value)) 0b0100 else 0b0010
@@ -2606,7 +2753,8 @@
         """
             @Composable
             fun Test01(p0: Int, p1: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test01):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test01):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2634,7 +2782,8 @@
             }
             @Composable
             fun Test02(p0: Int, p1: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test02)P(!2,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test02)P(!2,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2662,7 +2811,8 @@
             }
             @Composable
             fun Test03(p0: Int, p2: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test03)P(!1,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test03)P(!1,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2690,7 +2840,8 @@
             }
             @Composable
             fun Test04(p0: Int, p2: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test04)P(!1,2,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test04)P(!1,2,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2718,7 +2869,8 @@
             }
             @Composable
             fun Test05(p0: Int, p3: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test05)P(!1,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test05)P(!1,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2746,7 +2898,8 @@
             }
             @Composable
             fun Test06(p0: Int, p3: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test06)P(!1,3,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test06)P(!1,3,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p0)) 0b0100 else 0b0010
@@ -2774,7 +2927,8 @@
             }
             @Composable
             fun Test07(p1: Int, p0: Int, p2: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test07)P(1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test07)P(1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2802,7 +2956,8 @@
             }
             @Composable
             fun Test08(p1: Int, p0: Int, p3: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test08)P(1!1,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test08)P(1!1,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2830,7 +2985,8 @@
             }
             @Composable
             fun Test09(p1: Int, p2: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test09)P(1,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test09)P(1,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2858,7 +3014,8 @@
             }
             @Composable
             fun Test00(p1: Int, p2: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test00)P(1,2,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test00)P(1,2,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2886,7 +3043,8 @@
             }
             @Composable
             fun Test11(p1: Int, p3: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test11)P(1,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test11)P(1,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2914,7 +3072,8 @@
             }
             @Composable
             fun Test12(p1: Int, p3: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test12)P(1,3,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test12)P(1,3,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p1)) 0b0100 else 0b0010
@@ -2942,7 +3101,8 @@
             }
             @Composable
             fun Test13(p2: Int, p0: Int, p1: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test13)P(2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test13)P(2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -2970,7 +3130,8 @@
             }
             @Composable
             fun Test14(p2: Int, p0: Int, p3: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test14)P(2!1,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test14)P(2!1,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -2998,7 +3159,8 @@
             }
             @Composable
             fun Test15(p2: Int, p1: Int, p0: Int, p3: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test15)P(2,1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test15)P(2,1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -3026,7 +3188,8 @@
             }
             @Composable
             fun Test16(p2: Int, p1: Int, p3: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test16)P(2,1,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test16)P(2,1,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -3054,7 +3217,8 @@
             }
             @Composable
             fun Test17(p2: Int, p3: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test17)P(2,3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test17)P(2,3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -3082,7 +3246,8 @@
             }
             @Composable
             fun Test18(p2: Int, p3: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test18)P(2,3,1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test18)P(2,3,1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p2)) 0b0100 else 0b0010
@@ -3110,7 +3275,8 @@
             }
             @Composable
             fun Test19(p3: Int, p0: Int, p1: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test19)P(3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test19)P(3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3138,7 +3304,8 @@
             }
             @Composable
             fun Test20(p3: Int, p0: Int, p2: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test20)P(3!1,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test20)P(3!1,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3166,7 +3333,8 @@
             }
             @Composable
             fun Test21(p3: Int, p1: Int, p0: Int, p2: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test21)P(3,1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test21)P(3,1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3194,7 +3362,8 @@
             }
             @Composable
             fun Test22(p3: Int, p1: Int, p2: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test22)P(3,1,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test22)P(3,1,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3222,7 +3391,8 @@
             }
             @Composable
             fun Test23(p3: Int, p2: Int, p0: Int, p1: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test23)P(3,2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test23)P(3,2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3250,7 +3420,8 @@
             }
             @Composable
             fun Test24(p3: Int, p2: Int, p1: Int, p0: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test24)P(3,2,1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test24)P(3,2,1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(p3)) 0b0100 else 0b0010
@@ -3300,7 +3471,8 @@
         expectedTransformed = """
             @Composable
             fun Test(value: LocalInlineClass, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)P(0:c#runtime.tests.LocalInlineClass):Test.kt#992ot2")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)P(0:c#runtime.tests.LocalInlineClass):Test.kt#992ot2")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(value.value)) 0b0100 else 0b0010
@@ -3340,7 +3512,8 @@
         expectedTransformed = """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<b()>,<c()>,<d()>,<A(b(),>,<B()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<b()>,<c()>,<d()>,<A(b(),>,<B()>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(b(%composer, 0), c(%composer, 0), d(%composer, 0), %composer, 0)
                 B(%composer, 0)
@@ -3388,7 +3561,8 @@
             class SomeClass {
               var a: String = "Test"
               fun onCreate() {
-                setContent(composableLambdaInstance(<>, true, "C<B(a)>,<B(a)>:Test.kt") { %composer: Composer?, %changed: Int ->
+                setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     B(a, %composer, 0)
                     B(a, %composer, 0)
@@ -3402,7 +3576,8 @@
             }
             fun Test() {
               var a = "Test"
-              setContent(composableLambdaInstance(<>, true, "C<B(a)>,<B(a)>:Test.kt") { %composer: Composer?, %changed: Int ->
+              setContent(composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<B(a)>,<B(a)>:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   B(a, %composer, 0)
                   B(a, %composer, 0)
@@ -3443,7 +3618,8 @@
         expectedTransformed = """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<W>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<W>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 W(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -3454,13 +3630,16 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<IW>:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<IW>:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   IW({ %composer: Composer?, %changed: Int ->
-                    %composer.startReplaceableGroup(<>, "C<T(2)>,<T(4)>:Test.kt")
+                    %composer.startReplaceableGroup(<>)
+                    sourceInformation(%composer, "C<T(2)>,<T(4)>:Test.kt")
                     if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                       T(2, %composer, 0b0110)
-                      %composer.startReplaceableGroup(<>, "*<T(3)>")
+                      %composer.startReplaceableGroup(<>)
+                      sourceInformation(%composer, "*<T(3)>")
                       repeat(3) { it: Int ->
                         T(3, %composer, 0b0110)
                       }
@@ -3478,4 +3657,192 @@
             }
         """
     )
+
+    @Test
+    fun testInlineReadOnlySourceLocations() = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            val current
+                @Composable
+                @ReadOnlyComposable
+                get() = 0
+
+            @Composable
+            @ReadOnlyComposable
+            fun calculateSometing(): Int {
+                return 0;
+            }
+
+            @Composable
+            fun Test() {
+                val c = current
+                val cl = calculateSometing()
+                Layout {
+                    Text("${'$'}c ${'$'}cl")
+                }
+            }
+        """,
+        """
+            val current: Int
+              @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+              get() {
+                sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+                val tmp0 = 0
+                sourceInformationMarkerEnd(%composer)
+                return tmp0
+              }
+            @Composable
+            @ReadOnlyComposable
+            fun calculateSometing(%composer: Composer?, %changed: Int): Int {
+              sourceInformationMarkerStart(%composer, <>, "C(calculateSometing):Test.kt")
+              val tmp0 = 0
+              sourceInformationMarkerEnd(%composer)
+              return tmp0
+            }
+            @Composable
+            fun Test(%composer: Composer?, %changed: Int) {
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+              if (%changed !== 0 || !%composer.skipping) {
+                val c = current
+                val cl = calculateSometing(%composer, 0)
+                Layout({ %composer: Composer?, %changed: Int ->
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C<Text("...>:Test.kt")
+                  if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
+                    Text("%c %cl", %composer, 0)
+                  } else {
+                    %composer.skipToGroupEnd()
+                  }
+                  %composer.endReplaceableGroup()
+                }, %composer, 0)
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+                Test(%composer, %changed or 0b0001)
+              }
+            }
+        """,
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable
+            inline fun Layout(content: @Composable () -> Unit) { content() }
+
+            @Composable
+            fun Text(text: String) { }
+        """
+    )
+
+    @Test
+    fun testReadOnlyInlineValSourceLocations() = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.ReadOnlyComposable
+
+            class CurrentHolder {
+                inline val current: Int
+                    @ReadOnlyComposable
+                    @Composable
+                    get() = 0
+            }
+
+            class HolderHolder {
+                private val _currentHolder = CurrentHolder()
+                val current: Int
+                    @ReadOnlyComposable
+                    @Composable
+                    get() = _currentHolder.current
+            }
+
+            val holderHolder = HolderHolder()
+
+            @Composable
+            @ReadOnlyComposable
+            fun calculateSometing(): Int {
+                return 0;
+            }
+
+            @Composable
+            fun Test() {
+                val c = holderHolder.current
+                val cl = calculateSometing()
+                Layout {
+                    Text("${'$'}c ${'$'}cl")
+                }
+            }
+        """,
+        """
+            @StabilityInferred(parameters = 0)
+            class CurrentHolder {
+              val current: Int
+                @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+                get() {
+                  sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
+                  val tmp0 = 0
+                  sourceInformationMarkerEnd(%composer)
+                  return tmp0
+                }
+              static val %stable: Int = 0
+            }
+            @StabilityInferred(parameters = 0)
+            class HolderHolder {
+              val _currentHolder: CurrentHolder = CurrentHolder()
+              val current: Int
+                @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
+                get() {
+                  sourceInformationMarkerStart(%composer, <>, "C<curren...>:Test.kt")
+                  val tmp0 = _currentHolder.current
+                  sourceInformationMarkerEnd(%composer)
+                  return tmp0
+                }
+              static val %stable: Int = 0
+            }
+            val holderHolder: HolderHolder = HolderHolder()
+            @Composable
+            @ReadOnlyComposable
+            fun calculateSometing(%composer: Composer?, %changed: Int): Int {
+              sourceInformationMarkerStart(%composer, <>, "C(calculateSometing):Test.kt")
+              val tmp0 = 0
+              sourceInformationMarkerEnd(%composer)
+              return tmp0
+            }
+            @Composable
+            fun Test(%composer: Composer?, %changed: Int) {
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<curren...>,<calcul...>,<Layout>:Test.kt")
+              if (%changed !== 0 || !%composer.skipping) {
+                val c = holderHolder.current
+                val cl = calculateSometing(%composer, 0)
+                Layout({ %composer: Composer?, %changed: Int ->
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C<Text("...>:Test.kt")
+                  if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
+                    Text("%c %cl", %composer, 0)
+                  } else {
+                    %composer.skipToGroupEnd()
+                  }
+                  %composer.endReplaceableGroup()
+                }, %composer, 0)
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+                Test(%composer, %changed or 0b0001)
+              }
+            }
+        """,
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable
+            inline fun Layout(content: @Composable () -> Unit) { content() }
+
+            @Composable
+            fun Text(text: String) { }
+        """
+    )
 }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
index 9b4fca9..8ccb434 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
@@ -33,7 +33,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)")
               if (%changed !== 0 || !%composer.skipping) {
                 A(a, %composer, 0)
                 A(b, %composer, 0)
@@ -86,7 +87,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)")
               if (%changed !== 0 || !%composer.skipping) {
                 W(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -97,7 +99,7 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   A(%composer, 0)
                 } else {
@@ -121,7 +123,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)")
               if (%changed !== 0 || !%composer.skipping) {
                 IW({ %composer: Composer?, %changed: Int ->
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
index 1c8d410..0f07375 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
@@ -63,7 +63,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(1)>,<B()>,<B(2)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(1)>,<B()>,<B(2)>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(1, %composer, 0b0110)
                 B(0, %composer, 0, 0b0001)
@@ -96,7 +97,8 @@
         """
             @Composable
             fun Example(foo: Foo, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)P(0:Foo):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)P(0:Foo):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -117,7 +119,8 @@
             }
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Exampl...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Exampl...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 Example(Foo(0), %composer, 0, 0b0001)
               } else {
@@ -145,7 +148,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(0,>,<A(a>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(0,>,<A(a>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(0, 1, 2, 0, 0, %composer, 0b000110110110, 0b00011000)
                 A(0, 0, 2, 0, 0, %composer, 0b000110000110, 0b00011010)
@@ -173,7 +177,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%default and 0b0001 === 0 && %composer.changed(x)) 0b0100 else 0b0010
@@ -217,7 +222,8 @@
         """
             @Composable
             fun A(a: Int, b: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -331,7 +337,8 @@
         """
             @Composable
             fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val %dirty = %changed
               val %dirty1 = %changed1
               val %dirty2 = %changed2
@@ -703,7 +710,8 @@
         """
             @Composable
             fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Int, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val %dirty = %changed
               val %dirty1 = %changed1
               val %dirty2 = %changed2
@@ -1085,7 +1093,8 @@
         """
             @Composable
             fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Foo?, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int, a23: Int, a24: Int, a25: Int, a26: Int, a27: Int, a28: Int, a29: Int, a30: Int, a31: Foo?, %composer: Composer?, %changed: Int, %changed1: Int, %changed2: Int, %changed3: Int, %default: Int, %default1: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val %dirty = %changed
               val %dirty1 = %changed1
               val %dirty2 = %changed2
@@ -1419,7 +1428,8 @@
               @NonRestartableComposable
               @Composable
               fun foo(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-                %composer.startReplaceableGroup(<>, "C(foo):Test.kt")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C(foo):Test.kt")
                 if (%default and 0b0001 !== 0) {
                   x = 0
                 }
@@ -1432,7 +1442,8 @@
               @NonRestartableComposable
               @Composable
               fun Example(%composer: Composer?, %changed: Int) {
-                %composer.startReplaceableGroup(<>, "C(Example)<foo()>:Test.kt")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "C(Example)<foo()>:Test.kt")
                 foo(0, %composer, 0b01110000 and %changed shl 0b0011, 0b0001)
                 %composer.endReplaceableGroup()
               }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index 1bbc039..de0dc0e 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -19,8 +19,8 @@
 import org.intellij.lang.annotations.Language
 import org.junit.Test
 
-class FunctionBodySkippingTransformTests : ComposeIrTransformTest() {
-    private fun comparisonPropagation(
+abstract class FunctionBodySkippingTransfomrTestsBase : ComposeIrTransformTest() {
+    protected fun comparisonPropagation(
         @Language("kotlin")
         unchecked: String,
         @Language("kotlin")
@@ -44,6 +44,9 @@
         """.trimIndent(),
         dumpTree = dumpTree
     )
+}
+
+class FunctionBodySkippingTransformTests : FunctionBodySkippingTransfomrTestsBase() {
 
     @Test
     fun testIfInLambda(): Unit = comparisonPropagation(
@@ -69,7 +72,8 @@
         """
             @Composable
             fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Wrap>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Wrap>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -89,14 +93,17 @@
                   y = 0
                 }
                 used(y)
-                Wrap(composableLambda(%composer, <>, true, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+                Wrap(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C:Test.kt")
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     if (x > 0) {
-                      %composer.startReplaceableGroup(<>, "<A(x)>")
+                      %composer.startReplaceableGroup(<>)
+                      sourceInformation(%composer, "<A(x)>")
                       A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
                       %composer.endReplaceableGroup()
                     } else {
-                      %composer.startReplaceableGroup(<>, "<A(x)>")
+                      %composer.startReplaceableGroup(<>)
+                      sourceInformation(%composer, "<A(x)>")
                       A(x, 0, %composer, 0b1110 and %dirty, 0b0010)
                       %composer.endReplaceableGroup()
                     }
@@ -133,7 +140,8 @@
               Example(class <no name provided> : A {
                 @Composable
                 override fun compute(it: Int, %composer: Composer?, %changed: Int) {
-                  %composer = %composer.startRestartGroup(<>, "C(compute)<comput...>:Test.kt")
+                  %composer = %composer.startRestartGroup(<>)
+                  sourceInformation(%composer, "C(compute)<comput...>:Test.kt")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
@@ -183,7 +191,8 @@
         """
             @Composable
             fun Button(colors: ButtonColors, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Button)<getCol...>,<Text("...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Button)<getCol...>,<Text("...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(colors)) 0b0100 else 0b0010
@@ -199,12 +208,14 @@
             }
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Button>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Button>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 Button(class <no name provided> : ButtonColors {
                   @Composable
                   override fun getColor(%composer: Composer?, %changed: Int): Color {
-                    %composer.startReplaceableGroup(<>, "C(getColor)<condit...>:Test.kt")
+                    %composer.startReplaceableGroup(<>)
+                    sourceInformation(%composer, "C(getColor)<condit...>:Test.kt")
                     val tmp0 = if (condition(%composer, 0)) {
                       Companion.Red
                     } else {
@@ -305,7 +316,8 @@
         """
             @Composable
             fun RowColumnImpl(orientation: LayoutOrientation, modifier: Modifier?, arrangement: Vertical?, crossAxisAlignment: Horizontal?, crossAxisSize: SizeMode?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(RowColumnImpl)P(5,4!1,2,3)<conten...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(RowColumnImpl)P(5,4!1,2,3)<conten...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -373,7 +385,8 @@
             }
             @Composable
             fun Column(modifier: Modifier?, verticalArrangement: Vertical?, horizontalGravity: Horizontal?, content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Column)P(2,3,1)<RowCol...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Column)P(2,3,1)<RowCol...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -445,7 +458,8 @@
         """
             @Composable
             fun SimpleBox(modifier: Modifier?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(SimpleBox):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(SimpleBox):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -481,7 +495,8 @@
         """
             @Composable
             fun Example(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%default and 0b0001 === 0 && %composer.changed(a)) 0b0100 else 0b0010
@@ -528,7 +543,8 @@
         """
             @Composable
             fun Example(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<Inner(...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<Inner(...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
@@ -536,7 +552,8 @@
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                 @Composable
                 fun Inner(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(Inner)<A(a)>:Test.kt")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(Inner)<A(a)>:Test.kt")
                   A(a, %composer, 0b1110 and %dirty)
                   %composer.endReplaceableGroup()
                 }
@@ -574,11 +591,13 @@
             @Composable
             @NonRestartableComposable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(Example)<Call()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<Call()>:Test.kt")
               Call(%composer, 0)
               val tmp0_iterator = 0 .. 1.iterator()
               while (tmp0_iterator.hasNext()) {
-                %composer.startReplaceableGroup(<>, "<Call()>,<Call()>")
+                %composer.startReplaceableGroup(<>)
+                sourceInformation(%composer, "<Call()>,<Call()>")
                 val index = tmp0_iterator.next()
                 Call(%composer, 0)
                 if (condition()) {
@@ -618,7 +637,8 @@
         """
             @Composable
             fun SimpleBox(modifier: Modifier?, shape: Shape?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(SimpleBox):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(SimpleBox):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -677,7 +697,8 @@
         """
             @Composable
             fun SimpleBox(modifier: Modifier?, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(SimpleBox)P(1)<conten...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(SimpleBox)P(1)<conten...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -714,7 +735,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -743,7 +765,8 @@
         """
             val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<A(x)>,<B(y)>:") { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -778,7 +801,8 @@
         """
             val foo: Function4<Int, Foo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<A(x)>,<B(y)>:") { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+              val lambda-1: Function4<Int, Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, y: Foo, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<A(x)>,<B(y)>:Test.kt")
                 A(x, %composer, 0b1110 and %changed)
                 B(y, %composer, 0b1000)
               }
@@ -803,7 +827,8 @@
         """
             @Composable
             fun SomeThing(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(SomeThing)<conten...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(SomeThing)<conten...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
@@ -819,7 +844,8 @@
             }
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<SomeTh...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<SomeTh...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 SomeThing(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -830,7 +856,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   val id = object
                 } else {
@@ -854,7 +881,8 @@
         """
             @Composable
             fun B(values: IntArray, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B):Test.kt")
               val %dirty = %changed
               %composer.startReplaceableGroup(values.size)
               val tmp0_iterator = values.iterator()
@@ -893,7 +921,8 @@
         """
             @Composable
             fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B):Test.kt")
               val %dirty = %changed
               %composer.startReplaceableGroup(values.size)
               val tmp0_iterator = values.iterator()
@@ -932,7 +961,8 @@
         """
             @Composable
             fun B(values: Array<out Foo>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B):Test.kt")
               print(values)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 B(*values, %composer, %changed or 0b0001)
@@ -962,7 +992,8 @@
               var counter: Int = 0
               @Composable
               fun A(%composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>, "C(A):Test.kt")
+                %composer = %composer.startRestartGroup(<>)
+                sourceInformation(%composer, "C(A):Test.kt")
                 if (%changed and 0b0001 !== 0 || !%composer.skipping) {
                   print("hello world")
                 } else {
@@ -975,7 +1006,8 @@
               }
               @Composable
               fun B(%composer: Composer?, %changed: Int) {
-                %composer = %composer.startRestartGroup(<>, "C(B):Test.kt")
+                %composer = %composer.startRestartGroup(<>)
+                sourceInformation(%composer, "C(B):Test.kt")
                 print(counter)
                 val tmp0_rcvr = <this>
                 %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
@@ -1003,7 +1035,8 @@
         """
             @Composable
             fun Example(a: Int, b: Int, c: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<makeIn...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<makeIn...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1072,7 +1105,8 @@
         """
             @Composable
             fun Wrap(y: Int, content: Function3<@[ParameterName(name = 'x')] Int, Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Wrap)P(1)<conten...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Wrap)P(1)<conten...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
@@ -1091,7 +1125,8 @@
             }
             @Composable
             fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Wrap(1...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Wrap(1...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1111,7 +1146,8 @@
                   y = 0
                 }
                 used(y)
-                Wrap(10, composableLambda(%composer, <>, true, "C<A(x)>:Test.kt") { it: Int, %composer: Composer?, %changed: Int ->
+                Wrap(10, composableLambda(%composer, <>, true) { it: Int, %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C<A(x)>:Test.kt")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(it)) 0b0100 else 0b0010
@@ -1148,7 +1184,8 @@
         """
             @Composable
             fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int, %default: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Test)<A(x,>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x,>:Test.kt")
               if (%default and 0b0001 !== 0) {
                 x = 0
               }
@@ -1176,7 +1213,8 @@
         """
             val test: Function3<Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C<A(x)>:") { x: Int, %composer: Composer?, %changed: Int ->
+              val lambda-1: Function3<Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { x: Int, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C<A(x)>:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -1202,7 +1240,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int): Int {
-              %composer.startReplaceableGroup(<>, "C(Test)<A()>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
               val tmp0 = A(0, 0, %composer, 0, 0b0011)
               %composer.endReplaceableGroup()
               return tmp0
@@ -1223,7 +1262,8 @@
         """
             @Composable
             fun Test(x: Int, y: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(y>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(y>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -1266,7 +1306,8 @@
         """
             @Composable
             fun CanSkip(a: Int, b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(CanSkip):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(CanSkip):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1305,7 +1346,8 @@
             }
             @Composable
             fun CannotSkip(a: Int, b: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(CannotSkip):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(CannotSkip):Test.kt")
               used(a)
               used(b)
               print("Hello World")
@@ -1315,7 +1357,8 @@
             }
             @Composable
             fun NoParams(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(NoParams):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(NoParams):Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 print("Hello World")
               } else {
@@ -1342,7 +1385,8 @@
         """
             @Composable
             fun Bar.CanSkip(b: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(CanSkip):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(CanSkip):Test.kt")
               val %dirty = %changed
               if (%default.inv() and 0b0001 !== 0 || %dirty and 0b0001 !== 0 || !%composer.skipping) {
                 if (%changed and 0b0001 === 0 || %composer.defaultsInvalid) {
@@ -1384,7 +1428,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(%composer, 0)
               } else {
@@ -1411,7 +1456,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -1452,7 +1498,8 @@
         """
             @Composable
             fun A(text: String, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<B(text...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<B(text...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(text)) 0b0100 else 0b0010
@@ -1468,7 +1515,8 @@
             }
             @Composable
             fun B(text: String, color: Color, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B)P(1,0:Color):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B)P(1,0:Color):Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1560,7 +1608,8 @@
         """
             @Composable
             fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<D>,<C({})>,<C(stab...>,<C(16.d...>,<C(Dp(1...>,<C(16.d...>,<C(norm...>,<C(Int....>,<C(stab...>,<C(Modi...>,<C(Foo....>,<C(cons...>,<C(123)>,<C(123>,<C(x)>,<C(x>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<D>,<C({})>,<C(stab...>,<C(16.d...>,<C(Dp(1...>,<C(16.d...>,<C(norm...>,<C(Int....>,<C(stab...>,<C(Modi...>,<C(Foo....>,<C(cons...>,<C(123)>,<C(123>,<C(x)>,<C(x>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val x = 123
                 D(ComposableSingletons%TestKt.lambda-1, %composer, 0)
@@ -1589,7 +1638,8 @@
             }
             @Composable
             fun B(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(B)<C(Math...>,<C(Math...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(B)<C(Math...>,<C(Math...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 C(random(), %composer, 0)
                 C(random() / 100.0f, %composer, 0)
@@ -1601,7 +1651,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -1625,7 +1676,8 @@
         """
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<D>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<D>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 D(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -1636,7 +1688,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -1661,7 +1714,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1698,7 +1752,8 @@
         """
             @Composable
             fun Test(x: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<I()>,<A(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<I()>,<A(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%default and 0b0001 === 0 && %composer.changed(x)) 0b0100 else 0b0010
@@ -1743,7 +1798,8 @@
         """
             @Composable
             fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
               A(x, %composer, 0b1000)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 Test(x, %composer, %changed or 0b0001)
@@ -1767,7 +1823,8 @@
         """
             @Composable
             fun Test(x: Foo?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%default and 0b0001 === 0 && %composer.changed(x)) 0b0100 else 0b0010
@@ -1812,7 +1869,8 @@
         """
             @Composable
             fun Test(a: Int, b: Boolean, c: Int, d: Foo?, e: List<Int>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(a,>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(a,>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -1884,7 +1942,8 @@
         """
             @Composable
             fun X(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(X)<X(x>,<X(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(X)<X(x>,<X(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -1945,7 +2004,8 @@
               itemsIndexed(items, ComposableSingletons%TestKt.lambda-1)
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function5<LazyItemScope, Int, User?, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { index: Int, user: User?, %composer: Composer?, %changed: Int ->
+              val lambda-1: @[ExtensionFunctionType] Function5<LazyItemScope, Int, User?, Composer, Int, Unit> = composableLambdaInstance(<>, false) { index: Int, user: User?, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b0001010000000001 xor 0b010000000000 !== 0 || !%composer.skipping) {
                   print("Hello World")
                 } else {
@@ -1971,7 +2031,8 @@
         """
             @Composable
             fun Unstable.Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<doSome...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<doSome...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
@@ -1987,7 +2048,8 @@
             }
             @Composable
             fun doSomething(x: Unstable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(doSomething):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(doSomething):Test.kt")
               if (%changed and 0b0001 !== 0 || !%composer.skipping) {
               } else {
                 %composer.skipToGroupEnd()
@@ -2071,7 +2133,8 @@
         """
             @Composable
             fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<B(>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<B(>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -2115,14 +2178,16 @@
             val stableUnused: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-3
             val stableUsed: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-4
             internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-1: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b01010001 xor 0b00010000 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
                   %composer.skipToGroupEnd()
                 }
               }
-              val lambda-2: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-2: @[ExtensionFunctionType] Function3<Foo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(%this%null)) 0b0100 else 0b0010
@@ -2133,14 +2198,16 @@
                   %composer.skipToGroupEnd()
                 }
               }
-              val lambda-3: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-3: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b01010001 xor 0b00010000 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
                   %composer.skipToGroupEnd()
                 }
               }
-              val lambda-4: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-4: @[ExtensionFunctionType] Function3<StableFoo, Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(%this%null)) 0b0100 else 0b0010
@@ -2176,19 +2243,22 @@
         """
             @Composable
             fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<Provid...>,<B(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<Provid...>,<B(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
               }
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
-                Provide(composableLambda(%composer, <>, true, "C<Provid...>,<B(x,>:Test.kt") { y: Int, %composer: Composer?, %changed: Int ->
+                Provide(composableLambda(%composer, <>, true) { y: Int, %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C<Provid...>,<B(x,>:Test.kt")
                   val %dirty = %changed
                   if (%changed and 0b1110 === 0) {
                     %dirty = %dirty or if (%composer.changed(y)) 0b0100 else 0b0010
                   }
                   if (%dirty and 0b01011011 xor 0b00010010 !== 0 || !%composer.skipping) {
-                    Provide(composableLambda(%composer, <>, true, "C<B(x,>:Test.kt") { z: Int, %composer: Composer?, %changed: Int ->
+                    Provide(composableLambda(%composer, <>, true) { z: Int, %composer: Composer?, %changed: Int ->
+                      sourceInformation(%composer, "C<B(x,>:Test.kt")
                       val %dirty = %changed
                       if (%changed and 0b1110 === 0) {
                         %dirty = %dirty or if (%composer.changed(z)) 0b0100 else 0b0010
@@ -2232,7 +2302,8 @@
         """
             @Composable
             fun A(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<foo(x)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<foo(x)>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -2240,7 +2311,8 @@
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                 @Composable
                 fun foo(y: Int, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(foo)<B(x,>:Test.kt")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(foo)<B(x,>:Test.kt")
                   B(x, y, %composer, 0b1110 and %dirty or 0b01110000 and %changed shl 0b0011)
                   %composer.endReplaceableGroup()
                 }
@@ -2319,7 +2391,8 @@
         """
             @Composable
             fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
               val %dirty = %changed
               val %dirty1 = %changed1
               if (%default and 0b0001 !== 0) {
@@ -2522,7 +2595,8 @@
         """
             @Composable
             fun Example(a00: Int, a01: Int, a02: Int, a03: Int, a04: Int, a05: Int, a06: Int, a07: Int, a08: Int, a09: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, %composer: Composer?, %changed: Int, %changed1: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<Exampl...>,<Exampl...>:Test.kt")
               val %dirty = %changed
               val %dirty1 = %changed1
               if (%default and 0b0001 !== 0) {
@@ -2693,13 +2767,17 @@
               val current: Int
                 @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
                 get() {
+                  sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
                   val tmp0 = %composer.hashCode()
+                  sourceInformationMarkerEnd(%composer)
                   return tmp0
                 }
               @ReadOnlyComposable
               @Composable
               fun getHashCode(%composer: Composer?, %changed: Int): Int {
+                sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
                 val tmp0 = %composer.hashCode()
+                sourceInformationMarkerEnd(%composer)
                 return tmp0
               }
               static val %stable: Int = 0
@@ -2707,7 +2785,9 @@
             @ReadOnlyComposable
             @Composable
             fun getHashCode(%composer: Composer?, %changed: Int): Int {
+              sourceInformationMarkerStart(%composer, <>, "C(getHashCode):Test.kt")
               val tmp0 = %composer.hashCode()
+              sourceInformationMarkerEnd(%composer)
               return tmp0
             }
         """
@@ -2734,7 +2814,8 @@
         """
             @Composable
             fun Example(wontChange: Int, mightChange: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)P(1)<curren...>,<A(wont...>,<A(migh...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)P(1)<curren...>,<A(wont...>,<A(migh...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -2785,7 +2866,8 @@
         """
             @Composable
             fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<invoke...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<invoke...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
@@ -2845,7 +2927,8 @@
         """
             @Composable
             fun Box2(modifier: Modifier?, paddingStart: Dp, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Box2)P(1,2:c#ui.unit.Dp)<conten...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Box2)P(1,2:c#ui.unit.Dp)<conten...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -2893,7 +2976,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -2924,14 +3008,16 @@
         """
             @Composable
             fun Test(cond: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(cond)) 0b0100 else 0b0010
               }
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                 if (cond) {
-                  %composer.startReplaceableGroup(<>, "<A()>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A()>")
                   A(%composer, 0)
                   %composer.endReplaceableGroup()
                 } else {
@@ -2939,7 +3025,8 @@
                   %composer.endReplaceableGroup()
                 }
                 if (cond) {
-                  %composer.startReplaceableGroup(<>, "<B()>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<B()>")
                   B(%composer, 0)
                   %composer.endReplaceableGroup()
                 } else {
@@ -2982,7 +3069,8 @@
         """
             @Composable
             fun Unskippable(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Unskippable):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Unskippable):Test.kt")
               used(a)
               %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
                 Unskippable(a, b, c, %composer, %changed or 0b0001)
@@ -2990,7 +3078,8 @@
             }
             @Composable
             fun Skippable1(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Skippable1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Skippable1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b01110000 === 0) {
                 %dirty = %dirty or if (%composer.changed(b)) 0b00100000 else 0b00010000
@@ -3006,7 +3095,8 @@
             }
             @Composable
             fun Skippable2(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Skippable2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Skippable2):Test.kt")
               val %dirty = %changed
               if (%changed and 0b001110000000 === 0) {
                 %dirty = %dirty or if (%composer.changed(c)) 0b000100000000 else 0b10000000
@@ -3022,7 +3112,8 @@
             }
             @Composable
             fun Skippable3(a: Unstable, b: Stable, c: MaybeStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Skippable3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Skippable3):Test.kt")
               if (%changed and 0b0001 !== 0 || !%composer.skipping) {
               } else {
                 %composer.skipToGroupEnd()
@@ -3052,7 +3143,8 @@
         """
             @Composable
             fun MaybeStable.example(x: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(example):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(<this>)) 0b0100 else 0b0010
@@ -3072,7 +3164,8 @@
             }
             val example: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
             internal object ComposableSingletons%TestKt {
-              val lambda-1: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { it: Int, %composer: Composer?, %changed: Int ->
+              val lambda-1: @[ExtensionFunctionType] Function4<MaybeStable, Int, Composer, Int, Unit> = composableLambdaInstance(<>, false) { it: Int, %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 val %dirty = %changed
                 if (%changed and 0b1110 === 0) {
                   %dirty = %dirty or if (%composer.changed(%this%null)) 0b0100 else 0b0010
@@ -3090,4 +3183,55 @@
             }
         """
     )
+}
+
+class FunctionBodySkippingTransformTestsNoSource : FunctionBodySkippingTransfomrTestsBase() {
+    override val sourceInformationEnabled: Boolean get() = false
+
+    @Test
+    fun testGrouplessProperty(): Unit = comparisonPropagation(
+        """
+        """,
+        """
+            import androidx.compose.runtime.currentComposer
+
+            open class Foo {
+                inline val current: Int
+                    @Composable
+                    @ReadOnlyComposable get() = currentComposer.hashCode()
+
+                @ReadOnlyComposable
+                @Composable
+                fun getHashCode(): Int = currentComposer.hashCode()
+            }
+
+            @ReadOnlyComposable
+            @Composable
+            fun getHashCode(): Int = currentComposer.hashCode()
+        """,
+        """
+            @StabilityInferred(parameters = 0)
+            open class Foo {
+              val current: Int
+                @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
+                get() {
+                  val tmp0 = %composer.hashCode()
+                  return tmp0
+                }
+              @ReadOnlyComposable
+              @Composable
+              fun getHashCode(%composer: Composer?, %changed: Int): Int {
+                val tmp0 = %composer.hashCode()
+                return tmp0
+              }
+              static val %stable: Int = 0
+            }
+            @ReadOnlyComposable
+            @Composable
+            fun getHashCode(%composer: Composer?, %changed: Int): Int {
+              val tmp0 = %composer.hashCode()
+              return tmp0
+            }
+        """
+    )
 }
\ No newline at end of file
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 3e79f10..665aaa3 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
@@ -26,11 +26,12 @@
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import java.io.File
 import java.net.URLClassLoader
 
-@RunWith(ComposeRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 23,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
index f7f1072..8905d89 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
@@ -22,10 +22,11 @@
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.Shadows.shadowOf
 import org.robolectric.annotation.Config
 
-@RunWith(ComposeRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 23,
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 838f9bf..1946801 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
@@ -36,7 +36,8 @@
             @StabilityInferred(parameters = 0)
             class A {
               val b: String = ""
-              val c: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, true, "C:") { %composer: Composer?, %changed: Int ->
+              val c: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, true) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   print(b)
                 } else {
@@ -66,23 +67,28 @@
         """
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example):Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 @Composable
                 fun A(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(A):Test.kt")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(A):Test.kt")
                   %composer.endReplaceableGroup()
                 }
                 @Composable
                 fun B(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(B)<conten...>:Test.kt")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(B)<conten...>:Test.kt")
                   content(%composer, 0b1110 and %changed)
                   %composer.endReplaceableGroup()
                 }
                 @Composable
                 fun C(%composer: Composer?, %changed: Int) {
-                  %composer.startReplaceableGroup(<>, "C(C)<B>:Test.kt")
-                  B(composableLambda(%composer, <>, false, "C<A()>:Test.kt") { %composer: Composer?, %changed: Int ->
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(C)<B>:Test.kt")
+                  B(composableLambda(%composer, <>, false) { %composer: Composer?, %changed: Int ->
+                    sourceInformation(%composer, "C<A()>:Test.kt")
                     if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                       A(%composer, 0)
                     } else {
@@ -120,10 +126,12 @@
         """
             @Composable
             fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<B>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<B>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 <<LOCALDELPROP>>
-                B(composableLambda(%composer, <>, true, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+                B(composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C:Test.kt")
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     print(<get-x>())
                   } else {
@@ -157,14 +165,16 @@
             val foo: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-1
             val bar: Function2<Composer, Int, Unit> = ComposableSingletons%TestKt.lambda-2
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
                   %composer.skipToGroupEnd()
                 }
               }
-              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:") { %composer: Composer?, %changed: Int ->
+              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -192,7 +202,8 @@
         """
             @Composable
             fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<B(foo)>,<B(bar)>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<B(foo)>,<B(bar)>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val foo = ComposableSingletons%TestKt.lambda-1
                 val bar = ComposableSingletons%TestKt.lambda-2
@@ -206,14 +217,16 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
                   %composer.skipToGroupEnd()
                 }
               }
-              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-2: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -240,7 +253,8 @@
         """
             @Composable
             fun A(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(A)<B>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(A)<B>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 B(ComposableSingletons%TestKt.lambda-1, %composer, 0)
               } else {
@@ -251,7 +265,8 @@
               }
             }
             internal object ComposableSingletons%TestKt {
-              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false, "C:Test.kt") { %composer: Composer?, %changed: Int ->
+              val lambda-1: Function2<Composer, Int, Unit> = composableLambdaInstance(<>, false) { %composer: Composer?, %changed: Int ->
+                sourceInformation(%composer, "C:Test.kt")
                 if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                   Unit
                 } else {
@@ -282,7 +297,8 @@
         """
             @Composable
             fun Test(enabled: Boolean, content: Function2<Composer, Int, Unit>?, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)P(1)<Wrap(c...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)P(1)<Wrap(c...>:Test.kt")
               val %dirty = %changed
               if (%default and 0b0001 !== 0) {
                 %dirty = %dirty or 0b0110
@@ -296,7 +312,8 @@
               }
               if (%dirty and 0b01011011 xor 0b00010010 !== 0 || !%composer.skipping) {
                 if (%default and 0b0010 !== 0) {
-                  content = composableLambda(%composer, <>, true, "C<Displa...>:Test.kt") { %composer: Composer?, %changed: Int ->
+                  content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+                    sourceInformation(%composer, "C<Displa...>:Test.kt")
                     if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                       Display("%enabled", %composer, 0)
                     } else {
@@ -337,13 +354,15 @@
         """
             @Composable
             fun Test(enabled: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<Wrap(c...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<Wrap(c...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
               }
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
-                val content = composableLambda(%composer, <>, true, "C<Displa...>:Test.kt") { %composer: Composer?, %changed: Int ->
+                val content = composableLambda(%composer, <>, true) { %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C<Displa...>:Test.kt")
                   if (%changed and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                     Display("%enabled", %composer, 0)
                   } else {
@@ -388,7 +407,8 @@
         """
         @Composable
         fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>, "C(TestLambda):Test.kt")
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(TestLambda):Test.kt")
           val %dirty = %changed
           if (%changed and 0b1110 === 0) {
             %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
@@ -404,7 +424,8 @@
         }
         @Composable
         fun Test(%composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>, "C(Test)<TestLa...>:Test.kt")
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(Test)<TestLa...>:Test.kt")
           if (%changed !== 0 || !%composer.skipping) {
             TestLambda({
               println("Doesn't capture")
@@ -440,7 +461,8 @@
         """
         @Composable
         fun TestLambda(content: Function0<Unit>, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>, "C(TestLambda):Test.kt")
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(TestLambda):Test.kt")
           val %dirty = %changed
           if (%changed and 0b1110 === 0) {
             %dirty = %dirty or if (%composer.changed(content)) 0b0100 else 0b0010
@@ -456,7 +478,8 @@
         }
         @Composable
         fun Test(a: String, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>, "C(Test)<{>,<TestLa...>:Test.kt")
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(Test)<{>,<TestLa...>:Test.kt")
           val %dirty = %changed
           if (%changed and 0b1110 === 0) {
             %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LiveLiteralCodegenTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LiveLiteralCodegenTests.kt
index 9e9ab11..3d406f2 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LiveLiteralCodegenTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LiveLiteralCodegenTests.kt
@@ -23,9 +23,10 @@
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 
-@RunWith(ComposeRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 23,
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 51532ad..e0863c1 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -62,7 +62,8 @@
             @Composable
             @NonRestartableComposable
             fun app(x: Boolean, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(app)<rememb...>:Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(app)<rememb...>:Test.kt")
               val a = if (x) {
                 %composer.startReplaceableGroup(<>)
                 val tmp0_group = %composer.cache(false) {
@@ -105,7 +106,8 @@
         """
             @Composable
             fun <T> loadResourceInternal(key: String, pendingResource: T?, failedResource: T?, %composer: Composer?, %changed: Int, %default: Int): Boolean {
-              %composer.startReplaceableGroup(<>, "C(loadResourceInternal)P(1,2):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(loadResourceInternal)P(1,2):Test.kt")
               if (%default and 0b0010 !== 0) {
                 pendingResource = null
               }
@@ -147,7 +149,8 @@
         """
             @Composable
             fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(test1):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(test1):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -166,7 +169,8 @@
             }
             @Composable
             fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(test2):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(test2):Test.kt")
               %composer.cache(%composer.changed(x)) {
                 val tmp0_return = 1
                 tmp0_return
@@ -177,7 +181,8 @@
             }
             @Composable
             fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(test3):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(test3):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -227,7 +232,8 @@
             @Composable
             @NonRestartableComposable
             fun test1(x: KnownStable, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(test1):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(test1):Test.kt")
               %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 === 0b0100) {
                 val tmp0_return = 1
                 tmp0_return
@@ -237,7 +243,8 @@
             @Composable
             @NonRestartableComposable
             fun test2(x: KnownUnstable, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(test2):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(test2):Test.kt")
               %composer.cache(%composer.changed(x)) {
                 val tmp0_return = 1
                 tmp0_return
@@ -247,7 +254,8 @@
             @Composable
             @NonRestartableComposable
             fun test3(x: Uncertain, %composer: Composer?, %changed: Int) {
-              %composer.startReplaceableGroup(<>, "C(test3):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(test3):Test.kt")
               %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(x) || %changed and 0b0110 === 0b0100) {
                 val tmp0_return = 1
                 tmp0_return
@@ -269,7 +277,8 @@
         """
             @Composable
             fun rememberFoo(a: Int, b: Int, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>, "C(rememberFoo):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(rememberFoo):Test.kt")
               val tmp0 = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 === 0b0100 or %changed and 0b01110000 xor 0b00110000 > 32 && %composer.changed(b) || %changed and 0b00110000 === 0b00100000) {
                 val tmp0_return = Foo(a, b)
                 tmp0_return
@@ -298,7 +307,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A()>,<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>,<rememb...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val foo = %composer.cache(false) {
                   val tmp0_return = Foo()
@@ -340,7 +350,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val a = someInt()
                 val b = someInt()
@@ -373,7 +384,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<CInt()...>,<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<CInt()...>,<rememb...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val foo = remember(CInt(%composer, 0), {
                   val tmp0_return = Foo()
@@ -408,7 +420,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<curren...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val bar = compositionLocalBar.current
                 val foo = %composer.cache(%composer.changed(bar)) {
@@ -443,7 +456,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<curren...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<curren...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val foo = %composer.cache(%composer.changed(compositionLocalBar.current)) {
                   val tmp0_return = Foo()
@@ -475,7 +489,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A()>,<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>,<rememb...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(%composer, 0)
                 val foo = remember({
@@ -510,7 +525,8 @@
         """
             @Composable
             fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
@@ -556,14 +572,16 @@
         """
             @Composable
             fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
               }
               if (%dirty and 0b1011 xor 0b0010 !== 0 || !%composer.skipping) {
                 if (condition) {
-                  %composer.startReplaceableGroup(<>, "<A()>,<rememb...>")
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "<A()>,<rememb...>")
                   A(%composer, 0)
                   val foo = remember({
                     val tmp0_return = Foo()
@@ -602,7 +620,8 @@
         """
             @Composable
             fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)*<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)*<rememb...>:Test.kt")
               val tmp0_iterator = items.iterator()
               while (tmp0_iterator.hasNext()) {
                 val item = tmp0_iterator.next()
@@ -640,7 +659,8 @@
         """
             @Composable
             fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)*<rememb...>,<A()>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)*<rememb...>,<A()>:Test.kt")
               val tmp0_iterator = items.iterator()
               while (tmp0_iterator.hasNext()) {
                 val item = tmp0_iterator.next()
@@ -674,7 +694,8 @@
         """
             @Composable
             fun Test(items: List<Int>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val foo = %composer.cache(false) {
                 val tmp0_return = Foo()
                 tmp0_return
@@ -702,7 +723,8 @@
         """
             @Composable
             fun Test(a: Int, b: Int, c: Bar, d: Boolean, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
@@ -746,7 +768,8 @@
         """
             @Composable
             fun Test(items: Array<Bar>, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
               val foo = remember(*items, {
                 val tmp0_return = Foo()
                 tmp0_return
@@ -774,7 +797,8 @@
         """
             @Composable
             fun Test(inlineInt: InlineInt, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)P(0:InlineInt):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)P(0:InlineInt):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(inlineInt.value)) 0b0100 else 0b0010
@@ -815,7 +839,8 @@
         """
             @Composable
             fun Test(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 val a = someInt()
                 val b = someInt()
@@ -855,7 +880,8 @@
         """
             @Composable
             fun Test(a: Int, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test):Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%composer.changed(a)) 0b0100 else 0b0010
@@ -892,7 +918,8 @@
         """
             @Composable
             fun Test(a: Int, %composer: Composer?, %changed: Int): Foo {
-              %composer.startReplaceableGroup(<>, "C(Test):Test.kt")
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Test):Test.kt")
               val b = someInt()
               val tmp0 = %composer.cache(%changed and 0b1110 xor 0b0110 > 4 && %composer.changed(a) || %changed and 0b0110 === 0b0100 or %composer.changed(b)) {
                 val tmp0_return = Foo(a, b)
@@ -921,7 +948,8 @@
         """
             @Composable
             fun Test(a: Int, %composer: Composer?, %changed: Int, %default: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<rememb...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<rememb...>:Test.kt")
               val %dirty = %changed
               if (%changed and 0b1110 === 0) {
                 %dirty = %dirty or if (%default and 0b0001 === 0 && %composer.changed(a)) 0b0100 else 0b0010
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
index b434332..a056dcd 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/StabilityPropagationTransformTests.kt
@@ -61,7 +61,8 @@
         """
         @Composable
         fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-          %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+          %composer = %composer.startRestartGroup(<>)
+          sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
           val %dirty = %changed
           if (%changed and 0b1110 === 0) {
             %dirty = %dirty or if (%composer.changed(x)) 0b0100 else 0b0010
@@ -102,7 +103,8 @@
         """
             @Composable
             fun Test(x: Foo, %composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A(x)>,<A(Foo(...>,<rememb...>,<A(reme...>:Test.kt")
               A(x, %composer, 0b1000)
               A(Foo(0), %composer, 0b1000)
               A(remember({
@@ -130,7 +132,8 @@
         """
             @Composable
             fun Example(%composer: Composer?, %changed: Int) {
-              %composer = %composer.startRestartGroup(<>, "C(Example)<A(list...>:Test.kt")
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Example)<A(list...>:Test.kt")
               if (%changed !== 0 || !%composer.skipping) {
                 A(listOf("a"), %composer, 0)
               } else {
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/KtxNameConventions.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/KtxNameConventions.kt
index 4b9c724..4db291b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/KtxNameConventions.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/KtxNameConventions.kt
@@ -12,4 +12,7 @@
     val STARTRESTARTGROUP = Name.identifier("startRestartGroup")
     val ENDRESTARTGROUP = Name.identifier("endRestartGroup")
     val UPDATE_SCOPE = Name.identifier("updateScope")
+    val SOURCEINFORMATION = "sourceInformation"
+    val SOURCEINFORMATIONMARKERSTART = "sourceInformationMarkerStart"
+    val SOURCEINFORMATIONMARKEREND = "sourceInformationMarkerEnd"
 }
\ No newline at end of file
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 ae04430..f4cd4fc 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
@@ -41,19 +41,21 @@
             2400 to "1.0.0-alpha13",
             2500 to "1.0.0-beta04",
             2600 to "1.0.0-beta05",
+            2700 to "1.0.0-beta06",
+            2800 to "1.0.0-beta07",
         )
 
         /**
          * The minimum version int that this compiler is guaranteed to be compatible with. Typically
          * this will match the version int that is in ComposeVersion.kt in the runtime.
          */
-        private val minimumRuntimeVersionInt: Int = 2600
+        private val minimumRuntimeVersionInt: Int = 2800
 
         /**
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        val compilerVersion: String = "1.0.0-beta05"
+        val compilerVersion: String = "1.0.0-beta07"
         private val minimumRuntimeVersion: String
             get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
index b64b7f3..5fe873c 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
@@ -67,6 +67,7 @@
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
 import org.jetbrains.kotlin.ir.declarations.IrField
 import org.jetbrains.kotlin.ir.declarations.IrFunction
+import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
 import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
 import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
 import org.jetbrains.kotlin.ir.declarations.IrValueDeclaration
@@ -141,17 +142,14 @@
 import org.jetbrains.kotlin.ir.util.isNoinline
 import org.jetbrains.kotlin.ir.util.primaryConstructor
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
-import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
 import org.jetbrains.kotlin.name.FqName
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.platform.jvm.isJvm
-import org.jetbrains.kotlin.psi.KtFunctionLiteral
 import org.jetbrains.kotlin.psi.psiUtil.endOffset
 import org.jetbrains.kotlin.psi.psiUtil.startOffset
 import org.jetbrains.kotlin.resolve.BindingTrace
 import org.jetbrains.kotlin.resolve.DescriptorFactory
 import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
-import org.jetbrains.kotlin.resolve.inline.InlineUtil
 import org.jetbrains.kotlin.resolve.source.PsiSourceElement
 import org.jetbrains.kotlin.types.KotlinType
 import org.jetbrains.kotlin.utils.DFS
@@ -161,7 +159,15 @@
     val context: IrPluginContext,
     val symbolRemapper: DeepCopySymbolRemapper,
     val bindingTrace: BindingTrace
-) : IrElementTransformerVoid() {
+) : IrElementTransformerVoid(), ModuleLoweringPass {
+
+    var inlinedFunctions: Set<InlineLambdaInfo> = setOf()
+
+    override fun lower(module: IrModuleFragment) {
+        // TODO: Might be worth caching this up in ComposeIrGenerationExtension, or maybe not
+        // because it might be better to keep the transforms independent.
+        inlinedFunctions = IrInlineReferenceLocator.scan(context, module)
+    }
 
     @ObsoleteDescriptorBasedAPI
     protected val typeTranslator =
@@ -343,18 +349,9 @@
         return context.irTrace[ComposeWritableSlices.IS_COMPOSABLE_SINGLETON_CLASS, this] == true
     }
 
-    @OptIn(ObsoleteDescriptorBasedAPI::class)
     fun IrFunction.isInlinedLambda(): Boolean {
-        descriptor.findPsi()?.let { psi ->
-            (psi as? KtFunctionLiteral)?.let {
-                if (InlineUtil.isInlinedArgument(
-                        it,
-                        context.bindingContext,
-                        false
-                    )
-                )
-                    return true
-            }
+        for (element in inlinedFunctions) {
+            if (element.argument.function == this) return true
         }
         return false
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index 4c86015..c448eee 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -71,6 +71,7 @@
 import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
 import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
 import org.jetbrains.kotlin.ir.declarations.name
+import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor
 import org.jetbrains.kotlin.ir.expressions.IrBlock
 import org.jetbrains.kotlin.ir.expressions.IrBody
 import org.jetbrains.kotlin.ir.expressions.IrBreakContinue
@@ -109,6 +110,7 @@
 import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
 import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
 import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
+import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
 import org.jetbrains.kotlin.ir.types.IrSimpleType
 import org.jetbrains.kotlin.ir.types.IrType
 import org.jetbrains.kotlin.ir.types.IrTypeArgument
@@ -145,13 +147,10 @@
 import org.jetbrains.kotlin.ir.util.statements
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
-import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
 import org.jetbrains.kotlin.name.FqNameUnsafe
 import org.jetbrains.kotlin.name.Name
-import org.jetbrains.kotlin.psi.KtFunctionLiteral
 import org.jetbrains.kotlin.resolve.BindingTrace
 import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
-import org.jetbrains.kotlin.resolve.inline.InlineUtil
 import org.jetbrains.kotlin.types.typeUtil.isUnit
 import org.jetbrains.kotlin.utils.ifEmpty
 import kotlin.math.abs
@@ -454,6 +453,7 @@
     ModuleLoweringPass {
 
     override fun lower(module: IrModuleFragment) {
+        super.lower(module)
         module.transformChildrenVoid(this)
         applySourceFixups()
         module.patchDeclarationParents()
@@ -515,13 +515,6 @@
             }
     }
 
-    private val startReplaceableSourceFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "startReplaceableGroup" && it.valueParameters.size == 2
-            }
-    }
-
     private val endReplaceableFunction by guardedLazy {
         composerIrClass.functions
             .first {
@@ -550,13 +543,6 @@
             }
     }
 
-    private val startMovableSourceFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name.identifier == "startMovableGroup" && it.valueParameters.size == 3
-            }
-    }
-
     private val endMovableFunction by guardedLazy {
         composerIrClass.functions
             .first {
@@ -572,13 +558,6 @@
             }
     }
 
-    private val startRestartGroupSourceFunction by guardedLazy {
-        composerIrClass.functions
-            .first {
-                it.name == KtxNameConventions.STARTRESTARTGROUP && it.valueParameters.size == 2
-            }
-    }
-
     private val endRestartGroupFunction by guardedLazy {
         composerIrClass
             .functions
@@ -587,6 +566,24 @@
             }
     }
 
+    private val sourceInformationFunction by guardedLazy {
+        getTopLevelFunctions(
+            ComposeFqNames.fqNameFor(KtxNameConventions.SOURCEINFORMATION)
+        ).map { it.owner }.first()
+    }
+
+    private val sourceInformationMarkerStartFunction by guardedLazy {
+        getTopLevelFunctions(
+            ComposeFqNames.fqNameFor(KtxNameConventions.SOURCEINFORMATIONMARKERSTART)
+        ).map { it.owner }.first()
+    }
+
+    private val sourceInformationMarkerEndFunction by guardedLazy {
+        getTopLevelFunctions(
+            ComposeFqNames.fqNameFor(KtxNameConventions.SOURCEINFORMATIONMARKEREND)
+        ).map { it.owner }.first()
+    }
+
     private val IrType.arguments: List<IrTypeArgument>
         get() = (this as? IrSimpleType)?.arguments.orEmpty()
 
@@ -742,17 +739,7 @@
             return false
 
         // Do not insert an observe scope in an inline composable lambda
-        descriptor.findPsi()?.let { psi ->
-            (psi as? KtFunctionLiteral)?.let {
-                if (InlineUtil.isInlinedArgument(
-                        it,
-                        context.bindingContext,
-                        false
-                    )
-                )
-                    return false
-            }
-        }
+        if (this.isInlinedLambda()) return false
 
         // Do not insert an observe scope if the function has a return result
         if (descriptor.returnType.let { it == null || !it.isUnit() })
@@ -832,17 +819,31 @@
             body.startOffset,
             body.endOffset,
             listOfNotNull(
-                if (!elideGroups)
-                    irStartReplaceableGroup(
-                        body,
-                        scope,
-                        declaration.irSourceKey()
-                    )
-                else
-                    null,
+                when {
+                    !elideGroups ->
+                        irStartReplaceableGroup(
+                            body,
+                            scope,
+                            declaration.irSourceKey()
+                        )
+                    collectSourceInformation &&
+                        !declaration.descriptor.hasExplicitGroupsAnnotation() ->
+                        irSourceInformationMarkerStart(
+                            body,
+                            scope,
+                            declaration.irSourceKey()
+                        )
+                    else -> null
+                },
                 *bodyPreamble.statements.toTypedArray(),
                 *transformed.statements.toTypedArray(),
-                if (!elideGroups) irEndReplaceableGroup() else null,
+                when {
+                    !elideGroups -> irEndReplaceableGroup()
+                    collectSourceInformation &&
+                        !declaration.descriptor.hasExplicitGroupsAnnotation() ->
+                        irSourceInformationMarkerEnd(body)
+                    else -> null
+                },
                 returnVar?.let { irReturn(declaration.symbol, irGet(it)) }
             )
         )
@@ -865,9 +866,15 @@
         // no group, since composableLambda should already create one
         // no default logic
         val body = declaration.body!!
+        val sourceInformationPreamble = mutableStatementContainer()
         val skipPreamble = mutableStatementContainer()
         val bodyPreamble = mutableStatementContainer()
 
+        // First generate the source information call
+        if (collectSourceInformation && !scope.isInlinedLambda) {
+            sourceInformationPreamble.statements.add(irSourceInformation(scope))
+        }
+
         // we start off assuming that we *can* skip execution of the function
         var canSkipExecution = declaration.returnType.isUnit() &&
             scope.allTrackedParams.none { stabilityOf(it.type).knownUnstable() }
@@ -937,6 +944,7 @@
                     if (collectSourceInformation && scope.isInlinedLambda)
                         irStartReplaceableGroup(body, scope)
                     else null,
+                    *sourceInformationPreamble.statements.toTypedArray(),
                     *skipPreamble.statements.toTypedArray(),
                     *bodyPreamble.statements.toTypedArray(),
                     transformedBody,
@@ -951,6 +959,7 @@
                 body.startOffset,
                 body.endOffset,
                 listOfNotNull(
+                    *sourceInformationPreamble.statements.toTypedArray(),
                     *skipPreamble.statements.toTypedArray(),
                     *bodyPreamble.statements.toTypedArray(),
                     transformed,
@@ -1750,16 +1759,61 @@
         scope: Scope.BlockScope,
         key: IrExpression = element.irSourceKey()
     ): IrExpression {
-        val startDescriptor = if (scope.hasSourceInformation)
-            startReplaceableSourceFunction else startReplaceableFunction
-        return irMethodCall(
-            irCurrentComposer(),
-            startDescriptor
+        return irWithSourceInformation(
+            irMethodCall(
+                irCurrentComposer(),
+                startReplaceableFunction
+            ).also {
+                it.putValueArgument(0, key)
+            },
+            scope
+        )
+    }
+
+    private fun irWithSourceInformation(
+        startGroup: IrExpression,
+        scope: Scope.BlockScope
+    ): IrExpression {
+        return if (scope.hasSourceInformation) {
+            irBlock(statements = listOf(startGroup, irSourceInformation(scope)))
+        } else startGroup
+    }
+
+    private fun irSourceInformation(scope: Scope.BlockScope): IrExpression {
+        val sourceInformation = irCall(
+            sourceInformationFunction
         ).also {
-            it.putValueArgument(0, key)
-            if (scope.hasSourceInformation) {
-                recordSourceParameter(it, 1, scope)
-            }
+            it.putValueArgument(0, irCurrentComposer())
+        }
+        recordSourceParameter(sourceInformation, 1, scope)
+        return sourceInformation
+    }
+
+    private fun irSourceInformationMarkerStart(
+        element: IrElement,
+        scope: Scope.BlockScope,
+        key: IrExpression = element.irSourceKey(),
+    ): IrExpression {
+        return irCall(
+            sourceInformationMarkerStartFunction,
+            element.startOffset,
+            element.endOffset
+        ).also {
+            it.putValueArgument(0, irCurrentComposer())
+            it.putValueArgument(1, key)
+            recordSourceParameter(it, 2, scope)
+        }
+    }
+
+    private fun irSourceInformationMarkerEnd(
+        element: IrElement,
+    ): IrExpression {
+        return irCall(
+            sourceInformationMarkerEndFunction,
+            element.startOffset,
+            element.endOffset
+        ).also {
+            it.putValueArgument(0, irCurrentComposer())
         }
     }
 
@@ -1777,21 +1831,19 @@
         scope: Scope.BlockScope,
         key: IrExpression = element.irSourceKey()
     ): IrExpression {
-        val startDescriptor = if (scope.hasSourceInformation)
-            startRestartGroupSourceFunction else startRestartGroupFunction
-        return irSet(
-            nearestComposer(),
-            irMethodCall(
-                irCurrentComposer(),
-                startDescriptor,
-                element.startOffset,
-                element.endOffset
-            ).also {
-                it.putValueArgument(0, key)
-                if (scope.hasSourceInformation) {
-                    recordSourceParameter(it, 1, scope)
+        return irWithSourceInformation(
+            irSet(
+                nearestComposer(),
+                irMethodCall(
+                    irCurrentComposer(),
+                    startRestartGroupFunction,
+                    element.startOffset,
+                    element.endOffset
+                ).also {
+                    it.putValueArgument(0, key)
                 }
-            }
+            ),
+            scope
         )
     }
 
@@ -1864,23 +1916,18 @@
         joinedData: IrExpression,
         scope: Scope.BlockScope
     ): IrExpression {
-        val startFunction = if (scope.hasSourceInformation) {
-            startMovableSourceFunction
-        } else {
-            startMovableFunction
-        }
-        return irMethodCall(
-            irCurrentComposer(),
-            startFunction,
-            element.startOffset,
-            element.endOffset
-        ).also {
-            it.putValueArgument(0, element.irSourceKey())
-            it.putValueArgument(1, joinedData)
-            if (scope.hasSourceInformation) {
-                recordSourceParameter(it, 2, scope)
-            }
-        }
+        return irWithSourceInformation(
+            irMethodCall(
+                irCurrentComposer(),
+                startMovableFunction,
+                element.startOffset,
+                element.endOffset
+            ).also {
+                it.putValueArgument(0, element.irSourceKey())
+                it.putValueArgument(1, joinedData)
+            },
+            scope
+        )
     }
 
     private fun irEndMovableGroup(): IrExpression {
@@ -2382,17 +2429,6 @@
                     expression
                 }
             }
-            collectSourceInformation &&
-                expression.symbol.descriptor.fqNameSafe == ComposeFqNames.composableLambda -> {
-                // For calls to `composableLambda` we introduce a scope to collect the source
-                // locations on the top level of the lambda as the startRestartGroup is in the
-                // composable lambda wrapper.
-                val composableLambdaScope = withScope(Scope.ComposableLambdaScope()) {
-                    expression.transformChildrenVoid()
-                }
-                recordSourceParameter(expression, 3, composableLambdaScope)
-                return expression
-            }
             expression.isComposableSingletonGetter() -> {
                 // This looks like `ComposableSingletonClass.lambda-123`, which is a static/saved
                 // call of composableLambdaInstance. We want to transform the property here now
@@ -2403,18 +2439,6 @@
                 property?.transformChildrenVoid()
                 return super.visitCall(expression)
             }
-            collectSourceInformation &&
-                expression.symbol.descriptor.fqNameSafe ==
-                ComposeFqNames.composableLambdaInstance -> {
-                // For calls to `composableLambdaInstance` that are not singletons we introduce a
-                // scope to collect the source locations on the top level of the lambda as the
-                // startRestartGroup is in the composable lambda wrapper.
-                val composableLambdaScope = withScope(Scope.ComposableLambdaScope()) {
-                    expression.transformChildrenVoid()
-                }
-                recordSourceParameter(expression, 2, composableLambdaScope)
-                return expression
-            }
             else -> return super.visitCall(expression)
         }
     }
@@ -3339,13 +3363,9 @@
 
             override fun calculateSourceInfo(sourceInformationEnabled: Boolean): String? =
                 if (sourceInformationEnabled) {
-                    if (function.isLambda() && !isInlinedLambda) {
-                        super.calculateSourceInfo(sourceInformationEnabled)
-                    } else {
-                        "${callInformation()}${parameterInformation()}${
-                        super.calculateSourceInfo(sourceInformationEnabled) ?: ""
-                        }:${sourceFileInformation()}"
-                    }
+                    "${callInformation()}${parameterInformation()}${
+                    super.calculateSourceInfo(sourceInformationEnabled) ?: ""
+                    }:${sourceFileInformation()}"
                 } else {
                     if (function.visibility.isPublicAPI) {
                         "${callInformation()}${parameterInformation()}"
@@ -3830,13 +3850,25 @@
         ): IrChangedBitMaskVariable {
             used = true
             val temps = params.mapIndexed { index, param ->
-                irTemporary(
-                    irGet(param),
-                    if (index == 0) nameHint else "$nameHint$index",
-                    context.irBuiltIns.intType,
+                val descriptor = WrappedVariableDescriptor()
+                IrVariableImpl(
+                    UNDEFINED_OFFSET,
+                    UNDEFINED_OFFSET,
+                    // We label "dirty" as a defined variable instead of a temporary, so that it
+                    // is properly stored in the locals table and discoverable by debuggers. The
+                    // dirty variable encodes information that could be useful for tooling to
+                    // interpret.
+                    IrDeclarationOrigin.DEFINED,
+                    IrVariableSymbolImpl(descriptor),
+                    Name.identifier(if (index == 0) "\$dirty" else "\$dirty$index"),
+                    param.type,
                     isVar,
-                    exactName
-                )
+                    isConst = false,
+                    isLateinit = false
+                ).apply {
+                    descriptor.bind(this)
+                    initializer = irGet(param)
+                }
             }
             return IrChangedBitMaskVariableImpl(temps, count)
         }
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 ab4610b..131e734 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
@@ -48,7 +48,6 @@
 import org.jetbrains.kotlin.ir.builders.irGet
 import org.jetbrains.kotlin.ir.builders.irGetField
 import org.jetbrains.kotlin.ir.builders.irInt
-import org.jetbrains.kotlin.ir.builders.irNull
 import org.jetbrains.kotlin.ir.builders.irReturn
 import org.jetbrains.kotlin.ir.builders.irTemporary
 import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
@@ -87,15 +86,12 @@
 import org.jetbrains.kotlin.ir.util.primaryConstructor
 import org.jetbrains.kotlin.ir.util.substitute
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
-import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
 import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
 import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.platform.js.isJs
 import org.jetbrains.kotlin.platform.jvm.isJvm
-import org.jetbrains.kotlin.psi.KtFunctionLiteral
 import org.jetbrains.kotlin.resolve.BindingTrace
 import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
-import org.jetbrains.kotlin.resolve.inline.InlineUtil
 import org.jetbrains.kotlin.types.typeUtil.isUnit
 
 private class CaptureCollector {
@@ -331,7 +327,10 @@
         }
     }
 
-    override fun lower(module: IrModuleFragment) = module.transformChildrenVoid(this)
+    override fun lower(module: IrModuleFragment) {
+        super.lower(module)
+        module.transformChildrenVoid(this)
+    }
 
     override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
         if (declaration is IrFunction)
@@ -488,7 +487,7 @@
             // Only memoize non-composable lambdas in a context we can use remember
             !functionContext.canRemember ||
             // Don't memoize inlined lambdas
-            expression.isInlineArgument()
+            expression.function.isInlinedLambda()
         ) {
             return super.visitFunctionExpression(expression)
         }
@@ -534,7 +533,9 @@
         val functionExpression = result as? IrFunctionExpression ?: return result
 
         // Do not wrap target of an inline function
-        if (expression.isInlineArgument()) return functionExpression
+        if (expression.function.isInlinedLambda()) {
+            return functionExpression
+        }
 
         // Do not wrap composable lambdas with return results
         if (!functionExpression.function.descriptor.returnType.let { it == null || it.isUnit() }) {
@@ -685,9 +686,6 @@
             val shouldBeTracked = collector.captures.isNotEmpty()
             putValueArgument(index++, irBuilder.irBoolean(shouldBeTracked))
 
-            // sourceInformation parameter
-            putValueArgument(index++, irBuilder.irNull())
-
             // ComposableLambdaN requires the arity
             if (useComposableLambdaN) {
                 // arity parameter
@@ -872,22 +870,6 @@
     }
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
-    private fun IrFunctionExpression.isInlineArgument(): Boolean {
-        function.descriptor.findPsi()?.let { psi ->
-            (psi as? KtFunctionLiteral)?.let {
-                if (InlineUtil.isInlinedArgument(
-                        it,
-                        @Suppress("DEPRECATION") context.bindingContext,
-                        false
-                    )
-                )
-                    return true
-            }
-        }
-        return false
-    }
-
-    @OptIn(ObsoleteDescriptorBasedAPI::class)
     private fun IrExpression?.isNullOrStable() = this == null || stabilityOf(this).knownStable()
 }
 
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
index 28f9b2b..f996cdd 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerParamTransformer.kt
@@ -83,12 +83,9 @@
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
-import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
 import org.jetbrains.kotlin.load.java.JvmAbi
-import org.jetbrains.kotlin.psi.KtFunctionLiteral
 import org.jetbrains.kotlin.resolve.BindingTrace
 import org.jetbrains.kotlin.resolve.DescriptorUtils
-import org.jetbrains.kotlin.resolve.inline.InlineUtil
 import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
 import org.jetbrains.kotlin.util.OperatorNameConventions
 import kotlin.math.min
@@ -111,6 +108,7 @@
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
     override fun lower(module: IrModuleFragment) {
+        super.lower(module)
         currentModule = module
 
         module.transformChildrenVoid(this)
@@ -630,15 +628,11 @@
 
     @OptIn(ObsoleteDescriptorBasedAPI::class)
     private fun IrFunction.isNonComposableInlinedLambda(): Boolean {
-        descriptor.findPsi()?.let { psi ->
-            (psi as? KtFunctionLiteral)?.let {
-                val arg = InlineUtil.getInlineArgumentDescriptor(
-                    it,
-                    context.bindingContext
-                ) ?: return false
-
-                return !arg.type.hasComposableAnnotation()
-            }
+        for (element in inlinedFunctions) {
+            if (element.argument.function != this)
+                continue
+            if (!element.parameter.descriptor.type.hasComposableAnnotation())
+                return true
         }
         return false
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt
new file mode 100644
index 0000000..055bf15
--- /dev/null
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/IrInlineReferenceLocator.kt
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this 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.compiler.plugins.kotlin.lower
+
+import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
+import org.jetbrains.kotlin.backend.jvm.ir.isInlineParameter
+import org.jetbrains.kotlin.ir.IrElement
+import org.jetbrains.kotlin.ir.declarations.IrDeclaration
+import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
+import org.jetbrains.kotlin.ir.declarations.IrFunction
+import org.jetbrains.kotlin.ir.declarations.IrValueParameter
+import org.jetbrains.kotlin.ir.declarations.IrVariable
+import org.jetbrains.kotlin.ir.expressions.IrBlock
+import org.jetbrains.kotlin.ir.expressions.IrCallableReference
+import org.jetbrains.kotlin.ir.expressions.IrExpression
+import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
+import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
+import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
+import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
+import org.jetbrains.kotlin.ir.util.dump
+import org.jetbrains.kotlin.ir.util.isLambda
+import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
+
+internal open class IrInlineReferenceLocator(private val context: IrPluginContext) :
+    IrElementVisitor<Unit, IrDeclaration?> {
+    override fun visitElement(element: IrElement, data: IrDeclaration?) {
+        element.acceptChildren(this, data)
+    }
+
+    override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclaration?) {
+        val scope = if (declaration is IrVariable) data else declaration
+        declaration.acceptChildren(this, scope)
+    }
+
+    override fun visitFunctionAccess(expression: IrFunctionAccessExpression, data: IrDeclaration?) {
+        val function = expression.symbol.owner
+        if (function.isInlineFunctionCall(context)) {
+            for (parameter in function.valueParameters) {
+                if (!parameter.isInlineParameter())
+                    continue
+
+                val valueArgument = expression.getValueArgument(parameter.index) ?: continue
+                if (!valueArgument.isInlineIrExpression())
+                    continue
+
+                if (valueArgument is IrBlock) {
+                    visitInlineLambda(
+                        valueArgument.statements.last() as IrFunctionReference,
+                        function,
+                        parameter,
+                        data!!
+                    )
+                } else if (valueArgument is IrFunctionExpression) {
+                    visitInlineLambda(valueArgument, function, parameter, data!!)
+                } else if (valueArgument is IrCallableReference<*>) {
+                    visitInlineReference(valueArgument)
+                }
+            }
+        }
+        return super.visitFunctionAccess(expression, data)
+    }
+
+    open fun visitInlineReference(argument: IrCallableReference<*>) {}
+
+    open fun visitInlineLambda(
+        argument: IrFunctionReference,
+        callee: IrFunction,
+        parameter: IrValueParameter,
+        scope: IrDeclaration
+    ) = visitInlineReference(argument)
+
+    open fun visitInlineLambda(
+        argument: IrFunctionExpression,
+        callee: IrFunction,
+        parameter: IrValueParameter,
+        scope: IrDeclaration
+    ) {}
+
+    companion object {
+        fun scan(context: IrPluginContext, element: IrElement): Set<InlineLambdaInfo> =
+            mutableSetOf<InlineLambdaInfo>().apply {
+                element.accept(
+                    object : IrInlineReferenceLocator(context) {
+                        override fun visitInlineLambda(
+                            argument: IrFunctionExpression,
+                            callee: IrFunction,
+                            parameter: IrValueParameter,
+                            scope: IrDeclaration
+                        ) {
+                            add(InlineLambdaInfo(argument, callee, parameter, scope))
+                        }
+                    },
+                    null
+                )
+            }
+    }
+}
+
+data class InlineLambdaInfo(
+    val argument: IrFunctionExpression,
+    val callee: IrFunction,
+    val parameter: IrValueParameter,
+    val scope: IrDeclaration
+)
+
+@Suppress("UNUSED_PARAMETER")
+fun IrFunction.isInlineFunctionCall(context: IrPluginContext) =
+    (/*!context.state.isInlineDisabled */ true || typeParameters.any { it.isReified }) && isInline
+
+fun IrExpression.isInlineIrExpression() =
+    when (this) {
+        is IrBlock -> origin.isInlineIrExpression()
+        is IrCallableReference<*> -> true.also {
+            assert((0 until valueArgumentsCount).count { getValueArgument(it) != null } == 0) {
+                "Expecting 0 value arguments for bounded callable reference: ${dump()}"
+            }
+        }
+        is IrFunctionExpression -> origin.isInlineIrExpression()
+        else -> false
+    }
+
+fun IrStatementOrigin?.isInlineIrExpression(): Boolean {
+    if (isLambda) return true
+    if (this == IrStatementOrigin.ADAPTED_FUNCTION_REFERENCE) return true
+    if (this == IrStatementOrigin.SUSPEND_CONVERSION) return true
+    return false
+}
diff --git a/compose/desktop/desktop/api/current.txt b/compose/desktop/desktop/api/current.txt
deleted file mode 100644
index 8cc3bfeee..0000000
--- a/compose/desktop/desktop/api/current.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Signature format: 4.0
-package androidx.compose.desktop {
-
-  public final class DesktopTheme_jvmKt {
-    method @androidx.compose.runtime.Composable public static void DesktopMaterialTheme(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);
-    method @androidx.compose.runtime.Composable public static void DesktopTheme(optional androidx.compose.foundation.ScrollbarStyle scrollbar, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
-package androidx.compose.ui.window {
-
-  public final class DragGestureFilter_jvmKt {
-  }
-
-  public final class WindowDraggableArea_jvmKt {
-    method @androidx.compose.runtime.Composable public static void WindowDraggableArea(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
diff --git a/compose/desktop/desktop/api/public_plus_experimental_current.txt b/compose/desktop/desktop/api/public_plus_experimental_current.txt
deleted file mode 100644
index 8cc3bfeee..0000000
--- a/compose/desktop/desktop/api/public_plus_experimental_current.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Signature format: 4.0
-package androidx.compose.desktop {
-
-  public final class DesktopTheme_jvmKt {
-    method @androidx.compose.runtime.Composable public static void DesktopMaterialTheme(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);
-    method @androidx.compose.runtime.Composable public static void DesktopTheme(optional androidx.compose.foundation.ScrollbarStyle scrollbar, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
-package androidx.compose.ui.window {
-
-  public final class DragGestureFilter_jvmKt {
-  }
-
-  public final class WindowDraggableArea_jvmKt {
-    method @androidx.compose.runtime.Composable public static void WindowDraggableArea(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
diff --git a/compose/desktop/desktop/api/restricted_current.txt b/compose/desktop/desktop/api/restricted_current.txt
deleted file mode 100644
index 8cc3bfeee..0000000
--- a/compose/desktop/desktop/api/restricted_current.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Signature format: 4.0
-package androidx.compose.desktop {
-
-  public final class DesktopTheme_jvmKt {
-    method @androidx.compose.runtime.Composable public static void DesktopMaterialTheme(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);
-    method @androidx.compose.runtime.Composable public static void DesktopTheme(optional androidx.compose.foundation.ScrollbarStyle scrollbar, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
-package androidx.compose.ui.window {
-
-  public final class DragGestureFilter_jvmKt {
-  }
-
-  public final class WindowDraggableArea_jvmKt {
-    method @androidx.compose.runtime.Composable public static void WindowDraggableArea(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> content);
-  }
-
-}
-
diff --git a/compose/desktop/desktop/build.gradle b/compose/desktop/desktop/build.gradle
index 3ad883b..ce53db3 100644
--- a/compose/desktop/desktop/build.gradle
+++ b/compose/desktop/desktop/build.gradle
@@ -75,10 +75,12 @@
 androidx {
     name = "Jetpack Compose desktop implementation"
     type = LibraryType.PUBLISHED_LIBRARY
-    mavenVersion = LibraryVersions.COMPOSE_DESKTOP
     mavenGroup = LibraryGroups.Compose.DESKTOP
     inceptionYear = "2020"
     legacyDisableKotlinStrictApiMode = true
+    runApiTasks = new RunApiTasks.No(
+            "API tracking for desktop isn't supported at the moment, see b/163110180"
+    )
 }
 
 PublicationContainer.metaClass.jvmOs = { name, skikoDeps ->
@@ -90,7 +92,7 @@
                 def desktopDependency = dependenciesNode.appendNode("dependency")
                 desktopDependency.appendNode("groupId", group)
                 desktopDependency.appendNode("artifactId", project.name)
-                desktopDependency.appendNode("version", LibraryVersions.COMPOSE_DESKTOP)
+                desktopDependency.appendNode("version", LibraryVersions.COMPOSE)
                 desktopDependency.appendNode("scope", "compile")
 
                 for (skiko in skikoDeps) {
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
index 4249b80..c6a8e02 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
@@ -35,7 +35,7 @@
 import androidx.compose.material.Button
 import androidx.compose.material.ButtonDefaults
 import androidx.compose.material.Checkbox
-import androidx.compose.material.DropdownMenu
+import androidx.compose.material.ContextMenu
 import androidx.compose.material.DropdownMenuItem
 import androidx.compose.material.RadioButton
 import androidx.compose.material.Surface
@@ -53,15 +53,15 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
-import androidx.compose.ui.window.DialogProperties
 import androidx.compose.ui.window.Dialog
+import androidx.compose.ui.window.DialogProperties
 import androidx.compose.ui.window.Notifier
 import androidx.compose.ui.window.Popup
 import androidx.compose.ui.window.Tray
 import androidx.compose.ui.window.WindowDraggableArea
-import java.awt.event.ActionListener
-import java.awt.event.ActionEvent
 import java.awt.Toolkit
+import java.awt.event.ActionEvent
+import java.awt.event.ActionListener
 import javax.swing.JButton
 
 @Composable
@@ -277,7 +277,7 @@
                     TextBox(text = "Alert Dialog")
                 },
                 text = {
-                    println("Ambient value is ${AmbientTest.current}.")
+                    println("CompositionLocal value is ${LocalTest.current}.")
                     TextBox(text = "Increment amount?")
                     DisposableEffect(Unit) {
                         onDispose {
@@ -312,10 +312,10 @@
             Popup(
                 alignment = Alignment.TopCenter,
                 offset = IntOffset(0, 50),
-                isFocusable = true,
+                focusable = true,
                 onDismissRequest = onDismiss
             ) {
-                println("Ambient value is ${AmbientTest.current}.")
+                println("CompositionLocal value is ${LocalTest.current}.")
                 PopupContent(onDismiss)
                 DisposableEffect(Unit) {
                     onDispose {
@@ -426,7 +426,7 @@
                 .height(35.dp)
                 .padding(start = 4.dp, end = 4.dp)
         )
-        DropdownMenu(
+        ContextMenu(
             expanded = showMenu.value,
             onDismissRequest = { showMenu.value = false }
         ) {
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
index e0f2942..0ace057 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
@@ -78,7 +78,7 @@
         )
     ).show {
         CompositionLocalProvider(
-            AmbientTest provides 42
+            LocalTest provides 42
         ) {
             content()
         }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
index c3376b1..7a6e0e3 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/TestAmbient.jvm.kt
@@ -18,6 +18,6 @@
 
 import androidx.compose.runtime.staticCompositionLocalOf
 
-val AmbientTest = staticCompositionLocalOf<Int> {
-    error("AmbientTest not provided")
+val LocalTest = staticCompositionLocalOf<Int> {
+    error("LocalTest not provided")
 }
\ No newline at end of file
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
index cfd39318..1e9d175 100644
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
+++ b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/DesktopTheme.jvm.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.desktop
 
+import androidx.compose.foundation.LocalScrollbarStyle
 import androidx.compose.foundation.ScrollbarStyle
-import androidx.compose.foundation.ScrollbarStyleAmbient
 import androidx.compose.material.Colors
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Shapes
@@ -52,6 +52,6 @@
     ),
     content: @Composable () -> Unit
 ) = CompositionLocalProvider(
-    ScrollbarStyleAmbient provides scrollbar,
+    LocalScrollbarStyle provides scrollbar,
     content = content
 )
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/api/1.0.0-beta06.txt b/compose/foundation/foundation-layout/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..bddffea
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.0.0-beta06.txt
@@ -0,0 +1,207 @@
+// 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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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/1.0.0-beta07.txt b/compose/foundation/foundation-layout/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..bddffea
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.0.0-beta07.txt
@@ -0,0 +1,207 @@
+// 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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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/current.txt b/compose/foundation/foundation-layout/api/current.txt
index e119d9f..bddffea 100644
--- a/compose/foundation/foundation-layout/api/current.txt
+++ b/compose/foundation/foundation-layout/api/current.txt
@@ -136,11 +136,11 @@
   public final class PaddingKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
-    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(float horizontal, float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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 public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
diff --git a/compose/foundation/foundation-layout/api/public_plus_experimental_1.0.0-beta06.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..6bf66c6
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.0.0-beta06.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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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.0.0-beta07.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..6bf66c6
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.0.0-beta07.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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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_current.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
index ca89232..6bf66c6 100644
--- a/compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
@@ -139,11 +139,11 @@
   public final class PaddingKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
-    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(float horizontal, float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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 public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
diff --git a/compose/foundation/foundation-layout/api/res-1.0.0-beta06.txt b/compose/foundation/foundation-layout/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/res-1.0.0-beta06.txt
diff --git a/compose/foundation/foundation-layout/api/res-1.0.0-beta07.txt b/compose/foundation/foundation-layout/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/res-1.0.0-beta07.txt
diff --git a/compose/foundation/foundation-layout/api/restricted_1.0.0-beta06.txt b/compose/foundation/foundation-layout/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..334ae3f
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,212 @@
+// 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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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/restricted_1.0.0-beta07.txt b/compose/foundation/foundation-layout/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..334ae3f
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,212 @@
+// 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-XACvGJ4(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 paddingFrom-x1H7Rps(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 paddingFromBaseline-S2lCeAQ(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline-zCFLmh4(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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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-0680j_4(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy-6mHxxJo(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy-w0p642k(float space, androidx.compose.ui.Alignment.Horizontal 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.Immutable 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-D9Ej5fM();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Immutable 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.Immutable 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-D9Ej5fM();
+    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-msEJaDk();
+    method public float getMaxHeight-D9Ej5fM();
+    method public float getMaxWidth-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    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 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 absoluteOffset-S2lCeAQ(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);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset-S2lCeAQ(androidx.compose.ui.Modifier, optional float x, optional float y);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
+  }
+
+  @androidx.compose.runtime.Immutable public interface PaddingValues {
+    method @androidx.compose.runtime.Stable public float calculateBottomPadding-D9Ej5fM();
+    method @androidx.compose.runtime.Stable public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public float calculateTopPadding-D9Ej5fM();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    method public float calculateBottomPadding-D9Ej5fM();
+    method public float calculateLeftPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding-D9Ej5fM(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding-D9Ej5fM();
+  }
+
+  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-S2lCeAQ(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-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight-wxomhCo(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn-S2lCeAQ(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-S2lCeAQ(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size-wxomhCo(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn-S2lCeAQ(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/restricted_current.txt b/compose/foundation/foundation-layout/api/restricted_current.txt
index 4c0fda5..334ae3f 100644
--- a/compose/foundation/foundation-layout/api/restricted_current.txt
+++ b/compose/foundation/foundation-layout/api/restricted_current.txt
@@ -139,11 +139,11 @@
   public final class PaddingKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-0680j_4(float all);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ZmiikuI(optional float start, optional float top, optional float end, optional float bottom);
-    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(float horizontal, float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues-ioHfwGI(optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding-w2-DAAU(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 public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-S2lCeAQ(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding-w2-DAAU(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-wxomhCo(androidx.compose.ui.Modifier, float all);
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
index 4e5a26b..ace9fdd 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/NestedBoxesTestCase.kt
@@ -18,7 +18,7 @@
 
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 
 /**
  * Test case representing a layout hierarchy of nested boxes.
@@ -26,10 +26,10 @@
 class NestedBoxesTestCase(
     private val depth: Int,
     private val children: Int
-) : ComposeTestCase {
+) : LayeredComposeTestCase() {
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         Box {
             Boxes(depth - 1, children)
         }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnSharedModelTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnSharedModelTestCase.kt
index 34791dd..18add1b 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnSharedModelTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnSharedModelTestCase.kt
@@ -20,10 +20,9 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.size
-import androidx.compose.material.MaterialTheme
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -38,20 +37,18 @@
  */
 class RectsInColumnSharedModelTestCase(
     private val amountOfRectangles: Int
-) : ComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val color = mutableStateOf(Color.Black)
 
     @Composable
-    override fun Content() {
-        MaterialTheme {
-            Column {
-                repeat(amountOfRectangles) { i ->
-                    if (i == 0) {
-                        Box(Modifier.size(100.dp, 50.dp).background(color = color.value))
-                    } else {
-                        Box(Modifier.size(100.dp, 50.dp).background(color = Color.Green))
-                    }
+    override fun MeasuredContent() {
+        Column {
+            repeat(amountOfRectangles) { i ->
+                if (i == 0) {
+                    Box(Modifier.size(100.dp, 50.dp).background(color = color.value))
+                } else {
+                    Box(Modifier.size(100.dp, 50.dp).background(color = Color.Green))
                 }
             }
         }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
index fce4d49..63c62bf 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/RectsInColumnTestCase.kt
@@ -20,13 +20,11 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.size
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Surface
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -40,19 +38,15 @@
  */
 class RectsInColumnTestCase(
     private val amountOfRectangles: Int
-) : ComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val states = mutableListOf<MutableState<Color>>()
 
     @Composable
-    override fun Content() {
-        MaterialTheme {
-            Surface {
-                Column {
-                    repeat(amountOfRectangles) {
-                        ColoredRectWithModel()
-                    }
-                }
+    override fun MeasuredContent() {
+        Column {
+            repeat(amountOfRectangles) {
+                ColoredRectWithModel()
             }
         }
     }
diff --git a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SpacingBenchmark.kt b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SpacingBenchmark.kt
index ca00d7b..182d5b4 100644
--- a/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SpacingBenchmark.kt
+++ b/compose/foundation/foundation-layout/benchmark/src/androidTest/java/androidx/compose/foundation/layout/benchmark/SpacingBenchmark.kt
@@ -24,7 +24,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkDrawPerf
@@ -158,7 +158,7 @@
     }
 }
 
-private sealed class PaddingTestCase : ComposeTestCase, ToggleableTestCase {
+private sealed class PaddingTestCase : LayeredComposeTestCase(), ToggleableTestCase {
 
     var paddingState: MutableState<Dp>? = null
 
@@ -169,7 +169,7 @@
     }
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         val padding = remember { mutableStateOf(5.dp) }
         paddingState = padding
 
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
index c8e9953..66665ef 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/RowColumnTest.kt
@@ -1743,6 +1743,25 @@
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
+
+    @Test
+    fun testRow_doesNotExpand_whenWeightChildrenDoNotFill() = with(density) {
+        val size = 10
+        var rowWidth = 0
+        val latch = CountDownLatch(1)
+        show {
+            Row(
+                Modifier.onGloballyPositioned {
+                    rowWidth = it.size.width
+                    latch.countDown()
+                }
+            ) {
+                Box(Modifier.weight(1f, false).size(size.toDp()))
+            }
+        }
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+        assertEquals(size, rowWidth)
+    }
     // endregion
 
     // region Size tests in Column
@@ -2233,6 +2252,25 @@
         }
         assertTrue(latch.await(1, TimeUnit.SECONDS))
     }
+
+    @Test
+    fun testColumn_doesNotExpand_whenWeightChildrenDoNotFill() = with(density) {
+        val size = 10
+        var columnHeight = 0
+        val latch = CountDownLatch(1)
+        show {
+            Column(
+                Modifier.onGloballyPositioned {
+                    columnHeight = it.size.height
+                    latch.countDown()
+                }
+            ) {
+                Box(Modifier.weight(1f, false).size(size.toDp()))
+            }
+        }
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+        assertEquals(size, columnHeight)
+    }
     // endregion
 
     // region Main axis alignment tests in Row
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
index 4342167..c2069a5 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/SizeTest.kt
@@ -1953,4 +1953,25 @@
         val root = findComposeView()
         waitForDraw(root)
     }
+
+    @Test
+    fun sizeModifiers_doNotCauseCrashesWhenCreatingConstraints() {
+        show {
+            Box(Modifier.sizeIn(minWidth = -1.dp))
+            Box(Modifier.sizeIn(minWidth = 10.dp, maxWidth = 5.dp))
+            Box(Modifier.sizeIn(minHeight = -1.dp))
+            Box(Modifier.sizeIn(minHeight = 10.dp, maxHeight = 5.dp))
+            Box(
+                Modifier.sizeIn(
+                    minWidth = Dp.Infinity,
+                    maxWidth = Dp.Infinity,
+                    minHeight = Dp.Infinity,
+                    maxHeight = Dp.Infinity
+                )
+            )
+            Box(Modifier.defaultMinSize(minWidth = -1.dp, minHeight = -1.dp))
+        }
+        val root = findComposeView()
+        waitForDraw(root)
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
index 162884c7..9728409 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Arrangement.kt
@@ -111,11 +111,9 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeLeftOrTop(sizes, outPositions)
+            placeLeftOrTop(sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeRightOrBottom(totalSize, sizes, outPositions)
-            outPositions.reverse()
+            placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = true)
         }
 
         override fun toString() = "Arrangement#Start"
@@ -134,11 +132,9 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeRightOrBottom(totalSize, sizes, outPositions)
+            placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeLeftOrTop(sizes, outPositions)
-            outPositions.reverse()
+            placeLeftOrTop(sizes, outPositions, reverseInput = true)
         }
 
         override fun toString() = "Arrangement#End"
@@ -155,7 +151,7 @@
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeLeftOrTop(sizes, outPositions)
+        ) = placeLeftOrTop(sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#Top"
     }
@@ -171,7 +167,7 @@
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeRightOrBottom(totalSize, sizes, outPositions)
+        ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#Start"
     }
@@ -190,18 +186,16 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeCenter(totalSize, sizes, outPositions)
+            placeCenter(totalSize, sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeCenter(totalSize, sizes, outPositions)
-            outPositions.reverse()
+            placeCenter(totalSize, sizes, outPositions, reverseInput = true)
         }
 
         override fun Density.arrange(
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeCenter(totalSize, sizes, outPositions)
+        ) = placeCenter(totalSize, sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#Center"
     }
@@ -221,18 +215,16 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceEvenly(totalSize, sizes, outPositions)
+            placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeSpaceEvenly(totalSize, sizes, outPositions)
-            outPositions.reverse()
+            placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = true)
         }
 
         override fun Density.arrange(
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeSpaceEvenly(totalSize, sizes, outPositions)
+        ) = placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#SpaceEvenly"
     }
@@ -252,18 +244,16 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceBetween(totalSize, sizes, outPositions)
+            placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeSpaceBetween(totalSize, sizes, outPositions)
-            outPositions.reverse()
+            placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = true)
         }
 
         override fun Density.arrange(
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeSpaceBetween(totalSize, sizes, outPositions)
+        ) = placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#SpaceBetween"
     }
@@ -284,18 +274,16 @@
             layoutDirection: LayoutDirection,
             outPositions: IntArray
         ) = if (layoutDirection == LayoutDirection.Ltr) {
-            placeSpaceAround(totalSize, sizes, outPositions)
+            placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
         } else {
-            sizes.reverse()
-            placeSpaceAround(totalSize, sizes, outPositions)
-            outPositions.reverse()
+            placeSpaceAround(totalSize, sizes, outPositions, reverseInput = true)
         }
 
         override fun Density.arrange(
             totalSize: Int,
             sizes: IntArray,
             outPositions: IntArray
-        ) = placeSpaceAround(totalSize, sizes, outPositions)
+        ) = placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
 
         override fun toString() = "Arrangement#SpaceAround"
     }
@@ -381,7 +369,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeLeftOrTop(sizes, outPositions)
+            ) = placeLeftOrTop(sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#Left"
         }
@@ -401,7 +389,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeCenter(totalSize, sizes, outPositions)
+            ) = placeCenter(totalSize, sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#Center"
         }
@@ -422,7 +410,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeRightOrBottom(totalSize, sizes, outPositions)
+            ) = placeRightOrBottom(totalSize, sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#Right"
         }
@@ -443,7 +431,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeSpaceBetween(totalSize, sizes, outPositions)
+            ) = placeSpaceBetween(totalSize, sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#SpaceBetween"
         }
@@ -464,7 +452,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeSpaceEvenly(totalSize, sizes, outPositions)
+            ) = placeSpaceEvenly(totalSize, sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#SpaceEvenly"
         }
@@ -486,7 +474,7 @@
                 sizes: IntArray,
                 layoutDirection: LayoutDirection,
                 outPositions: IntArray
-            ) = placeSpaceAround(totalSize, sizes, outPositions)
+            ) = placeSpaceAround(totalSize, sizes, outPositions, reverseInput = false)
 
             override fun toString() = "AbsoluteArrangement#SpaceAround"
         }
@@ -610,44 +598,60 @@
     internal fun placeRightOrBottom(
         totalSize: Int,
         size: IntArray,
-        outPosition: IntArray
+        outPosition: IntArray,
+        reverseInput: Boolean
     ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
         var current = totalSize - consumedSize
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current
             current += it
         }
     }
 
-    internal fun placeLeftOrTop(size: IntArray, outPosition: IntArray) {
+    internal fun placeLeftOrTop(size: IntArray, outPosition: IntArray, reverseInput: Boolean) {
         var current = 0
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current
             current += it
         }
     }
 
-    internal fun placeCenter(totalSize: Int, size: IntArray, outPosition: IntArray) {
+    internal fun placeCenter(
+        totalSize: Int,
+        size: IntArray,
+        outPosition: IntArray,
+        reverseInput: Boolean
+    ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
         var current = (totalSize - consumedSize).toFloat() / 2
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current.roundToInt()
             current += it.toFloat()
         }
     }
 
-    internal fun placeSpaceEvenly(totalSize: Int, size: IntArray, outPosition: IntArray) {
+    internal fun placeSpaceEvenly(
+        totalSize: Int,
+        size: IntArray,
+        outPosition: IntArray,
+        reverseInput: Boolean
+    ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
         val gapSize = (totalSize - consumedSize).toFloat() / (size.size + 1)
         var current = gapSize
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current.roundToInt()
             current += it.toFloat() + gapSize
         }
     }
 
-    internal fun placeSpaceBetween(totalSize: Int, size: IntArray, outPosition: IntArray) {
+    internal fun placeSpaceBetween(
+        totalSize: Int,
+        size: IntArray,
+        outPosition: IntArray,
+        reverseInput: Boolean
+    ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
         val gapSize = if (size.size > 1) {
             (totalSize - consumedSize).toFloat() / (size.size - 1)
@@ -655,12 +659,18 @@
             0f
         }
         var current = 0f
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current.roundToInt()
             current += it.toFloat() + gapSize
         }
     }
-    internal fun placeSpaceAround(totalSize: Int, size: IntArray, outPosition: IntArray) {
+
+    internal fun placeSpaceAround(
+        totalSize: Int,
+        size: IntArray,
+        outPosition: IntArray,
+        reverseInput: Boolean
+    ) {
         val consumedSize = size.fold(0) { a, b -> a + b }
         val gapSize = if (size.isNotEmpty()) {
             (totalSize - consumedSize).toFloat() / size.size
@@ -668,9 +678,19 @@
             0f
         }
         var current = gapSize / 2
-        size.forEachIndexed { index, it ->
+        size.forEachIndexed(reverseInput) { index, it ->
             outPosition[index] = current.roundToInt()
             current += it.toFloat() + gapSize
         }
     }
+
+    private inline fun IntArray.forEachIndexed(reversed: Boolean, action: (Int, Int) -> Unit) {
+        if (!reversed) {
+            forEachIndexed(action)
+        } else {
+            for (i in (size - 1) downTo 0) {
+                action(i, get(i))
+            }
+        }
+    }
 }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
index 07cdbeb..9534a6d 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
@@ -45,7 +45,11 @@
  * the [Box] according to the [contentAlignment]. For individually specifying the alignments
  * of the children layouts, use the [BoxScope.align] modifier.
  * By default, the content will be measured without the [Box]'s incoming min constraints,
- * unless [propagateMinConstraints] is `true`.
+ * unless [propagateMinConstraints] is `true`. As an example, setting [propagateMinConstraints] to
+ * `true` can be useful when the [Box] has content on which modifiers cannot be specified
+ * directly and setting a min size on the content of the [Box] is needed. If
+ * [propagateMinConstraints] is set to `true`, the min size set on the [Box] will also be
+ * applied to the content, whereas otherwise the min size will only apply to the [Box].
  * When the content has more than one layout child the layout children will be stacked one
  * on top of the other (positioned as explained above) in the composition order.
  *
@@ -253,11 +257,9 @@
     )
 }
 
-@get:Suppress("ModifierFactoryReturnType", "ModifierFactoryExtensionFunction")
 private val Measurable.boxChildData: BoxChildData? get() = parentData as? BoxChildData
 private val Measurable.matchesParentSize: Boolean get() = boxChildData?.matchParentSize ?: false
 
-@Suppress("ModifierFactoryReturnType", "ModifierFactoryExtensionFunction")
 private class BoxChildData(
     var alignment: Alignment,
     var matchParentSize: Boolean = false,
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
index 4a30d5e..8d47c4e 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/BoxWithConstraints.kt
@@ -39,7 +39,12 @@
  * the layout according to the [contentAlignment]. For individually specifying the alignments
  * of the children layouts, use the [BoxScope.align] modifier.
  * By default, the content will be measured without the [Box]'s incoming min constraints,
- * unless [propagateMinConstraints] is `true`.
+ * unless [propagateMinConstraints] is `true`. As an example, setting [propagateMinConstraints] to
+ * `true` can be useful when the [BoxWithConstraints] has content on which modifiers cannot be
+ * specified directly and setting a min size on the content of the [BoxWithConstraints] is needed.
+ * If [propagateMinConstraints] is set to `true`, the min size set on the [BoxWithConstraints] will
+ * also be applied to the content, whereas otherwise the min size will only apply to the
+ * [BoxWithConstraints].
  * When the content has more than one layout child the layout children will be stacked one
  * on top of the other (positioned as explained above) in the composition order.
  *
@@ -93,7 +98,7 @@
      */
     val minHeight: Dp
     /**
-     * The minimum height in [Dp].
+     * The maximum height in [Dp].
      *
      * @see constraints for the values in pixels.
      */
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
index e1bb6e1..f9b4764 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Padding.kt
@@ -134,6 +134,7 @@
  * Example usage:
  * @sample androidx.compose.foundation.layout.samples.PaddingValuesModifier
  */
+@Stable
 fun Modifier.padding(paddingValues: PaddingValues) =
     this.then(
         PaddingValuesModifier(
@@ -281,7 +282,7 @@
  * dp along the top and bottom edges.
  */
 @Stable
-fun PaddingValues(horizontal: Dp, vertical: Dp): PaddingValues =
+fun PaddingValues(horizontal: Dp = 0.dp, vertical: Dp = 0.dp): PaddingValues =
     PaddingValuesImpl(horizontal, vertical, horizontal, vertical)
 
 /**
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
index bfa647b..e20038e 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/RowColumnImpl.kt
@@ -197,12 +197,7 @@
             }
 
             // Compute the Row or Column size and position the children.
-            val mainAxisLayoutSize =
-                if (totalWeight > 0f && constraints.mainAxisMax != Constraints.Infinity) {
-                    constraints.mainAxisMax
-                } else {
-                    max(fixedSpace + weightedSpace, constraints.mainAxisMin)
-                }
+            val mainAxisLayoutSize = max(fixedSpace + weightedSpace, constraints.mainAxisMin)
             val crossAxisLayoutSize = if (constraints.crossAxisMax != Constraints.Infinity &&
                 crossAxisSize == SizeMode.Expand
             ) {
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
index 4c4bebc..4bb3b4a 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Size.kt
@@ -37,6 +37,7 @@
 import androidx.compose.ui.unit.constrain
 import androidx.compose.ui.unit.constrainHeight
 import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.unit.dp
 import kotlin.math.roundToInt
 
 /**
@@ -424,17 +425,11 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfWidthModifier
  */
 @Stable
+@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxWidth(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
-    this.then(
-        FillModifier(
-            direction = Direction.Horizontal,
-            scale = fraction,
-            inspectorInfo = debugInspectorInfo {
-                name = "fillMaxWidth"
-                properties["fraction"] = fraction
-            }
-        )
-    )
+    this.then(if (fraction == 1f) FillWholeMaxWidth else createFillWidthModifier(fraction))
+
+private val FillWholeMaxWidth = createFillWidthModifier(1f)
 
 /**
  * Have the content fill (possibly only partially) the [Constraints.maxHeight] of the incoming
@@ -451,17 +446,11 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfHeightModifier
  */
 @Stable
+@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxHeight(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
-    this.then(
-        FillModifier(
-            direction = Direction.Vertical,
-            scale = fraction,
-            inspectorInfo = debugInspectorInfo {
-                name = "fillMaxHeight"
-                properties["fraction"] = fraction
-            }
-        )
-    )
+    this.then(if (fraction == 1f) FillWholeMaxHeight else createFillHeightModifier(fraction))
+
+private val FillWholeMaxHeight = createFillHeightModifier(1f)
 
 /**
  * Have the content fill (possibly only partially) the [Constraints.maxWidth] and
@@ -482,17 +471,11 @@
  * @sample androidx.compose.foundation.layout.samples.FillHalfSizeModifier
  */
 @Stable
+@Suppress("ModifierInspectorInfo")
 fun Modifier.fillMaxSize(/*@FloatRange(from = 0.0, to = 1.0)*/ fraction: Float = 1f) =
-    this.then(
-        FillModifier(
-            direction = Direction.Both,
-            scale = fraction,
-            inspectorInfo = debugInspectorInfo {
-                name = "fillMaxSize"
-                properties["fraction"] = fraction
-            }
-        )
-    )
+    this.then(if (fraction == 1f) FillWholeMaxSize else createFillSizeModifier(fraction))
+
+private val FillWholeMaxSize = createFillSizeModifier(1f)
 
 /**
  * Allow the content to measure at its desired width without regard for the incoming measurement
@@ -507,26 +490,24 @@
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentHorizontallyAlignedModifier
  */
 @Stable
-// TODO(popam): avoid recreating modifier for common align
+@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentWidth(
     align: Alignment.Horizontal = Alignment.CenterHorizontally,
     unbounded: Boolean = false
 ) = this.then(
-    WrapContentModifier(
-        direction = Direction.Horizontal,
-        unbounded = unbounded,
-        alignmentCallback = { size, layoutDirection ->
-            IntOffset(align.align(0, size.width, layoutDirection), 0)
-        },
-        align,
-        inspectorInfo = debugInspectorInfo {
-            name = "wrapContentWidth"
-            properties["align"] = align
-            properties["unbounded"] = unbounded
-        }
-    )
+    if (align == Alignment.CenterHorizontally && !unbounded) {
+        WrapContentWidthCenter
+    } else if (align == Alignment.Start && !unbounded) {
+        WrapContentWidthStart
+    } else {
+        createWrapContentWidthModifier(align, unbounded)
+    }
 )
 
+private val WrapContentWidthCenter =
+    createWrapContentWidthModifier(Alignment.CenterHorizontally, false)
+private val WrapContentWidthStart = createWrapContentWidthModifier(Alignment.Start, false)
+
 /**
  * Allow the content to measure at its desired height without regard for the incoming measurement
  * [minimum height constraint][Constraints.minHeight], and, if [unbounded] is true, also without
@@ -538,27 +519,25 @@
  * Example usage:
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentVerticallyAlignedModifier
  */
-// TODO(popam): avoid recreating modifier for common align
 @Stable
+@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentHeight(
     align: Alignment.Vertical = Alignment.CenterVertically,
     unbounded: Boolean = false
 ) = this.then(
-    WrapContentModifier(
-        direction = Direction.Vertical,
-        unbounded = unbounded,
-        alignmentCallback = { size, _ ->
-            IntOffset(0, align.align(0, size.height))
-        },
-        align,
-        inspectorInfo = debugInspectorInfo {
-            name = "wrapContentHeight"
-            properties["align"] = align
-            properties["unbounded"] = unbounded
-        }
-    )
+    if (align == Alignment.CenterVertically && !unbounded) {
+        WrapContentHeightCenter
+    } else if (align == Alignment.Top && !unbounded) {
+        WrapContentHeightTop
+    } else {
+        createWrapContentHeightModifier(align, unbounded)
+    }
 )
 
+private val WrapContentHeightCenter =
+    createWrapContentHeightModifier(Alignment.CenterVertically, false)
+private val WrapContentHeightTop = createWrapContentHeightModifier(Alignment.Top, false)
+
 /**
  * Allow the content to measure at its desired size without regard for the incoming measurement
  * [minimum width][Constraints.minWidth] or [minimum height][Constraints.minHeight] constraints,
@@ -571,25 +550,23 @@
  * @sample androidx.compose.foundation.layout.samples.SimpleWrapContentAlignedModifier
  */
 @Stable
+@Suppress("ModifierInspectorInfo")
 fun Modifier.wrapContentSize(
     align: Alignment = Alignment.Center,
     unbounded: Boolean = false
 ) = this.then(
-    WrapContentModifier(
-        direction = Direction.Both,
-        unbounded = unbounded,
-        alignmentCallback = { size, layoutDirection ->
-            align.align(IntSize.Zero, size, layoutDirection)
-        },
-        align,
-        inspectorInfo = debugInspectorInfo {
-            name = "wrapContentSize"
-            properties["align"] = align
-            properties["unbounded"] = unbounded
-        }
-    )
+    if (align == Alignment.Center && !unbounded) {
+        WrapContentSizeCenter
+    } else if (align == Alignment.TopStart && !unbounded) {
+        WrapContentSizeTopStart
+    } else {
+        createWrapContentSizeModifier(align, unbounded)
+    }
 )
 
+private val WrapContentSizeCenter = createWrapContentSizeModifier(Alignment.Center, false)
+private val WrapContentSizeTopStart = createWrapContentSizeModifier(Alignment.TopStart, false)
+
 /**
  * Constrain the size of the wrapped layout only when it would be otherwise unconstrained:
  * the [minWidth] and [minHeight] constraints are only applied when the incoming corresponding
@@ -618,7 +595,7 @@
 
 private class FillModifier(
     private val direction: Direction,
-    private val scale: Float,
+    private val fraction: Float,
     inspectorInfo: InspectorInfo.() -> Unit
 ) : LayoutModifier, InspectorValueInfo(inspectorInfo) {
     override fun MeasureScope.measure(
@@ -628,7 +605,7 @@
         val minWidth: Int
         val maxWidth: Int
         if (constraints.hasBoundedWidth && direction != Direction.Vertical) {
-            val width = (constraints.maxWidth * scale).roundToInt()
+            val width = (constraints.maxWidth * fraction).roundToInt()
                 .coerceIn(constraints.minWidth, constraints.maxWidth)
             minWidth = width
             maxWidth = width
@@ -639,7 +616,7 @@
         val minHeight: Int
         val maxHeight: Int
         if (constraints.hasBoundedHeight && direction != Direction.Horizontal) {
-            val height = (constraints.maxHeight * scale).roundToInt()
+            val height = (constraints.maxHeight * fraction).roundToInt()
                 .coerceIn(constraints.minHeight, constraints.maxHeight)
             minHeight = height
             maxHeight = height
@@ -657,11 +634,41 @@
     }
 
     override fun equals(other: Any?) =
-        other is FillModifier && direction == other.direction && scale == other.scale
+        other is FillModifier && direction == other.direction && fraction == other.fraction
 
-    override fun hashCode() = direction.hashCode() * 31 + scale.hashCode()
+    override fun hashCode() = direction.hashCode() * 31 + fraction.hashCode()
 }
 
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createFillWidthModifier(fraction: Float) = FillModifier(
+    direction = Direction.Horizontal,
+    fraction = fraction,
+    inspectorInfo = {
+        name = "fillMaxWidth"
+        properties["fraction"] = fraction
+    }
+)
+
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createFillHeightModifier(fraction: Float) = FillModifier(
+    direction = Direction.Vertical,
+    fraction = fraction,
+    inspectorInfo = {
+        name = "fillMaxHeight"
+        properties["fraction"] = fraction
+    }
+)
+
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createFillSizeModifier(fraction: Float) = FillModifier(
+    direction = Direction.Both,
+    fraction = fraction,
+    inspectorInfo = {
+        name = "fillMaxSize"
+        properties["fraction"] = fraction
+    }
+)
+
 private class SizeModifier(
     private val minWidth: Dp = Dp.Unspecified,
     private val minHeight: Dp = Dp.Unspecified,
@@ -670,18 +677,39 @@
     private val enforceIncoming: Boolean,
     inspectorInfo: InspectorInfo.() -> Unit
 ) : LayoutModifier, InspectorValueInfo(inspectorInfo) {
-    private val Density.targetConstraints
-        get() = Constraints(
-            minWidth = if (minWidth != Dp.Unspecified) minWidth.roundToPx() else 0,
-            minHeight = if (minHeight != Dp.Unspecified) minHeight.roundToPx() else 0,
-            maxWidth =
-                if (maxWidth != Dp.Unspecified) maxWidth.roundToPx() else Constraints.Infinity,
-            maxHeight = if (maxHeight != Dp.Unspecified) {
-                maxHeight.roundToPx()
+    private val Density.targetConstraints: Constraints
+        get() {
+            val maxWidth = if (maxWidth != Dp.Unspecified) {
+                maxWidth.coerceAtLeast(0.dp).roundToPx()
             } else {
                 Constraints.Infinity
             }
-        )
+            val maxHeight = if (maxHeight != Dp.Unspecified) {
+                maxHeight.coerceAtLeast(0.dp).roundToPx()
+            } else {
+                Constraints.Infinity
+            }
+            val minWidth = if (minWidth != Dp.Unspecified) {
+                minWidth.roundToPx().coerceAtMost(maxWidth).coerceAtLeast(0).let {
+                    if (it != Constraints.Infinity) it else 0
+                }
+            } else {
+                0
+            }
+            val minHeight = if (minHeight != Dp.Unspecified) {
+                minHeight.roundToPx().coerceAtMost(maxHeight).coerceAtLeast(0).let {
+                    if (it != Constraints.Infinity) it else 0
+                }
+            } else {
+                0
+            }
+            return Constraints(
+                minWidth = minWidth,
+                minHeight = minHeight,
+                maxWidth = maxWidth,
+                maxHeight = maxHeight
+            )
+        }
 
     override fun MeasureScope.measure(
         measurable: Measurable,
@@ -840,6 +868,60 @@
         (direction.hashCode() * 31 + unbounded.hashCode()) * 31 + align.hashCode()
 }
 
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createWrapContentWidthModifier(
+    align: Alignment.Horizontal,
+    unbounded: Boolean
+) = WrapContentModifier(
+    direction = Direction.Horizontal,
+    unbounded = unbounded,
+    alignmentCallback = { size, layoutDirection ->
+        IntOffset(align.align(0, size.width, layoutDirection), 0)
+    },
+    align,
+    inspectorInfo = {
+        name = "wrapContentWidth"
+        properties["align"] = align
+        properties["unbounded"] = unbounded
+    }
+)
+
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createWrapContentHeightModifier(
+    align: Alignment.Vertical,
+    unbounded: Boolean
+) = WrapContentModifier(
+    direction = Direction.Vertical,
+    unbounded = unbounded,
+    alignmentCallback = { size, _ ->
+        IntOffset(0, align.align(0, size.height))
+    },
+    align,
+    inspectorInfo = {
+        name = "wrapContentHeight"
+        properties["align"] = align
+        properties["unbounded"] = unbounded
+    }
+)
+
+@Suppress("ModifierFactoryExtensionFunction", "ModifierFactoryReturnType")
+private fun createWrapContentSizeModifier(
+    align: Alignment,
+    unbounded: Boolean
+) = WrapContentModifier(
+    direction = Direction.Both,
+    unbounded = unbounded,
+    alignmentCallback = { size, layoutDirection ->
+        align.align(IntSize.Zero, size, layoutDirection)
+    },
+    align,
+    inspectorInfo = {
+        name = "wrapContentSize"
+        properties["align"] = align
+        properties["unbounded"] = unbounded
+    }
+)
+
 private class UnspecifiedConstraintsModifier(
     val minWidth: Dp = Dp.Unspecified,
     val minHeight: Dp = Dp.Unspecified,
@@ -851,13 +933,13 @@
     ): MeasureResult {
         val wrappedConstraints = Constraints(
             if (minWidth != Dp.Unspecified && constraints.minWidth == 0) {
-                minWidth.roundToPx().coerceAtMost(constraints.maxWidth)
+                minWidth.roundToPx().coerceAtMost(constraints.maxWidth).coerceAtLeast(0)
             } else {
                 constraints.minWidth
             },
             constraints.maxWidth,
             if (minHeight != Dp.Unspecified && constraints.minHeight == 0) {
-                minHeight.roundToPx().coerceAtMost(constraints.maxHeight)
+                minHeight.roundToPx().coerceAtMost(constraints.maxHeight).coerceAtLeast(0)
             } else {
                 constraints.minHeight
             },
diff --git a/compose/foundation/foundation/api/1.0.0-beta05.txt b/compose/foundation/foundation/api/1.0.0-beta05.txt
index 6b2c807..ea3e99d 100644
--- a/compose/foundation/foundation/api/1.0.0-beta05.txt
+++ b/compose/foundation/foundation/api/1.0.0-beta05.txt
@@ -671,6 +671,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -735,10 +738,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/api/1.0.0-beta06.txt b/compose/foundation/foundation/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..03f29a3
--- /dev/null
+++ b/compose/foundation/foundation/api/1.0.0-beta06.txt
@@ -0,0 +1,743 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/1.0.0-beta07.txt b/compose/foundation/foundation/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..76355d9
--- /dev/null
+++ b/compose/foundation/foundation/api/1.0.0-beta07.txt
@@ -0,0 +1,746 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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 {
+  }
+
+  public final class LazyListPrefetcher_androidKt {
+  }
+
+  @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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  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 dd3d988..457c23f 100644
--- a/compose/foundation/foundation/api/current.ignore
+++ b/compose/foundation/foundation/api/current.ignore
@@ -1,10 +1,3 @@
 // Baseline format: 1.0
-RemovedClass: androidx.compose.foundation.legacygestures.PressIndicatorGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.PressIndicatorGestureFilterKt
-RemovedClass: androidx.compose.foundation.legacygestures.TapGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.TapGestureFilterKt
-RemovedClass: androidx.compose.foundation.legacygestures.DragGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.DragGestureFilterKt
-RemovedPackage: androidx.compose.foundation.legacygestures:
-    Removed package androidx.compose.foundation.legacygestures
-
+RemovedPackage: androidx.compose.ui.text:
+    Removed package androidx.compose.ui.text
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 6b2c807..76355d9 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -381,6 +381,9 @@
   public final class LazyListMeasureKt {
   }
 
+  public final class LazyListPrefetcher_androidKt {
+  }
+
   @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);
@@ -420,6 +423,9 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
+  public final class LazySemanticsKt {
+  }
+
   public final class Lazy_androidKt {
   }
 
@@ -671,6 +677,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -735,10 +744,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta05.txt b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta05.txt
index c823986..9e84f70 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta05.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta05.txt
@@ -707,6 +707,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -771,10 +774,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta06.txt b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..4085bab
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,779 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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);
+    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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  @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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  @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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 {
+    method public float getMinSize-D9Ej5fM();
+    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 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, 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta07.txt b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..4bd7f753
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,782 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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);
+    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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  @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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  @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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 {
+    method public float getMinSize-D9Ej5fM();
+    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 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, 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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 {
+  }
+
+  public final class LazyListPrefetcher_androidKt {
+  }
+
+  @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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  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 c823986..4bd7f753 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -413,6 +413,9 @@
   public final class LazyListMeasureKt {
   }
 
+  public final class LazyListPrefetcher_androidKt {
+  }
+
   @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);
@@ -453,6 +456,9 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
+  public final class LazySemanticsKt {
+  }
+
   public final class Lazy_androidKt {
   }
 
@@ -707,6 +713,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -771,10 +780,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/api/res-1.0.0-beta06.txt b/compose/foundation/foundation/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation/api/res-1.0.0-beta06.txt
diff --git a/compose/foundation/foundation/api/res-1.0.0-beta07.txt b/compose/foundation/foundation/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/foundation/foundation/api/res-1.0.0-beta07.txt
diff --git a/compose/foundation/foundation/api/restricted_1.0.0-beta05.txt b/compose/foundation/foundation/api/restricted_1.0.0-beta05.txt
index 6b2c807..ea3e99d 100644
--- a/compose/foundation/foundation/api/restricted_1.0.0-beta05.txt
+++ b/compose/foundation/foundation/api/restricted_1.0.0-beta05.txt
@@ -671,6 +671,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -735,10 +738,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/api/restricted_1.0.0-beta06.txt b/compose/foundation/foundation/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..03f29a3
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,743 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/restricted_1.0.0-beta07.txt b/compose/foundation/foundation/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..76355d9
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,746 @@
+// 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, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+    method public static androidx.compose.ui.Modifier background-1xq40Q0(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  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-bMj1UE0(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border-zRMYNwQ(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    method public androidx.compose.foundation.BorderStroke copy-v_fYJzc(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth-D9Ej5fM();
+    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-Qek64HU(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 DarkTheme_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  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 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);
+    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);
+  }
+
+  @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);
+  }
+
+  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 AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation-ijcpFGM(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-ijcpFGM(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-qFc19kk(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-qFc19kk(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-ijcpFGM(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-qFc19kk(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-Pd94rOk(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-Pd94rOk(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-Pd94rOk(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 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-ox2scHU(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-5602LSQ(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-8hPFfiU(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 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 {
+    method public long getPressPosition-F1C5BW0();
+    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 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 LazyListItemContentFactoryKt {
+  }
+
+  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 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 {
+  }
+
+  public final class LazyListPrefetcher_androidKt {
+  }
+
+  @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.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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-ljnXCgI(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(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 int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape-ZmiikuI(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+  }
+
+  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-9w1PWio(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline-ljnXCgI(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-lwCvPpU(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(int percent);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+  }
+
+  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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+  }
+
+  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-9w1PWio(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-ljnXCgI(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(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 int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-0680j_4(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape-ZmiikuI(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(androidx.compose.ui.text.input.ImeAction 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 androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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_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 TouchMode_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  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 {
+    method public long getBackgroundColor-0d7_KjU();
+    method public long getHandleColor-0d7_KjU();
+    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();
+  }
+
+  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 1db0871..457c23f 100644
--- a/compose/foundation/foundation/api/restricted_current.ignore
+++ b/compose/foundation/foundation/api/restricted_current.ignore
@@ -1,9 +1,3 @@
 // Baseline format: 1.0
-RemovedClass: androidx.compose.foundation.legacygestures.PressIndicatorGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.PressIndicatorGestureFilterKt
-RemovedClass: androidx.compose.foundation.legacygestures.TapGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.TapGestureFilterKt
-RemovedClass: androidx.compose.foundation.legacygestures.DragGestureFilterKt:
-    Removed class androidx.compose.foundation.legacygestures.DragGestureFilterKt
-RemovedPackage: androidx.compose.foundation.legacygestures:
-    Removed package androidx.compose.foundation.legacygestures
\ No newline at end of file
+RemovedPackage: androidx.compose.ui.text:
+    Removed package androidx.compose.ui.text
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 6b2c807..76355d9 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -381,6 +381,9 @@
   public final class LazyListMeasureKt {
   }
 
+  public final class LazyListPrefetcher_androidKt {
+  }
+
   @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);
@@ -420,6 +423,9 @@
   @kotlin.DslMarker public @interface LazyScopeMarker {
   }
 
+  public final class LazySemanticsKt {
+  }
+
   public final class Lazy_androidKt {
   }
 
@@ -671,6 +677,9 @@
   public final class TextFieldSizeKt {
   }
 
+  public final class TextLayoutHelperKt {
+  }
+
   public final class TextLayoutResultProxyKt {
   }
 
@@ -735,10 +744,3 @@
 
 }
 
-package androidx.compose.ui.text {
-
-  public final class TextLayoutHelperKt {
-  }
-
-}
-
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
index 2ad14ed..ff79ab3 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/NestedScrollerTestCase.kt
@@ -28,12 +28,10 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.rememberScrollState
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Surface
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -45,20 +43,16 @@
 /**
  * Test case that puts many horizontal scrollers in a vertical scroller
  */
-class NestedScrollerTestCase : ComposeTestCase, ToggleableTestCase {
+class NestedScrollerTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     // ScrollerPosition must now be constructed during composition to obtain the Density
     private lateinit var scrollState: ScrollState
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         scrollState = rememberScrollState()
-        MaterialTheme {
-            Surface {
-                LazyColumn {
-                    items(5) { index ->
-                        SquareRow(index == 0)
-                    }
-                }
+        LazyColumn {
+            items(5) { index ->
+                SquareRow(index == 0)
             }
         }
     }
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
index 1a2fcc1..a80559c 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/ScrollerTestCase.kt
@@ -24,7 +24,7 @@
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -34,11 +34,11 @@
 /**
  * Test case that puts a large number of boxes in a column in a vertical scroller to force scrolling.
  */
-class ScrollerTestCase : ComposeTestCase, ToggleableTestCase {
+class ScrollerTestCase : LayeredComposeTestCase(), ToggleableTestCase {
     private lateinit var scrollState: ScrollState
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         scrollState = rememberScrollState()
         Column(Modifier.verticalScroll(scrollState)) {
             Column(Modifier.fillMaxHeight()) {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
index 0e9330f..61c4f40 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/SimpleComponentImplementationBenchmark.kt
@@ -28,7 +28,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkDrawPerf
@@ -231,7 +231,7 @@
 class ComponentWithModifiersTestCase : SimpleComponentImplementationTestCase() {
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         val innerSize = getInnerSize()
         Box(
             Modifier.size(48.dp)
@@ -249,7 +249,7 @@
 class ComponentWithRedrawTestCase : SimpleComponentImplementationTestCase() {
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         val innerSize = getInnerSize()
         val stroke = Stroke()
         Canvas(Modifier.size(48.dp)) {
@@ -261,7 +261,7 @@
 
 class ComponentWithTwoLayoutNodesTestCase : SimpleComponentImplementationTestCase() {
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         Box(
             modifier = Modifier
                 .size(48.dp)
@@ -280,8 +280,8 @@
     }
 }
 
-abstract class SimpleComponentImplementationTestCase : ComposeTestCase, ToggleableTestCase {
-
+abstract class SimpleComponentImplementationTestCase :
+    LayeredComposeTestCase(), ToggleableTestCase {
     private var state: MutableState<Dp>? = null
 
     @Composable
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/TrailingLambdaBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/TrailingLambdaBenchmark.kt
index 335d283..73585f9 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/TrailingLambdaBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/TrailingLambdaBenchmark.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkFirstCompose
@@ -44,7 +44,7 @@
 
     @Test
     fun withTrailingLambdas_compose() {
-        benchmarkRule.benchmarkFirstCompose({ WithTrailingLambdas() })
+        benchmarkRule.benchmarkFirstCompose { WithTrailingLambdas() }
     }
 
     @Test
@@ -54,7 +54,7 @@
 
     @Test
     fun withoutTrailingLambdas_compose() {
-        benchmarkRule.benchmarkFirstCompose({ WithoutTrailingLambdas() })
+        benchmarkRule.benchmarkFirstCompose { WithoutTrailingLambdas() }
     }
 
     @Test
@@ -63,12 +63,12 @@
     }
 }
 
-private sealed class TrailingLambdaTestCase : ComposeTestCase, ToggleableTestCase {
+private sealed class TrailingLambdaTestCase : LayeredComposeTestCase(), ToggleableTestCase {
 
     var numberState: MutableState<Int>? = null
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         val number = remember { mutableStateOf(5) }
         numberState = number
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
index 6ddf510..f7f3edd 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
@@ -18,10 +18,10 @@
 
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkDrawPerf
-import androidx.compose.testutils.benchmark.benchmarkFirstComposeFast
-import androidx.compose.testutils.benchmark.benchmarkFirstDrawFast
-import androidx.compose.testutils.benchmark.benchmarkFirstLayoutFast
-import androidx.compose.testutils.benchmark.benchmarkFirstMeasureFast
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
 import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
@@ -85,7 +85,7 @@
      */
     @Test
     fun first_compose() {
-        benchmarkRule.benchmarkFirstComposeFast(caseFactory)
+        benchmarkRule.benchmarkFirstCompose(caseFactory)
     }
 
     /**
@@ -94,7 +94,7 @@
      */
     @Test
     fun first_measure() {
-        benchmarkRule.benchmarkFirstMeasureFast(caseFactory)
+        benchmarkRule.benchmarkFirstMeasure(caseFactory)
     }
 
     /**
@@ -103,7 +103,7 @@
      */
     @Test
     fun first_layout() {
-        benchmarkRule.benchmarkFirstLayoutFast(caseFactory)
+        benchmarkRule.benchmarkFirstLayout(caseFactory)
     }
 
     /**
@@ -111,7 +111,7 @@
      */
     @Test
     fun first_draw() {
-        benchmarkRule.benchmarkFirstDrawFast(caseFactory)
+        benchmarkRule.benchmarkFirstDraw(caseFactory)
     }
 
     /**
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextDelegateBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextDelegateBenchmark.kt
index f6743c2..b58f8f1 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextDelegateBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextDelegateBenchmark.kt
@@ -22,15 +22,12 @@
 import androidx.benchmark.junit4.measureRepeated
 import androidx.compose.foundation.text.InternalFoundationTextApi
 import androidx.compose.foundation.text.TextDelegate
-import androidx.compose.testutils.benchmark.measureRepeatedRecordingCanvas
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.text.benchmark.RandomTextGenerator
 import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
 import androidx.compose.ui.text.TextStyle
@@ -43,7 +40,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-import kotlin.math.ceil
 import kotlin.math.roundToInt
 
 @OptIn(InternalFoundationTextApi::class)
@@ -212,34 +208,4 @@
             }
         }
     }
-
-    /**
-     * Measure the time taken by TextDelegate.paintBackground.
-     */
-    @Test
-    fun paintBackground() {
-        textBenchmarkTestRule.generator { textGenerator ->
-            val textDelegate = textDelegate(textGenerator)
-            val layoutResult = textDelegate.layout(
-                Constraints(maxWidth = width),
-                layoutDirection
-            )
-            val paint = Paint().also { it.color = Color.Yellow }
-
-            benchmarkRule.measureRepeatedRecordingCanvas(
-                width = layoutResult.size.width,
-                height = layoutResult.size.height
-            ) { canvas ->
-                TextDelegate.paintBackground(
-                    start = 0,
-                    end = textLength / 2,
-                    paint = paint,
-                    canvas = canvas,
-                    textLayoutResult = layoutResult
-                )
-            }
-        }
-    }
 }
-
-fun Float.toIntPx(): Int = ceil(this).roundToInt()
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
index 14f1941..e64f1de 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextBenchmark.kt
@@ -18,10 +18,10 @@
 
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkDrawPerf
-import androidx.compose.testutils.benchmark.benchmarkFirstComposeFast
-import androidx.compose.testutils.benchmark.benchmarkFirstDrawFast
-import androidx.compose.testutils.benchmark.benchmarkFirstLayoutFast
-import androidx.compose.testutils.benchmark.benchmarkFirstMeasureFast
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
 import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
 import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
@@ -77,7 +77,7 @@
      */
     @Test
     fun first_compose() {
-        benchmarkRule.benchmarkFirstComposeFast(caseFactory)
+        benchmarkRule.benchmarkFirstCompose(caseFactory)
     }
 
     /**
@@ -87,7 +87,7 @@
      */
     @Test
     fun first_measure() {
-        benchmarkRule.benchmarkFirstMeasureFast(caseFactory)
+        benchmarkRule.benchmarkFirstMeasure(caseFactory)
     }
 
     /**
@@ -96,7 +96,7 @@
      */
     @Test
     fun first_layout() {
-        benchmarkRule.benchmarkFirstLayoutFast(caseFactory)
+        benchmarkRule.benchmarkFirstLayout(caseFactory)
     }
 
     /**
@@ -105,7 +105,7 @@
      */
     @Test
     fun first_draw() {
-        benchmarkRule.benchmarkFirstDrawFast(caseFactory)
+        benchmarkRule.benchmarkFirstDraw(caseFactory)
     }
 
     /**
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
index 56ed53c..cb891d7 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextFieldToggleTextTestCase.kt
@@ -50,7 +50,7 @@
     private val textNumber: Int,
     private val width: Dp,
     private val fontSize: TextUnit
-) : LayeredComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val textInputService = TextInputService(TestPlatformTextInputService())
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
index e0662cc..227309e 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
@@ -40,7 +40,7 @@
     private val texts: List<AnnotatedString>,
     private val width: Dp,
     private val fontSize: TextUnit
-) : LayeredComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val color = mutableStateOf(Color.Black)
 
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerTestCase.kt
index e94b226..30fd769 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/selection/SelectionContainerTestCase.kt
@@ -20,13 +20,13 @@
 import androidx.compose.foundation.text.selection.SelectionContainer
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.sp
 
-class SelectionContainerTestCase(private val childrenCount: Int) : ComposeTestCase {
+class SelectionContainerTestCase(private val childrenCount: Int) : LayeredComposeTestCase() {
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
         SelectionContainer {
             Column {
                 repeat(childrenCount) {
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index 80a5550..ca1170a 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -48,7 +48,7 @@
         implementation(project(":compose:ui:ui-text"))
         implementation(project(":compose:ui:ui-util"))
 
-
+        testImplementation(project(":compose:test-utils"))
         testImplementation(ANDROIDX_TEST_RULES)
         testImplementation(ANDROIDX_TEST_RUNNER)
         testImplementation(JUNIT)
@@ -70,9 +70,9 @@
         androidTestImplementation(ESPRESSO_CORE)
         androidTestImplementation(JUNIT)
         androidTestImplementation(TRUTH)
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own
         // MockMaker
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
         androidTestImplementation(MOCKITO_KOTLIN, {
             exclude group: "org.mockito" // to keep control on the mockito version
         })
@@ -136,9 +136,9 @@
                 implementation(ESPRESSO_CORE)
                 implementation(JUNIT)
                 implementation(TRUTH)
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own
                 // MockMaker
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+                implementation(MOCKITO_CORE, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
                 implementation(MOCKITO_KOTLIN, {
                     exclude group: "org.mockito" // to keep control on the mockito version
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index f3f7a3e..c219a1c 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -20,7 +20,7 @@
 import androidx.compose.animation.core.AnimationState
 import androidx.compose.animation.core.animateTo
 import androidx.compose.animation.core.calculateTargetValue
-import androidx.compose.animation.defaultDecayAnimationSpec
+import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
@@ -596,7 +596,7 @@
             "Custom fling config will dance back and forth when you fling",
             modifier = Modifier.padding(16.dp)
         )
-        val defaultDecay = defaultDecayAnimationSpec()
+        val defaultDecay = rememberSplineBasedDecay<Float>()
         val flingConfig = remember {
             object : FlingBehavior {
                 override suspend fun ScrollScope.performFling(initialVelocity: Float): Float {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
index 3ba18ed..c0abd58 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyColumnTest.kt
@@ -36,12 +36,12 @@
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
+import androidx.compose.testutils.WithTouchSlop
 import androidx.compose.testutils.assertIsEqualTo
 import androidx.compose.testutils.assertPixels
 import androidx.compose.testutils.runBlockingWithManualClock
@@ -51,8 +51,6 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.platform.LocalViewConfiguration
-import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.SemanticsNodeInteraction
@@ -1407,26 +1405,13 @@
     isIn(Range.closed(expected - tolerance, expected + tolerance))
 }
 
-internal val TestTouchSlop = 18f
-
-private val FakeViewConfiguration = object : ViewConfiguration {
-    override val longPressTimeoutMillis: Long
-        get() = 500L
-    override val doubleTapTimeoutMillis: Long
-        get() = 300L
-    override val doubleTapMinTimeMillis: Long
-        get() = 40L
-    override val touchSlop: Float
-        get() = TestTouchSlop
-}
+internal const val TestTouchSlop = 18f
 
 internal fun ComposeContentTestRule.setContentWithTestViewConfiguration(
     composable: @Composable () -> Unit
 ) {
     this.setContent {
-        CompositionLocalProvider(LocalViewConfiguration provides FakeViewConfiguration) {
-            composable()
-        }
+        WithTouchSlop(TestTouchSlop, composable)
     }
 }
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
index 4788ab8..2bb31eb 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyGridTest.kt
@@ -18,14 +18,15 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -125,13 +126,13 @@
             .assertIsDisplayed()
 
         rule.onNodeWithTag("7")
-            .assertDoesNotExist()
+            .assertIsNotDisplayed()
 
         rule.onNodeWithTag("8")
-            .assertDoesNotExist()
+            .assertIsNotDisplayed()
 
         rule.onNodeWithTag("9")
-            .assertDoesNotExist()
+            .assertIsNotDisplayed()
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyItemStateRestoration.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyItemStateRestoration.kt
index 46d4c24..7f44d31 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyItemStateRestoration.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyItemStateRestoration.kt
@@ -107,6 +107,7 @@
             assertThat(realState).isEqualTo(1)
             runBlocking {
                 state.scrollToItem(1, 5)
+                state.scrollToItem(1, 6)
             }
         }
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcherTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcherTest.kt
new file mode 100644
index 0000000..5dddbcf
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcherTest.kt
@@ -0,0 +1,303 @@
+/*
+ * 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.compose.foundation.lazy
+
+import androidx.compose.foundation.gestures.scrollBy
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+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 kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class LazyListPrefetcherTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    val itemsSizePx = 30f
+    val itemsSizeDp = with(rule.density) { itemsSizePx.toDp() }
+
+    lateinit var state: LazyListState
+
+    @Test
+    fun notPrefetchingForwardInitially() {
+        composeList()
+
+        rule.onNodeWithTag("2")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun notPrefetchingBackwardInitially() {
+        composeList(firstItem = 2)
+
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingForwardAfterSmallScroll() {
+        composeList()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(5f)
+            }
+        }
+
+        waitForPrefetch(2)
+
+        rule.onNodeWithTag("2")
+            .assertExists()
+        rule.onNodeWithTag("3")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingBackwardAfterSmallScroll() {
+        composeList(firstItem = 2, itemOffset = 10)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-5f)
+            }
+        }
+
+        waitForPrefetch(1)
+
+        rule.onNodeWithTag("1")
+            .assertExists()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingForwardAndBackward() {
+        composeList(firstItem = 1)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(5f)
+            }
+        }
+
+        waitForPrefetch(3)
+
+        rule.onNodeWithTag("3")
+            .assertExists()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-2f)
+            }
+        }
+
+        waitForPrefetch(0)
+
+        rule.onNodeWithTag("0")
+            .assertExists()
+        rule.onNodeWithTag("3")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingForwardTwice() {
+        composeList()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(5f)
+            }
+        }
+
+        waitForPrefetch(2)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(itemsSizePx / 2f)
+                state.scrollBy(itemsSizePx / 2f)
+            }
+        }
+
+        waitForPrefetch(3)
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("3")
+            .assertExists()
+        rule.onNodeWithTag("4")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingBackwardTwice() {
+        composeList(firstItem = 4)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-5f)
+            }
+        }
+
+        waitForPrefetch(2)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-itemsSizePx / 2f)
+                state.scrollBy(-itemsSizePx / 2f)
+            }
+        }
+
+        waitForPrefetch(1)
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("1")
+            .assertExists()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingForwardAndBackwardReverseLayout() {
+        composeList(firstItem = 1, reverseLayout = true)
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(5f)
+            }
+        }
+
+        waitForPrefetch(3)
+
+        rule.onNodeWithTag("3")
+            .assertExists()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-2f)
+            }
+        }
+
+        waitForPrefetch(0)
+
+        rule.onNodeWithTag("0")
+            .assertExists()
+        rule.onNodeWithTag("3")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun prefetchingForwardAndBackwardWithContentPadding() {
+        val halfItemSize = itemsSizeDp / 2f
+        composeList(
+            firstItem = 2,
+            itemOffset = 5,
+            contentPadding = PaddingValues(vertical = halfItemSize)
+        )
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("3")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+        rule.onNodeWithTag("4")
+            .assertDoesNotExist()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(5f)
+            }
+        }
+
+        waitForPrefetch(3)
+
+        rule.onNodeWithTag("4")
+            .assertExists()
+        rule.onNodeWithTag("0")
+            .assertDoesNotExist()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollBy(-2f)
+            }
+        }
+
+        waitForPrefetch(0)
+
+        rule.onNodeWithTag("0")
+            .assertExists()
+    }
+
+    private fun waitForPrefetch(index: Int) {
+        rule.waitUntil {
+            activeNodes.contains(index)
+        }
+    }
+
+    private val activeNodes = mutableSetOf<Int>()
+
+    private fun composeList(
+        firstItem: Int = 0,
+        itemOffset: Int = 0,
+        reverseLayout: Boolean = false,
+        contentPadding: PaddingValues = PaddingValues(0.dp)
+    ) {
+        rule.setContent {
+            state = rememberLazyListState(
+                initialFirstVisibleItemIndex = firstItem,
+                initialFirstVisibleItemScrollOffset = itemOffset
+            )
+            LazyColumn(
+                Modifier.height(itemsSizeDp * 1.5f),
+                state,
+                reverseLayout = reverseLayout,
+                contentPadding = contentPadding
+            ) {
+                items(100) {
+                    DisposableEffect(it) {
+                        activeNodes.add(it)
+                        onDispose {
+                            activeNodes.remove(it)
+                        }
+                    }
+                    Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
+                }
+            }
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
index bd6fae3..f4d511a 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyRowTest.kt
@@ -42,6 +42,7 @@
 import androidx.compose.ui.test.SemanticsNodeInteraction
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
@@ -215,7 +216,7 @@
             .assertIsDisplayed()
 
         rule.onNodeWithTag("4")
-            .assertDoesNotExist()
+            .assertIsNotDisplayed()
     }
 
     @Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazySemanticsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazySemanticsTest.kt
new file mode 100644
index 0000000..a0b1bf3
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazySemanticsTest.kt
@@ -0,0 +1,174 @@
+/*
+ * 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.lazy
+
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.requiredWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions.ScrollToIndex
+import androidx.compose.ui.semantics.SemanticsProperties.IndexForKey
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+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.MediumTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests the semantics properties defined on a LazyList:
+ * - GetIndexForKey
+ * - ScrollToIndex
+ *
+ * GetIndexForKey:
+ * Create a lazy list, iterate over all indices, verify key of each of them
+ *
+ * ScrollToIndex:
+ * Create a lazy list, scroll to an item off screen, verify shown items
+ *
+ * All tests performed in [runTest], scenarios set up in the test methods.
+ */
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class LazySemanticsTest {
+    private val N = 20
+    private val LazyListTag = "lazy_list"
+    private val LazyListModifier = Modifier.testTag(LazyListTag).requiredSize(100.dp)
+
+    private fun tag(index: Int): String = "tag_$index"
+    private fun key(index: Int): String = "key_$index"
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun itemSemantics_column() {
+        rule.setContent {
+            LazyColumn(LazyListModifier) {
+                repeat(N) {
+                    item(key = key(it)) {
+                        SpacerInColumn(it)
+                    }
+                }
+            }
+        }
+        runTest()
+    }
+
+    @Test
+    fun itemsSemantics_column() {
+        rule.setContent {
+            LazyColumn(LazyListModifier) {
+                items(items = List(N) { it }, key = { key(it) }) {
+                    SpacerInColumn(it)
+                }
+            }
+        }
+        runTest()
+    }
+
+    @Test
+    fun itemSemantics_row() {
+        rule.setContent {
+            LazyRow(LazyListModifier) {
+                repeat(N) {
+                    item(key = key(it)) {
+                        SpacerInRow(it)
+                    }
+                }
+            }
+        }
+        runTest()
+    }
+
+    @Test
+    fun itemsSemantics_row() {
+        rule.setContent {
+            LazyRow(LazyListModifier) {
+                items(items = List(N) { it }, key = { key(it) }) {
+                    SpacerInRow(it)
+                }
+            }
+        }
+        runTest()
+    }
+
+    private fun runTest() {
+        checkViewport(firstExpectedItem = 0, lastExpectedItem = 3)
+
+        // Verify IndexForKey
+        rule.onNodeWithTag(LazyListTag).assert(
+            SemanticsMatcher.keyIsDefined(IndexForKey).and(
+                SemanticsMatcher("keys match") { node ->
+                    val actualIndex = node.config.getOrNull(IndexForKey)!!
+                    (0 until N).all { expectedIndex ->
+                        expectedIndex == actualIndex.invoke(key(expectedIndex))
+                    }
+                }
+            )
+        )
+
+        // Verify ScrollToIndex
+        rule.onNodeWithTag(LazyListTag).assert(SemanticsMatcher.keyIsDefined(ScrollToIndex))
+
+        invokeScrollToIndex(targetIndex = 10)
+        checkViewport(firstExpectedItem = 10, lastExpectedItem = 13)
+
+        invokeScrollToIndex(targetIndex = N - 1)
+        checkViewport(firstExpectedItem = N - 4, lastExpectedItem = N - 1)
+    }
+
+    private fun invokeScrollToIndex(targetIndex: Int) {
+        val node = rule.onNodeWithTag(LazyListTag)
+            .fetchSemanticsNode("Failed: invoke ScrollToIndex")
+        rule.runOnUiThread {
+            node.config[ScrollToIndex].action!!.invoke(targetIndex)
+        }
+    }
+
+    private fun checkViewport(firstExpectedItem: Int, lastExpectedItem: Int) {
+        if (firstExpectedItem > 0) {
+            rule.onNodeWithTag(tag(firstExpectedItem - 1)).assertDoesNotExist()
+        }
+        (firstExpectedItem..lastExpectedItem).forEach {
+            rule.onNodeWithTag(tag(it)).assertExists()
+        }
+        if (firstExpectedItem < N - 1) {
+            rule.onNodeWithTag(tag(lastExpectedItem + 1)).assertDoesNotExist()
+        }
+    }
+
+    @Composable
+    private fun SpacerInColumn(index: Int) {
+        Spacer(Modifier.testTag(tag(index)).requiredHeight(30.dp).fillMaxWidth())
+    }
+
+    @Composable
+    private fun SpacerInRow(index: Int) {
+        Spacer(Modifier.testTag(tag(index)).requiredWidth(30.dp).fillMaxHeight())
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.kt
new file mode 100644
index 0000000..b10c06a
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/BasicTextScreenshotTest.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.compose.foundation.text
+
+import android.os.Build
+import androidx.compose.foundation.GOLDEN_UI
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+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.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalTestApi::class)
+class BasicTextScreenshotTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_UI)
+
+    private val textTag = "text"
+
+    @Test
+    fun multiStyleText_setFontWeight() {
+        rule.setContent {
+            BasicText(
+                text = buildAnnotatedString {
+                    append("Hello ")
+                    pushStyle(SpanStyle(fontWeight = FontWeight.Bold))
+                    append("World")
+                    pop()
+                },
+                modifier = Modifier.testTag(textTag),
+                style = TextStyle(
+                    fontSize = 24.sp,
+                    fontStyle = FontStyle.Italic,
+                    fontFamily = FontFamily.Monospace
+                )
+            )
+        }
+        rule.onNodeWithTag(textTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, "multiStyleText_setFontWeight")
+    }
+
+    @Test
+    fun multiStyleText_setFontFamily() {
+        rule.setContent {
+            BasicText(
+                text = buildAnnotatedString {
+                    append("Hello ")
+                    pushStyle(SpanStyle(fontFamily = FontFamily.SansSerif))
+                    append("World")
+                    pop()
+                },
+                modifier = Modifier.testTag(textTag),
+                style = TextStyle(
+                    fontSize = 24.sp,
+                    fontStyle = FontStyle.Italic,
+                    fontWeight = FontWeight.Bold,
+                    fontFamily = FontFamily.Monospace
+                )
+            )
+        }
+        rule.onNodeWithTag(textTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, "multiStyleText_setFontFamily")
+    }
+
+    @Test
+    fun multiStyleText_setFontStyle() {
+        rule.setContent {
+            BasicText(
+                text = buildAnnotatedString {
+                    append("Hello ")
+                    pushStyle(SpanStyle(fontStyle = FontStyle.Italic))
+                    append("World")
+                    pop()
+                },
+                modifier = Modifier.testTag(textTag),
+                style = TextStyle(
+                    fontSize = 24.sp,
+                    fontWeight = FontWeight.Bold,
+                    fontFamily = FontFamily.Monospace
+                )
+            )
+        }
+        rule.onNodeWithTag(textTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, "multiStyleText_setFontStyle")
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
index f6910c7..bba26f4 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftWrapTest.kt
@@ -24,11 +24,6 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.dp
@@ -44,11 +39,7 @@
 @RunWith(AndroidJUnit4::class)
 class CoreTextFieldSoftWrapTest {
 
-    private val fontFamily = Font(
-        resId = R.font.sample_font,
-        weight = FontWeight.Normal,
-        style = FontStyle.Normal
-    ).toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
 
     @get:Rule
     val rule = createComposeRule()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.kt
new file mode 100644
index 0000000..dfb9deb
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextInlineContentTest.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.compose.foundation.text
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.onSizeChanged
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.PlaceholderVerticalAlign
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.sp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class CoreTextInlineContentTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun placeholder_changeSize_updateInlineContentSize() {
+        // Callback to monitor the size changes of a composable.
+        val onSizeChanged: (IntSize) -> Unit = mock()
+        var size by mutableStateOf(IntSize(50, 50))
+
+        rule.setContent {
+            val inlineTextContent = InlineTextContent(
+                placeholder = Placeholder(
+                    size.width.sp,
+                    size.height.sp,
+                    PlaceholderVerticalAlign.AboveBaseline
+                )
+            ) {
+                Box(modifier = Modifier.fillMaxSize().onSizeChanged(onSizeChanged))
+            }
+
+            CompositionLocalProvider(
+                LocalDensity provides Density(density = 1f, fontScale = 1f)
+            ) {
+                CoreText(
+                    text = buildAnnotatedString {
+                        append("Hello")
+                        appendInlineContent("box")
+                        append("World")
+                    },
+                    style = TextStyle(fontSize = 100.sp),
+                    inlineContent = mapOf("box" to inlineTextContent),
+                    maxLines = Int.MAX_VALUE,
+                    onTextLayout = {},
+                    overflow = TextOverflow.Clip,
+                    softWrap = true
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            // Verify that the initial size is (50, 50).
+            verify(onSizeChanged).invoke(IntSize(50, 50))
+            size = IntSize(100, 100)
+        }
+        rule.waitForIdle()
+        // Verify that the size has been updated to (100, 100).
+        verify(onSizeChanged).invoke(IntSize(100, 100))
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
index efa0cd19f..1fa7378 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/KeyboardActionsTest.kt
@@ -83,7 +83,7 @@
         rule.onNodeWithTag(initialTextField).performImeAction()
 
         // Assert.
-        actionTriggerLog.forEach { action, triggered ->
+        actionTriggerLog.forEach { (action, triggered) ->
             when (action) {
                 imeAction -> assertThat(triggered).isTrue()
                 else -> assertThat(triggered).isFalse()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
index b0036f1..05616c7 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateIntegrationTest.kt
@@ -17,18 +17,10 @@
 package androidx.compose.foundation.text
 
 import android.graphics.Bitmap
-import androidx.compose.foundation.text.selection.TestFontResourceLoader
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.toFontFamily
-import androidx.compose.foundation.text.matchers.assertThat
-import androidx.compose.foundation.text.selection.BASIC_MEASURE_FONT
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
@@ -46,7 +38,7 @@
 @SmallTest
 class TextDelegateIntegrationTest {
 
-    private val fontFamily = BASIC_MEASURE_FONT.toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
     private val density = Density(density = 1f)
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val resourceLoader = TestFontResourceLoader(context)
@@ -93,240 +85,6 @@
         }
     }
 
-    @Test
-    fun testBackgroundPaint_paint_wrap_multiLines() {
-        with(density) {
-            // Setup test.
-            val fontSize = 20.sp
-            val fontSizeInPx = fontSize.toPx()
-            val text = "HelloHello"
-            val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                resourceLoader = resourceLoader
-            )
-            val layoutResult = textDelegate.layout(
-                Constraints(maxWidth = 120),
-                LayoutDirection.Ltr
-            )
-
-            val expectedBitmap = layoutResult.toBitmap()
-            val expectedCanvas = Canvas(android.graphics.Canvas(expectedBitmap))
-            val expectedPaint = Paint()
-            val defaultSelectionColor = Color(0x6633B5E5)
-            val selectionPaint = Paint().also { it.color = defaultSelectionColor }
-            expectedPaint.color = defaultSelectionColor
-
-            val firstLineLeft = layoutResult.multiParagraph.getLineLeft(0)
-            val secondLineLeft = layoutResult.multiParagraph.getLineLeft(1)
-            val firstLineRight = layoutResult.multiParagraph.getLineRight(0)
-            val secondLineRight = layoutResult.multiParagraph.getLineRight(1)
-            expectedCanvas.drawRect(
-                Rect(firstLineLeft, 0f, firstLineRight, fontSizeInPx),
-                expectedPaint
-            )
-            expectedCanvas.drawRect(
-                Rect(
-                    secondLineLeft,
-                    fontSizeInPx,
-                    secondLineRight,
-                    layoutResult.multiParagraph.height
-                ),
-                expectedPaint
-            )
-
-            val actualBitmap = layoutResult.toBitmap()
-            val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
-
-            // Run.
-            // Select all.
-            TextDelegate.paintBackground(
-                start = 0,
-                end = text.length,
-                paint = selectionPaint,
-                canvas = actualCanvas,
-                textLayoutResult = layoutResult
-            )
-
-            // Assert.
-            assertThat(actualBitmap).isEqualToBitmap(expectedBitmap)
-        }
-    }
-
-    @Test
-    fun testBackgroundPaint_paint_with_default_color() {
-        with(density) {
-            // Setup test.
-            val selectionStart = 0
-            val selectionEnd = 3
-            val fontSize = 20.sp
-            val fontSizeInPx = fontSize.toPx()
-            val text = "Hello"
-            val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                resourceLoader = resourceLoader
-            )
-            val layoutResult = textDelegate.layout(Constraints(), LayoutDirection.Ltr)
-
-            val expectedBitmap = layoutResult.toBitmap()
-            val expectedCanvas = Canvas(android.graphics.Canvas(expectedBitmap))
-            val expectedPaint = Paint()
-            val defaultSelectionColor = Color(0x6633B5E5)
-            val selectionPaint = Paint().also { it.color = defaultSelectionColor }
-            expectedPaint.color = defaultSelectionColor
-            expectedCanvas.drawRect(
-                Rect(
-                    left = 0f,
-                    top = 0f,
-                    right = fontSizeInPx * (selectionEnd - selectionStart),
-                    bottom = fontSizeInPx
-                ),
-                expectedPaint
-            )
-
-            val actualBitmap = layoutResult.toBitmap()
-            val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
-
-            // Run.
-            TextDelegate.paintBackground(
-                start = selectionStart,
-                end = selectionEnd,
-                paint = selectionPaint,
-                canvas = actualCanvas,
-                textLayoutResult = layoutResult
-            )
-
-            // Assert
-            assertThat(actualBitmap).isEqualToBitmap(expectedBitmap)
-        }
-    }
-
-    @Test
-    fun testBackgroundPaint_paint_with_default_color_bidi() {
-        with(density) {
-            // Setup test.
-            val textLTR = "Hello"
-            // From right to left: שלום
-            val textRTL = "\u05e9\u05dc\u05d5\u05dd"
-            val text = textLTR + textRTL
-            val selectionLTRStart = 2
-            val selectionRTLEnd = 2
-            val fontSize = 20.sp
-            val fontSizeInPx = fontSize.toPx()
-            val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            val annotatedString = AnnotatedString(text, spanStyle)
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                resourceLoader = resourceLoader
-            )
-            val layoutResult = textDelegate.layout(Constraints(), LayoutDirection.Ltr)
-
-            val expectedBitmap = layoutResult.toBitmap()
-            val expectedCanvas = Canvas(android.graphics.Canvas(expectedBitmap))
-            val expectedPaint = Paint()
-            val defaultSelectionColor = Color(0x6633B5E5)
-            val selectionPaint = Paint().also { it.color = defaultSelectionColor }
-            expectedPaint.color = defaultSelectionColor
-            // Select "llo".
-            expectedCanvas.drawRect(
-                Rect(
-                    left = fontSizeInPx * selectionLTRStart,
-                    top = 0f,
-                    right = textLTR.length * fontSizeInPx,
-                    bottom = fontSizeInPx
-                ),
-                expectedPaint
-            )
-
-            // Select "של"
-            expectedCanvas.drawRect(
-                Rect(
-                    left = (textLTR.length + textRTL.length - selectionRTLEnd) * fontSizeInPx,
-                    top = 0f,
-                    right = (textLTR.length + textRTL.length) * fontSizeInPx,
-                    bottom = fontSizeInPx
-                ),
-                expectedPaint
-            )
-
-            val actualBitmap = layoutResult.toBitmap()
-            val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
-
-            // Run.
-            TextDelegate.paintBackground(
-                start = selectionLTRStart,
-                end = textLTR.length + selectionRTLEnd,
-                paint = selectionPaint,
-                canvas = actualCanvas,
-                textLayoutResult = layoutResult
-            )
-
-            // Assert
-            assertThat(actualBitmap).isEqualToBitmap(expectedBitmap)
-        }
-    }
-
-    @Test
-    fun testBackgroundPaint_paint_with_customized_color() {
-        with(density) {
-            // Setup test.
-            val selectionStart = 0
-            val selectionEnd = 3
-            val fontSize = 20.sp
-            val fontSizeInPx = fontSize.toPx()
-            val text = "Hello"
-            val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
-            val annotatedString = AnnotatedString(text, spanStyle)
-            val selectionColor = Color(0x66AABB33)
-            val selectionPaint = Paint().also { it.color = selectionColor }
-            val textDelegate = TextDelegate(
-                text = annotatedString,
-                style = TextStyle.Default,
-                density = this,
-                resourceLoader = resourceLoader
-            )
-            val layoutResult = textDelegate.layout(Constraints(), LayoutDirection.Ltr)
-
-            val expectedBitmap = layoutResult.toBitmap()
-            val expectedCanvas = Canvas(android.graphics.Canvas(expectedBitmap))
-            val expectedPaint = Paint()
-            expectedPaint.color = selectionColor
-            expectedCanvas.drawRect(
-                Rect(
-                    left = 0f,
-                    top = 0f,
-                    right = fontSizeInPx * (selectionEnd - selectionStart),
-                    bottom = fontSizeInPx
-                ),
-                expectedPaint
-            )
-
-            val actualBitmap = layoutResult.toBitmap()
-            val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
-
-            // Run.
-            TextDelegate.paintBackground(
-                start = selectionStart,
-                end = selectionEnd,
-                paint = selectionPaint,
-                canvas = actualCanvas,
-                textLayoutResult = layoutResult
-            )
-
-            // Assert
-            assertThat(actualBitmap).isEqualToBitmap(expectedBitmap)
-        }
-    }
-
 //    @Test
 //    fun multiParagraphIntrinsics_isReused() {
 //        val textDelegate = TextDelegate(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
index f282c7d..763f03e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextDelegateWidthWithLetterSpacingTest.kt
@@ -16,11 +16,8 @@
 
 package androidx.compose.foundation.text
 
-import androidx.compose.foundation.text.selection.BASIC_MEASURE_FONT
-import androidx.compose.foundation.text.selection.TestFontResourceLoader
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
@@ -37,7 +34,7 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 class TextDelegateWidthWithLetterSpacingTest {
-    private val fontFamily = BASIC_MEASURE_FONT.toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
 
     /**
      * values are exact values for the repro case (on Pixel4, Android 11)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
index 68edb1d..b96602f 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextFieldDelegateIntegrationTest.kt
@@ -15,9 +15,7 @@
  */
 package androidx.compose.foundation.text
 
-import android.content.Context
 import android.graphics.Bitmap
-import android.graphics.Typeface
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Paint
@@ -26,14 +24,11 @@
 import androidx.compose.ui.text.TextPainter
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.ResourceFont
 import androidx.compose.ui.text.input.OffsetMapping
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
-import androidx.core.content.res.ResourcesCompat
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -50,15 +45,6 @@
     private val resourceLoader = TestFontResourceLoader(context)
     private val layoutDirection = LayoutDirection.Ltr
 
-    private class TestFontResourceLoader(val context: Context) : Font.ResourceLoader {
-        override fun load(font: Font): Typeface {
-            return when (font) {
-                is ResourceFont -> ResourcesCompat.getFont(context, font.resId)!!
-                else -> throw IllegalArgumentException("Unknown font type: $font")
-            }
-        }
-    }
-
     @Test
     fun draw_selection_test() {
         val textDelegate = TextDelegate(
@@ -74,13 +60,9 @@
 
         val expectedBitmap = layoutResult.toBitmap()
         val expectedCanvas = Canvas(android.graphics.Canvas(expectedBitmap))
-        TextDelegate.paintBackground(
-            0,
-            1,
-            Paint().apply { color = selectionColor },
-            expectedCanvas,
-            layoutResult
-        )
+        val selectionPath = layoutResult.multiParagraph.getPathForRange(0, 1)
+        expectedCanvas.drawPath(selectionPath, Paint().apply { color = selectionColor })
+
         TextPainter.paint(expectedCanvas, layoutResult)
 
         val actualBitmap = layoutResult.toBitmap()
@@ -215,4 +197,4 @@
     size.width,
     size.height,
     Bitmap.Config.ARGB_8888
-)
\ No newline at end of file
+)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
index 6c2004d..8c7ebba 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutResultIntegrationTest.kt
@@ -17,14 +17,11 @@
 package androidx.compose.foundation.text
 
 import androidx.compose.foundation.text.matchers.isZero
-import androidx.compose.foundation.text.selection.BASIC_MEASURE_FONT
-import androidx.compose.foundation.text.selection.TestFontResourceLoader
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
@@ -42,7 +39,7 @@
 @SmallTest
 class TextLayoutResultIntegrationTest {
 
-    private val fontFamily = BASIC_MEASURE_FONT.toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
     private val density = Density(density = 1f)
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val resourceLoader = TestFontResourceLoader(context)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
index ec22415..1d7ba69 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextLayoutTest.kt
@@ -35,11 +35,6 @@
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
@@ -243,19 +238,17 @@
     }
 
     private fun show(composable: @Composable () -> Unit) {
-        val runnable: Runnable = object : Runnable {
-            override fun run() {
-                activity.setContent {
-                    Layout(composable) { measurables, constraints ->
-                        val placeables = measurables.map {
-                            it.measure(constraints.copy(minWidth = 0, minHeight = 0))
-                        }
-                        layout(constraints.maxWidth, constraints.maxHeight) {
-                            var top = 0
-                            placeables.forEach {
-                                it.placeRelative(0, top)
-                                top += it.height
-                            }
+        val runnable = Runnable {
+            activity.setContent {
+                Layout(composable) { measurables, constraints ->
+                    val placeables = measurables.map {
+                        it.measure(constraints.copy(minWidth = 0, minHeight = 0))
+                    }
+                    layout(constraints.maxWidth, constraints.maxHeight) {
+                        var top = 0
+                        placeables.forEach {
+                            it.placeRelative(0, top)
+                            top += it.height
                         }
                     }
                 }
@@ -272,13 +265,7 @@
     onTextLayout: (TextLayoutResult) -> Unit = {}
 ) {
     val textStyle = remember {
-        TextStyle(
-            fontFamily = Font(
-                R.font.sample_font,
-                FontWeight.Normal,
-                FontStyle.Normal
-            ).toFontFamily()
-        )
+        TextStyle(fontFamily = TEST_FONT_FAMILY)
     }
     CoreText(
         AnnotatedString(text),
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
index 265c50f..dce1e3a 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextPreparedSelectionTest.kt
@@ -17,7 +17,6 @@
 package androidx.compose.foundation.text
 
 import androidx.compose.foundation.text.selection.BaseTextPreparedSelection
-import androidx.compose.foundation.text.selection.TextFieldPreparedSelection
 import androidx.compose.foundation.text.selection.TextPreparedSelection
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -26,12 +25,6 @@
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
-import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -187,13 +180,7 @@
             CompositionLocalProvider(LocalLayoutDirection provides direction) {
                 BasicText(
                     text = initText,
-                    style = TextStyle(
-                        fontFamily = Font(
-                            R.font.sample_font,
-                            FontWeight.Normal,
-                            FontStyle.Normal
-                        ).toFontFamily()
-                    ),
+                    style = TextStyle(fontFamily = TEST_FONT_FAMILY),
                     onTextLayout = { textLayout = it }
                 )
             }
@@ -207,32 +194,4 @@
 
         test(SelectionScope(prepared), prepared)
     }
-
-    private fun textFieldSelectionTest(
-        initText: String = "",
-        initSelection: TextRange = TextRange(0),
-        test: SelectionScope<TextFieldPreparedSelection>.(TextFieldPreparedSelection) -> Unit
-    ) {
-        var textLayout: TextLayoutResult? = null
-        rule.setContent {
-            BasicText(
-                text = initText,
-                style = TextStyle(
-                    fontFamily = Font(
-                        R.font.sample_font,
-                        FontWeight.Normal,
-                        FontStyle.Normal
-                    ).toFontFamily()
-                ),
-                onTextLayout = { textLayout = it }
-            )
-        }
-
-        val prepared = TextFieldPreparedSelection(
-            currentValue = TextFieldValue(initText, initSelection),
-            layoutResultProxy = TextLayoutResultProxy(textLayout!!)
-        )
-
-        test(SelectionScope(prepared), prepared)
-    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
index e0114de..7c9178e 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/TextTestExtensions.kt
@@ -15,7 +15,33 @@
  */
 package androidx.compose.foundation.text
 
+import android.content.Context
+import android.graphics.Typeface
+import androidx.compose.ui.text.font.test.R
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.font.ResourceFont
+import androidx.compose.ui.text.font.toFontFamily
+import androidx.core.content.res.ResourcesCompat
 import kotlin.math.ceil
 import kotlin.math.roundToInt
 
-fun Float.toIntPx(): Int = ceil(this).roundToInt()
\ No newline at end of file
+fun Float.toIntPx(): Int = ceil(this).roundToInt()
+
+internal class TestFontResourceLoader(val context: Context) : Font.ResourceLoader {
+    override fun load(font: Font): Typeface {
+        return when (font) {
+            is ResourceFont -> ResourcesCompat.getFont(context, font.resId)!!
+            else -> throw IllegalArgumentException("Unknown font type: $font")
+        }
+    }
+}
+
+val TEST_FONT = Font(
+    resId = R.font.sample_font,
+    weight = FontWeight.Normal,
+    style = FontStyle.Normal
+)
+
+val TEST_FONT_FAMILY = TEST_FONT.toFontFamily()
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
index daf5b9b..b7a0767 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegateTest.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.foundation.text.selection
 
-import android.content.Context
-import android.graphics.Typeface
 import androidx.activity.ComponentActivity
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.foundation.text.InternalFoundationTextApi
+import androidx.compose.foundation.text.TestFontResourceLoader
 import androidx.compose.foundation.text.TextDelegate
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.layout.LayoutCoordinates
@@ -28,19 +28,12 @@
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.ResourceFont
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.style.ResolvedTextDirection
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.sp
-import androidx.core.content.res.ResourcesCompat
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -51,126 +44,116 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 
-val BASIC_MEASURE_FONT = Font(
-    resId = R.font.sample_font,
-    weight = FontWeight.Normal,
-    style = FontStyle.Normal
-)
-
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class MultiWidgetSelectionDelegateTest {
     @get:Rule
     val composeTestRule = createAndroidComposeRule<ComponentActivity>()
 
-    private val fontFamily = BASIC_MEASURE_FONT.toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val defaultDensity = Density(density = 1f)
     private val resourceLoader = TestFontResourceLoader(context)
 
     @Test
     fun getHandlePosition_StartHandle_invalid() {
-        with(defaultDensity) {
-            composeTestRule.setContent {
-                val text = "hello world\n"
-                val fontSize = 20.sp
+        composeTestRule.setContent {
+            val text = "hello world\n"
+            val fontSize = 20.sp
 
-                val layoutResult = simpleTextLayout(
-                    text = text,
-                    fontSize = fontSize,
-                    density = defaultDensity
-                )
+            val layoutResult = simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity
+            )
 
-                val layoutCoordinates = mock<LayoutCoordinates>()
-                whenever(layoutCoordinates.isAttached).thenReturn(true)
+            val layoutCoordinates = mock<LayoutCoordinates>()
+            whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-                val selectableId = 1L
-                val selectable = MultiWidgetSelectionDelegate(
-                    selectableId = selectableId,
-                    coordinatesCallback = { layoutCoordinates },
-                    layoutResultCallback = { layoutResult }
-                )
+            val selectableId = 1L
+            val selectable = MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
-                val selectableInvalidId = 2L
-                val startOffset = text.indexOf('h')
-                val endOffset = text.indexOf('o')
+            val selectableInvalidId = 2L
+            val startOffset = text.indexOf('h')
+            val endOffset = text.indexOf('o')
 
-                val selection = Selection(
-                    start = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = startOffset,
-                        selectableId = selectableInvalidId
-                    ),
-                    end = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = endOffset,
-                        selectableId = selectableInvalidId
-                    ),
-                    handlesCrossed = false
-                )
+            val selection = Selection(
+                start = Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = startOffset,
+                    selectableId = selectableInvalidId
+                ),
+                end = Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = endOffset,
+                    selectableId = selectableInvalidId
+                ),
+                handlesCrossed = false
+            )
 
-                // Act.
-                val coordinates = selectable.getHandlePosition(
-                    selection = selection,
-                    isStartHandle = true
-                )
+            // Act.
+            val coordinates = selectable.getHandlePosition(
+                selection = selection,
+                isStartHandle = true
+            )
 
-                // Assert.
-                assertThat(coordinates).isEqualTo(Offset.Zero)
-            }
+            // Assert.
+            assertThat(coordinates).isEqualTo(Offset.Zero)
         }
     }
 
     @Test
     fun getHandlePosition_EndHandle_invalid() {
-        with(defaultDensity) {
-            composeTestRule.setContent {
-                val text = "hello world\n"
-                val fontSize = 20.sp
+        composeTestRule.setContent {
+            val text = "hello world\n"
+            val fontSize = 20.sp
 
-                val layoutResult = simpleTextLayout(
-                    text = text,
-                    fontSize = fontSize,
-                    density = defaultDensity
-                )
+            val layoutResult = simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity
+            )
 
-                val layoutCoordinates = mock<LayoutCoordinates>()
-                whenever(layoutCoordinates.isAttached).thenReturn(true)
+            val layoutCoordinates = mock<LayoutCoordinates>()
+            whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-                val selectableId = 1L
-                val selectable = MultiWidgetSelectionDelegate(
-                    selectableId = selectableId,
-                    coordinatesCallback = { layoutCoordinates },
-                    layoutResultCallback = { layoutResult }
-                )
+            val selectableId = 1L
+            val selectable = MultiWidgetSelectionDelegate(
+                selectableId = selectableId,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
-                val selectableInvalidId = 2L
-                val startOffset = text.indexOf('h')
-                val endOffset = text.indexOf('o')
+            val selectableInvalidId = 2L
+            val startOffset = text.indexOf('h')
+            val endOffset = text.indexOf('o')
 
-                val selection = Selection(
-                    start = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = startOffset,
-                        selectableId = selectableInvalidId
-                    ),
-                    end = Selection.AnchorInfo(
-                        direction = ResolvedTextDirection.Ltr,
-                        offset = endOffset,
-                        selectableId = selectableInvalidId
-                    ),
-                    handlesCrossed = false
-                )
+            val selection = Selection(
+                start = Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = startOffset,
+                    selectableId = selectableInvalidId
+                ),
+                end = Selection.AnchorInfo(
+                    direction = ResolvedTextDirection.Ltr,
+                    offset = endOffset,
+                    selectableId = selectableInvalidId
+                ),
+                handlesCrossed = false
+            )
 
-                // Act.
-                val coordinates = selectable.getHandlePosition(
-                    selection = selection,
-                    isStartHandle = false
-                )
+            // Act.
+            val coordinates = selectable.getHandlePosition(
+                selection = selection,
+                isStartHandle = false
+            )
 
-                // Assert.
-                assertThat(coordinates).isEqualTo(Offset.Zero)
-            }
+            // Assert.
+            assertThat(coordinates).isEqualTo(Offset.Zero)
         }
     }
 
@@ -844,51 +827,47 @@
 
     @Test
     fun getText_textLayoutResult_Null_Return_Empty_AnnotatedString() {
-        with(defaultDensity) {
-            composeTestRule.setContent {
-                val layoutResult = null
+        composeTestRule.setContent {
+            val layoutResult = null
 
-                val layoutCoordinates = mock<LayoutCoordinates>()
-                whenever(layoutCoordinates.isAttached).thenReturn(true)
+            val layoutCoordinates = mock<LayoutCoordinates>()
+            whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-                val selectable = MultiWidgetSelectionDelegate(
-                    0,
-                    coordinatesCallback = { layoutCoordinates },
-                    layoutResultCallback = { layoutResult }
-                )
+            val selectable = MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
-                assertThat(selectable.getText()).isEqualTo(AnnotatedString(""))
-            }
+            assertThat(selectable.getText()).isEqualTo(AnnotatedString(""))
         }
     }
 
     @Test
     fun getText_textLayoutResult_NotNull_Return_AnnotatedString() {
-        with(defaultDensity) {
-            composeTestRule.setContent {
-                val textLtr = "Hello"
-                val textRtl = "\u05D0\u05D1\u05D2"
-                val text = textLtr + textRtl
-                val fontSize = 20.sp
-                val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
+        composeTestRule.setContent {
+            val textLtr = "Hello"
+            val textRtl = "\u05D0\u05D1\u05D2"
+            val text = textLtr + textRtl
+            val fontSize = 20.sp
+            val spanStyle = SpanStyle(fontSize = fontSize, fontFamily = fontFamily)
 
-                val layoutResult = simpleTextLayout(
-                    text = text,
-                    fontSize = fontSize,
-                    density = defaultDensity
-                )
+            val layoutResult = simpleTextLayout(
+                text = text,
+                fontSize = fontSize,
+                density = defaultDensity
+            )
 
-                val layoutCoordinates = mock<LayoutCoordinates>()
-                whenever(layoutCoordinates.isAttached).thenReturn(true)
+            val layoutCoordinates = mock<LayoutCoordinates>()
+            whenever(layoutCoordinates.isAttached).thenReturn(true)
 
-                val selectable = MultiWidgetSelectionDelegate(
-                    0,
-                    coordinatesCallback = { layoutCoordinates },
-                    layoutResultCallback = { layoutResult }
-                )
+            val selectable = MultiWidgetSelectionDelegate(
+                0,
+                coordinatesCallback = { layoutCoordinates },
+                layoutResultCallback = { layoutResult }
+            )
 
-                assertThat(selectable.getText()).isEqualTo(AnnotatedString(text, spanStyle))
-            }
+            assertThat(selectable.getText()).isEqualTo(AnnotatedString(text, spanStyle))
         }
     }
 
@@ -982,7 +961,7 @@
                 whenever(layoutCoordinates.isAttached).thenReturn(true)
 
                 val selectable = MultiWidgetSelectionDelegate(
-                    0,
+                    selectableId = 1,
                     coordinatesCallback = { layoutCoordinates },
                     layoutResultCallback = { layoutResult }
                 )
@@ -1018,7 +997,7 @@
         val textSelectionInfo = getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(start, end),
-            selectable = mock(),
+            selectableId = 1,
             adjustment = SelectionAdjustment.WORD
         )
 
@@ -1057,7 +1036,7 @@
         val textSelectionInfo = getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(start, end),
-            selectable = mock(),
+            selectableId = 1,
             adjustment = SelectionAdjustment.WORD
         )
 
@@ -1098,7 +1077,7 @@
         val textSelectionInfo = getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(start, end),
-            selectable = mock(),
+            selectableId = 1,
             adjustment = SelectionAdjustment.WORD
         )
 
@@ -1141,7 +1120,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 textLayoutResult = textLayoutResult,
                 selectionCoordinates = Pair(start, end),
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.WORD
             )
 
@@ -1178,13 +1157,12 @@
         // long pressed between "h" and "e", "hello" should be selected
         val start = Offset((fontSizeInPx * 2), (fontSizeInPx / 2))
         val end = start
-        val selectable = mock<Selectable>()
 
         // Act.
         val textSelectionInfo1 = getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(start, end),
-            selectable = selectable,
+            selectableId = 1,
             adjustment = SelectionAdjustment.WORD
         )
 
@@ -1192,7 +1170,7 @@
         val textSelectionInfo2 = getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(start, end + Offset(0f, fontSizeInPx / 4)),
-            selectable = selectable,
+            selectableId = 1,
             adjustment = SelectionAdjustment.WORD,
             previousSelection = textSelectionInfo1,
             isStartHandle = false
@@ -1240,7 +1218,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 textLayoutResult = textLayoutResult,
                 selectionCoordinates = Pair(start, end),
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
 
@@ -1290,7 +1268,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 textLayoutResult = textLayoutResult,
                 selectionCoordinates = Pair(start, end),
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
 
@@ -1342,7 +1320,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 textLayoutResult = textLayoutResult,
                 selectionCoordinates = Pair(start, end),
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
 
@@ -1383,7 +1361,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -1431,7 +1409,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -1481,7 +1459,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -1517,7 +1495,6 @@
             val oldStartOffset = text.indexOf("l")
             val oldEndOffset = text.indexOf("o") + 1
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1539,8 +1516,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -1574,7 +1551,7 @@
             val oldStartOffset = text.indexOf("\u05D1")
             val oldEndOffset = text.length
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1602,8 +1579,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -1637,7 +1614,7 @@
             val oldStartOffset = text.indexOf("l")
             val oldEndOffset = text.indexOf("o") + 1
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1659,8 +1636,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1695,7 +1672,7 @@
             val oldStartOffset = text.indexOf("o") + 1
             val oldEndOffset = text.indexOf("l")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1717,8 +1694,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1753,7 +1730,7 @@
             val oldStartOffset = text.indexOf("e")
             val oldEndOffset = text.indexOf("l")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1775,8 +1752,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1801,7 +1778,7 @@
             val oldStartOffset = text.indexOf("l")
             val oldEndOffset = text.indexOf("e")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1823,8 +1800,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1849,7 +1826,7 @@
             val oldStartOffset = text.length - 1
             val oldEndOffset = text.length
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1877,8 +1854,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1903,7 +1880,7 @@
             val oldStartOffset = text.indexOf("e")
             val oldEndOffset = 0
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1925,8 +1902,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = true
             )
@@ -1951,7 +1928,6 @@
             val oldStartOffset = text.indexOf("o") + 1
             val oldEndOffset = text.indexOf("l")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -1973,8 +1949,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -2009,7 +1985,7 @@
             val oldStartOffset = text.indexOf("e")
             val oldEndOffset = text.indexOf("l")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -2031,8 +2007,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -2057,7 +2033,7 @@
             val oldStartOffset = text.indexOf("l")
             val oldEndOffset = text.indexOf("e")
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -2079,8 +2055,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -2105,7 +2081,7 @@
             val oldStartOffset = 0
             val oldEndOffset = text.indexOf('e')
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -2133,8 +2109,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -2159,7 +2135,7 @@
             val oldStartOffset = text.length
             val oldEndOffset = text.length - 1
             val selectableId = 1L
-            val selectable: Selectable = mockSelectable(selectableId)
+
             val previousSelection = Selection(
                 start = Selection.AnchorInfo(
                     offset = oldStartOffset,
@@ -2187,8 +2163,8 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = selectable,
-                adjustment = SelectionAdjustment.NONE,
+                selectableId = 1,
+                adjustment = SelectionAdjustment.CHARACTER,
                 previousSelection = previousSelection,
                 isStartHandle = false
             )
@@ -2218,7 +2194,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -2260,7 +2236,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -2301,7 +2277,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -2343,7 +2319,7 @@
             val textSelectionInfo = getTextSelectionInfo(
                 selectionCoordinates = Pair(start, end),
                 textLayoutResult = textLayoutResult,
-                selectable = mock(),
+                selectableId = 1,
                 adjustment = SelectionAdjustment.NONE
             )
             // Assert.
@@ -2366,25 +2342,23 @@
 
     @Test
     fun getTextSelectionInfo_not_selected() {
-        with(defaultDensity) {
-            val text = "hello world\n"
-            val fontSize = 20.sp
-            val textLayoutResult = simpleTextLayout(
-                text = text,
-                fontSize = fontSize,
-                density = defaultDensity
-            )
-            val start = Offset(-50f, -50f)
-            val end = Offset(-20f, -20f)
-            // Act.
-            val textSelectionInfo = getTextSelectionInfo(
-                selectionCoordinates = Pair(start, end),
-                textLayoutResult = textLayoutResult,
-                selectable = mock(),
-                adjustment = SelectionAdjustment.WORD
-            )
-            assertThat(textSelectionInfo).isNull()
-        }
+        val text = "hello world\n"
+        val fontSize = 20.sp
+        val textLayoutResult = simpleTextLayout(
+            text = text,
+            fontSize = fontSize,
+            density = defaultDensity
+        )
+        val start = Offset(-50f, -50f)
+        val end = Offset(-20f, -20f)
+        // Act.
+        val textSelectionInfo = getTextSelectionInfo(
+            selectionCoordinates = Pair(start, end),
+            textLayoutResult = textLayoutResult,
+            selectableId = 1,
+            adjustment = SelectionAdjustment.WORD
+        )
+        assertThat(textSelectionInfo).isNull()
     }
 
     @OptIn(InternalFoundationTextApi::class)
@@ -2402,19 +2376,4 @@
             resourceLoader = resourceLoader
         ).layout(Constraints(), LayoutDirection.Ltr)
     }
-}
-
-private fun mockSelectable(selectableId: Long): Selectable {
-    val selectable: Selectable = mock()
-    whenever(selectable.selectableId).thenReturn(selectableId)
-    return selectable
-}
-
-class TestFontResourceLoader(val context: Context) : Font.ResourceLoader {
-    override fun load(font: Font): Typeface {
-        return when (font) {
-            is ResourceFont -> ResourcesCompat.getFont(context, font.resId)!!
-            else -> throw IllegalArgumentException("Unknown font type: $font")
-        }
-    }
-}
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
index dc3fb45..258fb19 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerFocusTest.kt
@@ -24,6 +24,7 @@
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.CoreText
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.Modifier
@@ -33,6 +34,7 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.LocalHapticFeedback
 import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalTextToolbar
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.hasTestTag
@@ -41,11 +43,6 @@
 import androidx.compose.ui.test.performGesture
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
@@ -72,11 +69,7 @@
     private lateinit var view: View
 
     private val textContent = "Text Demo Text"
-    private val fontFamily = Font(
-        resId = R.font.sample_font,
-        weight = FontWeight.Normal,
-        style = FontStyle.Normal
-    ).toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
 
     private val selection1 = mutableStateOf<Selection?>(null)
     private val selection2 = mutableStateOf<Selection?>(null)
@@ -163,7 +156,8 @@
         rule.setContent {
             CompositionLocalProvider(
                 LocalHapticFeedback provides hapticFeedback,
-                LocalLayoutDirection provides layoutDirection
+                LocalLayoutDirection provides layoutDirection,
+                LocalTextToolbar provides mock()
             ) {
                 Column {
                     SelectionContainer(
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
index 501245f..5bfccf4 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionContainerTest.kt
@@ -21,6 +21,7 @@
 import androidx.activity.ComponentActivity
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.text.CoreText
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.mutableStateOf
@@ -54,11 +55,6 @@
 import androidx.compose.ui.test.performGesture
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.IntOffset
@@ -104,12 +100,7 @@
     private lateinit var view: View
 
     private val textContent = "Text Demo Text"
-    private val fontFamily = Font(
-        resId = R.font.sample_font,
-        weight = FontWeight.Normal,
-        style = FontStyle.Normal
-    ).toFontFamily()
-
+    private val fontFamily = TEST_FONT_FAMILY
     private val selection = mutableStateOf<Selection?>(null)
     private val fontSize = 20.sp
     private val log = PointerInputChangeLog()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
index 6fa36d6..5141592 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlePopupPositionTest.kt
@@ -239,7 +239,7 @@
         .check(ViewAssertions.matches(viewMatcher))
 }
 
-internal class SingleSelectionHandleMatcher() : TypeSafeMatcher<Root>() {
+internal class SingleSelectionHandleMatcher : TypeSafeMatcher<Root>() {
 
     var lastSeenWindowParams: WindowManager.LayoutParams? = null
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
index 6376464..74325ff 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/SelectionHandlesTest.kt
@@ -224,11 +224,7 @@
 @Suppress("DEPRECATION")
 // We only need this because IR compiler doesn't like converting lambdas to Runnables
 private fun androidx.test.rule.ActivityTestRule<*>.runOnUiThreadIR(block: () -> Unit) {
-    val runnable: Runnable = object : Runnable {
-        override fun run() {
-            block()
-        }
-    }
+    val runnable = Runnable { block() }
     runOnUiThread(runnable)
 }
 
@@ -306,11 +302,9 @@
     srcRect.offset(offset[0], offset[1])
     val latch = CountDownLatch(1)
     var copyResult = 0
-    val onCopyFinished = object : PixelCopy.OnPixelCopyFinishedListener {
-        override fun onPixelCopyFinished(result: Int) {
-            copyResult = result
-            latch.countDown()
-        }
+    val onCopyFinished = PixelCopy.OnPixelCopyFinishedListener { result ->
+        copyResult = result
+        latch.countDown()
     }
     PixelCopy.request(activity.window, srcRect, dest, onCopyFinished, handler!!)
     assertTrue("Pixel copy latch timed out", latch.await(1, TimeUnit.SECONDS))
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegateTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegateTest.kt
index d2d3302..474d1215 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegateTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegateTest.kt
@@ -18,14 +18,14 @@
 
 import androidx.activity.ComponentActivity
 import androidx.compose.foundation.text.InternalFoundationTextApi
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
+import androidx.compose.foundation.text.TestFontResourceLoader
 import androidx.compose.foundation.text.TextDelegate
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
@@ -45,7 +45,7 @@
     @get:Rule
     val composeTestRule = createAndroidComposeRule<ComponentActivity>()
 
-    private val fontFamily = BASIC_MEASURE_FONT.toFontFamily()
+    private val fontFamily = TEST_FONT_FAMILY
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val defaultDensity = Density(density = 1f)
     private val resourceLoader = TestFontResourceLoader(context)
@@ -67,10 +67,8 @@
             rawStartOffset = 2,
             rawEndOffset = 2,
             previousSelection = null,
-            previousHandlesCrossed = false,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.WORD,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.WORD
         )
 
         // Assert.
@@ -95,10 +93,8 @@
             rawStartOffset = 5,
             rawEndOffset = 5,
             previousSelection = null,
-            previousHandlesCrossed = false,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.WORD,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.WORD
         )
 
         // Assert.
@@ -126,10 +122,8 @@
             rawStartOffset = rawStartOffset,
             rawEndOffset = rawEndOffset,
             previousSelection = null,
-            previousHandlesCrossed = false,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.WORD,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.WORD
         )
 
         // Assert.
@@ -157,10 +151,8 @@
             rawStartOffset = rawStartOffset,
             rawEndOffset = rawEndOffset,
             previousSelection = null,
-            previousHandlesCrossed = false,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.WORD,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.WORD
         )
 
         // Assert.
@@ -188,11 +180,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.NONE
         )
 
         // Assert.
@@ -220,11 +210,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.CHARACTER
         )
 
         // Assert.
@@ -254,11 +242,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.CHARACTER
         )
 
         // Assert.
@@ -286,11 +272,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.CHARACTER
         )
 
         // Assert.
@@ -318,11 +302,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.CHARACTER
         )
 
         // Assert.
@@ -352,11 +334,9 @@
             textLayoutResult = textLayoutResult,
             rawStartOffset = startOffset,
             rawEndOffset = endOffset,
-            previousSelection = TextRange(0, 0),
-            previousHandlesCrossed = false,
+            previousSelection = null,
             isStartHandle = true,
-            adjustment = SelectionAdjustment.NONE,
-            ensureAtLeastOneChar = true
+            adjustment = SelectionAdjustment.CHARACTER,
         )
 
         // Assert.
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
index a55c0cf..ea20d14 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/HardwareKeyboardTest.kt
@@ -23,6 +23,7 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.text.BasicTextField
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
@@ -38,11 +39,6 @@
 import androidx.compose.ui.test.performKeyPress
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.test.R
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.TextInputService
 import androidx.compose.ui.unit.dp
@@ -305,11 +301,7 @@
                 BasicTextField(
                     value = state.value,
                     textStyle = TextStyle(
-                        fontFamily = Font(
-                            R.font.sample_font,
-                            FontWeight.Normal,
-                            FontStyle.Normal
-                        ).toFontFamily(),
+                        fontFamily = TEST_FONT_FAMILY,
                         fontSize = 10.sp
                     ),
                     modifier = modifier.focusRequester(focusFequester),
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
index c10ed13..7874f7d 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldDefaultWidthTest.kt
@@ -21,6 +21,7 @@
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.foundation.text.BasicTextField
+import androidx.compose.foundation.text.TEST_FONT_FAMILY
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.ui.Modifier
@@ -28,10 +29,6 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.dp
@@ -188,17 +185,11 @@
     modifier: Modifier,
     density: Density
 ) {
-    val font = Font(
-        resId = androidx.compose.ui.text.font.test.R.font.sample_font,
-        weight = FontWeight.Normal,
-        style = FontStyle.Normal
-    )
-
     CompositionLocalProvider(LocalDensity provides density) {
         androidx.compose.foundation.layout.Box {
             BasicTextField(
                 value = text,
-                textStyle = TextStyle(fontSize = fontSize, fontFamily = font.toFontFamily()),
+                textStyle = TextStyle(fontSize = fontSize, fontFamily = TEST_FONT_FAMILY),
                 onValueChange = {},
                 modifier = modifier
             )
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
index 58ec5d0..a332e2f 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -60,7 +60,7 @@
     @get:Rule
     val rule = createComposeRule()
 
-    val onValueChange: (androidx.compose.ui.text.input.TextFieldValue) -> Unit = mock()
+    val onValueChange: (TextFieldValue) -> Unit = mock()
 
     lateinit var onEditCommandCallback: (List<EditCommand>) -> Unit
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index 66691bb..151cf03 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -38,6 +38,7 @@
 import androidx.compose.foundation.text.KeyboardOptions
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -52,6 +53,7 @@
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.LocalTextInputService
@@ -84,9 +86,16 @@
 import androidx.compose.ui.test.performTextInput
 import androidx.compose.ui.test.performTextInputSelection
 import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.ParagraphStyle
+import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.VerbatimTtsAnnotation
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontSynthesis
+import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.input.CommitTextCommand
 import androidx.compose.ui.text.input.EditCommand
 import androidx.compose.ui.text.input.ImeAction
@@ -95,7 +104,18 @@
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.TextFieldValue.Companion.Saver
 import androidx.compose.ui.text.input.TextInputService
+import androidx.compose.ui.text.intl.Locale
+import androidx.compose.ui.text.intl.LocaleList
+import androidx.compose.ui.text.style.BaselineShift
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextDirection
+import androidx.compose.ui.text.style.TextGeometricTransform
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.text.withAnnotation
+import androidx.compose.ui.text.withStyle
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.em
 import androidx.compose.ui.unit.sp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -223,9 +243,9 @@
         BasicTextField(
             value = state.value,
             modifier = Modifier.fillMaxSize(),
-            onValueChange = {
-                if (it.all { it.isDigit() }) {
-                    state.value = it
+            onValueChange = { value ->
+                if (value.all { it.isDigit() }) {
+                    state.value = value
                 }
             }
         )
@@ -398,6 +418,72 @@
         }
     }
 
+    @OptIn(ExperimentalComposeApi::class)
+    @Test
+    fun textFieldValue_saverRestoresState_withAnnotatedString() {
+        var state: MutableState<TextFieldValue>? = null
+        val annotatedString = buildAnnotatedString {
+            withStyle(ParagraphStyle(textAlign = TextAlign.Justify)) { append("1") }
+            withStyle(SpanStyle(fontStyle = FontStyle.Italic)) { append("2") }
+            withAnnotation(tag = "Tag1", annotation = "Annotation1") { append("3") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim1")) { append("4") }
+            withAnnotation(tag = "Tag2", annotation = "Annotation2") { append("5") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim2")) { append("6") }
+            withStyle(
+                SpanStyle(
+                    color = Color.Red,
+                    fontSize = 10.sp,
+                    fontWeight = FontWeight.Bold,
+                    fontStyle = FontStyle.Italic,
+                    fontSynthesis = FontSynthesis.All,
+                    fontFeatureSettings = "feature settings",
+                    letterSpacing = 2.em,
+                    baselineShift = BaselineShift.Superscript,
+                    textGeometricTransform = TextGeometricTransform(2f, 3f),
+                    localeList = LocaleList(
+                        Locale("sr-Latn-SR"),
+                        Locale("sr-Cyrl-SR"),
+                        Locale.current
+                    ),
+                    background = Color.Blue,
+                    textDecoration = TextDecoration.LineThrough,
+                    shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
+
+                )
+            ) {
+                append("7")
+            }
+            withStyle(
+                ParagraphStyle(
+                    textAlign = TextAlign.Justify,
+                    textDirection = TextDirection.Rtl,
+                    lineHeight = 10.sp,
+                    textIndent = TextIndent(firstLine = 2.sp, restLine = 3.sp)
+                )
+            ) {
+                append("8")
+            }
+        }
+        val newTextFieldValue = TextFieldValue(annotatedString, TextRange(1, 2))
+
+        val restorationTester = StateRestorationTester(rule)
+        restorationTester.setContent {
+            state = rememberSaveable(stateSaver = Saver) { mutableStateOf(TextFieldValue()) }
+        }
+
+        rule.runOnIdle {
+            state!!.value = newTextFieldValue
+            // we null it to ensure recomposition happened
+            state = null
+        }
+
+        restorationTester.emulateSavedInstanceStateRestore()
+
+        rule.runOnIdle {
+            assertThat(state!!.value).isEqualTo(newTextFieldValue)
+        }
+    }
+
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun textFieldNotFocused_cursorNotRendered() {
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcher.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcher.android.kt
new file mode 100644
index 0000000..b8e2b9a
--- /dev/null
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/lazy/LazyListPrefetcher.android.kt
@@ -0,0 +1,283 @@
+/*
+ * 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.lazy
+
+import android.view.Choreographer
+import android.view.Display
+import android.view.View
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.RememberObserver
+import androidx.compose.runtime.State
+import androidx.compose.runtime.remember
+import androidx.compose.ui.layout.SubcomposeLayoutState
+import androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.util.trace
+import java.util.concurrent.TimeUnit
+
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+internal actual fun LazyListPrefetcher(
+    lazyListState: LazyListState,
+    stateOfItemsProvider: State<LazyListItemsProvider>,
+    itemContentFactory: LazyListItemContentFactory,
+    subcomposeLayoutState: SubcomposeLayoutState
+) {
+    val view = LocalView.current
+    remember(subcomposeLayoutState, lazyListState, view) {
+        LazyListPrefetcher(
+            subcomposeLayoutState,
+            lazyListState,
+            stateOfItemsProvider,
+            itemContentFactory,
+            view
+        )
+    }
+}
+
+/**
+ * Android specific prefetch implementation. The only platform specific things are:
+ * 1) Calculating the deadline
+ * 2) Posting the delayed runnable
+ * This could be refactored in the future in order to keep the most logic platform agnostic to
+ * enable the prefetching on desktop.
+ *
+ * The differences with the implementation in RecyclerView:
+ *
+ * 1) Prefetch is per-list-index, and performed on whole item.
+ *    With RecyclerView, nested scrolling RecyclerViews would prefetch incrementally, e.g. items
+ *    like the following in a scrolling vertical list could be broken up within a frame:
+ *    [Row1 [a], [b], [c]]
+ *    [Row2 [d], [e]]
+ *    [Row3 [f], [g], [h]]
+ *    You could have frames that break up this work arbitrarily:
+ *    Frame 1 - prefetch [a]
+ *    Frame 2 - prefetch [b], [c]
+ *    Frame 3 - prefetch [d]
+ *    Frame 4 - prefetch [e], [f]
+ *    Something similar is not possible with LazyColumn yet. Also, if we nest LazyRow inside
+ *    LazyColumn the content of LazyRow will not be composed at all during the prefetch stage as
+ *    we only compose during the measuring and the pre-measuring is not yet possible with this
+ *    prefetch implementation. Tracking bug: b/187392865.
+ *
+ * 2) Prefetching time estimation only captured during the prefetch.
+ *    We currently don't track the time of the regular subcompose call happened during the regular
+ *    measure pass, only the ones which are done during the prefetching. The downside is we build
+ *    our prefetch information only after scrolling has started and items are showing up. Your very
+ *    first scroll won't know if it's safe to prefetch. Why:
+ *    a) SubcomposeLayout is not exposing an API to understand if subcompose() call is going to
+ *    do the real work. The work could be skipped if the same lambda was passed as for the
+ *    previous invocation or if there were no recompositions scheduled. We could workaround it
+ *    by keeping the extra state in LazyListState about what items we already composed and to
+ *    only measure the first composition for the given slot, or consider exposing extra
+ *    information in SubcomposeLayoutState API.
+ *    b) It allows us to nicely decouple the logic, now the prefetching logic is build on
+ *    top of the regular LazyColumn measuring functionallity and the main logic knows nothing
+ *    about prefetch
+ *    c) Maybe the better approach would be to wait till the low-level runtime infra is ready to
+ *    do subcompositions on the different threads which illuminates the need to calculate the
+ *    deadlines completely.
+ *    Tracking bug: b/187393381.
+ *
+ * 3) Prefetch is not aware of item type.
+ *    RecyclerView separates timing metadata about different item types. For example, in play
+ *    store style UI, this allows RecyclerView to separately estimate the cost of a header,
+ *    separator, and item row. In this implementation, all of these would be averaged together in
+ *    the same estimation.
+ *    There is no view type concept in LazyColumn at all. What can we possible do:
+ *    a) Think of different item/items calls in the builder dsl as different view types
+ *    automatically. It is close enough but still not entirely correct if the user have something
+ *    like a list of elements which are objects of some sealed classes and they consider
+ *    different classes as completely different types
+ *    b) Maybe if we would be able to precompose on the different thread this issue is also not
+ *    so critical given that we don't need to calculate the deadline.
+ *    Tracking bug: 187393922
+ */
+private class LazyListPrefetcher(
+    private val subcomposeLayoutState: SubcomposeLayoutState,
+    private val lazyListState: LazyListState,
+    private val stateOfItemsProvider: State<LazyListItemsProvider>,
+    private val itemContentFactory: LazyListItemContentFactory,
+    private val view: View
+) : RememberObserver, LazyListOnScrolledListener, Runnable, Choreographer.FrameCallback {
+
+    /**
+     * Keeps the scrolling direction during the previous calculation in order to be able to
+     * detect the scrolling direction change.
+     */
+    private var wasScrollingForward: Boolean = false
+
+    /**
+     * The index scheduled to be prefetched (or the last prefetched index if the prefetch is
+     * done, in this case [precomposedSlotHandle] is not null and associated with this index.
+     */
+    private var indexToPrefetch: Int = -1
+
+    /**
+     * Non-null when the item with [indexToPrefetch] index was prefetched.
+     */
+    private var precomposedSlotHandle: PrecomposedSlotHandle? = null
+
+    /**
+     * Average time the prefetching operation takes. Keeping it allows us to not start the work
+     * if in this frame we are most likely not going to finish the work in time to not delay the
+     * next frame.
+     */
+    private var averagePrefetchTimeNs: Long = 0
+
+    private var prefetchScheduled = false
+
+    private val choreographer = Choreographer.getInstance()
+
+    init {
+        calculateFrameIntervalIfNeeded(view)
+    }
+
+    /**
+     * Callback to be executed when the prefetching is needed.
+     * [indexToPrefetch] will be used as an input.
+     */
+    override fun run() {
+        if (precomposedSlotHandle != null) {
+            // the precomposition happened already.
+            return
+        }
+        trace("compose:lazylist:prefetch") {
+            val latestFrameVsyncNs = TimeUnit.MILLISECONDS.toNanos(view.drawingTime)
+            val nextFrameNs = latestFrameVsyncNs + frameIntervalNs
+            val beforeNs = System.nanoTime()
+            if (beforeNs > nextFrameNs || beforeNs + averagePrefetchTimeNs < nextFrameNs) {
+                val index = indexToPrefetch
+                val itemProvider = stateOfItemsProvider.value
+                if (view.windowVisibility == View.VISIBLE &&
+                    index in 0 until itemProvider.itemsCount
+                ) {
+                    precomposedSlotHandle = subcompose(itemProvider, index)
+                    val prefetchTime = System.nanoTime() - beforeNs
+                    updateAveragePrefetchTime(prefetchTime)
+                }
+                prefetchScheduled = false
+            } else {
+                // there is not enough time left in this frame. we schedule a next frame callback
+                // in which we are going to post the message in the handler again.
+                choreographer.postFrameCallback(this)
+            }
+        }
+    }
+
+    /**
+     * Choreographer frame callback. It will be called when during the previous frame we didn't
+     * have enough time left. We will post a new message in the handler in order to try to
+     * prefetch again after this frame.
+     */
+    override fun doFrame(frameTimeNanos: Long) {
+        view.post(this)
+    }
+
+    private fun subcompose(
+        itemProvider: LazyListItemsProvider,
+        index: Int
+    ): PrecomposedSlotHandle {
+        val key = itemProvider.getKey(index)
+        val content = itemContentFactory.getContent(index, key)
+        return subcomposeLayoutState.precompose(key, content)
+    }
+
+    private fun updateAveragePrefetchTime(prefetchTime: Long) {
+        // Calculate a weighted moving average of time taken to compose an item. We use weighted
+        // moving average to bias toward more recent measurements, and to minimize storage /
+        // computation cost. (the idea is taken from RecycledViewPool)
+        averagePrefetchTimeNs = if (averagePrefetchTimeNs == 0L) {
+            prefetchTime
+        } else {
+            averagePrefetchTimeNs / 4 * 3 + prefetchTime / 4
+        }
+    }
+
+    /**
+     * The callback to be executed on every scroll.
+     */
+    override fun onScrolled(delta: Float) {
+        val info = lazyListState.layoutInfo
+        if (info.visibleItemsInfo.isNotEmpty()) {
+            val scrollingForward = delta < 0
+            val indexToPrefetch = if (scrollingForward) {
+                info.visibleItemsInfo.last().index + 1
+            } else {
+                info.visibleItemsInfo.first().index - 1
+            }
+            if (indexToPrefetch != this.indexToPrefetch &&
+                indexToPrefetch in 0 until info.totalItemsCount
+            ) {
+                val precomposedSlot = precomposedSlotHandle
+                if (precomposedSlot != null) {
+                    if (wasScrollingForward != scrollingForward) {
+                        // the scrolling direction has been changed which means the last prefetched
+                        // is not going to be reached anytime soon so it is safer to dispose it.
+                        // if this item is already visible it is safe to call the method anyway
+                        // as it will be no-op
+                        precomposedSlot.dispose()
+                    }
+                }
+                this.wasScrollingForward = scrollingForward
+                this.indexToPrefetch = indexToPrefetch
+                this.precomposedSlotHandle = null
+                if (!prefetchScheduled) {
+                    prefetchScheduled = true
+                    // schedule the prefetching
+                    view.post(this)
+                }
+            }
+        }
+    }
+
+    override fun onRemembered() {
+        lazyListState.onScrolledListener = this
+    }
+
+    override fun onForgotten() {
+        lazyListState.onScrolledListener = null
+        view.removeCallbacks(this)
+    }
+
+    override fun onAbandoned() {}
+
+    companion object {
+
+        /**
+         * The static cache in order to not gather the display refresh rate to often (expensive operation).
+         */
+        private var frameIntervalNs: Long = 0
+
+        private fun calculateFrameIntervalIfNeeded(view: View) {
+            // we only do this query once, statically, because it's very expensive (> 1ms)
+            if (frameIntervalNs == 0L) {
+                val display: Display? = view.display
+                var refreshRate = 60f
+                if (!view.isInEditMode && display != null) {
+                    val displayRefreshRate = display.refreshRate
+                    if (displayRefreshRate >= 30f) {
+                        // break 60 fps assumption if data from display appears valid
+                        refreshRate = displayRefreshRate
+                    }
+                }
+                frameIntervalNs = (1000000000 / refreshRate).toLong()
+            }
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
index 9dddcdbe..1eb2594 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/selection/AndroidSelectionHandles.android.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
@@ -34,8 +35,10 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.window.Popup
 import androidx.compose.ui.window.PopupPositionProvider
+import androidx.compose.ui.window.PopupProperties
 import kotlin.math.roundToInt
 
+@OptIn(ExperimentalComposeUiApi::class)
 @Composable
 internal actual fun SelectionHandle(
     startHandlePosition: Offset?,
@@ -157,6 +160,7 @@
     }
 }
 
+@OptIn(ExperimentalComposeUiApi::class)
 @Composable
 private fun SelectionHandlePopup(
     startHandlePosition: Offset?,
@@ -181,6 +185,10 @@
 
     Popup(
         popupPositionProvider = popupPositioner,
+        properties = PopupProperties(
+            excludeFromSystemGesture = true,
+            clippingEnabled = false
+        ),
         content = content
     )
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
index 20cc811..75c988a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Border.kt
@@ -36,8 +36,7 @@
 import androidx.compose.ui.unit.Dp
 
 /**
- * Modify element to add border with appearance specified with a [border] and a [shape], pad the
- * content by the [BorderStroke.width] and clip it.
+ * Modify element to add border with appearance specified with a [border] and a [shape] and clip it.
  *
  * @sample androidx.compose.foundation.samples.BorderSample()
  *
@@ -48,8 +47,8 @@
     border(width = border.width, brush = border.brush, shape = shape)
 
 /**
- * Returns a [Modifier] that adds border with appearance specified with [width], [color] and a
- * [shape], pads the content by the [width] and clips it.
+ * Modify element to add border with appearance specified with a [width], a [color] and a [shape]
+ * and clip it.
  *
  * @sample androidx.compose.foundation.samples.BorderSampleWithDataClass()
  *
@@ -61,8 +60,8 @@
     border(width, SolidColor(color), shape)
 
 /**
- * Returns a [Modifier] that adds border with appearance specified with [width], [brush] and a
- * [shape], pads the content by the [width] and clips it.
+ * Modify element to add border with appearance specified with a [width], a [brush] and a [shape]
+ * and clip it.
  *
  * @sample androidx.compose.foundation.samples.BorderSampleWithBrush()
  *
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 efc9fce..1aa5b59 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
@@ -19,7 +19,7 @@
 import androidx.compose.animation.core.AnimationState
 import androidx.compose.animation.core.DecayAnimationSpec
 import androidx.compose.animation.core.animateDecay
-import androidx.compose.animation.defaultDecayAnimationSpec
+import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.MutatePriority
 import androidx.compose.foundation.gestures.Orientation.Horizontal
 import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -106,7 +106,7 @@
      */
     @Composable
     fun flingBehavior(): FlingBehavior {
-        val flingSpec = defaultDecayAnimationSpec()
+        val flingSpec = rememberSplineBasedDecay<Float>()
         return remember(flingSpec) {
             DefaultFlingBehavior(flingSpec)
         }
@@ -163,8 +163,11 @@
     val scrollableState: ScrollableState,
     val flingBehavior: FlingBehavior
 ) {
-    fun Float.toOffset(): Offset =
-        if (orientation == Horizontal) Offset(this, 0f) else Offset(0f, this)
+    fun Float.toOffset(): Offset = when {
+        this == 0f -> Offset.Zero
+        orientation == Horizontal -> Offset(this, 0f)
+        else -> Offset(0f, this)
+    }
 
     fun Float.toVelocity(): Velocity =
         if (orientation == Horizontal) Velocity(this, 0f) else Velocity(0f, this)
@@ -178,16 +181,19 @@
     fun Float.reverseIfNeeded(): Float = if (reverseDirection) this * -1 else this
 
     fun ScrollScope.dispatchScroll(scrollDelta: Float, source: NestedScrollSource): Float {
-        val scrollOffset = scrollDelta.toOffset()
-        val preConsumedByParent = nestedScrollDispatcher.value
-            .dispatchPreScroll(scrollOffset, source)
+        val nestedScrollDispatcher = nestedScrollDispatcher.value
+        val preConsumedByParent = nestedScrollDispatcher
+            .dispatchPreScroll(scrollDelta.toOffset(), source)
 
-        val scrollAvailable = scrollOffset - preConsumedByParent
-        val consumed = scrollBy(scrollAvailable.toFloat().reverseIfNeeded())
-            .reverseIfNeeded().toOffset()
+        val scrollAvailable = scrollDelta - preConsumedByParent.toFloat()
+        val consumed = scrollBy(scrollAvailable.reverseIfNeeded()).reverseIfNeeded()
         val leftForParent = scrollAvailable - consumed
-        nestedScrollDispatcher.value.dispatchPostScroll(consumed, leftForParent, source)
-        return leftForParent.toFloat()
+        nestedScrollDispatcher.dispatchPostScroll(
+            consumed.toOffset(),
+            leftForParent.toOffset(),
+            source
+        )
+        return leftForParent
     }
 
     fun performRawScroll(scroll: Offset): Offset {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 8c266b3..acca6c2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -27,10 +27,13 @@
 import androidx.compose.foundation.layout.padding
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.layout.SubcomposeLayout
+import androidx.compose.ui.layout.SubcomposeLayoutState
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.LayoutDirection
@@ -67,8 +70,18 @@
 
     val itemContentFactory = rememberItemContentFactory(stateOfItemsProvider, state)
 
+    val subcomposeLayoutState = remember { SubcomposeLayoutState() }
+    LazyListPrefetcher(state, stateOfItemsProvider, itemContentFactory, subcomposeLayoutState)
+
     SubcomposeLayout(
+        subcomposeLayoutState,
         modifier
+            .lazyListSemantics(
+                stateOfItemsProvider = stateOfItemsProvider,
+                state = state,
+                coroutineScope = rememberCoroutineScope(),
+                isVertical = isVertical
+            )
             .scrollable(
                 orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
                 reverseDirection = reverseScrollDirection,
@@ -170,3 +183,15 @@
         )
     }
 }
+
+/**
+ * Platform specific implementation of lazy list prefetching - precomposing next items in
+ * advance during the scrolling.
+ */
+@Composable
+internal expect fun LazyListPrefetcher(
+    lazyListState: LazyListState,
+    stateOfItemsProvider: State<LazyListItemsProvider>,
+    itemContentFactory: LazyListItemContentFactory,
+    subcomposeLayoutState: SubcomposeLayoutState
+)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 1c9fe3f..082c787 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -214,6 +214,8 @@
     override val isScrollInProgress: Boolean
         get() = scrollableState.isScrollInProgress
 
+    internal var onScrolledListener: LazyListOnScrolledListener? = null
+
     // TODO: Coroutine scrolling APIs will allow this to be private again once we have more
     //  fine-grained control over scrolling
     /*@VisibleForTesting*/
@@ -232,7 +234,9 @@
         // inside measuring we do scrollToBeConsumed.roundToInt() so there will be no scroll if
         // we have less than 0.5 pixels
         if (abs(scrollToBeConsumed) > 0.5f) {
+            val preScrollToBeConsumed = scrollToBeConsumed
             remeasurement.forceRemeasure()
+            onScrolledListener?.onScrolled(preScrollToBeConsumed - scrollToBeConsumed)
         }
 
         // here scrollToBeConsumed is already consumed during the forceRemeasure invocation
@@ -356,3 +360,7 @@
     override val viewportEndOffset = 0
     override val totalItemsCount = 0
 }
+
+internal interface LazyListOnScrolledListener {
+    fun onScrolled(delta: Float)
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
new file mode 100644
index 0000000..a460b39
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
@@ -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.
+ */
+
+package androidx.compose.foundation.lazy
+
+import androidx.compose.runtime.State
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.CollectionInfo
+import androidx.compose.ui.semantics.collectionInfo
+import androidx.compose.ui.semantics.indexForKey
+import androidx.compose.ui.semantics.scrollToIndex
+import androidx.compose.ui.semantics.semantics
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+internal fun Modifier.lazyListSemantics(
+    stateOfItemsProvider: State<LazyListItemsProvider>,
+    state: LazyListState,
+    coroutineScope: CoroutineScope,
+    isVertical: Boolean
+): Modifier {
+    return semantics {
+        indexForKey { needle ->
+            val key = stateOfItemsProvider.value::getKey
+            for (index in 0 until stateOfItemsProvider.value.itemsCount) {
+                if (key(index) == needle) {
+                    return@indexForKey index
+                }
+            }
+            -1
+        }
+
+        scrollToIndex { index ->
+            require(index >= 0 && index < stateOfItemsProvider.value.itemsCount) {
+                "Can't scroll to index $index, it is out of bounds [0, ${stateOfItemsProvider
+                    .value.itemsCount})"
+            }
+            coroutineScope.launch {
+                state.scrollToItem(index)
+            }
+            true
+        }
+
+        collectionInfo = CollectionInfo(
+            rowCount = if (isVertical) -1 else 1,
+            columnCount = if (isVertical) 1 else -1
+        )
+    }
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
index e433162..1ff8402 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/SelectableGroup.kt
@@ -26,6 +26,6 @@
  *
  * @see selectableGroup
  */
-fun Modifier.selectableGroup() = this.semantics(true) {
+fun Modifier.selectableGroup() = this.semantics {
     selectableGroup()
 }
\ No newline at end of file
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 18520b1..c0c452c 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
@@ -37,7 +37,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Paint
+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.pointerInput
@@ -154,7 +154,7 @@
         placeholders = placeholders
     )
     state.onTextLayout = onTextLayout
-    state.selectionPaint.color = selectionBackgroundColor
+    state.selectionBackgroundColor = selectionBackgroundColor
 
     val controller = remember { TextController(state) }
     controller.update(selectionRegistrar)
@@ -398,7 +398,7 @@
                     layoutCoordinates = it,
                     startPosition = dragBeginPosition,
                     endPosition = dragBeginPosition + dragTotalDistance,
-                    adjustment = SelectionAdjustment.NONE
+                    adjustment = SelectionAdjustment.CHARACTER
                 )
             }
         }
@@ -491,12 +491,9 @@
     @OptIn(InternalFoundationTextApi::class)
     private fun Modifier.drawTextAndSelectionBehind(): Modifier =
         this.graphicsLayer().drawBehind {
-            drawIntoCanvas { canvas ->
-                val textLayoutResult = state.layoutResult
-                val selectionPaint = state.selectionPaint
+            state.layoutResult?.let {
                 val selection = selectionRegistrar?.subselections?.get(state.selectableId)
 
-                if (textLayoutResult == null) return@drawIntoCanvas
                 if (selection != null) {
                     val start = if (!selection.handlesCrossed) {
                         selection.start.offset
@@ -508,15 +505,15 @@
                     } else {
                         selection.start.offset
                     }
-                    TextDelegate.paintBackground(
-                        start,
-                        end,
-                        selectionPaint,
-                        canvas,
-                        textLayoutResult
-                    )
+
+                    if (start != end) {
+                        val selectionPath = it.multiParagraph.getPathForRange(start, end)
+                        drawPath(selectionPath, state.selectionBackgroundColor)
+                    }
                 }
-                TextDelegate.paint(canvas, textLayoutResult)
+                drawIntoCanvas { canvas ->
+                    TextDelegate.paint(canvas, it)
+                }
             }
         }
 }
@@ -542,8 +539,8 @@
     /** The global position calculated during the last notifyPosition callback */
     var previousGlobalPosition: Offset = Offset.Zero
 
-    /** The paint used to draw highlight background for selected text. */
-    val selectionPaint: Paint = Paint()
+    /** The background color of selection */
+    var selectionBackgroundColor: Color = Color.Unspecified
 }
 
 /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
index 039037a..728b5ca 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/InlineTextContent.kt
@@ -82,5 +82,5 @@
      * The composable to be inserted into the text layout.
      * The string parameter passed to it will the alternateText given to [appendInlineContent].
      */
-    val children: @Composable() (String) -> Unit
+    val children: @Composable (String) -> Unit
 )
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
index 39e1fb3..ba4f6e4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
@@ -18,7 +18,6 @@
 
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.MultiParagraph
 import androidx.compose.ui.text.MultiParagraphIntrinsics
@@ -28,7 +27,6 @@
 import androidx.compose.ui.text.TextPainter
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.SpanStyle
-import androidx.compose.ui.text.canReuse
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.resolveDefaults
 import androidx.compose.ui.text.style.TextAlign
@@ -90,7 +88,7 @@
     val overflow: TextOverflow = TextOverflow.Clip,
     val density: Density,
     val resourceLoader: Font.ResourceLoader,
-    val placeholders: List<AnnotatedString.Range<Placeholder>> = listOf()
+    val placeholders: List<AnnotatedString.Range<Placeholder>> = emptyList()
 ) {
     /*@VisibleForTesting*/
     internal var paragraphIntrinsics: MultiParagraphIntrinsics? = null
@@ -204,7 +202,7 @@
         prevResult: TextLayoutResult? = null
     ): TextLayoutResult {
         if (prevResult != null && prevResult.canReuse(
-                text, style, maxLines, softWrap, overflow, density, layoutDirection,
+                text, style, placeholders, maxLines, softWrap, overflow, density, layoutDirection,
                 resourceLoader, constraints
             )
         ) {
@@ -271,27 +269,5 @@
         fun paint(canvas: Canvas, textLayoutResult: TextLayoutResult) {
             TextPainter.paint(canvas, textLayoutResult)
         }
-
-        /**
-         * Draws text background of the given range.
-         *
-         * If the given range is empty, do nothing.
-         *
-         * @param start inclusive start character offset of the drawing range.
-         * @param end exclusive end character offset of the drawing range.
-         * @param paint used to draw background.
-         * @param canvas the target canvas.
-         */
-        fun paintBackground(
-            start: Int,
-            end: Int,
-            paint: Paint,
-            canvas: Canvas,
-            textLayoutResult: TextLayoutResult
-        ) {
-            if (start == end) return
-            val selectionPath = textLayoutResult.multiParagraph.getPathForRange(start, end)
-            canvas.drawPath(selectionPath, paint)
-        }
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
index 3a146c9..1ca95ba 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
@@ -159,21 +159,25 @@
                 return
             }
 
-            val bbox = if (value.selection.max < value.text.length) {
-                textLayoutResult.getBoundingBox(
-                    offsetMapping.originalToTransformed(value.selection.max)
-                )
-            } else if (value.selection.max != 0) {
-                textLayoutResult.getBoundingBox(
-                    offsetMapping.originalToTransformed(value.selection.max) - 1
-                )
-            } else {
-                val defaultSize = computeSizeForDefaultText(
-                    textDelegate.style,
-                    textDelegate.density,
-                    textDelegate.resourceLoader
-                )
-                Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
+            val bbox = when {
+                value.selection.max < value.text.length -> {
+                    textLayoutResult.getBoundingBox(
+                        offsetMapping.originalToTransformed(value.selection.max)
+                    )
+                }
+                value.selection.max != 0 -> {
+                    textLayoutResult.getBoundingBox(
+                        offsetMapping.originalToTransformed(value.selection.max) - 1
+                    )
+                }
+                else -> {
+                    val defaultSize = computeSizeForDefaultText(
+                        textDelegate.style,
+                        textDelegate.density,
+                        textDelegate.resourceLoader
+                    )
+                    Rect(0f, 0f, 1.0f, defaultSize.height.toFloat())
+                }
             }
             val globalLT = layoutCoordinates.localToRoot(Offset(bbox.left, bbox.top))
 
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
index 4d31915..2f2051e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
@@ -14,8 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.text
+package androidx.compose.foundation.text
 
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
@@ -27,17 +31,19 @@
  *
  * @param text a text to be used for computing text layout.
  * @param style a text style to be used for computing text layout.
+ * @param placeholders a list of [Placeholder]s to be used for computing text layout.
  * @param maxLines a maximum number of lines to be used for computing text layout.
  * @param softWrap whether doing softwrap or not to be used for computing text layout.
  * @param overflow an overflow type to be used for computing text layout.
  * @param density a density to be used for computing text layout.
  * @param layoutDirection a layout direction to be used for computing text layout.
- * @param resourceLoader a resource loader to be used for computing text layout.
  * @param constraints a constraint to be used for computing text layout.
  */
+@OptIn(InternalFoundationTextApi::class)
 internal fun TextLayoutResult.canReuse(
     text: AnnotatedString,
     style: TextStyle,
+    placeholders: List<AnnotatedString.Range<Placeholder>>,
     maxLines: Int,
     softWrap: Boolean,
     overflow: TextOverflow,
@@ -52,6 +58,7 @@
     if (!(
         layoutInput.text == text &&
             layoutInput.style.canReuseLayout(style) &&
+            layoutInput.placeholders == placeholders &&
             layoutInput.maxLines == maxLines &&
             layoutInput.softWrap == softWrap &&
             layoutInput.overflow == overflow &&
@@ -67,7 +74,7 @@
     if (constraints.minWidth != layoutInput.constraints.minWidth) return false
 
     if (!(softWrap || overflow == TextOverflow.Ellipsis)) {
-        // If width does not mattter, we can result the same layout.
+        // If width does not matter, we can result the same layout.
         return true
     }
     return constraints.maxWidth == layoutInput.constraints.maxWidth
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
index f227c2b..84c367d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/MultiWidgetSelectionDelegate.kt
@@ -21,6 +21,7 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextRange
 import kotlin.math.max
 
 internal class MultiWidgetSelectionDelegate(
@@ -34,7 +35,6 @@
         endPosition: Offset,
         containerLayoutCoordinates: LayoutCoordinates,
         adjustment: SelectionAdjustment,
-        ensureAtLeastOneChar: Boolean,
         previousSelection: Selection?,
         isStartHandle: Boolean
     ): Selection? {
@@ -50,11 +50,10 @@
         return getTextSelectionInfo(
             textLayoutResult = textLayoutResult,
             selectionCoordinates = Pair(startPx, endPx),
-            selectable = this,
+            selectableId = selectableId,
             adjustment = adjustment,
             previousSelection = previousSelection,
-            isStartHandle = isStartHandle,
-            ensureAtLeastOneChar = ensureAtLeastOneChar
+            isStartHandle = isStartHandle
         )
     }
 
@@ -105,23 +104,38 @@
  * @param textLayoutResult a result of the text layout.
  * @param selectionCoordinates The positions of the start and end of the selection in Text
  * composable coordinate system.
- * @param selectable current [Selectable] for which the [Selection] is being calculated
- * @param adjustment [Selection] range is adjusted according to this param
- * @param ensureAtLeastOneChar should selection contain at least one character
- * @param previousSelection previous selection result
- * @param isStartHandle true if the start handle is being dragged
  *
  * @return [Selection] of the current composable, or null if the composable is not selected.
  */
 internal fun getTextSelectionInfo(
     textLayoutResult: TextLayoutResult,
     selectionCoordinates: Pair<Offset, Offset>,
-    selectable: Selectable,
+    selectableId: Long,
     adjustment: SelectionAdjustment,
-    ensureAtLeastOneChar: Boolean = true,
     previousSelection: Selection? = null,
     isStartHandle: Boolean = true
 ): Selection? {
+    val textRange = getTextSelectionRange(textLayoutResult, selectionCoordinates) ?: return null
+    val adjustedTextRange = adjustSelection(
+        textLayoutResult = textLayoutResult,
+        textRange = textRange,
+        isStartHandle = isStartHandle,
+        previousHandlesCrossed = previousSelection?.handlesCrossed ?: false,
+        adjustment = adjustment
+    )
+    return getAssembledSelectionInfo(
+        startOffset = adjustedTextRange.start,
+        endOffset = adjustedTextRange.end,
+        handlesCrossed = adjustedTextRange.reversed,
+        selectableId = selectableId,
+        textLayoutResult = textLayoutResult
+    )
+}
+
+internal fun getTextSelectionRange(
+    textLayoutResult: TextLayoutResult,
+    selectionCoordinates: Pair<Offset, Offset>
+): TextRange? {
     val startPosition = selectionCoordinates.first
     val endPosition = selectionCoordinates.second
 
@@ -141,121 +155,75 @@
         bounds.contains(Offset(endPosition.x, endPosition.y))
 
     val rawStartOffset =
-        if (containsWholeSelectionStart)
+        if (containsWholeSelectionStart) {
             textLayoutResult.getOffsetForPosition(startPosition).coerceIn(0, lastOffset)
-        else
-        // If the composable is selected, the start offset cannot be -1 for this composable. If the
-        // final start offset is still -1, it means this composable is not selected.
+        } else {
+            // If the composable is selected, the start offset cannot be -1 for this composable. If the
+            // final start offset is still -1, it means this composable is not selected.
             -1
+        }
     val rawEndOffset =
-        if (containsWholeSelectionEnd)
+        if (containsWholeSelectionEnd) {
             textLayoutResult.getOffsetForPosition(endPosition).coerceIn(0, lastOffset)
-        else
-        // If the composable is selected, the end offset cannot be -1 for this composable. If the
-        // final end offset is still -1, it means this composable is not selected.
+        } else {
+            // If the composable is selected, the end offset cannot be -1 for this composable. If the
+            // final end offset is still -1, it means this composable is not selected.
             -1
+        }
 
-    return getRefinedSelectionInfo(
+    return getRefinedSelectionRange(
         rawStartOffset = rawStartOffset,
         rawEndOffset = rawEndOffset,
-        containsWholeSelectionStart = containsWholeSelectionStart,
-        containsWholeSelectionEnd = containsWholeSelectionEnd,
         startPosition = startPosition,
         endPosition = endPosition,
         bounds = bounds,
-        textLayoutResult = textLayoutResult,
         lastOffset = lastOffset,
-        selectable = selectable,
-        adjustment = adjustment,
-        previousSelection = previousSelection,
-        isStartHandle = isStartHandle,
-        ensureAtLeastOneChar = ensureAtLeastOneChar
     )
 }
 
 /**
  * This method refines the selection info by processing the initial raw selection info.
  *
- * @param rawStartOffset unprocessed start offset calculated directly from input position
- * @param rawEndOffset unprocessed end offset calculated directly from input position
- * @param containsWholeSelectionStart a flag to check if current composable contains the overall
- * selection start
- * @param containsWholeSelectionEnd a flag to check if current composable contains the overall
- * selection end
+ * @param rawStartOffset unprocessed start offset calculated directly from input position.
+ * A negative value of this parameter means that the start handle is not in this selectable.
+ * @param rawEndOffset unprocessed end offset calculated directly from input position. A negative
+ * value of this parameter means that the start handle is not in this selectable.
  * @param startPosition graphical position of the start of the selection, in composable's
  * coordinates.
  * @param endPosition graphical position of the end of the selection, in composable's coordinates.
  * @param bounds bounds of the current composable
- * @param textLayoutResult a result of the text layout.
  * @param lastOffset last offset of the text. It's actually the length of the text.
- * @param selectable current [Selectable] for which the [Selection] is being calculated
- * @param adjustment [Selection] range is adjusted according to this param
- * @param ensureAtLeastOneChar should selection contain at least one character
- * @param previousSelection previous selection result
- * @param isStartHandle true if the start handle is being dragged
  *
  * @return [Selection] of the current composable, or null if the composable is not selected.
  */
-private fun getRefinedSelectionInfo(
+private fun getRefinedSelectionRange(
     rawStartOffset: Int,
     rawEndOffset: Int,
-    containsWholeSelectionStart: Boolean,
-    containsWholeSelectionEnd: Boolean,
     startPosition: Offset,
     endPosition: Offset,
     bounds: Rect,
-    textLayoutResult: TextLayoutResult,
-    lastOffset: Int,
-    selectable: Selectable,
-    adjustment: SelectionAdjustment,
-    ensureAtLeastOneChar: Boolean,
-    previousSelection: Selection? = null,
-    isStartHandle: Boolean = true
-): Selection? {
+    lastOffset: Int
+): TextRange? {
+    val containsWholeSelectionStart = rawStartOffset >= 0
+    val containsWholeSelectionEnd = rawEndOffset >= 0
+
     val shouldProcessAsSinglecomposable =
         containsWholeSelectionStart && containsWholeSelectionEnd
 
-    val (startOffset, endOffset, handlesCrossed) =
-        if (shouldProcessAsSinglecomposable) {
-            processAsSingleComposable(
-                rawStartOffset = rawStartOffset,
-                rawEndOffset = rawEndOffset,
-                previousSelection = previousSelection?.toTextRange(),
-                isStartHandle = isStartHandle,
-                lastOffset = lastOffset,
-                handlesCrossed = previousSelection?.handlesCrossed ?: false,
-                ensureAtLeastOneChar = ensureAtLeastOneChar
-            )
-        } else {
-            processCrossComposable(
-                startPosition = startPosition,
-                endPosition = endPosition,
-                rawStartOffset = rawStartOffset,
-                rawEndOffset = rawEndOffset,
-                lastOffset = lastOffset,
-                bounds = bounds,
-                containsWholeSelectionStart = containsWholeSelectionStart,
-                containsWholeSelectionEnd = containsWholeSelectionEnd
-            )
-        }
-    // nothing is selected
-    if (startOffset == -1 && endOffset == -1) return null
-
-    val (start, end) = adjustSelection(
-        textLayoutResult = textLayoutResult,
-        startOffset = startOffset,
-        endOffset = endOffset,
-        handlesCrossed = handlesCrossed,
-        adjustment = adjustment
-    )
-
-    return getAssembledSelectionInfo(
-        startOffset = start,
-        endOffset = end,
-        handlesCrossed = handlesCrossed,
-        selectableId = selectable.selectableId,
-        textLayoutResult = textLayoutResult
-    )
+    return if (shouldProcessAsSinglecomposable) {
+        TextRange(rawStartOffset, rawEndOffset)
+    } else {
+        processCrossComposable(
+            startPosition = startPosition,
+            endPosition = endPosition,
+            rawStartOffset = rawStartOffset,
+            rawEndOffset = rawEndOffset,
+            lastOffset = lastOffset,
+            bounds = bounds,
+            containsWholeSelectionStart = containsWholeSelectionStart,
+            containsWholeSelectionEnd = containsWholeSelectionEnd
+        )
+    }
 }
 
 /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
index 57be5e1..0e33360 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selectable.kt
@@ -44,7 +44,6 @@
      * @param endPosition graphical position of the end of the selection
      * @param containerLayoutCoordinates [LayoutCoordinates] of the widget
      * @param adjustment [Selection] range is adjusted according to this param
-     * @param ensureAtLeastOneChar should selection contain at least one character
      * @param previousSelection previous selection result
      * @param isStartHandle true if the start handle is being dragged
      *
@@ -56,7 +55,6 @@
         endPosition: Offset,
         containerLayoutCoordinates: LayoutCoordinates,
         adjustment: SelectionAdjustment,
-        ensureAtLeastOneChar: Boolean,
         previousSelection: Selection? = null,
         isStartHandle: Boolean = true
     ): Selection?
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
index bc22a7f..4ec4b4c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/Selection.kt
@@ -71,8 +71,11 @@
         if (other == null) return this
 
         var selection = this
-        if (handlesCrossed) selection = selection.copy(start = other.start)
-        else selection = selection.copy(end = other.end)
+        selection = if (handlesCrossed) {
+            selection.copy(start = other.start)
+        } else {
+            selection.copy(end = other.end)
+        }
 
         return selection
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
index ae1e614..b9d4862 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
@@ -216,8 +216,7 @@
                     startPosition = startPositionOrCurrent,
                     endPosition = convertToContainerCoordinates(layoutCoordinates, endPosition),
                     isStartHandle = false,
-                    adjustment = selectionMode,
-                    ensureAtLeastOneChar = touchMode
+                    adjustment = selectionMode
                 )
             }
 
@@ -324,8 +323,6 @@
      *
      * @param startPosition [Offset] for the start of the selection
      * @param endPosition [Offset] for the end of the selection
-     * @param adjustment [Selection] range is adjusted according to this param
-     * @param ensureAtLeastOneChar should selection contain at least one character
      * @param previousSelection previous selection
      *
      * @return a [Pair] of a [Selection] object which is constructed by combining all
@@ -337,7 +334,6 @@
         startPosition: Offset,
         endPosition: Offset,
         adjustment: SelectionAdjustment = SelectionAdjustment.NONE,
-        ensureAtLeastOneChar: Boolean = true,
         previousSelection: Selection? = null,
         isStartHandle: Boolean = true
     ): Pair<Selection?, Map<Long, Selection>> {
@@ -350,8 +346,7 @@
                     containerLayoutCoordinates = requireContainerCoordinates(),
                     previousSelection = previousSelection,
                     isStartHandle = isStartHandle,
-                    adjustment = adjustment,
-                    ensureAtLeastOneChar = ensureAtLeastOneChar
+                    adjustment = adjustment
                 )
                 selection?.let { subselections[selectable.selectableId] = it }
                 merge(mergedSelection, selection)
@@ -611,7 +606,6 @@
         startPosition: Offset?,
         endPosition: Offset?,
         adjustment: SelectionAdjustment = SelectionAdjustment.NONE,
-        ensureAtLeastOneChar: Boolean = true,
         isStartHandle: Boolean = true
     ) {
         if (startPosition == null || endPosition == null) return
@@ -621,7 +615,6 @@
             adjustment = adjustment,
             isStartHandle = isStartHandle,
             previousSelection = selection,
-            ensureAtLeastOneChar = ensureAtLeastOneChar
         )
         if (newSelection != selection) {
             selectionRegistrar.subselections = newSubselection
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
index 1245072..18da339 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionMode.kt
@@ -58,16 +58,16 @@
             start: Offset,
             end: Offset
         ): Boolean {
-            if (start.y >= bounds.top && start.y < bounds.bottom &&
+            return if (start.y >= bounds.top && start.y < bounds.bottom &&
                 end.y >= bounds.top && end.y < bounds.bottom
             ) {
                 // When the start and end of the selection are in the same row of widgets, check if
                 // x coordinates of the start and end are crossed each other.
-                return start.x > end.x
+                start.x > end.x
             } else {
                 // When the start and end of the selection are not in the same row of widgets, check
                 // if y coordinates of the start and end are crossed each other.
-                return start.y > end.y
+                start.y > end.y
             }
         }
     },
@@ -107,16 +107,16 @@
             start: Offset,
             end: Offset
         ): Boolean {
-            if (start.x >= bounds.left && start.x < bounds.right &&
+            return if (start.x >= bounds.left && start.x < bounds.right &&
                 end.x >= bounds.left && end.x < bounds.right
             ) {
                 // When the start and end of the selection are in the same column of widgets,
                 // check if y coordinates of the start and end are crossed each other.
-                return start.y > end.y
+                start.y > end.y
             } else {
                 // When the start and end of the selection are not in the same column of widgets,
                 // check if x coordinates of the start and end are crossed each other.
-                return start.x > end.x
+                start.x > end.x
             }
         }
     };
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
index ba46b22..f9bc6af 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionRegistrar.kt
@@ -30,6 +30,7 @@
 
 internal enum class SelectionAdjustment {
     NONE,
+    CHARACTER,
     WORD,
     PARAGRAPH
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegate.kt
index deda9f0..a83cbcc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionDelegate.kt
@@ -26,10 +26,8 @@
  * @param rawStartOffset unprocessed start offset calculated directly from input position
  * @param rawEndOffset unprocessed end offset calculated directly from input position
  * @param previousSelection previous selection result
- * @param previousHandlesCrossed true if the previous selection's handles are crossed
  * @param isStartHandle true if the start handle is being dragged
  * @param adjustment selection is adjusted according to this param
- * @param ensureAtLeastOneChar should selection contain at least one character
  *
  * @return selected text range.
  */
@@ -38,34 +36,25 @@
     rawStartOffset: Int,
     rawEndOffset: Int,
     previousSelection: TextRange?,
-    previousHandlesCrossed: Boolean,
     isStartHandle: Boolean,
-    adjustment: SelectionAdjustment,
-    ensureAtLeastOneChar: Boolean
+    adjustment: SelectionAdjustment
 ): TextRange {
     textLayoutResult?.let {
-        val lastOffset = it.layoutInput.text.text.length
+        val textRange = TextRange(rawStartOffset, rawEndOffset)
 
-        val (startOffset, endOffset, handlesCrossed) =
-            processAsSingleComposable(
-                rawStartOffset = rawStartOffset,
-                rawEndOffset = rawEndOffset,
-                previousSelection = previousSelection,
-                isStartHandle = isStartHandle,
-                lastOffset = lastOffset,
-                handlesCrossed = previousHandlesCrossed,
-                ensureAtLeastOneChar = ensureAtLeastOneChar
-            )
+        // When the previous selection is null, it's allowed to have collapsed selection.
+        // So we can ignore the SelectionAdjustment.CHARACTER.
+        if (previousSelection == null && adjustment == SelectionAdjustment.CHARACTER) {
+            return textRange
+        }
 
-        val (start, end) = adjustSelection(
+        return adjustSelection(
             textLayoutResult = textLayoutResult,
-            startOffset = startOffset,
-            endOffset = endOffset,
-            handlesCrossed = handlesCrossed,
+            textRange = textRange,
+            isStartHandle = isStartHandle,
+            previousHandlesCrossed = previousSelection?.reversed ?: false,
             adjustment = adjustment
         )
-
-        return TextRange(start, end)
     }
     return TextRange(0, 0)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
index 566de3d..356d1ae 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.kt
@@ -172,8 +172,7 @@
                     transformedStartOffset = offset,
                     transformedEndOffset = offset,
                     isStartHandle = false,
-                    adjustment = SelectionAdjustment.WORD,
-                    ensureAtLeastOneChar = true
+                    adjustment = SelectionAdjustment.WORD
                 )
                 dragBeginOffsetInText = offset
             }
@@ -200,8 +199,7 @@
                     transformedStartOffset = startOffset,
                     transformedEndOffset = endOffset,
                     isStartHandle = false,
-                    adjustment = SelectionAdjustment.WORD,
-                    ensureAtLeastOneChar = true
+                    adjustment = SelectionAdjustment.WORD
                 )
             }
             state?.showFloatingToolbar = false
@@ -226,8 +224,7 @@
                     transformedStartOffset = startOffset,
                     transformedEndOffset = clickOffset,
                     isStartHandle = false,
-                    adjustment = SelectionAdjustment.NONE,
-                    ensureAtLeastOneChar = false
+                    adjustment = SelectionAdjustment.NONE
                 )
                 return true
             }
@@ -250,8 +247,7 @@
                     transformedStartOffset = startOffset,
                     transformedEndOffset = dragOffset,
                     isStartHandle = false,
-                    adjustment = SelectionAdjustment.NONE,
-                    ensureAtLeastOneChar = false
+                    adjustment = SelectionAdjustment.NONE
                 )
                 return true
             }
@@ -274,8 +270,7 @@
                     transformedStartOffset = clickOffset,
                     transformedEndOffset = clickOffset,
                     isStartHandle = false,
-                    adjustment = adjustment,
-                    ensureAtLeastOneChar = false
+                    adjustment = adjustment
                 )
                 return true
             }
@@ -297,8 +292,7 @@
                     transformedStartOffset = dragBeginOffsetInText!!,
                     transformedEndOffset = dragOffset,
                     isStartHandle = false,
-                    adjustment = adjustment,
-                    ensureAtLeastOneChar = false
+                    adjustment = adjustment
                 )
                 return true
             }
@@ -340,8 +334,7 @@
                         transformedStartOffset = startOffset,
                         transformedEndOffset = endOffset,
                         isStartHandle = isStartHandle,
-                        adjustment = SelectionAdjustment.NONE,
-                        ensureAtLeastOneChar = true
+                        adjustment = SelectionAdjustment.CHARACTER
                     )
                 }
                 state?.showFloatingToolbar = false
@@ -611,8 +604,7 @@
         transformedStartOffset: Int,
         transformedEndOffset: Int,
         isStartHandle: Boolean,
-        adjustment: SelectionAdjustment,
-        ensureAtLeastOneChar: Boolean
+        adjustment: SelectionAdjustment
     ) {
         val transformedSelection = TextRange(
             offsetMapping.originalToTransformed(value.selection.start),
@@ -624,10 +616,8 @@
             rawStartOffset = transformedStartOffset,
             rawEndOffset = transformedEndOffset,
             previousSelection = if (transformedSelection.collapsed) null else transformedSelection,
-            previousHandlesCrossed = transformedSelection.reversed,
             isStartHandle = isStartHandle,
-            adjustment = adjustment,
-            ensureAtLeastOneChar = ensureAtLeastOneChar
+            adjustment = adjustment
         )
 
         val originalSelection = TextRange(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
index 1aae6eb..fcd0212 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/TextSelectionDelegate.kt
@@ -25,55 +25,6 @@
 
 /**
  * This method takes unprocessed selection information as input, and calculates the selection
- * range and check if the selection handles are crossed, for selection with both start and end
- * are in the current composable.
- *
- * @param rawStartOffset unprocessed start offset calculated directly from input position
- * @param rawEndOffset unprocessed end offset calculated directly from input position
- * different location. If the selection anchors point the same location and this is true, the
- * result selection will be adjusted to word boundary. Otherwise, the selection will be adjusted
- * to keep single character selected.
- * @param previousSelection previous selected text range.
- * @param isStartHandle true if the start handle is being dragged
- * @param lastOffset last offset of the text. It's actually the length of the text.
- * @param handlesCrossed true if the selection handles are crossed
- * @param ensureAtLeastOneChar should selection contain at least one character
- *
- * @return the final startOffset, endOffset of the selection, and if the start and end are
- * crossed each other.
- */
-internal fun processAsSingleComposable(
-    rawStartOffset: Int,
-    rawEndOffset: Int,
-    previousSelection: TextRange?,
-    isStartHandle: Boolean,
-    lastOffset: Int,
-    handlesCrossed: Boolean,
-    ensureAtLeastOneChar: Boolean
-): Triple<Int, Int, Boolean> {
-    var startOffset = rawStartOffset
-    var endOffset = rawEndOffset
-    if (startOffset == endOffset && ensureAtLeastOneChar) {
-
-        if (previousSelection == null) return Triple(rawStartOffset, rawStartOffset, false)
-        // If the start and end offset are at the same character, and it's not the initial
-        // selection, then bound to at least one character.
-        val textRange = ensureAtLeastOneChar(
-            offset = rawStartOffset,
-            lastOffset = lastOffset,
-            isStartHandle = isStartHandle,
-            handlesCrossed = handlesCrossed
-        )
-        startOffset = textRange.start
-        endOffset = textRange.end
-    }
-    // Check if the start and end handles are crossed each other.
-    val areHandlesCrossed = startOffset > endOffset
-    return Triple(startOffset, endOffset, areHandlesCrossed)
-}
-
-/**
- * This method takes unprocessed selection information as input, and calculates the selection
  * range for current composable, and check if the selection handles are crossed, for selection with
  * the start and end are in different composables.
  *
@@ -89,8 +40,8 @@
  * @param containsWholeSelectionEnd flag to check if the current composable contains the end of the
  * selection
  *
- * @return the final startOffset, endOffset of the selection, and if the start and end handles are
- * crossed each other.
+ * @return the final textRange which contains the startOffset, endOffset of the selection, and
+ * if the start and end handles are crossed each other.
  */
 internal fun processCrossComposable(
     startPosition: Offset,
@@ -101,7 +52,7 @@
     bounds: Rect,
     containsWholeSelectionStart: Boolean,
     containsWholeSelectionEnd: Boolean
-): Triple<Int, Int, Boolean> {
+): TextRange? {
     val handlesCrossed = SelectionMode.Vertical.areHandlesCrossed(
         bounds = bounds,
         start = startPosition,
@@ -130,46 +81,61 @@
         // The same as startOffset.
         rawEndOffset
     }
-    return Triple(startOffset, endOffset, handlesCrossed)
+    if (startOffset == -1 || endOffset == -1) return null
+    return TextRange(startOffset, endOffset)
 }
 
 /**
  * This method returns the adjusted start and end offset of the selection according to [adjustment].
  *
  * @param textLayoutResult a result of the text layout.
- * @param startOffset start offset to be snapped to a word.
- * @param endOffset end offset to be snapped to a word.
- * @param handlesCrossed true if the selection handles are crossed
+ * @param textRange the initial selected text range which needs to be adjusted.
  * @param adjustment how to adjust selection
  *
- * @return the adjusted word-based start and end offset of the selection.
+ * @return the adjusted text selection range.
  */
 internal fun adjustSelection(
     textLayoutResult: TextLayoutResult,
-    startOffset: Int,
-    endOffset: Int,
-    handlesCrossed: Boolean,
+    textRange: TextRange,
+    isStartHandle: Boolean,
+    previousHandlesCrossed: Boolean,
     adjustment: SelectionAdjustment
-): Pair<Int, Int> {
-    val boundaryFun = when (adjustment) {
-        SelectionAdjustment.NONE -> return Pair(startOffset, endOffset)
-        SelectionAdjustment.WORD -> textLayoutResult::getWordBoundary
-        SelectionAdjustment.PARAGRAPH ->
-            textLayoutResult.layoutInput.text.text::getParagraphBoundary
+): TextRange {
+    if (adjustment == SelectionAdjustment.NONE) {
+        return textRange
+    }
+
+    if (adjustment == SelectionAdjustment.CHARACTER) {
+        return if (!textRange.collapsed) {
+            textRange
+        } else {
+            ensureAtLeastOneChar(
+                offset = textRange.start,
+                lastOffset = textLayoutResult.layoutInput.text.lastIndex,
+                isStartHandle = isStartHandle,
+                previousHandlesCrossed = previousHandlesCrossed
+            )
+        }
+    }
+
+    val boundaryFun = if (adjustment == SelectionAdjustment.WORD) {
+        textLayoutResult::getWordBoundary
+    } else {
+        textLayoutResult.layoutInput.text.text::getParagraphBoundary
     }
 
     val maxOffset = textLayoutResult.layoutInput.text.text.length - 1
-    val startBoundary = boundaryFun(startOffset.coerceIn(0, maxOffset))
-    val endBoundary = boundaryFun(endOffset.coerceIn(0, maxOffset))
+    val startBoundary = boundaryFun(textRange.start.coerceIn(0, maxOffset))
+    val endBoundary = boundaryFun(textRange.end.coerceIn(0, maxOffset))
 
     // If handles are not crossed, start should be snapped to the start of the word containing the
     // start offset, and end should be snapped to the end of the word containing the end offset.
     // If handles are crossed, start should be snapped to the end of the word containing the start
     // offset, and end should be snapped to the start of the word containing the end offset.
-    val start = if (handlesCrossed) startBoundary.end else startBoundary.start
-    val end = if (handlesCrossed) endBoundary.start else endBoundary.end
+    val start = if (textRange.reversed) startBoundary.end else startBoundary.start
+    val end = if (textRange.reversed) endBoundary.start else endBoundary.end
 
-    return Pair(start, end)
+    return TextRange(start, end)
 }
 
 /**
@@ -181,7 +147,9 @@
  * this case start and offset equals to each other.
  * @param lastOffset last offset of the text. It's actually the length of the text.
  * @param isStartHandle true if the start handle is being dragged
- * @param handlesCrossed true if the selection handles are crossed
+ * @param previousHandlesCrossed true if the selection handles are crossed in the previous
+ * selection. This function will try to maintain the handle cross state. This can help make
+ * selection stable.
  *
  * @return the adjusted [TextRange].
  */
@@ -189,7 +157,7 @@
     offset: Int,
     lastOffset: Int,
     isStartHandle: Boolean,
-    handlesCrossed: Boolean
+    previousHandlesCrossed: Boolean
 ): TextRange {
     // When lastOffset is 0, it can only return an empty TextRange.
     // When previousSelection is null, it won't start a selection and return an empty TextRange.
@@ -216,7 +184,7 @@
     // In other cases, this function will try to maintain the current cross handle states.
     // Only in this way the selection can be stable.
     return if (isStartHandle) {
-        if (!handlesCrossed) {
+        if (!previousHandlesCrossed) {
             // Handle is NOT crossed, and the start handle is dragged.
             TextRange(offset - 1, offset)
         } else {
@@ -224,7 +192,7 @@
             TextRange(offset + 1, offset)
         }
     } else {
-        if (!handlesCrossed) {
+        if (!previousHandlesCrossed) {
             // Handle is NOT crossed, and the end handle is dragged.
             TextRange(offset, offset + 1)
         } else {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
index 71ed883..cbacbb1 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
@@ -18,34 +18,36 @@
 
 import androidx.compose.animation.animateColorAsState
 import androidx.compose.animation.core.TweenSpec
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.detectTapAndPress
 import androidx.compose.foundation.gestures.drag
 import androidx.compose.foundation.gestures.forEachGesture
+import androidx.compose.foundation.interaction.DragInteraction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocal
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
 import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.foundation.interaction.DragInteraction
-import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.gestures.detectTapAndPress
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
-import androidx.compose.ui.input.pointer.pointerMoveFilter
 import androidx.compose.ui.input.pointer.consumePositionChange
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.input.pointer.pointerMoveFilter
 import androidx.compose.ui.input.pointer.positionChange
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.MeasurePolicy
@@ -61,15 +63,15 @@
 import kotlin.math.sign
 
 /**
- * Ambient used to pass [ScrollbarStyle] down the tree.
+ * [CompositionLocal] used to pass [ScrollbarStyle] down the tree.
  * This value is typically set in some "Theme" composable function
  * (DesktopTheme, MaterialTheme)
  */
-val ScrollbarStyleAmbient = staticCompositionLocalOf { defaultScrollbarStyle() }
+val LocalScrollbarStyle = staticCompositionLocalOf { defaultScrollbarStyle() }
 
 /**
  * Defines visual style of scrollbars (thickness, shapes, colors, etc).
- * Can be passed as a parameter of scrollbar through [ScrollbarStyleAmbient]
+ * Can be passed as a parameter of scrollbar through [LocalScrollbarStyle]
  */
 @Immutable
 data class ScrollbarStyle(
@@ -103,7 +105,7 @@
  *     val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
- *         ScrollableColumn(state = state) {
+ *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
  *
@@ -123,7 +125,7 @@
 fun VerticalScrollbar(
     adapter: ScrollbarAdapter,
     modifier: Modifier = Modifier,
-    style: ScrollbarStyle = ScrollbarStyleAmbient.current,
+    style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) = Scrollbar(
     adapter,
@@ -135,7 +137,7 @@
 
 /**
  * Horizontal scrollbar that can be attached to some scrollable
- * component (ScrollableRow, LazyRow) and share common state with it.
+ * component (Modifier.verticalScroll(), LazyRow) and share common state with it.
  *
  * Can be placed independently.
  *
@@ -143,7 +145,7 @@
  *     val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
- *         ScrollableRow(state = state) {
+ *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
  *
@@ -163,7 +165,7 @@
 fun HorizontalScrollbar(
     adapter: ScrollbarAdapter,
     modifier: Modifier = Modifier,
-    style: ScrollbarStyle = ScrollbarStyleAmbient.current,
+    style: ScrollbarStyle = LocalScrollbarStyle.current,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) = Scrollbar(
     adapter,
@@ -194,7 +196,13 @@
     }
 
     var containerSize by remember { mutableStateOf(0) }
-    var isHover by remember { mutableStateOf(false) }
+    var isHovered by remember { mutableStateOf(false) }
+
+    val isHighlighted by remember {
+        derivedStateOf {
+            isHovered || dragInteraction.value is DragInteraction.Start
+        }
+    }
 
     val minimalHeight = style.minimalHeight.toPx()
     val sliderAdapter = remember(adapter, containerSize, minimalHeight) {
@@ -213,7 +221,7 @@
     }
 
     val color by animateColorAsState(
-        if (isHover) style.hoverColor else style.unhoverColor,
+        if (isHighlighted) style.hoverColor else style.unhoverColor,
         animationSpec = TweenSpec(durationMillis = style.hoverDurationMillis)
     )
 
@@ -231,8 +239,8 @@
         },
         modifier
             .pointerMoveFilter(
-                onExit = { isHover = false; true },
-                onEnter = { isHover = true; true }
+                onExit = { isHovered = false; false },
+                onEnter = { isHovered = true; false }
             )
             .scrollOnPressOutsideSlider(isVertical, sliderAdapter, adapter, containerSize),
         measurePolicy
@@ -243,24 +251,29 @@
     interactionSource: MutableInteractionSource,
     draggedInteraction: MutableState<DragInteraction.Start?>,
     onDelta: (Offset) -> Unit
-): Modifier = pointerInput(interactionSource, draggedInteraction, onDelta) {
-    forEachGesture {
-        awaitPointerEventScope {
-            val down = awaitFirstDown(requireUnconsumed = false)
-            val interaction = DragInteraction.Start()
-            interactionSource.tryEmit(interaction)
-            draggedInteraction.value = interaction
-            val isSuccess = drag(down.id) { change ->
-                onDelta.invoke(change.positionChange())
-                change.consumePositionChange()
+): Modifier = composed {
+    val currentInteractionSource by rememberUpdatedState(interactionSource)
+    val currentDraggedInteraction by rememberUpdatedState(draggedInteraction)
+    val currentOnDelta by rememberUpdatedState(onDelta)
+    pointerInput(Unit) {
+        forEachGesture {
+            awaitPointerEventScope {
+                val down = awaitFirstDown(requireUnconsumed = false)
+                val interaction = DragInteraction.Start()
+                currentInteractionSource.tryEmit(interaction)
+                currentDraggedInteraction.value = interaction
+                val isSuccess = drag(down.id) { change ->
+                    currentOnDelta.invoke(change.positionChange())
+                    change.consumePositionChange()
+                }
+                val finishInteraction = if (isSuccess) {
+                    DragInteraction.Stop(interaction)
+                } else {
+                    DragInteraction.Cancel(interaction)
+                }
+                currentInteractionSource.tryEmit(finishInteraction)
+                currentDraggedInteraction.value = null
             }
-            val finishInteraction = if (isSuccess) {
-                DragInteraction.Stop(interaction)
-            } else {
-                DragInteraction.Cancel(interaction)
-            }
-            interactionSource.tryEmit(finishInteraction)
-            draggedInteraction.value = null
         }
     }
 }
@@ -338,7 +351,7 @@
 }
 
 /**
- * ScrollbarAdapter for ScrollableColumn and ScrollableRow
+ * ScrollbarAdapter for Modifier.verticalScroll and Modifier.horizontalScroll
  *
  * [scrollState] is instance of [ScrollState] which is used by scrollable component
  *
@@ -346,7 +359,7 @@
  *     val state = rememberScrollState(0f)
  *
  *     Box(Modifier.fillMaxSize()) {
- *         ScrollableColumn(state = state) {
+ *         Box(modifier = Modifier.verticalScroll(state)) {
  *             ...
  *         }
  *
@@ -483,7 +496,12 @@
             .coerceAtLeast(minHeight)
             .coerceAtMost(containerSize.toFloat())
 
-    private val scrollScale get() = (containerSize - size) / (contentSize - containerSize)
+    private val scrollScale: Float
+        get() {
+            val extraScrollbarSpace = containerSize - size
+            val extraContentSpace = contentSize - containerSize
+            return if (extraContentSpace == 0f) 1f else extraScrollbarSpace / extraContentSpace
+        }
 
     var position: Float
         get() = scrollScale * adapter.scrollOffset
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
index 1d59a9c..60027ce 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
@@ -20,12 +20,12 @@
 
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
-import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.input.mouse.MouseScrollOrientation
+import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.input.mouse.mouseScrollFilter
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.DesktopPlatform
-import androidx.compose.ui.platform.DesktopPlatformAmbient
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalDesktopPlatform
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.dp
 import kotlin.math.sqrt
@@ -39,7 +39,7 @@
     onScroll: (Float) -> Unit
 ): Modifier = composed {
     val density = LocalDensity.current
-    val desktopPlatform = DesktopPlatformAmbient.current
+    val desktopPlatform = LocalDesktopPlatform.current
     val config = PlatformScrollConfig(density, desktopPlatform)
 
     mouseScrollFilter { event, bounds ->
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/Lazy.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/Lazy.desktop.kt
index 8f78d81..20e25b8 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/Lazy.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/lazy/Lazy.desktop.kt
@@ -16,6 +16,20 @@
 
 package androidx.compose.foundation.lazy
 
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.State
+import androidx.compose.ui.layout.SubcomposeLayoutState
+
 internal actual fun getDefaultLazyKeyFor(index: Int): Any = DefaultLazyKey(index)
 
 private data class DefaultLazyKey(private val index: Int)
+
+@Composable
+internal actual fun LazyListPrefetcher(
+    lazyListState: LazyListState,
+    stateOfItemsProvider: State<LazyListItemsProvider>,
+    itemContentFactory: LazyListItemContentFactory,
+    subcomposeLayoutState: SubcomposeLayoutState
+) {
+    // there is no prefetch implementation on desktop yet
+}
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index d7d6148..4b1be7e 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -38,7 +38,7 @@
 import androidx.compose.ui.input.mouse.MouseScrollOrientation
 import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.platform.DesktopPlatform
-import androidx.compose.ui.platform.DesktopPlatformAmbient
+import androidx.compose.ui.platform.LocalDesktopPlatform
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.GestureScope
@@ -56,7 +56,6 @@
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.runBlocking
-import org.jetbrains.skija.Surface
 import org.junit.Assert.assertEquals
 import org.junit.Ignore
 import org.junit.Rule
@@ -68,10 +67,6 @@
     @get:Rule
     val rule = createComposeRule()
 
-    // don't inline, surface controls canvas life time
-    private val surface = Surface.makeRasterN32Premul(100, 100)
-    private val canvas = surface.canvas
-
     @Test
     fun `drag slider to the middle`() {
         runBlocking(Dispatchers.Main) {
@@ -89,6 +84,21 @@
     }
 
     @Test
+    fun `drag slider when it is hidden`() {
+        runBlocking(Dispatchers.Main) {
+            rule.setContent {
+                TestBox(size = 100.dp, childSize = 20.dp, childCount = 1, scrollbarWidth = 10.dp)
+            }
+            rule.awaitIdle()
+            rule.onNodeWithTag("scrollbar").performGesture {
+                instantSwipe(start = Offset(0f, 25f), end = Offset(0f, 50f))
+            }
+            rule.awaitIdle()
+            rule.onNodeWithTag("box0").assertTopPositionInRootIsEqualTo(0.dp)
+        }
+    }
+
+    @Test
     fun `drag slider to the edges`() {
         runBlocking(Dispatchers.Main) {
             rule.setContent {
@@ -126,6 +136,22 @@
         }
     }
 
+    // TODO(demin): write a test when we support DesktopComposeTestRule.mainClock:
+    //  see https://github.com/JetBrains/compose-jb/issues/637
+//    fun `move mouse to the slider and drag it`() {
+//        ...
+//        rule.performMouseMove(0, 25)
+//        rule.mainClock.advanceTimeByFrame()
+//        down(Offset(0f, 25f))
+//        rule.mainClock.advanceTimeByFrame()
+//        moveTo(Offset(0f, 30f))
+//        rule.mainClock.advanceTimeByFrame()
+//        moveTo(Offset(0f, 50f))
+//        rule.mainClock.advanceTimeByFrame()
+//        up()
+//        ...
+//    }
+
     // TODO(demin): enable after we resolve b/171889442
     @Ignore("Enable after we resolve b/171889442")
     @Test
@@ -365,6 +391,10 @@
         )
     }
 
+    private fun ComposeTestRule.performMouseMove(x: Int, y: Int) {
+        (this as DesktopComposeTestRule).window.onMouseMoved(x, y)
+    }
+
     @Composable
     private fun TestBox(
         size: Dp,
@@ -455,7 +485,7 @@
 
     @Composable
     private fun withTestEnvironment(content: @Composable () -> Unit) = CompositionLocalProvider(
-        ScrollbarStyleAmbient provides ScrollbarStyle(
+        LocalScrollbarStyle provides ScrollbarStyle(
             minimalHeight = 16.dp,
             thickness = 8.dp,
             shape = RectangleShape,
@@ -463,7 +493,7 @@
             unhoverColor = Color.Black,
             hoverColor = Color.Red
         ),
-        DesktopPlatformAmbient provides DesktopPlatform.MacOS,
+        LocalDesktopPlatform provides DesktopPlatform.MacOS,
         content = content
     )
 }
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
index 27ba0c3..48f0ef9 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/gestures/SuspendingGestureTestUtil.kt
@@ -19,13 +19,14 @@
 import androidx.compose.runtime.Applier
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composer
-import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.Recomposer
 import androidx.compose.runtime.ControlledComposition
-import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.runtime.MonotonicFrameClock
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.currentComposer
 import androidx.compose.runtime.withRunningRecomposer
+import androidx.compose.testutils.TestViewConfiguration
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.input.pointer.ConsumedData
@@ -39,7 +40,6 @@
 import androidx.compose.ui.materialize
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalViewConfiguration
-import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntSize
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -346,18 +346,4 @@
         }
         override fun clear() {}
     }
-
-    private class TestViewConfiguration : ViewConfiguration {
-        override val longPressTimeoutMillis: Long
-            get() = 500
-
-        override val doubleTapTimeoutMillis: Long
-            get() = 300
-
-        override val doubleTapMinTimeMillis: Long
-            get() = 40
-
-        override val touchSlop: Float
-            get() = 18f
-    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
index 8572166..7af3454 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextLayoutHelperTest.kt
@@ -14,8 +14,14 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.text
+package androidx.compose.foundation.text
 
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.PlaceholderVerticalAlign
+import androidx.compose.ui.text.TextLayoutInput
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.Constraints
@@ -23,6 +29,7 @@
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.em
+import androidx.compose.ui.unit.sp
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.mock
 import org.junit.Before
@@ -60,12 +67,13 @@
     }
 
     @Test
-    fun testCanResue_same() {
+    fun testCanReuse_same() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -78,12 +86,13 @@
     }
 
     @Test
-    fun testCanResue_different_text() {
+    fun testCanReuse_different_text() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, Android").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -96,12 +105,13 @@
     }
 
     @Test
-    fun testCanResue_different_style() {
+    fun testCanReuse_different_style() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(fontSize = 1.5.em),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -114,12 +124,13 @@
     }
 
     @Test
-    fun testCanResue_different_maxLines() {
+    fun testCanReuse_different_maxLines() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 2,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -132,12 +143,13 @@
     }
 
     @Test
-    fun testCanResue_different_softWrap() {
+    fun testCanReuse_different_softWrap() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = false,
                 overflow = TextOverflow.Ellipsis,
@@ -150,12 +162,13 @@
     }
 
     @Test
-    fun testCanResue_different_overflow() {
+    fun testCanReuse_different_overflow() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Clip,
@@ -168,12 +181,13 @@
     }
 
     @Test
-    fun testCanResue_different_density() {
+    fun testCanReuse_different_density() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -186,12 +200,13 @@
     }
 
     @Test
-    fun testCanResue_different_layoutDirection() {
+    fun testCanReuse_different_layoutDirection() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -204,12 +219,13 @@
     }
 
     @Test
-    fun testCanResue_different_resourceLoader() {
+    fun testCanReuse_different_resourceLoader() {
         val constraints = Constraints.fixedWidth(100)
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
@@ -222,11 +238,36 @@
     }
 
     @Test
-    fun testCanResue_different_constraints() {
+    fun testCanReuse_different_constraints() {
         assertThat(
             referenceResult.canReuse(
                 text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
                 style = TextStyle(),
+                placeholders = emptyList(),
+                maxLines = 1,
+                softWrap = true,
+                overflow = TextOverflow.Ellipsis,
+                density = Density(1.0f),
+                layoutDirection = LayoutDirection.Ltr,
+                resourceLoader = resourceLoader,
+                constraints = Constraints.fixedWidth(200)
+            )
+        ).isFalse()
+    }
+
+    @Test
+    fun testCanReuse_different_placeholders() {
+        assertThat(
+            referenceResult.canReuse(
+                text = AnnotatedString.Builder("Hello, World").toAnnotatedString(),
+                style = TextStyle(),
+                placeholders = listOf(
+                    AnnotatedString.Range(
+                        item = Placeholder(10.sp, 20.sp, PlaceholderVerticalAlign.AboveBaseline),
+                        start = 0,
+                        end = 5
+                    )
+                ),
                 maxLines = 1,
                 softWrap = true,
                 overflow = TextOverflow.Ellipsis,
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
index 5038dd6..0444795 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextSelectionLongPressDragTest.kt
@@ -64,7 +64,7 @@
     fun setup() {
         selectionRegistrar.subscribe(selectable)
 
-        layoutCoordinates = mock<LayoutCoordinates> {
+        layoutCoordinates = mock {
             on { isAttached } doReturn true
         }
 
@@ -114,7 +114,7 @@
                 layoutCoordinates = layoutCoordinates,
                 startPosition = beginPosition2,
                 endPosition = beginPosition2 + dragDistance2,
-                adjustment = SelectionAdjustment.NONE
+                adjustment = SelectionAdjustment.CHARACTER
             )
     }
 
@@ -131,7 +131,7 @@
                 layoutCoordinates = layoutCoordinates,
                 startPosition = beginPosition,
                 endPosition = beginPosition + dragDistance,
-                adjustment = SelectionAdjustment.NONE
+                adjustment = SelectionAdjustment.CHARACTER
             )
     }
 
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt
deleted file mode 100644
index cbc1870..0000000
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/MockSelectable.kt
+++ /dev/null
@@ -1,70 +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.foundation.text.selection
-
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.text.AnnotatedString
-
-internal class MockSelectable(
-    var getSelectionValue: Selection? = null,
-    var getHandlePositionValue: Offset = Offset.Zero,
-    var getLayoutCoordinatesValue: LayoutCoordinates? = null,
-    var getTextValue: AnnotatedString = AnnotatedString(""),
-    var getBoundingBoxValue: Rect = Rect.Zero
-) : Selectable {
-    override var selectableId = 0L
-    val getSelectionValues = mutableListOf<GetSelectionParameters>()
-    override fun getSelection(
-        startPosition: Offset,
-        endPosition: Offset,
-        containerLayoutCoordinates: LayoutCoordinates,
-        adjustment: SelectionAdjustment,
-        ensureAtLeastOneChar: Boolean,
-        previousSelection: Selection?,
-        isStartHandle: Boolean
-    ): Selection? {
-        getSelectionValues += GetSelectionParameters(
-            startPosition,
-            endPosition,
-            containerLayoutCoordinates,
-            adjustment,
-            previousSelection,
-            isStartHandle
-        )
-        return getSelectionValue
-    }
-
-    override fun getHandlePosition(selection: Selection, isStartHandle: Boolean): Offset =
-        getHandlePositionValue
-
-    override fun getLayoutCoordinates(): LayoutCoordinates? = getLayoutCoordinatesValue
-
-    override fun getText(): AnnotatedString = getTextValue
-
-    override fun getBoundingBox(offset: Int): Rect = getBoundingBoxValue
-
-    data class GetSelectionParameters(
-        val startPosition: Offset,
-        val endPosition: Offset,
-        val containerLayoutCoordinates: LayoutCoordinates,
-        val adjustment: SelectionAdjustment,
-        val previousSelection: Selection?,
-        val isStartHandle: Boolean
-    )
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
index d37f064..9c480e54 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerDragTest.kt
@@ -215,7 +215,6 @@
         endPosition: Offset,
         containerLayoutCoordinates: LayoutCoordinates,
         adjustment: SelectionAdjustment,
-        ensureAtLeastOneChar: Boolean,
         previousSelection: Selection?,
         isStartHandle: Boolean
     ): Selection? {
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
index 48ec57a..fa5092d 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/selection/SelectionManagerTest.kt
@@ -167,8 +167,7 @@
                 endPosition = endCoordinates,
                 containerLayoutCoordinates = selectionManager.requireContainerCoordinates(),
                 adjustment = SelectionAdjustment.NONE,
-                previousSelection = fakeSelection,
-                ensureAtLeastOneChar = true
+                previousSelection = fakeSelection
             )
         verify(
             hapticFeedback,
diff --git a/compose/integration-tests/demos/build.gradle b/compose/integration-tests/demos/build.gradle
index 6c0311c..c80024b 100644
--- a/compose/integration-tests/demos/build.gradle
+++ b/compose/integration-tests/demos/build.gradle
@@ -15,7 +15,6 @@
     implementation(project(":compose:foundation:foundation-layout:integration-tests:foundation-layout-demos"))
     implementation(project(":compose:foundation:foundation:integration-tests:foundation-demos"))
     implementation(project(":compose:material:material:integration-tests:material-demos"))
-    implementation(project(":compose:material:material:integration-tests:material-catalog"))
     implementation(project(":navigation:navigation-compose:integration-tests:navigation-demos"))
     implementation(project(":compose:ui:ui:integration-tests:ui-demos"))
 
diff --git a/compose/integration-tests/demos/src/androidTest/java/androidx/compose/integration/demos/test/DemoTest.kt b/compose/integration-tests/demos/src/androidTest/java/androidx/compose/integration/demos/test/DemoTest.kt
index 2cb0de9..e90c1cf 100644
--- a/compose/integration-tests/demos/src/androidTest/java/androidx/compose/integration/demos/test/DemoTest.kt
+++ b/compose/integration-tests/demos/src/androidTest/java/androidx/compose/integration/demos/test/DemoTest.kt
@@ -69,12 +69,16 @@
             .filterIsInstance<ComposableDemo>()
             .sortedBy { it.title }
             .first()
-        // Click on the first demo
+
+        // Click on the first demo.
         val demoTitle = testDemo.title
         rule.onNodeWithText(demoTitle).performScrollTo().performClick()
-
         assertAppBarHasTitle(demoTitle)
+
+        // Navigate back to root screen.
+        Espresso.closeSoftKeyboard()
         Espresso.pressBack()
+        rule.waitForIdle()
         assertIsOnRootScreen()
     }
 
@@ -173,13 +177,17 @@
             fastForwardClock()
         }
 
+        rule.waitForIdle()
         while (rule.onAllNodes(isDialog()).isNotEmpty()) {
-            rule.waitForIdle()
             Espresso.pressBack()
+            rule.waitForIdle()
         }
 
+        clearFocusFromDemo()
         rule.waitForIdle()
+
         Espresso.pressBack()
+        rule.waitForIdle()
 
         if (fastForwardClock) {
             // Pump press back
@@ -208,6 +216,23 @@
     private fun SemanticsNodeInteractionCollection.isNotEmpty(): Boolean {
         return fetchSemanticsNodes(atLeastOneRootRequired = false).isNotEmpty()
     }
+
+    private fun clearFocusFromDemo() {
+        with(rule.activity) {
+            if (hostView.hasFocus()) {
+                if (hostView.isFocused) {
+                    // One of the Compose components has focus.
+                    focusManager.clearFocus(forcedClear = true)
+                } else {
+                    // A child view has focus. (View interop scenario).
+                    // We could also use hostViewGroup.focusedChild?.clearFocus(), but the
+                    // interop views might end up being focused if one of them is marked as
+                    // focusedByDefault. So we clear focus by requesting focus on the owner.
+                    rule.runOnUiThread { hostView.requestFocus() }
+                }
+            }
+        }
+    }
 }
 
 private val AllButIgnoredDemos =
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
index d858192..8f59333 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoActivity.kt
@@ -21,37 +21,43 @@
 import android.content.Intent
 import android.content.SharedPreferences
 import android.os.Bundle
+import android.view.View
 import android.view.Window
 import androidx.activity.ComponentActivity
 import androidx.activity.OnBackPressedCallback
 import androidx.activity.OnBackPressedDispatcher
-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.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
-import androidx.preference.PreferenceManager
 import androidx.compose.integration.demos.common.ActivityDemo
 import androidx.compose.integration.demos.common.Demo
 import androidx.compose.integration.demos.common.DemoCategory
-import androidx.compose.ui.graphics.toArgb
 import androidx.compose.material.Colors
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.darkColors
 import androidx.compose.material.lightColors
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.SideEffect
+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.listSaver
 import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalView
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.preference.PreferenceManager
 
 /**
  * Main [Activity] containing all Compose related demos.
  */
 class DemoActivity : ComponentActivity() {
+    lateinit var hostView: View
+    lateinit var focusManager: FocusManager
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -59,6 +65,8 @@
         ComposeView(this).also {
             setContentView(it)
         }.setContent {
+            hostView = LocalView.current
+            focusManager = LocalFocusManager.current
             val activityStarter = fun(demo: ActivityDemo<*>) {
                 startActivity(Intent(this, demo.activityClass.java))
             }
diff --git a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
index 98cd9aa..d0f7790 100644
--- a/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
+++ b/compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/Demos.kt
@@ -22,7 +22,6 @@
 import androidx.compose.foundation.layout.demos.LayoutDemos
 import androidx.compose.integration.demos.common.DemoCategory
 import androidx.compose.foundation.demos.text.TextDemos
-import androidx.compose.material.catalog.MaterialCatalog
 import androidx.compose.material.demos.MaterialDemos
 import androidx.compose.ui.demos.CoreDemos
 import androidx.navigation.compose.demos.NavigationDemos
@@ -39,7 +38,6 @@
         CoreDemos,
         LayoutDemos,
         MaterialDemos,
-        MaterialCatalog,
         NavigationDemos,
         TextDemos
     )
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
index 6be0f0f..ab8da92 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/Interoperability.kt
@@ -19,16 +19,16 @@
 @file:Suppress(
     "unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "UNUSED_ANONYMOUS_PARAMETER",
     "RedundantSuspendModifier", "CascadeIf", "ClassName", "RemoveExplicitTypeArguments",
-    "ControlFlowWithEmptyBody", "PropertyName"
+    "ControlFlowWithEmptyBody", "PropertyName", "CanBeParameter"
 )
 
 package androidx.compose.integration.docs.interoperability
 
+import android.app.Activity
 import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
 import android.content.IntentFilter
-import android.content.res.Configuration.ORIENTATION_PORTRAIT
 import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Bundle
@@ -45,20 +45,17 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.integration.docs.databinding.ExampleLayoutBinding
 import androidx.compose.material.Button
 import androidx.compose.material.ButtonDefaults
 import androidx.compose.material.FloatingActionButton
-import androidx.compose.material.Icon
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
@@ -66,22 +63,12 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
-import androidx.compose.runtime.saveable.listSaver
-import androidx.compose.runtime.saveable.mapSaver
-import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.asImageBitmap
 import androidx.compose.ui.platform.AbstractComposeView
 import androidx.compose.ui.platform.ComposeView
-import androidx.compose.ui.platform.LocalConfiguration
 import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.colorResource
-import androidx.compose.ui.res.dimensionResource
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.compose.ui.viewinterop.AndroidViewBinding
@@ -232,21 +219,7 @@
     }
 }
 
-@Composable
-private fun RowScope.InteropSnippet7() {
-    Text(
-        text = stringResource(R.string.ok),
-        modifier = Modifier.padding(dimensionResource(R.dimen.padding_small))
-    )
-
-    Icon(
-        painter = painterResource(R.drawable.ic_plane),
-        contentDescription = stringResource(R.string.plane_description),
-        tint = colorResource(R.color.Blue700)
-    )
-}
-
-private object InteropSnippet8 {
+private object InteropSnippet7 {
     @Composable
     fun rememberCustomView(): CustomView {
         val context = LocalContext.current
@@ -255,7 +228,7 @@
 }
 
 /* ktlint-disable indent */
-private object InteropSnippet9 {
+private object InteropSnippet8 {
     class ExampleActivity : AppCompatActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
@@ -278,165 +251,17 @@
     }
 }
 
-/* ktlint-enable indent */
-private object InteropSnippet10 {
-    class ExampleViewModel : ViewModel() { /*...*/ }
+private object InteropSnippet9 {
+    // import com.google.android.material.composethemeadapter.MdcTheme
 
-    @Composable
-    fun MyExample() {
-        val viewModel: ExampleViewModel = viewModel()
-
-        // use viewModel here
-    }
-}
-
-private object InteropSnippet11 {
-    @Composable
-    fun MyExample() {
-        // Returns the same instance as long as the activity is alive,
-        // just as if you grabbed the instance from an Activity or Fragment
-        val viewModel: ExampleViewModel = viewModel()
-    }
-
-    @Composable
-    fun MyExample2() {
-        val viewModel: ExampleViewModel = viewModel() // Same instance as in MyExample
-    }
-}
-
-private object InteropSnippet12 {
-    @Composable
-    fun MyExample() {
-        val viewModel: ExampleViewModel = viewModel()
-        val dataExample = viewModel.exampleLiveData.observeAsState()
-
-        // Because the state is read here,
-        // MyExample recomposes whenever dataExample changes.
-        dataExample.value?.let {
-            ShowData(dataExample)
-        }
-    }
-}
-
-private object InteropSnippet13 {
-    @Composable
-    fun fetchImage(url: String): ImageBitmap? {
-        // Holds our current image, and will be updated by the onCommit lambda below
-        var image by remember(url) { mutableStateOf<ImageBitmap?>(null) }
-
-        DisposableEffect(url) {
-            // This onCommit lambda will be invoked every time url changes
-
-            val listener = object : ExampleImageLoader.Listener() {
-                override fun onSuccess(bitmap: Bitmap) {
-                    // When the image successfully loads, update our image state
-                    image = bitmap.asImageBitmap()
-                }
-            }
-
-            // Now execute the image loader
-            val imageLoader = ExampleImageLoader.get()
-            imageLoader.load(url).into(listener)
-
-            onDispose {
-                // If we leave composition, cancel any pending requests
-                imageLoader.cancel(listener)
-            }
-        }
-
-        // Return the state-backed image property. Any callers of this function
-        // will be recomposed once the image finishes loading
-        return image
-    }
-}
-
-private object InteropSnippet14 {
-    /** Example suspending loadImage function */
-    suspend fun loadImage(url: String): ImageBitmap = TODO()
-
-    @Composable
-    fun fetchImage(url: String): ImageBitmap? {
-        // This holds our current image, and will be updated by the
-        // launchInComposition lambda below
-        var image by remember(url) { mutableStateOf<ImageBitmap?>(null) }
-
-        // LaunchedEffect will automatically launch a coroutine to execute
-        // the given block. If the `url` changes, any previously launched coroutine
-        // will be cancelled, and a new coroutine launched.
-        LaunchedEffect(url) {
-            image = loadImage(url)
-        }
-
-        // Return the state-backed image property
-        return image
-    }
-}
-
-private object InteropSnippet15 {
-    @Composable
-    fun MyExample() {
-        var selectedId by rememberSaveable { mutableStateOf<String?>(null) }
-        /*...*/
-    }
-}
-
-private object InteropSnippet16 {
-    // API from kotlin-android-extensions
-    /*
-    @Parcelize
-    data class City(name: String, country: String): Parcelable
-
-    @Composable
-    fun MyExample() {
-        var selectedCity = rememberSaveable { mutableStateOf(City("Madrid", "Spain")) }
-    }
-     */
-}
-
-private object InteropSnippet17 {
-    data class City(val name: String, val country: String)
-
-    val CitySaver = run {
-        val nameKey = "Name"
-        val countryKey = "Country"
-        mapSaver(
-            save = { mapOf(nameKey to it.name, nameKey to it.country) },
-            restore = { City(it[nameKey] as String, it[countryKey] as String) }
-        )
-    }
-
-    @Composable
-    fun MyExample() {
-        var selectedCity = rememberSaveable(stateSaver = CitySaver) {
-            mutableStateOf(City("Madrid", "Spain"))
-        }
-    }
-}
-
-private object InteropSnippet18 {
-    data class City(val name: String, val country: String)
-
-    val CitySaver = listSaver<City, Any>(
-        save = { listOf(it.name, it.country) },
-        restore = { City(it[0] as String, it[1] as String) }
-    )
-
-    @Composable
-    fun MyExample() {
-        var selectedCity = rememberSaveable(stateSaver = CitySaver) {
-            mutableStateOf(City("Madrid", "Spain"))
-        }
-        /*...*/
-    }
-}
-
-private object InteropSnippet19 {
     class ExampleActivity : AppCompatActivity() {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
 
             setContent {
-                // We use MdcTheme instead of MaterialTheme {}
+                // Use MdcTheme instead of MaterialTheme
+                // Colors, typography, and shape have been read from the
+                // View-based theme used in this Activity
                 MdcTheme {
                     ExampleComposable(/*...*/)
                 }
@@ -445,330 +270,295 @@
     }
 }
 
-private object BetaSnippets {
-    private object InteropSnippet1 {
-        @Composable
-        fun rememberCustomView(): CustomView {
-            val context = LocalContext.current
-            return remember { CustomView(context).apply { /*...*/ } }
+private object InteropSnippet10 {
+    class ExampleActivity : AppCompatActivity() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+
+            setContent {
+                AppCompatTheme {
+                    // Colors, typography, and shape have been read from the
+                    // View-based theme used in this Activity
+                    ExampleComposable(/*...*/)
+                }
+            }
         }
     }
+}
 
-    private object InteropSnippet2 {
-        class ExampleActivity : AppCompatActivity() {
-            override fun onCreate(savedInstanceState: Bundle?) {
-                super.onCreate(savedInstanceState)
+private object InteropSnippet11 {
+    class ExampleActivity : AppCompatActivity() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
 
-                setContent {
-                    MdcTheme {
-                        // Colors, typography, and shape have been read from the
-                        // View-based theme used in this Activity
-                        ExampleComposable(/*...*/)
+            WindowCompat.setDecorFitsSystemWindows(window, false)
+
+            setContent {
+                MaterialTheme {
+                    ProvideWindowInsets {
+                        MyScreen()
                     }
                 }
             }
         }
     }
 
-    private object InteropSnippet3 {
-        class ExampleActivity : AppCompatActivity() {
-            override fun onCreate(savedInstanceState: Bundle?) {
-                super.onCreate(savedInstanceState)
-
-                setContent {
-                    AppCompatTheme {
-                        // Colors, typography, and shape have been read from the
-                        // View-based theme used in this Activity
-                        ExampleComposable(/*...*/)
-                    }
-                }
-            }
-        }
-    }
-
-    private object InteropSnippet4 {
-        @Composable
-        fun DetailsScreen(/* ... */) {
-            PinkTheme {
-                // other content
-                RelatedSection()
-            }
-        }
-
-        @Composable
-        fun RelatedSection(/* ... */) {
-            BlueTheme {
-                // content
-            }
-        }
-    }
-
-    private object InteropSnippet5 {
-        class ExampleActivity : AppCompatActivity() {
-            override fun onCreate(savedInstanceState: Bundle?) {
-                super.onCreate(savedInstanceState)
-
-                WindowCompat.setDecorFitsSystemWindows(window, false)
-
-                setContent {
-                    MaterialTheme {
-                        ProvideWindowInsets {
-                            MyScreen()
-                        }
-                    }
-                }
-            }
-        }
-
-        @Composable
-        fun MyScreen() {
-            Box {
-                FloatingActionButton(
-                    modifier = Modifier
-                        .align(Alignment.BottomEnd)
-                        .padding(16.dp) // normal 16dp of padding for FABs
-                        .navigationBarsPadding(), // Move it out from under the nav bar
-                    onClick = { }
-                ) {
-                    Icon( /* ... */)
-                }
-            }
-        }
-    }
-
-    private object InteropSnippet6 {
-        @Composable
-        fun MyComposable() {
-            val isPortrait = LocalConfiguration.current.orientation == ORIENTATION_PORTRAIT
-            if (isPortrait) {
-                /* Portrait-displayed content */
-            } else {
-                /* Landscape-displayed content */
-            }
-        }
-    }
-
-    private object InteropSnippet7 {
-        @Composable
-        fun MyComposable() {
-            BoxWithConstraints {
-                if (minWidth < 480.dp) {
-                    /* Show grid with 4 columns */
-                } else if (minWidth < 720.dp) {
-                    /* Show grid with 8 columns */
-                } else {
-                    /* Show grid with 12 columns */
-                }
-            }
-        }
-    }
-
-    private object InteropSnippet8 {
-        class ExampleActivity : AppCompatActivity() {
-            override fun onCreate(savedInstanceState: Bundle?) {
-                super.onCreate(savedInstanceState)
-
-                setContent {
-                    MaterialTheme {
-                        Column {
-                            Greeting("user1")
-                            Greeting("user2")
-                        }
-                    }
-                }
-            }
-        }
-
-        @Composable
-        fun Greeting(userId: String) {
-            val greetingViewModel: GreetingViewModel = viewModel(
-                factory = GreetingViewModelFactory(userId)
-            )
-            val messageUser by greetingViewModel.message.observeAsState("")
-
-            Text(messageUser)
-        }
-
-        class GreetingViewModel(private val userId: String) : ViewModel() {
-            private val _message = MutableLiveData("Hi $userId")
-            val message: LiveData<String> = _message
-        }
-    }
-
-    private object InteropSnippet9 {
-        @Composable
-        fun MyScreen() {
-            NavHost(rememberNavController(), startDestination = "profile/{userId}") {
-                /* ... */
-                composable("profile/{userId}") { backStackEntry ->
-                    Greeting(backStackEntry.arguments?.getString("userId") ?: "")
-                }
-            }
-        }
-
-        @Composable
-        fun Greeting(userId: String) {
-            val greetingViewModel: GreetingViewModel = viewModel(
-                factory = GreetingViewModelFactory(userId)
-            )
-            val messageUser by greetingViewModel.message.observeAsState("")
-
-            Text(messageUser)
-        }
-    }
-
-    private object InteropSnippet10 {
-        @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()
-                    }
-                }
-            }
-
-            // On every successful composition, update the callback with the `enabled` value
-            // to tell `backCallback` whether back events should be intercepted or not
-            SideEffect {
-                backCallback.isEnabled = enabled
-            }
-
-            // 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()
-                }
-            }
-        }
-    }
-
-    private object InteropSnippet11 {
-        class CustomViewGroup @JvmOverloads constructor(
-            context: Context,
-            attrs: AttributeSet? = null,
-            defStyle: Int = 0
-        ) : LinearLayout(context, attrs, defStyle) {
-
-            // Source of truth in the View system as mutableStateOf
-            // to make it thread-safe for Compose
-            private var text by mutableStateOf("")
-
-            private val textView: TextView
-
-            init {
-                orientation = VERTICAL
-
-                textView = TextView(context)
-                val composeView = ComposeView(context).apply {
-                    setContent {
-                        MaterialTheme {
-                            TextField(value = text, onValueChange = { updateState(it) })
-                        }
-                    }
-                }
-
-                addView(textView)
-                addView(composeView)
-            }
-
-            // Update both the source of truth and the TextView
-            private fun updateState(newValue: String) {
-                text = newValue
-                textView.text = newValue
-            }
-        }
-    }
-
-    private object InteropSnippet12 {
-        @Composable
-        fun LoginButton(
-            onClick: () -> Unit,
-            modifier: Modifier = Modifier,
-        ) {
-            Button(
-                colors = ButtonDefaults.buttonColors(
-                    backgroundColor = MaterialTheme.colors.secondary
-                ),
-                onClick = onClick,
-                modifier = modifier,
+    @Composable
+    fun MyScreen() {
+        Box {
+            FloatingActionButton(
+                modifier = Modifier
+                    .align(Alignment.BottomEnd)
+                    .padding(16.dp) // normal 16dp of padding for FABs
+                    .navigationBarsPadding(), // Move it out from under the nav bar
+                onClick = { }
             ) {
-                Text(stringResource(R.string.login))
+                Icon( /* ... */)
             }
         }
+    }
+}
 
-        class LoginViewButton @JvmOverloads constructor(
-            context: Context,
-            attrs: AttributeSet? = null,
-            defStyle: Int = 0
-        ) : AbstractComposeView(context, attrs, defStyle) {
+private object InteropSnippet12 {
+    @Composable
+    fun MyComposable() {
+        BoxWithConstraints {
+            if (minWidth < 480.dp) {
+                /* Show grid with 4 columns */
+            } else if (minWidth < 720.dp) {
+                /* Show grid with 8 columns */
+            } else {
+                /* Show grid with 12 columns */
+            }
+        }
+    }
+}
 
-            var onClick by mutableStateOf<() -> Unit>({})
+private object InteropSnippet13 {
+    class ExampleActivity : AppCompatActivity() {
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
 
-            @Composable
-            override fun Content() {
-                YourAppTheme {
-                    LoginButton(onClick)
+            setContent {
+                MaterialTheme {
+                    Column {
+                        Greeting("user1")
+                        Greeting("user2")
+                    }
                 }
             }
         }
     }
 
-    private object InteropSnippet13 {
-        @Composable
-        fun SystemBroadcastReceiver(
-            systemAction: String,
-            onSystemEvent: (intent: Intent?) -> Unit
-        ) {
-            // Grab the current context in this part of the UI tree
-            val context = LocalContext.current
+    @Composable
+    fun Greeting(userId: String) {
+        val greetingViewModel: GreetingViewModel = viewModel(
+            factory = GreetingViewModelFactory(userId)
+        )
+        val messageUser by greetingViewModel.message.observeAsState("")
 
-            // Safely use the latest onSystemEvent lambda passed to the function
-            val currentOnSystemEvent by rememberUpdatedState(onSystemEvent)
+        Text(messageUser)
+    }
 
-            // If either context or systemAction changes, unregister and register again
-            DisposableEffect(context, systemAction) {
-                val intentFilter = IntentFilter(systemAction)
-                val broadcast = object : BroadcastReceiver() {
-                    override fun onReceive(context: Context?, intent: Intent?) {
-                        onSystemEvent(intent)
+    class GreetingViewModel(private val userId: String) : ViewModel() {
+        private val _message = MutableLiveData("Hi $userId")
+        val message: LiveData<String> = _message
+    }
+}
+
+private object InteropSnippet14 {
+    @Composable
+    fun MyScreen() {
+        NavHost(rememberNavController(), startDestination = "profile/{userId}") {
+            /* ... */
+            composable("profile/{userId}") { backStackEntry ->
+                Greeting(backStackEntry.arguments?.getString("userId") ?: "")
+            }
+        }
+    }
+
+    @Composable
+    fun Greeting(userId: String) {
+        val greetingViewModel: GreetingViewModel = viewModel(
+            factory = GreetingViewModelFactory(userId)
+        )
+        val messageUser by greetingViewModel.message.observeAsState("")
+
+        Text(messageUser)
+    }
+}
+
+private object InteropSnippet15 {
+    @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()
+                }
+            }
+        }
+
+        // On every successful composition, update the callback with the `enabled` value
+        // to tell `backCallback` whether back events should be intercepted or not
+        SideEffect {
+            backCallback.isEnabled = enabled
+        }
+
+        // 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()
+            }
+        }
+    }
+}
+
+private object InteropSnippet16 {
+    class CustomViewGroup @JvmOverloads constructor(
+        context: Context,
+        attrs: AttributeSet? = null,
+        defStyle: Int = 0
+    ) : LinearLayout(context, attrs, defStyle) {
+
+        // Source of truth in the View system as mutableStateOf
+        // to make it thread-safe for Compose
+        private var text by mutableStateOf("")
+
+        private val textView: TextView
+
+        init {
+            orientation = VERTICAL
+
+            textView = TextView(context)
+            val composeView = ComposeView(context).apply {
+                setContent {
+                    MaterialTheme {
+                        TextField(value = text, onValueChange = { updateState(it) })
                     }
                 }
-
-                context.registerReceiver(broadcast, intentFilter)
-
-                // When the effect leaves the Composition, remove the callback
-                onDispose {
-                    context.unregisterReceiver(broadcast)
-                }
             }
+
+            addView(textView)
+            addView(composeView)
         }
 
+        // Update both the source of truth and the TextView
+        private fun updateState(newValue: String) {
+            text = newValue
+            textView.text = newValue
+        }
+    }
+}
+
+private object InteropSnippet17 {
+    @Composable
+    fun CallToActionButton(
+        text: String,
+        onClick: () -> Unit,
+        modifier: Modifier = Modifier,
+    ) {
+        Button(
+            colors = ButtonDefaults.buttonColors(
+                backgroundColor = MaterialTheme.colors.secondary
+            ),
+            onClick = onClick,
+            modifier = modifier,
+        ) {
+            Text(text)
+        }
+    }
+
+    class CallToActionViewButton @JvmOverloads constructor(
+        context: Context,
+        attrs: AttributeSet? = null,
+        defStyle: Int = 0
+    ) : AbstractComposeView(context, attrs, defStyle) {
+
+        var text by mutableStateOf<String>("")
+        var onClick by mutableStateOf<() -> Unit>({})
+
         @Composable
-        fun HomeScreen() {
+        override fun Content() {
+            YourAppTheme {
+                CallToActionButton(text, onClick)
+            }
+        }
+    }
+}
 
-            SystemBroadcastReceiver(Intent.ACTION_BATTERY_CHANGED) { batteryStatus ->
-                val isCharging = /* Get from batteryStatus ... */ true
-                /* Do something if the device is charging */
+private object InteropSnippet18 {
+    class ExampleActivity : Activity() {
+
+        private lateinit var binding: ActivityExampleBinding
+
+        override fun onCreate(savedInstanceState: Bundle?) {
+            super.onCreate(savedInstanceState)
+            binding = ActivityExampleBinding.inflate(layoutInflater)
+            setContentView(binding.root)
+
+            binding.callToAction.apply {
+                text = getString(R.string.something)
+                onClick = { /* Do something */ }
+            }
+        }
+    }
+}
+
+private object InteropSnippet19 {
+    @Composable
+    fun SystemBroadcastReceiver(
+        systemAction: String,
+        onSystemEvent: (intent: Intent?) -> Unit
+    ) {
+        // Grab the current context in this part of the UI tree
+        val context = LocalContext.current
+
+        // Safely use the latest onSystemEvent lambda passed to the function
+        val currentOnSystemEvent by rememberUpdatedState(onSystemEvent)
+
+        // If either context or systemAction changes, unregister and register again
+        DisposableEffect(context, systemAction) {
+            val intentFilter = IntentFilter(systemAction)
+            val broadcast = object : BroadcastReceiver() {
+                override fun onReceive(context: Context?, intent: Intent?) {
+                    onSystemEvent(intent)
+                }
             }
 
-            /* Rest of the HomeScreen */
+            context.registerReceiver(broadcast, intentFilter)
+
+            // When the effect leaves the Composition, remove the callback
+            onDispose {
+                context.unregisterReceiver(broadcast)
+            }
         }
     }
+
+    @Composable
+    fun HomeScreen() {
+
+        SystemBroadcastReceiver(Intent.ACTION_BATTERY_CHANGED) { batteryStatus ->
+            val isCharging = /* Get from batteryStatus ... */ true
+            /* Do something if the device is charging */
+        }
+
+        /* Rest of the HomeScreen */
+    }
 }
 
 /*
@@ -788,7 +578,7 @@
     object string {
         const val ok = 4
         const val plane_description = 5
-        const val login = 6
+        const val something = 6
     }
 
     object dimen {
@@ -897,3 +687,10 @@
         TODO("Not yet implemented")
     }
 }
+private class ActivityExampleBinding {
+    val root: Int = 0
+    lateinit var callToAction: InteropSnippet17.CallToActionViewButton
+    companion object {
+        fun inflate(li: LayoutInflater): ActivityExampleBinding { TODO() }
+    }
+}
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/kotlin/Kotlin.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/kotlin/Kotlin.kt
index 6ef3816..9fdf36e 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/kotlin/Kotlin.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/kotlin/Kotlin.kt
@@ -20,11 +20,22 @@
 
 package androidx.compose.integration.docs.kotlin
 
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.VectorConverter
+import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.ScrollState
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.awaitFirstDown
 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.offset
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
@@ -36,11 +47,18 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.inset
+import androidx.compose.ui.graphics.drawscope.rotate
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
+import kotlin.math.roundToInt
 
 /**
  * This file lets DevRel track changes to snippets present in
@@ -54,7 +72,8 @@
 }
 
 @Composable private fun KotlinSnippet2() {
-    Text(text = "Hello, Android!",
+    Text(
+        text = "Hello, Android!",
         color = Color.Unspecified,
         fontSize = TextUnit.Unspecified,
         letterSpacing = TextUnit.Unspecified,
@@ -63,12 +82,13 @@
 }
 
 @Composable private fun KotlinSnippet3() {
-    Button( // ...
+    Button(
+        // ...
         onClick = {
             // do something
             // do something else
         }
-    ) { /*...*/ }
+    ) { /* ... */ }
 }
 
 @Composable private fun KotlinSnippet4() {
@@ -117,7 +137,7 @@
             // This method accepts a lambda of type DrawScope.() -> Unit
             // therefore in this lambda we can access properties and functions
             // available from DrawScope, such as the `drawRectangle` function.
-            drawRect(/*...*/)
+            drawRect(/* ... */)
         }
     )
 }
@@ -161,6 +181,125 @@
     ) { /* ... */ }
 }
 
+private object KotlinSnippet12 {
+    @Composable
+    fun MessageList(messages: List<Message>) {
+        LazyColumn {
+            // Add a single item as a header
+            item {
+                Text("Message List")
+            }
+
+            // Add list of messages
+            items(messages) { message ->
+                Message(message)
+            }
+        }
+    }
+}
+
+@Composable private fun KotlinSnippet13() {
+    Canvas(Modifier.size(120.dp)) {
+        // Draw grey background, drawRect function is provided by the receiver
+        drawRect(color = Color.Gray)
+
+        // Inset content by 10 pixels on the left/right sides
+        // and 12 by the top/bottom
+        inset(10.0f, 12.0f) {
+            val quadrantSize = size / 2.0f
+
+            // Draw a rectangle within the inset bounds
+            drawRect(
+                size = quadrantSize,
+                color = Color.Red
+            )
+
+            rotate(45.0f) {
+                drawRect(size = quadrantSize, color = Color.Blue)
+            }
+        }
+    }
+}
+
+@Composable private fun KotlinSnippet14() {
+    // Create a CoroutineScope that follows this composable's lifecycle
+    val composableScope = rememberCoroutineScope()
+    Button(
+        // ...
+        onClick = {
+            // Create a new coroutine that scrolls to the top of the list
+            // and call the ViewModel to load data
+            composableScope.launch {
+                scrollState.animateScrollTo(0) // This is a suspend function
+                viewModel.loadData()
+            }
+        }
+    ) { /* ... */ }
+}
+
+@Composable private fun KotlinSnippet15() {
+    // Create a CoroutineScope that follows this composable's lifecycle
+    val composableScope = rememberCoroutineScope()
+    Button( // ...
+        onClick = {
+            // Scroll to the top and load data in parallel by creating a new
+            // coroutine per independent work to do
+            composableScope.launch {
+                scrollState.animateScrollTo(0)
+            }
+            composableScope.launch {
+                viewModel.loadData()
+            }
+        }
+    ) { /* ... */ }
+}
+
+private object KotlinSnippet16 {
+    @Composable
+    fun MoveBoxWhereTapped() {
+        // Creates an `Animatable` to animate Offset and `remember` it.
+        val animatedOffset = remember {
+            Animatable(Offset(0f, 0f), Offset.VectorConverter)
+        }
+
+        Box(
+            // The pointerInput modifier takes a suspend block of code
+            Modifier.fillMaxSize().pointerInput(Unit) {
+                // Create a new CoroutineScope to be able to create new
+                // coroutines inside a suspend function
+                coroutineScope {
+                    while (true) {
+                        // Wait for the user to tap on the screen
+                        val offset = awaitPointerEventScope {
+                            awaitFirstDown().position
+                        }
+                        // Launch a new coroutine to asynchronously animate to where
+                        // the user tapped on the screen
+                        launch {
+                            // Animate to the pressed position
+                            animatedOffset.animateTo(offset)
+                        }
+                    }
+                }
+            }
+        ) {
+            Text("Tap anywhere", Modifier.align(Alignment.Center))
+            Box(
+                Modifier
+                    .offset {
+                        // Use the animated offset as the offset of this Box
+                        IntOffset(
+                            animatedOffset.value.x.roundToInt(),
+                            animatedOffset.value.y.roundToInt()
+                        )
+                    }
+                    .size(40.dp)
+                    .background(Color(0xff3c1361), CircleShape)
+            )
+        }
+    }
+}
+
 /*
 Fakes needed for snippets to build:
  */
@@ -178,3 +317,6 @@
 private val scrollState = ScrollState(0)
 private class MyViewModel { fun loadData() {} }
 private val viewModel = MyViewModel()
+private class Message
+
+@Composable private fun Message(message: Message) { }
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/libraries/Libraries.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/libraries/Libraries.kt
index 19fe7ad..58784ab 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/libraries/Libraries.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/libraries/Libraries.kt
@@ -23,29 +23,19 @@
 
 package androidx.compose.integration.docs.libraries
 
-import android.content.Context
 import android.graphics.Bitmap
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.State
-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.setValue
-import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.asImageBitmap
 import androidx.compose.foundation.lazy.items
 import androidx.compose.material.CircularProgressIndicator
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.painterResource
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
@@ -54,11 +44,12 @@
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
+import androidx.navigation.navigation
 import kotlinx.coroutines.flow.Flow
 
 /**
  * This file lets DevRel track changes to snippets present in
- * https://developer.android.com/jetpack/compose/xxxxxxxxxx
+ * https://developer.android.com/jetpack/compose/libraries
  *
  * No action required if it's modified.
  */
@@ -104,60 +95,6 @@
 }
 
 private object LibrariesSnippet4 {
-    @Composable
-    fun fetchImage(url: String): ImageBitmap? {
-        // Holds our current image, and will be updated by the onCommit lambda below
-        var image by remember(url) { mutableStateOf<ImageBitmap?>(null) }
-
-        DisposableEffect(url) {
-            // This onCommit lambda will be invoked every time url changes
-
-            val listener = object : ExampleImageLoader.Listener() {
-                override fun onSuccess(bitmap: Bitmap) {
-                    // When the image successfully loads, update our image state
-                    image = bitmap.asImageBitmap()
-                }
-            }
-
-            // Now execute the image loader
-            val imageLoader = ExampleImageLoader.get()
-            imageLoader.load(url).into(listener)
-
-            onDispose {
-                // If we leave composition, cancel any pending requests
-                imageLoader.cancel(listener)
-            }
-        }
-
-        // Return the state-backed image property. Any callers of this function
-        // will be recomposed once the image finishes loading
-        return image
-    }
-}
-
-private object LibrariesSnippet5 {
-    /** Example suspending loadImage function */
-    suspend fun loadImage(url: String): ImageBitmap = TODO()
-
-    @Composable
-    fun fetchImage(url: String): ImageBitmap? {
-        // This holds our current image, and will be updated by the
-        // launchInComposition lambda below
-        var image by remember(url) { mutableStateOf<ImageBitmap?>(null) }
-
-        // LaunchedEffect will automatically launch a coroutine to execute
-        // the given block. If the `url` changes, any previously launched coroutine
-        // will be cancelled, and a new coroutine launched.
-        LaunchedEffect(url) {
-            image = loadImage(url)
-        }
-
-        // Return the state-backed image property
-        return image
-    }
-}
-
-private object LibrariesSnippet6 {
     @HiltViewModel
     class ExampleViewModel @Inject constructor(
         private val savedStateHandle: SavedStateHandle,
@@ -170,16 +107,16 @@
     ) { /* ... */ }
 }
 
-private object LibrariesSnippet7 {
+private object LibrariesSnippet5 {
+    // import androidx.hilt.navigation.compose.hiltViewModel
+
     @Composable
     fun MyApp() {
         NavHost(navController, startDestination = startRoute) {
             composable("example") { backStackEntry ->
                 // Creates a ViewModel from the current BackStackEntry
-                val exampleViewModel: ExampleViewModel =
-                    viewModel(
-                        HiltViewModelFactory(LocalContext.current, backStackEntry)
-                    )
+                // Available in the androidx.hilt:hilt-navigation-compose artifact
+                val exampleViewModel = hiltViewModel<ExampleViewModel>()
                 ExampleScreen(exampleViewModel)
             }
             /* ... */
@@ -187,7 +124,27 @@
     }
 }
 
-private object LibrariesSnippet8 {
+private object LibrariesSnippet6 {
+    // import androidx.hilt.navigation.compose.hiltViewModel
+    // import androidx.navigation.compose.getBackStackEntry
+
+    @Composable
+    fun MyApp() {
+        NavHost(navController, startDestination = startRoute) {
+            navigation(startDestination = innerStartRoute, route = "Parent") {
+                // ...
+                composable("exampleWithRoute") { backStackEntry ->
+                    val parentViewModel = hiltViewModel<ParentViewModel>(
+                        navController.getBackStackEntry("Parent")
+                    )
+                    ExampleWithRouteScreen(parentViewModel)
+                }
+            }
+        }
+    }
+}
+
+private object LibrariesSnippet7 {
     @Composable
     fun MyExample(flow: Flow<PagingData<String>>) {
         val lazyPagingItems = flow.collectAsLazyPagingItems()
@@ -199,7 +156,7 @@
     }
 }
 
-private object LibrariesSnippet9 {
+private object LibrariesSnippet8 {
     @Composable
     fun MyExample() {
         CoilImage(
@@ -249,22 +206,27 @@
 private annotation class HiltViewModel
 private annotation class Inject
 
+private class ParentViewModel : ViewModel()
 private class ExampleViewModel : ViewModel() {
     val exampleLiveData = MutableLiveData(" ")
 }
 
-private fun viewModel(factory: HiltViewModelFactory): ExampleViewModel {
+private inline fun <reified VM : ViewModel> hiltViewModel(): VM { TODO() }
+private inline fun <reified VM : ViewModel> hiltViewModel(backStackEntry: NavBackStackEntry): VM {
     TODO()
 }
 
-private class HiltViewModelFactory(context: Context, backStackEntry: NavBackStackEntry)
-
 @Composable
 private fun ExampleScreen(vm: ExampleViewModel) {
     TODO()
 }
 
 @Composable
+private fun ExampleWithRouteScreen(vm: ParentViewModel) {
+    TODO()
+}
+
+@Composable
 private fun CoilImage(
     data: String,
     error: @Composable () -> Unit,
@@ -274,6 +236,7 @@
 }
 
 private val navController: NavHostController = TODO()
+private val innerStartRoute: String = TODO()
 private val startRoute: String = TODO()
 
 private class PagingData<T>
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/lifecycle/Lifecycle.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/lifecycle/Lifecycle.kt
index 455d5b8..b467198 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/lifecycle/Lifecycle.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/lifecycle/Lifecycle.kt
@@ -15,7 +15,9 @@
  */
 
 // Ignore lint warnings in documentation snippets
-@file:Suppress("unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE")
+@file:Suppress(
+    "unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "SimplifyBooleanWithConstants"
+)
 
 package androidx.compose.integration.docs.lifecycle
 
@@ -26,6 +28,7 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.material.Button
 import androidx.compose.material.ExperimentalMaterialApi
 import androidx.compose.material.Scaffold
@@ -46,8 +49,13 @@
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Modifier
 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.random.Random
 
@@ -73,7 +81,7 @@
         if (showError) {
             LoginError()
         }
-        LoginInput() // This call site is used to generate the key
+        LoginInput() // This call site affects where LoginInput is placed in Composition
     }
 
     @Composable
@@ -85,8 +93,8 @@
     fun MoviesScreen(movies: List<Movie>) {
         Column {
             for (movie in movies) {
-                // All MovieOverview composables in Composition will have the same key!
-                // Thus, all calls will always recompose and restart all side effects.
+                // MovieOverview composables are placed in Composition given its
+                // index position in the for loop
                 MovieOverview(movie)
             }
         }
@@ -95,6 +103,21 @@
 
 private object LifecycleSnippet4 {
     @Composable
+    fun MovieOverview(movie: Movie) {
+        Column {
+            // Side effect explained later in the docs. If MovieOverview
+            // recomposes, while fetching the image is in progress,
+            // it is cancelled and restarted.
+            val image = loadNetworkImage(movie.url)
+            MovieHeader(image)
+
+            /* ... */
+        }
+    }
+}
+
+private object LifecycleSnippet5 {
+    @Composable
     fun MoviesScreen(movies: List<Movie>) {
         Column {
             for (movie in movies) {
@@ -106,7 +129,7 @@
     }
 }
 
-private object LifecycleSnippet5 {
+private object LifecycleSnippet6 {
     @Composable
     fun MoviesScreen(movies: List<Movie>) {
         LazyColumn {
@@ -117,7 +140,7 @@
     }
 }
 
-private object LifecycleSnippet6 {
+private object LifecycleSnippet7 {
     // Marking the type as stable to favor skipping and smart recompositions.
     @Stable
     interface UiState<T : Result<T>> {
@@ -130,7 +153,7 @@
 }
 
 @ExperimentalMaterialApi
-private object LifecycleSnippet7 {
+private object LifecycleSnippet8 {
     @Composable
     fun MyScreen(
         state: UiState<List<Movie>>,
@@ -141,7 +164,7 @@
         if (state.hasError) {
 
             // `LaunchedEffect` will cancel and re-launch if `scaffoldState` changes
-            LaunchedEffect(scaffoldState) {
+            LaunchedEffect(scaffoldState.snackbarHostState) {
                 // Show snackbar using a coroutine, when the coroutine is cancelled the
                 // snackbar will automatically dismiss. This coroutine will cancel whenever
                 // `state.hasError` is false, and only start when `state.hasError`
@@ -160,7 +183,7 @@
 }
 
 @ExperimentalMaterialApi
-private object LifecycleSnippet8 {
+private object LifecycleSnippet9 {
     @Composable
     fun MoviesScreen(scaffoldState: ScaffoldState = rememberScaffoldState()) {
 
@@ -185,7 +208,7 @@
     }
 }
 
-private object LifecycleSnippet9 {
+private object LifecycleSnippet10 {
     @Composable
     fun LandingScreen(onTimeout: () -> Unit) {
 
@@ -195,7 +218,7 @@
 
         // Create an effect that matches the lifecycle of LandingScreen.
         // If LandingScreen recomposes, the delay shouldn't start again.
-        LaunchedEffect(Unit) {
+        LaunchedEffect(true) {
             delay(SplashWaitTimeMillis)
             currentOnTimeout()
         }
@@ -204,7 +227,7 @@
     }
 }
 
-private object LifecycleSnippet10 {
+private object LifecycleSnippet11 {
     @Composable
     fun BackHandler(backDispatcher: OnBackPressedDispatcher, onBack: () -> Unit) {
 
@@ -234,7 +257,7 @@
     }
 }
 
-private object LifecycleSnippet11 {
+private object LifecycleSnippet12 {
     @Composable
     fun BackHandler(
         backDispatcher: OnBackPressedDispatcher,
@@ -264,7 +287,7 @@
     }
 }
 
-private object LifecycleSnippet12 {
+private object LifecycleSnippet13 {
     @Composable
     fun loadNetworkImage(
         url: String,
@@ -290,7 +313,7 @@
     }
 }
 
-private object LifecycleSnippet13 {
+private object LifecycleSnippet14 {
     @Composable
     fun TodoList(highPriorityKeywords: List<String> = listOf("Review", "Unblock", "Compose")) {
 
@@ -312,7 +335,26 @@
     }
 }
 
-private object LifecycleSnippet14 {
+@Composable
+private fun LifecycleSnippet15(messages: List<Message>) {
+    val listState = rememberLazyListState()
+
+    LazyColumn(state = listState) {
+        // ...
+    }
+
+    LaunchedEffect(listState) {
+        snapshotFlow { listState.firstVisibleItemIndex }
+            .map { index -> index > 0 }
+            .distinctUntilChanged()
+            .filter { it == true }
+            .collect {
+                MyAnalyticsService.sendScrolledPastFirstItemEvent()
+            }
+    }
+}
+
+private object LifecycleSnippet16 {
     @Composable
     fun BackHandler(backDispatcher: OnBackPressedDispatcher, onBack: () -> Unit) {
         // START - DO NOT COPY IN CODE SNIPPET
@@ -347,7 +389,9 @@
 
 @Composable
 private fun MovieOverview(movie: Movie) { }
-private data class Movie(val id: Long)
+@Composable
+private fun MovieHeader(movie: String) { }
+private data class Movie(val id: Long, val url: String = "")
 
 private data class UiState<T>(
     val loading: Boolean = false,
@@ -358,6 +402,7 @@
         get() = exception != null
 }
 
+private class Message(val id: Long)
 private class Image
 private class ImageRepository {
     fun load(url: String): Image? = if (Random.nextInt() == 0) Image() else null // Avoid warnings
@@ -375,3 +420,8 @@
 private fun prepareGreeting(user: User, weather: Weather) = Greeting("haha")
 
 private fun String.containsWord(input: List<String>): Boolean = false
+private fun loadNetworkImage(url: String): String = ""
+
+private object MyAnalyticsService {
+    fun sendScrolledPastFirstItemEvent() = Unit
+}
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
index 6dc9a73..c70a8db 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/Navigation.kt
@@ -40,12 +40,10 @@
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.NavHostController
 import androidx.navigation.NavType
-import androidx.navigation.compose.KEY_ROUTE
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.currentBackStackEntryAsState
 import androidx.navigation.compose.navArgument
-import androidx.navigation.compose.navigate
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.navDeepLink
 
@@ -160,7 +158,7 @@
         bottomBar = {
             BottomNavigation {
                 val navBackStackEntry by navController.currentBackStackEntryAsState()
-                val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)
+                val currentRoute = navBackStackEntry?.destination?.route
                 items.forEach { screen ->
                     BottomNavigationItem(
                         icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
@@ -168,7 +166,9 @@
                         selected = currentRoute == screen.route,
                         onClick = {
                             // This is the equivalent to popUpTo the start destination
-                            navController.popBackStack(navController.graph.startDestination, false)
+                            navController.popBackStack(
+                                navController.graph.startDestinationId, false
+                            )
 
                             // This if check gives us a "singleTop" behavior where we do not create a
                             // second instance of the composable if we are already on that destination
diff --git a/compose/integration-tests/macrobenchmark/build.gradle b/compose/integration-tests/macrobenchmark/build.gradle
index 6568c2a..f400f4d 100644
--- a/compose/integration-tests/macrobenchmark/build.gradle
+++ b/compose/integration-tests/macrobenchmark/build.gradle
@@ -35,6 +35,7 @@
 dependencies {
     androidTestImplementation(project(":benchmark:benchmark-junit4"))
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
+    androidTestImplementation(project(":internal-testutils-macrobenchmark"))
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/MacrobenchUtils.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/MacrobenchUtils.kt
deleted file mode 100644
index f893da1..0000000
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/MacrobenchUtils.kt
+++ /dev/null
@@ -1,80 +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.compose.integration.macrobenchmark
-
-import android.content.Intent
-import androidx.benchmark.macro.CompilationMode
-import androidx.benchmark.macro.StartupMode
-import androidx.benchmark.macro.StartupTimingMetric
-import androidx.benchmark.macro.isSupportedWithVmSettings
-import androidx.benchmark.macro.junit4.MacrobenchmarkRule
-
-const val TARGET_PACKAGE = "androidx.compose.integration.macrobenchmark.target"
-
-fun MacrobenchmarkRule.measureStartup(
-    compilationMode: CompilationMode,
-    startupMode: StartupMode,
-    iterations: Int = 3,
-    setupIntent: Intent.() -> Unit = {}
-) = measureRepeated(
-    packageName = TARGET_PACKAGE,
-    metrics = listOf(StartupTimingMetric()),
-    compilationMode = compilationMode,
-    iterations = iterations,
-    startupMode = startupMode
-) {
-    pressHome()
-    val intent = Intent()
-    intent.setPackage(TARGET_PACKAGE)
-    setupIntent(intent)
-    startActivityAndWait(intent)
-}
-
-fun createStartupCompilationParams(
-    startupModes: List<StartupMode> = listOf(StartupMode.HOT, StartupMode.WARM, StartupMode.COLD),
-    compilationModes: List<CompilationMode> = listOf(
-        CompilationMode.None,
-        CompilationMode.Interpreted,
-        CompilationMode.SpeedProfile()
-    )
-): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
-    for (startupMode in startupModes) {
-        for (compilationMode in compilationModes) {
-            // Skip configs that can't run, so they don't clutter Studio benchmark
-            // output with AssumptionViolatedException dumps
-            if (compilationMode.isSupportedWithVmSettings()) {
-                add(arrayOf(startupMode, compilationMode))
-            }
-        }
-    }
-}
-
-fun createCompilationParams(
-    compilationModes: List<CompilationMode> = listOf(
-        CompilationMode.None,
-        CompilationMode.Interpreted,
-        CompilationMode.SpeedProfile()
-    )
-): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
-    for (compilationMode in compilationModes) {
-        // Skip configs that can't run, so they don't clutter Studio benchmark
-        // output with AssumptionViolatedException dumps
-        if (compilationMode.isSupportedWithVmSettings()) {
-            add(arrayOf(compilationMode))
-        }
-    }
-}
\ No newline at end of file
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 0fe6f16..cb9e113 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,6 +20,8 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
+import androidx.testutils.createStartupCompilationParams
+import androidx.testutils.measureStartup
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,7 +39,8 @@
     @Test
     fun startup() = benchmarkRule.measureStartup(
         compilationMode = compilationMode,
-        startupMode = startupMode
+        startupMode = startupMode,
+        packageName = "androidx.compose.integration.macrobenchmark.target"
     ) {
         action = "androidx.compose.integration.macrobenchmark.target.LAZY_COLUMN_ACTIVITY"
         putExtra("ITEM_COUNT", 5)
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
index 1be3b5c..6d0939c 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialListScrollBenchmark.kt
@@ -26,6 +26,7 @@
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.Until
+import androidx.testutils.createCompilationParams
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
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 45167ff..1a6254b 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,6 +20,8 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
+import androidx.testutils.createStartupCompilationParams
+import androidx.testutils.measureStartup
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -37,7 +39,8 @@
     @Test
     fun startup() = benchmarkRule.measureStartup(
         compilationMode = compilationMode,
-        startupMode = startupMode
+        startupMode = startupMode,
+        packageName = "androidx.compose.integration.macrobenchmark.target"
     ) {
         action = "androidx.compose.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
     }
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
index 78cba9a..5b3452a 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
@@ -42,6 +42,10 @@
     object Ui {
         val PackageName = Package("androidx.compose.ui")
         val Modifier = Name(PackageName, "Modifier")
+        object Layout {
+            val PackageName = Package("androidx.compose.ui.layout")
+            val ParentDataModifier = Name(PackageName, "ParentDataModifier")
+        }
     }
     object UiGraphics {
         val PackageName = Package("androidx.compose.ui.graphics")
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/Stubs.kt b/compose/lint/common/src/main/java/androidx/compose/lint/Stubs.kt
index 6b83ff8..578cf67 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/Stubs.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/Stubs.kt
@@ -87,9 +87,6 @@
         """
         package androidx.compose.ui
 
-        import androidx.compose.ui.platform.InspectorInfo
-        import androidx.compose.ui.platform.InspectorValueInfo
-
         @Suppress("ModifierFactoryExtensionFunction")
         interface Modifier {
             infix fun then(other: Modifier): Modifier =
diff --git a/compose/lint/internal-lint-checks/build.gradle b/compose/lint/internal-lint-checks/build.gradle
index 83bcf45..d2d107a 100644
--- a/compose/lint/internal-lint-checks/build.gradle
+++ b/compose/lint/internal-lint-checks/build.gradle
@@ -18,19 +18,12 @@
 
 import static androidx.build.dependencies.DependenciesKt.*
 
-buildscript {
-    dependencies {
-        classpath "com.github.jengelman.gradle.plugins:shadow:4.0.4"
-    }
-}
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
+    id("com.github.johnrengelman.shadow")
 }
 
-apply(plugin:"com.github.johnrengelman.shadow")
-
 dependencies {
     compileOnly(LINT_API_LATEST)
     compileOnly(KOTLIN_STDLIB)
diff --git a/compose/material/material-icons-core/api/1.0.0-beta06.txt b/compose/material/material-icons-core/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..a6db2fd
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.0.0-beta06.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 androidx.compose.ui.graphics.PathFillType 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/1.0.0-beta07.txt b/compose/material/material-icons-core/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..a6db2fd
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.0.0-beta07.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 androidx.compose.ui.graphics.PathFillType 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.0.0-beta06.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..a6db2fd
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta06.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 androidx.compose.ui.graphics.PathFillType 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.0.0-beta07.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..a6db2fd
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.0.0-beta07.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 androidx.compose.ui.graphics.PathFillType 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/res-1.0.0-beta06.txt b/compose/material/material-icons-core/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-icons-core/api/res-1.0.0-beta06.txt
diff --git a/compose/material/material-icons-core/api/res-1.0.0-beta07.txt b/compose/material/material-icons-core/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-icons-core/api/res-1.0.0-beta07.txt
diff --git a/compose/material/material-icons-core/api/restricted_1.0.0-beta06.txt b/compose/material/material-icons-core/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..0ea558f
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.0.0-beta06.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 androidx.compose.ui.graphics.PathFillType 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-icons-core/api/restricted_1.0.0-beta07.txt b/compose/material/material-icons-core/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..0ea558f
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.0.0-beta07.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 androidx.compose.ui.graphics.PathFillType 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-icons-core/src/commonMain/kotlin/androidx/compose/material/icons/compose-material-icons-documentation.md b/compose/material/material-icons-core/src/commonMain/kotlin/androidx/compose/material/icons/compose-material-icons-documentation.md
new file mode 100644
index 0000000..b9921b9
--- /dev/null
+++ b/compose/material/material-icons-core/src/commonMain/kotlin/androidx/compose/material/icons/compose-material-icons-documentation.md
@@ -0,0 +1,7 @@
+# Module root
+
+Compose Material Icons
+
+# Package androidx.compose.material.icons
+
+This is the entry point for using Material Icons in Compose, designed to provide icons that match those described at [fonts.google.com/icons](https://fonts.google.com/icons).
\ No newline at end of file
diff --git a/compose/material/material-icons-extended/README.md b/compose/material/material-icons-extended/README.md
new file mode 100644
index 0000000..21d3209
--- /dev/null
+++ b/compose/material/material-icons-extended/README.md
@@ -0,0 +1,8 @@
+This project provides the Compose Material Design extended icons
+
+To keep Kotlin compilation times down, each theme is compiled in its own Gradle project and then the resulting .class files are merged back into the output of this project
+
+Hopefully we can revert this when parallel compilation is supported:
+https://youtrack.jetbrains.com/issue/KT-46085
+
+See https://issuetracker.google.com/issues/178207305 and https://issuetracker.google.com/issues/184959797 for more information
diff --git a/compose/material/material-icons-extended/build.gradle b/compose/material/material-icons-extended/build.gradle
index eefd74d..9af3692 100644
--- a/compose/material/material-icons-extended/build.gradle
+++ b/compose/material/material-icons-extended/build.gradle
@@ -30,20 +30,21 @@
 
 AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)
 
+IconGenerationTask.registerExtendedIconMainProject(
+        project,
+        android
+)
+
+apply from: "shared-dependencies.gradle"
+
 dependencies {
     kotlinPlugin(project(":compose:compiler:compiler"))
 
-    if(!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
         /*
-         * When updating dependencies, make sure to make the an an analogous update in the
+         * When updating dependencies, make sure to make an analogous update in the
          * corresponding block below
          */
-
-        api(project(":compose:material:material-icons-core"))
-
-        implementation(KOTLIN_STDLIB_COMMON)
-        implementation(project(":compose:runtime:runtime"))
-
         androidTestImplementation(ANDROIDX_TEST_RULES)
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
         androidTestImplementation(JUNIT)
@@ -55,26 +56,19 @@
         androidTestImplementation(project(":compose:ui:ui"))
         androidTestImplementation(project(":test-screenshot"))
         androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+        androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(project(":activity:activity-compose"))
         androidTestImplementation("androidx.appcompat:appcompat:1.3.0-beta01")
     }
 }
 
-if(AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+if (AndroidXUiPlugin.isMultiplatformEnabled(project)) {
     kotlin {
-        android()
-        jvm("desktop")
         /*
-         * When updating dependencies, make sure to make the an an analogous update in the
+         * When updating dependencies, make sure to make an analogous update in the
          * corresponding block above
          */
         sourceSets {
-            commonMain.dependencies {
-                implementation(KOTLIN_STDLIB_COMMON)
-                api(project(":compose:material:material-icons-core"))
-                implementation(project(":compose:runtime:runtime"))
-            }
-
             androidTest.dependencies {
                 implementation(project(":compose:foundation:foundation"))
                 implementation(project(":compose:foundation:foundation-layout"))
@@ -94,24 +88,52 @@
     }
 }
 
-android.buildTypes.all {
-    // Jacoco hangs intermittently due to the large number of files
-    testCoverageEnabled = false
-}
+def allThemes = ["filled", "outlined", "rounded", "sharp", "twotone"]
 
-// b/175401659 - disable lint as it takes a long time, and most errors should be caught by lint on
-// material-icons-core anyway
-project.afterEvaluate {
-    tasks.named("lintDebug") {
-        enabled = false
+configurations {
+    embedThemesDebug {
+        attributes {
+            attribute(iconExportAttr, "true")
+            attribute(iconBuildTypeAttr, "debug")
+        }
     }
+    embedThemesRelease {
+        attributes {
+            attribute(iconExportAttr, "true")
+            attribute(iconBuildTypeAttr, "release")
+        }
+    }
+
 }
 
-IconGenerationTask.registerExtendedIconProject(
-        project,
-        android,
-        AndroidXUiPlugin.isMultiplatformEnabled(project)
-)
+if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    for (themeName in allThemes) {
+        def otherProject = project(":compose:material:material-icons-extended-" + themeName)
+        project.dependencies.add("embedThemesDebug", otherProject)
+        project.dependencies.add("embedThemesRelease", otherProject)
+    }
+    // Compiling all of the icons in this project takes a while,
+    // so when possible, we compile each theme in its own project and merge them here.
+    // Hopefully we can revert this when parallel compilation is supported:
+    // https://youtrack.jetbrains.com/issue/KT-46085
+    android {
+        libraryVariants.all { v ->
+            if (v.name.toLowerCase().contains("debug")) {
+                v.registerPostJavacGeneratedBytecode(configurations.embedThemesDebug)
+            } else {
+                v.registerPostJavacGeneratedBytecode(configurations.embedThemesRelease)
+            }
+        }
+    }
+} else {
+    // We're not sure how to compile these icons in parallel when multiplatform is enabled
+    IconGenerationTask.registerExtendedIconThemeProject(
+            project,
+            android,
+            AndroidXUiPlugin.isMultiplatformEnabled(project)
+    )
+}
+
 
 androidx {
     name = "Compose Material Icons Extended"
diff --git a/compose/material/material-icons-extended/generate.gradle b/compose/material/material-icons-extended/generate.gradle
new file mode 100644
index 0000000..8ee5605
--- /dev/null
+++ b/compose/material/material-icons-extended/generate.gradle
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ */
+
+// This file contains logic used for compiling the individual themes of material-icons-extended
+
+import androidx.build.AndroidXUiPlugin
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.Publish
+import androidx.build.RunApiTasks
+import androidx.compose.material.icons.generator.tasks.IconGenerationTask
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+apply plugin: "AndroidXPlugin"
+apply plugin: "com.android.library"
+apply plugin: "AndroidXUiPlugin"
+
+apply from: "${buildscript.sourceFile.parentFile}/shared-dependencies.gradle"
+
+dependencies {
+    kotlinPlugin(project(":compose:compiler:compiler"))
+}
+
+android.buildTypes.all {
+    // Jacoco hangs intermittently due to the large number of files
+    testCoverageEnabled = false
+}
+
+if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    // We're not sure how to merge icons jars when multiplatform is enabled
+    IconGenerationTask.registerExtendedIconThemeProject(
+            project,
+            android,
+            AndroidXUiPlugin.isMultiplatformEnabled(project)
+    )
+}
+
+dependencies.attributesSchema {
+    attribute(iconExportAttr)
+    attribute(iconBuildTypeAttr)
+}
+
+configurations {
+    def jarsDir = "${buildDir}/intermediates/aar_main_jar"
+    iconExportDebug {
+        attributes {
+            attribute(iconExportAttr, "true")
+            attribute(iconBuildTypeAttr, "debug")
+        }
+        outgoing.artifact(new File("${jarsDir}/debug/classes.jar")) {
+            builtBy("syncDebugLibJars")
+        }
+    }
+    iconExportRelease {
+        attributes {
+            attribute(iconExportAttr, "true")
+            attribute(iconBuildTypeAttr, "release")
+        }
+        outgoing.artifact(new File("${jarsDir}/release/classes.jar")) {
+            builtBy("syncReleaseLibJars")
+        }
+    }
+}
+
+androidx {
+    name = "Compose Material Icons Extended"
+    type = LibraryType.PUBLISHED_LIBRARY
+    publish = Publish.NONE // actually embedded into the main aar rather than published separately
+    mavenGroup = LibraryGroups.Compose.MATERIAL
+    // This module has a large number (1000+) of generated source files and so doc generation /
+    // API tracking will simply take too long
+    runApiTasks = new RunApiTasks.No("A thousand generated source files")
+    inceptionYear = "2020"
+    description = "Compose Material Design extended icons. This module contains material icons of the corresponding theme. It is a very large dependency and should not be included directly."
+}
diff --git a/compose/material/material-icons-extended/material-icons-extended-filled/build.gradle b/compose/material/material-icons-extended/material-icons-extended-filled/build.gradle
new file mode 100644
index 0000000..710a37a
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-filled/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+apply from: "../generate.gradle"
diff --git a/compose/material/material-icons-extended/material-icons-extended-filled/src/androidMain/AndroidManifest.xml b/compose/material/material-icons-extended/material-icons-extended-filled/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..4e728ed
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-filled/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 package="androidx.compose.material.icons.extended" />
diff --git a/compose/material/material-icons-extended/material-icons-extended-outlined/build.gradle b/compose/material/material-icons-extended/material-icons-extended-outlined/build.gradle
new file mode 100644
index 0000000..710a37a
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-outlined/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+apply from: "../generate.gradle"
diff --git a/compose/material/material-icons-extended/material-icons-extended-outlined/src/androidMain/AndroidManifest.xml b/compose/material/material-icons-extended/material-icons-extended-outlined/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..4e728ed
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-outlined/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 package="androidx.compose.material.icons.extended" />
diff --git a/compose/material/material-icons-extended/material-icons-extended-rounded/build.gradle b/compose/material/material-icons-extended/material-icons-extended-rounded/build.gradle
new file mode 100644
index 0000000..710a37a
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-rounded/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+apply from: "../generate.gradle"
diff --git a/compose/material/material-icons-extended/material-icons-extended-rounded/src/androidMain/AndroidManifest.xml b/compose/material/material-icons-extended/material-icons-extended-rounded/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..4e728ed
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-rounded/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 package="androidx.compose.material.icons.extended" />
diff --git a/compose/material/material-icons-extended/material-icons-extended-sharp/build.gradle b/compose/material/material-icons-extended/material-icons-extended-sharp/build.gradle
new file mode 100644
index 0000000..710a37a
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-sharp/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+apply from: "../generate.gradle"
diff --git a/compose/material/material-icons-extended/material-icons-extended-sharp/src/androidMain/AndroidManifest.xml b/compose/material/material-icons-extended/material-icons-extended-sharp/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..4e728ed
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-sharp/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 package="androidx.compose.material.icons.extended" />
diff --git a/compose/material/material-icons-extended/material-icons-extended-twotone/build.gradle b/compose/material/material-icons-extended/material-icons-extended-twotone/build.gradle
new file mode 100644
index 0000000..710a37a
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-twotone/build.gradle
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+apply from: "../generate.gradle"
diff --git a/compose/material/material-icons-extended/material-icons-extended-twotone/src/androidMain/AndroidManifest.xml b/compose/material/material-icons-extended/material-icons-extended-twotone/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..4e728ed
--- /dev/null
+++ b/compose/material/material-icons-extended/material-icons-extended-twotone/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 package="androidx.compose.material.icons.extended" />
diff --git a/compose/material/material-icons-extended/shared-dependencies.gradle b/compose/material/material-icons-extended/shared-dependencies.gradle
new file mode 100644
index 0000000..6959ffd
--- /dev/null
+++ b/compose/material/material-icons-extended/shared-dependencies.gradle
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+// This file stores common dependencies that are used both by material-icons-extended and
+// by its specific theme projects (each of which compile a specific theme)
+
+import androidx.build.AndroidXUiPlugin
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project)
+
+dependencies {
+    if (!AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+        /*
+         * When updating dependencies, make sure to make an analogous update in the
+         * corresponding block below
+         */
+       api(project(":compose:material:material-icons-core"))
+       implementation(KOTLIN_STDLIB_COMMON)
+       implementation(project(":compose:runtime:runtime"))
+    }
+}
+
+if (AndroidXUiPlugin.isMultiplatformEnabled(project)) {
+    kotlin {
+        android()
+        jvm("desktop")
+        /*
+         * When updating dependencies, make sure to make an analogous update in the
+         * corresponding block above
+         */
+        sourceSets {
+            commonMain.dependencies {
+                api(project(":compose:material:material-icons-core"))
+                implementation(KOTLIN_STDLIB_COMMON)
+                implementation(project(":compose:runtime:runtime"))
+            }
+        }
+    }
+}
+
+project.ext.iconExportAttr = Attribute.of("com.androidx.compose.material-icons-extended.Export", String)
+project.ext.iconBuildTypeAttr = Attribute.of("com.androidx.compose.material-icons-extended.BuildType", String)
diff --git a/compose/material/material-ripple/api/1.0.0-beta06.txt b/compose/material/material-ripple/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..171df53
--- /dev/null
+++ b/compose/material/material-ripple/api/1.0.0-beta06.txt
@@ -0,0 +1,42 @@
+// 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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/1.0.0-beta07.txt b/compose/material/material-ripple/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..171df53
--- /dev/null
+++ b/compose/material/material-ripple/api/1.0.0-beta07.txt
@@ -0,0 +1,42 @@
+// 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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/current.txt b/compose/material/material-ripple/api/current.txt
index 3e18f6d..171df53 100644
--- a/compose/material/material-ripple/api/current.txt
+++ b/compose/material/material-ripple/api/current.txt
@@ -35,5 +35,8 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
+  public final class Ripple_androidKt {
+  }
+
 }
 
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta06.txt b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..9c82a47
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,46 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @kotlin.RequiresOptIn(message="This ripple API is experimental and may change / be removed in the future.") public @interface ExperimentalRippleApi {
+  }
+
+  @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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalRippleNativeRendering();
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta07.txt b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..9c82a47
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,46 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @kotlin.RequiresOptIn(message="This ripple API is experimental and may change / be removed in the future.") public @interface ExperimentalRippleApi {
+  }
+
+  @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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalRippleNativeRendering();
+  }
+
+}
+
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 3e18f6d..9c82a47 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_current.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_current.txt
@@ -1,6 +1,9 @@
 // Signature format: 4.0
 package androidx.compose.material.ripple {
 
+  @kotlin.RequiresOptIn(message="This ripple API is experimental and may change / be removed in the future.") public @interface ExperimentalRippleApi {
+  }
+
   @androidx.compose.runtime.Immutable public final class RippleAlpha {
     ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
     method public float getDraggedAlpha();
@@ -35,5 +38,9 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
+  public final class Ripple_androidKt {
+    method @androidx.compose.material.ripple.ExperimentalRippleApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalRippleNativeRendering();
+  }
+
 }
 
diff --git a/compose/material/material-ripple/api/res-1.0.0-beta06.txt b/compose/material/material-ripple/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-ripple/api/res-1.0.0-beta06.txt
diff --git a/compose/material/material-ripple/api/res-1.0.0-beta07.txt b/compose/material/material-ripple/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material-ripple/api/res-1.0.0-beta07.txt
diff --git a/compose/material/material-ripple/api/restricted_1.0.0-beta06.txt b/compose/material/material-ripple/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..171df53
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,42 @@
+// 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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/restricted_1.0.0-beta07.txt b/compose/material/material-ripple/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..171df53
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,42 @@
+// 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-aOO63xs(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor-0d7_KjU();
+    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-QZCes2I(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor-QZCes2I(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+  }
+
+  public final class Ripple_androidKt {
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/restricted_current.txt b/compose/material/material-ripple/api/restricted_current.txt
index 3e18f6d..171df53 100644
--- a/compose/material/material-ripple/api/restricted_current.txt
+++ b/compose/material/material-ripple/api/restricted_current.txt
@@ -35,5 +35,8 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
   }
 
+  public final class Ripple_androidKt {
+  }
+
 }
 
diff --git a/compose/material/material-ripple/build.gradle b/compose/material/material-ripple/build.gradle
index 4529ad0..d52942a 100644
--- a/compose/material/material-ripple/build.gradle
+++ b/compose/material/material-ripple/build.gradle
@@ -47,6 +47,12 @@
         testImplementation(ANDROIDX_TEST_RUNNER)
         testImplementation(JUNIT)
         testImplementation(TRUTH)
+
+        androidTestImplementation(project(":compose:test-utils"))
+        androidTestImplementation(ANDROIDX_TEST_RULES)
+        androidTestImplementation(ANDROIDX_TEST_RUNNER)
+        androidTestImplementation(JUNIT)
+        androidTestImplementation(TRUTH)
     }
 }
 
@@ -69,9 +75,7 @@
                 implementation(project(":compose:ui:ui-util"))
             }
 
-            desktopMain.dependencies {
-                implementation(KOTLIN_STDLIB)
-            }
+            desktopMain.dependsOn(jvmMain)
 
             test.dependencies {
                 implementation(ANDROIDX_TEST_RULES)
@@ -79,6 +83,15 @@
                 implementation(JUNIT)
                 implementation(TRUTH)
             }
+
+            androidAndroidTest.dependencies {
+                implementation(project(":compose:test-utils"))
+
+                implementation(ANDROIDX_TEST_RULES)
+                implementation(ANDROIDX_TEST_RUNNER)
+                implementation(JUNIT)
+                implementation(TRUTH)
+            }
         }
     }
 }
@@ -89,4 +102,8 @@
     mavenGroup = LibraryGroups.Compose.MATERIAL
     inceptionYear = "2020"
     description = "Material ripple used to build interactive components"
+    // Disable strict API mode for MPP builds as it will fail to compile androidAndroidTest
+    // sources, as it doesn't understand that they are tests and thinks they should have explicit
+    // visibility
+    legacyDisableKotlinStrictApiMode = AndroidXUiPlugin.isMultiplatformEnabled(project)
 }
diff --git a/compose/material/material-ripple/src/androidAndroidTest/AndroidManifest.xml b/compose/material/material-ripple/src/androidAndroidTest/AndroidManifest.xml
new file mode 100644
index 0000000..2b2c8e8
--- /dev/null
+++ b/compose/material/material-ripple/src/androidAndroidTest/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2021 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest package="androidx.compose.material.ripple" />
diff --git a/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.kt b/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.kt
new file mode 100644
index 0000000..d376ebd
--- /dev/null
+++ b/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/LocalRippleNativeRenderingTest.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.compose.material.ripple
+
+import androidx.compose.foundation.IndicationInstance
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.remember
+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
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Test for [LocalRippleNativeRendering]
+ */
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class LocalRippleNativeRenderingTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun usesNativeRipplesByDefault() {
+        lateinit var instance: IndicationInstance
+        rule.setContent {
+            val ripple = rememberRipple()
+            val interactionSource = remember { MutableInteractionSource() }
+            instance = ripple.rememberUpdatedInstance(interactionSource)
+        }
+
+        rule.runOnIdle {
+            Truth.assertThat(instance).isInstanceOf(AndroidRippleIndicationInstance::class.java)
+        }
+    }
+
+    @OptIn(ExperimentalRippleApi::class)
+    @Test
+    fun usesCommonRipples_whenLocalNativeRippleRenderIsSet() {
+        lateinit var instance: IndicationInstance
+        rule.setContent {
+            CompositionLocalProvider(LocalRippleNativeRendering provides false) {
+                val ripple = rememberRipple()
+                val interactionSource = remember { MutableInteractionSource() }
+                instance = ripple.rememberUpdatedInstance(interactionSource)
+            }
+        }
+
+        rule.runOnIdle {
+            Truth.assertThat(instance).isInstanceOf(CommonRippleIndicationInstance::class.java)
+        }
+    }
+}
diff --git a/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt b/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt
new file mode 100644
index 0000000..511207f
--- /dev/null
+++ b/compose/material/material-ripple/src/androidAndroidTest/kotlin/androidx/compose/material/ripple/RippleContainerTest.kt
@@ -0,0 +1,158 @@
+/*
+ * 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.material.ripple
+
+import androidx.activity.ComponentActivity
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.unit.Dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Test for [RippleContainer]
+ */
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class RippleContainerTest {
+
+    @get:Rule
+    val rule = createAndroidComposeRule<ComponentActivity>()
+
+    @Test
+    fun cachesViews() {
+        val activity = rule.activity
+        val container = RippleContainer(activity)
+
+        val instance = createRippleIndicationInstance(container)
+
+        with(container) {
+            val hostView = instance.getRippleHostView()
+            // The same View should be returned
+            Truth.assertThat(hostView).isEqualTo(instance.getRippleHostView())
+        }
+    }
+
+    @Test
+    fun returnsNewViews() {
+        val activity = rule.activity
+        val container = RippleContainer(activity)
+
+        val instance1 = createRippleIndicationInstance(container)
+        val instance2 = createRippleIndicationInstance(container)
+
+        with(container) {
+            val hostView1 = instance1.getRippleHostView()
+            val hostView2 = instance2.getRippleHostView()
+            // A new View should be returned
+            Truth.assertThat(hostView1).isNotEqualTo(hostView2)
+        }
+    }
+
+    @Test
+    fun reassignsExistingViews() {
+        val activity = rule.activity
+        val container = RippleContainer(activity)
+
+        val instance1 = createRippleIndicationInstance(container)
+        val instance2 = createRippleIndicationInstance(container)
+        val instance3 = createRippleIndicationInstance(container)
+        val instance4 = createRippleIndicationInstance(container)
+        val instance5 = createRippleIndicationInstance(container)
+        val instance6 = createRippleIndicationInstance(container)
+
+        with(container) {
+            // Assign the maximum number of host views
+            val hostView1 = instance1.getRippleHostView()
+            val hostView2 = instance2.getRippleHostView()
+            instance3.getRippleHostView()
+            instance4.getRippleHostView()
+            instance5.getRippleHostView()
+
+            // When we try and get a new view on the 6th instance
+            val hostView6 = instance6.getRippleHostView()
+
+            // It should be the same as hostView1, now re-assigned to a new view
+            Truth.assertThat(hostView6).isEqualTo(hostView1)
+
+            // When the first instance tries to get the instance again
+            val hostView = instance1.getRippleHostView()
+
+            // It should now be the same view used for the second instance, as we continue to
+            // recycle in order
+            Truth.assertThat(hostView).isNotEqualTo(hostView6)
+            Truth.assertThat(hostView).isEqualTo(hostView2)
+        }
+    }
+
+    @Test
+    fun reusesDisposedViews() {
+        val activity = rule.activity
+        val container = RippleContainer(activity)
+
+        val instance1 = createRippleIndicationInstance(container)
+        val instance2 = createRippleIndicationInstance(container)
+        val instance3 = createRippleIndicationInstance(container)
+        val instance4 = createRippleIndicationInstance(container)
+        val instance5 = createRippleIndicationInstance(container)
+        val instance6 = createRippleIndicationInstance(container)
+
+        with(container) {
+            // Assign some initial views
+            val hostView1 = instance1.getRippleHostView()
+            val hostView2 = instance2.getRippleHostView()
+            val hostView3 = instance3.getRippleHostView()
+
+            // Dispose the first two ripples
+            instance1.disposeRippleIfNeeded()
+            instance2.disposeRippleIfNeeded()
+
+            // The host views previously used by instance1 and instance1 should now be reused,
+            // before allocating new views
+            val hostView4 = instance4.getRippleHostView()
+            val hostView5 = instance5.getRippleHostView()
+
+            Truth.assertThat(hostView4).isEqualTo(hostView1)
+            Truth.assertThat(hostView5).isEqualTo(hostView2)
+
+            // When we try and get a view for the 6th instance
+            val hostView6 = instance6.getRippleHostView()
+
+            // It should now be a totally new host view, not previously used by any of the other
+            // instances, since there are no more unused views
+            Truth.assertThat(hostView6).isNotEqualTo(hostView1)
+            Truth.assertThat(hostView6).isNotEqualTo(hostView2)
+            Truth.assertThat(hostView6).isNotEqualTo(hostView3)
+            Truth.assertThat(hostView6).isNotEqualTo(hostView4)
+            Truth.assertThat(hostView6).isNotEqualTo(hostView5)
+        }
+    }
+}
+
+private fun createRippleIndicationInstance(container: RippleContainer) =
+    AndroidRippleIndicationInstance(
+        true,
+        Dp.Unspecified,
+        mutableStateOf(Color.Black),
+        mutableStateOf(RippleAlpha(1f, 1f, 1f, 1f)),
+        container
+    )
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
new file mode 100644
index 0000000..d0e9e60
--- /dev/null
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/Ripple.android.kt
@@ -0,0 +1,270 @@
+/*
+ * 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.material.ripple
+
+import android.graphics.drawable.RippleDrawable
+import android.view.View
+import android.view.ViewGroup
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocal
+import androidx.compose.runtime.ProvidableCompositionLocal
+import androidx.compose.runtime.RememberObserver
+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.setValue
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.isUnspecified
+import kotlinx.coroutines.CoroutineScope
+import kotlin.math.roundToInt
+
+/**
+ * Android specific Ripple implementation that uses a [RippleDrawable] under the hood, which allows
+ * rendering the ripple animation on the render thread (away from the main UI thread). This
+ * allows the ripple to animate smoothly even while the UI thread is under heavy load, such as
+ * when navigating between complex screens.
+ *
+ * @see Ripple
+ */
+@Stable
+internal actual class PlatformRipple actual constructor(
+    bounded: Boolean,
+    radius: Dp,
+    color: State<Color>
+) : Ripple(bounded, radius, color) {
+    @OptIn(ExperimentalRippleApi::class)
+    @Composable
+    override fun rememberUpdatedRippleInstance(
+        interactionSource: InteractionSource,
+        bounded: Boolean,
+        radius: Dp,
+        color: State<Color>,
+        rippleAlpha: State<RippleAlpha>
+    ): RippleIndicationInstance {
+        // Fallback to drawing inside Compose if needed, using the common implementation
+        if (!LocalRippleNativeRendering.current) {
+            return remember(interactionSource, this) {
+                CommonRippleIndicationInstance(bounded, radius, color, rippleAlpha)
+            }
+        }
+
+        // Create or get the RippleContainer attached to the nearest root Compose view
+
+        val view = findNearestViewGroup()
+
+        var rippleContainer: RippleContainer? = null
+
+        for (index in 0 until view.childCount) {
+            val child = view.getChildAt(index)
+            if (child is RippleContainer) {
+                rippleContainer = child
+                break
+            }
+        }
+
+        if (rippleContainer == null) {
+            rippleContainer = RippleContainer(view.context).apply {
+                view.addView(this)
+            }
+        }
+
+        return remember(interactionSource, this, rippleContainer) {
+            AndroidRippleIndicationInstance(bounded, radius, color, rippleAlpha, rippleContainer)
+        }
+    }
+
+    /**
+     * Returns [LocalView] if it is a [ViewGroup], otherwise the nearest parent [ViewGroup] that
+     * we will add a [RippleContainer] to.
+     *
+     * In all normal scenarios this should just be [LocalView], but since [LocalView] is public
+     * API theoretically its value can be overridden with a non-[ViewGroup], so we walk up the
+     * tree to be safe.
+     */
+    @Composable
+    private fun findNearestViewGroup(): ViewGroup {
+        var view: View? = LocalView.current
+        while (view !is ViewGroup) {
+            // We should never get to a ViewParent that isn't a View, without finding a ViewGroup
+            // first
+            view = view?.parent as View
+        }
+        return view
+    }
+}
+
+@RequiresOptIn(
+    "This ripple API is experimental and may change / be removed in the future."
+)
+public annotation class ExperimentalRippleApi
+
+/**
+ * [CompositionLocal] that configures whether native ripples are used to draw the ripple effect
+ * inside components. If set to false, the ripples will be drawn inside Compose, consistent with
+ * the behavior in previous Compose releases. This is a temporary API, and will be removed when
+ * native ripples are stable in Compose.
+ *
+ * If you use this to avoid a bug with native ripples, please [file a bug](https://issuetracker.google.com/issues/new?component=612128)
+ */
+@get:ExperimentalRippleApi
+@ExperimentalRippleApi
+public val LocalRippleNativeRendering: ProvidableCompositionLocal<Boolean> =
+    staticCompositionLocalOf { true }
+
+/**
+ * Android specific [RippleIndicationInstance]. This uses a [RippleHostView] provided by
+ * [rippleContainer] to draw ripples in the drawing bounds provided within [drawIndication].
+ *
+ * The state layer is still handled by [drawStateLayer], and drawn inside Compose.
+ */
+internal class AndroidRippleIndicationInstance(
+    private val bounded: Boolean,
+    private val radius: Dp,
+    private val color: State<Color>,
+    private val rippleAlpha: State<RippleAlpha>,
+    private val rippleContainer: RippleContainer
+) : RippleIndicationInstance(bounded, rippleAlpha), RememberObserver {
+    /**
+     * Backing [RippleHostView] used to draw ripples for this [RippleIndicationInstance].
+     * [mutableStateOf] as we want changes to this to invalidate drawing, and cause us to draw /
+     * stop drawing a ripple.
+     */
+    private var rippleHostView: RippleHostView? by mutableStateOf(null)
+
+    /**
+     * State we use to cause invalidations in Compose when the drawable requests an invalidation -
+     * since we read this in the draw scope this is equivalent to manually invalidating the internal
+     * layer. This is needed as layers internal to the underlying LayoutNode, which we also
+     * cannot access from here.
+     */
+    private var invalidateTick by mutableStateOf(true)
+
+    /**
+     * Cache the size of the canvas we will draw the ripple into - this is updated each time
+     * [drawIndication] is called. This is needed as before we start animating the ripple, we
+     * need to know its size (changing the bounds mid-animation will cause us to continue the
+     * animation on the UI thread, not the render thread), but the size is only known inside the
+     * draw scope.
+     */
+    private var rippleSize: Size = Size.Zero
+
+    private var rippleRadius: Int = -1
+
+    /**
+     * Flip [invalidateTick] to cause a re-draw when the ripple requests invalidation.
+     */
+    private val onInvalidateRipple = {
+        invalidateTick = !invalidateTick
+    }
+
+    override fun ContentDrawScope.drawIndication() {
+        // Update size and radius properties needed by addRipple()
+
+        rippleSize = size
+
+        rippleRadius = if (radius.isUnspecified) {
+            // Explicitly calculate the radius instead of using RippleDrawable.RADIUS_AUTO
+            // since the latest spec does not match with the existing radius calculation in the
+            // framework.
+            getRippleEndRadius(bounded, size).roundToInt()
+        } else {
+            radius.roundToPx()
+        }
+
+        val color = color.value
+        val alpha = rippleAlpha.value.pressedAlpha
+
+        drawContent()
+        drawStateLayer(radius, color)
+        drawIntoCanvas { canvas ->
+            // Reading this ensures that we invalidate when the drawable requests invalidation
+            invalidateTick
+
+            rippleHostView?.run {
+                // We set these inside addRipple() already, but they may change during the ripple
+                // animation, so update them here too.
+                // Note that changes to color / alpha will not be reflected in any
+                // currently drawn ripples if the ripples are being drawn on the RenderThread,
+                // since only the software paint is updated, not the hardware paint used in
+                // RippleForeground.
+                updateRippleProperties(
+                    size = size,
+                    radius = rippleRadius,
+                    color = color,
+                    alpha = alpha
+                )
+
+                draw(canvas.nativeCanvas)
+            }
+        }
+    }
+
+    override fun addRipple(interaction: PressInteraction.Press, scope: CoroutineScope) {
+        rippleHostView = with(rippleContainer) {
+            getRippleHostView().apply {
+                addRipple(
+                    interaction = interaction,
+                    bounded = bounded,
+                    size = rippleSize,
+                    radius = rippleRadius,
+                    color = color.value,
+                    alpha = rippleAlpha.value.pressedAlpha,
+                    onInvalidateRipple = onInvalidateRipple
+                )
+            }
+        }
+    }
+
+    override fun removeRipple(interaction: PressInteraction.Press) {
+        rippleHostView?.removeRipple()
+    }
+
+    override fun onRemembered() {}
+
+    override fun onForgotten() {
+        dispose()
+    }
+
+    override fun onAbandoned() {
+        dispose()
+    }
+
+    private fun dispose() {
+        with(rippleContainer) {
+            disposeRippleIfNeeded()
+        }
+    }
+
+    /**
+     * Remove the reference to the existing host view, so we don't incorrectly draw if it is
+     * recycled and used by another [RippleIndicationInstance].
+     */
+    fun resetHostView() {
+        rippleHostView = null
+    }
+}
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
new file mode 100644
index 0000000..840f932
--- /dev/null
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleContainer.android.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.material.ripple
+
+import android.content.Context
+import android.view.ViewGroup
+
+/**
+ * A root-level container [ViewGroup] that manages creating and assigning [RippleHostView]s used
+ * throughout a Compose hierarchy. Each root Compose View that has components that use ripples
+ * inside will have a [RippleContainer] as a direct child.
+ */
+internal class RippleContainer(context: Context) : ViewGroup(context) {
+    /**
+     * Maximum number of [RippleHostView]s that will be allocated and added, limiting the total
+     * number of Views attached to the root Compose View.
+     */
+    private val MaxRippleHosts = 5
+
+    /**
+     * [RippleHostView]s that will be assigned to [AndroidRippleIndicationInstance]s when
+     * necessary.
+     */
+    private val rippleHosts = mutableListOf<RippleHostView>()
+
+    /**
+     * [RippleHostView]s that are not currently assigned to any
+     * [AndroidRippleIndicationInstance], so they can be reused without needing to allocate new
+     * instances.
+     */
+    private val unusedRippleHosts = mutableListOf<RippleHostView>()
+
+    private val rippleHostMap = RippleHostMap()
+
+    /**
+     * Index of the next host that will be assigned to a ripple
+     */
+    private var nextHostIndex = 0
+
+    init {
+        clipChildren = false
+
+        // Start by initially assigning one RippleHostView - we will allocate more when needed.
+        // We start by only assigning one to avoid creating a lot of unused Views for cases where
+        // there are multiple Compose roots inside a hierarchy, such as when putting Compose
+        // roots inside a RecyclerView.
+        val initialHostView = RippleHostView(context).also { addView(it) }
+        rippleHosts.add(initialHostView)
+        unusedRippleHosts.add(initialHostView)
+        // Since we now have an unused ripple host, the next index should be 1 - the unused host
+        // will be used first.
+        nextHostIndex = 1
+    }
+
+    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
+        // RippleHostViews don't partake in layout
+    }
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        // RippleHostViews don't partake in measurement
+        setMeasuredDimension(0, 0)
+    }
+
+    /**
+     * @return a [RippleHostView] for [this] [AndroidRippleIndicationInstance]. This result will
+     * be cached if possible, to allow re-using the same [RippleHostView].
+     */
+    fun AndroidRippleIndicationInstance.getRippleHostView(): RippleHostView {
+        val existingRippleHostView = rippleHostMap[this]
+        if (existingRippleHostView != null) {
+            return existingRippleHostView
+        }
+
+        // If we have an unused RippleHostView, use that before creating a new one
+        var rippleHostView = unusedRippleHosts.removeFirstOrNull()
+
+        if (rippleHostView == null) {
+            // If the next host is larger than the current index, we haven't reached maximum
+            // capacity yet and so we need to allocate a new RippleHostView
+            rippleHostView = if (nextHostIndex > rippleHosts.lastIndex) {
+                RippleHostView(context).also {
+                    // Add this host to the view hierarchy
+                    addView(it)
+                    // And add it to the list of hosts
+                    rippleHosts += it
+                }
+            } else {
+                // Otherwise we are looping through the current hosts and re-using an existing,
+                // un-disposed host
+                val host = rippleHosts[nextHostIndex]
+
+                // Since this host was re-used, and not in the unused host list, it may still be
+                // linked to an instance
+                val existingInstance = rippleHostMap[host]
+
+                // TODO: possible future optimization
+                //  Consider checking to see if the existing ripple is still drawing, and if so,
+                //  create a new RippleHostView one instead of reassigning
+                if (existingInstance != null) {
+                    existingInstance.resetHostView()
+                    rippleHostMap.remove(existingInstance)
+                    host.disposeRipple()
+                }
+                host
+            }
+
+            // Update the index for the next host - loop around if we reach the maximum capacity
+            if (nextHostIndex < MaxRippleHosts - 1) {
+                nextHostIndex++
+            } else {
+                nextHostIndex = 0
+            }
+        }
+
+        rippleHostMap[this] = rippleHostView
+
+        return rippleHostView
+    }
+
+    /**
+     * Unassigns the current [RippleHostView] from [this] [AndroidRippleIndicationInstance] and
+     * resets its state, so it can be used by another [AndroidRippleIndicationInstance].
+     */
+    fun AndroidRippleIndicationInstance.disposeRippleIfNeeded() {
+        resetHostView()
+        val rippleHost = rippleHostMap[this]
+
+        if (rippleHost != null) {
+            rippleHost.disposeRipple()
+            rippleHostMap.remove(this)
+            // This ripple host has been disposed, so it is safe to be re-used
+            unusedRippleHosts.add(rippleHost)
+        }
+    }
+}
+
+/**
+ * Simple bidirectional map for [AndroidRippleIndicationInstance] : [RippleHostView].
+ */
+private class RippleHostMap {
+    private val indicationToHostMap =
+        mutableMapOf<AndroidRippleIndicationInstance, RippleHostView>()
+    private val hostToIndicationMap =
+        mutableMapOf<RippleHostView, AndroidRippleIndicationInstance>()
+
+    operator fun set(
+        indicationInstance: AndroidRippleIndicationInstance,
+        rippleHostView: RippleHostView
+    ) {
+        indicationToHostMap[indicationInstance] = rippleHostView
+        hostToIndicationMap[rippleHostView] = indicationInstance
+    }
+
+    operator fun get(indicationInstance: AndroidRippleIndicationInstance): RippleHostView? {
+        return indicationToHostMap[indicationInstance]
+    }
+
+    operator fun get(rippleHostView: RippleHostView): AndroidRippleIndicationInstance? {
+        return hostToIndicationMap[rippleHostView]
+    }
+
+    fun remove(indicationInstance: AndroidRippleIndicationInstance) {
+        indicationToHostMap[indicationInstance]?.let { hostToIndicationMap.remove(it) }
+        indicationToHostMap.remove(indicationInstance)
+    }
+}
diff --git a/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt
new file mode 100644
index 0000000..b873c89
--- /dev/null
+++ b/compose/material/material-ripple/src/androidMain/kotlin/androidx/compose/material/ripple/RippleHostView.android.kt
@@ -0,0 +1,336 @@
+/*
+ * 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.material.ripple
+
+import android.content.Context
+import android.content.res.ColorStateList
+import android.graphics.Rect
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.RippleDrawable
+import android.os.Build
+import android.view.View
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.geometry.toRect
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toAndroidRect
+import androidx.compose.ui.graphics.toArgb
+import java.lang.reflect.Method
+
+/**
+ * Empty [View] that hosts a [RippleDrawable] as its background. This is needed as
+ * [RippleDrawable]s cannot currently be drawn directly to a [android.graphics.RenderNode]
+ * (b/184760109), so instead we rely on [View]'s internal implementation to draw to the
+ * background [android.graphics.RenderNode].
+ *
+ * A [RippleContainer] is used to manage and assign RippleHostViews when needed - see
+ * [RippleContainer.getRippleHostView].
+ */
+internal class RippleHostView(
+    context: Context
+) : View(context) {
+    /**
+     * View related configuration
+     */
+
+    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+        setMeasuredDimension(0, 0)
+    }
+
+    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
+        // noop
+    }
+
+    override fun refreshDrawableState() {
+        // We don't want the View to manage the drawable state, so avoid updating the ripple's
+        // state (via View.mBackground) when we lose window focus, or other events.
+    }
+
+    /**
+     * A [RippleDrawable] cannot be dynamically changed between bounded / unbounded states - as a
+     * result we need to create a new instance when we need to draw a different type.
+     * Alternatively we could maintain both a bounded and unbounded instance, but we would still
+     * need to reset state for both, and change what the view's background is - so it doesn't
+     * help us out that much.
+     */
+    private var ripple: UnprojectedRipple? = null
+    private var bounded: Boolean? = null
+
+    /**
+     * Creates a new [UnprojectedRipple] and assigns it to [ripple].
+     *
+     * @param bounded whether the [UnprojectedRipple] is bounded (fills the bounds of the
+     * containing canvas, or unbounded (starts from the center of the canvas and fills outwards
+     * in a circle that may go outside the bounds of the canvas).
+     */
+    private fun createRipple(bounded: Boolean) {
+        ripple = UnprojectedRipple(bounded).apply {
+            // Set the ripple to be the view's background - this will internally set the ripple's
+            // Drawable.Callback callback to equal this view so there is no need to manage this
+            // separately.
+            background = this
+        }
+    }
+
+    /**
+     * Callback invoked when the underlying [RippleDrawable] requests to be
+     * invalidated - this callback should end up triggering a re-draw in the owning ripple instance.
+     */
+    private var onInvalidateRipple: (() -> Unit)? = null
+
+    /**
+     * Pass through any drawable invalidations to the owning ripple instance - the normal
+     * [View.invalidate] circuitry won't trigger a re-draw / re-composition inside of Compose out
+     * of the box.
+     */
+    override fun invalidateDrawable(who: Drawable) {
+        onInvalidateRipple?.invoke()
+    }
+
+    /**
+     * Adds and starts drawing a ripple with the provided properties.
+     *
+     * @param onInvalidateRipple callback invoked when the ripple requests an invalidation
+     */
+    fun addRipple(
+        interaction: PressInteraction.Press,
+        bounded: Boolean,
+        size: Size,
+        radius: Int,
+        color: Color,
+        alpha: Float,
+        onInvalidateRipple: () -> Unit
+    ) {
+        // Create a new ripple if there is no existing ripple, or bounded has changed.
+        // (Since this.bounded is initialized to `null`, technically the first check isn't
+        // needed, but it might not survive refactoring).
+        if (ripple == null || bounded != this.bounded) {
+            createRipple(bounded)
+            this.bounded = bounded
+        }
+        val ripple = ripple!!
+        this.onInvalidateRipple = onInvalidateRipple
+        updateRippleProperties(size, radius, color, alpha)
+        if (bounded) {
+            // Bounded ripples should animate from the press position
+            ripple.setHotspot(interaction.pressPosition.x, interaction.pressPosition.y)
+        } else {
+            // Unbounded ripples should animate from the center of the ripple - in the framework
+            // this change in spec was never made, so they currently animate from the press
+            // position into a circle that starts at the center of the ripple, instead of
+            // starting directly at the center.
+            ripple.setHotspot(
+                ripple.bounds.centerX().toFloat(),
+                ripple.bounds.centerY().toFloat()
+            )
+        }
+        ripple.state = PressedState
+    }
+
+    /**
+     * Removes the most recent ripple, causing it to start the 'end' animation. Note that this is
+     * separate from immediately cancelling existing ripples - see [disposeRipple].
+     */
+    fun removeRipple() {
+        ripple?.state = RestingState
+    }
+
+    /**
+     * Update the underlying [RippleDrawable] with the new properties. Note that changes to
+     * [size] or [radius] while a ripple is animating will cause the animation to move to the UI
+     * thread, so it is important to also provide the correct values in [addRipple].
+     */
+    fun updateRippleProperties(
+        size: Size,
+        radius: Int,
+        color: Color,
+        alpha: Float
+    ) {
+        val ripple = ripple ?: return
+        // NOTE: if adding new properties here, make sure they are guarded with an equality check
+        // (either here or internally in RippleDrawable). Many properties invalidate the ripple when
+        // changed, which will lead to a call to updateRippleProperties again, which will cause
+        // another invalidation, etc.
+        ripple.trySetRadius(radius)
+        ripple.setColor(color, alpha)
+        val newBounds = size.toRect().toAndroidRect()
+        // Drawing the background causes the view to update the bounds of the drawable
+        // based on the view's bounds, so we need to adjust the view itself to match the
+        // canvas' bounds.
+        // These setters will no-op if there is no change, so no need for us to check for equality
+        left = newBounds.left
+        top = newBounds.top
+        right = newBounds.right
+        bottom = newBounds.bottom
+        ripple.bounds = newBounds
+    }
+
+    /**
+     * Remove existing callbacks and clear any currently drawing ripples.
+     */
+    fun disposeRipple() {
+        onInvalidateRipple = null
+        val ripple = ripple ?: return
+        ripple.state = RestingState
+        ripple.setVisible(false, false)
+        unscheduleDrawable(ripple)
+    }
+
+    companion object {
+        private val PressedState = intArrayOf(
+            android.R.attr.state_pressed,
+            android.R.attr.state_enabled
+        )
+        private val RestingState = intArrayOf()
+    }
+}
+
+/**
+ * [RippleDrawable] that always returns `false` for [isProjected], so that it will always be drawn
+ * in the owning [View]'s RenderNode, and not an ancestor node. This is only meaningful if the
+ * owning [View]'s drawing is not clipped, which it won't be in Compose, so we can always return
+ * `false` and just draw outside of the bounds if we need to.
+ */
+private class UnprojectedRipple(private val bounded: Boolean) : RippleDrawable(
+    // Temporary default color that we will override later
+    /* color */ ColorStateList.valueOf(android.graphics.Color.BLACK),
+    /* content */null,
+    // The color of the mask here doesn't matter - we just need a mask to draw the bounded ripple
+    // against
+    /* mask */ if (bounded) ColorDrawable(android.graphics.Color.WHITE) else null
+) {
+    /**
+     * Store the ripple color so we can compare it later, as there is no way to get the currently
+     * set color on the RippleDrawable itself.
+     */
+    private var rippleColor: Color? = null
+
+    /**
+     * Store the ripple radius so we can compare it later - [getRadius] is only available on M+,
+     * and we don't want to use reflection to read this below that.
+     */
+    private var rippleRadius: Int? = null
+
+    /**
+     * Set a new [color] with [alpha] for this [RippleDrawable].
+     */
+    fun setColor(color: Color, alpha: Float) {
+        val newColor = calculateRippleColor(color, alpha)
+        if (rippleColor != newColor) {
+            rippleColor = newColor
+            setColor(ColorStateList.valueOf(newColor.toArgb()))
+        }
+    }
+
+    private var projected = false
+
+    /**
+     * Return false (other than when calculating dirty bounds, see [getDirtyBounds]) to ensure
+     * that this [RippleDrawable] will be drawn inside the owning [View]'s RenderNode, and not an
+     * ancestor that supports projection.
+     */
+    override fun isProjected(): Boolean {
+        return projected
+    }
+
+    /**
+     * On older API levels [isProjected] is used to control whether the dirty bounds (and hence
+     * how the ripple is clipped) are bounded / unbounded. Since we turn off projection for this
+     * ripple, if the ripple is unbounded we temporarily set isProjected to return true, so the
+     * super implementation will return us the correct bounds for an unbounded ripple.
+     */
+    override fun getDirtyBounds(): Rect {
+        if (!bounded) {
+            projected = true
+        }
+        val bounds = super.getDirtyBounds()
+        projected = false
+        return bounds
+    }
+
+    /**
+     * Compat wrapper for [setRadius] which is only available on [Build.VERSION_CODES.M] and
+     * above. This will try to call setMaxRadius below that if possible.
+     */
+    fun trySetRadius(radius: Int) {
+        if (rippleRadius != radius) {
+            rippleRadius = radius
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+                try {
+                    if (!setMaxRadiusFetched) {
+                        setMaxRadiusFetched = true
+                        setMaxRadiusMethod = RippleDrawable::class.java.getDeclaredMethod(
+                            "setMaxRadius",
+                            Int::class.javaPrimitiveType
+                        )
+                    }
+                    setMaxRadiusMethod?.invoke(this, radius)
+                } catch (e: Exception) {
+                    // Fail silently
+                }
+            } else {
+                MRadiusHelper.setRadius(this, radius)
+            }
+        }
+    }
+
+    /**
+     * Calculates the resulting [Color] from [color] with [alpha] applied, accounting for
+     * differences in [RippleDrawable]'s behavior on different API levels.
+     */
+    private fun calculateRippleColor(color: Color, alpha: Float): Color {
+        // On API 21-27 the ripple animation is split into two sections - an overlay and an
+        // animation on top - and 50% of the original alpha is used for both. Since these sections
+        // don't always overlap, the actual alpha of the animation in parts can be 50% of the
+        // original amount, so to ensure that the contrast is correct, and make the ripple alpha
+        // match more closely with the provided value, we double it first.
+        // Note that this is also consistent with MDC behavior.
+        val transformedAlpha = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
+            alpha * 2
+        } else {
+            // Note: above 28 the ripple alpha is clamped to 50%, so this might not be the
+            // _actual_ alpha that is used in the ripple.
+            alpha
+        }
+        return color.copy(alpha = transformedAlpha)
+    }
+
+    /**
+     * Separate class to avoid verification errors for methods introduced in M.
+     */
+    @RequiresApi(Build.VERSION_CODES.M)
+    private object MRadiusHelper {
+        /**
+         * Sets the [radius] for the given [ripple].
+         */
+        @DoNotInline
+        fun setRadius(ripple: RippleDrawable, radius: Int) {
+            ripple.radius = radius
+        }
+    }
+
+    companion object {
+        /**
+         * Cache RippleDrawable#setMaxRadius to avoid retrieving it more times than necessary
+         */
+        private var setMaxRadiusMethod: Method? = null
+        private var setMaxRadiusFetched = false
+    }
+}
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt
new file mode 100644
index 0000000..5e2fda1
--- /dev/null
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/CommonRipple.kt
@@ -0,0 +1,118 @@
+/*
+ * 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.material.ripple
+
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.RememberObserver
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateMapOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
+import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.unit.Dp
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+/**
+ * Common Ripple implementation that directly animates and draws to the underlying canvas
+ * provided by [ContentDrawScope].
+ *
+ * @see Ripple
+ */
+@Stable
+internal class CommonRipple(
+    bounded: Boolean,
+    radius: Dp,
+    color: State<Color>
+) : Ripple(bounded, radius, color) {
+    @Composable
+    override fun rememberUpdatedRippleInstance(
+        interactionSource: InteractionSource,
+        bounded: Boolean,
+        radius: Dp,
+        color: State<Color>,
+        rippleAlpha: State<RippleAlpha>
+    ): RippleIndicationInstance {
+        return remember(interactionSource, this) {
+            CommonRippleIndicationInstance(bounded, radius, color, rippleAlpha)
+        }
+    }
+}
+
+internal class CommonRippleIndicationInstance constructor(
+    private val bounded: Boolean,
+    private val radius: Dp,
+    private val color: State<Color>,
+    private val rippleAlpha: State<RippleAlpha>
+) : RippleIndicationInstance(bounded, rippleAlpha), RememberObserver {
+    private val ripples = mutableStateMapOf<PressInteraction.Press, RippleAnimation>()
+
+    override fun ContentDrawScope.drawIndication() {
+        val color = color.value
+        drawContent()
+        drawStateLayer(radius, color)
+        drawRipples(color)
+    }
+
+    override fun addRipple(interaction: PressInteraction.Press, scope: CoroutineScope) {
+        // Finish existing ripples
+        ripples.forEach { (_, ripple) -> ripple.finish() }
+        val origin = if (bounded) interaction.pressPosition else null
+        val rippleAnimation = RippleAnimation(
+            origin = origin,
+            radius = radius,
+            bounded = bounded
+        )
+        ripples[interaction] = rippleAnimation
+        scope.launch {
+            try {
+                rippleAnimation.animate()
+            } finally {
+                ripples.remove(interaction)
+            }
+        }
+    }
+
+    override fun removeRipple(interaction: PressInteraction.Press) {
+        ripples[interaction]?.finish()
+    }
+
+    private fun DrawScope.drawRipples(color: Color) {
+        ripples.forEach { (_, ripple) ->
+            with(ripple) {
+                val alpha = rippleAlpha.value.pressedAlpha
+                if (alpha != 0f) {
+                    draw(color.copy(alpha = alpha))
+                }
+            }
+        }
+    }
+
+    override fun onRemembered() {}
+
+    override fun onForgotten() {
+        ripples.clear()
+    }
+
+    override fun onAbandoned() {
+        ripples.clear()
+    }
+}
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
index 466ead1..990d1d3 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
@@ -20,22 +20,19 @@
 import androidx.compose.animation.core.AnimationSpec
 import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.TweenSpec
-import androidx.compose.foundation.interaction.DragInteraction
 import androidx.compose.foundation.Indication
 import androidx.compose.foundation.IndicationInstance
+import androidx.compose.foundation.interaction.DragInteraction
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.InteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.RememberObserver
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
-import androidx.compose.runtime.mutableStateMapOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.ContentDrawScope
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.clipRect
 import androidx.compose.ui.graphics.isSpecified
@@ -82,7 +79,7 @@
 ): Indication {
     val colorState = rememberUpdatedState(color)
     return remember(bounded, radius) {
-        Ripple(bounded, radius, colorState)
+        PlatformRipple(bounded, radius, colorState)
     }
 }
 
@@ -102,15 +99,19 @@
  *
  * You can also explicitly create a Ripple and provide it to components in order to change the
  * parameters from the default, such as to create an unbounded ripple with a fixed size.
+ *
+ * Ripple is provided on different platforms using [PlatformRipple].
  */
 @Stable
-private class Ripple(
+internal abstract class Ripple(
     private val bounded: Boolean,
     private val radius: Dp,
-    private val color: State<Color>,
+    private val color: State<Color>
 ) : Indication {
     @Composable
-    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {
+    final override fun rememberUpdatedInstance(
+        interactionSource: InteractionSource
+    ): IndicationInstance {
         val theme = LocalRippleTheme.current
         val color = rememberUpdatedState(
             if (color.value.isSpecified) {
@@ -120,30 +121,40 @@
             }
         )
         val rippleAlpha = rememberUpdatedState(theme.rippleAlpha())
-        val instance = remember(interactionSource, this) {
-            RippleIndicationInstance(bounded, radius, color, rippleAlpha)
-        }
-        LaunchedEffect(interactionSource, instance) {
+
+        val instance = rememberUpdatedRippleInstance(
+            interactionSource,
+            bounded,
+            radius,
+            color,
+            rippleAlpha
+        )
+
+        LaunchedEffect(instance, interactionSource) {
             interactionSource.interactions.collect { interaction ->
                 when (interaction) {
-                    is PressInteraction.Press -> {
-                        instance.addRipple(interaction, this)
-                    }
-                    is PressInteraction.Release -> {
-                        instance.removeRipple(interaction.press)
-                    }
-                    is PressInteraction.Cancel -> {
-                        instance.removeRipple(interaction.press)
-                    }
+                    is PressInteraction.Press -> instance.addRipple(interaction, this)
+                    is PressInteraction.Release -> instance.removeRipple(interaction.press)
+                    is PressInteraction.Cancel -> instance.removeRipple(interaction.press)
                     else -> instance.updateStateLayer(interaction, this)
                 }
             }
         }
+
         return instance
     }
 
-    // to force stability on this indication we need equals and hashcode, there's no value in
-    // making this class to be "data class"
+    @Composable
+    abstract fun rememberUpdatedRippleInstance(
+        interactionSource: InteractionSource,
+        bounded: Boolean,
+        radius: Dp,
+        color: State<Color>,
+        rippleAlpha: State<RippleAlpha>
+    ): RippleIndicationInstance
+
+    // To force stability on this Ripple we need equals and hashcode, there's no value in
+    // making this class to be a `data class`
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is Ripple) return false
@@ -163,73 +174,41 @@
     }
 }
 
-private class RippleIndicationInstance constructor(
-    private val bounded: Boolean,
-    private val radius: Dp,
-    private val color: State<Color>,
-    private val rippleAlpha: State<RippleAlpha>
-) : RememberObserver, IndicationInstance {
+/**
+ * Platform-specific implementation of [Ripple]. This is needed as expect classes cannot
+ * (currently) have default implementations, otherwise we would make [Ripple] the expect class.
+ */
+@Stable
+internal expect class PlatformRipple(
+    bounded: Boolean,
+    radius: Dp,
+    color: State<Color>
+) : Ripple
 
+/**
+ * Abstract [IndicationInstance] that provides common functionality used by [PlatformRipple]
+ * implementations. Implementing classes should call [drawStateLayer] to draw the [StateLayer], so
+ * they only need to handle showing the ripple effect when pressed, and not other [Interaction]s.
+ */
+internal abstract class RippleIndicationInstance(
+    bounded: Boolean,
+    rippleAlpha: State<RippleAlpha>
+) : IndicationInstance {
     private val stateLayer = StateLayer(bounded, rippleAlpha)
 
-    private val ripples = mutableStateMapOf<PressInteraction.Press, RippleAnimation>()
+    abstract fun addRipple(interaction: PressInteraction.Press, scope: CoroutineScope)
 
-    override fun ContentDrawScope.drawIndication() {
-        val color = color.value
-        drawContent()
-        with(stateLayer) {
-            drawStateLayer(radius, color)
-        }
-        drawRipples(color)
-    }
+    abstract fun removeRipple(interaction: PressInteraction.Press)
 
-    fun addRipple(interaction: PressInteraction.Press, scope: CoroutineScope) {
-        // Finish existing ripples
-        ripples.forEach { (_, ripple) -> ripple.finish() }
-        val origin = if (bounded) interaction.pressPosition else null
-        val rippleAnimation = RippleAnimation(
-            origin = origin,
-            radius = radius,
-            bounded = bounded
-        )
-        ripples[interaction] = rippleAnimation
-        scope.launch {
-            try {
-                rippleAnimation.animate()
-            } finally {
-                ripples.remove(interaction)
-            }
-        }
-    }
-
-    fun updateStateLayer(interaction: Interaction, scope: CoroutineScope) {
+    internal fun updateStateLayer(interaction: Interaction, scope: CoroutineScope) {
         stateLayer.handleInteraction(interaction, scope)
     }
 
-    fun removeRipple(interaction: PressInteraction.Press) {
-        ripples[interaction]?.finish()
-    }
-
-    private fun DrawScope.drawRipples(color: Color) {
-        ripples.forEach { (_, ripple) ->
-            with(ripple) {
-                val alpha = rippleAlpha.value.pressedAlpha
-                if (alpha != 0f) {
-                    draw(color.copy(alpha = alpha))
-                }
-            }
+    fun DrawScope.drawStateLayer(radius: Dp, color: Color) {
+        with(stateLayer) {
+            drawStateLayer(radius, color)
         }
     }
-
-    override fun onRemembered() {}
-
-    override fun onForgotten() {
-        ripples.clear()
-    }
-
-    override fun onAbandoned() {
-        ripples.clear()
-    }
 }
 
 /**
diff --git a/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt b/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt
new file mode 100644
index 0000000..7dce6e6
--- /dev/null
+++ b/compose/material/material-ripple/src/desktopMain/kotlin/androidx/compose/material/ripple/Ripple.desktop.kt
@@ -0,0 +1,23 @@
+// ktlint-disable filename
+/*
+ * 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.material.ripple
+
+/**
+ * Desktop ripple implementation using the Compose-rendered [CommonRipple] implementation.
+ */
+internal actual typealias PlatformRipple = CommonRipple
diff --git a/compose/material/material/api/1.0.0-beta06.txt b/compose/material/material/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..7cedeb6
--- /dev/null
+++ b/compose/material/material/api/1.0.0-beta06.txt
@@ -0,0 +1,603 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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 BottomNavigationDefaults {
+    method public float getElevation-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-TlzqArY(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-_fH6D24(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();
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation-ioHfwGI(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-opHSmBI(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-n9X6i6U(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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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-D9Ej5fM();
+    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-R8aI8sA(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 Tab-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/api/1.0.0-beta07.txt b/compose/material/material/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..7cedeb6
--- /dev/null
+++ b/compose/material/material/api/1.0.0-beta07.txt
@@ -0,0 +1,603 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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 BottomNavigationDefaults {
+    method public float getElevation-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-TlzqArY(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-_fH6D24(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();
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation-ioHfwGI(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-opHSmBI(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-n9X6i6U(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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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-D9Ej5fM();
+    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-R8aI8sA(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 Tab-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/api/public_plus_experimental_1.0.0-beta06.txt b/compose/material/material/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..ab08c2c
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,788 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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-hO0kuRE(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;
+  }
+
+  @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-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-0Ttp7_s(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 androidx.compose.material.FabPosition 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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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--6CoO6E(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-TlzqArY(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-_fH6D24(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();
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable 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-ioHfwGI(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-opHSmBI(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-n9X6i6U(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 @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable 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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-dpadJcU(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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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);
+  }
+
+  @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-D9Ej5fM();
+    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-827DgyA(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-R8aI8sA(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.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void LeadingIconTab-PWX9des(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-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/api/public_plus_experimental_1.0.0-beta07.txt b/compose/material/material/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..ab08c2c
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,788 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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-hO0kuRE(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;
+  }
+
+  @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-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-0Ttp7_s(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 androidx.compose.material.FabPosition 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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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--6CoO6E(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-TlzqArY(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-_fH6D24(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();
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable 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-ioHfwGI(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-opHSmBI(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-n9X6i6U(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 @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable 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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-dpadJcU(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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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);
+  }
+
+  @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-D9Ej5fM();
+    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-827DgyA(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-R8aI8sA(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.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void LeadingIconTab-PWX9des(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-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/api/res-1.0.0-beta06.txt b/compose/material/material/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material/api/res-1.0.0-beta06.txt
diff --git a/compose/material/material/api/res-1.0.0-beta07.txt b/compose/material/material/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/material/material/api/res-1.0.0-beta07.txt
diff --git a/compose/material/material/api/restricted_1.0.0-beta06.txt b/compose/material/material/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..7cedeb6
--- /dev/null
+++ b/compose/material/material/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,603 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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 BottomNavigationDefaults {
+    method public float getElevation-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-TlzqArY(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-_fH6D24(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();
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation-ioHfwGI(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-opHSmBI(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-n9X6i6U(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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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-D9Ej5fM();
+    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-R8aI8sA(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 Tab-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/api/restricted_1.0.0-beta07.txt b/compose/material/material/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..7cedeb6
--- /dev/null
+++ b/compose/material/material/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,603 @@
+// 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--HzSArw(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-PPVLV-g(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-jyMeD6A(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-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation-D9Ej5fM();
+    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-EMTaL0E(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-QjfF_Us(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);
+    method @androidx.compose.runtime.Composable public static void TopAppBar-_azMXew(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);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor-0d7_KjU();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight-D9Ej5fM();
+    method public float getPeekHeight-D9Ej5fM();
+    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 BottomNavigationDefaults {
+    method public float getElevation-D9Ej5fM();
+    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-ye6PvEY(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-g7W06kY(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-D9Ej5fM();
+    method public float getSheetPeekHeight-D9Ej5fM();
+    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-nlx5xbs(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation-qYQSm_w(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize-D9Ej5fM();
+    method public float getIconSpacing-D9Ej5fM();
+    method public float getMinHeight-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize-D9Ej5fM();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors-xS_xkl8(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors-xS_xkl8(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-IHU7g64(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-QGkLkJU(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 {
+    method public androidx.compose.material.Colors copy-7EMdAJ8(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-0d7_KjU();
+    method public long getError-0d7_KjU();
+    method public long getOnBackground-0d7_KjU();
+    method public long getOnError-0d7_KjU();
+    method public long getOnPrimary-0d7_KjU();
+    method public long getOnSecondary-0d7_KjU();
+    method public long getOnSurface-0d7_KjU();
+    method public long getPrimary-0d7_KjU();
+    method public long getPrimaryVariant-0d7_KjU();
+    method public long getSecondary-0d7_KjU();
+    method public long getSecondaryVariant-0d7_KjU();
+    method public long getSurface-0d7_KjU();
+    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 @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor-8_81llA(long backgroundColor);
+    method public static long contentColorFor-pz-ABmo(androidx.compose.material.Colors, long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors-hW7iGhc(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-hW7iGhc(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();
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+  }
+
+  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-JRSVyrs(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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-TlzqArY(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-_fH6D24(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();
+  }
+
+  public enum FabPosition {
+    enum_constant public static final androidx.compose.material.FabPosition Center;
+    enum_constant public static final androidx.compose.material.FabPosition End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation-ioHfwGI(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-opHSmBI(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-n9X6i6U(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-8NTYWNk(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon-BG621w0(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-hGAziDE(androidx.compose.ui.graphics.ImageBitmap bitmap, 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 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-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public long getScrimColor-0d7_KjU();
+    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 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.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.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth-D9Ej5fM();
+    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-vFL-O2w(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator-y0SQU_c(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-BeBJghs(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator-kLDug40(float progress, 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-xS_xkl8(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-axyFlp8(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 androidx.compose.material.FabPosition 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-kU-unao(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-0d7_KjU();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor-0d7_KjU();
+    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-GiTsVJ0(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-Ou9cdGU(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 SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface-IHU7g64(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-D9Ej5fM();
+    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-R8aI8sA(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 Tab-TC9MJzw(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-wUuQ7UU(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-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getWidth-D9Ej5fM();
+    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-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator-Z-uBYeE(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness-D9Ej5fM();
+    method public float getIndicatorHeight-D9Ej5fM();
+    method public float getScrollableTabRowPadding-D9Ej5fM();
+    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-qhCAd8w(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-xUsefZ0(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-D9Ej5fM();
+    method public float getMinWidth-D9Ej5fM();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors-LWDMS30(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-LWDMS30(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-TPAwlIA(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 androidx.compose.ui.text.style.TextOverflow 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 @androidx.compose.runtime.Composable public static void Text-Vh6c2nE(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 androidx.compose.ui.text.style.TextOverflow 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 public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> getLocalTextStyle();
+  }
+
+  @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 {
+  }
+
+}
+
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
index f610771..dec4d18 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsBenchmark.kt
@@ -53,10 +53,7 @@
 
     @Test
     fun first_compose() {
-        benchmarkRule.benchmarkFirstCompose(
-            checkboxCaseFactory,
-            assertNoPendingRecompositions = false
-        )
+        benchmarkRule.benchmarkFirstCompose(checkboxCaseFactory)
     }
 
     @Test
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
index 979074bc6..cff4cc2 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/CheckboxesInRowsTestCase.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -38,24 +38,29 @@
  */
 class CheckboxesInRowsTestCase(
     private val amountOfCheckboxes: Int
-) : ComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val states = mutableListOf<MutableState<Boolean>>()
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
+        Column {
+            repeat(amountOfCheckboxes) {
+                Row {
+                    Text(text = "Check Me!")
+                    CheckboxWithState(
+                        Modifier.weight(1f).wrapContentSize(Alignment.CenterEnd)
+                    )
+                }
+            }
+        }
+    }
+
+    @Composable
+    override fun ContentWrappers(content: () -> Unit) {
         MaterialTheme {
             Surface {
-                Column {
-                    repeat(amountOfCheckboxes) {
-                        Row {
-                            Text(text = "Check Me!")
-                            CheckboxWithState(
-                                Modifier.weight(1f).wrapContentSize(Alignment.CenterEnd)
-                            )
-                        }
-                    }
-                }
+                content()
             }
         }
     }
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
index 4a33072..8cf50ec 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/RadioGroupBenchmark.kt
@@ -24,7 +24,7 @@
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
 import androidx.compose.testutils.benchmark.benchmarkFirstCompose
@@ -57,7 +57,7 @@
 
     @Test
     fun first_compose() {
-        benchmarkRule.benchmarkFirstCompose(radioCaseFactory, assertNoPendingRecompositions = false)
+        benchmarkRule.benchmarkFirstCompose(radioCaseFactory)
     }
 
     @Test
@@ -99,7 +99,7 @@
     }
 }
 
-internal class RadioGroupTestCase : ComposeTestCase, ToggleableTestCase {
+internal class RadioGroupTestCase : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val radiosCount = 10
     private val options = (0 until radiosCount).toList()
@@ -110,25 +110,30 @@
     }
 
     @Composable
-    override fun Content() {
-        MaterialTheme {
-            Column {
-                options.forEach { item ->
-                    Row(
-                        modifier = Modifier.selectable(
-                            selected = (select.value == item),
-                            onClick = { select.value = item }
-                        ),
-                        verticalAlignment = Alignment.CenterVertically
-                    ) {
-                        Text(item.toString())
-                        RadioButton(
-                            selected = (select.value == item),
-                            onClick = { select.value = item }
-                        )
-                    }
+    override fun MeasuredContent() {
+        Column {
+            options.forEach { item ->
+                Row(
+                    modifier = Modifier.selectable(
+                        selected = (select.value == item),
+                        onClick = { select.value = item }
+                    ),
+                    verticalAlignment = Alignment.CenterVertically
+                ) {
+                    Text(item.toString())
+                    RadioButton(
+                        selected = (select.value == item),
+                        onClick = { select.value = item }
+                    )
                 }
             }
         }
     }
+
+    @Composable
+    override fun ContentWrappers(content: @Composable () -> Unit) {
+        MaterialTheme {
+            content()
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
index 339de17..cba9169 100644
--- a/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
+++ b/compose/material/material/benchmark/src/androidTest/java/androidx/compose/material/benchmark/TextInColumnSizeToggleTestCase.kt
@@ -22,7 +22,7 @@
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.testutils.ToggleableTestCase
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.unit.sp
@@ -35,23 +35,28 @@
  */
 class TextInColumnSizeToggleTestCase(
     private val numberOfTexts: Int
-) : ComposeTestCase, ToggleableTestCase {
+) : LayeredComposeTestCase(), ToggleableTestCase {
 
     private val fontSize = mutableStateOf(20.sp)
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
+        Column {
+            repeat(numberOfTexts) {
+                // 32-character text to match dashboards
+                Text(
+                    "Hello World Hello World Hello W",
+                    style = TextStyle(fontSize = fontSize.value)
+                )
+            }
+        }
+    }
+
+    @Composable
+    override fun ContentWrappers(content: @Composable () -> Unit) {
         MaterialTheme {
             Surface {
-                Column {
-                    repeat(numberOfTexts) {
-                        // 32-character text to match dashboards
-                        Text(
-                            "Hello World Hello World Hello W",
-                            style = TextStyle(fontSize = fontSize.value)
-                        )
-                    }
-                }
+                content()
             }
         }
     }
diff --git a/compose/material/material/build.gradle b/compose/material/material/build.gradle
index dbc14ae..b7f40da 100644
--- a/compose/material/material/build.gradle
+++ b/compose/material/material/build.gradle
@@ -61,8 +61,8 @@
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
         androidTestImplementation(JUNIT)
         androidTestImplementation(TRUTH)
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
         androidTestImplementation(MOCKITO_KOTLIN, {
             exclude group: "org.mockito" // to keep control on the mockito version
         })
@@ -120,8 +120,8 @@
                 implementation(ANDROIDX_TEST_RUNNER)
                 implementation(JUNIT)
                 implementation(TRUTH)
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
                 implementation(MOCKITO_KOTLIN, {
                     exclude group: "org.mockito" // to keep control on the mockito version
                 })
diff --git a/compose/material/material/icons/README.md b/compose/material/material/icons/README.md
index 262b1cb..10e744a 100644
--- a/compose/material/material/icons/README.md
+++ b/compose/material/material/icons/README.md
@@ -1,11 +1,12 @@
 # Material Iconography
 
 ## Modules / components
-Material iconography is split across three modules:
+Material iconography is split across these modules:
 
  1. The `generator` module, in `generator/` - this module processes and generates Kotlin source files as part of the build step of the other modules. This module is not shipped as an artifact, and caches its outputs based on the input icons (found in `generator/raw-icons`).
  2. `material-icons-core` , in `core/` - this module contains _core_ icons, the set of most-commonly-used icons used by applications, including the icons that are required by Material components themselves, such as the menu icon. This module is fairly small and is depended on by `material`.
  3. `material-icons-extended`, in `extended/` - this module contains every icon that is not in `material-icons-core`, and has a transitive `api` dependency on `material-icons-core`, so depending on this module will provide every single Material icon (over 5000 at the time of writing). Due to the excessive size of this module, this module should ***NOT*** be included as a direct dependency of any other library, and should only be used if Proguard / R8 is enabled.
+ 4. `material-icons-extended-$theme`, in `extended/` - these modules each contain a specific theme from material-icons-extended, to facilitate compiling the icon soure files more quickly in parallel
 
 ## Icon Generation
 
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconProcessor.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconProcessor.kt
index c76da9e..abacdc5 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconProcessor.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/IconProcessor.kt
@@ -47,9 +47,10 @@
  * icons in [iconDirectory].
  */
 class IconProcessor(
-    private val iconDirectory: File,
+    private val iconDirectories: List<File>,
     private val expectedApiFile: File,
-    private val generatedApiFile: File
+    private val generatedApiFile: File,
+    private val verifyApi: Boolean = true
 ) {
     /**
      * @return a list of processed [Icon]s, from the given [iconDirectory].
@@ -57,15 +58,17 @@
     fun process(): List<Icon> {
         val icons = loadIcons()
 
-        ensureIconsExistInAllThemes(icons)
-        writeApiFile(icons, generatedApiFile)
-        checkApi(expectedApiFile, generatedApiFile)
+        if (verifyApi) {
+            ensureIconsExistInAllThemes(icons)
+            writeApiFile(icons, generatedApiFile)
+            checkApi(expectedApiFile, generatedApiFile)
+        }
 
         return icons
     }
 
     private fun loadIcons(): List<Icon> {
-        val themeDirs = iconDirectory.listFiles()!!.filter { it.isDirectory }
+        val themeDirs = iconDirectories
 
         return themeDirs.flatMap { dir ->
             val theme = dir.name.toIconTheme()
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
index f8f12e3..530d481 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
@@ -22,13 +22,16 @@
 import com.android.build.gradle.api.BaseVariant
 import org.gradle.api.DefaultTask
 import org.gradle.api.Project
+import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputDirectory
 import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.Optional
 import org.gradle.api.tasks.OutputDirectory
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.PathSensitive
 import org.gradle.api.tasks.PathSensitivity
 import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.Internal
 import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
 import java.io.File
@@ -37,16 +40,37 @@
  * Base [org.gradle.api.Task] for tasks relating to icon generation.
  */
 abstract class IconGenerationTask : DefaultTask() {
+
     /**
      * Directory containing raw drawables. These icons will be processed to generate programmatic
      * representations.
      */
     @PathSensitive(PathSensitivity.RELATIVE)
     @InputDirectory
-    val iconDirectory =
+    val allIconsDirectory =
         project.rootProject.project(GeneratorProject).projectDir.resolve("raw-icons")
 
     /**
+     * Specific theme to generate icons for, or null to generate all
+     */
+    @Optional
+    @Input
+    var themeName: String? = null
+
+    /**
+     * Specific icon directories to use in this task
+     */
+    @Internal
+    fun getIconDirectories(): List<File> {
+        val themeName = themeName
+        if (themeName != null) {
+            return listOf(allIconsDirectory.resolve(themeName))
+        } else {
+            return allIconsDirectory.listFiles()!!.filter { it.isDirectory }
+        }
+    }
+
+    /**
      * Checked-in API file for the generator module, where we will track all the generated icons
      */
     @PathSensitive(PathSensitivity.NONE)
@@ -69,10 +93,20 @@
         get() = buildDirectory.resolve("api/icons.txt")
 
     /**
-     * @return a list of all processed [Icon]s from [iconDirectory].
+     * @return a list of all processed [Icon]s from [getIconDirectories].
      */
-    fun loadIcons(): List<Icon> =
-        IconProcessor(iconDirectory, expectedApiFile, generatedApiFile).process()
+    fun loadIcons(): List<Icon> {
+        // material-icons-core loads and verifies all of the icons from all of the themes:
+        // both that all icons are present in all themes, and also that no icons have been removed.
+        // So, when we're loading just one theme, we don't need to verify it
+        val verifyApi = themeName == null
+        return IconProcessor(
+            getIconDirectories(),
+            expectedApiFile,
+            generatedApiFile,
+            verifyApi
+        ).process()
+    }
 
     @get:OutputDirectory
     val generatedSrcMainDirectory: File
@@ -118,7 +152,7 @@
          * test for every icon in both the core and extended project.
          */
         @JvmStatic
-        fun registerExtendedIconProject(
+        fun registerExtendedIconThemeProject(
             project: Project,
             libraryExtension: LibraryExtension,
             isMpp: Boolean
@@ -131,6 +165,20 @@
                 }
             }
 
+            // b/175401659 - disable lint as it takes a long time, and most errors should
+            // be caught by lint on material-icons-core anyway
+            project.afterEvaluate {
+                project.tasks.named("lintDebug") { t ->
+                    t.enabled = false
+                }
+            }
+        }
+
+        @JvmStatic
+        fun registerExtendedIconMainProject(
+            project: Project,
+            libraryExtension: LibraryExtension
+        ) {
             libraryExtension.testVariants.all { variant ->
                 IconTestingGenerationTask.register(project, variant)
             }
@@ -156,7 +204,15 @@
     variant: BaseVariant? = null
 ): T {
     val variantName = variant?.name ?: "allVariants"
+
+    val themeName = if (project.name.contains("material-icons-extended-")) {
+        project.name.replace("material-icons-extended-", "")
+    } else {
+        null
+    }
+
     return tasks.create("$taskName${variantName.capitalize()}", taskClass) {
+        it.themeName = themeName
         it.buildDirectory = project.buildDir.resolve("generatedIcons/$variantName")
     }
 }
diff --git a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/IconProcessorTest.kt b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/IconProcessorTest.kt
index b1a687f..fe0b334 100644
--- a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/IconProcessorTest.kt
+++ b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/IconProcessorTest.kt
@@ -53,7 +53,7 @@
         val generatedApiFile = temporaryFolder.newFile("generated-api.txt")
 
         val processor = IconProcessor(
-            iconDirectory = iconDirectory,
+            iconDirectories = iconDirectory.listFiles()!!.toList(),
             expectedApiFile = expectedApiFile,
             generatedApiFile = generatedApiFile
         )
@@ -91,7 +91,7 @@
         val generatedApiFile = temporaryFolder.newFile("generated-api.txt")
 
         val processor = IconProcessor(
-            iconDirectory = iconDirectory,
+            iconDirectories = iconDirectory.listFiles()!!.toList(),
             expectedApiFile = expectedApiFile,
             generatedApiFile = generatedApiFile
         )
@@ -123,7 +123,7 @@
         val generatedApiFile = temporaryFolder.newFile("generated-api.txt")
 
         val processor = IconProcessor(
-            iconDirectory = iconDirectory,
+            iconDirectories = iconDirectory.listFiles()!!.toList(),
             expectedApiFile = expectedApiFile,
             generatedApiFile = generatedApiFile
         )
@@ -157,7 +157,7 @@
         val generatedApiFile = temporaryFolder.newFile("generated-api.txt")
 
         val processor = IconProcessor(
-            iconDirectory = iconDirectory,
+            iconDirectories = iconDirectory.listFiles()!!.toList(),
             expectedApiFile = expectedApiFile,
             generatedApiFile = generatedApiFile
         )
@@ -231,4 +231,4 @@
     Rounded.TestIcon
     Sharp.TestIcon
     TwoTone.TestIcon
-""".trimIndent()
\ No newline at end of file
+""".trimIndent()
diff --git a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
index 5d0a820..bb05273 100644
--- a/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
+++ b/compose/material/material/icons/generator/src/test/kotlin/androidx/compose/material/icons/generator/ImageVectorGeneratorTest.kt
@@ -72,7 +72,7 @@
     import androidx.compose.ui.graphics.vector.ImageVector
     import androidx.compose.ui.graphics.vector.group
 
-    val Icons.Filled.TestVector: ImageVector
+    public val Icons.Filled.TestVector: ImageVector
         get() {
             if (_testVector != null) {
                 return _testVector!!
diff --git a/compose/material/material/integration-tests/material-catalog/build.gradle b/compose/material/material/integration-tests/material-catalog/build.gradle
index 3b1ed12..b66d253 100644
--- a/compose/material/material/integration-tests/material-catalog/build.gradle
+++ b/compose/material/material/integration-tests/material-catalog/build.gradle
@@ -19,7 +19,7 @@
 
 plugins {
     id("AndroidXPlugin")
-    id("com.android.library")
+    id("com.android.application")
     id("AndroidXUiPlugin")
     id("org.jetbrains.kotlin.android")
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/AndroidManifest.xml b/compose/material/material/integration-tests/material-catalog/src/main/AndroidManifest.xml
index d6ee456..3e1ea34 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/AndroidManifest.xml
+++ b/compose/material/material/integration-tests/material-catalog/src/main/AndroidManifest.xml
@@ -19,10 +19,15 @@
         xmlns:android="http://schemas.android.com/apk/res/android"
         package="androidx.compose.material.catalog">
 
-    <application>
-        <activity android:name=".CatalogActivity"
-            android:theme="@style/Theme.Catalog"
-            android:label="@string/app_name">
+    <application
+        android:label="@string/compose_material_catalog"
+        android:icon="@mipmap/ic_launcher"
+        android:theme="@style/Theme.Catalog">
+        <activity android:name=".CatalogActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
         </activity>
     </application>
 </manifest>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
index 503ec64..1ffe9e4 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogApp.kt
@@ -17,14 +17,24 @@
 package androidx.compose.material.catalog
 
 import androidx.compose.material.catalog.insets.ProvideWindowInsets
+import androidx.compose.material.catalog.model.Theme
+import androidx.compose.material.catalog.model.ThemeSaver
 import androidx.compose.material.catalog.ui.theme.CatalogTheme
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
 
 @Composable
 fun CatalogApp() {
     ProvideWindowInsets {
-        CatalogTheme {
-            NavGraph()
+        var theme by rememberSaveable(stateSaver = ThemeSaver) { mutableStateOf(Theme()) }
+        CatalogTheme(theme = theme) {
+            NavGraph(
+                theme = theme,
+                onThemeChange = { theme = it }
+            )
         }
     }
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogDemo.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogDemo.kt
deleted file mode 100644
index febf878..0000000
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/CatalogDemo.kt
+++ /dev/null
@@ -1,21 +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.material.catalog
-
-import androidx.compose.integration.demos.common.ActivityDemo
-
-val MaterialCatalog = ActivityDemo("Material catalog", CatalogActivity::class)
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
index 62d0076..e690e58 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/NavGraph.kt
@@ -17,78 +17,93 @@
 package androidx.compose.material.catalog
 
 import androidx.compose.material.catalog.model.Components
+import androidx.compose.material.catalog.model.Theme
 import androidx.compose.material.catalog.ui.component.Component
 import androidx.compose.material.catalog.ui.example.Example
 import androidx.compose.material.catalog.ui.home.Home
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberUpdatedState
 import androidx.navigation.NavType
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.navArgument
-import androidx.navigation.compose.navigate
 import androidx.navigation.compose.rememberNavController
 
 @Composable
-fun NavGraph() {
+fun NavGraph(
+    theme: Theme,
+    onThemeChange: (theme: Theme) -> Unit
+) {
+    // Using rememberUpdatedState as hoisted state is not correctly propagated to NavHost
+    // https://issuetracker.google.com/issues/177338143
+    val navTheme = rememberUpdatedState(theme)
+    val navOnThemeChange = rememberUpdatedState(onThemeChange)
     val navController = rememberNavController()
     NavHost(
         navController = navController,
-        startDestination = HOME_ROUTE
+        startDestination = HomeRoute
     ) {
-        composable(HOME_ROUTE) {
+        composable(HomeRoute) {
             Home(
                 components = Components,
+                theme = navTheme.value,
+                onThemeChange = navOnThemeChange.value,
                 onComponentClick = { component ->
                     val componentId = component.id
-                    val route = "$COMPONENT_ROUTE/$componentId"
+                    val route = "$ComponentRoute/$componentId"
                     navController.navigate(route)
                 }
             )
         }
         composable(
-            route = "$COMPONENT_ROUTE/" +
-                "{$COMPONENT_ID_ARG_NAME}",
+            route = "$ComponentRoute/" +
+                "{$ComponentIdArgName}",
             arguments = listOf(
-                navArgument(COMPONENT_ID_ARG_NAME) { type = NavType.IntType }
+                navArgument(ComponentIdArgName) { type = NavType.IntType }
             )
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
-            val componentId = arguments.getInt(COMPONENT_ID_ARG_NAME)
+            val componentId = arguments.getInt(ComponentIdArgName)
             val component = Components.first { component -> component.id == componentId }
             Component(
                 component = component,
+                theme = navTheme.value,
+                onThemeChange = navOnThemeChange.value,
                 onExampleClick = { example ->
                     val exampleIndex = component.examples.indexOf(example)
-                    val route = "$EXAMPLE_ROUTE/$componentId/$exampleIndex"
+                    val route = "$ExampleRoute/$componentId/$exampleIndex"
                     navController.navigate(route)
                 },
                 onBackClick = { navController.popBackStack() }
             )
         }
         composable(
-            route = "$EXAMPLE_ROUTE/" +
-                "{$COMPONENT_ID_ARG_NAME}/" +
-                "{$EXAMPLE_INDEX_ARG_NAME}",
+            route = "$ExampleRoute/" +
+                "{$ComponentIdArgName}/" +
+                "{$ExampleIndexArgName}",
             arguments = listOf(
-                navArgument(COMPONENT_ID_ARG_NAME) { type = NavType.IntType },
-                navArgument(EXAMPLE_INDEX_ARG_NAME) { type = NavType.IntType }
+                navArgument(ComponentIdArgName) { type = NavType.IntType },
+                navArgument(ExampleIndexArgName) { type = NavType.IntType }
             )
         ) { navBackStackEntry ->
             val arguments = requireNotNull(navBackStackEntry.arguments) { "No arguments" }
-            val componentId = arguments.getInt(COMPONENT_ID_ARG_NAME)
-            val exampleIndex = arguments.getInt(EXAMPLE_INDEX_ARG_NAME)
+            val componentId = arguments.getInt(ComponentIdArgName)
+            val exampleIndex = arguments.getInt(ExampleIndexArgName)
             val component = Components.first { component -> component.id == componentId }
             val example = component.examples[exampleIndex]
             Example(
+                component = component,
                 example = example,
+                theme = navTheme.value,
+                onThemeChange = navOnThemeChange.value,
                 onBackClick = { navController.popBackStack() }
             )
         }
     }
 }
 
-private const val HOME_ROUTE = "home"
-private const val COMPONENT_ROUTE = "component"
-private const val EXAMPLE_ROUTE = "example"
-private const val COMPONENT_ID_ARG_NAME = "componentId"
-private const val EXAMPLE_INDEX_ARG_NAME = "exampleIndex"
+private const val HomeRoute = "home"
+private const val ComponentRoute = "component"
+private const val ExampleRoute = "example"
+private const val ComponentIdArgName = "componentId"
+private const val ExampleIndexArgName = "exampleIndex"
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/insets/Insets.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/insets/Insets.kt
index cd8110f..0fb5516 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/insets/Insets.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/insets/Insets.kt
@@ -380,10 +380,6 @@
 
         // Add an OnAttachStateChangeListener to request an inset pass each time we're attached
         // to the window
-        val attachListener = object : View.OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(v: View) = v.requestApplyInsets()
-            override fun onViewDetachedFromWindow(v: View) = Unit
-        }
         view.addOnAttachStateChangeListener(attachListener)
 
         if (windowInsetsAnimationsEnabled) {
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Components.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Components.kt
index 5e17a3a..e6a0ed02 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Components.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Components.kt
@@ -18,6 +18,9 @@
 
 import androidx.annotation.DrawableRes
 import androidx.compose.material.catalog.R
+import androidx.compose.material.catalog.util.ComponentGuidelinesUrl
+import androidx.compose.material.catalog.util.DocsUrl
+import androidx.compose.material.catalog.util.MaterialSourceUrl
 
 data class Component(
     val id: Int,
@@ -25,6 +28,10 @@
     val description: String,
     @DrawableRes
     val icon: Int = R.drawable.ic_component,
+    val tintIcon: Boolean = false,
+    val guidelinesUrl: String,
+    val docsUrl: String,
+    val sourceUrl: String,
     val examples: List<Example>
 )
 
@@ -33,6 +40,10 @@
     name = "App bars: bottom",
     description = "A bottom app bar displays navigation and key actions at the bottom of mobile " +
         "screens.",
+    icon = R.drawable.ic_app_bars_bottom,
+    guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-bottom",
+    docsUrl = "$DocsUrl#bottomappbar",
+    sourceUrl = "$MaterialSourceUrl/AppBar.kt",
     examples = AppBarsBottomExamples
 )
 
@@ -41,6 +52,10 @@
     name = "App bars: top",
     description = "The top app bar displays information and actions relating to the current " +
         "screen.",
+    icon = R.drawable.ic_app_bars_top,
+    guidelinesUrl = "$ComponentGuidelinesUrl/app-bars-top",
+    docsUrl = "$DocsUrl#topappbar",
+    sourceUrl = "$MaterialSourceUrl/AppBar.kt",
     examples = AppBarsTopExamples
 )
 
@@ -49,6 +64,11 @@
     name = "Backdrop",
     description = "A backdrop appears behind all other surfaces in an app, displaying contextual " +
         "and actionable content.",
+    // No backdrop icon
+    tintIcon = true,
+    guidelinesUrl = "$ComponentGuidelinesUrl/backdrop",
+    docsUrl = "$DocsUrl#backdropscaffold",
+    sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
     examples = BackdropExamples
 )
 
@@ -56,6 +76,10 @@
     id = 4,
     name = "Bottom navigation",
     description = "Bottom navigation bars allow movement between primary destinations in an app.",
+    icon = R.drawable.ic_bottom_navigation,
+    guidelinesUrl = "$ComponentGuidelinesUrl/bottom-navigation",
+    docsUrl = "$DocsUrl#bottomnavigation",
+    sourceUrl = "$MaterialSourceUrl/BottomNavigation.kt",
     examples = BottomNavigationExamples
 )
 
@@ -63,13 +87,21 @@
     id = 5,
     name = "Buttons",
     description = "Buttons allow users to take actions, and make choices, with a single tap.",
+    icon = R.drawable.ic_buttons,
+    guidelinesUrl = "$ComponentGuidelinesUrl/buttons",
+    docsUrl = "$DocsUrl#backdropscaffold",
+    sourceUrl = "$MaterialSourceUrl/BackdropScaffold.kt",
     examples = ButtonsExamples
 )
 
 private val ButtonsFloatingActionButton = Component(
     id = 6,
-    name = "Buttons: floating action button",
+    name = "Floating action buttons",
     description = "A floating action button (FAB) represents the primary action of a screen.",
+    icon = R.drawable.ic_buttons_floating_action_button,
+    guidelinesUrl = "$ComponentGuidelinesUrl/buttons-floating-action-button",
+    docsUrl = "$DocsUrl#floatingactionbutton",
+    sourceUrl = "$MaterialSourceUrl/FloatingActionButton.kt",
     examples = ButtonsFloatingActionButtonExamples
 )
 
@@ -77,6 +109,10 @@
     id = 7,
     name = "Cards",
     description = "Cards contain content and actions about a single subject.",
+    icon = R.drawable.ic_cards,
+    guidelinesUrl = "$ComponentGuidelinesUrl/cards",
+    docsUrl = "$DocsUrl#card",
+    sourceUrl = "$MaterialSourceUrl/Card.kt",
     examples = CardsExamples
 )
 
@@ -85,6 +121,10 @@
     name = "Checkboxes",
     description = "Checkboxes allow the user to select one or more items from a set or turn an " +
         "option on or off.",
+    icon = R.drawable.ic_checkboxes,
+    guidelinesUrl = "$ComponentGuidelinesUrl/checkboxes",
+    docsUrl = "$DocsUrl#checkbox",
+    sourceUrl = "$MaterialSourceUrl/Checkbox.kt",
     examples = CheckboxesExamples
 )
 
@@ -93,6 +133,10 @@
     name = "Dialogs",
     description = "Dialogs inform users about a task and can contain critical information, " +
         "require decisions, or involve multiple tasks.",
+    icon = R.drawable.ic_dialogs,
+    guidelinesUrl = "$ComponentGuidelinesUrl/dialogs",
+    docsUrl = "$DocsUrl#alertdialog",
+    sourceUrl = "$MaterialSourceUrl/AlertDialog.kt",
     examples = DialogsExamples
 )
 
@@ -100,6 +144,11 @@
     id = 10,
     name = "Dividers",
     description = "A divider is a thin line that groups content in lists and layouts.",
+    // No dividers icon
+    tintIcon = true,
+    guidelinesUrl = "$ComponentGuidelinesUrl/dividers",
+    docsUrl = "$DocsUrl#divider",
+    sourceUrl = "$MaterialSourceUrl/Divider.kt",
     examples = DividersExamples
 )
 
@@ -107,6 +156,10 @@
     id = 11,
     name = "Lists",
     description = "Lists are continuous, vertical indexes of text or images.",
+    icon = R.drawable.ic_lists,
+    guidelinesUrl = "$ComponentGuidelinesUrl/lists",
+    docsUrl = "$DocsUrl#listitem",
+    sourceUrl = "$MaterialSourceUrl/ListItem.kt",
     examples = ListsExamples
 )
 
@@ -114,6 +167,10 @@
     id = 12,
     name = "Menus",
     description = "Menus display a list of choices on temporary surfaces.",
+    icon = R.drawable.ic_menus,
+    guidelinesUrl = "$ComponentGuidelinesUrl/menus",
+    docsUrl = "$DocsUrl#dropdownmenu",
+    sourceUrl = "$MaterialSourceUrl/Menu.kt",
     examples = MenusExamples
 )
 
@@ -121,6 +178,10 @@
     id = 13,
     name = "Navigation drawer",
     description = "Navigation drawers provide access to destinations in your app.",
+    icon = R.drawable.ic_navigation_drawer,
+    guidelinesUrl = "$ComponentGuidelinesUrl/navigation-drawer",
+    docsUrl = "$DocsUrl#modaldrawer",
+    sourceUrl = "$MaterialSourceUrl/Drawer.kt",
     examples = NavigationDrawerExamples
 )
 
@@ -129,6 +190,10 @@
     name = "Progress indicators",
     description = "Progress indicators express an unspecified wait time or display the length of " +
         "a process.",
+    icon = R.drawable.ic_progress_indicators,
+    guidelinesUrl = "$ComponentGuidelinesUrl/progress-indicators",
+    docsUrl = "$DocsUrl#circularprogressindicator",
+    sourceUrl = "$MaterialSourceUrl/ProgressIndicator.kt",
     examples = ProgressIndicatorsExamples
 )
 
@@ -136,6 +201,10 @@
     id = 15,
     name = "Radio buttons",
     description = "Radio buttons allow the user to select one option from a set.",
+    icon = R.drawable.ic_radio_buttons,
+    guidelinesUrl = "$ComponentGuidelinesUrl/radio-buttons",
+    docsUrl = "$DocsUrl#radiobutton",
+    sourceUrl = "$MaterialSourceUrl/RadioButton.kt",
     examples = RadioButtonsExamples
 )
 
@@ -144,6 +213,10 @@
     name = "Sheets: bottom",
     description = "Bottom sheets are surfaces containing supplementary content that are anchored " +
         "to the bottom of the screen.",
+    icon = R.drawable.ic_sheets_bottom,
+    guidelinesUrl = "$ComponentGuidelinesUrl/sheets-bottom",
+    docsUrl = "$DocsUrl#bottomsheetscaffold",
+    sourceUrl = "$MaterialSourceUrl/BottomSheetScaffold.kt",
     examples = SheetsBottomExamples
 )
 
@@ -151,6 +224,10 @@
     id = 17,
     name = "Sliders",
     description = "Sliders allow users to make selections from a range of values.",
+    icon = R.drawable.ic_sliders,
+    guidelinesUrl = "$ComponentGuidelinesUrl/sliders",
+    docsUrl = "$DocsUrl#slider",
+    sourceUrl = "$MaterialSourceUrl/Slider.kt",
     examples = SlidersExamples
 )
 
@@ -159,6 +236,10 @@
     name = "Snackbars",
     description = "Snackbars provide brief messages about app processes at the bottom of the " +
         "screen.",
+    icon = R.drawable.ic_snackbars,
+    guidelinesUrl = "$ComponentGuidelinesUrl/snackbars",
+    docsUrl = "$DocsUrl#snackbar",
+    sourceUrl = "$MaterialSourceUrl/Snackbar.kt",
     examples = SnackbarsExamples
 )
 
@@ -166,6 +247,10 @@
     id = 19,
     name = "Switches",
     description = "Switches toggle the state of a single setting on or off.",
+    icon = R.drawable.ic_switches,
+    guidelinesUrl = "$ComponentGuidelinesUrl/switches",
+    docsUrl = "$DocsUrl#switch",
+    sourceUrl = "$MaterialSourceUrl/Switch.kt",
     examples = SwitchesExamples
 )
 
@@ -174,6 +259,10 @@
     name = "Tabs",
     description = "Tabs organize content across different screens, data sets, and other " +
         "interactions.",
+    icon = R.drawable.ic_tabs,
+    guidelinesUrl = "$ComponentGuidelinesUrl/tabs",
+    docsUrl = "$DocsUrl#tab",
+    sourceUrl = "$MaterialSourceUrl/Tab.kt",
     examples = TabsExamples
 )
 
@@ -181,6 +270,10 @@
     id = 21,
     name = "Text fields",
     description = "Text fields let users enter and edit text.",
+    icon = R.drawable.ic_text_fields,
+    guidelinesUrl = "$ComponentGuidelinesUrl/text-fields",
+    docsUrl = "$DocsUrl#textfield",
+    sourceUrl = "$MaterialSourceUrl/TextField.kt",
     examples = TextFieldsExamples
 )
 
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Examples.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Examples.kt
index 8a192f8..6f76c9c 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Examples.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Examples.kt
@@ -18,6 +18,7 @@
 
 package androidx.compose.material.catalog.model
 
+import androidx.compose.material.catalog.util.SampleSourceUrl
 import androidx.compose.material.samples.AlertDialogSample
 import androidx.compose.material.samples.BackdropScaffoldSample
 import androidx.compose.material.samples.BottomDrawerSample
@@ -82,149 +83,177 @@
 data class Example(
     val name: String,
     val description: String,
+    val sourceUrl: String,
     val content: @Composable () -> Unit
 )
 
 private const val AppBarsBottomExampleDescription = "App bars: bottom examples"
+private const val AppBarsBottomExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
 val AppBarsBottomExamples = listOf(
     Example(
         name = ::SimpleBottomAppBar.name,
-        description = AppBarsBottomExampleDescription
+        description = AppBarsBottomExampleDescription,
+        sourceUrl = AppBarsBottomExampleSourceUrl,
     ) {
         SimpleBottomAppBar()
     }
 )
 
 private const val AppBarsTopExampleDescription = "App bars: top examples"
+private const val AppBarsTopExampleSourceUrl = "$SampleSourceUrl/AppBarSamples.kt"
 val AppBarsTopExamples = listOf(
     Example(
         name = ::SimpleTopAppBar.name,
-        description = AppBarsTopExampleDescription
+        description = AppBarsTopExampleDescription,
+        sourceUrl = AppBarsTopExampleSourceUrl
     ) {
         SimpleTopAppBar()
     }
 )
 
 private const val BackdropExampleDescription = "Backdrop examples"
+private const val BackdropExampleSourceUrl = "$SampleSourceUrl/BackdropScaffoldSamples.kt"
 val BackdropExamples = listOf(
     Example(
         name = ::BackdropScaffoldSample.name,
-        description = BackdropExampleDescription
+        description = BackdropExampleDescription,
+        sourceUrl = BackdropExampleSourceUrl
     ) {
         BackdropScaffoldSample()
     }
 )
 
 private const val BottomNavigationExampleDescription = "Bottom navigation examples"
+private const val BottomNavigationExampleSourceUrl = "$SampleSourceUrl/BottomNavigationSamples.kt"
 val BottomNavigationExamples = listOf(
     Example(
         name = ::BottomNavigationSample.name,
-        description = BottomNavigationExampleDescription
+        description = BottomNavigationExampleDescription,
+        sourceUrl = BottomNavigationExampleSourceUrl
     ) {
         BottomNavigationSample()
     },
     Example(
         name = ::BottomNavigationWithOnlySelectedLabelsSample.name,
-        description = BottomNavigationExampleDescription
+        description = BottomNavigationExampleDescription,
+        sourceUrl = BottomNavigationExampleSourceUrl
     ) {
         BottomNavigationWithOnlySelectedLabelsSample()
     }
 )
 
 private const val ButtonsExampleDescription = "Buttons examples"
+private const val ButtonsExampleSourceUrl = "$SampleSourceUrl/ButtonSamples.kt"
 val ButtonsExamples = listOf(
     Example(
         name = ::ButtonSample.name,
-        description = ButtonsExampleDescription
+        description = ButtonsExampleDescription,
+        sourceUrl = ButtonsExampleSourceUrl
     ) {
         ButtonSample()
     },
     Example(
         name = ::OutlinedButtonSample.name,
-        description = ButtonsExampleDescription
+        description = ButtonsExampleDescription,
+        sourceUrl = ButtonsExampleSourceUrl
     ) {
         OutlinedButtonSample()
     },
     Example(
         name = ::TextButtonSample.name,
-        description = ButtonsExampleDescription
+        description = ButtonsExampleDescription,
+        sourceUrl = ButtonsExampleSourceUrl
     ) {
         TextButtonSample()
     },
     Example(
         name = ::ButtonWithIconSample.name,
-        description = ButtonsExampleDescription
+        description = ButtonsExampleDescription,
+        sourceUrl = ButtonsExampleSourceUrl
     ) {
         ButtonWithIconSample()
     }
 )
 
-private const val ButtonsFloatingActionButtonExampleDescription = "Buttons: floating action " +
-    "button examples"
+private const val ButtonsFloatingActionButtonExampleDescription = "Floating action button examples"
+private const val ButtonsFloatingActionButtonExampleSourceUrl = "$SampleSourceUrl/" +
+    "FloatingActionButtonSamples.kt"
 val ButtonsFloatingActionButtonExamples = listOf(
     Example(
         name = ::SimpleFab.name,
-        description = ButtonsFloatingActionButtonExampleDescription
+        description = ButtonsFloatingActionButtonExampleDescription,
+        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
     ) {
         SimpleFab()
     },
     Example(
         name = ::SimpleExtendedFabNoIcon.name,
-        description = ButtonsFloatingActionButtonExampleDescription
+        description = ButtonsFloatingActionButtonExampleDescription,
+        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
     ) {
         SimpleExtendedFabNoIcon()
     },
     Example(
         name = ::SimpleExtendedFabWithIcon.name,
-        description = ButtonsFloatingActionButtonExampleDescription
+        description = ButtonsFloatingActionButtonExampleDescription,
+        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
     ) {
         SimpleExtendedFabWithIcon()
     },
     Example(
         name = ::FluidExtendedFab.name,
-        description = ButtonsFloatingActionButtonExampleDescription
+        description = ButtonsFloatingActionButtonExampleDescription,
+        sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl
     ) {
         FluidExtendedFab()
     },
 )
 
 private const val CardsExampleDescription = "Cards examples"
+private const val CardsExampleSourceUrl = "$SampleSourceUrl/CardSamples.kt"
 val CardsExamples = listOf(
     Example(
         name = ::CardSample.name,
-        description = CardsExampleDescription
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
     ) {
         CardSample()
     }
 )
 
 private const val CheckboxesExampleDescription = "Checkboxes examples"
+private const val CheckboxesExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
 val CheckboxesExamples = listOf(
     Example(
         name = ::CheckboxSample.name,
-        description = CheckboxesExampleDescription
+        description = CheckboxesExampleDescription,
+        sourceUrl = CheckboxesExampleSourceUrl
     ) {
         CheckboxSample()
     },
     Example(
         name = ::TriStateCheckboxSample.name,
-        description = CheckboxesExampleDescription
+        description = CheckboxesExampleDescription,
+        sourceUrl = CheckboxesExampleSourceUrl
     ) {
         TriStateCheckboxSample()
     }
 )
 
 private const val DialogsExampleDescription = "Dialogs examples"
+private const val DialogsExampleSourceUrl = "$SampleSourceUrl/AlertDialogSample.kt"
 val DialogsExamples = listOf(
     Example(
         name = ::AlertDialogSample.name,
-        description = DialogsExampleDescription
+        description = DialogsExampleDescription,
+        sourceUrl = DialogsExampleSourceUrl
     ) {
         AlertDialogSample()
     },
     Example(
         name = ::CustomAlertDialogSample.name,
-        description = DialogsExampleDescription
+        description = DialogsExampleDescription,
+        sourceUrl = DialogsExampleSourceUrl
     ) {
         CustomAlertDialogSample()
     }
@@ -234,290 +263,346 @@
 val DividersExamples = emptyList<Example>()
 
 private const val ListsExampleDescription = "Lists examples"
+private const val ListsExampleSourceUrl = "$SampleSourceUrl/ListSamples.kt"
 val ListsExamples = listOf(
     Example(
         name = ::ClickableListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         ClickableListItems()
     },
     Example(
         name = ::OneLineListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         OneLineListItems()
     },
     Example(
         name = ::TwoLineListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         TwoLineListItems()
     },
     Example(
         name = ::ThreeLineListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         ThreeLineListItems()
     },
     Example(
         name = ::OneLineRtlLtrListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         OneLineRtlLtrListItems()
     },
     Example(
         name = ::TwoLineRtlLtrListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         TwoLineRtlLtrListItems()
     },
     Example(
         name = ::ThreeLineRtlLtrListItems.name,
-        description = ListsExampleDescription
+        description = ListsExampleDescription,
+        sourceUrl = ListsExampleSourceUrl
     ) {
         ThreeLineRtlLtrListItems()
     }
 )
 
 private const val MenusExampleDescription = "Menus examples"
+private const val MenusExampleSourceUrl = "$SampleSourceUrl/MenuSamples.kt"
 val MenusExamples = listOf(
     Example(
         name = ::MenuSample.name,
-        description = MenusExampleDescription
+        description = MenusExampleDescription,
+        sourceUrl = MenusExampleSourceUrl
     ) {
         MenuSample()
     }
 )
 
 private const val NavigationDrawerExampleDescription = "Navigation drawer examples"
+private const val NavigationDrawerExampleSourceUrl = "$SampleSourceUrl/DrawerSamples.kt"
 val NavigationDrawerExamples = listOf(
     Example(
         name = ::ModalDrawerSample.name,
-        description = NavigationDrawerExampleDescription
+        description = NavigationDrawerExampleDescription,
+        sourceUrl = NavigationDrawerExampleSourceUrl
     ) {
         ModalDrawerSample()
     },
     Example(
         name = ::BottomDrawerSample.name,
-        description = NavigationDrawerExampleDescription
+        description = NavigationDrawerExampleDescription,
+        sourceUrl = NavigationDrawerExampleSourceUrl
     ) {
         BottomDrawerSample()
     }
 )
 
 private const val ProgressIndicatorsExampleDescription = "Progress indicators examples"
+private const val ProgressIndicatorsExampleSourceUrl = "$SampleSourceUrl/" +
+    "ProgressIndicatorSamples.kt"
 val ProgressIndicatorsExamples = listOf(
     Example(
         name = ::LinearProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription
+        description = ProgressIndicatorsExampleDescription,
+        sourceUrl = ProgressIndicatorsExampleSourceUrl
     ) {
         LinearProgressIndicatorSample()
     },
     Example(
         name = ::CircularProgressIndicatorSample.name,
-        description = ProgressIndicatorsExampleDescription
+        description = ProgressIndicatorsExampleDescription,
+        sourceUrl = ProgressIndicatorsExampleSourceUrl
     ) {
         CircularProgressIndicatorSample()
     }
 )
 
 private const val RadioButtonsExampleDescription = "Radio buttons examples"
+private const val RadioButtonsExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
 val RadioButtonsExamples = listOf(
     Example(
         name = ::RadioButtonSample.name,
-        description = RadioButtonsExampleDescription
+        description = RadioButtonsExampleDescription,
+        sourceUrl = RadioButtonsExampleSourceUrl
     ) {
         RadioButtonSample()
     },
     Example(
         name = ::RadioGroupSample.name,
-        description = RadioButtonsExampleDescription
+        description = RadioButtonsExampleDescription,
+        sourceUrl = RadioButtonsExampleSourceUrl
     ) {
         RadioGroupSample()
     },
 )
 
 private const val SheetsBottomExampleDescription = "Sheets: bottom examples"
+private const val SheetsBottomStandardExampleSourceUrl = "$SampleSourceUrl/" +
+    "BottomSheetScaffoldSamples.kt"
+private const val SheetsBottomModalExampleSourceUrl = "$SampleSourceUrl/" +
+    "ModalBottomSheetSamples.kt"
 val SheetsBottomExamples = listOf(
     Example(
         name = ::BottomSheetScaffoldSample.name,
-        description = SheetsBottomExampleDescription
+        description = SheetsBottomExampleDescription,
+        sourceUrl = SheetsBottomStandardExampleSourceUrl
     ) {
         BottomSheetScaffoldSample()
     },
     Example(
         name = ::ModalBottomSheetSample.name,
-        description = SheetsBottomExampleDescription
+        description = SheetsBottomExampleDescription,
+        sourceUrl = SheetsBottomModalExampleSourceUrl
     ) {
         ModalBottomSheetSample()
     }
 )
 
 private const val SlidersExampleDescription = "Sliders examples"
+private const val SlidersExampleSourceUrl = "$SampleSourceUrl/SliderSample.kt"
 val SlidersExamples = listOf(
     Example(
         name = ::SliderSample.name,
-        description = SlidersExampleDescription
+        description = SlidersExampleDescription,
+        sourceUrl = SlidersExampleSourceUrl
     ) {
         SliderSample()
     },
     Example(
         name = ::StepsSliderSample.name,
-        description = SlidersExampleDescription
+        description = SlidersExampleDescription,
+        sourceUrl = SlidersExampleSourceUrl
     ) {
         StepsSliderSample()
     }
 )
 
 private const val SnackbarsExampleDescription = "Snackbars examples"
+private const val SnackbarsExampleSourceUrl = "$SampleSourceUrl/ScaffoldSamples.kt"
 val SnackbarsExamples = listOf(
     Example(
         name = ::ScaffoldWithSimpleSnackbar.name,
-        description = SnackbarsExampleDescription
+        description = SnackbarsExampleDescription,
+        sourceUrl = SnackbarsExampleSourceUrl
     ) {
         ScaffoldWithSimpleSnackbar()
     },
     Example(
         name = ::ScaffoldWithCustomSnackbar.name,
-        description = SnackbarsExampleDescription
+        description = SnackbarsExampleDescription,
+        sourceUrl = SnackbarsExampleSourceUrl
     ) {
         ScaffoldWithCustomSnackbar()
     },
     Example(
         name = ::ScaffoldWithCoroutinesSnackbar.name,
-        description = SnackbarsExampleDescription
+        description = SnackbarsExampleDescription,
+        sourceUrl = SnackbarsExampleSourceUrl
     ) {
         ScaffoldWithCoroutinesSnackbar()
     }
 )
 
 private const val SwitchesExampleDescription = "Switches examples"
+private const val SwitchesExampleSourceUrl = "$SampleSourceUrl/SelectionControlsSamples.kt"
 val SwitchesExamples = listOf(
     Example(
         name = ::SwitchSample.name,
-        description = SwitchesExampleDescription
+        description = SwitchesExampleDescription,
+        sourceUrl = SwitchesExampleSourceUrl
     ) {
         SwitchSample()
     }
 )
 
 private const val TabsExampleDescription = "Tabs examples"
+private const val TabsExampleSourceUrl = "$SampleSourceUrl/TabSamples.kt"
 val TabsExamples = listOf(
     Example(
         name = ::TextTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         TextTabs()
     },
     Example(
         name = ::IconTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         IconTabs()
     },
     Example(
         name = ::TextAndIconTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         TextAndIconTabs()
     },
     Example(
         name = ::LeadingIconTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         LeadingIconTabs()
     },
     Example(
         name = ::ScrollingTextTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         ScrollingTextTabs()
     },
     Example(
         name = ::FancyTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         FancyTabs()
     },
     Example(
         name = ::FancyIndicatorTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         FancyIndicatorTabs()
     },
     Example(
         name = ::FancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         FancyIndicatorContainerTabs()
     },
     Example(
         name = ::ScrollingFancyIndicatorContainerTabs.name,
-        description = TabsExampleDescription
+        description = TabsExampleDescription,
+        sourceUrl = TabsExampleSourceUrl
     ) {
         ScrollingFancyIndicatorContainerTabs()
     }
 )
 
 private const val TextFieldsExampleDescription = "Text fields examples"
+private const val TextFieldsExampleSourceUrl = "$SampleSourceUrl/TextFieldSamples.kt"
 val TextFieldsExamples = listOf(
     Example(
         name = ::SimpleTextFieldSample.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         SimpleTextFieldSample()
     },
     Example(
         name = ::TextFieldSample.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldSample()
     },
     Example(
         name = ::SimpleOutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         SimpleOutlinedTextFieldSample()
     },
     Example(
         name = ::OutlinedTextFieldSample.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         OutlinedTextFieldSample()
     },
     Example(
         name = ::TextFieldWithIcons.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldWithIcons()
     },
     Example(
         name = ::TextFieldWithPlaceholder.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldWithPlaceholder()
     },
     Example(
         name = ::TextFieldWithErrorState.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldWithErrorState()
     },
     Example(
         name = ::TextFieldWithHelperMessage.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldWithHelperMessage()
     },
     Example(
         name = ::PasswordTextField.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         PasswordTextField()
     },
     Example(
         name = ::TextFieldWithHideKeyboardOnImeAction.name,
-        description = TextFieldsExampleDescription
+        description = TextFieldsExampleDescription,
+        sourceUrl = TextFieldsExampleSourceUrl
     ) {
         TextFieldWithHideKeyboardOnImeAction()
     }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Themes.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Themes.kt
new file mode 100644
index 0000000..92a93c0
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/model/Themes.kt
@@ -0,0 +1,126 @@
+/*
+ * 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.material.catalog.model
+
+import androidx.compose.foundation.shape.CornerBasedShape
+import androidx.compose.foundation.shape.CutCornerShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.saveable.Saver
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.unit.Dp
+
+data class Theme(
+    val primaryColor: ThemeColor = ThemeColor.Purple,
+    val secondaryColor: ThemeColor = ThemeColor.Teal,
+    val fontFamily: ThemeFontFamily = ThemeFontFamily.Default,
+    val shapeCornerFamily: ThemeShapeCornerFamily = ThemeShapeCornerFamily.Rounded,
+    val smallShapeCornerSize: Int = 4,
+    val mediumShapeCornerSize: Int = 4,
+    val largeShapeCornerSize: Int = 0
+)
+
+val DefaultTheme = Theme()
+
+enum class ThemeColor {
+    Blue,
+    Brown,
+    Green,
+    Indigo,
+    Orange,
+    Pink,
+    Purple,
+    Red,
+    Teal,
+    Yellow
+}
+
+fun ThemeColor.getColor(darkTheme: Boolean): Color = when (this) {
+    ThemeColor.Blue -> if (!darkTheme) Color(0xFF2196F3) else Color(0xFF90CAF9)
+    ThemeColor.Brown -> if (!darkTheme) Color(0xFF795548) else Color(0xFFBCAAA4)
+    ThemeColor.Green -> if (!darkTheme) Color(0xFF43A047) else Color(0xFFA5D6A7)
+    ThemeColor.Indigo -> if (!darkTheme) Color(0xFF3F51B5) else Color(0xFFC5CAE9)
+    ThemeColor.Orange -> if (!darkTheme) Color(0xFFE65100) else Color(0xFFFFB74D)
+    ThemeColor.Pink -> if (!darkTheme) Color(0xFFE91E63) else Color(0xFFF48FB1)
+    ThemeColor.Purple -> if (!darkTheme) Color(0xFF6200EE) else Color(0xFFBB86FC)
+    ThemeColor.Red -> if (!darkTheme) Color(0xFFB00020) else Color(0xFFCF6679)
+    ThemeColor.Teal -> if (!darkTheme) Color(0xFF03DAC6) else Color(0xFF03DAC6)
+    ThemeColor.Yellow -> if (!darkTheme) Color(0xFFFFEB3B) else Color(0xFFFFF59D)
+}
+
+enum class ThemeFontFamily(val label: String) {
+    Default("Default"),
+    SansSerif("Sans serif"),
+    Serif("Serif"),
+    Monospace("Monospace"),
+    Cursive("Cursive")
+}
+
+fun ThemeFontFamily.getFontFamily(): FontFamily = when (this) {
+    ThemeFontFamily.Default -> FontFamily.Default
+    ThemeFontFamily.SansSerif -> FontFamily.SansSerif
+    ThemeFontFamily.Serif -> FontFamily.Serif
+    ThemeFontFamily.Monospace -> FontFamily.Monospace
+    ThemeFontFamily.Cursive -> FontFamily.Cursive
+}
+
+enum class ThemeShapeCornerFamily(val label: String) {
+    Rounded("Rounded"),
+    Cut("Cut")
+}
+
+fun ThemeShapeCornerFamily.getShape(size: Dp): CornerBasedShape = when (this) {
+    ThemeShapeCornerFamily.Rounded -> RoundedCornerShape(size = size)
+    ThemeShapeCornerFamily.Cut -> CutCornerShape(size = size)
+}
+
+val ThemeSaver = Saver<Theme, Map<String, Int>>(
+    save = { theme ->
+        mapOf(
+            PrimaryColorKey to theme.primaryColor.ordinal,
+            SecondaryColorKey to theme.secondaryColor.ordinal,
+            FontFamilyKey to theme.fontFamily.ordinal,
+            ShapeCornerFamilyKey to theme.shapeCornerFamily.ordinal,
+            SmallShapeCornerSizeKey to theme.smallShapeCornerSize,
+            MediumShapeCornerSizeKey to theme.mediumShapeCornerSize,
+            LargeShapeCornerSizeKey to theme.largeShapeCornerSize
+        )
+    },
+    restore = { map ->
+        Theme(
+            primaryColor = ThemeColor.values()[map[PrimaryColorKey]!!],
+            secondaryColor = ThemeColor.values()[map[SecondaryColorKey]!!],
+            fontFamily = ThemeFontFamily.values()[map[FontFamilyKey]!!],
+            shapeCornerFamily = ThemeShapeCornerFamily.values()[map[ShapeCornerFamilyKey]!!],
+            smallShapeCornerSize = map[SmallShapeCornerSizeKey]!!,
+            mediumShapeCornerSize = map[MediumShapeCornerSizeKey]!!,
+            largeShapeCornerSize = map[LargeShapeCornerSizeKey]!!
+        )
+    }
+)
+
+const val MaxSmallShapeCornerSize = 16
+const val MaxMediumShapeCornerSize = 32
+const val MaxLargeShapeCornerSize = 48
+
+private const val PrimaryColorKey = "primaryColor"
+private const val SecondaryColorKey = "secondaryColor"
+private const val FontFamilyKey = "fontFamily"
+private const val ShapeCornerFamilyKey = "shapeCornerFamily"
+private const val SmallShapeCornerSizeKey = "smallShapeCornerSize"
+private const val MediumShapeCornerSizeKey = "mediumShapeCornerSize"
+private const val LargeShapeCornerSizeKey = "largeShapeCornerSize"
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/common/CatalogScaffold.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/common/CatalogScaffold.kt
index 0cb6307..7099c59 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/common/CatalogScaffold.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/common/CatalogScaffold.kt
@@ -17,35 +17,74 @@
 package androidx.compose.material.catalog.ui.common
 
 import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.ModalBottomSheetLayout
+import androidx.compose.material.ModalBottomSheetValue
 import androidx.compose.material.Scaffold
-import androidx.compose.material.catalog.util.DOCS_URL
-import androidx.compose.material.catalog.util.GUIDELINES_URL
-import androidx.compose.material.catalog.util.ISSUE_URL
-import androidx.compose.material.catalog.util.SOURCE_URL
+import androidx.compose.material.catalog.model.Theme
+import androidx.compose.material.catalog.ui.theme.ThemePicker
+import androidx.compose.material.catalog.util.GuidelinesUrl
+import androidx.compose.material.catalog.util.IssueUrl
+import androidx.compose.material.catalog.util.ReleasesUrl
+import androidx.compose.material.catalog.util.SourceUrl
 import androidx.compose.material.catalog.util.openUrl
+import androidx.compose.material.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalContext
+import kotlinx.coroutines.launch
 
+@OptIn(ExperimentalMaterialApi::class)
 @Composable
 fun CatalogScaffold(
     topBarTitle: String,
     showBackNavigationIcon: Boolean = false,
+    theme: Theme,
+    guidelinesUrl: String = GuidelinesUrl,
+    docsUrl: String = ReleasesUrl,
+    sourceUrl: String = SourceUrl,
+    issueUrl: String = IssueUrl,
+    onThemeChange: (theme: Theme) -> Unit,
     onBackClick: () -> Unit = {},
     content: @Composable (PaddingValues) -> Unit
 ) {
-    val context = LocalContext.current
-    Scaffold(
-        topBar = {
-            CatalogTopAppBar(
-                title = topBarTitle,
-                showBackNavigationIcon = showBackNavigationIcon,
-                onBackClick = onBackClick,
-                onGuidelinesClick = { context.openUrl(GUIDELINES_URL) },
-                onDocsClick = { context.openUrl(DOCS_URL) },
-                onSourceClick = { context.openUrl(SOURCE_URL) },
-                onIssueClick = { context.openUrl(ISSUE_URL) }
+    val coroutineScope = rememberCoroutineScope()
+    val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
+    ModalBottomSheetLayout(
+        sheetState = sheetState,
+        sheetContent = {
+            ThemePicker(
+                theme = theme,
+                onThemeChange = { theme ->
+                    coroutineScope.launch {
+                        sheetState.hide()
+                        onThemeChange(theme)
+                    }
+                }
             )
         },
-        content = content
-    )
+        // Default scrim color is onSurface which is incorrect in dark theme
+        // https://issuetracker.google.com/issues/183697056
+        scrimColor = SheetScrimColor
+    ) {
+        val context = LocalContext.current
+        Scaffold(
+            topBar = {
+                CatalogTopAppBar(
+                    title = topBarTitle,
+                    showBackNavigationIcon = showBackNavigationIcon,
+                    onBackClick = onBackClick,
+                    onThemeClick = { coroutineScope.launch { sheetState.show() } },
+                    onGuidelinesClick = { context.openUrl(guidelinesUrl) },
+                    onDocsClick = { context.openUrl(docsUrl) },
+                    onSourceClick = { context.openUrl(sourceUrl) },
+                    onIssueClick = { context.openUrl(issueUrl) }
+                )
+            },
+            content = content
+        )
+    }
 }
+
+private val SheetScrimColor = Color.Black.copy(alpha = 0.32f)
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/Component.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/Component.kt
index 86a453b..2fa2009 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/Component.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/Component.kt
@@ -16,14 +16,16 @@
 
 package androidx.compose.material.catalog.ui.component
 
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
 import androidx.compose.material.ContentAlpha
-import androidx.compose.material.Icon
 import androidx.compose.material.LocalContentColor
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
@@ -32,10 +34,13 @@
 import androidx.compose.material.catalog.insets.toPaddingValues
 import androidx.compose.material.catalog.model.Component
 import androidx.compose.material.catalog.model.Example
+import androidx.compose.material.catalog.model.Theme
 import androidx.compose.material.catalog.ui.common.CatalogScaffold
 import androidx.compose.material.catalog.ui.example.ExampleItem
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.ColorFilter
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
@@ -43,12 +48,19 @@
 @Composable
 fun Component(
     component: Component,
+    theme: Theme,
+    onThemeChange: (theme: Theme) -> Unit,
     onExampleClick: (example: Example) -> Unit,
     onBackClick: () -> Unit
 ) {
     CatalogScaffold(
         topBarTitle = component.name,
         showBackNavigationIcon = true,
+        theme = theme,
+        guidelinesUrl = component.guidelinesUrl,
+        docsUrl = component.docsUrl,
+        sourceUrl = component.sourceUrl,
+        onThemeChange = onThemeChange,
         onBackClick = onBackClick
     ) { paddingValues ->
         LazyColumn(
@@ -58,16 +70,26 @@
             contentPadding = LocalWindowInsets.current.navigationBars.toPaddingValues()
         ) {
             item {
-                Icon(
-                    painter = painterResource(id = component.icon),
-                    contentDescription = null,
+                Box(
                     modifier = Modifier
                         .fillMaxWidth()
-                        .height(ComponentIconHeight)
-                        .padding(vertical = ComponentIconVerticalPadding),
-                    // TODO: Remove tint when using component tile images
-                    tint = LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
-                )
+                        .padding(vertical = ComponentIconVerticalPadding)
+                ) {
+                    Image(
+                        painter = painterResource(id = component.icon),
+                        contentDescription = null,
+                        modifier = Modifier
+                            .size(ComponentIconSize)
+                            .align(Alignment.Center),
+                        colorFilter = if (component.tintIcon) {
+                            ColorFilter.tint(
+                                LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
+                            )
+                        } else {
+                            null
+                        }
+                    )
+                }
             }
             item {
                 Text(
@@ -109,7 +131,7 @@
     }
 }
 
-private val ComponentIconHeight = 192.dp
+private val ComponentIconSize = 108.dp
 private val ComponentIconVerticalPadding = 42.dp
 private val ComponentPadding = 16.dp
 private val ComponentDescriptionPadding = 32.dp
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/ComponentItem.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/ComponentItem.kt
index 8d55544..2eca34c 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/ComponentItem.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/component/ComponentItem.kt
@@ -16,12 +16,13 @@
 
 package androidx.compose.material.catalog.ui.component
 
+import androidx.compose.foundation.Image
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.material.ContentAlpha
-import androidx.compose.material.Icon
 import androidx.compose.material.LocalContentColor
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
@@ -31,6 +32,8 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
 
@@ -52,12 +55,18 @@
             )
             .padding(ComponentItemPadding)
     ) {
-        Icon(
+        Image(
             painter = painterResource(id = component.icon),
             contentDescription = null,
-            modifier = Modifier.align(Alignment.Center),
-            // TODO: Remove tint when using component tile images
-            tint = LocalContentColor.current.copy(alpha = ContentAlpha.disabled)
+            modifier = Modifier
+                .size(ComponentItemIconSize)
+                .align(Alignment.Center),
+            colorFilter = if (component.tintIcon) {
+                ColorFilter.tint(LocalContentColor.current.copy(alpha = ContentAlpha.disabled))
+            } else {
+                null
+            },
+            contentScale = ContentScale.Inside
         )
         Text(
             text = component.name,
@@ -67,5 +76,6 @@
     }
 }
 
-private val ComponentItemHeight = 164.dp
+private val ComponentItemHeight = 180.dp
 private val ComponentItemPadding = 16.dp
+private val ComponentItemIconSize = 80.dp
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/example/Example.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/example/Example.kt
index 245bc7e..d5e1172 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/example/Example.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/example/Example.kt
@@ -20,7 +20,9 @@
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material.catalog.insets.navigationBarsPadding
+import androidx.compose.material.catalog.model.Component
 import androidx.compose.material.catalog.model.Example
+import androidx.compose.material.catalog.model.Theme
 import androidx.compose.material.catalog.ui.common.CatalogScaffold
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
@@ -28,12 +30,20 @@
 
 @Composable
 fun Example(
+    component: Component,
     example: Example,
+    theme: Theme,
+    onThemeChange: (theme: Theme) -> Unit,
     onBackClick: () -> Unit
 ) {
     CatalogScaffold(
         topBarTitle = example.name,
         showBackNavigationIcon = true,
+        theme = theme,
+        guidelinesUrl = component.guidelinesUrl,
+        docsUrl = component.docsUrl,
+        sourceUrl = example.sourceUrl,
+        onThemeChange = onThemeChange,
         onBackClick = onBackClick
     ) { paddingValues ->
         Box(
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/home/Home.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/home/Home.kt
index ad30d01..5671c94 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/home/Home.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/home/Home.kt
@@ -26,6 +26,7 @@
 import androidx.compose.material.catalog.insets.LocalWindowInsets
 import androidx.compose.material.catalog.insets.toPaddingValues
 import androidx.compose.material.catalog.model.Component
+import androidx.compose.material.catalog.model.Theme
 import androidx.compose.material.catalog.ui.common.CatalogScaffold
 import androidx.compose.material.catalog.ui.component.ComponentItem
 import androidx.compose.runtime.Composable
@@ -37,10 +38,14 @@
 @OptIn(ExperimentalFoundationApi::class)
 fun Home(
     components: List<Component>,
+    theme: Theme,
+    onThemeChange: (theme: Theme) -> Unit,
     onComponentClick: (component: Component) -> Unit
 ) {
     CatalogScaffold(
-        topBarTitle = stringResource(id = R.string.material_components)
+        topBarTitle = stringResource(id = R.string.compose_material),
+        theme = theme,
+        onThemeChange = onThemeChange
     ) { paddingValues ->
         BoxWithConstraints(modifier = Modifier.padding(paddingValues)) {
             val cellsCount = maxOf((maxWidth / HomeCellMinSize).toInt(), 1)
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
index 5432380..36b1ad8 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/Theme.kt
@@ -16,20 +16,76 @@
 
 package androidx.compose.material.catalog.ui.theme
 
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.animation.core.animateDpAsState
 import androidx.compose.foundation.isSystemInDarkTheme
 import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Shapes
+import androidx.compose.material.Typography
+import androidx.compose.material.catalog.model.Theme
+import androidx.compose.material.catalog.model.getColor
+import androidx.compose.material.catalog.model.getFontFamily
+import androidx.compose.material.catalog.model.getShape
+import androidx.compose.material.catalog.util.isLightColor
+import androidx.compose.material.catalog.util.onColor
+import androidx.compose.material.catalog.util.variantColor
 import androidx.compose.material.darkColors
 import androidx.compose.material.lightColors
+import androidx.compose.material.primarySurface
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.unit.dp
+import androidx.core.view.ViewCompat
 
 @Composable
-fun CatalogTheme(content: @Composable () -> Unit) {
+fun CatalogTheme(
+    theme: Theme,
+    content: @Composable () -> Unit
+) {
+    val darkTheme = isSystemInDarkTheme()
+    val themePrimaryColor = theme.primaryColor.getColor(darkTheme)
+    val themeSecondaryColor = theme.secondaryColor.getColor(darkTheme)
+    val primaryColor = animateColorAsState(themePrimaryColor)
+    val primaryVariantColor = animateColorAsState(themePrimaryColor.variantColor())
+    val onPrimaryColor = animateColorAsState(themePrimaryColor.onColor())
+    val secondaryColor = animateColorAsState(themeSecondaryColor)
+    val secondaryVariantColor = animateColorAsState(themeSecondaryColor.variantColor())
+    val onSecondaryColor = animateColorAsState(themeSecondaryColor.onColor())
+    val smallShapeSize = animateDpAsState(theme.smallShapeCornerSize.dp)
+    val mediumShapeSize = animateDpAsState(theme.mediumShapeCornerSize.dp)
+    val largeShapeSize = animateDpAsState(theme.largeShapeCornerSize.dp)
+    val colors = if (!darkTheme) {
+        lightColors(
+            primary = primaryColor.value,
+            primaryVariant = primaryVariantColor.value,
+            onPrimary = onPrimaryColor.value,
+            secondary = secondaryColor.value,
+            secondaryVariant = secondaryVariantColor.value,
+            onSecondary = onSecondaryColor.value
+        )
+    } else {
+        darkColors(
+            primary = primaryColor.value,
+            primaryVariant = primaryVariantColor.value,
+            onPrimary = onPrimaryColor.value,
+            secondary = secondaryColor.value,
+            onSecondary = onSecondaryColor.value
+        )
+    }
+    val view = LocalView.current
+    SideEffect {
+        ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars =
+            colors.primarySurface.isLightColor()
+    }
     MaterialTheme(
-        colors = if (isSystemInDarkTheme()) {
-            darkColors()
-        } else {
-            lightColors()
-        },
+        colors = colors,
+        typography = Typography(defaultFontFamily = theme.fontFamily.getFontFamily()),
+        shapes = Shapes(
+            small = theme.shapeCornerFamily.getShape(size = smallShapeSize.value),
+            medium = theme.shapeCornerFamily.getShape(size = mediumShapeSize.value),
+            large = theme.shapeCornerFamily.getShape(size = largeShapeSize.value),
+        ),
         content = content
     )
 }
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/ThemePicker.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/ThemePicker.kt
new file mode 100644
index 0000000..918de75
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/ui/theme/ThemePicker.kt
@@ -0,0 +1,380 @@
+/*
+ * 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.material.catalog.ui.theme
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+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.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.foundation.lazy.items
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.ContentAlpha
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.OutlinedButton
+import androidx.compose.material.RadioButton
+import androidx.compose.material.RadioButtonDefaults
+import androidx.compose.material.Slider
+import androidx.compose.material.Text
+import androidx.compose.material.TextButton
+import androidx.compose.material.catalog.R
+import androidx.compose.material.catalog.insets.LocalWindowInsets
+import androidx.compose.material.catalog.insets.toPaddingValues
+import androidx.compose.material.catalog.model.DefaultTheme
+import androidx.compose.material.catalog.model.MaxLargeShapeCornerSize
+import androidx.compose.material.catalog.model.MaxMediumShapeCornerSize
+import androidx.compose.material.catalog.model.MaxSmallShapeCornerSize
+import androidx.compose.material.catalog.model.Theme
+import androidx.compose.material.catalog.model.ThemeColor
+import androidx.compose.material.catalog.model.ThemeFontFamily
+import androidx.compose.material.catalog.model.ThemeShapeCornerFamily
+import androidx.compose.material.catalog.model.getColor
+import androidx.compose.material.catalog.model.getFontFamily
+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.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun ThemePicker(
+    theme: Theme,
+    onThemeChange: (theme: Theme) -> Unit
+) {
+    var themeState by remember { mutableStateOf(theme) }
+    LazyColumn(
+        contentPadding = LocalWindowInsets.current.navigationBars.toPaddingValues(
+            additionalVertical = ThemePickerPadding
+        )
+    ) {
+        item {
+            Text(
+                text = stringResource(id = R.string.theming_options),
+                style = MaterialTheme.typography.body1,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.primary_color),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            LazyRow(contentPadding = PaddingValues(end = ThemePickerPadding)) {
+                items(ThemeColor.values()) { themeColor ->
+                    ThemeColorItem(
+                        modifier = Modifier.padding(
+                            start = ThemePickerPadding,
+                            top = ThemePickerPadding,
+                            bottom = ThemePickerPadding
+                        ),
+                        themeColor = themeColor,
+                        selected = { it == themeState.primaryColor },
+                        onClick = { themeState = themeState.copy(primaryColor = it) }
+                    )
+                }
+            }
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.secondary_color),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            LazyRow(contentPadding = PaddingValues(end = ThemePickerPadding)) {
+                items(ThemeColor.values()) { themeColor ->
+                    ThemeColorItem(
+                        modifier = Modifier.padding(
+                            start = ThemePickerPadding,
+                            top = ThemePickerPadding,
+                            bottom = ThemePickerPadding
+                        ),
+                        themeColor = themeColor,
+                        selected = { it == themeState.secondaryColor },
+                        onClick = { themeState = themeState.copy(secondaryColor = it) }
+                    )
+                }
+            }
+            Divider(modifier = Modifier.padding(horizontal = ThemePickerPadding))
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.font_family),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            // LazyVerticalGrid can't be used within LazyColumn due to nested scrolling
+            val themeFontFamilies = ThemeFontFamily.values()
+            Column(modifier = Modifier.padding(ThemePickerPadding)) {
+                Row {
+                    ThemeFontFamilyItem(
+                        modifier = Modifier.weight(1f),
+                        themeFontFamily = themeFontFamilies[0],
+                        selected = { it == themeState.fontFamily },
+                        onClick = { themeState = themeState.copy(fontFamily = it) }
+                    )
+                    Spacer(modifier = Modifier.width(ThemePickerPadding))
+                    ThemeFontFamilyItem(
+                        modifier = Modifier.weight(1f),
+                        themeFontFamily = themeFontFamilies[1],
+                        selected = { it == themeState.fontFamily },
+                        onClick = { themeState = themeState.copy(fontFamily = it) }
+                    )
+                }
+                Spacer(modifier = Modifier.height(ThemePickerPadding))
+                Row {
+                    ThemeFontFamilyItem(
+                        modifier = Modifier.weight(1f),
+                        themeFontFamily = themeFontFamilies[2],
+                        selected = { it == themeState.fontFamily },
+                        onClick = { themeState = themeState.copy(fontFamily = it) }
+                    )
+                    Spacer(modifier = Modifier.width(ThemePickerPadding))
+                    ThemeFontFamilyItem(
+                        modifier = Modifier.weight(1f),
+                        themeFontFamily = themeFontFamilies[3],
+                        selected = { it == themeState.fontFamily },
+                        onClick = { themeState = themeState.copy(fontFamily = it) }
+                    )
+                }
+                Spacer(modifier = Modifier.height(ThemePickerPadding))
+                Row {
+                    ThemeFontFamilyItem(
+                        modifier = Modifier.weight(1f),
+                        themeFontFamily = themeFontFamilies[4],
+                        selected = { it == themeState.fontFamily },
+                        onClick = { themeState = themeState.copy(fontFamily = it) }
+                    )
+                }
+            }
+            Divider(modifier = Modifier.padding(horizontal = ThemePickerPadding))
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.shape_corner_family),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            LazyRow(
+                contentPadding = PaddingValues(
+                    start = ThemePickerPadding,
+                    top = ThemePickerPadding,
+                    bottom = ThemePickerPadding
+                )
+            ) {
+                items(ThemeShapeCornerFamily.values()) { themeShapeCornerFamily ->
+                    ThemeShapeCornerFamilyItem(
+                        modifier = Modifier.padding(end = ThemePickerPadding),
+                        themeShapeCornerFamily = themeShapeCornerFamily,
+                        selected = { it == themeState.shapeCornerFamily },
+                        onClick = { themeState = themeState.copy(shapeCornerFamily = it) }
+                    )
+                }
+            }
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.small_shape_corner_size),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            ThemeShapeCornerSizeItem(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .padding(horizontal = ThemePickerPadding),
+                themeShapeCornerSize = themeState.smallShapeCornerSize,
+                themeShapeCornerSizeMax = MaxSmallShapeCornerSize,
+                onValueChange = { themeState = themeState.copy(smallShapeCornerSize = it) }
+            )
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.medium_shape_corner_size),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            ThemeShapeCornerSizeItem(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .padding(horizontal = ThemePickerPadding),
+                themeShapeCornerSize = themeState.mediumShapeCornerSize,
+                themeShapeCornerSizeMax = MaxMediumShapeCornerSize,
+                onValueChange = { themeState = themeState.copy(mediumShapeCornerSize = it) }
+            )
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Text(
+                text = stringResource(id = R.string.large_shape_corner_size),
+                style = MaterialTheme.typography.body2,
+                modifier = Modifier.padding(horizontal = ThemePickerPadding)
+            )
+            ThemeShapeCornerSizeItem(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .padding(horizontal = ThemePickerPadding),
+                themeShapeCornerSize = themeState.largeShapeCornerSize,
+                themeShapeCornerSizeMax = MaxLargeShapeCornerSize,
+                onValueChange = { themeState = themeState.copy(largeShapeCornerSize = it) }
+            )
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+            Divider()
+            Spacer(modifier = Modifier.height(ThemePickerPadding))
+        }
+        item {
+            Row(modifier = Modifier.padding(horizontal = ThemePickerPadding)) {
+                Button(
+                    onClick = {
+                        onThemeChange(themeState)
+                    },
+                    modifier = Modifier.weight(1f),
+                    enabled = themeState != theme,
+                    elevation = null
+                ) {
+                    Text(text = stringResource(R.string.apply))
+                }
+                Spacer(modifier = Modifier.width(ThemePickerPadding))
+                OutlinedButton(
+                    onClick = {
+                        themeState = DefaultTheme
+                        onThemeChange(themeState)
+                    },
+                    modifier = Modifier.weight(1f),
+                    enabled = theme != DefaultTheme
+                ) {
+                    Text(text = stringResource(R.string.reset))
+                }
+            }
+        }
+    }
+}
+
+@Composable
+private fun ThemeColorItem(
+    modifier: Modifier = Modifier,
+    themeColor: ThemeColor,
+    selected: (themeColor: ThemeColor) -> Boolean,
+    onClick: (themeColor: ThemeColor) -> Unit
+) {
+    val darkTheme = !MaterialTheme.colors.isLight
+    RadioButton(
+        selected = selected(themeColor),
+        onClick = { onClick(themeColor) },
+        modifier = modifier,
+        colors = RadioButtonDefaults.colors(
+            selectedColor = themeColor.getColor(darkTheme),
+            unselectedColor = themeColor.getColor(darkTheme)
+        )
+    )
+}
+
+@Composable
+private fun ThemeFontFamilyItem(
+    modifier: Modifier = Modifier,
+    themeFontFamily: ThemeFontFamily,
+    selected: (themeFontFamily: ThemeFontFamily) -> Boolean,
+    onClick: (themeFontFamily: ThemeFontFamily) -> Unit
+) {
+    Row(
+        modifier = modifier,
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+        RadioButton(
+            selected = selected(themeFontFamily),
+            onClick = { onClick(themeFontFamily) }
+        )
+        Spacer(modifier = Modifier.width(ThemePickerPadding))
+        Text(
+            text = themeFontFamily.label,
+            style = MaterialTheme.typography.body2.copy(
+                fontFamily = themeFontFamily.getFontFamily()
+            )
+        )
+    }
+}
+
+@Composable
+private fun ThemeShapeCornerFamilyItem(
+    modifier: Modifier = Modifier,
+    themeShapeCornerFamily: ThemeShapeCornerFamily,
+    selected: (themeShapeCornerFamily: ThemeShapeCornerFamily) -> Boolean,
+    onClick: (themeShapeCornerFamily: ThemeShapeCornerFamily) -> Unit
+) {
+    TextButton(
+        onClick = { onClick(themeShapeCornerFamily) },
+        modifier = modifier,
+        colors = if (selected(themeShapeCornerFamily)) {
+            ButtonDefaults.textButtonColors()
+        } else {
+            ButtonDefaults.textButtonColors(
+                contentColor = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
+            )
+        }
+    ) {
+        val iconId = when (themeShapeCornerFamily) {
+            ThemeShapeCornerFamily.Rounded -> R.drawable.ic_shape_rounded_corner_24dp
+            ThemeShapeCornerFamily.Cut -> R.drawable.ic_shape_cut_corner_24dp
+        }
+        Row(verticalAlignment = Alignment.CenterVertically) {
+            Icon(
+                painter = painterResource(iconId),
+                contentDescription = themeShapeCornerFamily.label
+            )
+            Spacer(modifier = Modifier.width(ThemePickerPadding))
+            Text(text = themeShapeCornerFamily.label)
+        }
+    }
+}
+
+@Composable
+private fun ThemeShapeCornerSizeItem(
+    modifier: Modifier = Modifier,
+    themeShapeCornerSize: Int,
+    themeShapeCornerSizeMax: Int,
+    onValueChange: (themeShapeCornerSize: Int) -> Unit
+) {
+    Column(modifier = modifier) {
+        Slider(
+            value = themeShapeCornerSize.toFloat(),
+            onValueChange = { value -> onValueChange(value.toInt()) },
+            valueRange = 0f..themeShapeCornerSizeMax.toFloat(),
+        )
+        Text(
+            text = stringResource(id = R.string.dp, themeShapeCornerSize),
+            style = MaterialTheme.typography.body2
+        )
+    }
+}
+
+private val ThemePickerPadding = 16.dp
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Color.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Color.kt
new file mode 100644
index 0000000..e90bedd
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Color.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.material.catalog.util
+
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.lerp
+import androidx.compose.ui.graphics.toArgb
+import androidx.core.graphics.ColorUtils
+
+/**
+ * Calculates an 'on' color for this color.
+ *
+ * @return [Color.Black] or [Color.White], depending on [isLightColor].
+ */
+fun Color.onColor(): Color {
+    return if (isLightColor()) Color.Black else Color.White
+}
+
+/**
+ * Calculates if this color is considered light.
+ *
+ * @return true or false, depending on the higher contrast between [Color.Black] and [Color.White].
+ *
+ */
+fun Color.isLightColor(): Boolean {
+    val contrastForBlack = calculateContrast(foreground = Color.Black)
+    val contrastForWhite = calculateContrast(foreground = Color.White)
+    return contrastForBlack > contrastForWhite
+}
+
+/**
+ * Calculates a rudimentary darkened variant color for this color.
+ *
+ * @return this linear interpolated with [Color.Black] at 30% fraction.
+ */
+fun Color.variantColor(): Color {
+    return lerp(this, Color.Black, 0.3f)
+}
+
+private fun Color.calculateContrast(foreground: Color): Double {
+    return ColorUtils.calculateContrast(foreground.toArgb(), toArgb())
+}
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Url.kt b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Url.kt
index 6bd63ad..1538a31 100644
--- a/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Url.kt
+++ b/compose/material/material/integration-tests/material-catalog/src/main/java/androidx/compose/material/catalog/util/Url.kt
@@ -25,8 +25,17 @@
     startActivity(intent)
 }
 
-const val GUIDELINES_URL = "https://material.io/components"
-const val DOCS_URL = "https://developer.android.com/jetpack/androidx/releases/compose-material"
-const val SOURCE_URL = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
-    "androidx-main:compose/material/"
-const val ISSUE_URL = "https://issuetracker.google.com/issues/new?component=742043"
+const val GuidelinesUrl = "https://material.io"
+const val ComponentGuidelinesUrl = "https://material.io/components"
+const val ReleasesUrl = "https://developer.android.com/jetpack/androidx/releases/compose-material"
+const val DocsUrl = "https://developer.android.com/reference/kotlin/androidx/compose/" +
+    "material/package-summary"
+const val SourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+    "androidx-main:compose/material"
+const val MaterialSourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+    "androidx-main:compose/material/" +
+    "material/src/commonMain/kotlin/androidx/compose/material"
+const val SampleSourceUrl = "https://cs.android.com/androidx/platform/frameworks/support/+/" +
+    "androidx-main:compose/material/" +
+    "material/samples/src/main/java/androidx/compose/material/samples"
+const val IssueUrl = "https://issuetracker.google.com/issues/new?component=742043"
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_bottom.png
new file mode 100644
index 0000000..770cac8
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_top.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_top.png
new file mode 100644
index 0000000..0b01ec6
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_app_bars_top.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_bottom_navigation.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_bottom_navigation.png
new file mode 100644
index 0000000..0d05e1b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_bottom_navigation.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons.png
new file mode 100644
index 0000000..f821328
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons_floating_action_button.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons_floating_action_button.png
new file mode 100644
index 0000000..ab22393
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_buttons_floating_action_button.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_cards.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_cards.png
new file mode 100644
index 0000000..7d6a01f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_cards.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_checkboxes.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_checkboxes.png
new file mode 100644
index 0000000..a41383f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_checkboxes.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_dialogs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_dialogs.png
new file mode 100644
index 0000000..c0f717a
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_dialogs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_lists.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_lists.png
new file mode 100644
index 0000000..b53baec
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_lists.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_menus.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_menus.png
new file mode 100644
index 0000000..e45af681
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_menus.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_navigation_drawer.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_navigation_drawer.png
new file mode 100644
index 0000000..a4ac751
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_navigation_drawer.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_progress_indicators.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_progress_indicators.png
new file mode 100644
index 0000000..3aa9700
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_progress_indicators.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_radio_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_radio_buttons.png
new file mode 100644
index 0000000..72fff74
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_radio_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sheets_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sheets_bottom.png
new file mode 100644
index 0000000..9017065
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sheets_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sliders.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sliders.png
new file mode 100644
index 0000000..400a30c
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_sliders.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_snackbars.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_snackbars.png
new file mode 100644
index 0000000..2a290ab
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_snackbars.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_switches.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_switches.png
new file mode 100644
index 0000000..1a8a59b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_switches.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_tabs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_tabs.png
new file mode 100644
index 0000000..ffcf8a6
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_tabs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_text_fields.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_text_fields.png
new file mode 100644
index 0000000..6283729
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-hdpi/ic_text_fields.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_bottom.png
new file mode 100644
index 0000000..d63027e
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_top.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_top.png
new file mode 100644
index 0000000..aea90e4
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_app_bars_top.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_bottom_navigation.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_bottom_navigation.png
new file mode 100644
index 0000000..4741a0d
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_bottom_navigation.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons.png
new file mode 100644
index 0000000..7abf5b5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons_floating_action_button.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons_floating_action_button.png
new file mode 100644
index 0000000..c93a086
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_buttons_floating_action_button.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_cards.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_cards.png
new file mode 100644
index 0000000..f112915
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_cards.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_checkboxes.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_checkboxes.png
new file mode 100644
index 0000000..230e133
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_checkboxes.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_dialogs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_dialogs.png
new file mode 100644
index 0000000..0fa8601
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_dialogs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_lists.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_lists.png
new file mode 100644
index 0000000..df447d0
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_lists.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_menus.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_menus.png
new file mode 100644
index 0000000..7fedc3b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_menus.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_navigation_drawer.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_navigation_drawer.png
new file mode 100644
index 0000000..1c56c71
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_navigation_drawer.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_progress_indicators.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_progress_indicators.png
new file mode 100644
index 0000000..fe1c378
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_progress_indicators.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_radio_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_radio_buttons.png
new file mode 100644
index 0000000..602925f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_radio_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sheets_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sheets_bottom.png
new file mode 100644
index 0000000..12ef4e2
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sheets_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sliders.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sliders.png
new file mode 100644
index 0000000..dee80c4
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_sliders.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_snackbars.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_snackbars.png
new file mode 100644
index 0000000..747e5d9
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_snackbars.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_switches.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_switches.png
new file mode 100644
index 0000000..724210b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_switches.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_tabs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_tabs.png
new file mode 100644
index 0000000..4ed6cd7
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_tabs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_text_fields.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_text_fields.png
new file mode 100644
index 0000000..1c3bf08
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-mdpi/ic_text_fields.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_bottom.png
new file mode 100644
index 0000000..e0d0d1b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_top.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_top.png
new file mode 100644
index 0000000..709cac9
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_app_bars_top.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_bottom_navigation.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_bottom_navigation.png
new file mode 100644
index 0000000..2e080dc
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_bottom_navigation.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons.png
new file mode 100644
index 0000000..bcc8f94
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons_floating_action_button.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons_floating_action_button.png
new file mode 100644
index 0000000..235084c
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_buttons_floating_action_button.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_cards.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_cards.png
new file mode 100644
index 0000000..6bdc26e
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_cards.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_checkboxes.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_checkboxes.png
new file mode 100644
index 0000000..6595bec
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_checkboxes.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_dialogs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_dialogs.png
new file mode 100644
index 0000000..aea0243
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_dialogs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_lists.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_lists.png
new file mode 100644
index 0000000..29ab6b8
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_lists.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_menus.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_menus.png
new file mode 100644
index 0000000..f41be8b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_menus.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_navigation_drawer.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_navigation_drawer.png
new file mode 100644
index 0000000..f14bf07
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_navigation_drawer.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_progress_indicators.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_progress_indicators.png
new file mode 100644
index 0000000..0918e43
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_progress_indicators.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_radio_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_radio_buttons.png
new file mode 100644
index 0000000..8b1a7e1
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_radio_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sheets_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sheets_bottom.png
new file mode 100644
index 0000000..8a1e134
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sheets_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sliders.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sliders.png
new file mode 100644
index 0000000..97da804
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_sliders.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_snackbars.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_snackbars.png
new file mode 100644
index 0000000..66290c7
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_snackbars.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_switches.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_switches.png
new file mode 100644
index 0000000..8ecc75b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_switches.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_tabs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_tabs.png
new file mode 100644
index 0000000..2a0a20c
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_tabs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_text_fields.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_text_fields.png
new file mode 100644
index 0000000..52578bf
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xhdpi/ic_text_fields.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_bottom.png
new file mode 100644
index 0000000..d37304b
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_top.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_top.png
new file mode 100644
index 0000000..10ccee6
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_app_bars_top.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_bottom_navigation.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_bottom_navigation.png
new file mode 100644
index 0000000..5564872
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_bottom_navigation.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons.png
new file mode 100644
index 0000000..3f10ce8
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons_floating_action_button.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons_floating_action_button.png
new file mode 100644
index 0000000..5dfe290
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_buttons_floating_action_button.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_cards.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_cards.png
new file mode 100644
index 0000000..5bc83c5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_cards.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_checkboxes.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_checkboxes.png
new file mode 100644
index 0000000..078df15
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_checkboxes.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_dialogs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_dialogs.png
new file mode 100644
index 0000000..c45679c
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_dialogs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_lists.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_lists.png
new file mode 100644
index 0000000..0220ae5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_lists.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_menus.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_menus.png
new file mode 100644
index 0000000..bd959a6f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_menus.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_navigation_drawer.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_navigation_drawer.png
new file mode 100644
index 0000000..4026855
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_navigation_drawer.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_progress_indicators.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_progress_indicators.png
new file mode 100644
index 0000000..dbac3a0
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_progress_indicators.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_radio_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_radio_buttons.png
new file mode 100644
index 0000000..b3a195f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_radio_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sheets_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sheets_bottom.png
new file mode 100644
index 0000000..6d680c5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sheets_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sliders.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sliders.png
new file mode 100644
index 0000000..6949b07
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_sliders.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_snackbars.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_snackbars.png
new file mode 100644
index 0000000..988b370
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_snackbars.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_switches.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_switches.png
new file mode 100644
index 0000000..2d05fac
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_switches.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_tabs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_tabs.png
new file mode 100644
index 0000000..ee3d088
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_tabs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_text_fields.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_text_fields.png
new file mode 100644
index 0000000..3ccd940
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxhdpi/ic_text_fields.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_bottom.png
new file mode 100644
index 0000000..079d230
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_top.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_top.png
new file mode 100644
index 0000000..d320d91
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_app_bars_top.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_bottom_navigation.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_bottom_navigation.png
new file mode 100644
index 0000000..2a7b97d
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_bottom_navigation.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons.png
new file mode 100644
index 0000000..7e4ca74
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons_floating_action_button.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons_floating_action_button.png
new file mode 100644
index 0000000..92fc974
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_buttons_floating_action_button.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_cards.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_cards.png
new file mode 100644
index 0000000..189996a
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_cards.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_checkboxes.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_checkboxes.png
new file mode 100644
index 0000000..be95ea5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_checkboxes.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_dialogs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_dialogs.png
new file mode 100644
index 0000000..9152d5f
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_dialogs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_lists.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_lists.png
new file mode 100644
index 0000000..c614169
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_lists.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_menus.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_menus.png
new file mode 100644
index 0000000..14e19b0
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_menus.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_navigation_drawer.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_navigation_drawer.png
new file mode 100644
index 0000000..e35c3cf
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_navigation_drawer.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_progress_indicators.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_progress_indicators.png
new file mode 100644
index 0000000..1a7a1fe
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_progress_indicators.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_radio_buttons.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_radio_buttons.png
new file mode 100644
index 0000000..482a67e
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_radio_buttons.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sheets_bottom.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sheets_bottom.png
new file mode 100644
index 0000000..7c102e5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sheets_bottom.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sliders.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sliders.png
new file mode 100644
index 0000000..01c6db5
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_sliders.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_snackbars.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_snackbars.png
new file mode 100644
index 0000000..a9439cb
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_snackbars.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_switches.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_switches.png
new file mode 100644
index 0000000..6b835a1
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_switches.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_tabs.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_tabs.png
new file mode 100644
index 0000000..842b143
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_tabs.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_text_fields.png b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_text_fields.png
new file mode 100644
index 0000000..b732006
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable-xxxhdpi/ic_text_fields.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_launcher_foreground.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..c10d8c8
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_launcher_foreground.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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+  <path
+      android:fillColor="#FFFFFFFF"
+      android:pathData="M59.552,33L59.553,45.782C59.86,45.762 60.17,45.752 60.482,45.752C68.5,
+      45.752 75,52.299 75,60.376C75,68.453 68.5,75 60.482,75C52.463,75 45.963,68.453 45.963,
+      60.376C45.963,59.822 45.994,59.276 46.053,58.738L34,58.738L34,33L59.552,33ZM60.482,
+      48.092C60.169,48.092 59.86,48.104 59.553,48.127L59.552,58.738L48.394,58.738C48.323,
+      59.274 48.286,59.821 48.286,60.376C48.286,67.16 53.746,72.66 60.482,72.66C67.217,72.66 72.677,
+      67.16 72.677,60.376C72.677,53.592 67.217,48.092 60.482,48.092ZM57.229,35.34L36.323,
+      35.34L36.323,56.398L46.507,56.398C47.938,51.288 52.057,47.313 57.229,46.12L57.229,
+      35.34ZM48.94,56.399L57.229,56.398L57.23,48.533C53.343,49.614 50.235,52.583 48.94,56.399Z" />
+</vector>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_cut_corner_24dp.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_cut_corner_24dp.xml
new file mode 100644
index 0000000..50ed230
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_cut_corner_24dp.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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#000000"
+      android:pathData="M21,19L21,21L19,21L19,19L21,19ZM17,19L17,21L15,21L15,19L17,19ZM13,19L13,
+      21L11,21L11,19L13,19ZM9,19L9,21L7,21L7,19L9,19ZM5,19L5,21L3,21L3,19L5,19ZM21,15L21,17L19,
+      17L19,15L21,15ZM5,15L5,17L3,17L3,15L5,15ZM5,11L5,13L3,13L3,11L5,11ZM12,3L21,12L21,13L19,13L11,
+      5L11,3L12,3ZM5,7L5,9L3,9L3,7L5,7ZM5,3L5,5L3,5L3,3L5,3ZM9,3L9,5L7,5L7,3L9,3Z" />
+</vector>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_rounded_corner_24dp.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_rounded_corner_24dp.xml
new file mode 100644
index 0000000..f2dc036
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/drawable/ic_shape_rounded_corner_24dp.xml
@@ -0,0 +1,32 @@
+<?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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#000000"
+      android:pathData="M19,21L19,19L21,19L21,21L19,21ZM19,17L21,17L21,15L19,15L19,17ZM3,13L5,13L5,
+      11L3,11L3,13ZM3,17L5,17L5,15L3,15L3,17ZM3,9L5,9L5,7L3,7L3,9ZM3,5L5,5L5,3L3,3L3,5ZM7,5L9,5L9,
+      3L7,3L7,5ZM15,21L17,21L17,19L15,19L15,21ZM11,21L13,21L13,19L11,19L11,21ZM7,21L9,21L9,19L7,
+      19L7,21ZM3,21L5,21L5,19L3,19L3,21ZM19,13L21,13L21,8C21,7.3125 20.8685,6.6654 20.6055,
+      6.0586C20.3425,5.4518 19.9844,4.9219 19.5312,4.4688C19.0781,4.0156 18.5482,3.6575 17.9414,
+      3.3945C17.3346,3.1315 16.6875,3 16,3L11,3L11,5L16,5C16.8301,5 17.5376,5.2925 18.1225,
+      5.8774C18.7075,6.4624 19,7.1699 19,8L19,13Z" />
+</vector>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..8c348b8
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,21 @@
+<?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
+  -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-hdpi/ic_launcher.png b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a27b45e
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-mdpi/ic_launcher.png b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..891db5a4
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..27a973a
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6eca120
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..cc0f4cd
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/values/colors.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/values/colors.xml
new file mode 100644
index 0000000..c24cc11
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?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>
+
+    <color name="ic_launcher_background">#FF6200EE</color>
+
+</resources>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/values/donottranslate-strings.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/values/donottranslate-strings.xml
new file mode 100644
index 0000000..5a11f9d
--- /dev/null
+++ b/compose/material/material/integration-tests/material-catalog/src/main/res/values/donottranslate-strings.xml
@@ -0,0 +1,44 @@
+<?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>
+
+    <string name="compose_material">Compose Material</string>
+    <string name="compose_material_catalog">Compose Material Catalog</string>
+
+    <string name="description">Description</string>
+    <string name="examples">Examples</string>
+    <string name="no_examples">No examples</string>
+
+    <string name="theming_options">Theming options</string>
+    <string name="primary_color">Primary color</string>
+    <string name="secondary_color">Secondary color</string>
+    <string name="font_family">Font family</string>
+    <string name="shape_corner_family">Shape corner family</string>
+    <string name="small_shape_corner_size">Small shape corner size</string>
+    <string name="medium_shape_corner_size">Medium shape corner size</string>
+    <string name="large_shape_corner_size">Large shape corner size</string>
+    <string name="dp">%ddp</string>
+    <string name="apply">Apply</string>
+    <string name="reset">Reset</string>
+
+    <string name="view_design_guidelines">View design guidelines</string>
+    <string name="view_developer_docs">View developer docs</string>
+    <string name="view_source_code">View source code</string>
+    <string name="report_an_issue">Report an issue</string>
+
+</resources>
diff --git a/compose/material/material/integration-tests/material-catalog/src/main/res/values/strings.xml b/compose/material/material/integration-tests/material-catalog/src/main/res/values/strings.xml
deleted file mode 100644
index 6db56d476..0000000
--- a/compose/material/material/integration-tests/material-catalog/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,33 +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.
-  -->
-
-<resources>
-
-    <string name="app_name">Compose Material catalog</string>
-
-    <string name="material_components">Material Components</string>
-
-    <string name="description">Description</string>
-    <string name="examples">Examples</string>
-    <string name="no_examples">No examples</string>
-
-    <string name="view_design_guidelines">View design guidelines</string>
-    <string name="view_developer_docs">View developer docs</string>
-    <string name="view_source_code">View source code</string>
-    <string name="report_an_issue">Report an issue</string>
-
-</resources>
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
index 50d8776..02ff422 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
@@ -43,42 +43,44 @@
 fun BottomNavigationDemo() {
     var alwaysShowLabels by remember { mutableStateOf(false) }
     Column(
-        modifier = Modifier.fillMaxHeight().selectableGroup(),
+        modifier = Modifier.fillMaxHeight(),
         verticalArrangement = Arrangement.Bottom
     ) {
-        Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .height(56.dp)
-                .selectable(
+        Column(Modifier.selectableGroup()) {
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .height(56.dp)
+                    .selectable(
+                        selected = !alwaysShowLabels,
+                        onClick = { alwaysShowLabels = false }
+                    ),
+                verticalAlignment = Alignment.CenterVertically
+            ) {
+                RadioButton(
                     selected = !alwaysShowLabels,
-                    onClick = { alwaysShowLabels = false }
-                ),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            RadioButton(
-                selected = !alwaysShowLabels,
-                onClick = null
-            )
-            Spacer(Modifier.requiredWidth(16.dp))
-            Text("Only show labels when selected")
-        }
-        Row(
-            modifier = Modifier
-                .fillMaxWidth()
-                .height(56.dp)
-                .selectable(
+                    onClick = null
+                )
+                Spacer(Modifier.requiredWidth(16.dp))
+                Text("Only show labels when selected")
+            }
+            Row(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .height(56.dp)
+                    .selectable(
+                        selected = alwaysShowLabels,
+                        onClick = { alwaysShowLabels = true }
+                    ),
+                verticalAlignment = Alignment.CenterVertically
+            ) {
+                RadioButton(
                     selected = alwaysShowLabels,
-                    onClick = { alwaysShowLabels = true }
-                ),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            RadioButton(
-                selected = alwaysShowLabels,
-                onClick = null
-            )
-            Spacer(Modifier.requiredWidth(16.dp))
-            Text("Always show labels")
+                    onClick = null
+                )
+                Spacer(Modifier.requiredWidth(16.dp))
+                Text("Always show labels")
+            }
         }
 
         Spacer(Modifier.height(50.dp))
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
index 33d7b16..9aaf672 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
@@ -90,7 +90,7 @@
             TextFieldWithErrorState()
         }
         item {
-            Text("Text field with helper/error message")
+            Text("Text field with helper message")
             TextFieldWithHelperMessage()
         }
         item {
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
index dbb3ff1..3d6c1b2 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ScaffoldSamples.kt
@@ -103,7 +103,7 @@
         },
         content = { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
-                items(100) {
+                items(count = 100) {
                     Box(
                         Modifier
                             .fillMaxWidth()
@@ -178,7 +178,7 @@
         isFloatingActionButtonDocked = true,
         content = { innerPadding ->
             LazyColumn(contentPadding = innerPadding) {
-                items(100) {
+                items(count = 100) {
                     Box(
                         Modifier
                             .fillMaxWidth()
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
index 021cac7..99bb145 100644
--- a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
@@ -38,6 +38,8 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
+import androidx.compose.ui.semantics.error
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
@@ -101,16 +103,24 @@
 @Composable
 fun TextFieldWithErrorState() {
     var text by rememberSaveable { mutableStateOf("") }
-    val isValid = text.count() > 5 && '@' in text
+    var isError by rememberSaveable { mutableStateOf(false) }
+
+    fun validate(text: String) { isError = text.count() < 5 }
 
     TextField(
         value = text,
-        onValueChange = { text = it },
-        label = {
-            val label = if (isValid) "Email" else "Email*"
-            Text(label)
+        onValueChange = {
+            text = it
+            isError = false
         },
-        isError = !isValid
+        singleLine = true,
+        label = { Text(if (isError) "Email*" else "Email") },
+        isError = isError,
+        keyboardActions = KeyboardActions { validate(text) },
+        modifier = Modifier.semantics {
+            // Provide localized description of the error
+            if (isError) error("Email format is invalid.")
+        }
     )
 }
 
@@ -118,26 +128,17 @@
 @Composable
 fun TextFieldWithHelperMessage() {
     var text by rememberSaveable { mutableStateOf("") }
-    val invalidInput = text.count() < 5 || '@' !in text
 
     Column {
         TextField(
             value = text,
             onValueChange = { text = it },
-            label = {
-                val label = if (invalidInput) "Email*" else "Email"
-                Text(label)
-            },
-            isError = invalidInput
+            label = { Text("Label") }
         )
-        val textColor = if (invalidInput) {
-            MaterialTheme.colors.error
-        } else {
-            MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
-        }
         Text(
-            text = if (invalidInput) "Requires '@' and at least 5 symbols" else "Helper message",
-            style = MaterialTheme.typography.caption.copy(color = textColor),
+            text = "Helper message",
+            color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium),
+            style = MaterialTheme.typography.caption,
             modifier = Modifier.padding(start = 16.dp)
         )
     }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
index f5801f5..fe4e434 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/BottomNavigationScreenshotTest.kt
@@ -315,17 +315,19 @@
         interaction: Interaction? = null,
         goldenIdentifier: String
     ) {
-        composeTestRule.mainClock.autoAdvance = false
-
         if (interaction != null) {
-            // Start ripple
-            scope.launch {
-                interactionSource.emit(interaction)
+            composeTestRule.runOnIdle {
+                // Start ripple
+                scope.launch {
+                    interactionSource.emit(interaction)
+                }
             }
 
-            // Advance to somewhere in the middle of the animation for the ripple
             composeTestRule.waitForIdle()
-            composeTestRule.mainClock.advanceTimeBy(milliseconds = 80)
+            // 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
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 6ab9a4b..9097e2c 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
@@ -85,15 +85,15 @@
             }
         }
 
-        rule.mainClock.autoAdvance = false
-
         // Start ripple
         rule.onNode(hasClickAction())
             .performGesture { down(center) }
 
-        // Let ripple propagate
         rule.waitForIdle()
-        rule.mainClock.advanceTimeBy(milliseconds = 50)
+        // 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)
 
         rule.onRoot()
             .captureToImage()
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
index a69e05a..ec572de 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
@@ -17,8 +17,11 @@
 package androidx.compose.material
 
 import android.os.Build
+import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.interaction.DragInteraction
 import androidx.compose.foundation.Indication
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
@@ -42,6 +45,7 @@
 import androidx.compose.testutils.assertAgainstGolden
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.asAndroidBitmap
@@ -461,7 +465,11 @@
                 CompositionLocalProvider(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = contentColor) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBox(interactionSource, rememberRipple())
+                            RippleBoxWithBackground(
+                                interactionSource,
+                                rememberRipple(),
+                                bounded = true
+                            )
                         }
                     }
                 }
@@ -507,7 +515,11 @@
                 CompositionLocalProvider(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = contentColor) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBox(interactionSource, rememberRipple())
+                            RippleBoxWithBackground(
+                                interactionSource,
+                                rememberRipple(),
+                                bounded = true
+                            )
                         }
                     }
                 }
@@ -528,6 +540,11 @@
         )
     }
 
+    /**
+     * Note: no corresponding test for pressed ripples since RippleForeground does not update the
+     * color of currently active ripples unless they are being drawn on the UI thread
+     * (which should only happen if the target radius also changes).
+     */
     @Test
     fun themeChangeDuringRipple_dragged() {
         val interactionSource = MutableInteractionSource()
@@ -554,7 +571,11 @@
                 CompositionLocalProvider(LocalRippleTheme provides rippleTheme) {
                     Surface(contentColor = Color.Black) {
                         Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBox(interactionSource, rememberRipple())
+                            RippleBoxWithBackground(
+                                interactionSource,
+                                rememberRipple(),
+                                bounded = true
+                            )
                         }
                     }
                 }
@@ -602,78 +623,6 @@
     }
 
     @Test
-    fun themeChangeDuringRipple_pressed() {
-        val interactionSource = MutableInteractionSource()
-
-        fun createRippleTheme(color: Color, alpha: Float) = object : RippleTheme {
-            val rippleAlpha = RippleAlpha(alpha, alpha, alpha, alpha)
-            @Composable
-            override fun defaultColor() = color
-
-            @Composable
-            override fun rippleAlpha() = rippleAlpha
-        }
-
-        val initialColor = Color.Red
-        val initialAlpha = 0.5f
-
-        var rippleTheme by mutableStateOf(createRippleTheme(initialColor, initialAlpha))
-
-        var scope: CoroutineScope? = null
-
-        rule.setContent {
-            scope = rememberCoroutineScope()
-            MaterialTheme {
-                CompositionLocalProvider(LocalRippleTheme provides rippleTheme) {
-                    Surface(contentColor = Color.Black) {
-                        Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                            RippleBox(interactionSource, rememberRipple())
-                        }
-                    }
-                }
-            }
-        }
-
-        rule.runOnIdle {
-            scope!!.launch {
-                interactionSource.emit(PressInteraction.Press(Offset.Zero))
-            }
-        }
-        rule.waitForIdle()
-
-        with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
-
-            val expectedColor =
-                calculateResultingRippleColor(initialColor, rippleOpacity = initialAlpha)
-
-            Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
-        }
-
-        val newColor = Color.Green
-        val newAlpha = 0.2f
-
-        rule.runOnUiThread {
-            rippleTheme = createRippleTheme(newColor, newAlpha)
-        }
-
-        with(rule.onNodeWithTag(Tag)) {
-            val centerPixel = captureToImage().asAndroidBitmap()
-                .run {
-                    getPixel(width / 2, height / 2)
-                }
-
-            val expectedColor =
-                calculateResultingRippleColor(newColor, rippleOpacity = newAlpha)
-
-            Truth.assertThat(Color(centerPixel)).isEqualTo(expectedColor)
-        }
-    }
-
-    @Test
     fun contentColorProvidedAfterRememberRipple() {
         val interactionSource = MutableInteractionSource()
 
@@ -702,7 +651,7 @@
                             Surface(contentColor = expectedRippleColor) {
                                 // Ripple is used where contentColor is red, so the instance
                                 // should get the red color when it is created
-                                RippleBox(interactionSource, ripple)
+                                RippleBoxWithBackground(interactionSource, ripple, bounded = true)
                             }
                         }
                     }
@@ -710,12 +659,17 @@
             }
         }
 
-        rule.runOnUiThread {
+        rule.runOnIdle {
             scope!!.launch {
                 interactionSource.emit(PressInteraction.Press(Offset(10f, 10f)))
             }
         }
 
+        rule.waitForIdle()
+        // 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)
+
         with(rule.onNodeWithTag(Tag)) {
             val centerPixel = captureToImage().asAndroidBitmap()
                 .run {
@@ -737,7 +691,7 @@
      * @param interaction the [Interaction] to assert for
      * @param goldenIdentifier the identifier for the corresponding screenshot
      * @param expectedCenterPixelColor the expected color for the pixel at the center of the
-     * [RippleBox]
+     * [RippleBoxWithBackground]
      */
     private fun assertRippleMatches(
         scope: CoroutineScope,
@@ -746,30 +700,37 @@
         goldenIdentifier: String,
         expectedCenterPixelColor: Color
     ) {
-        rule.mainClock.autoAdvance = false
-
-        // Start ripple
-        scope.launch {
-            interactionSource.emit(interaction)
+        // Pause the clock if we are drawing a state layer
+        if (interaction !is PressInteraction) {
+            rule.mainClock.autoAdvance = false
         }
 
-        // Advance to somewhere in the middle of the animation for a ripple, or at the end of a
-        // state layer transition
+        // Start ripple
+        rule.runOnIdle {
+            scope.launch {
+                interactionSource.emit(interaction)
+            }
+        }
+
+        // Advance to the end of the ripple / state layer animation
         rule.waitForIdle()
-        rule.mainClock.advanceTimeBy(milliseconds = 50)
+        if (interaction is PressInteraction) {
+            // 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)
+        } else {
+            rule.mainClock.advanceTimeBy(milliseconds = 300)
+        }
 
         // Capture and compare screenshots
-        rule.onNodeWithTag(Tag)
+        val screenshot = rule.onNodeWithTag(Tag)
             .captureToImage()
-            .assertAgainstGolden(screenshotRule, goldenIdentifier)
 
-        // Advance until after the end of the ripple animation, so we have a stable final opacity
-        rule.waitForIdle()
-        rule.mainClock.advanceTimeBy(milliseconds = 50)
+        screenshot.assertAgainstGolden(screenshotRule, goldenIdentifier)
 
         // Compare expected and actual pixel color
-        val centerPixel = rule.onNodeWithTag(Tag)
-            .captureToImage().asAndroidBitmap()
+        val centerPixel = screenshot
+            .asAndroidBitmap()
             .run {
                 getPixel(width / 2, height / 2)
             }
@@ -779,34 +740,49 @@
 }
 
 /**
- * Generic Button like component that allows injecting an [Indication] and also includes
- * padding around the rippled surface, so screenshots will include some dead space for clarity.
+ * Generic Button like component with a border that allows injecting an [Indication], and has a
+ * background with the same color around it - this makes the ripple contrast better and make it
+ * more visible in screenshots.
  *
  * @param interactionSource the [MutableInteractionSource] that is used to drive the ripple state
  * @param ripple ripple [Indication] placed inside the surface
+ * @param bounded whether [ripple] is bounded or not - this controls the clipping behavior
  */
 @Composable
-private fun RippleBox(interactionSource: MutableInteractionSource, ripple: Indication) {
+private fun RippleBoxWithBackground(
+    interactionSource: MutableInteractionSource,
+    ripple: Indication,
+    bounded: Boolean
+) {
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         Surface(
             Modifier.padding(25.dp),
-            color = RippleBoxBackgroundColor, shape = RoundedCornerShape(20)
+            color = RippleBoxBackgroundColor
         ) {
+            val shape = RoundedCornerShape(20)
+            // If the ripple is bounded, we want to clip to the shape, otherwise don't clip as
+            // the ripple should draw outside the bounds.
+            val clip = if (bounded) Modifier.clip(shape) else Modifier
             Box(
-                Modifier.width(80.dp).height(50.dp).indication(
-                    interactionSource = interactionSource,
-                    indication = ripple
-                )
-            )
+                Modifier.padding(25.dp).width(40.dp).height(40.dp)
+                    .border(BorderStroke(2.dp, Color.Black), shape)
+                    .background(color = RippleBoxBackgroundColor, shape = shape)
+                    .then(clip)
+                    .indication(
+                        interactionSource = interactionSource,
+                        indication = ripple
+                    )
+            ) {}
         }
     }
 }
 
 /**
- * Sets the content to a [RippleBox] with a [MaterialTheme] and surrounding [Surface]
+ * Sets the content to a [RippleBoxWithBackground] with a [MaterialTheme] and surrounding [Surface]
  *
- * @param interactionSource [MutableInteractionSource] used to drive the ripple inside the [RippleBox]
- * @param bounded whether the ripple inside the [RippleBox] is bounded
+ * @param interactionSource [MutableInteractionSource] used to drive the ripple inside the
+ * [RippleBoxWithBackground]
+ * @param bounded whether the ripple inside the [RippleBoxWithBackground] is bounded
  * @param lightTheme whether the theme is light or dark
  * @param contentColor the contentColor that will be used for the ripple color
  */
@@ -825,7 +801,7 @@
         MaterialTheme(colors) {
             Surface(contentColor = contentColor) {
                 Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
-                    RippleBox(interactionSource, rememberRipple(bounded))
+                    RippleBoxWithBackground(interactionSource, rememberRipple(bounded), bounded)
                 }
             }
         }
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 2ee0ce4..9e9b149 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
@@ -91,6 +91,11 @@
         rule.onNodeWithTag(wrapperTestTag).performGesture {
             down(center)
         }
+
+        // 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)
+
         assertSelectableAgainstGolden("radioButton_pressed")
     }
 
@@ -137,6 +142,10 @@
         rule.waitForIdle() // Wait for measure
         rule.mainClock.advanceTimeBy(milliseconds = 80)
 
+        // 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)
+
         assertSelectableAgainstGolden("radioButton_animateToSelected")
     }
 
@@ -163,6 +172,10 @@
         rule.waitForIdle() // Wait for measure
         rule.mainClock.advanceTimeBy(milliseconds = 80)
 
+        // 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)
+
         assertSelectableAgainstGolden("radioButton_animateToNotSelected")
     }
 
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 9a7a4c9..070fc5d 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
@@ -145,9 +145,14 @@
             }
         }
 
-        rule.onNodeWithTag(wrapperTestTag).performGesture {
+        rule.onNode(isToggleable()).performGesture {
             down(center)
         }
+
+        // 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)
+
         assertToggeableAgainstGolden("switch_pressed")
     }
 
@@ -193,11 +198,14 @@
         rule.waitForIdle()
         rule.mainClock.advanceTimeBy(milliseconds = 96)
 
+        // 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)
+
         assertToggeableAgainstGolden("switch_animateToChecked")
     }
 
     @Test
-    @Suppress("DEPRECATION") // Due to clockTestRule
     fun switchTest_checked_animateToUnchecked() {
         rule.setMaterialContent {
             val isChecked = remember { mutableStateOf(true) }
@@ -219,11 +227,14 @@
         rule.waitForIdle()
         rule.mainClock.advanceTimeBy(milliseconds = 96)
 
+        // 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)
+
         assertToggeableAgainstGolden("switch_animateToUnchecked")
     }
 
     private fun assertToggeableAgainstGolden(goldenName: String) {
-        // TODO: replace with find(isToggeable()) after b/157687898 is fixed
         rule.onNodeWithTag(wrapperTestTag)
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenName)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/TabScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
index c642587..b7871dc 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/TabScreenshotTest.kt
@@ -355,17 +355,19 @@
         interaction: Interaction? = null,
         goldenIdentifier: String
     ) {
-        composeTestRule.mainClock.autoAdvance = false
-
         if (interaction != null) {
-            // Start ripple
-            scope.launch {
-                interactionSource.emit(interaction)
+            composeTestRule.runOnIdle {
+                // Start ripple
+                scope.launch {
+                    interactionSource.emit(interaction)
+                }
             }
 
-            // Advance to somewhere in the middle of the animation for the ripple
             composeTestRule.waitForIdle()
-            composeTestRule.mainClock.advanceTimeBy(milliseconds = 50)
+            // 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
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index 2985ba6..7cf4927 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -29,6 +29,7 @@
 import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.OutlinedTextField
+import androidx.compose.material.Strings
 import androidx.compose.material.Text
 import androidx.compose.material.TextFieldPadding
 import androidx.compose.material.runOnIdleWithDensity
@@ -49,12 +50,18 @@
 import androidx.compose.ui.node.Ref
 import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.error
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performGesture
 import androidx.compose.ui.text.input.ImeAction
@@ -715,4 +722,39 @@
                 shapeOverlapPixelCount = with(rule.density) { 3.dp.toPx() }
             )
     }
+
+    @Test
+    fun testErrorSemantics_defaultMessage() {
+        rule.setMaterialContent {
+            OutlinedTextField(
+                value = "test",
+                onValueChange = {},
+                isError = true
+            )
+        }
+
+        rule.onNodeWithText("test")
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
+            .assert(
+                SemanticsMatcher.expectValue(SemanticsProperties.Error, Strings.DefaultErrorMessage)
+            )
+    }
+
+    @Test
+    fun testErrorSemantics_messageOverridable() {
+        val errorMessage = "Special symbols not allowed"
+        rule.setMaterialContent {
+            var isError = remember { mutableStateOf(true) }
+            OutlinedTextField(
+                value = "test",
+                onValueChange = {},
+                modifier = Modifier.semantics { if (isError.value) error(errorMessage) },
+                isError = isError.value
+            )
+        }
+
+        rule.onNodeWithText("test")
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
+    }
 }
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index 8e21331..e7b17bd 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -36,6 +36,7 @@
 import androidx.compose.material.LocalContentColor
 import androidx.compose.material.LocalTextStyle
 import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Strings.DefaultErrorMessage
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.material.TextFieldDefaults
@@ -69,14 +70,18 @@
 import androidx.compose.ui.platform.SoftwareKeyboardController
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.error
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.click
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performGesture
 import androidx.compose.ui.text.TextStyle
@@ -1064,6 +1069,39 @@
             }
     }
 
+    @Test
+    fun testErrorSemantics_defaultMessage() {
+        rule.setMaterialContent {
+            TextField(
+                value = "test",
+                onValueChange = {},
+                isError = true
+            )
+        }
+
+        rule.onNodeWithText("test")
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, DefaultErrorMessage))
+    }
+
+    @Test
+    fun testErrorSemantics_messageOverridable() {
+        val errorMessage = "Special symbols not allowed"
+        rule.setMaterialContent {
+            var isError = remember { mutableStateOf(true) }
+            TextField(
+                value = "test",
+                onValueChange = {},
+                modifier = Modifier.semantics { if (isError.value) error(errorMessage) },
+                isError = isError.value
+            )
+        }
+
+        rule.onNodeWithText("test")
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.Error))
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Error, errorMessage))
+    }
+
     private val View.isSoftwareKeyboardShown: Boolean
         get() {
             val inputMethodManager =
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
index 23efc5a..0c41e95 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
@@ -94,18 +94,21 @@
     title: @Composable (() -> Unit)?,
     text: @Composable (() -> Unit)?
 ) {
-    Layout({
-        title?.let { title ->
-            Box(TitlePadding.layoutId("title").align(Alignment.Start)) {
-                title()
+    Layout(
+        {
+            title?.let { title ->
+                Box(TitlePadding.layoutId("title").align(Alignment.Start)) {
+                    title()
+                }
             }
-        }
-        text?.let { text ->
-            Box(TextPadding.layoutId("text").align(Alignment.Start)) {
-                text()
+            text?.let { text ->
+                Box(TextPadding.layoutId("text").align(Alignment.Start)) {
+                    text()
+                }
             }
-        }
-    }) { measurables, constraints ->
+        },
+        Modifier.weight(1f, false)
+    ) { measurables, constraints ->
         // Measure with loose constraints for height as we don't want the text to take up more
         // space than it needs
         val titlePlaceable = measurables.firstOrNull { it.layoutId == "title" }?.measure(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
index 13c198f..7649e03 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Button.kt
@@ -60,9 +60,6 @@
  * Contained buttons are high-emphasis, distinguished by their use of elevation and fill. They
  * contain actions that are primary to your app.
  *
- * To make a button clickable, you must provide an onClick. If no onClick is provided, this button
- * will display itself as disabled.
- *
  * The default text style for internal [Text] components will be set to [Typography.button]. Text
  * color will try to match the correlated color for the background color. For example if the
  * background color is set to [Colors.primary] then the text will by default use
@@ -155,9 +152,6 @@
  * Outlined buttons are also a lower emphasis alternative to contained buttons, or a higher emphasis
  * alternative to text buttons.
  *
- * To make a button clickable, you must provide an onClick. If no onClick is provided, this button
- * will display itself as disabled.
- *
  * The default text style for internal [Text] components will be set to [Typography.button]. Text
  * color will try to match the correlated color for the background color. For example if the
  * background color is set to [Colors.primary] then the text will by default use
@@ -213,9 +207,6 @@
  * Text buttons are typically used for less-pronounced actions, including those located in cards and
  * dialogs.
  *
- * To make a button clickable, you must provide an onClick. If no onClick is provided, this button
- * will display itself as disabled.
- *
  * The default text style for internal [Text] components will be set to [Typography.button]. Text
  * color will try to match the correlated color for the background color. For example if the
  * background color is set to [Colors.primary] then the text will by default use
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
index 48969de..9dc477c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
@@ -22,4 +22,5 @@
     const val NavigationMenu = "Navigation menu"
     const val CloseDrawer = "Close navigation menu"
     const val CloseSheet = "Close sheet"
+    const val DefaultErrorMessage = "Invalid input"
 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
index daec88e..a628a74 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
@@ -152,7 +152,7 @@
     // The color of the Ripple should always the be selected color, as we want to show the color
     // before the item is considered selected, and hence before the new contentColor is
     // provided by TabTransition.
-    val ripple = rememberRipple(bounded = false, color = selectedContentColor)
+    val ripple = rememberRipple(bounded = true, color = selectedContentColor)
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Row(
@@ -216,7 +216,7 @@
     // The color of the Ripple should always the selected color, as we want to show the color
     // before the item is considered selected, and hence before the new contentColor is
     // provided by TabTransition.
-    val ripple = rememberRipple(bounded = false, color = selectedContentColor)
+    val ripple = rememberRipple(bounded = true, color = selectedContentColor)
 
     TabTransition(selectedContentColor, unselectedContentColor, selected) {
         Column(
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
index 604dd36..eda5587 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
@@ -221,7 +221,7 @@
     tabs: @Composable () -> Unit
 ) {
     Surface(
-        modifier = modifier.selectableGroup(),
+        modifier = modifier,
         color = backgroundColor,
         contentColor = contentColor
     ) {
@@ -237,6 +237,7 @@
             Modifier.fillMaxWidth()
                 .wrapContentSize(align = Alignment.CenterStart)
                 .horizontalScroll(scrollState)
+                .selectableGroup()
                 .clipToBounds()
         ) { constraints ->
             val minTabWidth = ScrollableTabRowMinimumTabWidth.roundToPx()
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
index 3432747..c77f622 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
@@ -18,20 +18,16 @@
 
 import androidx.compose.animation.animateColorAsState
 import androidx.compose.animation.core.tween
-import androidx.compose.foundation.interaction.FocusInteraction
-import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.collectIsFocusedAsState
 import androidx.compose.runtime.Composable
 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.getValue
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.unit.dp
-import kotlinx.coroutines.flow.collect
 
 /**
  * Represents the colors of the input text, background and content (including label, placeholder,
@@ -327,25 +323,12 @@
         isError: Boolean,
         interactionSource: InteractionSource
     ): State<Color> {
-        val interactions = remember { mutableStateListOf<Interaction>() }
-        LaunchedEffect(interactionSource) {
-            interactionSource.interactions.collect { interaction ->
-                when (interaction) {
-                    is FocusInteraction.Focus -> {
-                        interactions.add(interaction)
-                    }
-                    is FocusInteraction.Unfocus -> {
-                        interactions.remove(interaction.focus)
-                    }
-                }
-            }
-        }
-        val interaction = interactions.lastOrNull()
+        val focused by interactionSource.collectIsFocusedAsState()
 
         val targetValue = when {
             !enabled -> disabledIndicatorColor
             isError -> errorIndicatorColor
-            interaction is FocusInteraction.Focus -> focusedIndicatorColor
+            focused -> focusedIndicatorColor
             else -> unfocusedIndicatorColor
         }
         return if (enabled) {
@@ -371,25 +354,12 @@
         error: Boolean,
         interactionSource: InteractionSource
     ): State<Color> {
-        val interactions = remember { mutableStateListOf<Interaction>() }
-        LaunchedEffect(interactionSource) {
-            interactionSource.interactions.collect { interaction ->
-                when (interaction) {
-                    is FocusInteraction.Focus -> {
-                        interactions.add(interaction)
-                    }
-                    is FocusInteraction.Unfocus -> {
-                        interactions.remove(interaction.focus)
-                    }
-                }
-            }
-        }
-        val interaction = interactions.lastOrNull()
+        val focused by interactionSource.collectIsFocusedAsState()
 
         val targetValue = when {
             !enabled -> disabledLabelColor
             error -> errorLabelColor
-            interaction is FocusInteraction.Focus -> focusedLabelColor
+            focused -> focusedLabelColor
             else -> unfocusedLabelColor
         }
         return if (enabled) {
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index d7009e8..3f58412 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -27,6 +27,7 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.Strings.DefaultErrorMessage
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
@@ -43,6 +44,8 @@
 import androidx.compose.ui.layout.Placeable
 import androidx.compose.ui.platform.InspectorValueInfo
 import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.semantics.error
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.text.input.VisualTransformation
@@ -132,10 +135,14 @@
                 }
             } else null
 
+        // Developers need to handle invalid input manually. But since we don't provide error
+        // message slot API, we can set the default error message in case developers forget about
+        // it.
+        val textFieldModifier = modifier.semantics { if (isError) error(DefaultErrorMessage) }
         when (type) {
             TextFieldType.Filled -> {
                 TextFieldLayout(
-                    modifier = modifier,
+                    modifier = textFieldModifier,
                     value = value,
                     onValueChange = onValueChange,
                     enabled = enabled,
@@ -164,7 +171,7 @@
             }
             TextFieldType.Outlined -> {
                 OutlinedTextFieldLayout(
-                    modifier = modifier,
+                    modifier = textFieldModifier,
                     value = value,
                     onValueChange = onValueChange,
                     enabled = enabled,
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
index 275a35d..f220c36 100644
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
+++ b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/DesktopMenu.desktop.kt
@@ -29,6 +29,7 @@
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.DpOffset
+import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.Popup
 
@@ -86,7 +87,7 @@
         }
 
         Popup(
-            isFocusable = true,
+            focusable = true,
             onDismissRequest = onDismissRequest,
             popupPositionProvider = popupPositionProvider
         ) {
@@ -134,3 +135,58 @@
         content = content
     )
 }
+
+/**
+ *
+ * A [ContextMenu] behaves similarly to [Popup] and will use the current position of the mouse
+ * cursor to position itself on screen.
+ *
+ * The [content] of a [ContextMenu] will typically be [DropdownMenuItem]s, as well as custom
+ * content. Using [DropdownMenuItem]s will result in a menu that matches the Material
+ * specification for menus.
+ *
+ * @param expanded Whether the menu is currently open and visible to the user
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
+ * tapping outside the menu's bounds
+ * @param offset [DpOffset] to be added to the position of the menu
+ */
+@Suppress("ModifierParameter")
+@Composable
+fun ContextMenu(
+    expanded: Boolean,
+    onDismissRequest: () -> Unit,
+    modifier: Modifier = Modifier,
+    offset: DpOffset = DpOffset(0.dp, 0.dp),
+    content: @Composable ColumnScope.() -> Unit
+) {
+    val contextMenuPaddingOffset = IntOffset(0, DropdownMenuVerticalPadding.value.toInt())
+
+    val expandedStates = remember { MutableTransitionState(false) }
+    expandedStates.targetState = expanded
+
+    if (expandedStates.currentState || expandedStates.targetState) {
+        val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }
+        val density = LocalDensity.current
+        val popupPositionProvider = DropdownMenuPositionProvider(
+            offset,
+            density
+        ) { parentBounds, menuBounds ->
+            transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)
+        }
+
+        Popup(
+            focusable = true,
+            contextMenu = true,
+            offset = contextMenuPaddingOffset,
+            onDismissRequest = onDismissRequest,
+            popupPositionProvider = popupPositionProvider
+        ) {
+            DropdownMenuContent(
+                expandedStates = expandedStates,
+                transformOriginState = transformOriginState,
+                modifier = modifier,
+                content = content
+            )
+        }
+    }
+}
diff --git a/compose/runtime/runtime-livedata/api/1.0.0-beta06.txt b/compose/runtime/runtime-livedata/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/runtime/runtime-livedata/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/runtime/runtime-livedata/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/res-1.0.0-beta06.txt
diff --git a/compose/runtime/runtime-livedata/api/res-1.0.0-beta07.txt b/compose/runtime/runtime-livedata/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/res-1.0.0-beta07.txt
diff --git a/compose/runtime/runtime-livedata/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime-livedata/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/runtime/runtime-livedata/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.0.0-beta07.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/build.gradle b/compose/runtime/runtime-livedata/build.gradle
index 88b093c..f8dd6e6 100644
--- a/compose/runtime/runtime-livedata/build.gradle
+++ b/compose/runtime/runtime-livedata/build.gradle
@@ -36,6 +36,7 @@
     implementation(project(":compose:ui:ui"))
 
     androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+    androidTestImplementation(project(":compose:test-utils"))
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(JUNIT)
     androidTestImplementation(TRUTH)
diff --git a/compose/runtime/runtime-rxjava2/api/1.0.0-beta06.txt b/compose/runtime/runtime-rxjava2/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/runtime/runtime-rxjava2/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/runtime/runtime-rxjava2/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/res-1.0.0-beta06.txt
diff --git a/compose/runtime/runtime-rxjava2/api/res-1.0.0-beta07.txt b/compose/runtime/runtime-rxjava2/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/res-1.0.0-beta07.txt
diff --git a/compose/runtime/runtime-rxjava2/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.0.0-beta07.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.0.0-beta06.txt b/compose/runtime/runtime-rxjava3/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/runtime/runtime-rxjava3/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/runtime/runtime-rxjava3/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/res-1.0.0-beta06.txt
diff --git a/compose/runtime/runtime-rxjava3/api/res-1.0.0-beta07.txt b/compose/runtime/runtime-rxjava3/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/res-1.0.0-beta07.txt
diff --git a/compose/runtime/runtime-rxjava3/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.0.0-beta07.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.0.0-beta06.txt b/compose/runtime/runtime-saveable/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.0.0-beta06.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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/1.0.0-beta07.txt b/compose/runtime/runtime-saveable/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.0.0-beta07.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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_1.0.0-beta06.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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_1.0.0-beta07.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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/res-1.0.0-beta06.txt b/compose/runtime/runtime-saveable/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/res-1.0.0-beta06.txt
diff --git a/compose/runtime/runtime-saveable/api/res-1.0.0-beta07.txt b/compose/runtime/runtime-saveable/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/res-1.0.0-beta07.txt
diff --git a/compose/runtime/runtime-saveable/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime-saveable/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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_1.0.0-beta07.txt b/compose/runtime/runtime-saveable/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..9622306
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,57 @@
+// 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();
+  }
+
+  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/build.gradle b/compose/runtime/runtime-saveable/build.gradle
index eaf9e66..2c030ea 100644
--- a/compose/runtime/runtime-saveable/build.gradle
+++ b/compose/runtime/runtime-saveable/build.gradle
@@ -57,9 +57,9 @@
         androidTestImplementation(ESPRESSO_CORE)
         androidTestImplementation(JUNIT)
         androidTestImplementation(TRUTH)
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
         // DexMaker has it"s own MockMaker
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
         // DexMaker has it"s own MockMaker
 
         lintPublish(project(":compose:runtime:runtime-saveable-lint"))
@@ -105,9 +105,9 @@
                 implementation(ESPRESSO_CORE)
                 implementation(JUNIT)
                 implementation(TRUTH)
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+                implementation(MOCKITO_CORE, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
             }
         }
diff --git a/compose/runtime/runtime/api/1.0.0-beta06.txt b/compose/runtime/runtime/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..b1f3cf8
--- /dev/null
+++ b/compose/runtime/runtime/api/1.0.0-beta06.txt
@@ -0,0 +1,749 @@
+// 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! p);
+    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();
+  }
+
+  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 @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    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 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 @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 startMovableGroup(int key, Object? dataKey, String? sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key, String? sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key, String? sourceInformation);
+    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);
+  }
+
+  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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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, String? sourceInformation, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, String? sourceInformation, 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, String? sourceInformation, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, String? sourceInformation, 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();
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/1.0.0-beta07.txt b/compose/runtime/runtime/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..6b7c331
--- /dev/null
+++ b/compose/runtime/runtime/api/1.0.0-beta07.txt
@@ -0,0 +1,761 @@
+// 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! p);
+    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();
+  }
+
+  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 public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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();
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/current.ignore b/compose/runtime/runtime/api/current.ignore
new file mode 100644
index 0000000..87dd33f
--- /dev/null
+++ b/compose/runtime/runtime/api/current.ignore
@@ -0,0 +1,33 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.runtime.Composer#disableReusing():
+    Added method androidx.compose.runtime.Composer.disableReusing()
+AddedAbstractMethod: androidx.compose.runtime.Composer#enableReusing():
+    Added method androidx.compose.runtime.Composer.enableReusing()
+AddedAbstractMethod: androidx.compose.runtime.Composer#endReusableGroup():
+    Added method androidx.compose.runtime.Composer.endReusableGroup()
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformation(String):
+    Added method androidx.compose.runtime.Composer.sourceInformation(String)
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformationMarkerEnd():
+    Added method androidx.compose.runtime.Composer.sourceInformationMarkerEnd()
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformationMarkerStart(int, String):
+    Added method androidx.compose.runtime.Composer.sourceInformationMarkerStart(int,String)
+AddedAbstractMethod: androidx.compose.runtime.Composer#startReusableGroup(int, Object):
+    Added method androidx.compose.runtime.Composer.startReusableGroup(int,Object)
+AddedAbstractMethod: androidx.compose.runtime.Composer#startReusableNode():
+    Added method androidx.compose.runtime.Composer.startReusableNode()
+
+
+RemovedMethod: androidx.compose.runtime.Composer#startMovableGroup(int, Object, String):
+    Removed method androidx.compose.runtime.Composer.startMovableGroup(int,Object,String)
+RemovedMethod: androidx.compose.runtime.Composer#startReplaceableGroup(int, String):
+    Removed method androidx.compose.runtime.Composer.startReplaceableGroup(int,String)
+RemovedMethod: androidx.compose.runtime.Composer#startRestartGroup(int, String):
+    Removed method androidx.compose.runtime.Composer.startRestartGroup(int,String)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaKt#composableLambda(androidx.compose.runtime.Composer, int, boolean, String, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaKt.composableLambda(androidx.compose.runtime.Composer,int,boolean,String,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaKt#composableLambdaInstance(int, boolean, String, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaKt.composableLambdaInstance(int,boolean,String,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaN_jvmKt#composableLambdaN(androidx.compose.runtime.Composer, int, boolean, String, int, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaN_jvmKt.composableLambdaN(androidx.compose.runtime.Composer,int,boolean,String,int,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaN_jvmKt#composableLambdaNInstance(int, boolean, String, int, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaN_jvmKt.composableLambdaNInstance(int,boolean,String,int,Object)
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 5cf1966..6b7c331 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -56,6 +56,10 @@
     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 public static int getCurrentCompositeKeyHash();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
@@ -68,7 +72,29 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
   }
 
+  @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 @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();
@@ -78,6 +104,22 @@
     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;
@@ -96,6 +138,10 @@
   }
 
   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 {
@@ -293,6 +339,10 @@
     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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
@@ -447,19 +497,47 @@
 
 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();
   }
 
+  @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 {
   }
 
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..b73e719
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,785 @@
+// 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! p);
+    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();
+  }
+
+  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 @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @androidx.compose.runtime.InternalComposeApi 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 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 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 @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 startMovableGroup(int key, Object? dataKey, String? sourceInformation);
+    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 void startReplaceableGroup(int key, String? sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key, String? sourceInformation);
+    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);
+  }
+
+  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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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, String? sourceInformation, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, String? sourceInformation, 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, String? sourceInformation, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, String? sourceInformation, 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);
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..3cbeb22
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,797 @@
+// 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! p);
+    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();
+  }
+
+  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 public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @androidx.compose.runtime.InternalComposeApi 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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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);
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index b808925..3cbeb22 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -56,6 +56,10 @@
     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 public static int getCurrentCompositeKeyHash();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
@@ -68,7 +72,7 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
   }
 
-  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This API is intended to be targeted by the Compose Compiler Plugin and not called " + "directly.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
   }
 
   public interface Composer {
@@ -86,12 +90,15 @@
     method @androidx.compose.runtime.InternalComposeApi 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();
@@ -107,15 +114,17 @@
     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 startMovableGroup(int key, Object? dataKey, String? sourceInformation);
     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 void startReplaceableGroup(int key, String? sourceInformation);
     method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
-    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key, String? sourceInformation);
+    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;
@@ -137,6 +146,9 @@
 
   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 {
@@ -507,16 +519,16 @@
   }
 
   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, String? sourceInformation, Object block);
-    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, String? sourceInformation, Object block);
+    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, String? sourceInformation, int arity, Object block);
-    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, String? sourceInformation, int arity, Object block);
+    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 {
diff --git a/compose/runtime/runtime/api/res-1.0.0-beta06.txt b/compose/runtime/runtime/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime/api/res-1.0.0-beta06.txt
diff --git a/compose/runtime/runtime/api/res-1.0.0-beta07.txt b/compose/runtime/runtime/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/runtime/runtime/api/res-1.0.0-beta07.txt
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..e216e95
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,786 @@
+// 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! p);
+    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();
+  }
+
+  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 @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    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 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 @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 startMovableGroup(int key, Object? dataKey, String? sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key, String? sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key, String? sourceInformation);
+    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);
+    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
+  }
+
+  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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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, String? sourceInformation, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, String? sourceInformation, 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, String? sourceInformation, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, String? sourceInformation, 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();
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt b/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..2cd34c5
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,799 @@
+// 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! p);
+    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();
+  }
+
+  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 public static int getCurrentCompositeKeyHash();
+    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();
+  }
+
+  @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 @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;
+  }
+
+  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 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 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! p);
+    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 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 boolean getHasPendingWork();
+    method 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 boolean hasPendingWork;
+    property 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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,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<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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
+    method public static inline boolean equals-impl(androidx.compose.runtime.Composer! p, Object? p1);
+    method public static boolean equals-impl0(androidx.compose.runtime.Composer p1, androidx.compose.runtime.Composer p2);
+    method public static inline int hashCode-impl(androidx.compose.runtime.Composer! p);
+    method public static void init-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static void reconcile-impl(androidx.compose.runtime.Composer $this, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public static inline void set-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void set-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method public static inline String! toString-impl(androidx.compose.runtime.Composer! p);
+    method public static inline void update-impl(androidx.compose.runtime.Composer $this, int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,kotlin.Unit> block);
+    method public static <V> void update-impl(androidx.compose.runtime.Composer? $this, V value, kotlin.jvm.functions.Function2<? super T,? super V,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.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();
+  }
+
+  @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 void close$metalava_module();
+    method public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? getModified$metalava_module();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getReadObserver$metalava_module();
+    method public boolean getReadOnly();
+    method public androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? getWriteObserver$metalava_module();
+    method public boolean hasPendingChanges();
+    method public void nestedActivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void nestedDeactivated$metalava_module(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void notifyObjectsInitialized$metalava_module();
+    method public void recordModified$metalava_module(androidx.compose.runtime.snapshots.StateObject state);
+    method public void setModified(java.util.Set<androidx.compose.runtime.snapshots.StateObject>? p);
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeNestedMutableSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver);
+    method public androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public java.util.Set<androidx.compose.runtime.snapshots.StateObject>? modified;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    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(Object? element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(Object? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(Object? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(Object? element);
+    method public boolean removeAll(java.util.Collection<?> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<?> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.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(Object? key);
+    method public boolean containsValue(Object? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.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();
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/restricted_current.ignore b/compose/runtime/runtime/api/restricted_current.ignore
new file mode 100644
index 0000000..87dd33f
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_current.ignore
@@ -0,0 +1,33 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.runtime.Composer#disableReusing():
+    Added method androidx.compose.runtime.Composer.disableReusing()
+AddedAbstractMethod: androidx.compose.runtime.Composer#enableReusing():
+    Added method androidx.compose.runtime.Composer.enableReusing()
+AddedAbstractMethod: androidx.compose.runtime.Composer#endReusableGroup():
+    Added method androidx.compose.runtime.Composer.endReusableGroup()
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformation(String):
+    Added method androidx.compose.runtime.Composer.sourceInformation(String)
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformationMarkerEnd():
+    Added method androidx.compose.runtime.Composer.sourceInformationMarkerEnd()
+AddedAbstractMethod: androidx.compose.runtime.Composer#sourceInformationMarkerStart(int, String):
+    Added method androidx.compose.runtime.Composer.sourceInformationMarkerStart(int,String)
+AddedAbstractMethod: androidx.compose.runtime.Composer#startReusableGroup(int, Object):
+    Added method androidx.compose.runtime.Composer.startReusableGroup(int,Object)
+AddedAbstractMethod: androidx.compose.runtime.Composer#startReusableNode():
+    Added method androidx.compose.runtime.Composer.startReusableNode()
+
+
+RemovedMethod: androidx.compose.runtime.Composer#startMovableGroup(int, Object, String):
+    Removed method androidx.compose.runtime.Composer.startMovableGroup(int,Object,String)
+RemovedMethod: androidx.compose.runtime.Composer#startReplaceableGroup(int, String):
+    Removed method androidx.compose.runtime.Composer.startReplaceableGroup(int,String)
+RemovedMethod: androidx.compose.runtime.Composer#startRestartGroup(int, String):
+    Removed method androidx.compose.runtime.Composer.startRestartGroup(int,String)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaKt#composableLambda(androidx.compose.runtime.Composer, int, boolean, String, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaKt.composableLambda(androidx.compose.runtime.Composer,int,boolean,String,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaKt#composableLambdaInstance(int, boolean, String, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaKt.composableLambdaInstance(int,boolean,String,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaN_jvmKt#composableLambdaN(androidx.compose.runtime.Composer, int, boolean, String, int, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaN_jvmKt.composableLambdaN(androidx.compose.runtime.Composer,int,boolean,String,int,Object)
+RemovedMethod: androidx.compose.runtime.internal.ComposableLambdaN_jvmKt#composableLambdaNInstance(int, boolean, String, int, Object):
+    Removed method androidx.compose.runtime.internal.ComposableLambdaN_jvmKt.composableLambdaNInstance(int,boolean,String,int,Object)
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 2d2cffcb..2cd34c5 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -57,6 +57,10 @@
     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 public static int getCurrentCompositeKeyHash();
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
@@ -70,7 +74,29 @@
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
   }
 
+  @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 @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();
@@ -80,6 +106,22 @@
     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;
@@ -98,6 +140,10 @@
   }
 
   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;
@@ -110,6 +156,7 @@
     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 {
@@ -318,6 +365,10 @@
     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 static androidx.compose.runtime.Composer! constructor-impl(androidx.compose.runtime.Composer composer);
@@ -474,19 +525,47 @@
 
 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();
   }
 
+  @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 {
   }
 
diff --git a/compose/runtime/runtime/build.gradle b/compose/runtime/runtime/build.gradle
index 1ae86cc..d8bae21 100644
--- a/compose/runtime/runtime/build.gradle
+++ b/compose/runtime/runtime/build.gradle
@@ -41,7 +41,7 @@
         api(KOTLIN_COROUTINES_ANDROID)
 
         implementation("androidx.annotation:annotation:1.1.0")
-        implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.3")
+        implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.4")
         implementation(KOTLIN_STDLIB)
 
         testImplementation(KOTLIN_TEST_JUNIT)
@@ -74,7 +74,7 @@
             commonMain.dependencies {
                 implementation(KOTLIN_STDLIB_COMMON)
                 implementation(KOTLIN_COROUTINES_CORE)
-                implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.3")
+                implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.4")
             }
             jvmMain.dependencies {
                 implementation(KOTLIN_STDLIB)
@@ -106,6 +106,9 @@
 }
 
 android {
+    defaultConfig {
+        consumerProguardFiles 'proguard-rules.pro'
+    }
     buildTypes {
         debug {
             testCoverageEnabled = false
diff --git a/compose/runtime/runtime/proguard-rules.pro b/compose/runtime/runtime/proguard-rules.pro
new file mode 100644
index 0000000..0343d92
--- /dev/null
+++ b/compose/runtime/runtime/proguard-rules.pro
@@ -0,0 +1,5 @@
+-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
+    void sourceInformation(androidx.compose.runtime.Composer,java.lang.String);
+    void sourceInformationMarkerStart(androidx.compose.runtime.Composer,int,java.lang.String);
+    void sourceInformationMarkerEnd(androidx.compose.runtime.Composer);
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
index 9e9a53b..09fef48 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composables.kt
@@ -20,7 +20,6 @@
  * Remember the value produced by [calculation]. [calculation] will only be evaluated during the composition.
  * Recomposition will always return the value produced by composition.
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable
 inline fun <T> remember(calculation: @DisallowComposableCalls () -> T): T =
     currentComposer.cache(false, calculation)
@@ -29,7 +28,6 @@
  * Remember the value returned by [calculation] if [key1] is equal to the previous composition,
  * otherwise produce and remember a new value by calling [calculation].
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable
 inline fun <T> remember(
     key1: Any?,
@@ -42,7 +40,6 @@
  * Remember the value returned by [calculation] if [key1] and [key2] are equal to the previous
  * composition, otherwise produce and remember a new value by calling [calculation].
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable
 inline fun <T> remember(
     key1: Any?,
@@ -59,7 +56,6 @@
  * Remember the value returned by [calculation] if [key1], [key2] and [key3] are equal to the
  * previous composition, otherwise produce and remember a new value by calling [calculation].
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable
 inline fun <T> remember(
     key1: Any?,
@@ -79,7 +75,6 @@
  * Remember the value returned by [calculation] if all values of [keys] are equal to the previous
  * composition, otherwise produce and remember a new value by calling [calculation].
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable
 inline fun <T> remember(
     vararg keys: Any?,
@@ -134,6 +129,25 @@
 ) = block()
 
 /**
+ * A utility function to mark a composition as supporting recycling. If the [key] changes the
+ * composition is replaced by a new composition (as would happen for [key]) but reusable nodes
+ * that are emitted by [ReusableComposeNode] are reused.
+ *
+ * @param key the value that is used to trigger recycling. If recomposed with a different value
+ * the composer creates a new composition but tries to reuse reusable nodes.
+ * @param content the composable children that are recyclable.
+ */
+@Composable
+inline fun ReusableContent(
+    key: Any?,
+    content: @Composable () -> Unit
+) {
+    currentComposer.startReusableGroup(reuseKey, key)
+    content()
+    currentComposer.endReusableGroup()
+}
+
+/**
  * TODO(lmr): provide documentation
  */
 val currentComposer: Composer
@@ -184,7 +198,6 @@
  * @see Applier
  * @see Composition
  */
-@OptIn(ComposeCompilerApi::class)
 // ComposeNode is a special case of readonly composable and handles creating its own groups, so
 // it is okay to use.
 @Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE", "UnnecessaryLambdaCreation")
@@ -204,6 +217,43 @@
 }
 
 /**
+ * Emits a recyclable node into the composition of type [T].
+ *
+ * This function will throw a runtime exception if [E] is not a subtype of the applier of the
+ * [currentComposer].
+ *
+ * @sample androidx.compose.runtime.samples.CustomTreeComposition
+ *
+ * @param factory A function which will create a new instance of [T]. This function is NOT
+ * guaranteed to be called in place.
+ * @param update A function to perform updates on the node. This will run every time emit is
+ * executed. This function is called in place and will be inlined.
+ *
+ * @see Updater
+ * @see Applier
+ * @see Composition
+ */
+// ComposeNode is a special case of readonly composable and handles creating its own groups, so
+// it is okay to use.
+@Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE", "UnnecessaryLambdaCreation")
+@Composable inline fun <T : Any, reified E : Applier<*>> ReusableComposeNode(
+    noinline factory: () -> T,
+    update: @DisallowComposableCalls Updater<T>.() -> Unit
+) {
+    if (currentComposer.applier !is E) invalidApplier()
+    currentComposer.startReusableNode()
+    if (currentComposer.inserting) {
+        currentComposer.createNode { factory() }
+    } else {
+        currentComposer.useNode()
+    }
+    currentComposer.disableReusing()
+    Updater<T>(currentComposer).update()
+    currentComposer.enableReusing()
+    currentComposer.endNode()
+}
+
+/**
  * Emits a node into the composition of type [T]. Nodes emitted inside of [content] will become
  * children of the emitted node.
  *
@@ -222,7 +272,6 @@
  * @see Applier
  * @see Composition
  */
-@OptIn(ComposeCompilerApi::class)
 // ComposeNode is a special case of readonly composable and handles creating its own groups, so
 // it is okay to use.
 @Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE")
@@ -245,6 +294,48 @@
 }
 
 /**
+ * Emits a recyclable node into the composition of type [T]. Nodes emitted inside of [content] will
+ * become children of the emitted node.
+ *
+ * This function will throw a runtime exception if [E] is not a subtype of the applier of the
+ * [currentComposer].
+ *
+ * @sample androidx.compose.runtime.samples.CustomTreeComposition
+ *
+ * @param factory A function which will create a new instance of [T]. This function is NOT
+ * guaranteed to be called in place.
+ * @param update A function to perform updates on the node. This will run every time emit is
+ * executed. This function is called in place and will be inlined.
+ * @param content the composable content that will emit the "children" of this node.
+ *
+ * @see Updater
+ * @see Applier
+ * @see Composition
+ */
+// ComposeNode is a special case of readonly composable and handles creating its own groups, so
+// it is okay to use.
+@Suppress("NONREADONLY_CALL_IN_READONLY_COMPOSABLE")
+@Composable
+inline fun <T : Any?, reified E : Applier<*>> ReusableComposeNode(
+    noinline factory: () -> T,
+    update: @DisallowComposableCalls Updater<T>.() -> Unit,
+    content: @Composable () -> Unit
+) {
+    if (currentComposer.applier !is E) invalidApplier()
+    currentComposer.startReusableNode()
+    if (currentComposer.inserting) {
+        currentComposer.createNode(factory)
+    } else {
+        currentComposer.useNode()
+    }
+    currentComposer.disableReusing()
+    Updater<T>(currentComposer).update()
+    currentComposer.enableReusing()
+    content()
+    currentComposer.endNode()
+}
+
+/**
  * Emits a node into the composition of type [T]. Nodes emitted inside of [content] will become
  * children of the emitted node.
  *
@@ -269,7 +360,6 @@
  * @see Applier
  * @see Composition
  */
-@OptIn(ComposeCompilerApi::class)
 @Composable @ExplicitGroupsComposable
 inline fun <T, reified E : Applier<*>> ComposeNode(
     noinline factory: () -> T,
@@ -292,6 +382,55 @@
     currentComposer.endNode()
 }
 
+/**
+ * Emits a recyclable node into the composition of type [T]. Nodes emitted inside of [content] will
+ * become children of the emitted node.
+ *
+ * This function will throw a runtime exception if [E] is not a subtype of the applier of the
+ * [currentComposer].
+ *
+ * @sample androidx.compose.runtime.samples.CustomTreeComposition
+ *
+ * @param factory A function which will create a new instance of [T]. This function is NOT
+ * guaranteed to be called in place.
+ * @param update A function to perform updates on the node. This will run every time emit is
+ * executed. This function is called in place and will be inlined.
+ * @param skippableUpdate A function to perform updates on the node. Unlike [update], this
+ * function is Composable and will therefore be skipped unless it has been invalidated by some
+ * other mechanism. This can be useful to perform expensive calculations for updating the node
+ * where the calculations are likely to have the same inputs over time, so the function's
+ * execution can be skipped.
+ * @param content the composable content that will emit the "children" of this node.
+ *
+ * @see Updater
+ * @see SkippableUpdater
+ * @see Applier
+ * @see Composition
+ */
+@Composable @ExplicitGroupsComposable
+inline fun <T, reified E : Applier<*>> ReusableComposeNode(
+    noinline factory: () -> T,
+    update: @DisallowComposableCalls Updater<T>.() -> Unit,
+    noinline skippableUpdate: @Composable SkippableUpdater<T>.() -> Unit,
+    content: @Composable () -> Unit
+) {
+    if (currentComposer.applier !is E) invalidApplier()
+    currentComposer.startReusableNode()
+    if (currentComposer.inserting) {
+        currentComposer.createNode(factory)
+    } else {
+        currentComposer.useNode()
+    }
+    currentComposer.disableReusing()
+    Updater<T>(currentComposer).update()
+    SkippableUpdater<T>(currentComposer).skippableUpdate()
+    currentComposer.enableReusing()
+    currentComposer.startReplaceableGroup(0x7ab4aae9)
+    content()
+    currentComposer.endReplaceableGroup()
+    currentComposer.endNode()
+}
+
 @PublishedApi
 internal fun invalidApplier(): Unit = error("Invalid applier")
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeCompilerApi.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeCompilerApi.kt
index e328296..6a38d9d 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeCompilerApi.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeCompilerApi.kt
@@ -16,11 +16,6 @@
 
 package androidx.compose.runtime
 
-@RequiresOptIn(
-    level = RequiresOptIn.Level.WARNING,
-    message = "This API is intended to be targeted by the Compose Compiler Plugin and not called " +
-        "directly."
-)
 @Target(
     AnnotationTarget.CLASS,
     AnnotationTarget.FUNCTION,
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 ea5eb50..c9e7cfd 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 = 2600
+    const val version: Int = 2800
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index c38b435c..3f84fc1 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -16,7 +16,6 @@
 
 @file:OptIn(
     InternalComposeApi::class,
-    ComposeCompilerApi::class
 )
 package androidx.compose.runtime
 
@@ -379,7 +378,7 @@
      * execution and can only either inserted, removed, or replaced. For example, the group
      * created by most control flow constructs such as an `if` statement are replacable groups.
      *
-     * @param key An compiler generated key based on the source location of the call.
+     * @param key A compiler generated key based on the source location of the call.
      */
     @ComposeCompilerApi
     fun startReplaceableGroup(key: Int)
@@ -387,20 +386,6 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a replacable group. A replacable group is a group that cannot be moved during
-     * execution and can only either inserted, removed, or replaced. For example, the group
-     * created by most control flow constructs such as an `if` statement are replacable groups.
-     *
-     * @param key An compiler generated key based on the source location of the call.
-     * @param sourceInformation An optional string value to that provides the compose tools enough
-     * information to calculate the source location calls made in the group.
-     */
-    @ComposeCompilerApi
-    fun startReplaceableGroup(key: Int, sourceInformation: String?)
-
-    /**
-     * A Compose compiler plugin API. DO NOT call directly.
-     *
      * Called at the end of a replacable group.
      *
      * @see startRestartGroup
@@ -419,7 +404,7 @@
      * the state and nodes generated by a loop to move with the composition implied by the key
      * passed to [key][androidx.compose.runtime.key].
 
-     * @param key An compiler generated key based on the source location of the call.
+     * @param key A compiler generated key based on the source location of the call.
      */
     @ComposeCompilerApi
     fun startMovableGroup(key: Int, dataKey: Any?)
@@ -427,24 +412,6 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Start a movable group. A movable group is one that can be moved based on the value of
-     * [dataKey] which is typically supplied by the [key][androidx.compose.runtime.key] pseudo
-     * compiler function.
-     *
-     * A movable group implements the semantics of [key][androidx.compose.runtime.key] which allows
-     * the state and nodes generated by a loop to move with the composition implied by the key
-     * passed to [key][androidx.compose.runtime.key].
-
-     * @param key An compiler generated key based on the source location of the call.
-     * @param sourceInformation An optional string value to that provides the compose tools enough
-     * information to calculate the source location calls made in the group.
-     */
-    @ComposeCompilerApi
-    fun startMovableGroup(key: Int, dataKey: Any?, sourceInformation: String?)
-
-    /**
-     * A Compose compiler plugin API. DO NOT call directly.
-     *
      * Called at the end of a movable group.
      *
      * @see startMovableGroup
@@ -482,7 +449,7 @@
      * recomposed on demand based on the lambda passed to
      * [updateScope][ScopeUpdateScope.updateScope] when [endRestartGroup] is called
      *
-     * @param key An compiler generated key based on the source location of the call.
+     * @param key A compiler generated key based on the source location of the call.
      * @return the instance of the composer to use for the rest of the function.
      */
     @ComposeCompilerApi
@@ -491,21 +458,6 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
-     * Called to record a group for a [Composable] function and starts a group that can be
-     * recomposed on demand based on the lambda passed to
-     * [updateScope][ScopeUpdateScope.updateScope] when [endRestartGroup] is called
-     *
-     * @param key An compiler generated key based on the source location of the call.
-     * @param sourceInformation An optional string value to that provides the compose tools enough
-     * information to calculate the source location calls made in the group.
-     * @return the instance of the composer to use for the rest of the function.
-     */
-    @ComposeCompilerApi
-    fun startRestartGroup(key: Int, sourceInformation: String?): Composer
-
-    /**
-     * A Compose compiler plugin API. DO NOT call directly.
-     *
      * Called to end a restart group.
      */
     @ComposeCompilerApi
@@ -514,6 +466,38 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
+     * Record the source information string for a group. This must be immediately called after the
+     * start of a group.
+     *
+     * @param sourceInformation An string value to that provides the compose tools enough
+     * information to calculate the source location of calls to composable functions.
+     */
+    fun sourceInformation(sourceInformation: String)
+
+    /**
+     * A compose compiler plugin API. DO NOT call directly.
+     *
+     * Record a source information marker. This marker can be used in place of a group that would
+     * have contained the information but was elided as the compiler plugin determined the group
+     * was not necessary such as when a function is marked with [ReadOnlyComposable].
+     *
+     * @param key A compiler generated key based on the source location of the call.
+     * @param sourceInformation An string value to that provides the compose tools enough
+     * information to calculate the source location of calls to composable functions.
+     *
+     */
+    fun sourceInformationMarkerStart(key: Int, sourceInformation: String)
+
+    /**
+     * A compose compiler plugin API. DO NOT call directly.
+     *
+     * Record the end of the marked source information range.
+     */
+    fun sourceInformationMarkerEnd()
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
      * Skips the composer to the end of the current group. This generated by the compiler to when
      * the body of a [Composable] function can be skipped typically because the parameters to the
      * function are equal to the values passed to it in the previous composition.
@@ -545,6 +529,16 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
+     * Start a group that tracks a the code that will create or update a node that is generated
+     * as part of the tree implied by the composition. A reusable node can be reused in a
+     * reusable group even if the group key is changed.
+     */
+    @ComposeCompilerApi
+    fun startReusableNode()
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
      * Report the [factory] that will be used to create the node that will be generated into the
      * tree implied by the composition. This will only be called if [inserting] is is `true`.
      *
@@ -574,6 +568,48 @@
     /**
      * A Compose compiler plugin API. DO NOT call directly.
      *
+     * Start a reuse group. Unlike a movable group, in a reuse group if the [dataKey] changes
+     * the composition shifts into a reusing state cause the composer to act like it is
+     * inserting (e.g. [cache] acts as if all values are invalid, [changed] always returns
+     * true, etc.) even though it is recomposing until it encounters a reusable node. If the
+     * node is reusable it temporarily shifts into recomposition for the node and then shifts
+     * back to reusing for the children.  If a non-reusable node is generated the composer
+     * shifts to inserting for the node and all of its children.
+     *
+     * @param key An compiler generated key based on the source location of the call.
+     * @param dataKey A key provided by the [ReusableContent] composable function that is used to
+     * determine if the composition shifts into a reusing state for this group.
+     */
+    @ComposeCompilerApi
+    fun startReusableGroup(key: Int, dataKey: Any?)
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
+     * Called at the end of a reusable group.
+     */
+    @ComposeCompilerApi
+    fun endReusableGroup()
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
+     * Temporarily disable reusing if it is enabled.
+     */
+    @ComposeCompilerApi
+    fun disableReusing()
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
+     * Reenable reusing if it was previously enabled before the last call to [disableReusing].
+     */
+    @ComposeCompilerApi
+    fun enableReusing()
+
+    /**
+     * A Compose compiler plugin API. DO NOT call directly.
+     *
      * Schedule [block] to called with [value]. This is intended to update the node generated by
      * [createNode] to changes discovered by composition.
      *
@@ -908,6 +944,52 @@
 }
 
 /**
+ * A Compose internal function. DO NOT call directly.
+ *
+ * Records source information that can be used for tooling to determine the source location of
+ * the corresponding composable function. By default, this function is declared as having no
+ * side-effects. It is safe for code shrinking tools (such as R8 or ProGuard) to remove it.
+ */
+@ComposeCompilerApi
+fun sourceInformation(composer: Composer, sourceInformation: String) {
+    composer.sourceInformation(sourceInformation)
+}
+
+/**
+ * A Compose internal function. DO NOT call directly.
+ *
+ * Records the start of a source information marker that can be used for tooling to determine the
+ * source location of the corresponding composable function that otherwise don't require tracking
+ * information such as [ReadOnlyComposable] functions. By default, this function is declared as
+ * having no side-effects. It is safe for code shrinking tools (such as R8 or ProGuard) to remove
+ * it.
+ *
+ * Important that both [sourceInformationMarkerStart] and [sourceInformationMarkerEnd] are removed
+ * together or both kept. Removing only one will cause incorrect runtime behavior.
+ */
+@ComposeCompilerApi
+fun sourceInformationMarkerStart(composer: Composer, key: Int, sourceInformation: String) {
+    composer.sourceInformationMarkerStart(key, sourceInformation)
+}
+
+/**
+ * A Compose internal function. DO NOT call directly.
+ *
+ * Records the end of a source information marker that can be used for tooling to determine the
+ * source location of the corresponding composable function that otherwise don't require tracking
+ * information such as [ReadOnlyComposable] functions. By default, this function is declared as
+ * having no side-effects. It is safe for code shrinking tools (such as R8 or ProGuard) to remove
+ * it.
+ *
+ * Important that both [sourceInformationMarkerStart] and [sourceInformationMarkerEnd] are removed
+ * together or both kept. Removing only one will cause incorrect runtime behavior.
+ */
+@ComposeCompilerApi
+fun sourceInformationMarkerEnd(composer: Composer) {
+    composer.sourceInformationMarkerEnd()
+}
+
+/**
  * Implementation of a composer for a mutable tree.
  */
 internal class ComposerImpl(
@@ -952,6 +1034,8 @@
     private val providerUpdates = HashMap<Int, CompositionLocalMap>()
     private var providersInvalid = false
     private val providersInvalidStack = IntStack()
+    private var reusing = false
+    private var reusingGroup = -1
     private var childrenComposing: Int = 0
     private var snapshot = currentSnapshot()
 
@@ -1000,10 +1084,6 @@
     @ComposeCompilerApi
     override fun startReplaceableGroup(key: Int) = start(key, null, false, null)
 
-    @ComposeCompilerApi
-    override fun startReplaceableGroup(key: Int, sourceInformation: String?) =
-        start(key, null, false, sourceInformation)
-
     /**
      * Indicates the end of a "Replaceable Group" at the current execution position. A
      * Replaceable Group is a group which cannot be moved between its siblings, but
@@ -1083,10 +1163,6 @@
     @ComposeCompilerApi
     override fun startMovableGroup(key: Int, dataKey: Any?) = start(key, dataKey, false, null)
 
-    @ComposeCompilerApi
-    override fun startMovableGroup(key: Int, dataKey: Any?, sourceInformation: String?) =
-        start(key, dataKey, false, sourceInformation)
-
     /**
      * Indicates the end of a "Movable Group" at the current execution position. A Movable Group is
      * a group which can be moved or reordered between its siblings and retain slot table state,
@@ -1174,7 +1250,7 @@
      */
     @ComposeCompilerApi
     override val skipping: Boolean get() {
-        return !inserting &&
+        return !inserting && !reusing &&
             !providersInvalid &&
             currentRecomposeScope?.requiresRecompose == false
     }
@@ -1196,92 +1272,6 @@
         collectParameterInformation = true
     }
 
-    /**
-     * Helper for collecting remember observers for later strictly ordered dispatch.
-     *
-     * This includes support for the deprecated [RememberObserver] which should be
-     * removed with it.
-     */
-    private class RememberEventDispatcher(
-        private val abandoning: MutableSet<RememberObserver>
-    ) : RememberManager {
-        private val remembering = mutableListOf<RememberObserver>()
-        private val forgetting = mutableListOf<RememberObserver>()
-        private val sideEffects = mutableListOf<() -> Unit>()
-
-        override fun remembering(instance: RememberObserver) {
-            forgetting.lastIndexOf(instance).let { index ->
-                if (index >= 0) {
-                    forgetting.removeAt(index)
-                    abandoning.remove(instance)
-                } else {
-                    remembering.add(instance)
-                }
-            }
-        }
-
-        override fun forgetting(instance: RememberObserver) {
-            remembering.lastIndexOf(instance).let { index ->
-                if (index >= 0) {
-                    remembering.removeAt(index)
-                    abandoning.remove(instance)
-                } else {
-                    forgetting.add(instance)
-                }
-            }
-        }
-
-        override fun sideEffect(effect: () -> Unit) {
-            sideEffects += effect
-        }
-
-        val hasEffects: Boolean
-            get() = sideEffects.isNotEmpty() ||
-                forgetting.isNotEmpty() ||
-                remembering.isNotEmpty()
-
-        fun dispatchRememberObservers() {
-            // Send forgets
-            if (forgetting.isNotEmpty()) {
-                for (index in forgetting.indices.reversed()) {
-                    val instance = forgetting[index]
-                    if (instance !in abandoning)
-                        instance.onForgotten()
-                }
-            }
-
-            // Send remembers
-            if (remembering.isNotEmpty()) {
-                remembering.fastForEach { instance ->
-                    abandoning.remove(instance)
-                    instance.onRemembered()
-                }
-            }
-        }
-
-        fun dispatchSideEffects() {
-            if (sideEffects.isNotEmpty()) {
-                sideEffects.fastForEach { sideEffect ->
-                    sideEffect()
-                }
-                sideEffects.clear()
-            }
-        }
-
-        fun dispatchAbandons() {
-            if (abandoning.isNotEmpty()) {
-                trace("Compose:dispatchAbandons") {
-                    val iterator = abandoning.iterator()
-                    while (iterator.hasNext()) {
-                        val instance = iterator.next()
-                        iterator.remove()
-                        instance.onAbandoned()
-                    }
-                }
-            }
-        }
-    }
-
     @OptIn(InternalComposeApi::class)
     internal fun dispose() {
         trace("Compose:Composer.dispose") {
@@ -1290,17 +1280,6 @@
             invalidations.clear()
             changes.clear()
             applier.clear()
-            if (slotTable.groupsSize > 0) {
-                val manager = RememberEventDispatcher(abandonSet)
-                slotTable.write { writer ->
-                    writer.removeCurrentGroup(manager)
-                }
-                providerUpdates.clear()
-                applier.clear()
-                manager.dispatchRememberObservers()
-            } else {
-                applier.clear()
-            }
             isDisposed = true
         }
     }
@@ -1337,6 +1316,16 @@
      * is scheduled to be inserted at the current location.
      */
     override fun startNode() {
+        val key = if (inserting) nodeKey
+        else if (reusing)
+            if (reader.groupKey == nodeKey) nodeKeyReplace else nodeKey
+        else if (reader.groupKey == nodeKeyReplace) nodeKeyReplace
+        else nodeKey
+        start(key, null, true, null)
+        nodeExpected = true
+    }
+
+    override fun startReusableNode() {
         start(nodeKey, null, true, null)
         nodeExpected = true
     }
@@ -1384,6 +1373,31 @@
      */
     override fun endNode() = end(isNode = true)
 
+    override fun startReusableGroup(key: Int, dataKey: Any?) {
+        if (reader.groupKey == key && reader.groupAux != dataKey && reusingGroup < 0) {
+            // Starting to reuse nodes
+            reusingGroup = reader.currentGroup
+            reusing = true
+        }
+        start(key, null, false, dataKey)
+    }
+
+    override fun endReusableGroup() {
+        if (reusing && reader.parent == reusingGroup) {
+            reusingGroup = -1
+            reusing = false
+        }
+        end(isNode = false)
+    }
+
+    override fun disableReusing() {
+        reusing = false
+    }
+
+    override fun enableReusing() {
+        reusing = reusingGroup >= 0
+    }
+
     /**
      * Schedule a change to be applied to a node's property. This change will be applied to the
      * node that is the current node in the tree which was either created by [createNode].
@@ -1414,7 +1428,7 @@
     internal fun nextSlot(): Any? = if (inserting) {
         validateNodeNotExpected()
         Composer.Empty
-    } else reader.next()
+    } else reader.next().let { if (reusing) Composer.Empty else it }
 
     /**
      * Determine if the current slot table value is equal to the given value, if true, the value
@@ -1786,7 +1800,7 @@
     private fun start(key: Int, objectKey: Any?, isNode: Boolean, data: Any?) {
         validateNodeNotExpected()
 
-        updateCompoundKeyWhenWeEnterGroup(key, objectKey)
+        updateCompoundKeyWhenWeEnterGroup(key, objectKey, data)
 
         // Check for the insert fast path. If we are already inserting (creating nodes) then
         // there is no need to track insert, deletes and moves with a pending changes object.
@@ -1924,10 +1938,18 @@
 
         if (inserting) {
             val parent = writer.parent
-            updateCompoundKeyWhenWeExitGroup(writer.groupKey(parent), writer.groupObjectKey(parent))
+            updateCompoundKeyWhenWeExitGroup(
+                writer.groupKey(parent),
+                writer.groupObjectKey(parent),
+                writer.groupAux(parent)
+            )
         } else {
             val parent = reader.parent
-            updateCompoundKeyWhenWeExitGroup(reader.groupKey(parent), reader.groupObjectKey(parent))
+            updateCompoundKeyWhenWeExitGroup(
+                reader.groupKey(parent),
+                reader.groupObjectKey(parent),
+                reader.groupAux(parent)
+            )
         }
         var expectedNodeCount = groupNodeCount
         val pending = pending
@@ -2311,13 +2333,17 @@
                 recomposeGroup,
                 recomposeKey
             ) rol 3
-            ) xor (
-            if (reader.hasObjectKey(group))
-                reader.groupObjectKey(group)?.hashCode() ?: 0
-            else reader.groupKey(group)
-            )
+            ) xor reader.groupCompoundKeyPart(group)
     }
 
+    private fun SlotReader.groupCompoundKeyPart(group: Int) =
+        if (hasObjectKey(group)) groupObjectKey(group)?.hashCode() ?: 0
+        else groupKey(group).let {
+            if (it == reusingGroup) groupAux(group)?.let { aux ->
+                if (aux == Composer.Empty) it else aux.hashCode()
+            } ?: it else it
+        }
+
     internal fun invalidateForResult(scope: RecomposeScopeImpl): InvalidationResult {
         if (scope.defaultsInScope) {
             scope.defaultsInvalid = true
@@ -2370,11 +2396,12 @@
             val reader = reader
             val key = reader.groupKey
             val dataKey = reader.groupObjectKey
-            updateCompoundKeyWhenWeEnterGroup(key, dataKey)
+            val aux = reader.groupAux
+            updateCompoundKeyWhenWeEnterGroup(key, dataKey, aux)
             startReaderGroup(reader.isNode, null)
             recomposeToGroupEnd()
             reader.endGroup()
-            updateCompoundKeyWhenWeExitGroup(key, dataKey)
+            updateCompoundKeyWhenWeExitGroup(key, dataKey, aux)
         }
     }
 
@@ -2389,7 +2416,7 @@
     @ComposeCompilerApi
     override fun skipToGroupEnd() {
         check(groupNodeCount == 0) { "No nodes can be emitted before calling skipAndEndGroup" }
-        currentRecomposeScope?.used = false
+        currentRecomposeScope?.scopeSkipped()
         if (invalidations.isEmpty()) {
             skipReaderToGroupEnd()
         } else {
@@ -2410,13 +2437,6 @@
         return this
     }
 
-    @ComposeCompilerApi
-    override fun startRestartGroup(key: Int, sourceInformation: String?): Composer {
-        start(key, null, false, sourceInformation)
-        addRecomposeScope()
-        return this
-    }
-
     private fun addRecomposeScope() {
         if (inserting) {
             val scope = RecomposeScopeImpl(composition as CompositionImpl)
@@ -2465,6 +2485,23 @@
         return result
     }
 
+    @ComposeCompilerApi
+    override fun sourceInformation(sourceInformation: String) {
+        if (inserting) {
+            writer.insertAux(sourceInformation)
+        }
+    }
+
+    @ComposeCompilerApi
+    override fun sourceInformationMarkerStart(key: Int, sourceInformation: String) {
+        start(key, objectKey = null, isNode = false, data = sourceInformation)
+    }
+
+    @ComposeCompilerApi
+    override fun sourceInformationMarkerEnd() {
+        end(isNode = false)
+    }
+
     /**
      * Synchronously compose the initial composition of [content]. This collects all the changes
      * which must be applied by [ControlledComposition.applyChanges] to build the tree implied by
@@ -2963,9 +3000,12 @@
         }
     }
 
-    private fun updateCompoundKeyWhenWeEnterGroup(groupKey: Int, dataKey: Any?) {
+    private fun updateCompoundKeyWhenWeEnterGroup(groupKey: Int, dataKey: Any?, data: Any?) {
         if (dataKey == null)
-            updateCompoundKeyWhenWeEnterGroupKeyHash(groupKey)
+            if (data != null && groupKey == reuseKey && data != Composer.Empty)
+                updateCompoundKeyWhenWeEnterGroupKeyHash(data.hashCode())
+            else
+                updateCompoundKeyWhenWeEnterGroupKeyHash(groupKey)
         else
             updateCompoundKeyWhenWeEnterGroupKeyHash(dataKey.hashCode())
     }
@@ -2974,9 +3014,12 @@
         compoundKeyHash = (compoundKeyHash rol 3) xor keyHash
     }
 
-    private fun updateCompoundKeyWhenWeExitGroup(groupKey: Int, dataKey: Any?) {
+    private fun updateCompoundKeyWhenWeExitGroup(groupKey: Int, dataKey: Any?, data: Any?) {
         if (dataKey == null)
-            updateCompoundKeyWhenWeExitGroupKeyHash(groupKey)
+            if (data != null && groupKey == reuseKey && data != Composer.Empty)
+                updateCompoundKeyWhenWeExitGroupKeyHash(data.hashCode())
+            else
+                updateCompoundKeyWhenWeExitGroupKeyHash(groupKey)
         else
             updateCompoundKeyWhenWeExitGroupKeyHash(dataKey.hashCode())
     }
@@ -3010,7 +3053,6 @@
      * @see update
      */
     @Suppress("NOTHING_TO_INLINE") // Inlining the compare has noticeable impact
-    @OptIn(ComposeCompilerApi::class)
     inline fun set(
         value: Int,
         noinline block: T.(value: Int) -> Unit
@@ -3112,7 +3154,6 @@
         composer.apply<Unit, T>(Unit, { this.block() })
     }
 }
-
 @Suppress("EXPERIMENTAL_FEATURE_WARNING")
 inline class SkippableUpdater<T> constructor(
     @PublishedApi internal val composer: Composer
@@ -3124,7 +3165,7 @@
     }
 }
 
-private fun SlotWriter.removeCurrentGroup(rememberManager: RememberManager) {
+internal fun SlotWriter.removeCurrentGroup(rememberManager: RememberManager) {
     // Notify the lifecycle manager of any observers leaving the slot table
     // The notification order should ensure that listeners are notified of leaving
     // in opposite order that they are notified of entering.
@@ -3302,9 +3343,12 @@
 // a unique key.
 private const val rootKey = 100
 
-// An arbitrary value paired with a boxed Int or a JoinKey data key.
+// An arbitrary key value for a node.
 private const val nodeKey = 125
 
+// An arbitrary key value for a node used to force the node to be replaced.
+private const val nodeKeyReplace = 126
+
 @PublishedApi
 internal const val invocationKey = 200
 
@@ -3340,3 +3384,6 @@
 
 @PublishedApi
 internal val reference: Any = OpaqueKey("reference")
+
+@PublishedApi
+internal const val reuseKey = 207
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 153ba94..9303c6c 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
@@ -279,7 +279,7 @@
     private val parent: CompositionContext,
 
     /**
-     * The applier to use to update the tree managed by the compositon.
+     * The applier to use to update the tree managed by the composition.
      */
     private val applier: Applier<*>,
 
@@ -344,7 +344,7 @@
      * As [RecomposeScope]s are removed the corresponding entries in the observations set must be
      * removed as well. This process is expensive so should only be done if it is certain the
      * [observations] set contains [RecomposeScope] that is no longer needed. [pendingInvalidScopes]
-     * is set to true whenver a [RecomposeScope] is removed from the [slotTable].
+     * is set to true whenever a [RecomposeScope] is removed from the [slotTable].
      */
     internal var pendingInvalidScopes = false
 
@@ -459,8 +459,17 @@
             if (!disposed) {
                 disposed = true
                 composable = {}
+                if (slotTable.groupsSize > 0) {
+                    val manager = RememberEventDispatcher(abandonSet)
+                    slotTable.write { writer ->
+                        writer.removeCurrentGroup(manager)
+                    }
+                    applier.clear()
+                    manager.dispatchRememberObservers()
+                }
                 composer.dispose()
                 parent.unregisterComposition(this)
+                parent.unregisterComposition(this)
             }
         }
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
index 031000f..84b97df 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
@@ -37,7 +37,6 @@
  * stored in [anchor] and call [block] when recomposition is requested. It is created by
  * [Composer.startRestartGroup] and is used to track how to restart the group.
  */
-@OptIn(ComposeCompilerApi::class)
 internal class RecomposeScopeImpl(
     var composition: CompositionImpl?
 ) : ScopeUpdateScope, RecomposeScope {
@@ -121,6 +120,7 @@
     override fun updateScope(block: (Composer, Int) -> Unit) { this.block = block }
 
     private var currentToken = 0
+    private var skipped = false
     private var trackedInstances: IdentityArrayIntMap? = null
 
     /**
@@ -128,8 +128,14 @@
      * unique everytime this is called. This is currently the snapshot id but that shouldn't be
      * relied on.
      */
-    fun start(token: Int) { currentToken = token }
+    fun start(token: Int) {
+        currentToken = token
+        skipped = false
+    }
 
+    fun scopeSkipped() {
+        skipped = true
+    }
     /**
      * Track instances that were read in scope.
      */
@@ -151,7 +157,7 @@
             // [used] is false if the scope was skipped. If the scope was skipped we should
             // leave the observations unmodified.
             if (
-                used && instances.any { _, instanceToken -> instanceToken != token }
+                !skipped && instances.any { _, instanceToken -> instanceToken != token }
             ) { composition ->
                 if (
                     currentToken == token && instances == trackedInstances &&
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
index 57cf35b..8e8a725 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SlotTable.kt
@@ -1127,6 +1127,37 @@
     }
 
     /**
+     * Insert aux data into the parent group.
+     *
+     * This must be done only after at most one value has been inserted into the slot table for
+     * the group.
+     */
+    fun insertAux(value: Any?) {
+        check(insertCount >= 0) { "Cannot insert auxiliary data when not inserting" }
+        val parent = parent
+        val parentGroupAddress = groupIndexToAddress(parent)
+        check(!groups.hasAux(parentGroupAddress)) { "Group already has auxiliary data" }
+        insertSlots(1, parent)
+        val auxIndex = groups.auxIndex(parentGroupAddress)
+        val auxAddress = dataIndexToDataAddress(auxIndex)
+        if (currentSlot > auxIndex) {
+            // One or more values were inserted into the slot table before the aux value, we need
+            // to move them. Currently we only will run into one or two slots (the recompose
+            // scope inserted by a restart group and the lambda value in a composableLambda
+            // instance) so this is the only case currently supported.
+            val slotsToMove = currentSlot - auxIndex
+            check(slotsToMove < 3) { "Moving more than two slot not supported" }
+            if (slotsToMove > 1) {
+                slots[auxAddress + 2] = slots[auxAddress + 1]
+            }
+            slots[auxAddress + 1] = slots[auxAddress]
+        }
+        groups.addAux(parentGroupAddress)
+        slots[auxAddress] = value
+        currentSlot++
+    }
+
+    /**
      * Updates the node for the current node group to [value].
      */
     fun updateNode(value: Any?) = updateNodeOfGroup(currentGroup, value)
@@ -1765,7 +1796,7 @@
             check(!anchorsRemoved) { "Unexpectedly removed anchors" }
 
             // Update the node count.
-            nodeCount += groups.nodeCount(currentGroup)
+            nodeCount += if (groups.isNode(currentGroup)) 1 else groups.nodeCount(currentGroup)
 
             // Move current passed the insert
             this.currentGroup = currentGroup + groupsToMove
@@ -2463,7 +2494,7 @@
 // 31 30 29 28_27 26 25 24_23 22 21 20_19 18 17 16__15 14 13 12_11 10 09 08_07 06 05 04_03 02 01 00
 // 0  n  ks ds r |                                node count                                       |
 // where n is set when the group represents a node
-// where ks is whether the group has a data key slot
+// where ks is whether the group has a object key slot
 // where ds is whether the group has a group data slot
 // where r is always 0 (future use)
 
@@ -2508,6 +2539,11 @@
 }
 private fun IntArray.hasAux(address: Int) =
     this[address * Group_Fields_Size + GroupInfo_Offset] and Aux_Mask != 0
+private fun IntArray.addAux(address: Int) {
+    val arrayIndex = address * Group_Fields_Size + GroupInfo_Offset
+    this[arrayIndex] = this[arrayIndex] or Aux_Mask
+}
+
 private fun IntArray.auxIndex(address: Int) = (address * Group_Fields_Size).let { slot ->
     if (slot >= size) size
     else this[slot + DataAnchor_Offset] +
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
index 3c49b27..368da08 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.kt
@@ -44,12 +44,10 @@
  */
 @Suppress("NAME_SHADOWING")
 @Stable
-@OptIn(ComposeCompilerApi::class)
 /* ktlint-disable parameter-list-wrapping */ // TODO(https://github.com/pinterest/ktlint/issues/921): reenable
 internal expect class ComposableLambdaImpl(
     key: Int,
-    tracked: Boolean,
-    sourceInformation: String?
+    tracked: Boolean
 ) : ComposableLambda {
     fun update(block: Any)
 }
@@ -328,13 +326,12 @@
     composer: Composer,
     key: Int,
     tracked: Boolean,
-    sourceInformation: String?,
     block: Any
 ): ComposableLambda {
     composer.startReplaceableGroup(key)
     val slot = composer.rememberedValue()
     val result = if (slot === Composer.Empty) {
-        val value = ComposableLambdaImpl(key, tracked, sourceInformation)
+        val value = ComposableLambdaImpl(key, tracked)
         composer.updateRememberedValue(value)
         value
     } else {
@@ -350,7 +347,6 @@
 fun composableLambdaInstance(
     key: Int,
     tracked: Boolean,
-    sourceInformation: String?,
     block: Any
 ): ComposableLambda =
-    ComposableLambdaImpl(key, tracked, sourceInformation).apply { update(block) }
+    ComposableLambdaImpl(key, tracked).apply { update(block) }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
index 4398df4..0a334de 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/internal/LiveLiteral.kt
@@ -63,7 +63,6 @@
  * Caution: This API is intended to be used by tooling only. Use at your own risk.
  */
 @InternalComposeApi
-@OptIn(ComposeCompilerApi::class)
 fun enableLiveLiterals() {
     isLiveLiteralsEnabled = true
 }
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
index 8fe6f28..172a413 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambda.jvm.kt
@@ -33,12 +33,10 @@
  */
 @Suppress("NAME_SHADOWING")
 @Stable
-@OptIn(ComposeCompilerApi::class)
 /* ktlint-disable parameter-list-wrapping */ // TODO(https://github.com/pinterest/ktlint/issues/921): reenable
 internal actual class ComposableLambdaImpl actual constructor(
     val key: Int,
-    private val tracked: Boolean,
-    private val sourceInformation: String?
+    private val tracked: Boolean
 ) : ComposableLambda {
     private var _block: Any? = null
     private var scope: RecomposeScope? = null
@@ -103,7 +101,7 @@
     }
 
     override operator fun invoke(c: Composer, changed: Int): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(0) else sameBits(0)
         val result = (_block as (c: Composer, changed: Int) -> Any?)(c, dirty)
@@ -112,7 +110,7 @@
     }
 
     override operator fun invoke(p1: Any?, c: Composer, changed: Int): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(1) else sameBits(1)
         val result = (
@@ -131,7 +129,7 @@
     }
 
     override operator fun invoke(p1: Any?, p2: Any?, c: Composer, changed: Int): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(2) else sameBits(2)
         val result = (_block as (p1: Any?, p2: Any?, c: Composer, changed: Int) -> Any?)(
@@ -145,7 +143,7 @@
     }
 
     override operator fun invoke(p1: Any?, p2: Any?, p3: Any?, c: Composer, changed: Int): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(3) else sameBits(3)
         val result = (
@@ -175,7 +173,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(4) else sameBits(4)
         val result = (
@@ -210,7 +208,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(5) else sameBits(5)
         val result = (
@@ -248,7 +246,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(6) else sameBits(6)
         val result = (
@@ -289,7 +287,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(7) else sameBits(7)
         val result = (
@@ -333,7 +331,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(8) else sameBits(8)
         val result = (
@@ -380,7 +378,7 @@
         c: Composer,
         changed: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed or if (c.changed(this)) differentBits(9) else sameBits(9)
         val result = (
@@ -431,7 +429,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(10) else sameBits(10)
         val result = (
@@ -487,7 +485,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(11) else sameBits(11)
         val result = (
@@ -546,7 +544,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(12) else sameBits(12)
         val result = (
@@ -608,7 +606,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(13) else sameBits(13)
         val result = (
@@ -690,7 +688,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(14) else sameBits(14)
         val result = (
@@ -776,7 +774,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(15) else sameBits(15)
         val result = (
@@ -866,7 +864,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(16) else sameBits(16)
         val result = (
@@ -960,7 +958,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(17) else sameBits(17)
         val result = (
@@ -1058,7 +1056,7 @@
         changed: Int,
         changed1: Int
     ): Any? {
-        val c = c.startRestartGroup(key, sourceInformation)
+        val c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = changed1 or if (c.changed(this)) differentBits(18) else sameBits(18)
         val result = (
diff --git a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
index 332eb56..3193f395 100644
--- a/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
+++ b/compose/runtime/runtime/src/jvmMain/kotlin/androidx/compose/runtime/internal/ComposableLambdaN.jvm.kt
@@ -27,11 +27,9 @@
 private const val SLOTS_PER_INT = 10
 
 @Stable
-@OptIn(ComposeCompilerApi::class)
 internal class ComposableLambdaNImpl(
     val key: Int,
     private val tracked: Boolean,
-    private val sourceInformation: String?,
     override val arity: Int
 ) : ComposableLambdaN {
     private var _block: Any? = null
@@ -113,7 +111,7 @@
         var c = args[realParams] as Composer
         val allArgsButLast = args.slice(0 until args.size - 1).toTypedArray()
         val lastChanged = args[args.size - 1] as Int
-        c = c.startRestartGroup(key, sourceInformation)
+        c = c.startRestartGroup(key)
         trackRead(c)
         val dirty = lastChanged or if (c.changed(this))
             differentBits(realParams)
@@ -147,14 +145,13 @@
     composer: Composer,
     key: Int,
     tracked: Boolean,
-    sourceInformation: String?,
     arity: Int,
     block: Any
 ): ComposableLambdaN {
     composer.startReplaceableGroup(key)
     val slot = composer.rememberedValue()
     val result = if (slot === Composer.Empty) {
-        val value = ComposableLambdaNImpl(key, tracked, sourceInformation, arity)
+        val value = ComposableLambdaNImpl(key, tracked, arity)
         composer.updateRememberedValue(value)
         value
     } else {
@@ -171,12 +168,10 @@
 fun composableLambdaNInstance(
     key: Int,
     tracked: Boolean,
-    sourceInformation: String?,
     arity: Int,
     block: Any
 ): ComposableLambdaN = ComposableLambdaNImpl(
     key,
     tracked,
-    sourceInformation,
     arity
 ).apply { update(block) }
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionReusingTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionReusingTests.kt
new file mode 100644
index 0000000..b698eae
--- /dev/null
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionReusingTests.kt
@@ -0,0 +1,195 @@
+/*
+ * 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.runtime
+
+import androidx.compose.runtime.mock.CompositionTestScope
+import androidx.compose.runtime.mock.Linear
+import androidx.compose.runtime.mock.NonReusableLinear
+import androidx.compose.runtime.mock.NonReusableText
+import androidx.compose.runtime.mock.Text
+import androidx.compose.runtime.mock.View
+import androidx.compose.runtime.mock.compositionTest
+import androidx.compose.runtime.mock.expectChanges
+import androidx.compose.runtime.mock.flatten
+import androidx.compose.runtime.mock.revalidate
+import androidx.compose.runtime.mock.validate
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+
+@Stable
+class CompositionReusingTests {
+
+    @Test
+    fun canReuse() = compositionTest {
+        var lastData: State<Int>? = null
+        var key by mutableStateOf(0)
+
+        compose {
+            ReusableContent(key) {
+                Linear {
+                    val data = remember { mutableStateOf(1) }
+                    lastData = data
+                    Text("Key = $key")
+                }
+            }
+        }
+
+        validate {
+            Linear {
+                Text("Key = $key")
+            }
+        }
+
+        val firstData = lastData
+        val nodes = root.flatten()
+
+        key++
+        expectChanges()
+        revalidate()
+
+        val nodesAfterChange = root.flatten()
+
+        // Ensure nodes are reused
+        assertArrayEquals(nodes, nodesAfterChange) { "${it.hashCode()}" }
+
+        // Ensure remembers are not reused
+        assertNotEquals(
+            firstData, lastData,
+            "Should not remember values when recycling"
+        )
+    }
+
+    @Test
+    fun canRecycleAroundNonReusable() = compositionTest {
+        var key by mutableStateOf(0)
+
+        compose {
+            ReusableContent(key) {
+                Linear {
+                    Text("Key = $key")
+                    NonReusableText("Non-recyclable key = $key")
+                }
+            }
+        }
+
+        validate {
+            Linear {
+                Text("Key = $key")
+                Text("Non-recyclable key = $key")
+            }
+        }
+
+        val recycleText = findTextWith("Key")
+        val nonRecycledText = findTextWith("Non-recyclable key")
+        key++
+        expectChanges()
+        revalidate()
+
+        assertEquals(recycleText, findTextWith("Key"), "Expected text to be recycled")
+        assertNotEquals(
+            nonRecycledText,
+            findTextWith("Non-recyclable key"),
+            "Expected non-recyclable text to be replaced"
+        )
+    }
+
+    @Test
+    fun recyclableNodesInNonReusableContainerNotRecycled() = compositionTest {
+        var key by mutableStateOf(0)
+
+        compose {
+            ReusableContent(key) {
+                Linear {
+                    Linear {
+                        Text("Key = $key")
+                    }
+                    NonReusableLinear {
+                        Text("Non-recyclable key = $key")
+                    }
+                    NonReusableLinear { }
+                }
+            }
+        }
+
+        validate {
+            Linear {
+                Linear {
+                    Text("Key = $key")
+                }
+                Linear {
+                    Text("Non-recyclable key = $key")
+                }
+                Linear { }
+            }
+        }
+
+        val recycleText = findTextWith("Key")
+        val nonRecycledText = findTextWith("Non-recyclable key")
+        key++
+        expectChanges()
+        revalidate()
+        verifyConsistent()
+
+        assertEquals(recycleText, findTextWith("Key"), "Expected text to be recycled")
+        assertNotEquals(
+            nonRecycledText,
+            findTextWith("Non-recyclable key"),
+            "Expected non-recyclable text to be replaced"
+        )
+    }
+
+    @Test
+    fun compositeHashCodeReflectsReusableChanges() = compositionTest {
+        var key by mutableStateOf(0)
+        var lastCompositeHash = 0
+
+        compose {
+            ReusableContent(key) {
+                Linear {
+                    Text("Key = $key")
+                    lastCompositeHash = currentCompositeKeyHash
+                }
+            }
+        }
+
+        validate {
+            Linear {
+                Text("Key = $key")
+            }
+        }
+
+        val firstCompositeHash = lastCompositeHash
+        key++
+        expectChanges()
+        revalidate()
+        assertNotEquals(firstCompositeHash, lastCompositeHash)
+    }
+}
+
+private fun View.findTextWith(contains: String) =
+    find { it.name == "text" && it.text?.contains(contains) == true }
+private fun CompositionTestScope.findTextWith(contains: String) = root.findTextWith(contains)
+
+private fun View.find(predicate: (view: View) -> Boolean): View? {
+    if (predicate(this)) return this
+    for (child in children) {
+        val found = child.find(predicate)
+        if (found != null) return found
+    }
+    return null
+}
\ 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 8f86427..c4d79b1 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
@@ -1952,7 +1952,6 @@
         var innerScope: RecomposeScope? = null
 
         @Composable
-        @OptIn(ComposeCompilerApi::class)
         fun Test() {
             outerScope = currentRecomposeScope
             outerKeys.add(currentComposer.compoundKeyHash)
@@ -2516,7 +2515,53 @@
         expectNoChanges()
     }
 
-    @OptIn(ComposeCompilerApi::class)
+    @Composable
+    fun <T> calculateValue(state: State<T>): T {
+        return remember { state.value }
+    }
+
+    var observationScopeTestCalls = 0
+    var observationScopeTestForwardWrite = false
+
+    @Composable
+    fun <T> ObservationScopesTest(state: State<T>, forwardWrite: Boolean) {
+        observationScopeTestCalls++
+        calculateValue(state)
+        observationScopeTestForwardWrite = forwardWrite
+    }
+
+    @Composable
+    fun ForwardWrite(state: MutableState<String>) {
+        state.value += ", forward write"
+    }
+
+    @Test // Regression test for b/186787946
+    fun testObservationScopes_ReadInRemember() = compositionTest {
+        val state = mutableStateOf("state")
+        var mainState by mutableStateOf("main state")
+        var doForwardWrite by mutableStateOf(false)
+        compose {
+            Text(mainState)
+            ObservationScopesTest(state, doForwardWrite)
+            if (doForwardWrite)
+                ForwardWrite(state)
+        }
+
+        // Set up the case by skipping ObservationScopeTest
+        mainState += ", changed"
+        advance()
+
+        // Do the forward write after skipping ObserveScopesTest.
+        // This triggers a backward write in ForwardWrite because of the remember.
+        // This backwards write is transitory as future writes will just be forward writes.
+        doForwardWrite = true
+        advance(ignorePendingWork = true)
+
+        // Assert we saw true. In the bug this is false because a stale value was used for
+        // `doForwardWrite` because the scope callback lambda was not updated correctly.
+        assertTrue(observationScopeTestForwardWrite)
+    }
+
     @Test
     fun testApplierBeginEndCallbacks() = compositionTest {
         val checks = mutableListOf<String>()
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/SlotTableTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/SlotTableTests.kt
index 820b9764..f5498d2 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/SlotTableTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/SlotTableTests.kt
@@ -1231,6 +1231,52 @@
         sourceTable.verifyWellFormed()
     }
 
+    @Test
+    fun testMovingANodeGroup() {
+        val sourceTable = SlotTable()
+        val anchors = mutableListOf<Anchor>()
+        sourceTable.write { writer ->
+            writer.beginInsert()
+            anchors.add(writer.anchor())
+            writer.startNode(10, 10)
+            writer.update(100)
+            writer.update(200)
+            writer.endGroup()
+            writer.endInsert()
+        }
+        sourceTable.verifyWellFormed()
+
+        val destinationTable = SlotTable()
+        destinationTable.write { writer ->
+            writer.beginInsert()
+            writer.startGroup(treeRoot)
+            writer.startGroup(1000)
+            writer.endGroup()
+            writer.endGroup()
+            writer.endInsert()
+        }
+        destinationTable.verifyWellFormed()
+
+        destinationTable.write { writer ->
+            writer.startGroup()
+            writer.startGroup()
+            writer.beginInsert()
+            writer.moveFrom(sourceTable, anchors.first().toIndexFor(sourceTable))
+            writer.endInsert()
+            writer.skipToGroupEnd()
+            writer.endGroup()
+            writer.skipToGroupEnd()
+            writer.endGroup()
+        }
+        destinationTable.verifyWellFormed()
+        destinationTable.read { reader ->
+            val anchor = anchors.first()
+            assertEquals(125, reader.groupKey(anchor))
+            assertEquals(10, reader.groupObjectKey(anchor.toIndexFor(destinationTable)))
+        }
+        sourceTable.verifyWellFormed()
+    }
+
     @org.junit.Test
     fun testMovingMultipleRootGroups() {
         val sourceTable = SlotTable()
@@ -3093,6 +3139,95 @@
         }
         slots.verifyWellFormed()
     }
+
+    @Test
+    fun canInsertAuxData() {
+        val slots = SlotTable().also {
+            it.write { writer ->
+                writer.insert {
+                    // Insert a normal aux data.
+                    writer.startData(10, 10, "10")
+                    writer.endGroup()
+
+                    // Insert using insertAux
+                    writer.startGroup(20)
+                    writer.insertAux("20")
+                    writer.endGroup()
+
+                    // Insert using insertAux after a slot value was added.
+                    writer.startGroup(30)
+                    writer.update(300)
+                    writer.insertAux("30")
+                    writer.endGroup()
+
+                    // Insert using insertAux after a group with an object key
+                    writer.startGroup(40, 40)
+                    writer.insertAux("40")
+                    writer.endGroup()
+
+                    // Insert aux into an object key with a value slot and then add another value.
+                    writer.startGroup(50, 50)
+                    writer.update(500)
+                    writer.insertAux("50")
+                    writer.update(501)
+                    writer.endGroup()
+
+                    // Insert aux after two slot values and then add another value.
+                    writer.startGroup(60)
+                    writer.update(600)
+                    writer.update(601)
+                    writer.insertAux("60")
+                    writer.update(602)
+                    writer.endGroup()
+
+                    // Write a trail group to ensure that the slot table is valid after the
+                    // insertAux
+                    writer.startGroup(1000)
+                    writer.update(10000)
+                    writer.update(10001)
+                    writer.endGroup()
+                }
+            }
+        }
+        slots.verifyWellFormed()
+        slots.read { reader ->
+            assertEquals(10, reader.groupKey)
+            assertEquals(10, reader.groupObjectKey)
+            assertEquals("10", reader.groupAux)
+            reader.skipGroup()
+            assertEquals(20, reader.groupKey)
+            assertEquals("20", reader.groupAux)
+            reader.skipGroup()
+            assertEquals(30, reader.groupKey)
+            assertEquals("30", reader.groupAux)
+            reader.startGroup()
+            assertEquals(300, reader.next())
+            reader.endGroup()
+            assertEquals(40, reader.groupKey)
+            assertEquals(40, reader.groupObjectKey)
+            assertEquals("40", reader.groupAux)
+            reader.skipGroup()
+            assertEquals(50, reader.groupKey)
+            assertEquals(50, reader.groupObjectKey)
+            assertEquals("50", reader.groupAux)
+            reader.startGroup()
+            assertEquals(500, reader.next())
+            assertEquals(501, reader.next())
+            reader.endGroup()
+            assertEquals(60, reader.groupKey)
+            assertEquals("60", reader.groupAux)
+            reader.startGroup()
+            assertEquals(600, reader.next())
+            assertEquals(601, reader.next())
+            assertEquals(602, reader.next())
+            reader.endGroup()
+            assertEquals(1000, reader.groupKey)
+            reader.startGroup()
+            assertEquals(10000, reader.next())
+            assertEquals(10001, reader.next())
+            reader.endGroup()
+        }
+    }
 }
 
 @OptIn(InternalComposeApi::class)
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
index f2933d3..63abe7b 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composition
+import androidx.compose.runtime.ControlledComposition
 import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.runtime.Recomposer
 import androidx.compose.runtime.snapshots.Snapshot
@@ -63,6 +64,12 @@
                 }
                 return recomposer.changeCount != changeCount
             }
+
+            override fun verifyConsistent() {
+                (composition as? ControlledComposition)?.verifyConsistent()
+            }
+
+            override var validator: (MockViewValidator.() -> Unit)? = null
         }
         scope.block()
         scope.composition?.dispose()
@@ -88,16 +95,32 @@
     fun advance(ignorePendingWork: Boolean = false): Boolean
 
     /**
+     * Verify the composition is well-formed.
+     */
+    fun verifyConsistent()
+
+    /**
      * The root mock view of the mock views being composed.
      */
     val root: View
+
+    /**
+     * The last validator used.
+     */
+    var validator: (MockViewValidator.() -> Unit)?
 }
 
 /**
  * Create a mock view validator and validate the view.
  */
 fun CompositionTestScope.validate(block: MockViewValidator.() -> Unit) =
-    MockViewListValidator(root.children).validate(block)
+    MockViewListValidator(root.children).validate(block).also { validator = block }
+
+/**
+ * Revalidate using the last validator
+ */
+fun CompositionTestScope.revalidate() =
+    validate(validator ?: error("validate was not called"))
 
 /**
  * Advance and expect changes
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/View.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/View.kt
index 4babb99..2f41caf 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/View.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/View.kt
@@ -100,3 +100,5 @@
         it.toString()
     }
 }
+
+fun View.flatten(): List<View> = listOf(this) + children.flatMap { it.flatten() }
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
index f4f16a0..5f90678 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposeNode
+import androidx.compose.runtime.ReusableComposeNode
 import androidx.compose.runtime.NonRestartableComposable
 import androidx.compose.runtime.key
 
@@ -35,6 +36,16 @@
 
 @Composable
 fun Linear(content: @Composable () -> Unit) {
+    ReusableComposeNode<View, ViewApplier>(
+        factory = { View().also { it.name = "linear" } },
+        update = { }
+    ) {
+        content()
+    }
+}
+
+@Composable
+fun NonReusableLinear(content: @Composable () -> Unit) {
     ComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "linear" } },
         update = { }
@@ -45,6 +56,14 @@
 
 @Composable @NonRestartableComposable
 fun Text(value: String) {
+    ReusableComposeNode<View, ViewApplier>(
+        factory = { View().also { it.name = "text" } },
+        update = { set(value) { text = it } }
+    )
+}
+
+@Composable
+fun NonReusableText(value: String) {
     ComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "text" } },
         update = { set(value) { text = it } }
@@ -53,7 +72,7 @@
 
 @Composable
 fun Edit(value: String) {
-    ComposeNode<View, ViewApplier>(
+    ReusableComposeNode<View, ViewApplier>(
         factory = { View().also { it.name = "edit" } },
         update = { set(value) { this.value = it } }
     )
@@ -65,7 +84,7 @@
     content: @Composable () -> Unit
 ) {
     if (selected) {
-        ComposeNode<View, ViewApplier>(
+        ReusableComposeNode<View, ViewApplier>(
             factory = { View().also { it.name = "box" } },
             update = { },
             content = { content() }
diff --git a/compose/test-utils/lint-baseline.xml b/compose/test-utils/lint-baseline.xml
index 0eddc06..b5e59a2 100644
--- a/compose/test-utils/lint-baseline.xml
+++ b/compose/test-utils/lint-baseline.xml
@@ -1,16 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="BanSynchronizedMethods"
-        message="Use of synchronized methods is not recommended"
-        errorLine1="        @Synchronized"
-        errorLine2="        ^">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/testutils/fake/FakeViewStructure.android.kt"
-            line="72"
-            column="9"/>
-    </issue>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -19,63 +8,85 @@
         errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="344"
+            line="345"
             column="1"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.compose.testutils.AndroidComposeTestCaseRunner is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.compose.testutils.AndroidComposeTestCaseRunner is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bitmap = Bitmap.createBitmap(picture)"
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="273"
+            line="274"
             column="29"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.testutils.RenderNodeCapture is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.testutils.RenderNodeCapture is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    private val renderNode = RenderNode(&quot;Test&quot;)"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="346"
+            line="347"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.testutils.RenderNodeCapture is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.testutils.RenderNodeCapture is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        renderNode.setPosition(0, 0, width, height)"
         errorLine2="                   ~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="349"
+            line="350"
             column="20"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.testutils.RenderNodeCapture is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.testutils.RenderNodeCapture is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return renderNode.beginRecording()"
         errorLine2="                          ~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="350"
+            line="351"
             column="27"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.testutils.RenderNodeCapture is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.testutils.RenderNodeCapture is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        renderNode.endRecording()"
         errorLine2="                   ~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt"
-            line="354"
+            line="355"
             column="20"/>
     </issue>
 
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.testutils.ViewCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            decorView.viewTreeObserver.registerFrameCommitCallback {"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt"
+            line="68"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.compose.testutils.ViewCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="    PixelCopy.request(windowToCapture, boundsInWindow, destBitmap, onCopyFinished, handler)"
+        errorLine2="              ~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/testutils/ViewCapture.android.kt"
+            line="104"
+            column="15"/>
+    </issue>
+
 </issues>
diff --git a/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt b/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
deleted file mode 100644
index c39f944..0000000
--- a/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
+++ /dev/null
@@ -1,55 +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.compose.testutils
-
-import androidx.compose.ui.unit.dp
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DpAssertionsTest {
-
-    @Test
-    fun dp_assertEquals() {
-        5.dp.assertIsEqualTo(5.dp)
-        5.dp.assertIsEqualTo(4.6.dp)
-        5.dp.assertIsEqualTo(5.4.dp)
-    }
-
-    @Test
-    fun dp_assertNotEquals() {
-        5.dp.assertIsNotEqualTo(6.dp)
-    }
-
-    @Test
-    fun dp_assertEquals_fail() {
-        expectError<AssertionError> {
-            5.dp.assertIsEqualTo(6.dp)
-        }
-    }
-
-    @Test
-    fun dp_assertNotEquals_fail() {
-        expectError<AssertionError> {
-            5.dp.assertIsNotEqualTo(5.dp)
-            5.dp.assertIsNotEqualTo(5.4.dp)
-        }
-    }
-}
\ No newline at end of file
diff --git a/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/ExpectTest.kt b/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/ExpectTest.kt
deleted file mode 100644
index 59c3005..0000000
--- a/compose/test-utils/src/androidAndroidTest/kotlin/androidx/compose/testutils/ExpectTest.kt
+++ /dev/null
@@ -1,126 +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.compose.testutils
-
-import com.google.common.truth.Truth.assertWithMessage
-import org.junit.Test
-
-class ExpectTest {
-
-    class TestException(message: String? = null) : Exception(message)
-
-    @Test
-    fun expectError_gotError() {
-        expectError<TestException> {
-            throw TestException()
-        }
-    }
-
-    @Test
-    fun expectError_gotErrorWithMessage() {
-        expectError<TestException> {
-            throw TestException("message")
-        }
-    }
-
-    @Test
-    fun expectError_gotErrorWithMultilineMessage() {
-        expectError<TestException> {
-            throw TestException("message\nwith 2 lines")
-        }
-    }
-
-    @Test
-    fun expectError_gotNothing() {
-        expectErrorMessage(
-            "Expected that a TestException was thrown, but nothing was thrown"
-        ) {
-            expectError<TestException> {
-            }
-        }
-    }
-
-    @Test
-    fun expectError_gotDifferentError() {
-        expectErrorMessage(
-            "Expected that a TestException was thrown, but a IllegalStateException was thrown:\n=="
-        ) {
-            expectError<TestException> {
-                throw IllegalStateException()
-            }
-        }
-    }
-
-    @Test
-    fun expectNoError_gotNoError() {
-        expectError<TestException>(false) {
-        }
-    }
-
-    @Test
-    fun expectNoError_gotError() {
-        expectErrorMessage(
-            "Expected that nothing was thrown, but a TestException was thrown:\n=="
-        ) {
-            expectError<TestException>(false) {
-                throw TestException()
-            }
-        }
-    }
-
-    @Test
-    fun expectNoError_gotDifferentError() {
-        expectErrorMessage(
-            "Expected that nothing was thrown, but a IllegalStateException was thrown:\n=="
-        ) {
-            expectError<TestException>(false) {
-                throw IllegalStateException()
-            }
-        }
-    }
-
-    @Test
-    fun expectErrorWithMessage_gotErrorWithMessage() {
-        expectError<TestException>(expectedMessage = "message") {
-            throw TestException("message")
-        }
-    }
-
-    @Test
-    fun expectErrorWithMessage_gotErrorWithDifferentMessage() {
-        expectErrorMessage(
-            "Expected that a TestException with message \"message\" was thrown, " +
-                "but a TestException with message \"message x\" was thrown:\n=="
-        ) {
-            expectError<TestException>(expectedMessage = "message") {
-                throw TestException("message x")
-            }
-        }
-    }
-
-    private fun expectErrorMessage(expectedErrorMessage: String, block: () -> Unit) {
-        try {
-            block()
-        } catch (e: AssertionError) {
-            assertWithMessage("expectError threw an AssertionError with the wrong message")
-                .that(e.message)
-                .startsWith(expectedErrorMessage)
-            return
-        }
-        throw AssertionError("Expected an AssertionError, but it wasn't thrown")
-    }
-}
\ No newline at end of file
diff --git a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
index fa4eff3..fe28c00 100644
--- a/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
+++ b/compose/test-utils/src/androidMain/kotlin/androidx/compose/testutils/AndroidComposeTestCaseRunner.android.kt
@@ -68,6 +68,7 @@
 
     internal var view: View? = null
         private set
+    override fun getHostView(): View = view!!
 
     override var didLastRecomposeHaveChanges = false
         private set
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
index 625f54b..03ee4ec 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeExecutionControl.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.testutils
 
+import android.view.View
+
 /**
  * Test scope accessible from execution controlled tests to test compose.
  */
@@ -89,6 +91,8 @@
      * Note this is also called as part of [doFrame]
      */
     fun recompose()
+
+    fun getHostView(): View
 }
 
 /**
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
index ed01647..28460d1 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ComposeTestCase.kt
@@ -37,7 +37,8 @@
 /**
  * To be implemented to provide a test case that is then executed in benchmarks.
  */
-interface LayeredComposeTestCase : ComposeTestCase {
+// TODO(b/185389423): Make this to be an interface once the compiler gets fixed.
+abstract class LayeredComposeTestCase : ComposeTestCase {
     /**
      * This method is guaranteed to be called only once per class lifetime. In case a benchmark
      * needs to measure initial composition / measure / layout / draw it re-creates this class
@@ -59,7 +60,7 @@
      * The lifecycle rules for this method are same as for [Content]
      */
     @Composable
-    fun MeasuredContent()
+    abstract fun MeasuredContent()
 
     /**
      * Receives the result of [MeasuredContent].
@@ -71,5 +72,7 @@
      * The lifecycle rules for this method are same as for [Content]
      */
     @Composable
-    fun ContentWrappers(content: @Composable () -> Unit)
+    open fun ContentWrappers(content: @Composable () -> Unit) {
+        content()
+    }
 }
\ No newline at end of file
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
index c8677c3..2ec325a 100644
--- a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/Expect.kt
@@ -37,6 +37,11 @@
  * Runs the [block] and asserts that a [T] is thrown with the [expectedMessage] if [expectError]
  * is `true`, or that nothing is thrown if [expectError] is `false`. The [expectedMessage] is a
  * regex with just the option [DOT_MATCHES_ALL] enabled.
+ *
+ * @param expectedMessage A regular expression that matches the entire expected error message. If
+ * you don't want to verify the entire error message, use `.*` in the appropriate places. The
+ * option [DOT_MATCHES_ALL] is enabled so you can match new lines with `.*`. Don't forget to
+ * escape special characters like `[`, `(` or `*` (and double escaping for `\`).
  */
 inline fun <reified T : Throwable> expectError(
     expectError: Boolean = true,
@@ -79,12 +84,12 @@
     } ?: ""
 
     fun String.plusMessage(message: String?): String {
-        return if (expectedMessage == null) this else "$this with message \"$message\""
+        return if (expectedMessage == null) this else "$this with message\n\"\"\"$message\"\"\"\n"
     }
 
     val expected = expectedClassName?.let { "a $it".plusMessage(expectedMessage) } ?: "nothing"
     val actual = thrown?.run { "a ${javaClass.simpleName}".plusMessage(message) } ?: "nothing"
     throw AssertionError(
-        "Expected that $expected was thrown, but $actual was thrown$stackTrace"
+        "Expected that $expected would be thrown, but $actual was thrown$stackTrace"
     )
 }
diff --git a/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt
new file mode 100644
index 0000000..64f01f6
--- /dev/null
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/TestViewConfiguration.kt
@@ -0,0 +1,82 @@
+/*
+ * 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.testutils
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.platform.ViewConfiguration
+
+/**
+ * A [ViewConfiguration] that can be used for testing. The default values are representative for
+ * Android devices, but can be set to any value desired for a test. See the `With*` functions for
+ * shorthands that create a [TestViewConfiguration] and provide it as a [LocalViewConfiguration].
+ *
+ * @see WithLongPressTimeoutMillis
+ * @see WithDoubleTapTimeoutMillis
+ * @see WithDoubleTapMinTimeMillis
+ * @see WithTouchSlop
+ */
+class TestViewConfiguration(
+    override val longPressTimeoutMillis: Long = 500L,
+    override val doubleTapTimeoutMillis: Long = 300L,
+    override val doubleTapMinTimeMillis: Long = 40L,
+    override val touchSlop: Float = 18f
+) : ViewConfiguration
+
+@Composable
+fun WithLongPressTimeoutMillis(longPressTimeoutMillis: Long, content: @Composable () -> Unit) {
+    WithViewConfiguration(
+        TestViewConfiguration(longPressTimeoutMillis = longPressTimeoutMillis),
+        content = content
+    )
+}
+
+@Composable
+fun WithDoubleTapTimeoutMillis(doubleTapTimeoutMillis: Long, content: @Composable () -> Unit) {
+    WithViewConfiguration(
+        TestViewConfiguration(doubleTapTimeoutMillis = doubleTapTimeoutMillis),
+        content = content
+    )
+}
+
+@Composable
+fun WithDoubleTapMinTimeMillis(doubleTapMinTimeMillis: Long, content: @Composable () -> Unit) {
+    WithViewConfiguration(
+        TestViewConfiguration(doubleTapMinTimeMillis = doubleTapMinTimeMillis),
+        content = content
+    )
+}
+
+@Composable
+fun WithTouchSlop(touchSlop: Float, content: @Composable () -> Unit) {
+    WithViewConfiguration(
+        TestViewConfiguration(touchSlop = touchSlop),
+        content = content
+    )
+}
+
+@Composable
+fun WithViewConfiguration(
+    testViewConfiguration: TestViewConfiguration,
+    content: @Composable () -> Unit
+) {
+    CompositionLocalProvider(
+        LocalViewConfiguration provides testViewConfiguration,
+        content = content
+    )
+}
diff --git a/compose/test-utils/src/test/kotlin/androidx/compose/testutils/DpAssertionsTest.kt b/compose/test-utils/src/test/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
new file mode 100644
index 0000000..6ec0019
--- /dev/null
+++ b/compose/test-utils/src/test/kotlin/androidx/compose/testutils/DpAssertionsTest.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.compose.testutils
+
+import androidx.compose.ui.unit.dp
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class DpAssertionsTest {
+
+    @Test
+    fun dp_assertEquals() {
+        5.dp.assertIsEqualTo(5.dp)
+        5.dp.assertIsEqualTo(4.6.dp)
+        5.dp.assertIsEqualTo(5.4.dp)
+    }
+
+    @Test
+    fun dp_assertNotEquals() {
+        5.dp.assertIsNotEqualTo(6.dp)
+    }
+
+    @Test
+    fun dp_assertEquals_fail() {
+        expectError<AssertionError> {
+            5.dp.assertIsEqualTo(6.dp)
+        }
+    }
+
+    @Test
+    fun dp_assertNotEquals_fail() {
+        expectError<AssertionError> {
+            5.dp.assertIsNotEqualTo(5.dp)
+            5.dp.assertIsNotEqualTo(5.4.dp)
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/test-utils/src/test/kotlin/androidx/compose/testutils/ExpectTest.kt b/compose/test-utils/src/test/kotlin/androidx/compose/testutils/ExpectTest.kt
new file mode 100644
index 0000000..93d3316
--- /dev/null
+++ b/compose/test-utils/src/test/kotlin/androidx/compose/testutils/ExpectTest.kt
@@ -0,0 +1,130 @@
+/*
+ * 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.compose.testutils
+
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ExpectTest {
+
+    class TestException(message: String? = null) : Exception(message)
+
+    @Test
+    fun expectError_gotError() {
+        expectError<TestException> {
+            throw TestException()
+        }
+    }
+
+    @Test
+    fun expectError_gotErrorWithMessage() {
+        expectError<TestException> {
+            throw TestException("message")
+        }
+    }
+
+    @Test
+    fun expectError_gotErrorWithMultilineMessage() {
+        expectError<TestException> {
+            throw TestException("message\nwith 2 lines")
+        }
+    }
+
+    @Test
+    fun expectError_gotNothing() {
+        expectErrorMessage(
+            "Expected that a TestException would be thrown, but nothing was thrown"
+        ) {
+            expectError<TestException> {
+            }
+        }
+    }
+
+    @Test
+    fun expectError_gotDifferentError() {
+        expectErrorMessage(
+            "Expected that a TestException would be thrown, " +
+                "but a IllegalStateException was thrown:\n=="
+        ) {
+            expectError<TestException> {
+                throw IllegalStateException()
+            }
+        }
+    }
+
+    @Test
+    fun expectNoError_gotNoError() {
+        expectError<TestException>(false) {
+        }
+    }
+
+    @Test
+    fun expectNoError_gotError() {
+        expectErrorMessage(
+            "Expected that nothing would be thrown, but a TestException was thrown:\n=="
+        ) {
+            expectError<TestException>(false) {
+                throw TestException()
+            }
+        }
+    }
+
+    @Test
+    fun expectNoError_gotDifferentError() {
+        expectErrorMessage(
+            "Expected that nothing would be thrown, but a IllegalStateException was thrown:\n=="
+        ) {
+            expectError<TestException>(false) {
+                throw IllegalStateException()
+            }
+        }
+    }
+
+    @Test
+    fun expectErrorWithMessage_gotErrorWithMessage() {
+        expectError<TestException>(expectedMessage = "message") {
+            throw TestException("message")
+        }
+    }
+
+    @Test
+    fun expectErrorWithMessage_gotErrorWithDifferentMessage() {
+        expectErrorMessage(
+            "Expected that a TestException with message\n\"\"\"message\"\"\"\n would be thrown, " +
+                "but a TestException with message\n\"\"\"message x\"\"\"\n was thrown:\n=="
+        ) {
+            expectError<TestException>(expectedMessage = "message") {
+                throw TestException("message x")
+            }
+        }
+    }
+
+    private fun expectErrorMessage(expectedErrorMessage: String, block: () -> Unit) {
+        try {
+            block()
+        } catch (e: AssertionError) {
+            assertWithMessage("expectError threw an AssertionError with the wrong message")
+                .that(e.message)
+                .startsWith(expectedErrorMessage)
+            return
+        }
+        throw AssertionError("Expected an AssertionError, but it wasn't thrown")
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-android-stubs/api/1.0.0-beta06.txt b/compose/ui/ui-android-stubs/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/ui/ui-android-stubs/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/ui/ui-android-stubs/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-android-stubs/api/res-1.0.0-beta07.txt b/compose/ui/ui-android-stubs/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-android-stubs/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-android-stubs/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/ui/ui-android-stubs/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.0.0-beta07.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/build.gradle b/compose/ui/ui-android-stubs/build.gradle
index f0fc4ca..41a7097 100644
--- a/compose/ui/ui-android-stubs/build.gradle
+++ b/compose/ui/ui-android-stubs/build.gradle
@@ -22,13 +22,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        targetCompatibility = JavaVersion.VERSION_1_7
-        sourceCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 }
diff --git a/compose/ui/ui-geometry/api/1.0.0-beta06.txt b/compose/ui/ui-geometry/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.0.0-beta06.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/1.0.0-beta07.txt b/compose/ui/ui-geometry/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.0.0-beta07.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/res-1.0.0-beta06.txt b/compose/ui/ui-geometry/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-geometry/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-geometry/api/res-1.0.0-beta07.txt b/compose/ui/ui-geometry/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-geometry/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-geometry/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-geometry/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/restricted_1.0.0-beta07.txt b/compose/ui/ui-geometry/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..60e5f28
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,280 @@
+// 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-kKHJgLs(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-kKHJgLs(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-wNNjKcU(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long times-kKHJgLs(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-kKHJgLs(long $this);
+    field public static final androidx.compose.ui.geometry.CornerRadius.Companion Companion;
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero-kKHJgLs();
+    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-LCIZJP8(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-k-4lQ0M(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    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 p);
+    method public void setLeft(float p);
+    method public void setRight(float p);
+    method public void setTop(float p);
+    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 static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-F1C5BW0(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method @androidx.compose.runtime.Stable public static float getDistance-impl(long $this);
+    method @androidx.compose.runtime.Stable public static float getDistanceSquared-impl(long $this);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isValid-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long minus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-k-4lQ0M(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-F1C5BW0(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-F1C5BW0(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-F1C5BW0(long $this);
+    field public static final androidx.compose.ui.geometry.Offset.Companion Companion;
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite-F1C5BW0();
+    method public long getUnspecified-F1C5BW0();
+    method public long getZero-F1C5BW0();
+    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-k-4lQ0M(long);
+    method public static boolean isSpecified-k-4lQ0M(long);
+    method public static boolean isUnspecified-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
+    method public static inline long takeOrElse-Yy5JL0A(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-k-4lQ0M(long offset);
+    method @androidx.compose.runtime.Immutable 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-F1C5BW0();
+    method public long getBottomLeft-F1C5BW0();
+    method public long getBottomRight-F1C5BW0();
+    method public long getCenter-F1C5BW0();
+    method public long getCenterLeft-F1C5BW0();
+    method public long getCenterRight-F1C5BW0();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize-NH-jbRc();
+    method public float getTop();
+    method public long getTopCenter-F1C5BW0();
+    method public long getTopLeft-F1C5BW0();
+    method public long getTopRight-F1C5BW0();
+    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(float translateX, float translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate-k-4lQ0M(long offset);
+    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-FZVz7gs(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MQFEXWE(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect-MrV732k(long offset, long size);
+    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 {
+    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-k-4lQ0M(long point);
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.geometry.RoundRect copy-snQPIwc(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius-kKHJgLs();
+    method public long getBottomRightCornerRadius-kKHJgLs();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius-kKHJgLs();
+    method public long getTopRightCornerRadius-kKHJgLs();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    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(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect--YCCMLI(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.RoundRect RoundRect-fCQrIv8(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect-v2DAv8c(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    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-cBI5anY(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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-NH-jbRc(long $this, optional float width, optional float height);
+    method @androidx.compose.runtime.Stable public static operator long div-NH-jbRc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getHeight-impl(long $this);
+    method public static float getMaxDimension-impl(long $this);
+    method public static float getMinDimension-impl(long $this);
+    method public static float getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static boolean isEmpty-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long times-NH-jbRc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.geometry.Size.Companion Companion;
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified-NH-jbRc();
+    method public long getZero-NH-jbRc();
+    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-uvyYCjk(long);
+    method public static inline boolean isSpecified-uvyYCjk(long);
+    method public static inline boolean isUnspecified-uvyYCjk(long);
+    method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
index 4e048fa..23321e1 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
@@ -64,7 +64,7 @@
     val x: Float
         get() {
             // Explicitly compare against packed values to avoid auto-boxing of Size.Unspecified
-            check(this.packedValue != Size.Unspecified.packedValue) {
+            check(this.packedValue != Unspecified.packedValue) {
                 "Offset is unspecified"
             }
             return unpackFloat1(packedValue)
@@ -74,7 +74,7 @@
     val y: Float
         get() {
             // Explicitly compare against packed values to avoid auto-boxing of Size.Unspecified
-            check(this.packedValue != Size.Unspecified.packedValue) {
+            check(this.packedValue != Unspecified.packedValue) {
                 "Offset is unspecified"
             }
             return unpackFloat2(packedValue)
diff --git a/compose/ui/ui-graphics/api/1.0.0-beta06.txt b/compose/ui/ui-graphics/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..4ac2634
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.0.0-beta06.txt
@@ -0,0 +1,1419 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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/1.0.0-beta07.txt b/compose/ui/ui-graphics/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..4ac2634
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.0.0-beta07.txt
@@ -0,0 +1,1419 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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_1.0.0-beta06.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..4ac2634
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,1419 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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_1.0.0-beta07.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..4ac2634
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,1419 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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/res-1.0.0-beta06.txt b/compose/ui/ui-graphics/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-graphics/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-graphics/api/res-1.0.0-beta07.txt b/compose/ui/ui-graphics/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-graphics/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-graphics/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-graphics/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..398edf5
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,1475 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  @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, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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(androidx.compose.ui.graphics.ClipOp);
+    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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+    method @kotlin.PublishedApi internal static float degrees(float radians);
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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 {
+    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 @kotlin.PublishedApi internal androidx.compose.ui.graphics.drawscope.CanvasDrawScope.DrawParams copy-xYU37iA(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size);
+    method @kotlin.PublishedApi internal boolean equals(Object? p);
+    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-NH-jbRc();
+    method @kotlin.PublishedApi internal int hashCode();
+    method public void setCanvas(androidx.compose.ui.graphics.Canvas p);
+    method public void setDensity(androidx.compose.ui.unit.Density p);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection p);
+    method public void setSize-uvyYCjk(long p);
+    method @kotlin.PublishedApi 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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_1.0.0-beta07.txt b/compose/ui/ui-graphics/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..398edf5
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,1475 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(androidx.compose.ui.graphics.BlendMode);
+  }
+
+  @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, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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(androidx.compose.ui.graphics.ClipOp);
+    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-7lL006A(float[], android.graphics.Matrix matrix);
+    method public static void setFrom-8AuSnpc(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 androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode value);
+    method public void setColor-8_81llA(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap value);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle value);
+    property public float alpha;
+    property public androidx.compose.ui.graphics.BlendMode blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public androidx.compose.ui.graphics.FilterQuality filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType value);
+    method public void translate-k-4lQ0M(long offset);
+    property public androidx.compose.ui.graphics.PathFillType 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 AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.compose.ui.graphics.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.compose.ui.graphics.VertexMode);
+  }
+
+  public enum BlendMode {
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Clear;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Color;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorBurn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode ColorDodge;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Darken;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Difference;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Dst;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode DstOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Exclusion;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hardlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Hue;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Lighten;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Luminosity;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Modulate;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Multiply;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Overlay;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Plus;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Saturation;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Screen;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Softlight;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Src;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcAtop;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcIn;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOut;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode SrcOver;
+    enum_constant public static final androidx.compose.ui.graphics.BlendMode Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-7_sGemo(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient-K4jYFb0(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-YU3LRu0(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient-g04MWJE(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient-PvDSl28(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-acbAMd8(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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.TileMode 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void concat-58bKbWc(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-tVKstsI(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage-uwcbMjI(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect-bgE79EM(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-bYPfCD8(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(androidx.compose.ui.graphics.PointMode pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(androidx.compose.ui.graphics.PointMode 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, androidx.compose.ui.graphics.BlendMode 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);
+  }
+
+  public enum ClipOp {
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Difference;
+    enum_constant public static final androidx.compose.ui.graphics.ClipOp Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component3-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component4-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator androidx.compose.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
+    method public static long constructor-impl(long value);
+    method public static long convert-0d7_KjU(long $this, androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long copy-0d7_KjU(long $this, optional float alpha, optional float red, optional float green, optional float blue);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getAlpha-impl(long $this);
+    method public static float getBlue-impl(long $this);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
+    method public static float getGreen-impl(long $this);
+    method public static float getRed-impl(long $this);
+    method public long getValue-s-VKNKU();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long value;
+    field public static final androidx.compose.ui.graphics.Color.Companion Companion;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack-0d7_KjU();
+    method public long getBlue-0d7_KjU();
+    method public long getCyan-0d7_KjU();
+    method public long getDarkGray-0d7_KjU();
+    method public long getGray-0d7_KjU();
+    method public long getGreen-0d7_KjU();
+    method public long getLightGray-0d7_KjU();
+    method public long getMagenta-0d7_KjU();
+    method public long getRed-0d7_KjU();
+    method public long getTransparent-0d7_KjU();
+    method public long getUnspecified-0d7_KjU();
+    method public long getWhite-0d7_KjU();
+    method public long getYellow-0d7_KjU();
+    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-jHG-Opc(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting-6xK2E-Q(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint-aamYUWA(long color, optional androidx.compose.ui.graphics.BlendMode 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-6xK2E-Q(long, long background);
+    method public static inline boolean isSpecified-8_81llA(long);
+    method public static inline boolean isUnspecified-8_81llA(long);
+    method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static void convertRgbToYuv-impl(float[]! $this);
+    method public static void convertYuvToRgb-impl(float[]! $this);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void reset-impl(float[]! $this);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void set-jHG-Opc(float[] $this, float[] src);
+    method public static void setToRotateBlue-impl(float[] $this, float degrees);
+    method public static void setToRotateGreen-impl(float[] $this, float degrees);
+    method public static void setToRotateRed-impl(float[] $this, float degrees);
+    method public static void setToSaturation-impl(float[] $this, float sat);
+    method public static void setToScale-impl(float[] $this, float redScale, float greenScale, float blueScale, float alphaScale);
+    method public static operator void timesAssign-jHG-Opc(float[] $this, float[] colorMatrix);
+    method public static inline String! toString-impl(float[]! p);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+    method @kotlin.PublishedApi internal static float degrees(float radians);
+  }
+
+  public enum FilterQuality {
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality High;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Low;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality Medium;
+    enum_constant public static final androidx.compose.ui.graphics.FilterQuality None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public androidx.compose.ui.graphics.ImageBitmapConfig 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 androidx.compose.ui.graphics.ImageBitmapConfig 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 {
+  }
+
+  public enum ImageBitmapConfig {
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Alpha8;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Argb8888;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig F16;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Gpu;
+    enum_constant public static final androidx.compose.ui.graphics.ImageBitmapConfig Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional androidx.compose.ui.graphics.ImageBitmapConfig 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-uvyYCjk(long size);
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public static float[]! constructor-impl(optional float[] values);
+    method public static inline boolean equals-impl(float[]! p, Object? p1);
+    method public static boolean equals-impl0(float[] p1, float[] p2);
+    method public static inline operator float get-impl(float[] $this, int row, int column);
+    method public float[] getValues();
+    method public static inline int hashCode-impl(float[]! p);
+    method public static void invert-impl(float[]! $this);
+    method public static androidx.compose.ui.geometry.Rect map-impl(float[] $this, androidx.compose.ui.geometry.Rect rect);
+    method public static void map-impl(float[] $this, androidx.compose.ui.geometry.MutableRect rect);
+    method public static long map-k-4lQ0M(float[] $this, long point);
+    method public static void reset-impl(float[]! $this);
+    method public static void rotateX-impl(float[] $this, float degrees);
+    method public static void rotateY-impl(float[] $this, float degrees);
+    method public static void rotateZ-impl(float[] $this, float degrees);
+    method public static void scale-impl(float[] $this, optional float x, optional float y, optional float z);
+    method public static inline operator void set-impl(float[] $this, int row, int column, float v);
+    method public static void setFrom-58bKbWc(float[] $this, float[] matrix);
+    method public static operator void timesAssign-58bKbWc(float[] $this, float[] m);
+    method public static String toString-impl(float[]! $this);
+    method public static void translate-impl(float[] $this, optional float x, optional float y, optional float z);
+    property public final float[] values;
+    field public static final androidx.compose.ui.graphics.Matrix.Companion Companion;
+    field public static final int Perspective0 = 3; // 0x3
+    field public static final int Perspective1 = 7; // 0x7
+    field public static final int Perspective2 = 15; // 0xf
+    field public static final int ScaleX = 0; // 0x0
+    field public static final int ScaleY = 5; // 0x5
+    field public static final int ScaleZ = 10; // 0xa
+    field public static final int SkewX = 4; // 0x4
+    field public static final int SkewY = 1; // 0x1
+    field public static final int TranslateX = 12; // 0xc
+    field public static final int TranslateY = 13; // 0xd
+    field public static final int TranslateZ = 14; // 0xe
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity-58bKbWc(float[]);
+  }
+
+  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, 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+    method public static void drawOutline-mlewCHg(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 androidx.compose.ui.graphics.BlendMode blendMode);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public androidx.compose.ui.graphics.BlendMode getBlendMode();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public androidx.compose.ui.graphics.FilterQuality getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public androidx.compose.ui.graphics.PaintingStyle getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float p);
+    method public void setAntiAlias(boolean p);
+    method public void setBlendMode(androidx.compose.ui.graphics.BlendMode p);
+    method public void setColor-8_81llA(long p);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? p);
+    method public void setFilterQuality(androidx.compose.ui.graphics.FilterQuality p);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? p);
+    method public void setShader(android.graphics.Shader? p);
+    method public void setStrokeCap(androidx.compose.ui.graphics.StrokeCap p);
+    method public void setStrokeJoin(androidx.compose.ui.graphics.StrokeJoin p);
+    method public void setStrokeMiterLimit(float p);
+    method public void setStrokeWidth(float p);
+    method public void setStyle(androidx.compose.ui.graphics.PaintingStyle p);
+    property public abstract float alpha;
+    property public abstract androidx.compose.ui.graphics.BlendMode blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract androidx.compose.ui.graphics.FilterQuality 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 androidx.compose.ui.graphics.StrokeCap strokeCap;
+    property public abstract androidx.compose.ui.graphics.StrokeJoin strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract androidx.compose.ui.graphics.PaintingStyle style;
+  }
+
+  public final class PaintKt {
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  public enum PaintingStyle {
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle Fill;
+    enum_constant public static final androidx.compose.ui.graphics.PaintingStyle 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-ej0GBII(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 androidx.compose.ui.graphics.PathFillType 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, androidx.compose.ui.graphics.PathOperation 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(androidx.compose.ui.graphics.PathFillType p);
+    method public void translate-k-4lQ0M(long offset);
+    property public abstract androidx.compose.ui.graphics.PathFillType 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(androidx.compose.ui.graphics.PathOperation 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, androidx.compose.ui.graphics.StampedPathEffectStyle style);
+  }
+
+  public enum PathFillType {
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType EvenOdd;
+    enum_constant public static final androidx.compose.ui.graphics.PathFillType 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;
+  }
+
+  public enum PathOperation {
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation difference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation intersect;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation reverseDifference;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation union;
+    enum_constant public static final androidx.compose.ui.graphics.PathOperation xor;
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get-0d7_KjU(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;
+  }
+
+  public enum PointMode {
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Lines;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Points;
+    enum_constant public static final androidx.compose.ui.graphics.PointMode Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  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();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional androidx.compose.ui.graphics.TileMode tileModeX, optional androidx.compose.ui.graphics.TileMode tileModeY);
+    method public static android.graphics.Shader LinearGradientShader-GfyHbQM(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader RadialGradientShader-cY6o93o(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional androidx.compose.ui.graphics.TileMode tileMode);
+    method public static android.graphics.Shader SweepGradientShader-GpNgDDw(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 {
+    method public androidx.compose.ui.graphics.Shadow copy-vQQzcCI(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor-0d7_KjU();
+    method public long getOffset-F1C5BW0();
+    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-9w1PWio(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 {
+    method public void applyTo-TJof4Gw(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue-0d7_KjU();
+    property public final long value;
+  }
+
+  public enum StampedPathEffectStyle {
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Morph;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Rotate;
+    enum_constant public static final androidx.compose.ui.graphics.StampedPathEffectStyle Translate;
+  }
+
+  public enum StrokeCap {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Butt;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Round;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeCap Square;
+  }
+
+  public enum StrokeJoin {
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Bevel;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Miter;
+    enum_constant public static final androidx.compose.ui.graphics.StrokeJoin Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader-uvyYCjk(long size);
+  }
+
+  public enum TileMode {
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Clamp;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Mirror;
+    enum_constant public static final androidx.compose.ui.graphics.TileMode Repeated;
+  }
+
+  public enum VertexMode {
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleFan;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode TriangleStrip;
+    enum_constant public static final androidx.compose.ui.graphics.VertexMode Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(androidx.compose.ui.graphics.VertexMode 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 androidx.compose.ui.graphics.VertexMode getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final androidx.compose.ui.graphics.VertexMode vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public enum Adaptation {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  public enum ColorModel {
+    method public final int getComponentCount();
+    property public final int componentCount;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Cmyk;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Lab;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Rgb;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.ColorModel Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.ColorModel 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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 androidx.compose.ui.graphics.colorspace.RenderIntent 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;
+  }
+
+  public enum RenderIntent {
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Absolute;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Perceptual;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent Relative;
+    enum_constant public static final androidx.compose.ui.graphics.colorspace.RenderIntent 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-jkGVKLE(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-BcZ8TnY(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode 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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, float strokeWidth, androidx.compose.ui.graphics.StrokeCap cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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, androidx.compose.ui.graphics.BlendMode 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 {
+    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 @kotlin.PublishedApi internal androidx.compose.ui.graphics.drawscope.CanvasDrawScope.DrawParams copy-xYU37iA(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size);
+    method @kotlin.PublishedApi internal boolean equals(Object? p);
+    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-NH-jbRc();
+    method @kotlin.PublishedApi internal int hashCode();
+    method public void setCanvas(androidx.compose.ui.graphics.Canvas p);
+    method public void setDensity(androidx.compose.ui.unit.Density p);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection p);
+    method public void setSize-uvyYCjk(long p);
+    method @kotlin.PublishedApi 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-NH-jbRc();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize-uvyYCjk(long p);
+    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-BcZ8TnY(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawArc-C-Io9bM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-NGaRamM(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawCircle-m-UMHxE(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-JUiai_k(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawImage-Yc2aOMw(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-QXZmVdc(long color, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawLine-UXw4dv4(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawOval-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode 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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPath-tilSWAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawPoints-Aqy9O-k(java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.PointMode pointMode, long color, optional float strokeWidth, optional androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-0a6MmAQ(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRect-IdEHoqk(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-fNghmuc(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public void drawRoundRect-sDDzLXA(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 androidx.compose.ui.graphics.BlendMode blendMode);
+    method public default long getCenter-F1C5BW0();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize-NH-jbRc();
+    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;
+    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 androidx.compose.ui.graphics.BlendMode getDefaultBlendMode();
+    property public final androidx.compose.ui.graphics.BlendMode DefaultBlendMode;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional androidx.compose.ui.graphics.ClipOp 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 androidx.compose.ui.graphics.ClipOp 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-FvlOZkk(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-FvlOZkk(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-FvlOZkk(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 scale-LCqtnZ0(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 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 androidx.compose.ui.graphics.ClipOp clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional androidx.compose.ui.graphics.ClipOp clipOp);
+    method public default long getCenter-F1C5BW0();
+    method public long getSize-NH-jbRc();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate-KYFOyyg(float degrees, optional long pivot);
+    method public void scale-QguGWxw(float scaleX, float scaleY, optional long pivot);
+    method public void transform-58bKbWc(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-kdYHfaE(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale-kdYHfaE(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 androidx.compose.ui.graphics.StrokeCap cap, optional androidx.compose.ui.graphics.StrokeJoin join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public androidx.compose.ui.graphics.StrokeCap getCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.StrokeCap cap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap getDefaultCap();
+    method public androidx.compose.ui.graphics.StrokeJoin getDefaultJoin();
+    property public final androidx.compose.ui.graphics.StrokeCap DefaultCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize-NH-jbRc();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getColor-0d7_KjU();
+    method public long getIntrinsicSize-NH-jbRc();
+    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-ty3CEPU(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize-NH-jbRc();
+    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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt b/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
index e7e5175..294542e 100644
--- a/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
+++ b/compose/ui/ui-graphics/benchmark/src/main/java/androidx/compose/ui/graphics/benchmark/ImageVectorTestCase.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.graphics.vector.PathData
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.foundation.layout.size
-import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.LayeredComposeTestCase
 import androidx.compose.ui.graphics.vector.rememberVectorPainter
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
@@ -40,16 +40,21 @@
  * Subclasses are responsible for providing the vector asset, so we can test and benchmark different
  * methods of loading / creating this asset.
  */
-sealed class ImageVectorTestCase : ComposeTestCase {
+sealed class ImageVectorTestCase : LayeredComposeTestCase() {
 
     @Composable
-    override fun Content() {
+    override fun MeasuredContent() {
+        Box(
+            Modifier.testTag(testTag)
+                .size(24.dp)
+                .paint(getPainter())
+        )
+    }
+
+    @Composable
+    override fun ContentWrappers(content: @Composable () -> Unit) {
         Box {
-            Box(
-                Modifier.testTag(testTag)
-                    .size(24.dp)
-                    .paint(getPainter())
-            )
+            content()
         }
     }
 
diff --git a/compose/ui/ui-graphics/lint-baseline.xml b/compose/ui/ui-graphics/lint-baseline.xml
index f5995f5..c762933 100644
--- a/compose/ui/ui-graphics/lint-baseline.xml
+++ b/compose/ui/ui-graphics/lint-baseline.xml
@@ -1,9 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.ui.graphics.CanvasUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.AndroidColorFilter_androidKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        BlendModeColorFilter(color.toArgb(), blendMode.toAndroidBlendMode())"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidColorFilter.android.kt"
+            line="39"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                canvas.enableZ()"
         errorLine2="                       ~~~~~~~">
         <location
@@ -13,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.ui.graphics.CanvasUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.graphics.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                canvas.disableZ()"
         errorLine2="                       ~~~~~~~~">
         <location
diff --git a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
index 2744489..03dca22 100644
--- a/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
+++ b/compose/ui/ui-inspection/src/androidTest/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTreeTest.kt
@@ -17,13 +17,20 @@
 package androidx.compose.ui.inspection.inspector
 
 import android.util.Log
+import android.view.View
 import android.view.ViewGroup
+import android.view.inspector.WindowInspector
 import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.text.BasicText
+import androidx.compose.material.AlertDialog
 import androidx.compose.material.Button
 import androidx.compose.material.Icon
 import androidx.compose.material.MaterialTheme
@@ -43,9 +50,12 @@
 import androidx.compose.ui.R
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.inspection.framework.ancestors
+import androidx.compose.ui.inspection.framework.isRoot
 import androidx.compose.ui.inspection.rules.show
 import androidx.compose.ui.inspection.testdata.TestActivity
 import androidx.compose.ui.layout.GraphicLayerInfo
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.semantics.clearAndSetSemantics
@@ -61,6 +71,7 @@
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -87,7 +98,6 @@
 @OptIn(UiToolingDataApi::class)
 class LayoutInspectorTreeTest {
     private lateinit var density: Density
-    private lateinit var view: ViewGroup
 
     @get:Rule
     val activityScenario = ActivityScenarioRule(TestActivity::class.java)
@@ -96,20 +106,32 @@
     fun before() {
         activityScenario.scenario.onActivity {
             density = Density(it)
-            view = it.findViewById(android.R.id.content)
         }
         isDebugInspectorInfoEnabled = true
     }
 
-    private fun findAndroidComposeView(view: ViewGroup): ViewGroup? {
-        for (i in 0 until view.childCount) {
-            val subView = view.getChildAt(i) as ViewGroup
-            if (subView.javaClass.simpleName == "AndroidComposeView") {
-                return subView
-            }
-            findAndroidComposeView(subView)?.let { return it }
+    private fun findAndroidComposeView(): View {
+        return findAllAndroidComposeViews().single()
+    }
+
+    private fun findAllAndroidComposeViews(): List<View> {
+        val composeViews = mutableListOf<View>()
+        WindowInspector.getGlobalWindowViews().forEach {
+            collectAllAndroidComposeView(it.rootView, composeViews)
         }
-        return null
+        return composeViews
+    }
+
+    private fun collectAllAndroidComposeView(view: View, composeViews: MutableList<View>) {
+        if (view.javaClass.simpleName == "AndroidComposeView") {
+            composeViews.add(view)
+        }
+        if (view !is ViewGroup) {
+            return
+        }
+        for (i in 0 until view.childCount) {
+            collectAllAndroidComposeView(view.getChildAt(i), composeViews)
+        }
     }
 
     @After
@@ -134,51 +156,51 @@
         }
 
         // TODO: Find out if we can set "settings put global debug_view_attributes 1" in tests
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val nodes = builder.convert(view)
-        dumpNodes(nodes, builder)
+        dumpNodes(nodes, view, builder)
+        val top = findTopPosition(view)
 
         validate(nodes, builder) {
             node(
                 name = "Column",
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.0.dp, top = 0.0.dp, width = 72.0.dp, height = 78.9.dp,
+                left = 0.0.dp, top = top, width = 72.0.dp, height = 78.9.dp,
                 children = listOf("Text", "Icon", "Surface")
             )
             node(
                 name = "Text",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.0.dp, top = 0.0.dp, width = 72.0.dp, height = 18.9.dp,
+                left = 0.0.dp, top = top, width = 72.0.dp, height = 18.9.dp,
             )
             node(
                 name = "Icon",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 0.0.dp, top = 18.9.dp, width = 24.0.dp, height = 24.0.dp,
+                left = 0.0.dp, top = top + 18.9.dp, width = 24.0.dp, height = 24.0.dp,
             )
             node(
                 name = "Surface",
                 fileName = "LayoutInspectorTreeTest.kt",
                 isRenderNode = true,
-                left = 0.0.dp,
-                top = 42.9.dp, width = 64.0.dp, height = 36.0.dp,
+                left = 0.0.dp, top = top + 42.9.dp, width = 64.0.dp, height = 36.0.dp,
                 children = listOf("Button")
             )
             node(
                 name = "Button",
                 fileName = "LayoutInspectorTreeTest.kt",
                 isRenderNode = true,
-                left = 0.0.dp,
-                top = 42.9.dp, width = 64.0.dp, height = 36.0.dp,
+                left = 0.0.dp, top = top + 42.9.dp, width = 64.0.dp, height = 36.0.dp,
                 children = listOf("Text")
             )
             node(
                 name = "Text",
                 isRenderNode = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 21.7.dp, top = 51.6.dp, width = 20.9.dp, height = 18.9.dp,
+                left = 21.7.dp, top = top + 51.5.dp, width = 20.9.dp, height = 18.9.dp,
             )
         }
     }
@@ -199,17 +221,19 @@
         }
 
         // TODO: Find out if we can set "settings put global debug_view_attributes 1" in tests
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val nodes = builder.convert(view)
-        dumpNodes(nodes, builder)
+        dumpNodes(nodes, view, builder)
+        val top = findTopPosition(view)
 
         validate(nodes, builder) {
             node(
                 name = "MaterialTheme",
                 hasTransformations = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 68.0.dp, top = 49.7.dp, width = 88.6.dp, height = 21.7.dp,
+                left = 68.0.dp, top = top + 49.8.dp, width = 88.6.dp, height = 21.7.dp,
                 children = listOf("Text")
             )
             node(
@@ -217,7 +241,7 @@
                 isRenderNode = true,
                 hasTransformations = true,
                 fileName = "LayoutInspectorTreeTest.kt",
-                left = 68.0.dp, top = 49.7.dp, width = 88.6.dp, height = 21.7.dp,
+                left = 68.0.dp, top = top + 49.8.dp, width = 88.6.dp, height = 21.7.dp,
             )
         }
     }
@@ -239,11 +263,12 @@
                 )
             }
         }
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         dumpSlotTableSet(slotTableRecord)
         val builder = LayoutInspectorTree()
         val nodes = builder.convert(view)
-        dumpNodes(nodes, builder)
+        dumpNodes(nodes, view, builder)
 
         if (DEBUG) {
             validate(nodes, builder) {
@@ -276,12 +301,13 @@
                 )
             }
         }
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         dumpSlotTableSet(slotTableRecord)
         val builder = LayoutInspectorTree()
         builder.hideSystemNodes = false
         val nodes = builder.convert(view)
-        dumpNodes(nodes, builder)
+        dumpNodes(nodes, view, builder)
 
         if (DEBUG) {
             validate(nodes, builder) {
@@ -328,6 +354,7 @@
             }
         }
 
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val node = builder.convert(view)
@@ -342,7 +369,6 @@
     fun testBasicText() {
         val slotTableRecord = CompositionDataRecord.create()
 
-        view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         show {
             Inspectable(slotTableRecord) {
                 Column {
@@ -354,6 +380,8 @@
             }
         }
 
+        val view = findAndroidComposeView()
+        view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val node = builder.convert(view)
             .flatMap { flatten(it) }
@@ -374,6 +402,7 @@
             }
         }
 
+        val view = findAndroidComposeView()
         view.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val node = builder.convert(view)
@@ -405,7 +434,7 @@
             }
         }
 
-        val androidComposeView = findAndroidComposeView(view)!!
+        val androidComposeView = findAndroidComposeView()
         androidComposeView.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
         val builder = LayoutInspectorTree()
         val nodes = builder.convert(androidComposeView)
@@ -431,17 +460,184 @@
         }
     }
 
+    @Test
+    fun testFilterOutAlertDialogFromApp() {
+        val slotTableRecord = CompositionDataRecord.create()
+
+        show {
+            Inspectable(slotTableRecord) {
+                Column {
+                    Text("Hello World!")
+                    AlertDialog(
+                        onDismissRequest = {},
+                        confirmButton = {
+                            Button({}) {
+                                Text("This is the Confirm Button")
+                            }
+                        }
+                    )
+                }
+            }
+        }
+        val composeViews = findAllAndroidComposeViews()
+        val appView = composeViews[0] // composeView[1] contains the contents of the dialog
+        appView.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
+        val builder = LayoutInspectorTree()
+        val nodes = builder.convert(appView)
+        dumpNodes(nodes, appView, builder)
+        val top = findTopPosition(appView)
+
+        // Verify that there are no Composable nodes from the dialog in the application itself:
+        validate(nodes, builder) {
+            node(
+                name = "Column",
+                fileName = "LayoutInspectorTreeTest.kt",
+                left = 0.0.dp, top = top, width = 76.0.dp, height = 18.9.dp,
+                children = listOf("Text")
+            )
+            node(
+                name = "Text",
+                isRenderNode = true,
+                fileName = "LayoutInspectorTreeTest.kt",
+                left = 0.0.dp, top = top, width = 76.0.dp, height = 18.9.dp,
+            )
+        }
+    }
+
+    @Test
+    fun testDialogLocation() {
+        val slotTableRecord = CompositionDataRecord.create()
+
+        show {
+            Inspectable(slotTableRecord) {
+                Column {
+                    Text("Hello World!")
+                    AlertDialog(
+                        onDismissRequest = {},
+                        confirmButton = {
+                            Button({}) {
+                                Text("This is the Confirm Button")
+                            }
+                        }
+                    )
+                }
+            }
+        }
+        val composeViews = findAllAndroidComposeViews()
+        val dialogView = composeViews[1] // composeView[0] contains the contents of the app
+        val dialogLocation = IntArray(2)
+        dialogView.getLocationOnScreen(dialogLocation)
+        dialogView.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
+        val builder = LayoutInspectorTree()
+        val button = builder.convert(dialogView)
+            .flatMap { flatten(it) }
+            .single { it.name == "Button" }
+        assertThat(button.left).isGreaterThan(dialogLocation[0])
+        assertThat(button.top).isGreaterThan(dialogLocation[1])
+        assertThat(button.width).isLessThan(dialogView.width)
+        assertThat(button.height).isLessThan(dialogView.height)
+    }
+
+    // WARNING: The formatting of the lines below here affect test results.
+    val titleLine = Throwable().stackTrace[0].lineNumber + 3
+
+    @Composable
+    private fun Title() {
+        val maxOffset = with(LocalDensity.current) { 80.dp.toPx() }
+        val minOffset = with(LocalDensity.current) { 80.dp.toPx() }
+        val offset = maxOffset.coerceAtLeast(minOffset)
+        Column(
+            verticalArrangement = Arrangement.Bottom,
+            modifier = Modifier
+                .heightIn(min = 128.dp)
+                .graphicsLayer { translationY = offset }
+                .background(color = MaterialTheme.colors.background)
+        ) {
+            Spacer(Modifier.height(16.dp))
+            Text(
+                text = "Snack",
+                style = MaterialTheme.typography.h4,
+                color = MaterialTheme.colors.secondary,
+                modifier = Modifier.padding(horizontal = 24.dp)
+            )
+            Text(
+                text = "Tagline",
+                style = MaterialTheme.typography.subtitle2,
+                fontSize = 20.sp,
+                color = MaterialTheme.colors.secondary,
+                modifier = Modifier.padding(horizontal = 24.dp)
+            )
+            Spacer(Modifier.height(4.dp))
+            Text(
+                text = "$2.95",
+                style = MaterialTheme.typography.h6,
+                color = MaterialTheme.colors.primary,
+                modifier = Modifier.padding(horizontal = 24.dp)
+            )
+            Spacer(Modifier.height(8.dp))
+        }
+    }
+    // WARNING: End formatted section
+
+    @Test
+    fun testLineNumbers() {
+        // WARNING: The formatting of the lines below here affect test results.
+        val testLine = Throwable().stackTrace[0].lineNumber
+        val slotTableRecord = CompositionDataRecord.create()
+
+        show {
+            Inspectable(slotTableRecord) {
+                Column {
+                    Title()
+                }
+            }
+        }
+        // WARNING: End formatted section
+
+        val androidComposeView = findAndroidComposeView()
+        androidComposeView.setTag(R.id.inspection_slot_table_set, slotTableRecord.store)
+        val builder = LayoutInspectorTree()
+        val nodes = builder.convert(androidComposeView)
+        dumpNodes(nodes, androidComposeView, builder)
+
+        validate(nodes, builder, checkLineNumbers = true, checkRenderNodes = false) {
+            node("Column", lineNumber = testLine + 5, children = listOf("Title"))
+            node("Title", lineNumber = testLine + 6, children = listOf("Column"))
+            node(
+                name = "Column",
+                lineNumber = titleLine + 4,
+                children = listOf("Spacer", "Text", "Text", "Spacer", "Text", "Spacer")
+            )
+            node("Spacer", lineNumber = titleLine + 11)
+            node("Text", lineNumber = titleLine + 12)
+            node("Text", lineNumber = titleLine + 18)
+            node("Spacer", lineNumber = titleLine + 25)
+            node("Text", lineNumber = titleLine + 26)
+            node("Spacer", lineNumber = titleLine + 32)
+        }
+    }
+
     @Suppress("SameParameterValue")
     private fun validate(
         result: List<InspectorNode>,
         builder: LayoutInspectorTree,
         checkParameters: Boolean = false,
         checkSemantics: Boolean = false,
+        checkLineNumbers: Boolean = false,
+        checkRenderNodes: Boolean = true,
         block: TreeValidationReceiver.() -> Unit = {}
     ) {
         val nodes = result.flatMap { flatten(it) }.listIterator()
         ignoreStart(nodes, "Box", "Inspectable", "CompositionLocalProvider")
-        val tree = TreeValidationReceiver(nodes, density, checkParameters, checkSemantics, builder)
+        val tree = TreeValidationReceiver(
+            nodes,
+            density,
+            checkParameters,
+            checkSemantics,
+            checkLineNumbers,
+            checkRenderNodes,
+            builder
+        )
         tree.block()
     }
 
@@ -456,6 +652,8 @@
         val density: Density,
         val checkParameters: Boolean,
         val checkSemantics: Boolean,
+        val checkLineNumbers: Boolean,
+        val checkRenderNodes: Boolean,
         val builder: LayoutInspectorTree
     ) {
         fun node(
@@ -483,10 +681,12 @@
             if (lineNumber != -1) {
                 assertWithMessage(message).that(node.lineNumber).isEqualTo(lineNumber)
             }
-            if (isRenderNode) {
-                assertWithMessage(message).that(node.id).isGreaterThan(0L)
-            } else {
-                assertWithMessage(message).that(node.id).isLessThan(0L)
+            if (checkRenderNodes) {
+                if (isRenderNode) {
+                    assertWithMessage(message).that(node.id).isGreaterThan(0L)
+                } else {
+                    assertWithMessage(message).that(node.id).isLessThan(0L)
+                }
             }
             if (hasTransformations) {
                 assertWithMessage(message).that(node.bounds).isNotNull()
@@ -514,6 +714,10 @@
                     .isEqualTo(unmergedSemantics)
             }
 
+            if (checkLineNumbers) {
+                assertThat(node.lineNumber).isEqualTo(lineNumber)
+            }
+
             if (checkParameters) {
                 val params = builder.convertParameters(
                     ROOT_ID, node, ParameterKind.Normal, MAX_RECURSIONS, MAX_ITERABLE_SIZE
@@ -528,8 +732,15 @@
     private fun flatten(node: InspectorNode): List<InspectorNode> =
         listOf(node).plus(node.children.flatMap { flatten(it) })
 
+    private fun findTopPosition(view: View): Dp {
+        val location = IntArray(2)
+        val decorView = view.ancestors().first { it.isRoot() }
+        decorView.getLocationOnScreen(location)
+        return with(density) { location[1].toDp() }
+    }
+
     // region DEBUG print methods
-    private fun dumpNodes(nodes: List<InspectorNode>, builder: LayoutInspectorTree) {
+    private fun dumpNodes(nodes: List<InspectorNode>, view: View, builder: LayoutInspectorTree) {
         @Suppress("ConstantConditionIf")
         if (!DEBUG) {
             return
@@ -539,7 +750,7 @@
         nodes.forEach { dumpNode(it, indent = 0) }
         println()
         println("=================== validate statements ==========================")
-        nodes.forEach { generateValidate(it, builder) }
+        nodes.forEach { generateValidate(it, view, builder) }
     }
 
     private fun dumpNode(node: InspectorNode, indent: Int) {
@@ -553,6 +764,7 @@
 
     private fun generateValidate(
         node: InspectorNode,
+        view: View,
         builder: LayoutInspectorTree,
         generateParameters: Boolean = false
     ) {
@@ -591,7 +803,7 @@
             )
         }
         println()
-        node.children.forEach { generateValidate(it, builder) }
+        node.children.forEach { generateValidate(it, view, builder) }
     }
 
     private fun generateParameters(parameters: List<NodeParameter>, indent: Int) {
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
index 634d388..60bc092 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/LayoutInspectorTree.kt
@@ -19,8 +19,11 @@
 import android.view.View
 import androidx.compose.runtime.InternalComposeApi
 import androidx.compose.runtime.tooling.CompositionData
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.R
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.inspection.framework.ancestors
+import androidx.compose.ui.inspection.framework.isRoot
 import androidx.compose.ui.layout.GraphicLayerInfo
 import androidx.compose.ui.layout.LayoutInfo
 import androidx.compose.ui.node.RootForTest
@@ -84,6 +87,7 @@
     private val parameterFactory = ParameterFactory(inlineClassConverter)
     private val cache = ArrayDeque<MutableInspectorNode>()
     private var generatedId = -1L
+    private val rootLocation = IntArray(2)
     /** Map from [LayoutInfo] to the nearest [InspectorNode] that contains it */
     private val claimedNodes = IdentityHashMap<LayoutInfo, InspectorNode>()
     /** Map from parent tree to child trees that are about to be stitched together */
@@ -108,7 +112,7 @@
             ?: return emptyList()
         clear()
         collectSemantics(view)
-        val result = convert(tables)
+        val result = convert(tables, view)
         clear()
         return result
     }
@@ -191,6 +195,8 @@
     }
 
     private fun clear() {
+        rootLocation[0] = 0
+        rootLocation[1] = 0
         cache.clear()
         inlineClassConverter.clear()
         claimedNodes.clear()
@@ -201,8 +207,10 @@
     }
 
     @OptIn(InternalComposeApi::class)
-    private fun convert(tables: Set<CompositionData>): List<InspectorNode> {
-        val trees = tables.map { convert(it) }
+    private fun convert(tables: Set<CompositionData>, view: View): List<InspectorNode> {
+        val decorView = view.ancestors().first { it.isRoot() }
+        decorView.getLocationOnScreen(rootLocation)
+        val trees = tables.mapNotNull { convert(it, view) }
         return when (trees.size) {
             0 -> listOf()
             1 -> addTree(mutableListOf(), trees.single())
@@ -310,10 +318,10 @@
     }
 
     @OptIn(InternalComposeApi::class, UiToolingDataApi::class)
-    private fun convert(table: CompositionData): MutableInspectorNode {
+    private fun convert(table: CompositionData, view: View): MutableInspectorNode? {
         val fakeParent = newNode()
         addToParent(fakeParent, listOf(convert(table.asTree())), buildFakeChildNodes = true)
-        return fakeParent
+        return if (belongsToView(fakeParent.layoutNodes, view)) fakeParent else null
     }
 
     @OptIn(UiToolingDataApi::class)
@@ -413,8 +421,8 @@
     @OptIn(UiToolingDataApi::class)
     private fun parsePosition(group: Group, node: MutableInspectorNode) {
         val box = group.box
-        node.top = box.top
-        node.left = box.left
+        node.top = box.top + rootLocation[1]
+        node.left = box.left + rootLocation[0]
         node.height = box.bottom - box.top
         node.width = box.right - box.left
     }
@@ -488,6 +496,15 @@
             .map { it.layerId }
             .firstOrNull() ?: 0
 
+    @OptIn(ExperimentalComposeUiApi::class)
+    private fun belongsToView(layoutNodes: List<LayoutInfo>, view: View): Boolean =
+        layoutNodes.asSequence().flatMap { node ->
+            node.getModifierInfo().asSequence()
+                .map { it.extra }
+                .filterIsInstance<GraphicLayerInfo>()
+                .mapNotNull { it.ownerViewId }
+        }.contains(view.uniqueDrawingId)
+
     @OptIn(UiToolingDataApi::class)
     private fun addParameters(parameters: List<ParameterInformation>, node: MutableInspectorNode) =
         parameters.forEach { addParameter(it, node) }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
index 3eb2298..8975acf 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/inspector/ParameterFactory.kt
@@ -18,7 +18,6 @@
 
 import android.util.Log
 import android.view.View
-import androidx.compose.runtime.ComposeCompilerApi
 import androidx.compose.runtime.internal.ComposableLambda
 import androidx.compose.ui.AbsoluteAlignment
 import androidx.compose.ui.Modifier
@@ -428,7 +427,6 @@
                 return null
             }
             createFromConstant(name, value)?.let { return it }
-            @OptIn(ComposeCompilerApi::class)
             return when (value) {
                 is AnnotatedString -> NodeParameter(name, ParameterType.String, value.text)
                 is BaselineShift -> createFromBaselineShift(name, value)
@@ -638,7 +636,6 @@
             return NodeParameter(name, ParameterType.String, converted)
         }
 
-        @OptIn(ComposeCompilerApi::class)
         private fun createFromCLambda(name: String, value: ComposableLambda): NodeParameter? = try {
             val lambda = value.javaClass.getDeclaredField("_block")
                 .apply { isAccessible = true }
diff --git a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
index 839f23e..2aadf08 100644
--- a/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
+++ b/compose/ui/ui-inspection/src/main/java/androidx/compose/ui/inspection/proto/ComposeExtensions.kt
@@ -205,6 +205,7 @@
 fun NodeParameterReference.convert(): ParameterReference {
     val reference = this
     return ParameterReference.newBuilder().apply {
+        kind = reference.kind.convert()
         composableId = reference.nodeId
         parameterIndex = reference.parameterIndex
         addAllCompositeIndex(reference.indices.asIterable())
diff --git a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
index 4e01e22..ad763d8 100644
--- a/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
+++ b/compose/ui/ui-lint/src/main/java/androidx/compose/ui/lint/ModifierDeclarationDetector.kt
@@ -79,6 +79,10 @@
             // Ignore functions that do not return Modifier or something implementing Modifier
             if (!returnType.inheritsFrom(Names.Ui.Modifier)) return
 
+            // Ignore ParentDataModifiers - this is a special type of Modifier where the type is
+            // used to provide data for use in layout, so we don't want to warn here.
+            if (returnType.inheritsFrom(Names.Ui.Layout.ParentDataModifier)) return
+
             val source = node.sourcePsi
 
             // If this node is a property that is a constructor parameter, ignore it.
diff --git a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
index e3be716..19bd122 100644
--- a/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
+++ b/compose/ui/ui-lint/src/test/java/androidx/compose/ui/lint/ModifierDeclarationDetectorTest.kt
@@ -43,6 +43,33 @@
             ModifierDeclarationDetector.ModifierFactoryUnreferencedReceiver
         )
 
+    // Simplified Density.kt stubs
+    private val DensityStub = kotlin(
+        """
+            package androidx.compose.ui.unit
+
+            interface Density
+        """
+    )
+
+    // Simplified ParentDataModifier.kt / Measurable.kt merged stubs
+    private val MeasurableAndParentDataModifierStub = kotlin(
+        """
+            package androidx.compose.ui.layout
+
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Density
+
+            interface ParentDataModifier : Modifier.Element {
+                fun Density.modifyParentData(parentData: Any?): Any?
+            }
+
+            interface Measurable {
+                val parentData: Any?
+            }
+        """
+    )
+
     @Test
     fun functionReturnsModifierElement() {
         lint().files(
@@ -630,6 +657,32 @@
     }
 
     @Test
+    fun ignoresParentDataModifiers() {
+        lint().files(
+            kotlin(
+                """
+                package androidx.compose.ui.foo
+
+                import androidx.compose.ui.layout.Measurable
+                import androidx.compose.ui.layout.ParentDataModifier
+                import androidx.compose.ui.unit.Density
+
+                private val Measurable.boxChildData: FooData? get() = parentData as? FooData
+
+                private class FooData(var boolean: Boolean) : ParentDataModifier {
+                    override fun Density.modifyParentData(parentData: Any?) = this
+                }
+            """
+            ),
+            kotlin(Stubs.Modifier),
+            DensityStub,
+            MeasurableAndParentDataModifierStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
     fun noErrors() {
         lint().files(
             kotlin(
diff --git a/compose/ui/ui-test-font/api/1.0.0-beta06.txt b/compose/ui/ui-test-font/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/1.0.0-beta07.txt b/compose/ui/ui-test-font/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/res-1.0.0-beta06.txt b/compose/ui/ui-test-font/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-font/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-test-font/api/res-1.0.0-beta07.txt b/compose/ui/ui-test-font/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-font/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-test-font/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-test-font/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/restricted_1.0.0-beta07.txt b/compose/ui/ui-test-font/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/src/androidMain/assets/subdirectory/asset_font.ttf b/compose/ui/ui-test-font/src/androidMain/assets/subdirectory/asset_font.ttf
new file mode 100644
index 0000000..5114707
--- /dev/null
+++ b/compose/ui/ui-test-font/src/androidMain/assets/subdirectory/asset_font.ttf
Binary files differ
diff --git a/compose/ui/ui-test-font/src/font_ttx/asset_font.ttx b/compose/ui/ui-test-font/src/font_ttx/asset_font.ttx
new file mode 100644
index 0000000..c6e5314
--- /dev/null
+++ b/compose/ui/ui-test-font/src/font_ttx/asset_font.ttx
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+  <GlyphOrder>
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="1em"/>
+  </GlyphOrder>
+
+  <head>
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x640cdb2f"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Thu Feb 15 18:29:10 2018"/>
+    <modified value="Sun Oct 14 06:29:17 2018"/>
+    <xMin value="0"/>
+    <yMin value="-200"/>
+    <xMax value="1000"/>
+    <yMax value="800"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="7"/>
+    <fontDirectionHint value="2"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="1000"/>
+    <minLeftSideBearing value="0"/>
+    <minRightSideBearing value="0"/>
+    <xMaxExtent value="1000"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+  </hhea>
+
+  <maxp>
+    <tableVersion value="0x10000"/>
+    <maxZones value="0"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="0"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="3"/>
+    <xAvgCharWidth value="594"/>
+    <usWeightClass value="100"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="5"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="UKWN"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="9"/>
+    <usLastCharIndex value="122"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="0"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="93"/>
+    <mtx name="1em" width="1000" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="3" platEncID="10" language="0">
+        <map code="0x007E" name="1em" /> <!-- ~ -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+    <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+    <TTGlyph name="1em" xMin="0" yMin="-200" xMax="1000" yMax="800">
+        <contour>
+            <pt x="0" y="-200" on="1"/>
+            <pt x="1000" y="300" on="1"/>
+            <pt x="0" y="800" on="1"/>
+        </contour>
+        <instructions />
+    </TTGlyph>
+  </glyf>
+
+  <name>
+    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+      Copyright (C) 2018 The Android Open Source Project
+    </namerecord>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Asset Font
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Asset Font
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      AssetFont-Regular
+    </namerecord>
+    <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with 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.
+    </namerecord>
+    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+      http://www.apache.org/licenses/LICENSE-2.0
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="3.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-75"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+  </post>
+
+</ttFont>
diff --git a/compose/ui/ui-test-junit4/api/1.0.0-beta06.txt b/compose/ui/ui-test-junit4/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/ui/ui-test-junit4/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/ui/ui-test-junit4/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-test-junit4/api/res-1.0.0-beta07.txt b/compose/ui/ui-test-junit4/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-test-junit4/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-test-junit4/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/ui/ui-test-junit4/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.0.0-beta07.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 1130408..9a89811 100644
--- a/compose/ui/ui-test-junit4/build.gradle
+++ b/compose/ui/ui-test-junit4/build.gradle
@@ -57,8 +57,8 @@
         androidTestImplementation(ANDROIDX_TEST_RULES)
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
         androidTestImplementation(TRUTH)
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
         androidTestImplementation(MOCKITO_KOTLIN, {
             exclude group: "org.mockito" // to keep control on the mockito version
         })
@@ -85,6 +85,7 @@
 
                 implementation("androidx.annotation:annotation:1.1.0")
                 implementation(KOTLIN_COROUTINES_CORE)
+                implementation(KOTLIN_COROUTINES_TEST)
             }
 
             androidMain.dependencies {
@@ -99,7 +100,6 @@
                 implementation(ANDROIDX_TEST_MONITOR)
                 implementation(ESPRESSO_CORE)
                 implementation(ESPRESSO_IDLING_RESOURCE)
-                implementation(KOTLIN_COROUTINES_TEST)
             }
 
             androidAndroidTest.dependencies {
@@ -108,8 +108,8 @@
                 implementation(ANDROIDX_TEST_RULES)
                 implementation(ANDROIDX_TEST_RUNNER)
                 implementation(TRUTH)
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
                 implementation(MOCKITO_KOTLIN, {
                     exclude group: "org.mockito" // to keep control on the mockito version
                 })
diff --git a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
index ca66316..f7272a2 100644
--- a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/ComposeIdlingResourceTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.test.junit4
 
-import android.os.Looper
 import androidx.activity.ComponentActivity
 import androidx.compose.animation.core.LinearEasing
 import androidx.compose.animation.core.animateFloat
@@ -31,24 +30,20 @@
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.withFrameNanos
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.test.junit4.android.ComposeIdlingResource
+import androidx.compose.ui.test.IdlingResource
 import androidx.test.espresso.Espresso.onIdle
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.CoroutineStart
-import kotlinx.coroutines.async
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.runBlocking
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
+import java.util.concurrent.Executors
 
 @LargeTest
 class ComposeIdlingResourceTest {
@@ -64,7 +59,6 @@
 
     @get:Rule
     val rule = createAndroidComposeRule<ComponentActivity>()
-    private val composeIdlingResource = rule.composeIdlingResource
 
     /**
      * High level test to only verify that [ComposeTestRule.runOnIdle] awaits animations.
@@ -111,72 +105,38 @@
         assertThat(animationRunning).isFalse()
     }
 
-    /**
-     * Detailed test to verify if [ComposeIdlingResource.isIdleNow] reports idleness correctly at
-     * key moments during the animation kick-off process.
-     */
     @Test
-    @Ignore("b/173798666: Idleness not detected after Snapshot.sendApplyNotifications()")
-    fun testAnimationIdle_detailed() {
-        var wasIdleBeforeKickOff = false
-        var wasIdleBeforeApplySnapshot = false
-        var wasIdleAfterApplySnapshot = false
+    fun testIdlingResourcesAreQueried() {
+        val idlingResource = object : IdlingResource {
+            var readCount = MutableStateFlow(0)
 
-        val animationState = mutableStateOf(AnimationStates.From)
-        lateinit var scope: CoroutineScope
-        rule.setContent {
-            scope = rememberCoroutineScope()
-            Ui(animationState)
-        }
+            override var isIdleNow: Boolean = false
+                get() {
+                    readCount.value++
+                    return field
+                }
 
-        runBlocking(scope.coroutineContext) {
-            // Verify that we're on the main thread, which is important for isIdle() later
-            assertThat(Looper.myLooper()).isEqualTo(Looper.getMainLooper())
-        }
-
-        val wasIdleAfterRecompose = rule.runOnIdle {
-            // Record idleness before kickoff of animation
-            wasIdleBeforeKickOff = composeIdlingResource.isIdleNow
-
-            // Kick off the animation
-            animationRunning = true
-            animationState.value = AnimationStates.To
-
-            // Record idleness after kickoff of animation, but before the snapshot is applied
-            wasIdleBeforeApplySnapshot = composeIdlingResource.isIdleNow
-
-            // Apply the snapshot
-            Snapshot.sendApplyNotifications()
-
-            // Record idleness after this snapshot is applied
-            wasIdleAfterApplySnapshot = composeIdlingResource.isIdleNow
-
-            // Record idleness after the first recomposition
-            scope.async(start = CoroutineStart.UNDISPATCHED) {
-                // Await a single recomposition
-                withFrameNanos {}
-                composeIdlingResource.isIdleNow
-            }
-        }.let {
-            runBlocking {
-                it.await()
+            // Returns a lambda that suspends until isIdleNow is queried 10 more times
+            fun delayedTransitionToIdle(): () -> Unit {
+                return {
+                    runBlocking {
+                        val start = readCount.value
+                        readCount.first { it == start + 10 }
+                        isIdleNow = true
+                    }
+                }
             }
         }
 
-        // Wait until it is finished
-        rule.runOnIdle {
-            // Verify it was finished
-            assertThat(animationRunning).isFalse()
+        rule.registerIdlingResource(idlingResource)
+        Executors.newSingleThreadExecutor().execute(idlingResource.delayedTransitionToIdle())
 
-            // Before the animation is kicked off, it is still idle
-            assertThat(wasIdleBeforeKickOff).isTrue()
-            // After animation is kicked off, but before the frame is committed, it must be busy
-            assertThat(wasIdleBeforeApplySnapshot).isFalse()
-            // After the frame is committed, it must still be busy
-            assertThat(wasIdleAfterApplySnapshot).isFalse()
-            // After recomposition, it must still be busy
-            assertThat(wasIdleAfterRecompose).isFalse()
-        }
+        val startReadCount = idlingResource.readCount.value
+        rule.waitForIdle()
+        val endReadCount = idlingResource.readCount.value
+
+        assertThat(idlingResource.isIdleNow).isTrue()
+        assertThat(endReadCount - startReadCount).isAtLeast(10)
     }
 
     @Composable
diff --git a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
index 0b2adb9..417a35f 100644
--- a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/TimeOutTest.kt
@@ -146,6 +146,25 @@
         }
     }
 
+    @Test(timeout = 10_000)
+    fun checkIdlingResource_causesTimeout() {
+        // Block idleness with an IdlingResource
+        rule.registerIdlingResource(
+            object : androidx.compose.ui.test.IdlingResource {
+                override val isIdleNow: Boolean = false
+                override fun getDiagnosticMessageIfBusy(): String {
+                    return "Never IDLE"
+                }
+            }
+        )
+        IdlingPolicies.setIdlingResourceTimeout(300, TimeUnit.MILLISECONDS)
+        expectError<ComposeNotIdleException>(
+            expectedMessage = ".*\\[busy\\] Never IDLE.*\\[idle\\] .*ComposeIdlingResource.*"
+        ) {
+            rule.waitForIdle()
+        }
+    }
+
     @Test(timeout = 5000)
     fun timeout_testIsolation_check() {
         // This test is here to guarantee that even if we crash on infinite recompositions after
diff --git a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
index 0c5823c..01d4151 100644
--- a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionsInCoroutinesTest.kt
@@ -23,10 +23,7 @@
 import androidx.test.filters.LargeTest
 import org.junit.Rule
 import org.junit.Test
-import org.junit.rules.RuleChain
-import org.junit.rules.TestRule
 import org.junit.runner.RunWith
-import org.junit.runners.model.Statement
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -34,23 +31,8 @@
 
     private class TestException : Exception()
 
-    // Need to expect the error in a test rule around the AndroidComposeTestRule, because the
-    // exception can surface after the test is completed, when the AndroidComposeTestRule cleans
-    // up test scoped variables.
-    private val testExceptionRule = TestRule { base, _ ->
-        object : Statement() {
-            override fun evaluate() {
-                expectError<TestException> {
-                    base.evaluate()
-                }
-            }
-        }
-    }
-
-    private val rule = createComposeRule()
-
     @get:Rule
-    val testRule: TestRule = RuleChain.outerRule(testExceptionRule).around(rule)
+    val rule = createComposeRule()
 
     // Run the test twice so we can verify if a failed test took down the test suite:
     // - Results have 1 failed test:
@@ -60,12 +42,16 @@
 
     @Test
     fun test1() {
-        throwInLaunchedEffect()
+        expectError<TestException> {
+            throwInLaunchedEffect()
+        }
     }
 
     @Test
     fun test2() {
-        throwInLaunchedEffect()
+        expectError<TestException> {
+            throwInLaunchedEffect()
+        }
     }
 
     private fun throwInLaunchedEffect() {
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 95c6158..b5f158a 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
@@ -61,7 +61,6 @@
 import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestCoroutineDispatcher
-import kotlinx.coroutines.test.TestCoroutineExceptionHandler
 import kotlinx.coroutines.withContext
 import org.junit.rules.RuleChain
 import org.junit.rules.TestRule
@@ -178,16 +177,14 @@
     internal val composeRootRegistry = ComposeRootRegistry()
 
     private val mainClockImpl: MainTestClockImpl
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    internal val composeIdlingResource: IdlingResource
+    private val composeIdlingResource: IdlingResource
 
     private val recomposer: Recomposer
     @OptIn(ExperimentalCoroutinesApi::class)
     private val testCoroutineDispatcher: TestCoroutineDispatcher
     private val recomposerApplyCoroutineScope: CoroutineScope
     private val frameCoroutineScope: CoroutineScope
-    @OptIn(ExperimentalCoroutinesApi::class)
-    private val coroutineExceptionHandler: TestCoroutineExceptionHandler
+    private val coroutineExceptionHandler = UncaughtExceptionHandler()
 
     override val mainClock: MainTestClock
         get() = mainClockImpl
@@ -208,8 +205,6 @@
             }
         }
         @OptIn(ExperimentalCoroutinesApi::class)
-        coroutineExceptionHandler = TestCoroutineExceptionHandler()
-        @OptIn(ExperimentalCoroutinesApi::class)
         recomposerApplyCoroutineScope = CoroutineScope(
             testCoroutineDispatcher + frameClock + infiniteAnimationPolicy +
                 coroutineExceptionHandler + Job()
@@ -288,7 +283,7 @@
             // Then await composition(s)
             runEspressoOnIdle()
         }
-        checkUncaughtCoroutineExceptions()
+        coroutineExceptionHandler.throwUncaught()
     }
 
     override fun <T> runOnUiThread(action: () -> T): T {
@@ -327,18 +322,6 @@
         idlingResourceRegistry.unregisterIdlingResource(idlingResource)
     }
 
-    /**
-     * Checks if the [coroutineExceptionHandler] has caught uncaught exceptions. If so, will
-     * rethrow the first to fail the test. Rather than only calling this only at the end of the
-     * test, as recommended by [cleanupTestCoroutines][kotlinx.coroutines.test
-     * .UncaughtExceptionCaptor.cleanupTestCoroutines], try calling this at a few strategic
-     * points to fail the test asap after the exception was caught.
-     */
-    private fun checkUncaughtCoroutineExceptions() {
-        @OptIn(ExperimentalCoroutinesApi::class)
-        coroutineExceptionHandler.cleanupTestCoroutines()
-    }
-
     inner class AndroidComposeStatement(
         private val base: Statement
     ) : Statement() {
@@ -364,7 +347,7 @@
                 // throwing errors on active coroutines
                 recomposerApplyCoroutineScope.cancel()
                 frameCoroutineScope.cancel()
-                checkUncaughtCoroutineExceptions()
+                coroutineExceptionHandler.throwUncaught()
                 @OptIn(ExperimentalCoroutinesApi::class)
                 testCoroutineDispatcher.cleanupTestCoroutines()
                 textInputServiceFactory = oldTextInputFactory
@@ -457,7 +440,7 @@
             //  between now and when the new Activity has created its compose root, even though
             //  waitForComposeRoots() suggests that we are now guaranteed one.
 
-            checkUncaughtCoroutineExceptions()
+            coroutineExceptionHandler.throwUncaught()
         }
 
         override fun getRoots(atLeastOneRootExpected: Boolean): Set<RootForTest> {
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
index 7038f13..e055101 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
@@ -49,10 +49,6 @@
 @OptIn(InternalTestApi::class)
 class DesktopComposeTestRule : ComposeContentTestRule {
 
-    companion object {
-        var current: DesktopComposeTestRule? = null
-    }
-
     override val density: Density
         get() = Density(1f, 1f)
 
@@ -61,13 +57,13 @@
 
     internal val testDisplaySize: IntSize get() = IntSize(1024, 768)
 
+    private var uncaughtExceptionHandler = UncaughtExceptionHandler()
     lateinit var window: TestComposeWindow
 
     private val testOwner = DesktopTestOwner(this)
     private val testContext = createTestContext(testOwner)
 
     override fun apply(base: Statement, description: Description?): Statement {
-        current = this
         return object : Statement() {
             override fun evaluate() {
                 window = runOnUiThread(::createWindow)
@@ -77,6 +73,8 @@
                 } finally {
                     runOnUiThread(window::dispose)
                 }
+
+                uncaughtExceptionHandler.throwUncaught()
             }
         }
     }
@@ -86,7 +84,7 @@
         height = testDisplaySize.height,
         density = density,
         nanoTime = System::nanoTime, // TODO(demin): use mainClock?
-        coroutineContext = Dispatchers.Swing
+        coroutineContext = Dispatchers.Swing + uncaughtExceptionHandler
     )
 
     private fun isIdle() =
@@ -96,6 +94,7 @@
     override fun waitForIdle() {
         while (!isIdle()) {
             Thread.sleep(10)
+            uncaughtExceptionHandler.throwUncaught()
         }
     }
 
@@ -103,6 +102,7 @@
     override suspend fun awaitIdle() {
         while (!isIdle()) {
             delay(10)
+            uncaughtExceptionHandler.throwUncaught()
         }
     }
 
diff --git a/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionHandler.jvm.kt b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionHandler.jvm.kt
new file mode 100644
index 0000000..b25d2ba
--- /dev/null
+++ b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/UncaughtExceptionHandler.jvm.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.ui.test.junit4
+
+import kotlinx.coroutines.CoroutineExceptionHandler
+import kotlin.coroutines.AbstractCoroutineContextElement
+import kotlin.coroutines.CoroutineContext
+
+/**
+ * Similar to [TestCoroutineExceptionHandler], but with clearing all thrown exceptions
+ *
+ * If we don't clear exceptions they will be thrown twice in this example
+ * (the exception will be thrown inside awaitIdle and after the test):
+ * ```
+ * @Test
+ * fun test() {
+ *    runBlocking(Dispatchers.Main) {
+ *        try {
+ *            rule.awaitIdle()
+ *        } catch (e: SomeException) {
+ *            // ignore
+ *        }
+ *    }
+ * }
+ * ```
+ */
+internal class UncaughtExceptionHandler :
+    AbstractCoroutineContextElement(CoroutineExceptionHandler),
+    CoroutineExceptionHandler {
+    private var exception: Throwable? = null
+
+    override fun handleException(context: CoroutineContext, exception: Throwable) {
+        synchronized(this) {
+            if (this.exception == null) {
+                this.exception = exception
+            } else {
+                this.exception!!.addSuppressed(exception)
+            }
+        }
+    }
+
+    /**
+     * Checks if the [UncaughtExceptionHandler] has caught uncaught exceptions. If so, will
+     * rethrow the first to fail the test. The rest exceptions will be added to the first and
+     * marked as `suppressed`.
+     *
+     * The next call of this method will not throw already thrown exception.
+     *
+     * Rather than only calling this only at the end of the test, as recommended by
+     * [UncaughtExceptionCaptor.cleanupTestCoroutines],
+     * try calling this at a few strategic
+     * points to fail the test asap after the exception was caught.
+     */
+    fun throwUncaught() {
+        synchronized(this) {
+            val exception = exception
+            if (exception != null) {
+                this.exception = null
+                throw exception
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-test-manifest/api/1.0.0-beta06.txt b/compose/ui/ui-test-manifest/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/1.0.0-beta07.txt b/compose/ui/ui-test-manifest/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/res-1.0.0-beta06.txt b/compose/ui/ui-test-manifest/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-test-manifest/api/res-1.0.0-beta07.txt b/compose/ui/ui-test-manifest/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta07.txt b/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test/api/1.0.0-beta06.txt b/compose/ui/ui-test/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..c6c2a27
--- /dev/null
+++ b/compose/ui/ui-test/api/1.0.0-beta06.txt
@@ -0,0 +1,289 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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 final class KeyInputHelpersKt {
+    method public static boolean performKeyPress-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/1.0.0-beta07.txt b/compose/ui/ui-test/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..c6c2a27
--- /dev/null
+++ b/compose/ui/ui-test/api/1.0.0-beta07.txt
@@ -0,0 +1,289 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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 final class KeyInputHelpersKt {
+    method public static boolean performKeyPress-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 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_1.0.0-beta06.txt b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..55ccf35
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,325 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeDown(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeLeft(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeRight(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeUp(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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;
+  }
+
+  @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-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 {
+  }
+
+  @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, androidx.compose.ui.text.input.ImeAction 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-pAoLNKA(androidx.compose.ui.test.SemanticsNodeInteraction, long selection);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  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_1.0.0-beta07.txt b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..55ccf35
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,325 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeDown(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeLeft(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeRight(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void swipeUp(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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;
+  }
+
+  @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-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 {
+  }
+
+  @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, androidx.compose.ui.text.input.ImeAction 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-pAoLNKA(androidx.compose.ui.test.SemanticsNodeInteraction, long selection);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  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 9eda37b..55ccf35 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -5,6 +5,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
     method 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
     method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
   }
@@ -84,6 +86,8 @@
     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 @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
     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);
diff --git a/compose/ui/ui-test/api/res-1.0.0-beta06.txt b/compose/ui/ui-test/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-test/api/res-1.0.0-beta07.txt b/compose/ui/ui-test/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-test/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-test/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-test/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..c6c2a27
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,289 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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 final class KeyInputHelpersKt {
+    method public static boolean performKeyPress-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/restricted_1.0.0-beta07.txt b/compose/ui/ui-test/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..c6c2a27
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,289 @@
+// 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 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 performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void 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 void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+  }
+
+  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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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 ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean ignoreCase);
+    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-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo-aELHoiQ(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast-3AN6ZEs(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo-3AN6ZEs(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 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 label, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(androidx.compose.ui.text.input.ImeAction 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 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 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);
+  }
+
+  public final class GestureScope {
+    ctor public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method public long getVisibleSize-YbymL2g();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method public static void cancel(androidx.compose.ui.test.GestureScope);
+    method public static void click-ssxj34k(androidx.compose.ui.test.GestureScope, optional long position);
+    method public static void doubleClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method public static void down-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void down-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method public static void longClick-LZsBx1o(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method public static void move(androidx.compose.ui.test.GestureScope);
+    method public static void moveBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void moveBy-ssxj34k(androidx.compose.ui.test.GestureScope, long delta);
+    method public static void movePointerBy-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method public static void movePointerTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-NAWZHwc(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method public static void moveTo-ssxj34k(androidx.compose.ui.test.GestureScope, long position);
+    method public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method public static void pinch-1c52nSY(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe-DPh1Mgw(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method public static void swipeWithVelocity-YsXUJPI(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method 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 final class KeyInputHelpersKt {
+    method public static boolean performKeyPress-S8GO8FU(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 p);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  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 final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test/build.gradle b/compose/ui/ui-test/build.gradle
index 4f251e1..19de9f8 100644
--- a/compose/ui/ui-test/build.gradle
+++ b/compose/ui/ui-test/build.gradle
@@ -52,8 +52,8 @@
         androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(project(":compose:ui:ui-test-junit4"))
         androidTestImplementation(TRUTH)
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
         androidTestImplementation(MOCKITO_KOTLIN, {
             exclude group: "org.mockito" // to keep control on the mockito version
         })
@@ -96,8 +96,8 @@
                 implementation(project(":compose:ui:ui-test-junit4"))
                 implementation(project(":activity:activity-compose"))
                 implementation(TRUTH)
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
                 implementation(MOCKITO_KOTLIN, {
                     exclude group: "org.mockito" // to keep control on the mockito version
                 })
diff --git a/compose/ui/ui-test/lint-baseline.xml b/compose/ui/ui-test/lint-baseline.xml
index 75e9668..98da96f 100644
--- a/compose/ui/ui-test/lint-baseline.xml
+++ b/compose/ui/ui-test/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.compose.ui.test.android.WindowCapture_androidKt is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.test.android.WindowCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            decorView.viewTreeObserver.registerFrameCommitCallback {"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.test.android.WindowCapture_androidKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.test.android.WindowCapture_androidKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    PixelCopy.request(windowToCapture, captureRectInWindow, destBitmap, onCopyFinished, handler)"
         errorLine2="              ~~~~~~~">
         <location
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.kt
new file mode 100644
index 0000000..d8175bf
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToIndexTest.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.ui.test.actions
+
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.hasScrollToIndexAction
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performScrollToIndex
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalTestApi::class)
+class ScrollToIndexTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    private fun tag(index: Int): String = "tag_$index"
+
+    @Test
+    fun scrollToIndexInsideViewport() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToIndex 1
+        rule.onNodeWithTag(tag(1)).assertExists()
+        rule.onNode(hasScrollToIndexAction()).assertExists()
+        rule.onNode(hasScrollToIndexAction()).performScrollToIndex(1)
+        rule.onNodeWithTag(tag(1)).assertExists()
+    }
+
+    @Test
+    fun scrollToIndexOutOfViewport() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToIndex 10
+        rule.onNodeWithTag(tag(10)).assertDoesNotExist()
+        rule.onNode(hasScrollToIndexAction()).assertExists()
+        rule.onNode(hasScrollToIndexAction()).performScrollToIndex(10)
+        rule.onNodeWithTag(tag(10)).assertExists()
+    }
+
+    @Test
+    fun scrollToIndexLargerThanSize() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToIndex 20
+        expectError<IllegalArgumentException>(
+            expectedMessage = "Can't scroll to index 20, it is out of bounds.*"
+        ) {
+            rule.onNode(hasScrollToIndexAction()).performScrollToIndex(20)
+        }
+    }
+
+    @Test
+    fun scrollToIndexSmallerThanZero() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToIndex -2
+        expectError<IllegalArgumentException>(
+            expectedMessage = "Can't scroll to index -2, it is out of bounds.*"
+        ) {
+            rule.onNode(hasScrollToIndexAction()).performScrollToIndex(-2)
+        }
+    }
+
+    @Test
+    fun missingScrollToIndexSemantics() {
+        // Setup a node without ScrollToIndex
+        rule.setContent { Spacer(Modifier.testTag("tag")) }
+
+        // Verify that it doesn't support performScrollToIndex
+        rule.onNode(hasScrollToIndexAction()).assertDoesNotExist()
+        expectError<AssertionError>(
+            expectedMessage = "Failed to scroll to index 1, " +
+                "the node is missing \\[SemanticsPropertyKey: ScrollToIndex\\].*"
+        ) {
+            rule.onNodeWithTag("tag").performScrollToIndex(1)
+        }
+    }
+
+    @Composable
+    fun LazyColumnContent() {
+        LazyColumn(Modifier.requiredSize(100.dp)) {
+            items(List(20) { it }) {
+                Spacer(Modifier.requiredHeight(30.dp).fillMaxWidth().testTag(tag(it)))
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt
new file mode 100644
index 0000000..e0577e7
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToKeyTest.kt
@@ -0,0 +1,137 @@
+/*
+ * 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.test.actions
+
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.indexForKey
+import androidx.compose.ui.semantics.scrollToIndex
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.hasScrollToKeyAction
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performScrollToKey
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalTestApi::class)
+class ScrollToKeyTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    private fun key(index: Int): String = "key_$index"
+    private fun tag(index: Int): String = "tag_$index"
+
+    @Test
+    fun scrollToKeyInsideViewport() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToKey "key_1"
+        rule.onNodeWithTag(tag(1)).assertExists()
+        rule.onNode(hasScrollToKeyAction()).assertExists()
+        rule.onNode(hasScrollToKeyAction()).performScrollToKey("key_1")
+        rule.onNodeWithTag(tag(1)).assertExists()
+    }
+
+    @Test
+    fun scrollToKeyOutOfViewport() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToKey "key_10"
+        rule.onNodeWithTag(tag(10)).assertDoesNotExist()
+        rule.onNode(hasScrollToKeyAction()).assertExists()
+        rule.onNode(hasScrollToKeyAction()).performScrollToKey("key_10")
+        rule.onNodeWithTag(tag(10)).assertExists()
+    }
+
+    @Test
+    fun scrollToNonExistentKey() {
+        // Setup a list
+        rule.setContent { LazyColumnContent() }
+
+        // ScrollToKey "hello"
+        expectError<IllegalArgumentException>(
+            expectedMessage = "Failed to scroll to the item identified by \"hello\", " +
+                "couldn't find the key."
+        ) {
+            rule.onNode(hasScrollToKeyAction()).performScrollToKey("hello")
+        }
+    }
+
+    @Test
+    fun missingSemantics_ScrollToIndex() {
+        // Setup a node without ScrollToIndex, but with IndexForKey
+        rule.setContent {
+            Spacer(Modifier.testTag("tag").semantics { indexForKey { 0 } })
+        }
+
+        // Verify that it doesn't support performScrollToKey
+        rule.onNode(hasScrollToKeyAction()).assertDoesNotExist()
+        expectError<AssertionError>(
+            expectedMessage = "Failed to scroll to the item identified by \"1\", " +
+                "the node is missing \\[SemanticsPropertyKey: ScrollToIndex\\].*"
+        ) {
+            rule.onNodeWithTag("tag").performScrollToKey(1)
+        }
+    }
+
+    @Test
+    fun missingSemantics_IndexForKey() {
+        // Setup a node without IndexForKey, but with ScrollToIndex
+        rule.setContent {
+            Spacer(Modifier.testTag("tag").semantics { scrollToIndex { true } })
+        }
+
+        // Verify that it doesn't support performScrollToKey
+        rule.onNode(hasScrollToKeyAction()).assertDoesNotExist()
+        expectError<AssertionError>(
+            expectedMessage = "Failed to scroll to the item identified by \"1\", " +
+                "the node is missing \\[SemanticsPropertyKey: IndexForKey\\].*"
+        ) {
+            rule.onNodeWithTag("tag").performScrollToKey(1)
+        }
+    }
+
+    @Composable
+    fun LazyColumnContent() {
+        LazyColumn(Modifier.requiredSize(100.dp)) {
+            items(
+                items = List(20) { it },
+                key = { key(it) }
+            ) {
+                Spacer(Modifier.requiredHeight(30.dp).fillMaxWidth().testTag(tag(it)))
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
index e01eadf..2fa7c14 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeTest.kt
@@ -24,14 +24,12 @@
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.testutils.WithTouchSlop
 import androidx.compose.testutils.expectError
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalViewConfiguration
-import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.bottomCenter
@@ -266,10 +264,10 @@
 
     @Test
     fun swipeScrollable() {
-        val touchSlop = TestTouchSlop
+        val touchSlop = 18f
         val scrollState = ScrollState(initial = 0)
         rule.setContent {
-            CompositionLocalProvider(LocalViewConfiguration provides FakeViewConfiguration) {
+            WithTouchSlop(touchSlop) {
                 with(LocalDensity.current) {
                     // Scrollable with a viewport the size of 10 boxes
                     Column(
@@ -345,17 +343,4 @@
         events.map { it.position.x }.assertIncreasing()
         events.map { it.position.y }.assertSame(tolerance = 0.001f)
     }
-
-    internal val TestTouchSlop = 18f
-
-    private val FakeViewConfiguration = object : ViewConfiguration {
-        override val longPressTimeoutMillis: Long
-            get() = 500L
-        override val doubleTapTimeoutMillis: Long
-            get() = 300L
-        override val doubleTapMinTimeMillis: Long
-            get() = 40L
-        override val touchSlop: Float
-            get() = TestTouchSlop
-    }
 }
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
index 927ecf5..7539903 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
@@ -22,8 +22,10 @@
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.semantics.AccessibilityAction
 import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsActions.ScrollToIndex
 import androidx.compose.ui.semantics.SemanticsNode
 import androidx.compose.ui.semantics.SemanticsProperties.HorizontalScrollAxisRange
+import androidx.compose.ui.semantics.SemanticsProperties.IndexForKey
 import androidx.compose.ui.semantics.SemanticsProperties.VerticalScrollAxisRange
 import androidx.compose.ui.semantics.SemanticsPropertyKey
 import androidx.compose.ui.semantics.getOrNull
@@ -55,6 +57,9 @@
  * parent node that has the semantics action [SemanticsActions.ScrollBy] (usually implemented by
  * defining [scrollBy][androidx.compose.ui.semantics.scrollBy]).
  *
+ * This action should be performed on the [node][SemanticsNodeInteraction] that is part of the
+ * scrollable content, not on the scrollable container.
+ *
  * Throws an [AssertionError] if there is no scroll parent.
  */
 fun SemanticsNodeInteraction.performScrollTo(): SemanticsNodeInteraction {
@@ -114,6 +119,68 @@
 }
 
 /**
+ * Scrolls a scrollable container with items to the item with the given [index].
+ *
+ * Note that not all scrollable containers have item indices. For example, a
+ * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an
+ * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
+ *
+ * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable
+ * container, not on a node that is part of the content of that container.
+ *
+ * Throws an [AssertionError] if the node doesn't have [ScrollToIndex] defined.
+ *
+ * @param index The index of the item to scroll to
+ * @see hasScrollToIndexAction
+ */
+@ExperimentalTestApi
+fun SemanticsNodeInteraction.performScrollToIndex(index: Int): SemanticsNodeInteraction {
+    val node = fetchSemanticsNode("Failed: performScrollToIndex($index)")
+    requireSemantics(node, ScrollToIndex) {
+        "Failed to scroll to index $index"
+    }
+
+    @OptIn(InternalTestApi::class)
+    testContext.testOwner.runOnUiThread {
+        node.config[ScrollToIndex].action!!.invoke(index)
+    }
+    return this
+}
+
+/**
+ * Scrolls a scrollable container with keyed items to the item with the given [key], such as
+ * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] or
+ * [LazyRow][androidx.compose.foundation.lazy.LazyRow].
+ *
+ * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable
+ * container, not on a node that is part of the content of that container.
+ *
+ * Throws an [AssertionError] if the node doesn't have [IndexForKey] or [ScrollToIndex] defined.
+ *
+ * @param key The key of the item to scroll to
+ * @see hasScrollToKeyAction
+ */
+@ExperimentalTestApi
+fun SemanticsNodeInteraction.performScrollToKey(key: Any): SemanticsNodeInteraction {
+    val node = fetchSemanticsNode("Failed: performScrollToKey(\"$key\")")
+    requireSemantics(node, IndexForKey, ScrollToIndex) {
+        "Failed to scroll to the item identified by \"$key\""
+    }
+
+    val index = node.config[IndexForKey].invoke(key)
+    require(index >= 0) {
+        "Failed to scroll to the item identified by \"$key\", couldn't find the key."
+    }
+
+    @OptIn(InternalTestApi::class)
+    testContext.testOwner.runOnUiThread {
+        node.config[ScrollToIndex].action!!.invoke(index)
+    }
+
+    return this
+}
+
+/**
  * Executes the (partial) gesture specified in the given [block]. The gesture doesn't need to be
  * complete and can be resumed in a later invocation of [performGesture]. It is the
  * responsibility of the caller to make sure partial gestures don't leave the test in an
@@ -179,13 +246,8 @@
     invocation: (T) -> Unit
 ) {
     val node = fetchSemanticsNode("Failed to perform ${key.name} action.")
-    if (key !in node.config) {
-        throw AssertionError(
-            buildGeneralErrorMessage(
-                "Failed to perform ${key.name} action as it is not defined on the node.",
-                selector, node
-            )
-        )
+    requireSemantics(node, key) {
+        "Failed to perform action ${key.name}"
     }
 
     @OptIn(InternalTestApi::class)
@@ -218,3 +280,15 @@
 
 private val SemanticsNode.isReversedVertically: Boolean
     get() = config.getOrNull(VerticalScrollAxisRange)?.reverseScrolling == true
+
+private fun SemanticsNodeInteraction.requireSemantics(
+    node: SemanticsNode,
+    vararg properties: SemanticsPropertyKey<*>,
+    errorMessage: () -> String
+) {
+    val missingProperties = properties.filter { it !in node.config }
+    if (missingProperties.isNotEmpty()) {
+        val msg = "${errorMessage()}, the node is missing [${missingProperties.joinToString()}]"
+        throw AssertionError(buildGeneralErrorMessage(msg, selector, node))
+    }
+}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
index 8977883..7a83f37 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
@@ -273,7 +273,8 @@
 fun isDialog(): SemanticsMatcher =
     SemanticsMatcher.keyIsDefined(SemanticsProperties.IsDialog)
 
-/** Returns whether the node is a popup.
+/**
+ * Returns whether the node is a popup.
  *
  * This only checks if the node itself is a popup, not if it is _part of_ a popup. Use
  * `hasAnyAncestorThat(isPopup())` for that.
@@ -302,6 +303,27 @@
     SemanticsMatcher.keyIsDefined(SemanticsActions.SetText)
 
 /**
+ * Returns whether the node defines the ability to scroll to an item index.
+ *
+ * Note that not all scrollable containers have item indices. For example, a
+ * [scrollable][androidx.compose.foundation.gestures.scrollable] doesn't have items with an
+ * index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
+ */
+@ExperimentalTestApi
+fun hasScrollToIndexAction() =
+    SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollToIndex)
+
+/**
+ * Returns whether the node defines the ability to scroll to an item identified by a key, such as
+ * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] or
+ * [LazyRow][androidx.compose.foundation.lazy.LazyRow].
+ */
+@ExperimentalTestApi
+fun hasScrollToKeyAction() =
+    SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollToIndex)
+        .and(SemanticsMatcher.keyIsDefined(SemanticsProperties.IndexForKey))
+
+/**
  * Return whether the node is the root semantics node.
  *
  * There is always one root in every node tree, added implicitly by Compose.
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
index 5ac3060..09466a2 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Output.kt
@@ -228,7 +228,7 @@
             continue
         }
 
-        if (value is AccessibilityAction<*>) {
+        if (value is AccessibilityAction<*> || value is Function<*>) {
             // Avoids printing stuff like "action = 'AccessibilityAction\(label=null, action=.*\)'"
             actions.add(key.name)
             continue
diff --git a/compose/ui/ui-text/api/1.0.0-beta05.txt b/compose/ui/ui-text/api/1.0.0-beta05.txt
index 54f2b2c..d828977 100644
--- a/compose/ui/ui-text/api/1.0.0-beta05.txt
+++ b/compose/ui/ui-text/api/1.0.0-beta05.txt
@@ -363,7 +363,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -763,9 +763,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/api/1.0.0-beta06.txt b/compose/ui/ui-text/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..549abc8
--- /dev/null
+++ b/compose/ui/ui-text/api/1.0.0-beta06.txt
@@ -0,0 +1,1126 @@
+// 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-5zc-tL8(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 p);
+    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 @androidx.compose.runtime.Immutable 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/1.0.0-beta07.txt b/compose/ui/ui-text/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..549abc8
--- /dev/null
+++ b/compose/ui/ui-text/api/1.0.0-beta07.txt
@@ -0,0 +1,1126 @@
+// 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-5zc-tL8(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 p);
+    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 @androidx.compose.runtime.Immutable 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index 54f2b2c..549abc8 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -242,6 +242,9 @@
     enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
   }
 
+  public final class SaversKt {
+  }
+
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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);
@@ -363,7 +366,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -485,6 +488,9 @@
   public final class SpannedExtensionsKt {
   }
 
+  public final class StaticLayoutFactoryKt {
+  }
+
   public final class TempListUtilsKt {
   }
 
@@ -502,6 +508,9 @@
 
 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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -763,9 +772,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta05.txt b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta05.txt
index c27df38..41aa356 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta05.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta05.txt
@@ -366,7 +366,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -769,9 +769,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..851a17f
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,1141 @@
+// 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-5zc-tL8(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.runtime.ExperimentalComposeApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    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 @androidx.compose.runtime.Immutable 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.runtime.ExperimentalComposeApi 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.runtime.ExperimentalComposeApi 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..851a17f
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,1141 @@
+// 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-5zc-tL8(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.runtime.ExperimentalComposeApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
+    method public void append(String text);
+    method public void append(char p);
+    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 @androidx.compose.runtime.Immutable 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.runtime.ExperimentalComposeApi 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.runtime.ExperimentalComposeApi 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow 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 c27df38..851a17f 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -30,6 +30,7 @@
     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.runtime.ExperimentalComposeApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
     method public void append(String text);
     method public void append(char p);
     method public void append(androidx.compose.ui.text.AnnotatedString text);
@@ -70,10 +71,15 @@
     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.runtime.ExperimentalComposeApi 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.runtime.ExperimentalComposeApi 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 {
   }
 
@@ -245,6 +251,9 @@
     enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
   }
 
+  public final class SaversKt {
+  }
+
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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);
@@ -366,7 +375,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -491,6 +500,9 @@
   public final class SpannedExtensionsKt {
   }
 
+  public final class StaticLayoutFactoryKt {
+  }
+
   public final class TempListUtilsKt {
   }
 
@@ -508,6 +520,12 @@
 
 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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -769,9 +787,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/api/res-1.0.0-beta06.txt b/compose/ui/ui-text/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-text/api/res-1.0.0-beta07.txt b/compose/ui/ui-text/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-text/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-text/api/restricted_1.0.0-beta05.txt b/compose/ui/ui-text/api/restricted_1.0.0-beta05.txt
index 54f2b2c..d828977 100644
--- a/compose/ui/ui-text/api/restricted_1.0.0-beta05.txt
+++ b/compose/ui/ui-text/api/restricted_1.0.0-beta05.txt
@@ -363,7 +363,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -763,9 +763,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-text/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..549abc8
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,1126 @@
+// 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-5zc-tL8(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 p);
+    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 @androidx.compose.runtime.Immutable 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/restricted_1.0.0-beta07.txt b/compose/ui/ui-text/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..549abc8
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,1126 @@
+// 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-5zc-tL8(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 p);
+    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 @androidx.compose.runtime.Immutable 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_jvmKt {
+  }
+
+  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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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-k-4lQ0M(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-d9O1mEE(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint-TAOIQ28(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 {
+    method public androidx.compose.ui.text.ParagraphStyle copy-QrGfzA0(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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.Placeholder copy-KJSDsNM(optional long width, optional long height, optional androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight-XSAIIZE();
+    method public androidx.compose.ui.text.PlaceholderVerticalAlign getPlaceholderVerticalAlign();
+    method public long getWidth-XSAIIZE();
+    property public final long height;
+    property public final androidx.compose.ui.text.PlaceholderVerticalAlign placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public enum PlaceholderVerticalAlign {
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign AboveBaseline;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Bottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Center;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextBottom;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextCenter;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign TextTop;
+    enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    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 {
+    method public androidx.compose.ui.text.TextLayoutInput copy-ih31NyA(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 androidx.compose.ui.text.style.TextOverflow 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-msEJaDk();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public androidx.compose.ui.text.style.TextOverflow 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 androidx.compose.ui.text.style.TextOverflow 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 {
+    method public androidx.compose.ui.text.TextLayoutResult copy-1moGK-E(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-k-4lQ0M(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-YbymL2g();
+    method public long getWordBoundary-d9O1mEE(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-2H_Vf2E(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 static operator boolean contains-5zc-tL8(long $this, long other);
+    method public static operator boolean contains-impl(long $this, int offset);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getCollapsed-impl(long $this);
+    method public static int getEnd-impl(long $this);
+    method public static int getLength-impl(long $this);
+    method public static int getMax-impl(long $this);
+    method public static int getMin-impl(long $this);
+    method public static boolean getReversed-impl(long $this);
+    method public static int getStart-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean intersects-5zc-tL8(long $this, long other);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.text.TextRange.Companion Companion;
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero-d9O1mEE();
+    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-cWlJSyE(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    method public androidx.compose.ui.text.TextStyle copy-4skVB9c(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-0d7_KjU();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift-5SSeXJ0();
+    method public long getColor-0d7_KjU();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize-XSAIIZE();
+    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-XSAIIZE();
+    method public long getLineHeight-XSAIIZE();
+    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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends 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 androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract androidx.compose.ui.text.font.FontStyle 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 androidx.compose.ui.text.font.FontStyle 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 boolean contains(androidx.compose.ui.text.font.Font element);
+    method public boolean containsAll(java.util.Collection<?> elements);
+    method public androidx.compose.ui.text.font.Font get(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    method public int getSize();
+    method public int indexOf(androidx.compose.ui.text.font.Font element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.font.Font> iterator();
+    method public int lastIndexOf(androidx.compose.ui.text.font.Font element);
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator();
+    method public java.util.ListIterator<androidx.compose.ui.text.font.Font> listIterator(int index);
+    method public java.util.List<androidx.compose.ui.text.font.Font> subList(int fromIndex, int toIndex);
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public enum FontStyle {
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Italic;
+    enum_constant public static final androidx.compose.ui.text.font.FontStyle Normal;
+  }
+
+  public enum FontSynthesis {
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis All;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis None;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis Style;
+    enum_constant public static final androidx.compose.ui.text.font.FontSynthesis 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 androidx.compose.ui.text.font.FontStyle style);
+    method public int getResId();
+    method public androidx.compose.ui.text.font.FontStyle getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public androidx.compose.ui.text.font.FontStyle 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 {
+  }
+
+  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 enum ImeAction {
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Default;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Done;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Go;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Next;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction None;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Previous;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Search;
+    enum_constant public static final androidx.compose.ui.text.input.ImeAction Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional androidx.compose.ui.text.input.KeyboardCapitalization capitalization, optional boolean autoCorrect, optional androidx.compose.ui.text.input.KeyboardType keyboardType, optional androidx.compose.ui.text.input.ImeAction imeAction);
+    method public boolean getAutoCorrect();
+    method public androidx.compose.ui.text.input.KeyboardCapitalization getCapitalization();
+    method public androidx.compose.ui.text.input.ImeAction getImeAction();
+    method public androidx.compose.ui.text.input.KeyboardType getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final androidx.compose.ui.text.input.KeyboardCapitalization capitalization;
+    property public final androidx.compose.ui.text.input.ImeAction imeAction;
+    property public final androidx.compose.ui.text.input.KeyboardType 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(androidx.compose.ui.text.input.ImeAction imeAction);
+  }
+
+  public enum KeyboardCapitalization {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Characters;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization None;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Sentences;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardCapitalization Words;
+  }
+
+  public enum KeyboardType {
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Ascii;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Email;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Number;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType NumberPassword;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Password;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Phone;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType Text;
+    enum_constant public static final androidx.compose.ui.text.input.KeyboardType 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 {
+    method public androidx.compose.ui.text.input.TextFieldValue copy-Dr2r1M0(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy-ec4yWi8(optional androidx.compose.ui.text.AnnotatedString annotatedString, 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-MzsxiRA();
+    method public long getSelection-d9O1mEE();
+    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<?> 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 static float constructor-impl(float multiplier);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getMultiplier();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(float p);
+    property public final float multiplier;
+    field public static final androidx.compose.ui.text.style.BaselineShift.Companion Companion;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone-y9eOQZs();
+    method public float getSubscript-y9eOQZs();
+    method public float getSuperscript-y9eOQZs();
+    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-ylBt8J4(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 enum TextAlign {
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Center;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign End;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Justify;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Left;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign Right;
+    enum_constant public static final androidx.compose.ui.text.style.TextAlign 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 enum TextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Content;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrLtr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection ContentOrRtl;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.TextDirection 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 {
+    method public androidx.compose.ui.text.style.TextIndent copy-8E83U4Q(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine-XSAIIZE();
+    method public long getRestLine-XSAIIZE();
+    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 enum TextOverflow {
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Clip;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Ellipsis;
+    enum_constant public static final androidx.compose.ui.text.style.TextOverflow Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index 54f2b2c..549abc8 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -242,6 +242,9 @@
     enum_constant public static final androidx.compose.ui.text.PlaceholderVerticalAlign Top;
   }
 
+  public final class SaversKt {
+  }
+
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     method public androidx.compose.ui.text.SpanStyle copy-D5kMcog(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);
@@ -363,7 +366,7 @@
   }
 
   public final class TextLayoutResultKt {
-    method public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult-2H_Vf2E(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
   }
 
   public final class TextPainter {
@@ -485,6 +488,9 @@
   public final class SpannedExtensionsKt {
   }
 
+  public final class StaticLayoutFactoryKt {
+  }
+
   public final class TempListUtilsKt {
   }
 
@@ -502,6 +508,9 @@
 
 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<? extends kotlin.Pair<androidx.compose.ui.text.font.FontWeight,? extends androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -763,9 +772,9 @@
     property public final androidx.compose.ui.text.input.ImeOptions Default;
   }
 
-  public interface InputEventCallback {
-    method public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
-    method public void onImeAction(androidx.compose.ui.text.input.ImeAction imeAction);
+  @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(androidx.compose.ui.text.input.ImeAction imeAction);
   }
 
   public enum KeyboardCapitalization {
diff --git a/compose/ui/ui-text/benchmark/lint-baseline.xml b/compose/ui/ui-text/benchmark/lint-baseline.xml
index 5ef00a8..d63897f 100644
--- a/compose/ui/ui-text/benchmark/lint-baseline.xml
+++ b/compose/ui/ui-text/benchmark/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
index 42b8357..d4a7d39 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
@@ -54,6 +54,13 @@
             arrayOf(TextType.PlainText, TextType.StyledText),
             arrayOf(Alphabet.Latin, Alphabet.Cjk)
         )
+
+        // A fake resource loader required to construct Paragraph
+        val resourceLoader = object : Font.ResourceLoader {
+            override fun load(font: Font): Any {
+                return false
+            }
+        }
     }
 
     @get:Rule
@@ -77,13 +84,6 @@
         )
     }
 
-    // A fake resource loader required to construct Paragraph
-    private val resourceLoader = object : Font.ResourceLoader {
-        override fun load(font: Font): Any {
-            return false
-        }
-    }
-
     private fun text(textGenerator: RandomTextGenerator): AnnotatedString {
         val text = textGenerator.nextParagraph(textLength)
         val spanStyles = if (textType == TextType.StyledText) {
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
index c99b386..1e0560a 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphMethodBenchmark.kt
@@ -22,7 +22,6 @@
 import androidx.compose.ui.text.Paragraph
 import androidx.compose.ui.text.ParagraphIntrinsics
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.sp
 import androidx.test.filters.LargeTest
@@ -53,11 +52,7 @@
     }
 
     // A fake resource loader required to construct Paragraph
-    private val resourceLoader = object : Font.ResourceLoader {
-        override fun load(font: Font): Any {
-            return false
-        }
-    }
+    private val resourceLoader = ParagraphBenchmark.resourceLoader
 
     private fun paragraphIntrinsics(
         textGenerator: RandomTextGenerator,
diff --git a/compose/ui/ui-text/build.gradle b/compose/ui/ui-text/build.gradle
index 07f2cfb..f3bb4c5 100644
--- a/compose/ui/ui-text/build.gradle
+++ b/compose/ui/ui-text/build.gradle
@@ -66,9 +66,9 @@
         androidTestImplementation(ANDROIDX_TEST_RUNNER)
         androidTestImplementation(ESPRESSO_CORE)
         androidTestImplementation(JUNIT)
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
         // DexMaker has it"s own MockMaker
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
         androidTestImplementation(TRUTH)
         androidTestImplementation(MOCKITO_KOTLIN, {
             exclude group: "org.mockito" // to keep control on the mockito version
@@ -139,9 +139,9 @@
                 implementation(ANDROIDX_TEST_RUNNER)
                 implementation(ESPRESSO_CORE)
                 implementation(JUNIT)
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+                implementation(MOCKITO_CORE, excludes.bytebuddy)
                 implementation(TRUTH)
                 implementation(MOCKITO_KOTLIN, {
                     exclude group: "org.mockito" // to keep control on the mockito version
diff --git a/compose/ui/ui-text/lint-baseline.xml b/compose/ui/ui-text/lint-baseline.xml
deleted file mode 100644
index cb16adc..0000000
--- a/compose/ui/ui-text/lint-baseline.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            Builder.obtain(text, start, end, paint, width)"
-        errorLine2="                    ~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="108"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setTextDirection(textDir)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="110"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setAlignment(alignment)"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="111"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setMaxLines(maxLines)"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="112"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setEllipsize(ellipsize)"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="113"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setEllipsizedWidth(ellipsizedWidth)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="114"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setLineSpacing(lineSpacingExtra, lineSpacingMultiplier)"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="115"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        setJustificationMode(justificationMode)"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="117"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setIncludePad(includePadding)"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="119"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        setUseLineSpacingFromFallbacks(fallbackLineSpacing)"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="121"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setBreakStrategy(breakStrategy)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="123"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setHyphenationFrequency(hyphenationFrequency)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="124"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setIndents(leftIndents, rightIndents)"
-        errorLine2="                    ~~~~~~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="125"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                }.build()"
-        errorLine2="                  ~~~~~">
-        <location
-            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="126"
-            column="19"/>
-    </issue>
-
-</issues>
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/FontTestData.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/FontTestData.kt
index b9108cc..0951dd2 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/FontTestData.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/FontTestData.kt
@@ -150,5 +150,11 @@
             weight = FontWeight.W900,
             style = FontStyle.Italic
         )
+
+        val FONT_INVALID = Font(
+            resId = R.font.invalid_font,
+            weight = FontWeight.W900,
+            style = FontStyle.Italic
+        )
     }
 }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
index ce1b4f1..92925fc 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
@@ -48,7 +48,6 @@
     private val fontFamilyMeasureFont = BASIC_MEASURE_FONT.toFontFamily()
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val defaultDensity = Density(density = 1f)
-    private val cursorWidth = 4f
     private val ltrLocaleList = LocaleList("en")
     private val rtlLocaleList = LocaleList("ar")
 
@@ -425,16 +424,14 @@
 
     @Test
     fun getBidiRunDirection() {
-        with(defaultDensity) {
-            val text = createAnnotatedString("a\u05D0", "\u05D0a")
-            val paragraph = simpleMultiParagraph(text = text)
+        val text = createAnnotatedString("a\u05D0", "\u05D0a")
+        val paragraph = simpleMultiParagraph(text = text)
 
-            assertThat(paragraph.getBidiRunDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
-            assertThat(paragraph.getBidiRunDirection(1)).isEqualTo(ResolvedTextDirection.Rtl)
+        assertThat(paragraph.getBidiRunDirection(0)).isEqualTo(ResolvedTextDirection.Ltr)
+        assertThat(paragraph.getBidiRunDirection(1)).isEqualTo(ResolvedTextDirection.Rtl)
 
-            assertThat(paragraph.getBidiRunDirection(2)).isEqualTo(ResolvedTextDirection.Rtl)
-            assertThat(paragraph.getBidiRunDirection(3)).isEqualTo(ResolvedTextDirection.Ltr)
-        }
+        assertThat(paragraph.getBidiRunDirection(2)).isEqualTo(ResolvedTextDirection.Rtl)
+        assertThat(paragraph.getBidiRunDirection(3)).isEqualTo(ResolvedTextDirection.Ltr)
     }
 
     @Test(expected = java.lang.IllegalArgumentException::class)
@@ -1216,12 +1213,12 @@
         val text = AnnotatedString(
             text = "ab",
             paragraphStyles = listOf(
-                Range<ParagraphStyle>(
+                Range(
                     item = ParagraphStyle(textDirection = TextDirection.Content),
                     start = 0,
                     end = "a".length
                 ),
-                Range<ParagraphStyle>(
+                Range(
                     // skip setting [TextDirection] on purpose, should inherit from the
                     // main [ParagraphStyle]
                     item = ParagraphStyle(),
@@ -1252,7 +1249,7 @@
         val fontSize = 20
         val width = 2.em
         val placeholders = listOf(
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline),
                 0,
                 1
@@ -1283,7 +1280,7 @@
         val fontSize = 20
         val width = 30.sp
         val placeholders = listOf(
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, 1.em, PlaceholderVerticalAlign.AboveBaseline),
                 0,
                 1
@@ -1315,7 +1312,7 @@
         val width = 2.em
         val height = 1.em
         val placeholders = listOf(
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
                 0,
                 1
@@ -1352,12 +1349,12 @@
         val width = 2.em
         val height = 1.em
         val placeholders = listOf(
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
                 0,
                 1
             ),
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
                 2,
                 3
@@ -1402,7 +1399,7 @@
         val width = 2.em
         val height = 1.em
         val placeholders = listOf(
-            AnnotatedString.Range(
+            Range(
                 Placeholder(width, height, PlaceholderVerticalAlign.AboveBaseline),
                 1,
                 3
@@ -1444,7 +1441,7 @@
     private fun simpleMultiParagraphIntrinsics(
         text: AnnotatedString,
         fontSize: TextUnit = TextUnit.Unspecified,
-        placeholders: List<AnnotatedString.Range<Placeholder>> = listOf()
+        placeholders: List<Range<Placeholder>> = listOf()
     ): MultiParagraphIntrinsics {
         return MultiParagraphIntrinsics(
             text,
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
index 530c75b..587a9cc 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
@@ -1723,36 +1723,32 @@
 
     @Test
     fun lineCount_withMaxLineSmallerThanTextLines() {
-        with(defaultDensity) {
-            val text = "a\na\na"
-            val fontSize = 100.sp
-            val lineCount = text.lines().size
-            val maxLines = lineCount - 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+        val text = "a\na\na"
+        val fontSize = 100.sp
+        val lineCount = text.lines().size
+        val maxLines = lineCount - 1
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize),
+            maxLines = maxLines
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(maxLines)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(maxLines)
     }
 
     @Test
     fun lineCount_withMaxLineGreaterThanTextLines() {
-        with(defaultDensity) {
-            val text = "a\na\na"
-            val fontSize = 100.sp
-            val lineCount = text.lines().size
-            val maxLines = lineCount + 1
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize),
-                maxLines = maxLines
-            )
+        val text = "a\na\na"
+        val fontSize = 100.sp
+        val lineCount = text.lines().size
+        val maxLines = lineCount + 1
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize),
+            maxLines = maxLines
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(lineCount)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(lineCount)
     }
 
     @Test(expected = java.lang.IllegalArgumentException::class)
@@ -2506,24 +2502,22 @@
 
     @Test
     fun getLineStart_linebreak() {
-        with(defaultDensity) {
-            val text = "aaabbb"
-            val fontSize = 50f
+        val text = "aaabbb"
+        val fontSize = 50f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = fontSize.sp
-                ),
-                width = fontSize * 3
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                fontFamily = fontFamilyMeasureFont,
+                fontSize = fontSize.sp
+            ),
+            width = fontSize * 3
+        )
 
-            // Prerequisite check for the this test.
-            assertThat(paragraph.lineCount).isEqualTo(2)
-            assertThat(paragraph.getLineStart(0)).isEqualTo(0)
-            assertThat(paragraph.getLineStart(1)).isEqualTo(3)
-        }
+        // Prerequisite check for the this test.
+        assertThat(paragraph.lineCount).isEqualTo(2)
+        assertThat(paragraph.getLineStart(0)).isEqualTo(0)
+        assertThat(paragraph.getLineStart(1)).isEqualTo(3)
     }
 
     @Test
@@ -2632,89 +2626,83 @@
 
     @Test
     fun getLineEllipsisCount() {
-        with(Density(1f)) {
-            val text = "aaaaabbbbbccccc"
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontFamily = fontFamilyMeasureFont,
-                    fontSize = 10.sp
-                ),
-                maxLines = 2,
-                ellipsis = true,
-                width = 50f
-            )
+        val text = "aaaaabbbbbccccc"
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                fontFamily = fontFamilyMeasureFont,
+                fontSize = 10.sp
+            ),
+            maxLines = 2,
+            ellipsis = true,
+            width = 50f
+        )
 
-            // Prerequisite check for the this test.
-            assertThat(paragraph.lineCount).isEqualTo(2)
+        // Prerequisite check for the this test.
+        assertThat(paragraph.lineCount).isEqualTo(2)
 
-            assertThat(paragraph.isLineEllipsized(0)).isFalse()
-            assertThat(paragraph.getLineStart(0)).isEqualTo(0)
-            assertThat(paragraph.getLineEnd(0)).isEqualTo(5)
-            assertThat(paragraph.getLineEnd(0, true)).isEqualTo(5)
+        assertThat(paragraph.isLineEllipsized(0)).isFalse()
+        assertThat(paragraph.getLineStart(0)).isEqualTo(0)
+        assertThat(paragraph.getLineEnd(0)).isEqualTo(5)
+        assertThat(paragraph.getLineEnd(0, true)).isEqualTo(5)
 
-            assertThat(paragraph.isLineEllipsized(1)).isTrue()
-            assertThat(paragraph.getLineStart(1)).isEqualTo(5)
-            assertThat(paragraph.getLineEnd(1)).isEqualTo(text.length)
-            // The ellipsizer may reserve multiple characters for drawing HORIZONTAL ELLIPSIS
-            // character (U+2026). We can only expect the visible end is not the end of the line.
-            assertThat(paragraph.getLineEnd(1, true)).isNotEqualTo(text.length)
-        }
+        assertThat(paragraph.isLineEllipsized(1)).isTrue()
+        assertThat(paragraph.getLineStart(1)).isEqualTo(5)
+        assertThat(paragraph.getLineEnd(1)).isEqualTo(text.length)
+        // The ellipsizer may reserve multiple characters for drawing HORIZONTAL ELLIPSIS
+        // character (U+2026). We can only expect the visible end is not the end of the line.
+        assertThat(paragraph.getLineEnd(1, true)).isNotEqualTo(text.length)
     }
 
     @Test
     fun lineHeight_inSp() {
-        with(defaultDensity) {
-            val text = "abcdefgh"
-            val fontSize = 20f
-            // Make the layout 4 lines
-            val layoutWidth = text.length * fontSize / 4
-            val lineHeight = 30f
+        val text = "abcdefgh"
+        val fontSize = 20f
+        // Make the layout 4 lines
+        val layoutWidth = text.length * fontSize / 4
+        val lineHeight = 30f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize.sp,
-                    lineHeight = lineHeight.sp
-                ),
-                width = layoutWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                fontSize = fontSize.sp,
+                lineHeight = lineHeight.sp
+            ),
+            width = layoutWidth
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(4)
-            // First/last line is influenced by top/bottom padding
-            for (i in 1 until paragraph.lineCount - 1) {
-                val actualHeight = paragraph.getLineHeight(i)
-                // In the sample_font.ttf, the height of the line should be
-                // fontSize + 0.2f * fontSize(line gap)
-                assertWithMessage("line number $i").that(actualHeight).isEqualTo(lineHeight)
-            }
+        assertThat(paragraph.lineCount).isEqualTo(4)
+        // First/last line is influenced by top/bottom padding
+        for (i in 1 until paragraph.lineCount - 1) {
+            val actualHeight = paragraph.getLineHeight(i)
+            // In the sample_font.ttf, the height of the line should be
+            // fontSize + 0.2f * fontSize(line gap)
+            assertWithMessage("line number $i").that(actualHeight).isEqualTo(lineHeight)
         }
     }
 
     @Test
     fun lineHeight_InEm() {
-        with(defaultDensity) {
-            val text = "abcdefgh"
-            val fontSize = 20f
-            // Make the layout 4 lines
-            val layoutWidth = text.length * fontSize / 4
-            val lineHeight = 1.5f
+        val text = "abcdefgh"
+        val fontSize = 20f
+        // Make the layout 4 lines
+        val layoutWidth = text.length * fontSize / 4
+        val lineHeight = 1.5f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.em),
-                width = layoutWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize.sp, lineHeight = lineHeight.em),
+            width = layoutWidth
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(4)
-            // First/last line is influenced by top/bottom padding
-            for (i in 1 until paragraph.lineCount - 1) {
-                val actualHeight = paragraph.getLineHeight(i)
-                // In the sample_font.ttf, the height of the line should be
-                // fontSize + 0.2f * fontSize(line gap)
-                assertWithMessage("line number $i")
-                    .that(actualHeight).isEqualTo(lineHeight * fontSize)
-            }
+        assertThat(paragraph.lineCount).isEqualTo(4)
+        // First/last line is influenced by top/bottom padding
+        for (i in 1 until paragraph.lineCount - 1) {
+            val actualHeight = paragraph.getLineHeight(i)
+            // In the sample_font.ttf, the height of the line should be
+            // fontSize + 0.2f * fontSize(line gap)
+            assertWithMessage("line number $i")
+                .that(actualHeight).isEqualTo(lineHeight * fontSize)
         }
     }
 
@@ -3156,61 +3144,57 @@
 
     @Test
     fun testAnnotatedString_setLetterSpacing_inSp_after_inEm() {
-        with(defaultDensity) {
-            val text = "abcde"
-            val fontSize = 20f
+        val text = "abcde"
+        val fontSize = 20f
 
-            val letterSpacingEm = 1f
-            val letterSpacingEmStyle = SpanStyle(letterSpacing = letterSpacingEm.em)
+        val letterSpacingEm = 1f
+        val letterSpacingEmStyle = SpanStyle(letterSpacing = letterSpacingEm.em)
 
-            val letterSpacingSp = 10f
-            val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
+        val letterSpacingSp = 10f
+        val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize.sp),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingEmStyle, 0, text.length),
-                    AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length)
-                ),
-                width = Float.MAX_VALUE
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize.sp),
+            spanStyles = listOf(
+                AnnotatedString.Range(letterSpacingEmStyle, 0, text.length),
+                AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length)
+            ),
+            width = Float.MAX_VALUE
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(1)
-            // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = fontSize * text.length + "abc".length * letterSpacingSp +
-                "de".length * fontSize * letterSpacingEm
-            assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(1)
+        // Notice that in this test font, the width of character equals to fontSize.
+        val expectedWidth = fontSize * text.length + "abc".length * letterSpacingSp +
+            "de".length * fontSize * letterSpacingEm
+        assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
     }
 
     @Test
     fun testAnnotatedString_setLetterSpacing_inEm_after_inSp() {
-        with(defaultDensity) {
-            val text = "abcde"
-            val fontSize = 20f
+        val text = "abcde"
+        val fontSize = 20f
 
-            val letterSpacingEm = 1f
-            val letterSpacingEmStyle = SpanStyle(letterSpacing = letterSpacingEm.em)
+        val letterSpacingEm = 1f
+        val letterSpacingEmStyle = SpanStyle(letterSpacing = letterSpacingEm.em)
 
-            val letterSpacingSp = 10f
-            val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
+        val letterSpacingSp = 10f
+        val letterSpacingSpStyle = SpanStyle(letterSpacing = letterSpacingSp.sp)
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(fontSize = fontSize.sp),
-                spanStyles = listOf(
-                    AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length),
-                    AnnotatedString.Range(letterSpacingEmStyle, 0, text.length)
-                ),
-                width = 500f
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(fontSize = fontSize.sp),
+            spanStyles = listOf(
+                AnnotatedString.Range(letterSpacingSpStyle, 0, "abc".length),
+                AnnotatedString.Range(letterSpacingEmStyle, 0, text.length)
+            ),
+            width = 500f
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(1)
-            // Notice that in this test font, the width of character equals to fontSize.
-            val expectedWidth = fontSize * text.length * (1 + letterSpacingEm)
-            assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(1)
+        // Notice that in this test font, the width of character equals to fontSize.
+        val expectedWidth = fontSize * text.length * (1 + letterSpacingEm)
+        assertThat(paragraph.getLineWidth(0)).isEqualTo(expectedWidth)
     }
 
     @Test
@@ -3241,117 +3225,107 @@
 
     @Test
     fun textIndent_inSp_onFirstLine() {
-        with(defaultDensity) {
-            val text = "abcdef"
-            val fontSize = 20f
-            val indent = 15f
-            val paragraphWidth = "abcd".length * fontSize
+        val text = "abcdef"
+        val fontSize = 20f
+        val indent = 15f
+        val paragraphWidth = "abcd".length * fontSize
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    fontSize = fontSize.sp,
-                    textIndent = TextIndent(firstLine = indent.sp),
-                    fontFamily = fontFamilyMeasureFont
-                ),
-                width = paragraphWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                fontSize = fontSize.sp,
+                textIndent = TextIndent(firstLine = indent.sp),
+                fontFamily = fontFamilyMeasureFont
+            ),
+            width = paragraphWidth
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(2)
-            assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(2)
+        assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent)
     }
 
     @Test
     fun textIndent_inSp_onRestLine() {
-        with(defaultDensity) {
-            val text = "abcde"
-            val fontSize = 20f
-            val indent = 20f
-            val paragraphWidth = "abc".length * fontSize
+        val text = "abcde"
+        val fontSize = 20f
+        val indent = 20f
+        val paragraphWidth = "abc".length * fontSize
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    textIndent = TextIndent(restLine = indent.sp),
-                    fontSize = fontSize.sp,
-                    fontFamily = fontFamilyMeasureFont
-                ),
-                width = paragraphWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                textIndent = TextIndent(restLine = indent.sp),
+                fontSize = fontSize.sp,
+                fontFamily = fontFamilyMeasureFont
+            ),
+            width = paragraphWidth
+        )
 
-            // check the position of the first character in second line: "d" should be indented
-            assertThat(paragraph.getHorizontalPosition(3, true)).isEqualTo(indent)
-        }
+        // check the position of the first character in second line: "d" should be indented
+        assertThat(paragraph.getHorizontalPosition(3, true)).isEqualTo(indent)
     }
 
     @Test
     fun textIndent_inEm_onSingleLine() {
-        with(defaultDensity) {
-            val text = "abc"
-            val fontSize = 20f
-            val indent = 1.5f
+        val text = "abc"
+        val fontSize = 20f
+        val indent = 1.5f
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    textIndent = TextIndent(firstLine = indent.em),
-                    fontSize = fontSize.sp,
-                    fontFamily = fontFamilyMeasureFont
-                )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                textIndent = TextIndent(firstLine = indent.em),
+                fontSize = fontSize.sp,
+                fontFamily = fontFamilyMeasureFont
             )
+        )
 
-            assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
-        }
+        assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
     }
 
     @Test
     fun textIndent_inEm_onFirstLine() {
-        with(defaultDensity) {
-            val text = "abcdef"
-            val fontSize = 20f
-            val indent = 1.5f
+        val text = "abcdef"
+        val fontSize = 20f
+        val indent = 1.5f
 
-            val paragraphWidth = "abcd".length * fontSize
+        val paragraphWidth = "abcd".length * fontSize
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    textIndent = TextIndent(firstLine = indent.em),
-                    fontSize = fontSize.sp,
-                    fontFamily = fontFamilyMeasureFont
-                ),
-                width = paragraphWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                textIndent = TextIndent(firstLine = indent.em),
+                fontSize = fontSize.sp,
+                fontFamily = fontFamilyMeasureFont
+            ),
+            width = paragraphWidth
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(2)
-            assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(2)
+        assertThat(paragraph.getHorizontalPosition(0, true)).isEqualTo(indent * fontSize)
     }
 
     @Test
     fun textIndent_inEm_onRestLine() {
-        with(defaultDensity) {
-            val text = "abcdef"
-            val fontSize = 20f
-            val indent = 1.5f
+        val text = "abcdef"
+        val fontSize = 20f
+        val indent = 1.5f
 
-            val paragraphWidth = "abcd".length * fontSize
+        val paragraphWidth = "abcd".length * fontSize
 
-            val paragraph = simpleParagraph(
-                text = text,
-                style = TextStyle(
-                    textIndent = TextIndent(restLine = indent.em),
-                    fontSize = fontSize.sp,
-                    fontFamily = fontFamilyMeasureFont
-                ),
-                width = paragraphWidth
-            )
+        val paragraph = simpleParagraph(
+            text = text,
+            style = TextStyle(
+                textIndent = TextIndent(restLine = indent.em),
+                fontSize = fontSize.sp,
+                fontFamily = fontFamilyMeasureFont
+            ),
+            width = paragraphWidth
+        )
 
-            assertThat(paragraph.lineCount).isEqualTo(2)
-            // check the position of the first character in second line: "e" should be indented
-            assertThat(paragraph.getHorizontalPosition(4, true)).isEqualTo(indent * fontSize)
-        }
+        assertThat(paragraph.lineCount).isEqualTo(2)
+        // check the position of the first character in second line: "e" should be indented
+        assertThat(paragraph.getHorizontalPosition(4, true)).isEqualTo(indent * fontSize)
     }
     @Test
     fun testAnnotatedString_fontFamily_changesMeasurement() {
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
index cd5c2ab..70812b6 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntrinsicIntegrationTest.kt
@@ -99,7 +99,7 @@
                 text = text,
                 fontSize = fontSize,
                 spanStyles = listOf(
-                    Range<SpanStyle>(
+                    Range(
                         item = SpanStyle(fontSize = styledFontSize),
                         start = "a ".length,
                         end = "a bb ".length
@@ -183,7 +183,7 @@
                 text = text,
                 fontSize = fontSize,
                 spanStyles = listOf(
-                    Range<SpanStyle>(
+                    Range(
                         item = SpanStyle(fontSize = styledFontSize),
                         start = "a".length,
                         end = "a bb ".length
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
new file mode 100644
index 0000000..d97b85d
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.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.compose.ui.text.font
+import android.content.Context
+import android.os.ParcelFileDescriptor
+import androidx.compose.ui.text.ExperimentalTextApi
+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 org.junit.After
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.File
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalTextApi::class)
+class AndroidFontTest {
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val assetFontPath = "subdirectory/asset_font.ttf"
+    private val tmpFontPath = "tmp_file_font.ttf"
+
+    @Before
+    fun setup() {
+        deleteFile()
+        writeFile()
+    }
+
+    @After
+    fun cleanupAfter() {
+        deleteFile()
+    }
+
+    private fun deleteFile() {
+        val fontFile = File(context.filesDir, tmpFontPath)
+        if (fontFile.exists()) {
+            fontFile.delete()
+        }
+    }
+
+    private fun writeFile() {
+        context.assets.open(assetFontPath).use { input ->
+            val bytes = input.readBytes()
+            context.openFileOutput(tmpFontPath, Context.MODE_PRIVATE).use { output ->
+                output.write(bytes)
+            }
+        }
+    }
+
+    @Test
+    fun test_load_from_assets() {
+        val font = Font(assetManager = context.assets, path = assetFontPath) as AndroidFont
+        assertThat(font.typeface).isNotNull()
+    }
+
+    @Test
+    fun test_load_from_file() {
+        val fontFile = File(context.filesDir, tmpFontPath)
+        val font = Font(file = fontFile) as AndroidFont
+        assertThat(font.typeface).isNotNull()
+    }
+
+    @Ignore
+    @Test
+    @MediumTest
+    fun test_load_from_file_descriptor() {
+        context.openFileInput(tmpFontPath).use { inputStream ->
+            val font = Font(ParcelFileDescriptor.dup(inputStream.fd)) as AndroidFont
+            val typeface = font.typeface
+            assertThat(typeface).isNotNull()
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt
index 5ca2dc4..32d6216 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt
@@ -9,8 +9,6 @@
 import android.text.style.LocaleSpan
 import android.text.style.RelativeSizeSpan
 import android.text.style.ScaleXSpan
-import android.text.style.StrikethroughSpan
-import android.text.style.UnderlineSpan
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Color
@@ -29,6 +27,7 @@
 import androidx.compose.ui.text.android.style.LetterSpacingSpanPx
 import androidx.compose.ui.text.android.style.ShadowSpan
 import androidx.compose.ui.text.android.style.SkewXSpan
+import androidx.compose.ui.text.android.style.TextDecorationSpan
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontSynthesis
@@ -61,6 +60,7 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import kotlin.math.ceil
+import kotlin.math.roundToInt
 
 @OptIn(InternalPlatformTextApi::class)
 @RunWith(AndroidJUnit4::class)
@@ -164,7 +164,13 @@
         )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, text.length)
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = TextDecorationSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            !it.isUnderlineText && it.isStrikethroughText
+        }
     }
 
     @Test
@@ -179,7 +185,13 @@
         )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, text.length)
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = TextDecorationSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            it.isUnderlineText && !it.isStrikethroughText
+        }
     }
 
     @Test
@@ -194,7 +206,13 @@
         )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, "abc".length)
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = TextDecorationSpan::class,
+            start = 0,
+            end = "abc".length
+        ) {
+            !it.isUnderlineText && it.isStrikethroughText
+        }
     }
 
     @Test
@@ -209,7 +227,13 @@
         )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, "abc".length)
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = TextDecorationSpan::class,
+            start = 0,
+            end = "abc".length
+        ) {
+            it.isUnderlineText && !it.isStrikethroughText
+        }
     }
 
     @Test
@@ -226,8 +250,13 @@
         )
 
         assertThat(paragraph.charSequence.toString()).isEqualTo(text)
-        assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, "abc".length)
-        assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, "abc".length)
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = TextDecorationSpan::class,
+            start = 0,
+            end = "abc".length
+        ) {
+            it.isUnderlineText && it.isStrikethroughText
+        }
     }
 
     @Test
@@ -244,7 +273,9 @@
                 width = paragraphWidth
             )
 
-            assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length)
+            assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length) {
+                it.size == fontSize.toPx().roundToInt() && !it.dip
+            }
         }
     }
 
@@ -548,7 +579,7 @@
     }
 
     @Test
-    fun testAnnotatedString_setTextGeometricTransformWithNull_noSpanSet() {
+    fun testAnnotatedString_setDefaultTextGeometricTransform() {
         val text = "abcde"
         val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform())
 
@@ -558,8 +589,16 @@
             width = 100.0f // width is not important
         )
 
-        assertThat(paragraph.charSequence).spans(ScaleXSpan::class).isEmpty()
-        assertThat(paragraph.charSequence).spans(SkewXSpan::class).isEmpty()
+        assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
+            it.scaleX == 1.0f
+        }
+        assertThat(paragraph.charSequence).hasSpan(
+            spanClazz = SkewXSpan::class,
+            start = 0,
+            end = text.length
+        ) {
+            it.skewX == 0.0f
+        }
     }
 
     @Test
@@ -581,7 +620,9 @@
         assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
             it.scaleX == scaleX
         }
-        assertThat(paragraph.charSequence).spans(SkewXSpan::class).isEmpty()
+        assertThat(paragraph.charSequence).hasSpan(SkewXSpan::class, 0, text.length) {
+            it.skewX == 0.0f
+        }
     }
 
     @Test
@@ -599,7 +640,9 @@
         assertThat(paragraph.charSequence).hasSpan(SkewXSpan::class, 0, text.length) {
             it.skewX == skewX
         }
-        assertThat(paragraph.charSequence).spans(ScaleXSpan::class).isEmpty()
+        assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
+            it.scaleX == 1.0f
+        }
     }
 
     @Test
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
index a55f91c..8c21480 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTextPaintTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.text.platform
 
+import android.graphics.Paint
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shadow
@@ -31,17 +32,25 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 class AndroidTextPaintTest {
+    @Test
+    fun constructor() {
+        val density = 15.0f
+        val textPaint = AndroidTextPaint(Paint.ANTI_ALIAS_FLAG, density)
+
+        assertThat(textPaint.density).isEqualTo(15.0f)
+        assertThat(textPaint.flags and Paint.ANTI_ALIAS_FLAG).isNotEqualTo(0)
+    }
 
     @Test
     fun textDecoration_defaultValues() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         assertThat(textPaint.isUnderlineText).isFalse()
         assertThat(textPaint.isStrikeThruText).isFalse()
     }
 
     @Test
     fun setTextDecoration_withNone() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(TextDecoration.None)
         assertThat(textPaint.isUnderlineText).isFalse()
         assertThat(textPaint.isStrikeThruText).isFalse()
@@ -49,7 +58,7 @@
 
     @Test
     fun setTextDecoration_withNull() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(null)
         assertThat(textPaint.isUnderlineText).isFalse()
         assertThat(textPaint.isStrikeThruText).isFalse()
@@ -57,7 +66,7 @@
 
     @Test
     fun setTextDecoration_withUnderline() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(TextDecoration.Underline)
         assertThat(textPaint.isUnderlineText).isTrue()
         assertThat(textPaint.isStrikeThruText).isFalse()
@@ -65,7 +74,7 @@
 
     @Test
     fun setTextDecoration_withLineThrough() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(TextDecoration.LineThrough)
         assertThat(textPaint.isUnderlineText).isFalse()
         assertThat(textPaint.isStrikeThruText).isTrue()
@@ -73,7 +82,7 @@
 
     @Test
     fun setTextDecoration_withLineThroughAndUnderline() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(
             TextDecoration.combine(
                 listOf(TextDecoration.LineThrough, TextDecoration.Underline)
@@ -85,7 +94,7 @@
 
     @Test
     fun setTextDecoration_changeDecorationToNull() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setTextDecoration(
             TextDecoration.combine(
                 listOf(TextDecoration.LineThrough, TextDecoration.Underline)
@@ -102,7 +111,7 @@
     @Test
     fun setColor_to_valid_value() {
         val color = Color.Red
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setColor(color)
 
         assertThat(textPaint.color).isEqualTo(color.toArgb())
@@ -110,7 +119,7 @@
 
     @Test
     fun setColor_to_unspecified() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setColor(Color.Unspecified)
         assertThat(textPaint.color).isNotEqualTo(Color.Unspecified.toArgb())
 
@@ -123,7 +132,7 @@
 
     @Test
     fun setColor_to_transparent() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
         textPaint.setColor(Color.Transparent)
         assertThat(textPaint.color).isEqualTo(Color.Transparent.toArgb())
 
@@ -137,7 +146,7 @@
     @SdkSuppress(minSdkVersion = 29)
     @Test
     fun shadow_default_values() {
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
 
         // default color is 0 since we do not update it
         assertThat(textPaint.shadowLayerDx).isEqualTo(0f)
@@ -153,7 +162,7 @@
         val dy = 2f
         val radius = 3f
         val color = Color.Red
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
 
         textPaint.setShadow(Shadow(color, Offset(dx, dy), radius))
 
@@ -170,7 +179,7 @@
         val dy = 2f
         val radius = 3f
         val color = Color.Red
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
 
         textPaint.setShadow(Shadow(color, Offset(dx, dy), radius))
         textPaint.setShadow(Shadow.None)
@@ -188,7 +197,7 @@
         val dy = 2f
         val radius = 3f
         val color = Color.Red
-        val textPaint = AndroidTextPaint(0)
+        val textPaint = defaultTextPaint
 
         textPaint.setShadow(Shadow(color, Offset(dx, dy), radius))
         textPaint.setShadow(null)
@@ -198,4 +207,6 @@
         assertThat(textPaint.shadowLayerRadius).isEqualTo(0f)
         assertThat(textPaint.shadowLayerColor).isEqualTo(0)
     }
+
+    private val defaultTextPaint get() = AndroidTextPaint(flags = 0, density = 1.0f)
 }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
index 32bb327..a406e4c 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceCacheTest.kt
@@ -28,7 +28,7 @@
 @SmallTest
 class AndroidTypefaceCacheTest {
 
-    val context = InstrumentationRegistry.getInstrumentation().targetContext
+    val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
     @Test
     fun cached_instance_for_the_same_input() {
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
index d8251c0a..9785af2 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceSubsetTest.kt
@@ -34,7 +34,7 @@
 @SmallTest
 class AndroidTypefaceSubsetTest {
 
-    val context = InstrumentationRegistry.getInstrumentation().targetContext
+    val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
     val fontFamily = FontFamily(
         FontTestData.FONT_100_REGULAR,
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
index 92b7a86..70c14a0 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidTypefaceTest.kt
@@ -29,7 +29,6 @@
 import androidx.compose.ui.text.font.Typeface
 import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.matchers.assertThat
-import androidx.compose.ui.text.test.R
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
@@ -49,7 +48,7 @@
 @SmallTest
 class AndroidTypefaceTest {
 
-    val context = InstrumentationRegistry.getInstrumentation().targetContext
+    val context = InstrumentationRegistry.getInstrumentation().targetContext!!
 
     private fun androidTypefaceFromFontFamily(
         context: Context,
@@ -429,7 +428,7 @@
 
     @Test(expected = IllegalStateException::class)
     fun throwsExceptionIfFontIsNotReadable() {
-        val fontFamily = FontFamily(Font(R.font.invalid_font))
+        val fontFamily = FontFamily(FontTestData.FONT_INVALID)
         androidTypefaceFromFontFamily(context, fontFamily)
     }
 
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
index 6505b1e..4058bcb 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/SpannableExtensionsTest.kt
@@ -16,14 +16,18 @@
 
 package androidx.compose.ui.text.platform
 
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.platform.extensions.flattenStylesAndApply
+import androidx.compose.ui.text.platform.extensions.flattenFontStylesAndApply
+import androidx.compose.ui.unit.sp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.eq
 import com.nhaarman.mockitokotlin2.inOrder
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.never
@@ -40,7 +44,11 @@
     fun flattenStylesAndApply_emptyList() {
         val spanStyles = listOf<AnnotatedString.Range<SpanStyle>>()
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
 
         verify(block, never()).invoke(any(), anyInt(), anyInt())
     }
@@ -54,8 +62,11 @@
             AnnotatedString.Range(spanStyle, start, end)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         verify(block, times(1)).invoke(spanStyle, start, end)
     }
 
@@ -69,8 +80,11 @@
             AnnotatedString.Range(spanStyle2, 4, 6)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1, 3, 4)
             verify(block).invoke(spanStyle1.merge(spanStyle2), 4, 6)
@@ -89,8 +103,11 @@
             AnnotatedString.Range(spanStyle2, 3, 6)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1.merge(spanStyle2), 3, 6)
             verify(block).invoke(spanStyle1, 6, 10)
@@ -108,8 +125,11 @@
             AnnotatedString.Range(spanStyle2, 5, 10)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1, 3, 5)
             verify(block).invoke(spanStyle1.merge(spanStyle2), 5, 10)
@@ -127,8 +147,11 @@
             AnnotatedString.Range(spanStyle2, 3, 10)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1.merge(spanStyle2), 3, 10)
             verifyNoMoreInteractions()
@@ -145,8 +168,11 @@
             AnnotatedString.Range(spanStyle2, 6, 19)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1, 3, 6)
             verify(block).invoke(spanStyle1.merge(spanStyle2), 6, 10)
@@ -165,8 +191,11 @@
             AnnotatedString.Range(spanStyle2, 8, 10)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1, 3, 4)
             verify(block).invoke(spanStyle2, 8, 10)
@@ -184,8 +213,11 @@
             AnnotatedString.Range(spanStyle2, 5, 9)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle1, 3, 5)
             // spanStyle2 will overwrite spanStyle1 in [5, 9).
@@ -205,8 +237,11 @@
             AnnotatedString.Range(spanStyle2, 3, 10)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             // Ideally we can only have 1 spanStyle, but it will overcomplicate the code.
             verify(block).invoke(spanStyle2, 3, 5)
@@ -229,8 +264,11 @@
             AnnotatedString.Range(spanStyle1, 1, 2)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         // Despite that spanStyle3 is applied first, the spanStyles are applied in the index order.
         inOrder(block) {
             verify(block).invoke(spanStyle1, 1, 2)
@@ -250,8 +288,11 @@
             AnnotatedString.Range(spanStyle2, 3, 6)
         )
         val block = mock<(SpanStyle, Int, Int) -> Unit>()
-        flattenStylesAndApply(spanStyles, block)
-
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = null,
+            spanStyles = spanStyles,
+            block = block
+        )
         inOrder(block) {
             verify(block).invoke(spanStyle2, 3, 5)
             // SpanStyles are applied in index order, but since spanStyle2 is applied later, it
@@ -261,4 +302,122 @@
             verifyNoMoreInteractions()
         }
     }
+
+    @Test
+    fun flattenStylesAndApply_withContextSpanStyle_inheritContext() {
+        val color = Color.Red
+        val fontStyle = FontStyle.Italic
+        val fontWeight = FontWeight(200)
+        val contextSpanStyle = SpanStyle(color = color, fontStyle = fontStyle)
+        val spanStyle = SpanStyle(fontWeight = fontWeight)
+
+        val spanStyles = listOf(
+            AnnotatedString.Range(spanStyle, 3, 6)
+        )
+        val block = mock<(SpanStyle, Int, Int) -> Unit>()
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = contextSpanStyle,
+            spanStyles = spanStyles,
+            block = block
+        )
+        inOrder(block) {
+            verify(block).invoke(
+                argThat {
+                    this == SpanStyle(
+                        color = color,
+                        fontStyle = fontStyle,
+                        fontWeight = fontWeight
+                    )
+                },
+                eq(3),
+                eq(6)
+            )
+            verifyNoMoreInteractions()
+        }
+    }
+
+    @Test
+    fun flattenStylesAndApply_withContextSpanStyle_multipleSpanStyles_inheritContext() {
+        val contextColor = Color.Red
+        val contextFontWeight = FontWeight.Light
+        val contextFontStyle = FontStyle.Normal
+        val contextFontSize = 18.sp
+
+        val fontWeight = FontWeight.Bold
+        val fontStyle = FontStyle.Italic
+        val fontSize = 24.sp
+        val contextSpanStyle = SpanStyle(
+            color = contextColor,
+            fontWeight = contextFontWeight,
+            fontStyle = contextFontStyle,
+            fontSize = contextFontSize
+        )
+        val spanStyle1 = SpanStyle(fontWeight = fontWeight)
+        val spanStyle2 = SpanStyle(fontStyle = fontStyle)
+        val spanStyle3 = SpanStyle(fontSize = fontSize)
+
+        // There will be 5 ranges:
+        //   [2, 4)   contextColor, fontWeight,        contextFontStyle, contextFontSize
+        //   [4, 6)   contextColor, fontWeight,        fontStyle,        contextFontSize
+        //   [6, 8)   contextColor, fontWeight,        fontStyle,        fontSize
+        //   [8, 10)  contextColor, contextFontWeight, fontStyle,        fontSize
+        //   [10, 12) contextColor, contextFontWeight, contextFontStyle, fontSize
+        val spanStyles = listOf(
+            AnnotatedString.Range(spanStyle1, 2, 8),
+            AnnotatedString.Range(spanStyle2, 4, 10),
+            AnnotatedString.Range(spanStyle3, 6, 12),
+        )
+        val block = mock<(SpanStyle, Int, Int) -> Unit>()
+        flattenFontStylesAndApply(
+            contextFontSpanStyle = contextSpanStyle,
+            spanStyles = spanStyles,
+            block = block
+        )
+
+        inOrder(block) {
+            verify(block).invoke(
+                argThat {
+                    this == contextSpanStyle.copy(fontWeight = fontWeight)
+                },
+                eq(2),
+                eq(4)
+            )
+            verify(block).invoke(
+                argThat {
+                    this == contextSpanStyle.copy(fontWeight = fontWeight, fontStyle = fontStyle)
+                },
+                eq(4),
+                eq(6)
+            )
+            verify(block).invoke(
+                argThat {
+                    this == contextSpanStyle.copy(
+                        fontWeight = fontWeight,
+                        fontStyle = fontStyle,
+                        fontSize = fontSize
+                    )
+                },
+                eq(6),
+                eq(8)
+            )
+            verify(block).invoke(
+                argThat {
+                    this == contextSpanStyle.copy(
+                        fontStyle = fontStyle,
+                        fontSize = fontSize
+                    )
+                },
+                eq(8),
+                eq(10)
+            )
+            verify(block).invoke(
+                argThat {
+                    this == contextSpanStyle.copy(fontSize = fontSize)
+                },
+                eq(10),
+                eq(12)
+            )
+            verifyNoMoreInteractions()
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterFileTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterFileTest.kt
new file mode 100644
index 0000000..cf48058
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterFileTest.kt
@@ -0,0 +1,115 @@
+/*
+ * 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.compose.ui.text.platform
+
+import android.content.Context
+import android.os.ParcelFileDescriptor
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.toFontFamily
+import androidx.compose.ui.text.matchers.assertThat
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.nhaarman.mockitokotlin2.mock
+import org.junit.After
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.File
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+@OptIn(ExperimentalTextApi::class)
+class TypefaceAdapterFileTest {
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val assetFontPath = "subdirectory/asset_font.ttf"
+    private val tmpFontPath = "tmp_file_font.ttf"
+    private fun TypefaceAdapter() = TypefaceAdapter(resourceLoader = mock())
+
+    @Before
+    fun setup() {
+        deleteFile()
+        writeFile()
+    }
+
+    @After
+    fun cleanupAfter() {
+        deleteFile()
+    }
+
+    private fun deleteFile() {
+        val fontFile = File(context.filesDir, tmpFontPath)
+        if (fontFile.exists()) {
+            fontFile.delete()
+        }
+    }
+
+    private fun writeFile() {
+        context.assets.open(assetFontPath).use { input ->
+            val bytes = input.readBytes()
+            context.openFileOutput(tmpFontPath, Context.MODE_PRIVATE).use { output ->
+                output.write(bytes)
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    fun customSingleFont_fromAssetManager() {
+        val defaultTypeface = TypefaceAdapter().create()
+
+        val fontFamily = Font(context.assets, assetFontPath).toFontFamily()
+
+        val typeface = TypefaceAdapter().create(fontFamily = fontFamily)
+
+        assertThat(typeface).isNotNull()
+        // asset font have ~ defined as the only character supported.
+        assertThat(typeface.bitmap("~")).isNotEqualToBitmap(defaultTypeface.bitmap("~"))
+    }
+
+    @Ignore
+    @Test
+    @MediumTest
+    fun customSingleFont_fromFile() {
+        val defaultTypeface = TypefaceAdapter().create()
+
+        val fontFile = File(context.filesDir, tmpFontPath)
+        val fontFamily = Font(fontFile).toFontFamily()
+
+        val typeface = TypefaceAdapter().create(fontFamily = fontFamily)
+
+        assertThat(typeface).isNotNull()
+        // asset font have ~ defined as the only character supported.
+        assertThat(typeface.bitmap("~")).isNotEqualToBitmap(defaultTypeface.bitmap("~"))
+    }
+
+    @Test
+    @MediumTest
+    fun customSingleFont_fromFileDescriptor() {
+        val defaultTypeface = TypefaceAdapter().create()
+
+        context.openFileInput(tmpFontPath).use { inputStream ->
+            val fontFamily = Font(ParcelFileDescriptor.dup(inputStream.fd)).toFontFamily()
+            val typeface = TypefaceAdapter().create(fontFamily = fontFamily)
+
+            assertThat(typeface).isNotNull()
+            // asset font have ~ defined as the only character supported.
+            assertThat(typeface.bitmap("~")).isNotEqualToBitmap(defaultTypeface.bitmap("~"))
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterTest.kt
index 30d613b..cd05467 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TypefaceAdapterTest.kt
@@ -35,6 +35,7 @@
 import androidx.compose.ui.text.FontTestData.Companion.FONT_800_REGULAR
 import androidx.compose.ui.text.FontTestData.Companion.FONT_900_ITALIC
 import androidx.compose.ui.text.FontTestData.Companion.FONT_900_REGULAR
+import androidx.compose.ui.text.FontTestData.Companion.FONT_INVALID
 import androidx.compose.ui.text.TestFontResourceLoader
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -45,7 +46,6 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.matchers.assertThat
-import androidx.compose.ui.text.test.R
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
@@ -403,7 +403,7 @@
 
     @Test(expected = IllegalStateException::class)
     fun throwsExceptionIfFontIsNotReadable() {
-        val fontFamily = FontFamily(Font(R.font.invalid_font))
+        val fontFamily = FontFamily(FONT_INVALID)
         TypefaceAdapter().create(fontFamily)
     }
 
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
new file mode 100644
index 0000000..fd95b04
--- /dev/null
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
@@ -0,0 +1,137 @@
+/*
+ * 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.font
+
+import android.content.res.AssetManager
+import android.graphics.Typeface
+import android.os.Build
+import android.os.ParcelFileDescriptor
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.android.InternalPlatformTextApi
+import java.io.File
+
+/**
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is
+ * read during construction.
+ *
+ * @param assetManager Android AssetManager
+ * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
+ * assets/dir/myfont.ttf).
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ */
+@ExperimentalTextApi
+@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
+@Stable
+fun Font(
+    assetManager: AssetManager,
+    path: String,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal
+): Font = AndroidAssetFont(assetManager, path, weight, style)
+
+/**
+ * Create a Font declaration from a file. The content of the [File] is read during construction.
+ *
+ * @param file the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ */
+@ExperimentalTextApi
+@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
+@Stable
+fun Font(
+    file: File,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal
+): Font = AndroidFileFont(file, weight, style)
+
+/**
+ * Create a Font declaration from a [ParcelFileDescriptor]. The content of the
+ * [ParcelFileDescriptor] is read during construction.
+ *
+ * @param fileDescriptor the file descriptor for the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ */
+@RequiresApi(26)
+@ExperimentalTextApi
+@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
+@Stable
+fun Font(
+    fileDescriptor: ParcelFileDescriptor,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal
+): Font = AndroidFileDescriptorFont(fileDescriptor, weight, style)
+
+internal interface AndroidFont : Font {
+    val typeface: Typeface
+}
+
+internal class AndroidAssetFont constructor(
+    val assetManager: AssetManager,
+    val path: String,
+    override val weight: FontWeight = FontWeight.Normal,
+    override val style: FontStyle = FontStyle.Normal
+) : AndroidFont {
+    private val typefaceInternal = Typeface.createFromAsset(assetManager, path)
+
+    override val typeface: Typeface get() = typefaceInternal
+}
+
+internal class AndroidFileFont constructor(
+    val file: File,
+    override val weight: FontWeight = FontWeight.Normal,
+    override val style: FontStyle = FontStyle.Normal
+) : AndroidFont {
+    private val typefaceInternal = Typeface.createFromFile(file)
+
+    override val typeface: Typeface get() = typefaceInternal
+}
+
+@RequiresApi(26)
+internal class AndroidFileDescriptorFont constructor(
+    val fileDescriptor: ParcelFileDescriptor,
+    override val weight: FontWeight = FontWeight.Normal,
+    override val style: FontStyle = FontStyle.Normal
+) : AndroidFont {
+    private val typefaceInternal = if (Build.VERSION.SDK_INT >= 26) {
+        AndroidFileDescriptorHelper.create(fileDescriptor)
+    } else {
+        throw IllegalArgumentException("Cannot create font from file descriptor for SDK < 26")
+    }
+
+    override val typeface: Typeface get() = typefaceInternal
+}
+
+@RequiresApi(26)
+private object AndroidFileDescriptorHelper {
+    @RequiresApi(26)
+    @DoNotInline
+    fun create(fileDescriptor: ParcelFileDescriptor): Typeface {
+        return Typeface.Builder(fileDescriptor.fileDescriptor).build()
+    }
+}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
index 71bbdd9..865a86d 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidTypeface.android.kt
@@ -37,6 +37,7 @@
  *                        all fonts in fontFamily.
  * @return [androidx.compose.ui.text.font.Typeface] instance
  */
+// TODO what is the goal of styles here? it is being used in only a single place
 fun Typeface(
     context: Context,
     fontFamily: FontFamily,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
index fb3c45d5..8bc21b2 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidAccessibilitySpannableString.android.kt
@@ -21,8 +21,10 @@
 import android.text.SpannableString
 import android.text.Spanned
 import android.text.style.ScaleXSpan
+import android.text.style.StrikethroughSpan
 import android.text.style.StyleSpan
 import android.text.style.TypefaceSpan
+import android.text.style.UnderlineSpan
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
@@ -39,8 +41,8 @@
 import androidx.compose.ui.text.platform.extensions.setColor
 import androidx.compose.ui.text.platform.extensions.setFontSize
 import androidx.compose.ui.text.platform.extensions.setLocaleList
-import androidx.compose.ui.text.platform.extensions.setTextDecoration
 import androidx.compose.ui.text.platform.extensions.toSpan
+import androidx.compose.ui.text.style.TextDecoration
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.util.fastForEach
 
@@ -126,12 +128,29 @@
         }
     }
 
-    setTextDecoration(spanStyle.textDecoration, start, end)
+    if (spanStyle.textDecoration != null) {
+        // This doesn't match how we rendering the styles. When TextDecoration.None is set, it
+        // should remove the underline and lineThrough effect on the given range. Here we didn't
+        // remove any previously applied spans yet.
+        if (TextDecoration.Underline in spanStyle.textDecoration) {
+            setSpan(
+                UnderlineSpan(),
+                start,
+                end,
+                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+            )
+        }
+        if (TextDecoration.LineThrough in spanStyle.textDecoration) {
+            setSpan(
+                StrikethroughSpan(),
+                start,
+                end,
+                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+            )
+        }
+    }
 
-    if (
-        spanStyle.textGeometricTransform != null &&
-        spanStyle.textGeometricTransform.scaleX != 1f
-    ) {
+    if (spanStyle.textGeometricTransform != null) {
         setSpan(
             ScaleXSpan(spanStyle.textGeometricTransform.scaleX),
             start,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
index 733d5d2..987f098 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
@@ -18,8 +18,17 @@
 
 import android.content.Context
 import android.graphics.Typeface
+import android.os.Build
 import android.util.TypedValue
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
 import androidx.collection.LruCache
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.android.InternalPlatformTextApi
+import androidx.compose.ui.text.font.AndroidAssetFont
+import androidx.compose.ui.text.font.AndroidFileDescriptorFont
+import androidx.compose.ui.text.font.AndroidFileFont
+import androidx.compose.ui.text.font.AndroidFont
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontListFontFamily
@@ -88,30 +97,69 @@
  * Global Android NativeTypeface cache.
  */
 internal object AndroidTypefaceCache {
+
+    // TODO multiple TypefaceCache's, would be good to unify
+    private val cache = LruCache<String, Typeface>(16)
+
     /**
      * Returns NativeTypeface for [font] if it is in cache. Otherwise create new NativeTypeface and
      * put it into internal cache.
      */
-    fun getOrCreate(context: Context, font: Font): Typeface = when (font) {
-        is ResourceFont -> getOrCreateByResourceId(context, font.resId)
-        else -> throw IllegalArgumentException("Unknown font type: $font")
-    }
+    @OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
+    fun getOrCreate(context: Context, font: Font): Typeface {
+        val key = getKey(context, font)
 
-    private val cache = LruCache<String, Typeface>(16)
+        key?.let {
+            cache.get(key)?.let { return it }
+        }
 
-    private fun getOrCreateByResourceId(context: Context, resId: Int): Typeface {
-        val value = TypedValue()
-        context.resources.getValue(resId, value, true)
-        // We use the file path as a key of the request cache.
-        val key = value.string?.toString() ?: return createTypeface(context, resId)
+        val typeface = when (font) {
+            is ResourceFont ->
+                if (Build.VERSION.SDK_INT >= 26) {
+                    AndroidResourceFontLoaderHelper.create(context, font.resId)
+                } else {
+                    ResourcesCompat.getFont(context, font.resId)!!
+                }
+            is AndroidFont -> font.typeface
+            else -> throw IllegalArgumentException("Unknown font type: $font")
+        }
 
-        cache.get(key)?.let { return it }
-        val typeface = createTypeface(context, resId)
-        cache.put(key, typeface) // eventually consistent
+        key?.let { cache.put(key, typeface) }
+
         return typeface
     }
 
-    private fun createTypeface(context: Context, resId: Int): Typeface =
-        ResourcesCompat.getFont(context, resId)
-            ?: throw IllegalArgumentException("Unable to load Font $resId")
-}
\ No newline at end of file
+    /**
+     * Utility method to generate a key for caching purposes.
+     */
+    fun getKey(context: Context, font: Font): String? {
+        return when (font) {
+            is ResourceFont -> {
+                val value = TypedValue()
+                context.resources.getValue(font.resId, value, true)
+                "res:${value.string?.toString()!!}"
+            }
+            is AndroidAssetFont -> {
+                "asset:${font.path}"
+            }
+            // do not cache File based Fonts, since the user might change the font
+            is AndroidFileFont -> null
+            is AndroidFileDescriptorFont -> null
+            else -> throw IllegalArgumentException("Unknown font type: $font")
+        }
+    }
+}
+
+/**
+ * This class is 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(26)
+private object AndroidResourceFontLoaderHelper {
+    @RequiresApi(26)
+    @DoNotInline
+    fun create(context: Context, resourceId: Int): Typeface {
+        return context.resources.getFont(resourceId)
+    }
+}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
index e3a1377..6758166 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidGenericFontFamilyTypeface.android.kt
@@ -44,6 +44,7 @@
     // Platform never return null with Typeface.create
     private val nativeTypeface = Typeface.create(fontFamily.name, Typeface.NORMAL)!!
 
+    // TODO multiple TypefaceCache's, would be good to unify
     // Cached styled Typeface.
     private val lock = Any()
     @GuardedBy("lock") private val styledCache = SparseArrayCompat<Typeface>(4)
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
index 2d64078..a86fbf0 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt
@@ -20,6 +20,7 @@
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Placeholder
 import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.platform.extensions.setLineHeight
 import androidx.compose.ui.text.platform.extensions.setPlaceholders
@@ -27,15 +28,13 @@
 import androidx.compose.ui.text.platform.extensions.setTextIndent
 import androidx.compose.ui.text.style.TextIndent
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.isUnspecified
 
 @OptIn(InternalPlatformTextApi::class)
 internal fun createCharSequence(
     text: String,
     contextFontSize: Float,
-    lineHeight: TextUnit,
-    textIndent: TextIndent?,
+    contextTextStyle: TextStyle,
     spanStyles: List<AnnotatedString.Range<SpanStyle>>,
     placeholders: List<AnnotatedString.Range<Placeholder>>,
     density: Density,
@@ -43,19 +42,19 @@
 ): CharSequence {
     if (spanStyles.isEmpty() &&
         placeholders.isEmpty() &&
-        textIndent == TextIndent.None &&
-        lineHeight.isUnspecified
+        contextTextStyle.textIndent == TextIndent.None &&
+        contextTextStyle.lineHeight.isUnspecified
     ) {
         return text
     }
 
     val spannableString = SpannableString(text)
 
-    spannableString.setLineHeight(lineHeight, contextFontSize, density)
+    spannableString.setLineHeight(contextTextStyle.lineHeight, contextFontSize, density)
 
-    spannableString.setTextIndent(textIndent, contextFontSize, density)
+    spannableString.setTextIndent(contextTextStyle.textIndent, contextFontSize, density)
 
-    spannableString.setSpanStyles(spanStyles, density, typefaceAdapter)
+    spannableString.setSpanStyles(contextTextStyle, spanStyles, density, typefaceAdapter)
 
     spannableString.setPlaceholders(placeholders, density)
 
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
index 171edc6..7503415 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
@@ -45,7 +45,7 @@
     val density: Density
 ) : ParagraphIntrinsics {
 
-    internal val textPaint = AndroidTextPaint(Paint.ANTI_ALIAS_FLAG)
+    internal val textPaint = AndroidTextPaint(Paint.ANTI_ALIAS_FLAG, density.density)
 
     internal val charSequence: CharSequence
 
@@ -64,21 +64,20 @@
 
     init {
         val notAppliedStyle = textPaint.applySpanStyle(
-            style.toSpanStyle(),
-            typefaceAdapter,
-            density
+            style = style.toSpanStyle(),
+            typefaceAdapter = typefaceAdapter,
+            density = density
         )
 
         charSequence = createCharSequence(
             text = text,
             contextFontSize = textPaint.textSize,
-            lineHeight = style.lineHeight,
-            textIndent = style.textIndent,
+            contextTextStyle = style,
             spanStyles = listOf(
                 AnnotatedString.Range(
-                    notAppliedStyle,
-                    0,
-                    text.length
+                    item = notAppliedStyle,
+                    start = 0,
+                    end = text.length
                 )
             ) + spanStyles,
             placeholders = placeholders,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
index 7732ab3..41df48c 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidTextPaint.android.kt
@@ -23,7 +23,10 @@
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.text.style.TextDecoration
 
-internal class AndroidTextPaint(flags: Int) : TextPaint(flags) {
+internal class AndroidTextPaint(flags: Int, density: Float) : TextPaint(flags) {
+    init {
+        this.density = density
+    }
     private var textDecoration: TextDecoration = TextDecoration.None
     private var shadow: Shadow = Shadow.None
 
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/TypefaceAdapter.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/TypefaceAdapter.android.kt
index f453133..188825d 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/TypefaceAdapter.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/TypefaceAdapter.android.kt
@@ -21,6 +21,7 @@
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.collection.LruCache
+import androidx.compose.ui.text.font.AndroidFont
 import androidx.compose.ui.text.font.DefaultFontFamily
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
@@ -31,6 +32,7 @@
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.font.GenericFontFamily
 import androidx.compose.ui.text.font.LoadedFontFamily
+import androidx.compose.ui.text.font.ResourceFont
 
 /**
  * Creates a Typeface based on generic font family or a custom [FontFamily].
@@ -56,6 +58,7 @@
         // FontFamily.cpp#computeFakery function in minikin
         private val ANDROID_BOLD = FontWeight.W600
 
+        // TODO multiple TypefaceCache's, would be good to unify
         // 16 is a random number and is not based on any strong logic
         val typefaceCache = LruCache<CacheKey, Typeface>(16)
 
@@ -239,7 +242,11 @@
         val font = fontMatcher.matchFont(fontFamily, fontWeight, fontStyle)
 
         val typeface = try {
-            resourceLoader.load(font) as Typeface
+            when (font) {
+                is ResourceFont -> resourceLoader.load(font) as Typeface
+                is AndroidFont -> font.typeface
+                else -> throw IllegalStateException("Unknown font type: $font")
+            }
         } catch (e: Exception) {
             throw IllegalStateException("Cannot create Typeface from $font")
         }
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
index 123023f..f109647 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
@@ -16,7 +16,6 @@
 
 package androidx.compose.ui.text.platform.extensions
 
-import android.graphics.Typeface
 import android.os.Build
 import android.text.Spannable
 import android.text.Spanned
@@ -28,14 +27,13 @@
 import android.text.style.MetricAffectingSpan
 import android.text.style.RelativeSizeSpan
 import android.text.style.ScaleXSpan
-import android.text.style.StrikethroughSpan
-import android.text.style.UnderlineSpan
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.isSpecified
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.android.style.BaselineShiftSpan
 import androidx.compose.ui.text.android.style.FontFeatureSpan
@@ -44,9 +42,9 @@
 import androidx.compose.ui.text.android.style.LineHeightSpan
 import androidx.compose.ui.text.android.style.ShadowSpan
 import androidx.compose.ui.text.android.style.SkewXSpan
+import androidx.compose.ui.text.android.style.TextDecorationSpan
 import androidx.compose.ui.text.android.style.TypefaceSpan
 import androidx.compose.ui.text.fastFilter
-import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontSynthesis
 import androidx.compose.ui.text.font.FontWeight
@@ -138,12 +136,13 @@
 }
 
 internal fun Spannable.setSpanStyles(
+    contextTextStyle: TextStyle,
     spanStyles: List<AnnotatedString.Range<SpanStyle>>,
     density: Density,
     typefaceAdapter: TypefaceAdapter
 ) {
 
-    setFontAttributes(spanStyles, typefaceAdapter)
+    setFontAttributes(contextTextStyle, spanStyles, typefaceAdapter)
 
     // LetterSpacingSpanPx/LetterSpacingSpanSP has lower priority than normal spans. Because
     // letterSpacing relies on the fontSize on [Paint] to compute Px/Sp from Em. So it must be
@@ -205,15 +204,57 @@
     }
 }
 
+/**
+ * Set font related [SpanStyle]s to this [Spannable].
+ *
+ * Different from other styles, font related styles needs to be flattened first and then applied.
+ * This is required because on certain API levels the [FontWeight] is not supported by framework,
+ * and we have to resolve font settings and create typeface first and then set it directly on
+ * TextPaint.
+ *
+ * Notice that a [contextTextStyle] is also required when we flatten the font related styles.
+ * For example:
+ *  the entire text has the TextStyle(fontFamily = Sans-serif)
+ *  Hi Hello World
+ *  [ bold ]
+ * FontWeight.Bold is set in range [0, 8).
+ * The resolved TypefaceSpan should be TypefaceSpan("Sans-serif", "bold") in range [0, 8).
+ * As demonstrated above, the fontFamily information is from [contextTextStyle].
+ *
+ * @see flattenFontStylesAndApply
+ *
+ * @param contextTextStyle the global [TextStyle] for the entire string.
+ * @param spanStyles the [spanStyles] to be applied, this function will first filter out the font
+ * related [SpanStyle]s and then apply them to this [Spannable].
+ * @param typefaceAdapter the [TypefaceAdapter] used to resolve font.
+ */
 @OptIn(InternalPlatformTextApi::class)
 private fun Spannable.setFontAttributes(
+    contextTextStyle: TextStyle,
     spanStyles: List<AnnotatedString.Range<SpanStyle>>,
     typefaceAdapter: TypefaceAdapter
 ) {
     val fontRelatedSpanStyles = spanStyles.fastFilter {
         it.item.hasFontAttributes() || it.item.fontSynthesis != null
     }
-    flattenStylesAndApply(fontRelatedSpanStyles) { spanStyle, start, end ->
+
+    // Create a SpanStyle if contextTextStyle has font related attributes, otherwise use
+    // null to avoid unnecessary object creation.
+    val contextFontSpanStyle = if (contextTextStyle.hasFontAttributes()) {
+        SpanStyle(
+            fontFamily = contextTextStyle.fontFamily,
+            fontWeight = contextTextStyle.fontWeight,
+            fontStyle = contextTextStyle.fontStyle,
+            fontSynthesis = contextTextStyle.fontSynthesis
+        )
+    } else {
+        null
+    }
+
+    flattenFontStylesAndApply(
+        contextFontSpanStyle,
+        fontRelatedSpanStyles
+    ) { spanStyle, start, end ->
         setSpan(
             TypefaceSpan(
                 typefaceAdapter.create(
@@ -234,16 +275,24 @@
  * Flatten styles in the [spanStyles], so that overlapping styles are merged, and then apply the
  * [block] on the merged [SpanStyle].
  *
+ * @param contextFontSpanStyle the global [SpanStyle]. It act as if every [spanStyles] is applied
+ * on top of it. This parameter is nullable. A null value is exactly the same as a default
+ * SpanStyle, but avoids unnecessary object creation.
  * @param spanStyles the input [SpanStyle] ranges to be flattened.
  * @param block the function to be applied on the merged [SpanStyle].
  */
-internal fun flattenStylesAndApply(
+internal fun flattenFontStylesAndApply(
+    contextFontSpanStyle: SpanStyle?,
     spanStyles: List<AnnotatedString.Range<SpanStyle>>,
     block: (SpanStyle, Int, Int) -> Unit
 ) {
     if (spanStyles.size <= 1) {
         if (spanStyles.isNotEmpty()) {
-            block(spanStyles[0].item, spanStyles[0].start, spanStyles[0].end)
+            block(
+                contextFontSpanStyle.merge(spanStyles[0].item),
+                spanStyles[0].start,
+                spanStyles[0].end
+            )
         }
         return
     }
@@ -264,15 +313,12 @@
         }
 
         // Check all spans that intersects with this transition range.
-        var mergedSpanStyle: SpanStyle? = null
+        var mergedSpanStyle = contextFontSpanStyle
         spanStyles.fastForEach { spanStyle ->
             if (
                 intersect(lastTransitionOffsets, transitionOffset, spanStyle.start, spanStyle.end)
             ) {
-                if (mergedSpanStyle == null) {
-                    mergedSpanStyle = SpanStyle()
-                }
-                mergedSpanStyle = mergedSpanStyle!!.merge(spanStyle.item)
+                mergedSpanStyle = mergedSpanStyle.merge(spanStyle.item)
             }
         }
 
@@ -346,12 +392,8 @@
     end: Int
 ) {
     textGeometricTransform?.let {
-        if (it.scaleX != 1.0f) {
-            setSpan(ScaleXSpan(it.scaleX), start, end)
-        }
-        if (it.skewX != 0f) {
-            setSpan(SkewXSpan(it.skewX), start, end)
-        }
+        setSpan(ScaleXSpan(it.scaleX), start, end)
+        setSpan(SkewXSpan(it.skewX), start, end)
     }
 }
 
@@ -367,7 +409,7 @@
     when (fontSize.type) {
         TextUnitType.Sp -> with(density) {
             setSpan(
-                AbsoluteSizeSpan(fontSize.toPx().roundToInt(), true),
+                AbsoluteSizeSpan(/* size */ fontSize.toPx().roundToInt(), /* dip */ false),
                 start,
                 end
             )
@@ -380,14 +422,14 @@
     }
 }
 
+@OptIn(InternalPlatformTextApi::class)
 internal fun Spannable.setTextDecoration(textDecoration: TextDecoration?, start: Int, end: Int) {
     textDecoration?.let {
-        if (TextDecoration.Underline in it) {
-            setSpan(UnderlineSpan(), start, end)
-        }
-        if (TextDecoration.LineThrough in it) {
-            setSpan(StrikethroughSpan(), start, end)
-        }
+        val textDecorationSpan = TextDecorationSpan(
+            isUnderlineText = TextDecoration.Underline in it,
+            isStrikethroughText = TextDecoration.LineThrough in it
+        )
+        setSpan(textDecorationSpan, start, end)
     }
 }
 
@@ -404,20 +446,18 @@
     }
 }
 
-private fun createTypeface(
-    fontFamily: FontFamily?,
-    weight: Int,
-    isItalic: Boolean,
-    fontSynthesis: FontSynthesis?,
-    typefaceAdapter: TypefaceAdapter
-): Typeface {
-    val fontWeight = FontWeight(weight)
-    val fontStyle = if (isItalic) FontStyle.Italic else FontStyle.Normal
+/**
+ * Returns true if there is any font settings on this [TextStyle].
+ * @see hasFontAttributes
+ */
+private fun TextStyle.hasFontAttributes(): Boolean {
+    return toSpanStyle().hasFontAttributes() || fontSynthesis != null
+}
 
-    return typefaceAdapter.create(
-        fontFamily = fontFamily,
-        fontWeight = fontWeight,
-        fontStyle = fontStyle,
-        fontSynthesis = fontSynthesis ?: FontSynthesis.All
-    )
+/**
+ * Helper function that merges a nullable [SpanStyle] with another [SpanStyle].
+ */
+private fun SpanStyle?.merge(spanStyle: SpanStyle): SpanStyle {
+    if (this == null) return spanStyle
+    return this.merge(spanStyle)
 }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
index 2eed6f2..3504388 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.text
 
+import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.text.AnnotatedString.Builder
@@ -341,6 +342,22 @@
         }
 
         /**
+         * Set a [TtsAnnotation] for the given [range].
+         *
+         * @param ttsAnnotation an object stores text to speech metadata that intended for the
+         * TTS engine.
+         * @param start the inclusive starting offset of the range
+         * @param end the exclusive end offset of the range
+         * @see getStringAnnotations
+         * @sample androidx.compose.ui.text.samples.AnnotatedStringAddStringAnnotationSample
+         */
+        @ExperimentalComposeApi
+        @Suppress("SetterReturnsThis")
+        fun addTtsAnnotation(ttsAnnotation: TtsAnnotation, start: Int, end: Int) {
+            annotations.add(MutableRange(ttsAnnotation, start, end))
+        }
+
+        /**
          * Applies the given [SpanStyle] to any appended text until a corresponding [pop] is
          * called.
          *
@@ -707,6 +724,58 @@
 }
 
 /**
+ * Pushes an annotation to the [AnnotatedString.Builder], executes [block] and then pops the
+ * annotation.
+ *
+ * @param tag the tag used to distinguish annotations
+ * @param annotation the string annotation attached on this AnnotatedString
+ * @param block function to be executed
+ *
+ * @return result of the [block]
+ *
+ * @see AnnotatedString.Builder.pushStringAnnotation
+ * @see AnnotatedString.Builder.pop
+ */
+@ExperimentalComposeApi
+inline fun <R : Any> Builder.withAnnotation(
+    tag: String,
+    annotation: String,
+    crossinline block: Builder.() -> R
+): R {
+    val index = pushStringAnnotation(tag, annotation)
+    return try {
+        block(this)
+    } finally {
+        pop(index)
+    }
+}
+
+/**
+ * Pushes an [TtsAnnotation] to the [AnnotatedString.Builder], executes [block] and then pops the
+ * annotation.
+ *
+ * @param ttsAnnotation an object stores text to speech metadata that intended for the TTS engine.
+ * @param block function to be executed
+ *
+ * @return result of the [block]
+ *
+ * @see AnnotatedString.Builder.pushStringAnnotation
+ * @see AnnotatedString.Builder.pop
+ */
+@ExperimentalComposeApi
+inline fun <R : Any> Builder.withAnnotation(
+    ttsAnnotation: TtsAnnotation,
+    crossinline block: Builder.() -> R
+): R {
+    val index = pushTtsAnnotation(ttsAnnotation)
+    return try {
+        block(this)
+    } finally {
+        pop(index)
+    }
+}
+
+/**
  * Filter the range list based on [Range.start] and [Range.end] to include ranges only in the range
  * of [start] (inclusive) and [end] (exclusive).
  *
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ExperimentalTextApi.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ExperimentalTextApi.kt
new file mode 100644
index 0000000..0c52428
--- /dev/null
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ExperimentalTextApi.kt
@@ -0,0 +1,20 @@
+/*
+ * 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.compose.ui.text
+
+@RequiresOptIn("This API is experimental and is likely to change in the future.")
+annotation class ExperimentalTextApi
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt
new file mode 100644
index 0000000..8a33d13
--- /dev/null
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Savers.kt
@@ -0,0 +1,399 @@
+/*
+ * 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
+
+import androidx.compose.runtime.ExperimentalComposeApi
+import androidx.compose.runtime.saveable.Saver
+import androidx.compose.runtime.saveable.SaverScope
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.intl.Locale
+import androidx.compose.ui.text.intl.LocaleList
+import androidx.compose.ui.text.style.BaselineShift
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextGeometricTransform
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.util.fastMap
+
+/**
+ * Utility function to be able to save nullable values. It also enables not to use with() scope
+ * for readability/syntactic purposes.
+ */
+internal fun <T : Saver<Original, Saveable>, Original, Saveable> save(
+    value: Original?,
+    saver: T,
+    scope: SaverScope
+): Any {
+    return value?.let { with(saver) { scope.save(value) } } ?: false
+}
+
+/**
+ * Utility function to restore nullable values. It also enables not to use with() scope
+ * for readability/syntactic purposes.
+ */
+internal inline fun <T : Saver<Original, Saveable>, Original, Saveable, reified Result> restore(
+    value: Saveable?,
+    saver: T
+): Result? {
+    if (value == false) return null
+    return value?.let { with(saver) { restore(value) } as Result }
+}
+
+/**
+ * Utility function to save nullable values that does not require a Saver.
+ */
+internal fun <T> save(value: T?): T? {
+    return value
+}
+
+/**
+ * Utility function to restore nullable values that does not require a Saver.
+ */
+internal inline fun <reified Result> restore(value: Any?): Result? {
+    return value?.let { it as Result }
+}
+
+internal val AnnotatedStringSaver = Saver<AnnotatedString, Any>(
+    save = {
+        arrayListOf(
+            save(it.text),
+            save(it.spanStyles, AnnotationRangeListSaver, this),
+            save(it.paragraphStyles, AnnotationRangeListSaver, this),
+            save(it.annotations, AnnotationRangeListSaver, this),
+        )
+    },
+    restore = {
+        val list = it as List<Any?>
+        AnnotatedString(
+            text = restore(list[0])!!,
+            spanStyles = restore(list[1], AnnotationRangeListSaver)!!,
+            paragraphStyles = restore(list[2], AnnotationRangeListSaver)!!,
+            annotations = restore(list[3], AnnotationRangeListSaver)!!,
+        )
+    }
+)
+
+private val AnnotationRangeListSaver = Saver<List<AnnotatedString.Range<out Any>>, Any>(
+    save = {
+        it.fastMap { range ->
+            save(range, AnnotationRangeSaver, this)
+        }
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        list.fastMap { item ->
+            val range: AnnotatedString.Range<out Any> = restore(item, AnnotationRangeSaver)!!
+            range
+        }
+    }
+)
+
+private enum class AnnotationType {
+    Paragraph,
+    Span,
+    VerbatimTts,
+    String
+}
+
+private val AnnotationRangeSaver = Saver<AnnotatedString.Range<out Any>, Any>(
+    save = {
+        val marker = when (it.item) {
+            is ParagraphStyle -> AnnotationType.Paragraph
+            is SpanStyle -> AnnotationType.Span
+            is VerbatimTtsAnnotation -> AnnotationType.VerbatimTts
+            else -> AnnotationType.String
+        }
+
+        val item = when (marker) {
+            AnnotationType.Paragraph -> save(it.item as ParagraphStyle, ParagraphStyleSaver, this)
+            AnnotationType.Span -> save(it.item as SpanStyle, SpanStyleSaver, this)
+            AnnotationType.VerbatimTts -> save(
+                it.item as VerbatimTtsAnnotation,
+                VerbatimTtsAnnotationSaver,
+                this
+            )
+            AnnotationType.String -> save(it.item)
+        }
+
+        arrayListOf(
+            save(marker),
+            item,
+            save(it.start),
+            save(it.end),
+            save(it.tag)
+        )
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        val marker: AnnotationType = restore(list[0])!!
+        val start: Int = restore(list[2])!!
+        val end: Int = restore(list[3])!!
+        val tag: String = restore(list[4])!!
+
+        when (marker) {
+            AnnotationType.Paragraph -> {
+                val item: ParagraphStyle = restore(list[1], ParagraphStyleSaver)!!
+                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+            }
+            AnnotationType.Span -> {
+                val item: SpanStyle = restore(list[1], SpanStyleSaver)!!
+                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+            }
+            AnnotationType.VerbatimTts -> {
+                val item: VerbatimTtsAnnotation = restore(list[1], VerbatimTtsAnnotationSaver)!!
+                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+            }
+            AnnotationType.String -> {
+                val item: String = restore(list[1])!!
+                AnnotatedString.Range(item = item, start = start, end = end, tag = tag)
+            }
+        }
+    }
+)
+
+private val VerbatimTtsAnnotationSaver = Saver<VerbatimTtsAnnotation, Any>(
+    save = { save(it.verbatim) },
+    restore = { VerbatimTtsAnnotation(restore(it)!!) }
+)
+
+internal val ParagraphStyleSaver = Saver<ParagraphStyle, Any>(
+    save = {
+        arrayListOf(
+            save(it.textAlign),
+            save(it.textDirection),
+            save(it.lineHeight, TextUnit.Saver, this),
+            save(it.textIndent, TextIndent.Saver, this)
+        )
+    },
+    restore = {
+        val list = it as List<Any?>
+        ParagraphStyle(
+            textAlign = restore(list[0]),
+            textDirection = restore(list[1]),
+            lineHeight = restore(list[2], TextUnit.Saver)!!,
+            textIndent = restore(list[3], TextIndent.Saver)
+        )
+    }
+)
+
+internal val SpanStyleSaver = Saver<SpanStyle, Any>(
+    save = {
+        arrayListOf(
+            save(it.color, Color.Saver, this),
+            save(it.fontSize, TextUnit.Saver, this),
+            save(it.fontWeight, FontWeight.Saver, this),
+            save(it.fontStyle),
+            save(it.fontSynthesis),
+            save(-1), // TODO save fontFamily
+            save(it.fontFeatureSettings),
+            save(it.letterSpacing, TextUnit.Saver, this),
+            save(it.baselineShift, BaselineShift.Saver, this),
+            save(it.textGeometricTransform, TextGeometricTransform.Saver, this),
+            save(it.localeList, LocaleList.Saver, this),
+            save(it.background, Color.Saver, this),
+            save(it.textDecoration, TextDecoration.Saver, this),
+            save(it.shadow, Shadow.Saver, this)
+        )
+    },
+    restore = {
+        val list = it as List<Any?>
+        SpanStyle(
+            color = restore(list[0], Color.Saver)!!,
+            fontSize = restore(list[1], TextUnit.Saver)!!,
+            fontWeight = restore(list[2], FontWeight.Saver),
+            fontStyle = restore(list[3]),
+            fontSynthesis = restore(list[4]),
+            // val fontFamily = list[5] // TODO restore fontFamily
+            fontFeatureSettings = restore(list[6]),
+            letterSpacing = restore(list[7], TextUnit.Saver)!!,
+            baselineShift = restore(list[8], BaselineShift.Saver),
+            textGeometricTransform = restore(list[9], TextGeometricTransform.Saver),
+            localeList = restore(list[10], LocaleList.Saver),
+            background = restore(list[11], Color.Saver)!!,
+            textDecoration = restore(list[12], TextDecoration.Saver),
+            shadow = restore(list[13], Shadow.Saver)
+        )
+    }
+)
+
+internal val TextDecoration.Companion.Saver: Saver<TextDecoration, Any>
+    get() = TextDecorationSaver
+
+private val TextDecorationSaver = Saver<TextDecoration, Any>(
+    save = { it.mask },
+    restore = { TextDecoration(it as Int) }
+)
+
+internal val TextGeometricTransform.Companion.Saver: Saver<TextGeometricTransform, Any>
+    get() = TextGeometricTransformSaver
+
+private val TextGeometricTransformSaver = Saver<TextGeometricTransform, Any>(
+    save = { arrayListOf(it.scaleX, it.skewX) },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Float>
+        TextGeometricTransform(scaleX = list[0], skewX = list[1])
+    }
+)
+
+internal val TextIndent.Companion.Saver: Saver<TextIndent, Any>
+    get() = TextIndentSaver
+
+private val TextIndentSaver = Saver<TextIndent, Any>(
+    save = {
+        arrayListOf(
+            save(it.firstLine, TextUnit.Saver, this),
+            save(it.restLine, TextUnit.Saver, this)
+        )
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        TextIndent(
+            firstLine = restore(list[0], TextUnit.Saver)!!,
+            restLine = restore(list[1], TextUnit.Saver)!!
+        )
+    }
+)
+
+internal val FontWeight.Companion.Saver: Saver<FontWeight, Any>
+    get() = FontWeightSaver
+
+private val FontWeightSaver = Saver<FontWeight, Any>(
+    save = { it.weight },
+    restore = { FontWeight(it as Int) }
+)
+
+internal val BaselineShift.Companion.Saver: Saver<BaselineShift, Any>
+    get() = BaselineShiftSaver
+
+private val BaselineShiftSaver = Saver<BaselineShift, Any>(
+    save = { it.multiplier },
+    restore = {
+        BaselineShift(it as Float)
+    }
+)
+
+internal val TextRange.Companion.Saver: Saver<TextRange, Any>
+    get() = TextRangeSaver
+
+private val TextRangeSaver = Saver<TextRange, Any>(
+    save = {
+        arrayListOf(save(it.start), save(it.end))
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        TextRange(restore(list[0])!!, restore(list[1])!!)
+    }
+)
+
+internal val Shadow.Companion.Saver: Saver<Shadow, Any>
+    get() = ShadowSaver
+
+private val ShadowSaver = Saver<Shadow, Any>(
+    save = {
+        arrayListOf(
+            save(it.color, Color.Saver, this),
+            save(it.offset, Offset.Saver, this),
+            save(it.blurRadius)
+        )
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        Shadow(
+            color = restore(list[0], Color.Saver)!!,
+            offset = restore(list[1], Offset.Saver)!!,
+            blurRadius = restore(list[2])!!
+        )
+    }
+)
+
+internal val Color.Companion.Saver: Saver<Color, Any>
+    get() = ColorSaver
+
+@OptIn(ExperimentalUnsignedTypes::class)
+private val ColorSaver = Saver<Color, Any>(
+    save = { it.value },
+    restore = { Color(it as ULong) }
+)
+
+internal val TextUnit.Companion.Saver: Saver<TextUnit, Any>
+    get() = TextUnitSaver
+
+@OptIn(ExperimentalComposeApi::class)
+private val TextUnitSaver = Saver<TextUnit, Any>(
+    save = {
+        arrayListOf(save(it.value), save(it.type))
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        TextUnit(restore(list[0])!!, restore(list[1])!!)
+    }
+)
+
+internal val Offset.Companion.Saver: Saver<Offset, Any>
+    get() = OffsetSaver
+
+private val OffsetSaver = Saver<Offset, Any>(
+    save = {
+        if (it == Offset.Unspecified) {
+            false
+        } else {
+            arrayListOf(save(it.x), save(it.y))
+        }
+    },
+    restore = {
+        if (it == false) {
+            Offset.Unspecified
+        } else {
+            val list = it as List<Any?>
+            Offset(restore(list[0])!!, restore(list[1])!!)
+        }
+    }
+)
+
+internal val LocaleList.Companion.Saver: Saver<LocaleList, Any>
+    get() = LocaleListSaver
+
+private val LocaleListSaver = Saver<LocaleList, Any>(
+    save = {
+        it.localeList.fastMap { locale ->
+            save(locale, Locale.Saver, this)
+        }
+    },
+    restore = {
+        @Suppress("UNCHECKED_CAST")
+        val list = it as List<Any>
+        LocaleList(list.fastMap { item -> restore(item, Locale.Saver)!! })
+    }
+)
+
+internal val Locale.Companion.Saver: Saver<Locale, Any>
+    get() = LocaleSaver
+
+private val LocaleSaver = Saver<Locale, Any>(
+    save = { it.toLanguageTag() },
+    restore = { Locale(languageTag = it as String) }
+)
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
index d37dd9b..b05f414 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
@@ -445,7 +445,11 @@
     }
 }
 
-/*@VisibleForTesting*/
+@Deprecated(
+    "Unused public function which was added for testing. The function does not do " +
+        "anything usable for Compose text APIs. The function is now deprecated and will be " +
+        "removed soon"
+)
 fun createTextLayoutResult(
     layoutInput: TextLayoutInput =
         TextLayoutInput(
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
index 80db56d..95373e8 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TtsAnnotation.kt
@@ -30,4 +30,19 @@
  */
 class VerbatimTtsAnnotation(
     val verbatim: String
-) : TtsAnnotation()
\ No newline at end of file
+) : TtsAnnotation() {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is VerbatimTtsAnnotation) return false
+        if (verbatim != other.verbatim) return false
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return verbatim.hashCode()
+    }
+
+    override fun toString(): String {
+        return "VerbatimTtsAnnotation(verbatim=$verbatim)"
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
index e11d9cb..af9dc7d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontFamily.kt
@@ -27,6 +27,7 @@
  * @see GenericFontFamily
  */
 @Immutable
+// TODO Unused parameter canLoadSynchronously
 sealed class FontFamily(val canLoadSynchronously: Boolean) {
     companion object {
         /**
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
index 0470785..c742ed9 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/Typeface.kt
@@ -20,6 +20,8 @@
  * A class that can be used for changing the font used in text.
  */
 interface Typeface {
+
+    // TODO Unused, not tested public function
     /**
      * The font family used for creating this Typeface. If a platform Typeface was used, will
      * return null.
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
index 02951c9..7edd04f 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/GapBuffer.kt
@@ -185,9 +185,9 @@
 
     /**
      * Write the current text into outBuf.
-     * @param buiilder The output string builder
+     * @param builder The output string builder
      */
-    internal fun append(builder: StringBuilder) {
+    fun append(builder: StringBuilder) {
         builder.append(buffer, 0, gapStart)
         builder.append(buffer, gapEnd, capacity - gapEnd)
     }
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
index 6d0e6459..e03e280 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/InputEventCallback.kt
@@ -19,6 +19,9 @@
 /**
  * An interface of listening IME events.
  */
+@Deprecated(
+    "This function is not being used by any APIs. API is now deprecated and will be removed"
+)
 interface InputEventCallback {
     /**
      * Called when IME sends some input events.
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
index a3fe060..d8dbaaf 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/input/TextFieldValue.kt
@@ -18,10 +18,13 @@
 
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.saveable.Saver
-import androidx.compose.runtime.saveable.listSaver
 import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.AnnotatedStringSaver
+import androidx.compose.ui.text.Saver
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.constrain
+import androidx.compose.ui.text.restore
+import androidx.compose.ui.text.save
 import kotlin.math.max
 import kotlin.math.min
 
@@ -151,14 +154,19 @@
         /**
          * The default [Saver] implementation for [TextFieldValue].
          */
-        val Saver = listSaver<TextFieldValue, Any>(
+        val Saver = Saver<TextFieldValue, Any>(
             save = {
-                listOf(it.annotatedString.toString(), it.selection.start, it.selection.end)
+                arrayListOf(
+                    save(it.annotatedString, AnnotatedStringSaver, this),
+                    save(it.selection, TextRange.Saver, this),
+                )
             },
             restore = {
+                @Suppress("UNCHECKED_CAST")
+                val list = it as List<Any>
                 TextFieldValue(
-                    text = it[0] as String,
-                    selection = TextRange(it[1] as Int, it[2] as Int)
+                    annotatedString = restore(list[0], AnnotatedStringSaver)!!,
+                    selection = restore(list[1], TextRange.Saver)!!,
                 )
             }
         )
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
index 0ddf205..9f3fdec 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
@@ -730,7 +730,7 @@
                         height = fontSizeInHierarchy(
                             density,
                             currentStyle.fontSize,
-                            cut.placeholder.width
+                            cut.placeholder.height
                         ),
                     )
                     ops.add(op)
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
index 5d89cf1..440782a 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopFontTest.kt
@@ -19,13 +19,14 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.platform.Font
 import androidx.compose.ui.text.platform.FontLoader
 import androidx.compose.ui.text.platform.GenericFontFamiliesMapping
-import androidx.compose.ui.text.platform.Font
 import androidx.compose.ui.text.platform.Typeface
 import com.google.common.truth.Truth
 import org.jetbrains.skija.Data
 import org.jetbrains.skija.Typeface
+import org.junit.Assume.assumeTrue
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -80,8 +81,11 @@
             .isEqualTo(listOf("Sample Font"))
     }
 
+    // TODO(demin): can we fix findTypeface for Windows and Linux?
     @Test
     fun findTypeface() {
+        assumeTrue(isMacOs)
+
         Truth.assertThat(fontLoader.findTypeface(fontListFontFamily)!!.isItalic)
             .isEqualTo(false)
 
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
index 13af274..10b9265 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
@@ -18,11 +18,11 @@
 
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.font.FontFamily
-import androidx.compose.ui.text.platform.FontLoader
 import androidx.compose.ui.text.platform.Font
+import androidx.compose.ui.text.platform.FontLoader
 import androidx.compose.ui.text.style.TextDirection
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.sp
@@ -72,7 +72,7 @@
 
     @Test
     fun getBoundingBox_multicodepoints() {
-        assumeLinux()
+        assumeTrue(isLinux)
         with(defaultDensity) {
             val text = "h\uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0"
             val fontSize = 50.sp
@@ -240,8 +240,4 @@
             resourceLoader = fontLoader
         )
     }
-
-    private fun assumeLinux() {
-        assumeTrue(System.getProperty("os.name").startsWith("Linux"))
-    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt
new file mode 100644
index 0000000..3f0df87
--- /dev/null
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/TestUtils.kt
@@ -0,0 +1,24 @@
+/*
+ * 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
+
+import java.util.Locale
+
+private val os = System.getProperty("os.name").toLowerCase(Locale.US)
+internal val isLinux = os.startsWith("linux")
+internal val isWindows = os.startsWith("win")
+internal val isMacOs = os.startsWith("mac")
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
index 121da01..b81b406 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringBuilderTest.kt
@@ -149,12 +149,12 @@
 
         val expectedString = "$text$appendedText"
         val expectedSpanStyles = listOf(
-            Range<SpanStyle>(
+            Range(
                 item = SpanStyle(color),
                 start = 0,
                 end = text.length
             ),
-            Range<SpanStyle>(
+            Range(
                 item = SpanStyle(appendedColor),
                 start = text.length,
                 end = expectedString.length
@@ -162,12 +162,12 @@
         )
 
         val expectedParagraphStyles = listOf(
-            Range<ParagraphStyle>(
+            Range(
                 item = ParagraphStyle(lineHeight = lineHeight),
                 start = 0,
                 end = text.length
             ),
-            Range<ParagraphStyle>(
+            Range(
                 item = ParagraphStyle(lineHeight = appendedLineHeight),
                 start = text.length,
                 end = expectedString.length
@@ -452,7 +452,7 @@
 
         assertThat(buildResult.paragraphStyles).isEmpty()
         assertThat(buildResult.spanStyles).isEqualTo(
-            listOf(Range<SpanStyle>(style, 0, buildResult.length))
+            listOf(Range(style, 0, buildResult.length))
         )
     }
 
@@ -468,7 +468,7 @@
 
         assertThat(buildResult.spanStyles).isEmpty()
         assertThat(buildResult.paragraphStyles).isEqualTo(
-            listOf(Range<ParagraphStyle>(style, 0, buildResult.length))
+            listOf(Range(style, 0, buildResult.length))
         )
     }
 
@@ -507,12 +507,12 @@
 
         val expectedString = "$text1 $text2"
         val expectedSpanStyles = listOf(
-            Range<SpanStyle>(spanStyle1, 0, text1.length),
-            Range<SpanStyle>(spanStyle2, text1.length + 1, expectedString.length)
+            Range(spanStyle1, 0, text1.length),
+            Range(spanStyle2, text1.length + 1, expectedString.length)
         )
         val expectedParagraphStyles = listOf(
-            Range<ParagraphStyle>(paragraphStyle1, 0, text1.length),
-            Range<ParagraphStyle>(paragraphStyle2, text1.length + 1, expectedString.length)
+            Range(paragraphStyle1, 0, text1.length),
+            Range(paragraphStyle2, text1.length + 1, expectedString.length)
         )
 
         assertThat(buildResult.text).isEqualTo(expectedString)
@@ -777,14 +777,14 @@
         return AnnotatedString(
             text = text,
             spanStyles = listOf(
-                Range<SpanStyle>(
+                Range(
                     item = SpanStyle(color),
                     start = 0,
                     end = text.length
                 )
             ),
             paragraphStyles = listOf(
-                Range<ParagraphStyle>(
+                Range(
                     item = ParagraphStyle(lineHeight = lineHeight),
                     start = 0,
                     end = text.length
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/SaversTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/SaversTest.kt
new file mode 100644
index 0000000..c621692
--- /dev/null
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/SaversTest.kt
@@ -0,0 +1,398 @@
+/*
+ * 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
+
+import androidx.compose.runtime.ExperimentalComposeApi
+import androidx.compose.runtime.saveable.SaverScope
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontSynthesis
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.intl.Locale
+import androidx.compose.ui.text.intl.LocaleList
+import androidx.compose.ui.text.style.BaselineShift
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextDirection
+import androidx.compose.ui.text.style.TextGeometricTransform
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.em
+import androidx.compose.ui.unit.sp
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class SaversTest {
+    private val defaultSaverScope = SaverScope { true }
+
+    @Test
+    fun test_TextUnit() {
+        val original = 2.sp
+        val saved = with(TextUnit.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(TextUnit.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextUnit_unspecified() {
+        val original = TextUnit.Unspecified
+        val saved = with(TextUnit.Saver) { defaultSaverScope.save(original) }
+        val restored = TextUnit.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Offset() {
+        val original = Offset(10f, 10f)
+        val saved = with(Offset.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(Offset.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Offset_Unspecified() {
+        val original = Offset.Unspecified
+        val saved = with(Offset.Saver) { defaultSaverScope.save(original) }
+        val restored = Offset.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Offset_Infinite() {
+        val original = Offset.Infinite
+        val saved = with(Offset.Saver) { defaultSaverScope.save(original) }
+        val restored = Offset.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Color() {
+        val original = Color.Yellow
+        val saved = with(Color.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(Color.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Color_Unspecified() {
+        val original = Color.Unspecified
+        val saved = with(Color.Saver) { defaultSaverScope.save(original) }
+        val restored = Color.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Shadow() {
+        val original = Shadow(color = Color.Blue, offset = Offset(5f, 5f), blurRadius = 2f)
+        val saved = with(Shadow.Saver) { defaultSaverScope.save(original) }
+        val restored = Shadow.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Shadow_None() {
+        val original = Shadow.None
+        val saved = with(Shadow.Saver) { defaultSaverScope.save(original) }
+        val restored = Shadow.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_ParagraphStyle() {
+        val original = ParagraphStyle()
+        val saved = with(ParagraphStyleSaver) { defaultSaverScope.save(original) }
+        val restored = ParagraphStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_ParagraphStyle_with_a_nonnull_value() {
+        val original = ParagraphStyle(textDirection = TextDirection.Rtl)
+        val saved = with(ParagraphStyleSaver) { defaultSaverScope.save(original) }
+        val restored = ParagraphStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_ParagraphStyle_with_no_null_value() {
+        val original = ParagraphStyle(
+            textAlign = TextAlign.Justify,
+            textDirection = TextDirection.Rtl,
+            lineHeight = 10.sp,
+            textIndent = TextIndent(firstLine = 2.sp, restLine = 3.sp)
+        )
+        val saved = with(ParagraphStyleSaver) { defaultSaverScope.save(original) }
+        val restored = ParagraphStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_SpanStyle() {
+        val original = SpanStyle()
+        val saved = with(SpanStyleSaver) { defaultSaverScope.save(original) }
+        val restored = SpanStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_SpanStyle_with_a_nonnull_value() {
+        val original = SpanStyle(baselineShift = BaselineShift.Subscript)
+        val saved = with(SpanStyleSaver) { defaultSaverScope.save(original) }
+        val restored = SpanStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_SpanStyle_with_no_null_value() {
+        val original = SpanStyle(
+            color = Color.Red,
+            fontSize = 10.sp,
+            fontWeight = FontWeight.Bold,
+            fontStyle = FontStyle.Italic,
+            fontSynthesis = FontSynthesis.All,
+            // fontFamily =
+            fontFeatureSettings = "feature settings",
+            letterSpacing = 2.em,
+            baselineShift = BaselineShift.Superscript,
+            textGeometricTransform = TextGeometricTransform(2f, 3f),
+            localeList = LocaleList(
+                Locale("sr-Latn-SR"),
+                Locale("sr-Cyrl-SR"),
+                Locale.current
+            ),
+            background = Color.Blue,
+            textDecoration = TextDecoration.LineThrough,
+            shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
+        )
+        val saved = with(SpanStyleSaver) { defaultSaverScope.save(original) }
+        val restored = SpanStyleSaver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_FontWeight() {
+        val original = FontWeight(123)
+        val saved = with(FontWeight.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(FontWeight.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_FontWeight_w100() {
+        val original = FontWeight.W100
+        val saved = with(FontWeight.Saver) { defaultSaverScope.save(original) }
+
+        val restored = FontWeight.Saver.restore(saved!!)
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_BaselineShift() {
+        val original = BaselineShift(2f)
+        val saved = with(BaselineShift.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(BaselineShift.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_BaselineShift_None() {
+        val original = BaselineShift.None
+        val saved = with(BaselineShift.Saver) { defaultSaverScope.save(original) }
+        val restored = BaselineShift.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextDecoration() {
+        val original = TextDecoration.combine(
+            listOf(TextDecoration.LineThrough, TextDecoration.Underline)
+        )
+        val saved = with(TextDecoration.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(TextDecoration.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextDecoration_None() {
+        val original = TextDecoration.None
+        val saved = with(TextDecoration.Saver) { defaultSaverScope.save(original) }
+
+        val restored = TextDecoration.Saver.restore(saved!!)
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun testSaveRestore_lineThrough() {
+        val original = TextDecoration.LineThrough
+        val saved = with(TextDecoration.Saver) { defaultSaverScope.save(original) }
+        val restored = TextDecoration.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun testSaveRestore_underline() {
+        val original = TextDecoration.Underline
+        val saved = with(TextDecoration.Saver) { defaultSaverScope.save(original) }
+        val restored = TextDecoration.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextGeometricTransform() {
+        val original = TextGeometricTransform(1f, 2f)
+        val saved = with(TextGeometricTransform.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(TextGeometricTransform.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextGeometricTransform_None() {
+        val original = TextGeometricTransform.None
+        val saved = with(TextGeometricTransform.Saver) { defaultSaverScope.save(original) }
+        val restored = TextGeometricTransform.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextIndent() {
+        val original = TextIndent(1.sp, 2.sp)
+        val saved = with(TextIndent.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(TextIndent.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_TextIndent_None() {
+        val original = TextIndent.None
+        val saved = with(TextIndent.Saver) { defaultSaverScope.save(original) }
+        val restored = TextIndent.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_AnnotatedString() {
+        val original = AnnotatedString("abc")
+        val saved = with(AnnotatedStringSaver) { defaultSaverScope.save(original) }
+
+        assertThat(AnnotatedStringSaver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_AnnotatedString_withSpanStyles() {
+        val original = buildAnnotatedString {
+            withStyle(SpanStyle(color = Color.Red)) { append("1") }
+            withStyle(SpanStyle(fontStyle = FontStyle.Italic)) { append("2") }
+        }
+
+        val saved = with(AnnotatedStringSaver) { defaultSaverScope.save(original) }
+
+        val restored: AnnotatedString = AnnotatedStringSaver.restore(saved!!)!!
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_AnnotatedString_withParagraphStyles() {
+        val original = buildAnnotatedString {
+            withStyle(ParagraphStyle(textAlign = TextAlign.Justify)) { append("1") }
+            withStyle(ParagraphStyle(textDirection = TextDirection.Rtl)) { append("2") }
+        }
+
+        val saved = with(AnnotatedStringSaver) { defaultSaverScope.save(original) }
+
+        val restored: AnnotatedString = AnnotatedStringSaver.restore(saved!!)!!
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @OptIn(ExperimentalComposeApi::class)
+    @Test
+    fun test_AnnotatedString_withAnnotations() {
+        val original = buildAnnotatedString {
+            withAnnotation(tag = "Tag1", annotation = "Annotation1") { append("1") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim1")) { append("2") }
+            withAnnotation(tag = "Tag2", annotation = "Annotation2") { append("3") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim2")) { append("4") }
+        }
+
+        val saved = with(AnnotatedStringSaver) { defaultSaverScope.save(original) }
+
+        val restored: AnnotatedString = AnnotatedStringSaver.restore(saved!!)!!
+
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @OptIn(ExperimentalComposeApi::class)
+    @Test
+    fun test_AnnotatedString_withSpanAndParagraphStylesAndAnnotations() {
+        val original = buildAnnotatedString {
+            withStyle(ParagraphStyle(textAlign = TextAlign.Justify)) { append("1") }
+            withStyle(ParagraphStyle(textDirection = TextDirection.Rtl)) { append("2") }
+            withStyle(SpanStyle(color = Color.Red)) { append("3") }
+            withStyle(SpanStyle(fontStyle = FontStyle.Italic)) { append("4") }
+            withAnnotation(tag = "Tag1", annotation = "Annotation1") { append("5") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim1")) { append("6") }
+            withAnnotation(tag = "Tag2", annotation = "Annotation2") { append("7") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim2")) { append("8") }
+        }
+
+        val saved = with(AnnotatedStringSaver) { defaultSaverScope.save(original) }
+
+        val restored: AnnotatedString = AnnotatedStringSaver.restore(saved!!)!!
+        assertThat(restored).isEqualTo(original)
+    }
+
+    @Test
+    fun test_Locale() {
+        val original = Locale("sr-Latn-SR")
+        val saved = with(Locale.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(Locale.Saver.restore(saved!!)).isEqualTo(original)
+    }
+
+    @Test
+    fun test_LocaleList() {
+        val original = LocaleList(
+            Locale("sr-Latn-SR"),
+            Locale("sr-Cyrl-SR"),
+            Locale.current
+        )
+        val saved = with(LocaleList.Saver) { defaultSaverScope.save(original) }
+
+        assertThat(LocaleList.Saver.restore(saved!!)).isEqualTo(original)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontWeightTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontWeightTest.kt
index e309ddb..f22a6400 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontWeightTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontWeightTest.kt
@@ -132,7 +132,7 @@
     }
 
     @Test
-    fun `compareTo`() {
+    fun compareTo() {
         assertThat(FontWeight.W400.compareTo(FontWeight.W400)).isEqualTo(0)
         assertThat(FontWeight.W400.compareTo(FontWeight.W300)).isEqualTo(1)
         assertThat(FontWeight.W400.compareTo(FontWeight.W500)).isEqualTo(-1)
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
index 99aa67c..22e1863 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/DeleteSurroundingTextInCodePointsCommandTest.kt
@@ -92,7 +92,7 @@
 
         DeleteSurroundingTextInCodePointsCommand(2, 2).applyTo(eb)
 
-        assertEquals("$CH1", eb.toString())
+        assertEquals(CH1, eb.toString())
         assertEquals(2, eb.cursor)
         assertFalse(eb.hasComposition())
     }
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/GapBufferTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/GapBufferTest.kt
index 15dc78a..1f3fff9 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/GapBufferTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/GapBufferTest.kt
@@ -693,29 +693,29 @@
 
         val r = Random(10 /* fix the seed for reproduction */)
 
-        val INSERT_TEXTS = arrayOf(SHORT_TEXT, MEDIUM_TEXT, LONG_TEXT)
-        val DEL_LENGTHS = arrayOf(1, 10, 100)
+        val insertTexts = arrayOf(SHORT_TEXT, MEDIUM_TEXT, LONG_TEXT)
+        val delLengths = arrayOf(1, 10, 100)
 
         var c = LONG_INIT_TEXT.length / 2
 
         for (i in 0..100) {
             when (r.nextInt() % 4) {
                 0 -> { // insert
-                    val txt = INSERT_TEXTS.random(r)
+                    val txt = insertTexts.random(r)
                     assertReplace(c, c, txt, sb, gb)
                     c += txt.length
                 }
                 1 -> { // forward delete
-                    assertReplace(c, c + DEL_LENGTHS.random(r), "", sb, gb)
+                    assertReplace(c, c + delLengths.random(r), "", sb, gb)
                 }
                 2 -> { // backspacing
-                    val len = DEL_LENGTHS.random(r)
+                    val len = delLengths.random(r)
                     assertReplace(c - len, c, "", sb, gb)
                     c -= len
                 }
                 3 -> { // replacing
-                    val txt = INSERT_TEXTS.random(r)
-                    val len = DEL_LENGTHS.random(r)
+                    val txt = insertTexts.random(r)
+                    val len = delLengths.random(r)
 
                     assertReplace(c, c + len, txt, sb, gb)
                 }
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/TextFieldValueTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/TextFieldValueTest.kt
index 16e219c..af86ea9 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/TextFieldValueTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/input/TextFieldValueTest.kt
@@ -16,7 +16,31 @@
 
 package androidx.compose.ui.text.input
 
+import androidx.compose.runtime.ExperimentalComposeApi
+import androidx.compose.runtime.saveable.SaverScope
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.text.ParagraphStyle
+import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.VerbatimTtsAnnotation
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontSynthesis
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.intl.Locale
+import androidx.compose.ui.text.intl.LocaleList
+import androidx.compose.ui.text.style.BaselineShift
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.text.style.TextDirection
+import androidx.compose.ui.text.style.TextGeometricTransform
+import androidx.compose.ui.text.style.TextIndent
+import androidx.compose.ui.text.withAnnotation
+import androidx.compose.ui.text.withStyle
+import androidx.compose.ui.unit.em
+import androidx.compose.ui.unit.sp
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -24,6 +48,7 @@
 
 @RunWith(JUnit4::class)
 class TextFieldValueTest {
+    private val defaultSaverScope = SaverScope { true }
 
     @Test(expected = IllegalArgumentException::class)
     fun throws_exception_for_negative_selection() {
@@ -138,4 +163,73 @@
 
         assertThat(textFieldValue.composition).isNull()
     }
+
+    @OptIn(ExperimentalComposeApi::class)
+    @Test
+    fun test_Saver() {
+        val annotatedString = buildAnnotatedString {
+            withStyle(ParagraphStyle(textAlign = TextAlign.Justify)) { append("1") }
+            withStyle(SpanStyle(fontStyle = FontStyle.Italic)) { append("2") }
+            withAnnotation(tag = "Tag1", annotation = "Annotation1") { append("3") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim1")) { append("4") }
+            withAnnotation(tag = "Tag2", annotation = "Annotation2") { append("5") }
+            withAnnotation(VerbatimTtsAnnotation("verbatim2")) { append("6") }
+            withStyle(
+                SpanStyle(
+                    color = Color.Red,
+                    fontSize = 10.sp,
+                    fontWeight = FontWeight.Bold,
+                    fontStyle = FontStyle.Italic,
+                    fontSynthesis = FontSynthesis.All,
+                    fontFeatureSettings = "feature settings",
+                    letterSpacing = 2.em,
+                    baselineShift = BaselineShift.Superscript,
+                    textGeometricTransform = TextGeometricTransform(2f, 3f),
+                    localeList = LocaleList(
+                        Locale("sr-Latn-SR"),
+                        Locale("sr-Cyrl-SR"),
+                        Locale.current
+                    ),
+                    background = Color.Blue,
+                    textDecoration = TextDecoration.LineThrough,
+                    shadow = Shadow(color = Color.Red, offset = Offset(2f, 2f), blurRadius = 4f)
+
+                )
+            ) {
+                append("7")
+            }
+            withStyle(
+                ParagraphStyle(
+                    textAlign = TextAlign.Justify,
+                    textDirection = TextDirection.Rtl,
+                    lineHeight = 10.sp,
+                    textIndent = TextIndent(firstLine = 2.sp, restLine = 3.sp)
+                )
+            ) {
+                append("8")
+            }
+        }
+
+        val original = TextFieldValue(
+            annotatedString = annotatedString,
+            selection = TextRange(1, 2),
+            composition = TextRange(3, 4)
+        )
+
+        val saved = with(TextFieldValue.Saver) { defaultSaverScope.save(original) }
+        val restored = TextFieldValue.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(
+            TextFieldValue(original.annotatedString, original.selection)
+        )
+    }
+
+    @Test
+    fun test_Saver_defaultInstance() {
+        val original = TextFieldValue()
+        val saved = with(TextFieldValue.Saver) { defaultSaverScope.save(original) }
+        val restored = TextFieldValue.Saver.restore(saved!!)
+
+        assertThat(restored).isEqualTo(original)
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-tooling-data/api/1.0.0-beta06.txt b/compose/ui/ui-tooling-data/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/ui/ui-tooling-data/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..14c7473
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.0.0-beta06.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 @androidx.compose.ui.tooling.data.UiToolingDataApi 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 p, 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 @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, 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 @androidx.compose.ui.tooling.data.UiToolingDataApi 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/compose/ui/ui-tooling-data/api/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..14c7473
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.0.0-beta07.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 @androidx.compose.ui.tooling.data.UiToolingDataApi 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 p, 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 @androidx.compose.ui.tooling.data.UiToolingDataApi public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean p, 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 @androidx.compose.ui.tooling.data.UiToolingDataApi 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/compose/ui/ui-tooling-data/api/res-1.0.0-beta06.txt b/compose/ui/ui-tooling-data/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-tooling-data/api/res-1.0.0-beta07.txt b/compose/ui/ui-tooling-data/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-tooling-data/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-tooling-data/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/ui/ui-tooling-data/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.0.0-beta07.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/src/androidTest/java/androidx/compose/ui/tooling/data/OffsetInformationTest.kt b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
index eaa07ac..0d302d8 100644
--- a/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
+++ b/compose/ui/ui-tooling-data/src/androidTest/java/androidx/compose/ui/tooling/data/OffsetInformationTest.kt
@@ -51,10 +51,10 @@
                 "Text" to 1685,
                 "Greeting" to 1928,
                 "Text" to 2763,
-                "Surface" to 2043,
+                "Surface" to 1960,
                 "Button" to 2088,
                 "Text" to 2111,
-                "Surface" to 1960,
+                "Surface" to 2150,
                 "TextButton" to 2277,
                 "Row" to 2418
             ),
diff --git a/compose/ui/ui-tooling/api/1.0.0-beta06.txt b/compose/ui/ui-tooling/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.0.0-beta06.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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.0.0-beta07.txt b/compose/ui/ui-tooling/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.0.0-beta07.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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/res-1.0.0-beta06.txt b/compose/ui/ui-tooling/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-tooling/api/res-1.0.0-beta07.txt b/compose/ui/ui-tooling/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-tooling/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-tooling/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-tooling/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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/restricted_1.0.0-beta07.txt b/compose/ui/ui-tooling/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..e392e95
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,202 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class InspectableKt {
+    method @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+}
+
+package androidx.compose.ui.tooling.inspector {
+
+  public final class InspectorNode {
+    method public int[] getBounds();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> getChildren();
+    method public String getFileName();
+    method public int getHeight();
+    method public long getId();
+    method public int getLeft();
+    method public int getLength();
+    method public int getLineNumber();
+    method public String getName();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> getParameters();
+    method public int getTop();
+    method public int getWidth();
+    property public final int[] bounds;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> children;
+    property public final String fileName;
+    property public final int height;
+    property public final long id;
+    property public final int left;
+    property public final int length;
+    property public final int lineNumber;
+    property public final String name;
+    property public final int offset;
+    property public final int packageHash;
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.RawParameter> parameters;
+    property public final int top;
+    property public final int width;
+  }
+
+  public final class InspectorNodeKt {
+  }
+
+  public final class LayoutInspectorTree {
+    ctor public LayoutInspectorTree();
+    method public java.util.List<androidx.compose.ui.tooling.inspector.InspectorNode> convert(android.view.View view);
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> convertParameters(androidx.compose.ui.tooling.inspector.InspectorNode node);
+    method public boolean getHideSystemNodes();
+    method public void resetGeneratedId();
+    method public void setHideSystemNodes(boolean p);
+    property public final boolean hideSystemNodes;
+  }
+
+  public final class LayoutInspectorTreeKt {
+  }
+
+  public final class NodeParameter {
+    method public java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> getElements();
+    method public String getName();
+    method public androidx.compose.ui.tooling.inspector.ParameterType getType();
+    method public Object? getValue();
+    property public final java.util.List<androidx.compose.ui.tooling.inspector.NodeParameter> elements;
+    property public final String name;
+    property public final androidx.compose.ui.tooling.inspector.ParameterType type;
+    property public final Object? value;
+  }
+
+  public final class ParameterFactoryKt {
+  }
+
+  public enum ParameterType {
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Boolean;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Color;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionDp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionEm;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType DimensionSp;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Double;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Float;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType FunctionReference;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int32;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Int64;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Lambda;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType Resource;
+    enum_constant public static final androidx.compose.ui.tooling.inspector.ParameterType String;
+  }
+
+  public final class RawParameter {
+    ctor public RawParameter(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview {
+
+  public final class ComposeViewAdapterKt {
+    field public static final String TOOLS_NS_URI = "http://schemas.android.com/tools";
+  }
+
+  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 0L;
+    method public abstract String device() default "";
+    method public abstract float fontScale() default 1.0f;
+    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 2147483647;
+    method public abstract Class<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract Class<? 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;
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
+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/lint-baseline.xml b/compose/ui/ui-tooling/lint-baseline.xml
index aeb18ac..6b9fc7f 100644
--- a/compose/ui/ui-tooling/lint-baseline.xml
+++ b/compose/ui/ui-tooling/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.tooling.preview.LayoutlibFontResourceLoader is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.tooling.preview.LayoutlibFontResourceLoader is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is ResourceFont -> context.resources.getFont(font.resId)"
         errorLine2="                                                 ~~~~~~~">
         <location
diff --git a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/ParameterFactory.kt b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/ParameterFactory.kt
index 1688b79..0e935b5 100644
--- a/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/ParameterFactory.kt
+++ b/compose/ui/ui-tooling/src/main/java/androidx/compose/ui/tooling/inspector/ParameterFactory.kt
@@ -19,7 +19,6 @@
 import android.util.Log
 import android.view.View
 import androidx.compose.foundation.shape.CornerSize
-import androidx.compose.runtime.ComposeCompilerApi
 import androidx.compose.runtime.internal.ComposableLambda
 import androidx.compose.ui.AbsoluteAlignment
 import androidx.compose.ui.Modifier
@@ -273,7 +272,6 @@
             try {
                 recursions++
                 createFromConstant(name, value)?.let { return it }
-                @OptIn(ComposeCompilerApi::class)
                 return when (value) {
                     is AnnotatedString -> NodeParameter(name, ParameterType.String, value.text)
                     is BaselineShift -> createFromBaselineShift(name, value)
@@ -323,7 +321,6 @@
             return NodeParameter(name, ParameterType.String, converted)
         }
 
-        @OptIn(ComposeCompilerApi::class)
         private fun createFromCLambda(name: String, value: ComposableLambda): NodeParameter? = try {
             val lambda = value.javaClass.getDeclaredField("_block")
                 .apply { isAccessible = true }
diff --git a/compose/ui/ui-unit/api/1.0.0-beta06.txt b/compose/ui/ui-unit/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..747f176
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.0.0-beta06.txt
@@ -0,0 +1,374 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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/1.0.0-beta07.txt b/compose/ui/ui-unit/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..747f176
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.0.0-beta07.txt
@@ -0,0 +1,374 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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_1.0.0-beta06.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..be64cf0
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,375 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @androidx.compose.runtime.ExperimentalComposeApi public static long TextUnit(float value, androidx.compose.ui.unit.TextUnitType 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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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_1.0.0-beta07.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..be64cf0
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,375 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @androidx.compose.runtime.ExperimentalComposeApi public static long TextUnit(float value, androidx.compose.ui.unit.TextUnitType 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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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 747f176..be64cf0 100644
--- a/compose/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -320,6 +320,7 @@
   }
 
   public final class TextUnitKt {
+    method @androidx.compose.runtime.ExperimentalComposeApi public static long TextUnit(float value, androidx.compose.ui.unit.TextUnitType type);
     method public static long getEm(float);
     method public static long getEm(double);
     method public static long getEm(int);
diff --git a/compose/ui/ui-unit/api/res-1.0.0-beta06.txt b/compose/ui/ui-unit/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-unit/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-unit/api/res-1.0.0-beta07.txt b/compose/ui/ui-unit/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-unit/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-unit/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-unit/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..5e27162
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,378 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @kotlin.PublishedApi internal static void checkArithmetic--R2X_6o(long a);
+    method @kotlin.PublishedApi internal static void checkArithmetic-8E83U4Q(long a, long b);
+    method @kotlin.PublishedApi internal static void checkArithmetic-HxQ2Pkc(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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method @kotlin.PublishedApi internal static long pack(long unitType, float v);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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_1.0.0-beta07.txt b/compose/ui/ui-unit/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..5e27162
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,378 @@
+// 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();
+    method public static long constructor-impl(long value);
+    method public static long copy-msEJaDk(long $this, optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static boolean getHasBoundedHeight-impl(long $this);
+    method public static boolean getHasBoundedWidth-impl(long $this);
+    method public static boolean getHasFixedHeight-impl(long $this);
+    method public static boolean getHasFixedWidth-impl(long $this);
+    method public static int getMaxHeight-impl(long $this);
+    method public static int getMaxWidth-impl(long $this);
+    method public static int getMinHeight-impl(long $this);
+    method public static int getMinWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isZero-impl(long $this);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.Constraints.Companion Companion;
+    field public static final int Infinity = 2147483647; // 0x7fffffff
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed-msEJaDk(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight-msEJaDk(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth-msEJaDk(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-WVSBfsc(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight-4A1wEdY(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth-4A1wEdY(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(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--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default int roundToPx-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default float toDp--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(int);
+    method @androidx.compose.runtime.Stable public default float toDp-D9Ej5fM(float);
+    method @androidx.compose.runtime.Stable public default float toPx--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public default float toPx-0680j_4(float);
+    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 toSp-0680j_4(float);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(int);
+    method @androidx.compose.runtime.Stable public default long toSp-XSAIIZE(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-0680j_4(float p);
+    method @androidx.compose.runtime.Stable public static operator int compareTo-0680j_4(float $this, float other);
+    method public static float constructor-impl(float value);
+    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
+    method public static boolean equals-impl0(float p1, float p2);
+    method public float getValue();
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
+    method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
+    method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
+    property public final float value;
+    field public static final androidx.compose.ui.unit.Dp.Companion Companion;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline-D9Ej5fM();
+    method public float getInfinity-D9Ej5fM();
+    method public float getUnspecified-D9Ej5fM();
+    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-ioHfwGI(float x, float y);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
+    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 float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isSpecified-0680j_4(float);
+    method public static inline boolean isUnspecified-0680j_4(float);
+    method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp-O0PuQT4(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method public static long copy-ioHfwGI(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-D9Ej5fM(long $this);
+    method public static float getY-D9Ej5fM(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus-jo-Fl9I(long $this, long other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.DpOffset.Companion Companion;
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getZero-RKDOV3M();
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method @androidx.compose.runtime.Immutable public androidx.compose.ui.unit.DpRect copy-ZmiikuI(float left, float top, float right, float bottom);
+    method public float getBottom-D9Ej5fM();
+    method public float getLeft-D9Ej5fM();
+    method public float getRight-D9Ej5fM();
+    method public float getTop-D9Ej5fM();
+    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 IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public static operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator int component2-impl(long $this);
+    method public static long copy-nOcc-ac(long $this, optional int x, optional int y);
+    method @androidx.compose.runtime.Stable public static operator long div-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getX-impl(long $this);
+    method public static int getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static inline operator long minus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long plus--gyyYBs(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-nOcc-ac(long $this, int operand);
+    method @androidx.compose.runtime.Stable public static operator long times-nOcc-ac(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator long unaryMinus-nOcc-ac(long $this);
+    field public static final androidx.compose.ui.unit.IntOffset.Companion Companion;
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero-nOcc-ac();
+    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-t0UgTr0(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-k5bmQ1s(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus-tRj9Ofw(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round-k-4lQ0M(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset--gyyYBs(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--gyyYBs(long offset);
+    method @androidx.compose.runtime.Immutable 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-nOcc-ac();
+    method public long getBottomLeft-nOcc-ac();
+    method public long getBottomRight-nOcc-ac();
+    method public long getCenter-nOcc-ac();
+    method public long getCenterLeft-nOcc-ac();
+    method public long getCenterRight-nOcc-ac();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize-YbymL2g();
+    method public int getTop();
+    method public long getTopCenter-nOcc-ac();
+    method public long getTopLeft-nOcc-ac();
+    method public long getTopRight-nOcc-ac();
+    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(int translateX, int translateY);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate--gyyYBs(long offset);
+    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-TtQJ-B4(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-cS3zvqc(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect-iAZ9QSk(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 static inline operator int component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator int component2-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long div-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static int getHeight-impl(long $this);
+    method public static int getWidth-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-YbymL2g(long $this, int other);
+    method @androidx.compose.runtime.Stable public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.unit.IntSize.Companion Companion;
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero-YbymL2g();
+    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-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static operator long times-U1E2UwY(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect-ozmzZPI(long);
+    method @androidx.compose.runtime.Stable public static long toSize-ozmzZPI(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 static inline operator int compareTo--R2X_6o(long $this, long other);
+    method public static inline operator long div-XSAIIZE(long $this, float other);
+    method public static inline operator long div-XSAIIZE(long $this, double other);
+    method public static inline operator long div-XSAIIZE(long $this, int other);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static androidx.compose.ui.unit.TextUnitType getType-impl(long $this);
+    method public static float getValue-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method public static boolean isEm-impl(long $this);
+    method public static boolean isSp-impl(long $this);
+    method public static inline operator long times-XSAIIZE(long $this, float other);
+    method public static inline operator long times-XSAIIZE(long $this, double other);
+    method public static inline operator long times-XSAIIZE(long $this, int other);
+    method public static String toString-impl(long $this);
+    method public static inline operator long unaryMinus-XSAIIZE(long $this);
+    field public static final androidx.compose.ui.unit.TextUnit.Companion Companion;
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified-XSAIIZE();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @kotlin.PublishedApi internal static void checkArithmetic--R2X_6o(long a);
+    method @kotlin.PublishedApi internal static void checkArithmetic-8E83U4Q(long a, long b);
+    method @kotlin.PublishedApi internal static void checkArithmetic-HxQ2Pkc(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--R2X_6o(long);
+    method public static boolean isUnspecified--R2X_6o(long);
+    method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long start, long stop, float fraction);
+    method @kotlin.PublishedApi internal static long pack(long unitType, float v);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
+  }
+
+  public enum TextUnitType {
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Em;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Sp;
+    enum_constant public static final androidx.compose.ui.unit.TextUnitType Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public static operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator float component2-impl(long $this);
+    method public static long copy-9UxMQ8M(long $this, optional float x, optional float y);
+    method @androidx.compose.runtime.Stable public static operator long div-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getX-impl(long $this);
+    method public static float getY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long minus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long plus-TH1AsA0(long $this, long other);
+    method @androidx.compose.runtime.Stable public static operator long rem-9UxMQ8M(long $this, float operand);
+    method @androidx.compose.runtime.Stable public static operator long times-9UxMQ8M(long $this, float operand);
+    method public static String toString-impl(long $this);
+    method @androidx.compose.runtime.Stable public static operator long unaryMinus-9UxMQ8M(long $this);
+    field public static final androidx.compose.ui.unit.Velocity.Companion Companion;
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero-9UxMQ8M();
+    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/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
index fb512b1..eea18d9 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
@@ -17,6 +17,7 @@
 
 package androidx.compose.ui.unit
 
+import androidx.compose.runtime.ExperimentalComposeApi
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.geometry.isSpecified
@@ -42,12 +43,15 @@
 /**
  * An enum class defining for type of [TextUnit].
  */
-enum class TextUnitType {
-    Unspecified,
-    Sp,
-    Em
+enum class TextUnitType(internal val type: Long) {
+    Unspecified(UNIT_TYPE_UNSPECIFIED),
+    Sp(UNIT_TYPE_SP),
+    Em(UNIT_TYPE_EM)
 }
 
+@ExperimentalComposeApi
+fun TextUnit(value: Float, type: TextUnitType): TextUnit = pack(type.type, value)
+
 /**
  * The unit used for text related dimension value.
  *
diff --git a/compose/ui/ui-util/api/1.0.0-beta06.txt b/compose/ui/ui-util/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/ui/ui-util/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-util/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/ui/ui-util/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/ui/ui-util/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-util/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-util/api/res-1.0.0-beta07.txt b/compose/ui/ui-util/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-util/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-util/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-util/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/ui/ui-util/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-viewbinding/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.0.0-beta06.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/1.0.0-beta07.txt b/compose/ui/ui-viewbinding/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.0.0-beta06.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.0.0-beta07.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.0.0-beta07.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/res-1.0.0-beta06.txt b/compose/ui/ui-viewbinding/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui-viewbinding/api/res-1.0.0-beta07.txt b/compose/ui/ui-viewbinding/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui-viewbinding/api/restricted_1.0.0-beta06.txt b/compose/ui/ui-viewbinding/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.0.0-beta06.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/restricted_1.0.0-beta07.txt b/compose/ui/ui-viewbinding/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.0.0-beta07.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.0.0-beta06.txt b/compose/ui/ui/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..40f9f97
--- /dev/null
+++ b/compose/ui/ui/api/1.0.0-beta06.txt
@@ -0,0 +1,2537 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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 enum FocusDirection {
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection 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 forcedClear);
+    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public enum KeyEventType {
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey-ZmokQxo(android.view.KeyEvent);
+    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class HitPathTrackerKt {
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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();
+    property public abstract long layerId;
+  }
+
+  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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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);
+  }
+
+  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.node {
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 JvmActuals_jvmKt {
+  }
+
+  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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    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/1.0.0-beta07.txt b/compose/ui/ui/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..25aed62
--- /dev/null
+++ b/compose/ui/ui/api/1.0.0-beta07.txt
@@ -0,0 +1,2582 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 forcedClear);
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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();
+    property public abstract long layerId;
+  }
+
+  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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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.node {
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 JvmActuals_jvmKt {
+  }
+
+  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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    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
new file mode 100644
index 0000000..260888e
--- /dev/null
+++ b/compose/ui/ui/api/current.ignore
@@ -0,0 +1,45 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.ui.focus.FocusManager#moveFocus-3ESFkO8(int):
+    Added method androidx.compose.ui.focus.FocusManager.moveFocus-3ESFkO8(int)
+
+
+ChangedSuperclass: androidx.compose.ui.focus.FocusDirection:
+    Class androidx.compose.ui.focus.FocusDirection superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.input.key.KeyEventType:
+    Class androidx.compose.ui.input.key.KeyEventType superclass changed from java.lang.Enum to java.lang.Object
+
+
+ChangedType: androidx.compose.ui.input.key.KeyEvent_androidKt#getType-ZmokQxo(android.view.KeyEvent):
+    Method androidx.compose.ui.input.key.KeyEvent_androidKt.getType-ZmokQxo has changed return type from androidx.compose.ui.input.key.KeyEventType to int
+
+
+InvalidNullConversion: androidx.compose.ui.input.key.KeyEvent_androidKt#getType-ZmokQxo(android.view.KeyEvent):
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.input.key.KeyEvent_androidKt.getType-ZmokQxo(android.view.KeyEvent)
+
+
+RemovedClass: androidx.compose.ui.input.pointer.HitPathTrackerKt:
+    Removed class androidx.compose.ui.input.pointer.HitPathTrackerKt
+
+
+RemovedField: androidx.compose.ui.focus.FocusDirection#Down:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Down
+RemovedField: androidx.compose.ui.focus.FocusDirection#Left:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Left
+RemovedField: androidx.compose.ui.focus.FocusDirection#Next:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Next
+RemovedField: androidx.compose.ui.focus.FocusDirection#Previous:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Previous
+RemovedField: androidx.compose.ui.focus.FocusDirection#Right:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Right
+RemovedField: androidx.compose.ui.focus.FocusDirection#Up:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Up
+RemovedField: androidx.compose.ui.input.key.KeyEventType#KeyDown:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.KeyDown
+RemovedField: androidx.compose.ui.input.key.KeyEventType#KeyUp:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.KeyUp
+RemovedField: androidx.compose.ui.input.key.KeyEventType#Unknown:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.Unknown
+
+
+RemovedMethod: androidx.compose.ui.focus.FocusManager#moveFocus(androidx.compose.ui.focus.FocusDirection):
+    Removed method androidx.compose.ui.focus.FocusManager.moveFocus(androidx.compose.ui.focus.FocusDirection)
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index ce5c32e..25aed62 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -236,13 +236,35 @@
     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 enum FocusDirection {
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Up;
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 {
@@ -255,7 +277,7 @@
 
   public interface FocusManager {
     method public void clearFocus(optional boolean forcedClear);
-    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
   }
 
   public final class FocusModifierKt {
@@ -1219,15 +1241,30 @@
     property public final android.view.KeyEvent nativeKeyEvent;
   }
 
-  public enum KeyEventType {
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
-    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
     method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
     method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
     method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
@@ -1302,9 +1339,6 @@
     property public final boolean positionChange;
   }
 
-  public final class HitPathTrackerKt {
-  }
-
   public final class MotionEventAdapter_androidKt {
   }
 
@@ -1737,6 +1771,17 @@
 
   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 {
@@ -2058,6 +2103,13 @@
 
 }
 
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
 package androidx.compose.ui.platform.actionmodecallback {
 
   public final class TextActionModeCallback_androidKt {
@@ -2120,6 +2172,26 @@
     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();
@@ -2180,6 +2252,7 @@
     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();
@@ -2194,6 +2267,7 @@
     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;
@@ -2278,13 +2352,17 @@
   }
 
   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.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();
@@ -2301,13 +2379,17 @@
     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.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;
@@ -2334,7 +2416,10 @@
     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);
@@ -2354,13 +2439,17 @@
     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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
     method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
diff --git a/compose/ui/ui/api/public_plus_experimental_1.0.0-beta06.txt b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..13dcdf0
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,2683 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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? p);
+    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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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 enum FocusDirection {
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection 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 forcedClear);
+    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean moveFocusIn();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean moveFocusOut();
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    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 @androidx.compose.ui.ExperimentalComposeUiApi 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 {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public enum KeyEventType {
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey-ZmokQxo(android.view.KeyEvent);
+    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class HitPathTrackerKt {
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.ui.ExperimentalComposeUiApi public default long getOwnerViewId();
+    property public abstract long layerId;
+    property @androidx.compose.ui.ExperimentalComposeUiApi 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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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);
+  }
+
+  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.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? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 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;
+  }
+
+  @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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.graphics.vector.AnimatedImageVector animatedVectorResource(@DrawableRes int id);
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property @androidx.compose.ui.ExperimentalComposeUiApi 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/public_plus_experimental_1.0.0-beta07.txt b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..9fa0749
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,2728 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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? p);
+    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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 forcedClear);
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public default boolean moveFocusIn();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public default boolean moveFocusOut();
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    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 @androidx.compose.ui.ExperimentalComposeUiApi 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 {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.ui.ExperimentalComposeUiApi public default long getOwnerViewId();
+    property public abstract long layerId;
+    property @androidx.compose.ui.ExperimentalComposeUiApi 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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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.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? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 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;
+  }
+
+  @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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.graphics.vector.AnimatedImageVector animatedVectorResource(@DrawableRes int id);
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property @androidx.compose.ui.ExperimentalComposeUiApi 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/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index 6383220..9fa0749 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -307,13 +307,35 @@
     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 enum FocusDirection {
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Up;
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 {
@@ -326,9 +348,9 @@
 
   public interface FocusManager {
     method public void clearFocus(optional boolean forcedClear);
-    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean moveFocusIn();
-    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean moveFocusOut();
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public default boolean moveFocusIn();
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public default boolean moveFocusOut();
   }
 
   public final class FocusModifierKt {
@@ -1321,15 +1343,30 @@
     property public final android.view.KeyEvent nativeKeyEvent;
   }
 
-  public enum KeyEventType {
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
-    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
     method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
     method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
     method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
@@ -1404,9 +1441,6 @@
     property public final boolean positionChange;
   }
 
-  public final class HitPathTrackerKt {
-  }
-
   public final class MotionEventAdapter_androidKt {
   }
 
@@ -1595,7 +1629,9 @@
 
   public interface GraphicLayerInfo {
     method public long getLayerId();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public default long getOwnerViewId();
     property public abstract long layerId;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public default long ownerViewId;
   }
 
   public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
@@ -1839,6 +1875,17 @@
 
   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 {
@@ -2195,6 +2242,13 @@
 
 }
 
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
 package androidx.compose.ui.platform.actionmodecallback {
 
   public final class TextActionModeCallback_androidKt {
@@ -2258,6 +2312,26 @@
     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();
@@ -2318,6 +2392,7 @@
     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();
@@ -2332,6 +2407,7 @@
     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;
@@ -2416,13 +2492,17 @@
   }
 
   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.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();
@@ -2439,13 +2519,17 @@
     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.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;
@@ -2472,7 +2556,10 @@
     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);
@@ -2492,6 +2579,7 @@
     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);
@@ -2499,7 +2587,10 @@
     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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
     method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
@@ -2608,13 +2699,18 @@
   }
 
   @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);
     ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getClippingEnabled();
     method public boolean getDismissOnBackPress();
     method public boolean getDismissOnClickOutside();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getExcludeFromSystemGesture();
     method public boolean getFocusable();
     method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean clippingEnabled;
     property public final boolean dismissOnBackPress;
     property public final boolean dismissOnClickOutside;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean excludeFromSystemGesture;
     property public final boolean focusable;
     property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
   }
diff --git a/compose/ui/ui/api/res-1.0.0-beta06.txt b/compose/ui/ui/api/res-1.0.0-beta06.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui/api/res-1.0.0-beta06.txt
diff --git a/compose/ui/ui/api/res-1.0.0-beta07.txt b/compose/ui/ui/api/res-1.0.0-beta07.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/compose/ui/ui/api/res-1.0.0-beta07.txt
diff --git a/compose/ui/ui/api/restricted_1.0.0-beta06.txt b/compose/ui/ui/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..84c7fa3
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,2567 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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 enum FocusDirection {
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
+    enum_constant public static final androidx.compose.ui.focus.FocusDirection 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 forcedClear);
+    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public enum KeyEventType {
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
+    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey-ZmokQxo(android.view.KeyEvent);
+    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class HitPathTrackerKt {
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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();
+    property public abstract long layerId;
+  }
+
+  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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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);
+  }
+
+  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.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 void setDensity(androidx.compose.ui.unit.Density p);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection p);
+    method public void setMeasurePolicy(androidx.compose.ui.layout.MeasurePolicy p);
+    method public void setModifier(androidx.compose.ui.Modifier p);
+    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;
+    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();
+    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;
+  }
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 JvmActuals_jvmKt {
+  }
+
+  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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    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_1.0.0-beta07.txt b/compose/ui/ui/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..d35964c
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,2612 @@
+// 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.Immutable public fun interface Alignment {
+    method public long align-oYSo38o(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.Immutable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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-oYSo38o(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 @androidx.compose.runtime.Immutable 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 AndroidAutofillDebugUtils_androidKt {
+  }
+
+  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 interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize-NH-jbRc();
+    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-NH-jbRc();
+    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-HfQes2E(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();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 forcedClear);
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
+  }
+
+  public final class FocusModifierKt {
+    method public static androidx.compose.ui.Modifier focusModifier(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 p);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester p);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester p);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester p);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester p);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester p);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester p);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester p);
+    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 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 enum FocusState {
+    enum_constant public static final androidx.compose.ui.focus.FocusState Active;
+    enum_constant public static final androidx.compose.ui.focus.FocusState ActiveParent;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Captured;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Disabled;
+    enum_constant public static final androidx.compose.ui.focus.FocusState Inactive;
+  }
+
+  public final class FocusStateKt {
+    method public static boolean isFocused(androidx.compose.ui.focus.FocusState);
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  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, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer-i_P0lGk(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 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-SzJe1aQ();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float p);
+    method public void setCameraDistance(float p);
+    method public void setClip(boolean p);
+    method public void setRotationX(float p);
+    method public void setRotationY(float p);
+    method public void setRotationZ(float p);
+    method public void setScaleX(float p);
+    method public void setScaleY(float p);
+    method public void setShadowElevation(float p);
+    method public void setShape(androidx.compose.ui.graphics.Shape p);
+    method public void setTransformOrigin-__ExYCQ(long p);
+    method public void setTranslationX(float p);
+    method public void setTranslationY(float p);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-SzJe1aQ(long $this, optional float pivotFractionX, optional float pivotFractionY);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getPivotFractionX-impl(long $this);
+    method public static float getPivotFractionY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Immutable public static inline String! toString-impl(long p);
+    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter-SzJe1aQ();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight-D9Ej5fM();
+    method public float getDefaultWidth-D9Ej5fM();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public androidx.compose.ui.graphics.BlendMode getTintBlendMode();
+    method public long getTintColor-0d7_KjU();
+    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 androidx.compose.ui.graphics.BlendMode 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 {
+    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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.PathFillType 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 androidx.compose.ui.graphics.StrokeCap strokeLineCap, optional androidx.compose.ui.graphics.StrokeJoin strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  @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 androidx.compose.ui.graphics.PathFillType getDefaultFillType();
+    method public static androidx.compose.ui.graphics.StrokeCap getDefaultStrokeLineCap();
+    method public static androidx.compose.ui.graphics.StrokeJoin getDefaultStrokeLineJoin();
+    method public static androidx.compose.ui.graphics.BlendMode getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    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-NH-jbRc();
+    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 androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter-u_AqRoo(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional androidx.compose.ui.graphics.BlendMode tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    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 androidx.compose.ui.graphics.PathFillType getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public androidx.compose.ui.graphics.StrokeCap getStrokeLineCap();
+    method public androidx.compose.ui.graphics.StrokeJoin 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 androidx.compose.ui.graphics.PathFillType pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final androidx.compose.ui.graphics.StrokeCap strokeLineCap;
+    property public final androidx.compose.ui.graphics.StrokeJoin 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;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(androidx.compose.ui.hapticfeedback.HapticFeedbackType hapticFeedbackType);
+  }
+
+  public enum HapticFeedbackType {
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType LongPress;
+    enum_constant public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public static long constructor-impl(long keyCode);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getKeyCode();
+    method public static inline int hashCode-impl(long p);
+    method public static String toString-impl(long $this);
+    property public final long keyCode;
+    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
+  }
+
+  public static final class Key.Companion {
+    method public long getA-EK5gGoQ();
+    method public long getAllApps-EK5gGoQ();
+    method public long getAltLeft-EK5gGoQ();
+    method public long getAltRight-EK5gGoQ();
+    method public long getApostrophe-EK5gGoQ();
+    method public long getAppSwitch-EK5gGoQ();
+    method public long getAssist-EK5gGoQ();
+    method public long getAt-EK5gGoQ();
+    method public long getAvReceiverInput-EK5gGoQ();
+    method public long getAvReceiverPower-EK5gGoQ();
+    method public long getB-EK5gGoQ();
+    method public long getBack-EK5gGoQ();
+    method public long getBackslash-EK5gGoQ();
+    method public long getBackspace-EK5gGoQ();
+    method public long getBookmark-EK5gGoQ();
+    method public long getBreak-EK5gGoQ();
+    method public long getBrightnessDown-EK5gGoQ();
+    method public long getBrightnessUp-EK5gGoQ();
+    method public long getBrowser-EK5gGoQ();
+    method public long getButton1-EK5gGoQ();
+    method public long getButton10-EK5gGoQ();
+    method public long getButton11-EK5gGoQ();
+    method public long getButton12-EK5gGoQ();
+    method public long getButton13-EK5gGoQ();
+    method public long getButton14-EK5gGoQ();
+    method public long getButton15-EK5gGoQ();
+    method public long getButton16-EK5gGoQ();
+    method public long getButton2-EK5gGoQ();
+    method public long getButton3-EK5gGoQ();
+    method public long getButton4-EK5gGoQ();
+    method public long getButton5-EK5gGoQ();
+    method public long getButton6-EK5gGoQ();
+    method public long getButton7-EK5gGoQ();
+    method public long getButton8-EK5gGoQ();
+    method public long getButton9-EK5gGoQ();
+    method public long getButtonA-EK5gGoQ();
+    method public long getButtonB-EK5gGoQ();
+    method public long getButtonC-EK5gGoQ();
+    method public long getButtonL1-EK5gGoQ();
+    method public long getButtonL2-EK5gGoQ();
+    method public long getButtonMode-EK5gGoQ();
+    method public long getButtonR1-EK5gGoQ();
+    method public long getButtonR2-EK5gGoQ();
+    method public long getButtonSelect-EK5gGoQ();
+    method public long getButtonStart-EK5gGoQ();
+    method public long getButtonThumbLeft-EK5gGoQ();
+    method public long getButtonThumbRight-EK5gGoQ();
+    method public long getButtonX-EK5gGoQ();
+    method public long getButtonY-EK5gGoQ();
+    method public long getButtonZ-EK5gGoQ();
+    method public long getC-EK5gGoQ();
+    method public long getCalculator-EK5gGoQ();
+    method public long getCalendar-EK5gGoQ();
+    method public long getCall-EK5gGoQ();
+    method public long getCamera-EK5gGoQ();
+    method public long getCapsLock-EK5gGoQ();
+    method public long getCaptions-EK5gGoQ();
+    method public long getChannelDown-EK5gGoQ();
+    method public long getChannelUp-EK5gGoQ();
+    method public long getClear-EK5gGoQ();
+    method public long getComma-EK5gGoQ();
+    method public long getContacts-EK5gGoQ();
+    method public long getCopy-EK5gGoQ();
+    method public long getCtrlLeft-EK5gGoQ();
+    method public long getCtrlRight-EK5gGoQ();
+    method public long getCut-EK5gGoQ();
+    method public long getD-EK5gGoQ();
+    method public long getDelete-EK5gGoQ();
+    method public long getDirectionCenter-EK5gGoQ();
+    method public long getDirectionDown-EK5gGoQ();
+    method public long getDirectionDownLeft-EK5gGoQ();
+    method public long getDirectionDownRight-EK5gGoQ();
+    method public long getDirectionLeft-EK5gGoQ();
+    method public long getDirectionRight-EK5gGoQ();
+    method public long getDirectionUp-EK5gGoQ();
+    method public long getDirectionUpLeft-EK5gGoQ();
+    method public long getDirectionUpRight-EK5gGoQ();
+    method public long getDvr-EK5gGoQ();
+    method public long getE-EK5gGoQ();
+    method public long getEight-EK5gGoQ();
+    method public long getEisu-EK5gGoQ();
+    method public long getEndCall-EK5gGoQ();
+    method public long getEnter-EK5gGoQ();
+    method public long getEnvelope-EK5gGoQ();
+    method public long getEquals-EK5gGoQ();
+    method public long getEscape-EK5gGoQ();
+    method public long getF-EK5gGoQ();
+    method public long getF1-EK5gGoQ();
+    method public long getF10-EK5gGoQ();
+    method public long getF11-EK5gGoQ();
+    method public long getF12-EK5gGoQ();
+    method public long getF2-EK5gGoQ();
+    method public long getF3-EK5gGoQ();
+    method public long getF4-EK5gGoQ();
+    method public long getF5-EK5gGoQ();
+    method public long getF6-EK5gGoQ();
+    method public long getF7-EK5gGoQ();
+    method public long getF8-EK5gGoQ();
+    method public long getF9-EK5gGoQ();
+    method public long getFive-EK5gGoQ();
+    method public long getFocus-EK5gGoQ();
+    method public long getForward-EK5gGoQ();
+    method public long getFour-EK5gGoQ();
+    method public long getFunction-EK5gGoQ();
+    method public long getG-EK5gGoQ();
+    method public long getGrave-EK5gGoQ();
+    method public long getGuide-EK5gGoQ();
+    method public long getH-EK5gGoQ();
+    method public long getHeadsetHook-EK5gGoQ();
+    method public long getHelp-EK5gGoQ();
+    method public long getHenkan-EK5gGoQ();
+    method public long getHome-EK5gGoQ();
+    method public long getI-EK5gGoQ();
+    method public long getInfo-EK5gGoQ();
+    method public long getInsert-EK5gGoQ();
+    method public long getJ-EK5gGoQ();
+    method public long getK-EK5gGoQ();
+    method public long getKana-EK5gGoQ();
+    method public long getKatakanaHiragana-EK5gGoQ();
+    method public long getL-EK5gGoQ();
+    method public long getLanguageSwitch-EK5gGoQ();
+    method public long getLastChannel-EK5gGoQ();
+    method public long getLeftBracket-EK5gGoQ();
+    method public long getM-EK5gGoQ();
+    method public long getMannerMode-EK5gGoQ();
+    method public long getMediaAudioTrack-EK5gGoQ();
+    method public long getMediaClose-EK5gGoQ();
+    method public long getMediaEject-EK5gGoQ();
+    method public long getMediaFastForward-EK5gGoQ();
+    method public long getMediaNext-EK5gGoQ();
+    method public long getMediaPause-EK5gGoQ();
+    method public long getMediaPlay-EK5gGoQ();
+    method public long getMediaPlayPause-EK5gGoQ();
+    method public long getMediaPrevious-EK5gGoQ();
+    method public long getMediaRecord-EK5gGoQ();
+    method public long getMediaRewind-EK5gGoQ();
+    method public long getMediaSkipBackward-EK5gGoQ();
+    method public long getMediaSkipForward-EK5gGoQ();
+    method public long getMediaStepBackward-EK5gGoQ();
+    method public long getMediaStepForward-EK5gGoQ();
+    method public long getMediaStop-EK5gGoQ();
+    method public long getMediaTopMenu-EK5gGoQ();
+    method public long getMenu-EK5gGoQ();
+    method public long getMetaLeft-EK5gGoQ();
+    method public long getMetaRight-EK5gGoQ();
+    method public long getMicrophoneMute-EK5gGoQ();
+    method public long getMinus-EK5gGoQ();
+    method public long getMoveEnd-EK5gGoQ();
+    method public long getMoveHome-EK5gGoQ();
+    method public long getMuhenkan-EK5gGoQ();
+    method public long getMultiply-EK5gGoQ();
+    method public long getMusic-EK5gGoQ();
+    method public long getN-EK5gGoQ();
+    method public long getNavigateIn-EK5gGoQ();
+    method public long getNavigateNext-EK5gGoQ();
+    method public long getNavigateOut-EK5gGoQ();
+    method public long getNavigatePrevious-EK5gGoQ();
+    method public long getNine-EK5gGoQ();
+    method public long getNotification-EK5gGoQ();
+    method public long getNumLock-EK5gGoQ();
+    method public long getNumPad0-EK5gGoQ();
+    method public long getNumPad1-EK5gGoQ();
+    method public long getNumPad2-EK5gGoQ();
+    method public long getNumPad3-EK5gGoQ();
+    method public long getNumPad4-EK5gGoQ();
+    method public long getNumPad5-EK5gGoQ();
+    method public long getNumPad6-EK5gGoQ();
+    method public long getNumPad7-EK5gGoQ();
+    method public long getNumPad8-EK5gGoQ();
+    method public long getNumPad9-EK5gGoQ();
+    method public long getNumPadAdd-EK5gGoQ();
+    method public long getNumPadComma-EK5gGoQ();
+    method public long getNumPadDivide-EK5gGoQ();
+    method public long getNumPadDot-EK5gGoQ();
+    method public long getNumPadEnter-EK5gGoQ();
+    method public long getNumPadEquals-EK5gGoQ();
+    method public long getNumPadLeftParenthesis-EK5gGoQ();
+    method public long getNumPadMultiply-EK5gGoQ();
+    method public long getNumPadRightParenthesis-EK5gGoQ();
+    method public long getNumPadSubtract-EK5gGoQ();
+    method public long getNumber-EK5gGoQ();
+    method public long getO-EK5gGoQ();
+    method public long getOne-EK5gGoQ();
+    method public long getP-EK5gGoQ();
+    method public long getPageDown-EK5gGoQ();
+    method public long getPageUp-EK5gGoQ();
+    method public long getPairing-EK5gGoQ();
+    method public long getPaste-EK5gGoQ();
+    method public long getPeriod-EK5gGoQ();
+    method public long getPictureSymbols-EK5gGoQ();
+    method public long getPlus-EK5gGoQ();
+    method public long getPound-EK5gGoQ();
+    method public long getPower-EK5gGoQ();
+    method public long getPrintScreen-EK5gGoQ();
+    method public long getProfileSwitch-EK5gGoQ();
+    method public long getProgramBlue-EK5gGoQ();
+    method public long getProgramGreen-EK5gGoQ();
+    method public long getProgramRed-EK5gGoQ();
+    method public long getProgramYellow-EK5gGoQ();
+    method public long getQ-EK5gGoQ();
+    method public long getR-EK5gGoQ();
+    method public long getRefresh-EK5gGoQ();
+    method public long getRightBracket-EK5gGoQ();
+    method public long getRo-EK5gGoQ();
+    method public long getS-EK5gGoQ();
+    method public long getScrollLock-EK5gGoQ();
+    method public long getSearch-EK5gGoQ();
+    method public long getSemicolon-EK5gGoQ();
+    method public long getSetTopBoxInput-EK5gGoQ();
+    method public long getSetTopBoxPower-EK5gGoQ();
+    method public long getSettings-EK5gGoQ();
+    method public long getSeven-EK5gGoQ();
+    method public long getShiftLeft-EK5gGoQ();
+    method public long getShiftRight-EK5gGoQ();
+    method public long getSix-EK5gGoQ();
+    method public long getSlash-EK5gGoQ();
+    method public long getSleep-EK5gGoQ();
+    method public long getSoftLeft-EK5gGoQ();
+    method public long getSoftRight-EK5gGoQ();
+    method public long getSoftSleep-EK5gGoQ();
+    method public long getSpacebar-EK5gGoQ();
+    method public long getStem1-EK5gGoQ();
+    method public long getStem2-EK5gGoQ();
+    method public long getStem3-EK5gGoQ();
+    method public long getStemPrimary-EK5gGoQ();
+    method public long getSwitchCharset-EK5gGoQ();
+    method public long getSymbol-EK5gGoQ();
+    method public long getSystemNavigationDown-EK5gGoQ();
+    method public long getSystemNavigationLeft-EK5gGoQ();
+    method public long getSystemNavigationRight-EK5gGoQ();
+    method public long getSystemNavigationUp-EK5gGoQ();
+    method public long getT-EK5gGoQ();
+    method public long getTab-EK5gGoQ();
+    method public long getThree-EK5gGoQ();
+    method public long getThumbsDown-EK5gGoQ();
+    method public long getThumbsUp-EK5gGoQ();
+    method public long getToggle2D3D-EK5gGoQ();
+    method public long getTv-EK5gGoQ();
+    method public long getTvAntennaCable-EK5gGoQ();
+    method public long getTvAudioDescription-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeDown-EK5gGoQ();
+    method public long getTvAudioDescriptionMixingVolumeUp-EK5gGoQ();
+    method public long getTvContentsMenu-EK5gGoQ();
+    method public long getTvDataService-EK5gGoQ();
+    method public long getTvInput-EK5gGoQ();
+    method public long getTvInputComponent1-EK5gGoQ();
+    method public long getTvInputComponent2-EK5gGoQ();
+    method public long getTvInputComposite1-EK5gGoQ();
+    method public long getTvInputComposite2-EK5gGoQ();
+    method public long getTvInputHdmi1-EK5gGoQ();
+    method public long getTvInputHdmi2-EK5gGoQ();
+    method public long getTvInputHdmi3-EK5gGoQ();
+    method public long getTvInputHdmi4-EK5gGoQ();
+    method public long getTvInputVga1-EK5gGoQ();
+    method public long getTvMediaContextMenu-EK5gGoQ();
+    method public long getTvNetwork-EK5gGoQ();
+    method public long getTvNumberEntry-EK5gGoQ();
+    method public long getTvPower-EK5gGoQ();
+    method public long getTvRadioService-EK5gGoQ();
+    method public long getTvSatellite-EK5gGoQ();
+    method public long getTvSatelliteBs-EK5gGoQ();
+    method public long getTvSatelliteCs-EK5gGoQ();
+    method public long getTvSatelliteService-EK5gGoQ();
+    method public long getTvTeletext-EK5gGoQ();
+    method public long getTvTerrestrialAnalog-EK5gGoQ();
+    method public long getTvTerrestrialDigital-EK5gGoQ();
+    method public long getTvTimerProgramming-EK5gGoQ();
+    method public long getTvZoomMode-EK5gGoQ();
+    method public long getTwo-EK5gGoQ();
+    method public long getU-EK5gGoQ();
+    method public long getUnknown-EK5gGoQ();
+    method public long getV-EK5gGoQ();
+    method public long getVoiceAssist-EK5gGoQ();
+    method public long getVolumeDown-EK5gGoQ();
+    method public long getVolumeMute-EK5gGoQ();
+    method public long getVolumeUp-EK5gGoQ();
+    method public long getW-EK5gGoQ();
+    method public long getWakeUp-EK5gGoQ();
+    method public long getWindow-EK5gGoQ();
+    method public long getX-EK5gGoQ();
+    method public long getY-EK5gGoQ();
+    method public long getYen-EK5gGoQ();
+    method public long getZ-EK5gGoQ();
+    method public long getZenkakuHankaru-EK5gGoQ();
+    method public long getZero-EK5gGoQ();
+    method public long getZoomIn-EK5gGoQ();
+    method public long getZoomOut-EK5gGoQ();
+    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 static android.view.KeyEvent! constructor-impl(android.view.KeyEvent nativeKeyEvent);
+    method public static inline boolean equals-impl(android.view.KeyEvent! p, Object? p1);
+    method public static boolean equals-impl0(android.view.KeyEvent p1, android.view.KeyEvent p2);
+    method public android.view.KeyEvent getNativeKeyEvent();
+    method public static inline int hashCode-impl(android.view.KeyEvent! p);
+    method public static inline String! toString-impl(android.view.KeyEvent! p);
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isMetaPressed-ZmokQxo(android.view.KeyEvent);
+    method public static boolean isShiftPressed-ZmokQxo(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-YVgTNJs(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public default suspend Object? onPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling-k5p9STU(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll-61dr0bI(long consumed, long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource source);
+    method public suspend Object? dispatchPreFling-bHeVL4A(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll-ScU7Jk8(long available, androidx.compose.ui.input.nestedscroll.NestedScrollSource 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 enum NestedScrollSource {
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Drag;
+    enum_constant public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource Fling;
+  }
+
+}
+
+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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    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 p);
+    method public void setPositionChange(boolean p);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final class MotionEventAdapter_androidKt {
+  }
+
+  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 java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+  }
+
+  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 boolean isOutOfBounds-MReStF0(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    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 inline class PointerId {
+    ctor public PointerId();
+    method public static long constructor-impl(long value);
+    method public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public long getValue();
+    method public static inline int hashCode-impl(long p);
+    method public static inline String! toString-impl(long p);
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy-aJ2ieLA(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 androidx.compose.ui.input.pointer.PointerType type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId-J3iCeTQ();
+    method public long getPosition-F1C5BW0();
+    method public boolean getPressed();
+    method public long getPreviousPosition-F1C5BW0();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public androidx.compose.ui.input.pointer.PointerType 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 androidx.compose.ui.input.pointer.PointerType type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public final long getSize-YbymL2g();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent-d1fqKvQ(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    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 long getSize-YbymL2g();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method 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 enum PointerType {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Eraser;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Mouse;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Stylus;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Touch;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerType Unknown;
+  }
+
+  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-OX7LsLU(long timeMillis, long position);
+    method public long calculateVelocity-9UxMQ8M();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+  }
+
+}
+
+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();
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor-AhF4CD4(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-AhF4CD4(long srcSize, long dstSize);
+    method @androidx.compose.runtime.Immutable 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();
+    property public abstract long layerId;
+  }
+
+  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-YbymL2g();
+    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-YJiYy8w(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot-k-4lQ0M(long relativeToLocal);
+    method public long localToWindow-k-4lQ0M(long relativeToLocal);
+    method public long windowToLocal-k-4lQ0M(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 int getHeight();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    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 @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-za8Wrwc(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-BRTryo0(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-8A2P9vY(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 public static inline 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-ozmzZPI(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method public static inline 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-nOcc-ac();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize-YbymL2g();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints-msEJaDk();
+    method public final int getWidth();
+    method protected abstract void placeAt-rMeLuDI(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize-ozmzZPI(long value);
+    method protected final void setMeasurementConstraints-BRTryo0(long p);
+    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-z2mxYZE(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 placeRelative-z2mxYZE(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    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 placeRelativeWithLayer-muyPCdA(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 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-muyPCdA(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 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 static inline operator float component1-impl(long $this);
+    method @androidx.compose.runtime.Stable public static inline operator float component2-impl(long $this);
+    method public static long copy-_hLwfpc(long $this, optional float scaleX, optional float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div-_hLwfpc(long $this, float operand);
+    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(long p, Object? p1);
+    method public static boolean equals-impl0(long p1, long p2);
+    method public static float getScaleX-impl(long $this);
+    method public static float getScaleY-impl(long $this);
+    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(long p);
+    method @androidx.compose.runtime.Stable public static operator long times-_hLwfpc(long $this, float operand);
+    method public static String toString-impl(long $this);
+    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified-_hLwfpc();
+    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-ngKnWWw(long, long scaleFactor);
+    method public static inline boolean isSpecified-FK8aYYs(long);
+    method public static inline boolean isUnspecified-FK8aYYs(long);
+    method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
+    method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
+  }
+
+  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.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 void setDensity(androidx.compose.ui.unit.Density p);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection p);
+    method public void setMeasurePolicy(androidx.compose.ui.layout.MeasurePolicy p);
+    method public void setModifier(androidx.compose.ui.Modifier p);
+    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;
+    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();
+    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;
+  }
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? p);
+    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-ZmokQxo(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();
+  }
+
+  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 ComposeView_androidKt {
+  }
+
+  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.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();
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  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 boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean p);
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+  }
+
+  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? p);
+    method public void setValue(Object? p);
+    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 JvmActuals_jvmKt {
+  }
+
+  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 float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public abstract float touchSlop;
+  }
+
+  @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>? p);
+    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 AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+  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;
+  }
+
+  public enum LiveRegionMode {
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode Assertive;
+    enum_constant public static final androidx.compose.ui.semantics.LiveRegionMode 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;
+  }
+
+  public enum Role {
+    enum_constant public static final androidx.compose.ui.semantics.Role Button;
+    enum_constant public static final androidx.compose.ui.semantics.Role Checkbox;
+    enum_constant public static final androidx.compose.ui.semantics.Role Image;
+    enum_constant public static final androidx.compose.ui.semantics.Role RadioButton;
+    enum_constant public static final androidx.compose.ui.semantics.Role Switch;
+    enum_constant public static final androidx.compose.ui.semantics.Role 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 p);
+    method public void setMergingSemanticsOfDescendants(boolean p);
+    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-F1C5BW0();
+    method public long getPositionInWindow-F1C5BW0();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize-YbymL2g();
+    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;
+  }
+
+  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.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<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.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<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 androidx.compose.ui.text.input.ImeAction getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.LiveRegionMode 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 androidx.compose.ui.semantics.Role 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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.input.ImeAction p);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.LiveRegionMode p);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    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 p);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.Role p);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean p);
+    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 p);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
+    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-Hy0MoUY(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long p);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState p);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange p);
+  }
+
+  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 {
+  }
+
+}
+
+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();
+  }
+
+}
+
+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(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 @androidx.compose.runtime.Composable public static void Popup-wO4EaeM(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 @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-aa5Bd6I(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);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    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
new file mode 100644
index 0000000..260888e
--- /dev/null
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -0,0 +1,45 @@
+// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.ui.focus.FocusManager#moveFocus-3ESFkO8(int):
+    Added method androidx.compose.ui.focus.FocusManager.moveFocus-3ESFkO8(int)
+
+
+ChangedSuperclass: androidx.compose.ui.focus.FocusDirection:
+    Class androidx.compose.ui.focus.FocusDirection superclass changed from java.lang.Enum to java.lang.Object
+ChangedSuperclass: androidx.compose.ui.input.key.KeyEventType:
+    Class androidx.compose.ui.input.key.KeyEventType superclass changed from java.lang.Enum to java.lang.Object
+
+
+ChangedType: androidx.compose.ui.input.key.KeyEvent_androidKt#getType-ZmokQxo(android.view.KeyEvent):
+    Method androidx.compose.ui.input.key.KeyEvent_androidKt.getType-ZmokQxo has changed return type from androidx.compose.ui.input.key.KeyEventType to int
+
+
+InvalidNullConversion: androidx.compose.ui.input.key.KeyEvent_androidKt#getType-ZmokQxo(android.view.KeyEvent):
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.input.key.KeyEvent_androidKt.getType-ZmokQxo(android.view.KeyEvent)
+
+
+RemovedClass: androidx.compose.ui.input.pointer.HitPathTrackerKt:
+    Removed class androidx.compose.ui.input.pointer.HitPathTrackerKt
+
+
+RemovedField: androidx.compose.ui.focus.FocusDirection#Down:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Down
+RemovedField: androidx.compose.ui.focus.FocusDirection#Left:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Left
+RemovedField: androidx.compose.ui.focus.FocusDirection#Next:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Next
+RemovedField: androidx.compose.ui.focus.FocusDirection#Previous:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Previous
+RemovedField: androidx.compose.ui.focus.FocusDirection#Right:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Right
+RemovedField: androidx.compose.ui.focus.FocusDirection#Up:
+    Removed enum constant androidx.compose.ui.focus.FocusDirection.Up
+RemovedField: androidx.compose.ui.input.key.KeyEventType#KeyDown:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.KeyDown
+RemovedField: androidx.compose.ui.input.key.KeyEventType#KeyUp:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.KeyUp
+RemovedField: androidx.compose.ui.input.key.KeyEventType#Unknown:
+    Removed enum constant androidx.compose.ui.input.key.KeyEventType.Unknown
+
+
+RemovedMethod: androidx.compose.ui.focus.FocusManager#moveFocus(androidx.compose.ui.focus.FocusDirection):
+    Removed method androidx.compose.ui.focus.FocusManager.moveFocus(androidx.compose.ui.focus.FocusDirection)
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 313e7c8..d35964c 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -236,13 +236,35 @@
     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 enum FocusDirection {
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Down;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Left;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Next;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Previous;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Right;
-    enum_constant public static final androidx.compose.ui.focus.FocusDirection Up;
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown-dhqQ-8s();
+    method public int getIn-dhqQ-8s();
+    method public int getLeft-dhqQ-8s();
+    method public int getNext-dhqQ-8s();
+    method public int getOut-dhqQ-8s();
+    method public int getPrevious-dhqQ-8s();
+    method public int getRight-dhqQ-8s();
+    method public int getUp-dhqQ-8s();
+    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 {
@@ -255,7 +277,7 @@
 
   public interface FocusManager {
     method public void clearFocus(optional boolean forcedClear);
-    method public boolean moveFocus(androidx.compose.ui.focus.FocusDirection focusDirection);
+    method public boolean moveFocus-3ESFkO8(int focusDirection);
   }
 
   public final class FocusModifierKt {
@@ -1219,15 +1241,30 @@
     property public final android.view.KeyEvent nativeKeyEvent;
   }
 
-  public enum KeyEventType {
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyDown;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType KeyUp;
-    enum_constant public static final androidx.compose.ui.input.key.KeyEventType Unknown;
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+    method public static int constructor-impl(int value);
+    method public static inline boolean equals-impl(int p, Object? p1);
+    method public static boolean equals-impl0(int p1, int p2);
+    method public int getValue();
+    method public static inline int hashCode-impl(int p);
+    method public static String toString-impl(int $this);
+    property public final int value;
+    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown-CS__XNY();
+    method public int getKeyUp-CS__XNY();
+    method public int getUnknown-CS__XNY();
+    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-ZmokQxo(android.view.KeyEvent);
-    method public static androidx.compose.ui.input.key.KeyEventType getType-ZmokQxo(android.view.KeyEvent);
+    method public static int getType-ZmokQxo(android.view.KeyEvent);
     method public static int getUtf16CodePoint-ZmokQxo(android.view.KeyEvent);
     method public static boolean isAltPressed-ZmokQxo(android.view.KeyEvent);
     method public static boolean isCtrlPressed-ZmokQxo(android.view.KeyEvent);
@@ -1302,9 +1339,6 @@
     property public final boolean positionChange;
   }
 
-  public final class HitPathTrackerKt {
-  }
-
   public final class MotionEventAdapter_androidKt {
   }
 
@@ -1738,6 +1772,17 @@
 
   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 {
@@ -2088,6 +2133,13 @@
 
 }
 
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
 package androidx.compose.ui.platform.actionmodecallback {
 
   public final class TextActionModeCallback_androidKt {
@@ -2150,6 +2202,26 @@
     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();
@@ -2210,6 +2282,7 @@
     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();
@@ -2224,6 +2297,7 @@
     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;
@@ -2308,13 +2382,17 @@
   }
 
   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.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();
@@ -2331,13 +2409,17 @@
     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.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;
@@ -2364,7 +2446,10 @@
     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);
@@ -2384,13 +2469,17 @@
     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 p);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo p);
     method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String p);
     method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> p);
     method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString p);
diff --git a/compose/ui/ui/benchmark/src/androidTest/AndroidManifest.xml b/compose/ui/ui/benchmark/src/androidTest/AndroidManifest.xml
index 7a944bd..0113871a 100644
--- a/compose/ui/ui/benchmark/src/androidTest/AndroidManifest.xml
+++ b/compose/ui/ui/benchmark/src/androidTest/AndroidManifest.xml
@@ -27,6 +27,6 @@
         <!-- enable profileableByShell for non-intrusive profiling tools -->
         <!--suppress AndroidElementNotAllowed -->
         <profileable android:shell="true"/>
-        <activity android:name="androidx.compose.ui.input.pointer.TestActivity" />
+        <activity android:name="androidx.compose.ui.benchmark.input.pointer.TestActivity" />
     </application>
 </manifest>
diff --git a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
index e865c16..f8cf39f 100644
--- a/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
+++ b/compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/input/pointer/ComposeTapIntegrationBenchmark.kt
@@ -16,31 +16,25 @@
 
 package androidx.compose.ui.benchmark.input.pointer
 
-import android.view.View
-import android.view.ViewGroup
-import androidx.activity.compose.setContent
-import androidx.benchmark.junit4.BenchmarkRule
-import androidx.benchmark.junit4.measureRepeated
 import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Composable
+import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.doFramesUntilNoChangesPending
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
-import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
-import org.junit.Assert
-import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.TimeUnit
 
 /**
  * Benchmark for simply tapping on an item in Compose.
@@ -68,43 +62,9 @@
 @RunWith(AndroidJUnit4::class)
 class ComposeTapIntegrationBenchmark {
 
-    private lateinit var rootView: View
-    private lateinit var expectedLabel: String
-
-    private var itemHeightDp = 0.dp // Is set to correct value during composition.
-    private var actualClickCount = 0
-    private var expectedClickCount = 0
-
     @get:Rule
-    val benchmarkRule = BenchmarkRule()
+    val benchmarkRule = ComposeBenchmarkRule()
 
-    @Suppress("DEPRECATION")
-    @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule(TestActivity::class.java)
-
-    @Before
-    fun setup() {
-        val activity = activityTestRule.activity
-        Assert.assertTrue(
-            "timed out waiting for activity focus",
-            activity.hasFocusLatch.await(5, TimeUnit.SECONDS)
-        )
-
-        rootView = activity.findViewById<ViewGroup>(android.R.id.content)
-
-        activityTestRule.runOnUiThread {
-            activity.setContent {
-                with(LocalDensity.current) {
-                    itemHeightDp = ItemHeightPx.toDp()
-                }
-                App()
-            }
-        }
-    }
-
-    // This test requires more hit test processing so changes to hit testing will be tracked more
-    // by this test.
-    @UiThreadTest
     @Test
     fun clickOnLateItem() {
         // As items that are laid out last are hit tested first (so z order is respected), item
@@ -113,7 +73,6 @@
     }
 
     // This test requires less hit testing so changes to dispatch will be tracked more by this test.
-    @UiThreadTest
     @Test
     fun clickOnEarlyItemFyi() {
         // As items that are laid out last are hit tested first (so z order is respected), item
@@ -123,68 +82,84 @@
     }
 
     private fun clickOnItem(item: Int, expectedLabel: String) {
-
-        this.expectedLabel = expectedLabel
-
         // half height of an item + top of the chosen item = middle of the chosen item
         val y = (ItemHeightPx / 2) + (item * ItemHeightPx)
 
-        val down = MotionEvent(
-            0,
-            android.view.MotionEvent.ACTION_DOWN,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(0f, y)),
-            rootView
-        )
+        benchmarkRule.runBenchmarkFor({ ComposeTapTestCase() }) {
+            doFramesUntilNoChangesPending()
 
-        val up = MotionEvent(
-            10,
-            android.view.MotionEvent.ACTION_UP,
-            1,
-            0,
-            arrayOf(PointerProperties(0)),
-            arrayOf(PointerCoords(0f, y)),
-            rootView
-        )
+            val case = getTestCase()
+            case.expectedLabel = expectedLabel
 
-        benchmarkRule.measureRepeated {
-            rootView.dispatchTouchEvent(down)
-            rootView.dispatchTouchEvent(up)
-            expectedClickCount++
-        }
+            val rootView = getHostView()
 
-        assertThat(actualClickCount).isEqualTo(expectedClickCount)
-    }
+            val down = MotionEvent(
+                0,
+                android.view.MotionEvent.ACTION_DOWN,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(0f, y)),
+                rootView
+            )
 
-    @Composable
-    fun App() {
-        EmailList(NumItems)
-    }
+            val up = MotionEvent(
+                10,
+                android.view.MotionEvent.ACTION_UP,
+                1,
+                0,
+                arrayOf(PointerProperties(0)),
+                arrayOf(PointerCoords(0f, y)),
+                rootView
+            )
 
-    @Composable
-    fun EmailList(count: Int) {
-        Column {
-            repeat(count) { i ->
-                Email("$i")
+            benchmarkRule.measureRepeated {
+                rootView.dispatchTouchEvent(down)
+                rootView.dispatchTouchEvent(up)
+                case.expectedClickCount++
+                assertThat(case.actualClickCount).isEqualTo(case.expectedClickCount)
             }
         }
     }
 
-    @Composable
-    fun Email(label: String) {
-        BasicText(
-            text = label,
-            modifier = Modifier
-                .pointerInput(label) {
-                    detectTapGestures {
-                        assertThat(label).isEqualTo(expectedLabel)
-                        actualClickCount++
-                    }
+    private class ComposeTapTestCase : ComposeTestCase {
+        private var itemHeightDp = 0.dp // Is set to correct value during composition.
+        var actualClickCount = 0
+        var expectedClickCount = 0
+        lateinit var expectedLabel: String
+
+        @Composable
+        override fun Content() {
+            with(LocalDensity.current) {
+                itemHeightDp = ItemHeightPx.toDp()
+            }
+
+            EmailList(NumItems)
+        }
+
+        @Composable
+        fun EmailList(count: Int) {
+            Column {
+                repeat(count) { i ->
+                    Email("$i")
                 }
-                .fillMaxWidth()
-                .requiredHeight(itemHeightDp)
-        )
+            }
+        }
+
+        @Composable
+        fun Email(label: String) {
+            BasicText(
+                text = label,
+                modifier = Modifier
+                    .pointerInput(label) {
+                        detectTapGestures {
+                            assertThat(label).isEqualTo(expectedLabel)
+                            actualClickCount++
+                        }
+                    }
+                    .fillMaxWidth()
+                    .requiredHeight(itemHeightDp)
+            )
+        }
     }
 }
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index 1517399..80bb64e 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -86,9 +86,9 @@
         androidTestImplementation(KOTLIN_COROUTINES_TEST)
         androidTestImplementation(ESPRESSO_CORE)
         androidTestImplementation(JUNIT)
-        androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+        androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
         // DexMaker has it"s own MockMaker
-        androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+        androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
         // DexMaker has it"s own MockMaker
         androidTestImplementation(TRUTH)
         androidTestImplementation(MOCKITO_KOTLIN, {
@@ -190,9 +190,9 @@
                 implementation(KOTLIN_COROUTINES_TEST)
                 implementation(ESPRESSO_CORE)
                 implementation(JUNIT)
-                implementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+                implementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
-                implementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+                implementation(MOCKITO_CORE, excludes.bytebuddy)
                 // DexMaker has it"s own MockMaker
                 implementation(TRUTH)
                 implementation(MOCKITO_KOTLIN, {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
index d434562..b82e2f7 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/FocusManagerMoveFocusDemo.kt
@@ -36,12 +36,12 @@
 import androidx.compose.ui.Alignment.Companion.CenterHorizontally
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusDirection.Down
-import androidx.compose.ui.focus.FocusDirection.Left
-import androidx.compose.ui.focus.FocusDirection.Next
-import androidx.compose.ui.focus.FocusDirection.Previous
-import androidx.compose.ui.focus.FocusDirection.Right
-import androidx.compose.ui.focus.FocusDirection.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Next
+import androidx.compose.ui.focus.FocusDirection.Companion.Previous
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusModifier
 import androidx.compose.ui.focus.focusOrder
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
index 126a3cd..68bff5d 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
@@ -35,7 +35,7 @@
 import androidx.compose.ui.focus.isFocused
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
 import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.input.key.type
 import androidx.compose.ui.input.key.utf16CodePoint
diff --git a/compose/ui/ui/lint-baseline.xml b/compose/ui/ui/lint-baseline.xml
index 39666a2..b77b0bd 100644
--- a/compose/ui/ui/lint-baseline.xml
+++ b/compose/ui/ui/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -15,28 +15,17 @@
     <issue
         id="BanUncheckedReflection"
         message="Calling Method.invoke without an SDK check"
-        errorLine1="            getBooleanMethod?.invoke(null, &quot;debug.layout&quot;, false) as? Boolean ?: false"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt"
-            line="815"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="            updateDisplayListIfDirtyMethod?.invoke(view)"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="                updateDisplayListIfDirtyMethod?.invoke(view)"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt"
-            line="288"
-            column="13"/>
+            line="315"
+            column="17"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.autofill.AndroidAutofillDebugUtils_androidKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.autofill.AndroidAutofillDebugUtils_androidKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    autofillManager.registerCallback(AutofillCallback)"
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.autofill.AndroidAutofillDebugUtils_androidKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.compose.ui.autofill.AndroidAutofillDebugUtils_androidKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    autofillManager.unregisterCallback(AutofillCallback)"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,19 +46,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.res.ColorResources_androidKt is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.compose.ui.res.ColorResources_androidKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        Color(context.resources.getColor(id, context.theme))"
         errorLine2="                                ~~~~~~~~">
         <location
             file="src/androidMain/kotlin/androidx/compose/ui/res/ColorResources.android.kt"
-            line="35"
+            line="37"
             column="33"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.platform.actionmodecallback.FloatingTextActionModeCallback is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.compose.ui.platform.actionmodecallback.FloatingTextActionModeCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1=") : ActionMode.Callback2() {"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -78,4 +67,26 @@
             column="5"/>
     </issue>
 
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.input.pointer.MotionEventAdapter_androidKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="    return Offset(getRawX(index), getRawY(index))"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt"
+            line="191"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.compose.ui.input.pointer.MotionEventAdapter_androidKt is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="    return Offset(getRawX(index), getRawY(index))"
+        errorLine2="                                  ~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt"
+            line="191"
+            column="35"/>
+    </issue>
+
 </issues>
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
new file mode 100644
index 0000000..f01d362
--- /dev/null
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/FocusSamples.kt
@@ -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.compose.ui.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.material.Button
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusDirection
+import androidx.compose.ui.platform.LocalFocusManager
+
+@Sampled
+@Composable
+fun MoveFocusSample() {
+    val focusManager = LocalFocusManager.current
+    Column {
+        Row {
+            Box(Modifier.focusable())
+            Box(Modifier.focusable())
+        }
+        Row {
+            Box(Modifier.focusable())
+            Box(Modifier.focusable())
+        }
+        Button(onClick = { focusManager.moveFocus(FocusDirection.Right) }) { Text("Right") }
+        Button(onClick = { focusManager.moveFocus(FocusDirection.Left) }) { Text("Left") }
+        Button(onClick = { focusManager.moveFocus(FocusDirection.Up) }) { Text("Up") }
+        Button(onClick = { focusManager.moveFocus(FocusDirection.Down) }) { Text("Down") }
+    }
+}
\ 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 837f607..65bb050 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
@@ -55,6 +55,9 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.toAndroidRect
+import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.platform.AndroidComposeView
 import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat
 import androidx.compose.ui.platform.LocalDensity
@@ -62,9 +65,11 @@
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsNode
 import androidx.compose.ui.semantics.SemanticsProperties
 import androidx.compose.ui.semantics.clearAndSetSemantics
 import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.getOrNull
 import androidx.compose.ui.semantics.paneTitle
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
@@ -465,14 +470,18 @@
         val data = info.extras
             .getParcelableArray(AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
         assertEquals(1, data!!.size)
-        val rectF = data[0] as RectF
-        val expectedRect = textLayoutResult.getBoundingBox(0).translate(
+
+        val rectF = data[0] as RectF // result in screen coordinates
+        val expectedRectInLocalCoords = textLayoutResult.getBoundingBox(0).translate(
             textFieldNode.positionInWindow
         )
-        assertEquals(expectedRect.left, rectF.left)
-        assertEquals(expectedRect.top, rectF.top)
-        assertEquals(expectedRect.right, rectF.right)
-        assertEquals(expectedRect.bottom, rectF.bottom)
+        val expectedTopLeftInScreenCoords = androidComposeView.localToScreen(
+            expectedRectInLocalCoords.toAndroidRect().topLeftToOffset()
+        )
+        assertEquals(expectedTopLeftInScreenCoords.x, rectF.left)
+        assertEquals(expectedTopLeftInScreenCoords.y, rectF.top)
+        assertEquals(expectedRectInLocalCoords.width, rectF.width())
+        assertEquals(expectedRectInLocalCoords.height, rectF.height())
     }
 
     // This test needs to be improved after text merging(b/157474582) is fixed.
@@ -507,14 +516,18 @@
         val data = info.extras
             .getParcelableArray(AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY)
         assertEquals(length, data!!.size)
-        val rectF = data[0] as RectF
-        val expectedRect = textLayoutResult.getBoundingBox(0).translate(
+
+        val rectF = data[0] as RectF // result in screen coordinates
+        val expectedRectInLocalCoords = textLayoutResult.getBoundingBox(0).translate(
             textNode.positionInWindow
         )
-        assertEquals(expectedRect.left, rectF.left)
-        assertEquals(expectedRect.top, rectF.top)
-        assertEquals(expectedRect.right, rectF.right)
-        assertEquals(expectedRect.bottom, rectF.bottom)
+        val expectedTopLeftInScreenCoords = androidComposeView.localToScreen(
+            expectedRectInLocalCoords.toAndroidRect().topLeftToOffset()
+        )
+        assertEquals(expectedTopLeftInScreenCoords.x, rectF.left)
+        assertEquals(expectedTopLeftInScreenCoords.y, rectF.top)
+        assertEquals(expectedRectInLocalCoords.width, rectF.width())
+        assertEquals(expectedRectInLocalCoords.height, rectF.height())
     }
 
     @Test
@@ -681,8 +694,7 @@
     }
 
     @Test
-    @Ignore("b/178524529")
-    fun traverseEventBeforeSelectionEvent_whenTraverseTextField() {
+    fun selectionEventBeforeTraverseEvent_whenTraverseTextField() {
         val tag = "TextFieldTag"
         val text = "h"
         container.setContent {
@@ -702,54 +714,62 @@
         val textFieldNode = rule.onNodeWithTag(tag)
             .assertIsDisplayed()
             .fetchSemanticsNode("couldn't find node with tag $tag")
-
         waitForSubtreeEventToSend()
-        val args = Bundle()
-        args.putInt(
-            AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
-            AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
-        )
-        args.putBoolean(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, false)
-        val provider = delegate.getAccessibilityNodeProvider(androidComposeView).provider as
-            AccessibilityNodeProvider
-        provider.performAction(
-            textFieldNode.id,
-            AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
-            args
-        )
+        rule.runOnUiThread {
+            provider.performAction(
+                textFieldNode.id,
+                AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
+                createMovementGranularityCharacterArgs()
+            )
+        }
 
-        val selectionEvent = delegate.createEvent(
-            textFieldNode.id,
-            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
-        )
-        selectionEvent.fromIndex = text.length
-        selectionEvent.toIndex = text.length
-        selectionEvent.itemCount = text.length
-        selectionEvent.text.add(text)
-
-        val traverseEvent = delegate.createEvent(
-            textFieldNode.id,
-            AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
-        )
-        traverseEvent.fromIndex = 0
-        traverseEvent.toIndex = 1
-        traverseEvent.action = AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
-        traverseEvent.movementGranularity =
-            AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
-        traverseEvent.text.add(text)
-
+        val selectionEvent = createSelectionChangedFromIndexOneToOneEvent(textFieldNode)
+        val traverseEvent = createCharacterTraverseFromIndexZeroEvent(textFieldNode)
         rule.runOnIdle {
             verify(container, atLeastOnce()).requestSendAccessibilityEvent(
                 eq(androidComposeView), argument.capture()
             )
             val values = argument.allValues
-            // Note right now the event ordering is incorrect. The ordering in test needs to be
-            // changed when the event ordering if fixed.
             val traverseEventIndex = eventIndex(values, traverseEvent)
             val selectionEventIndex = eventIndex(values, selectionEvent)
             assertNotEquals(-1, traverseEventIndex)
             assertNotEquals(-1, selectionEventIndex)
-            assertTrue(traverseEventIndex < selectionEventIndex)
+            assertTrue(traverseEventIndex > selectionEventIndex)
+        }
+    }
+
+    @Test
+    fun selectionEventBeforeTraverseEvent_whenTraverseText() {
+        val tag = "TextTag"
+        val text = "h"
+        container.setContent {
+            BasicText(text, Modifier.testTag(tag))
+        }
+
+        val textNode = rule.onNodeWithTag(tag)
+            .assertIsDisplayed()
+            .fetchSemanticsNode("couldn't find node with tag $tag")
+        waitForSubtreeEventToSend()
+        rule.runOnUiThread {
+            provider.performAction(
+                textNode.id,
+                AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY,
+                createMovementGranularityCharacterArgs()
+            )
+        }
+
+        val selectionEvent = createSelectionChangedFromIndexOneToOneEvent(textNode)
+        val traverseEvent = createCharacterTraverseFromIndexZeroEvent(textNode)
+        rule.runOnIdle {
+            verify(container, atLeastOnce()).requestSendAccessibilityEvent(
+                eq(androidComposeView), argument.capture()
+            )
+            val values = argument.allValues
+            val traverseEventIndex = eventIndex(values, traverseEvent)
+            val selectionEventIndex = eventIndex(values, selectionEvent)
+            assertNotEquals(-1, traverseEventIndex)
+            assertNotEquals(-1, selectionEventIndex)
+            assertTrue(traverseEventIndex > selectionEventIndex)
         }
     }
 
@@ -1337,6 +1357,87 @@
     }
 
     @Test
+    fun testLayerParamChange_setCorrectBounds_syntaxOne() {
+        var scale by mutableStateOf(1f)
+        container.setContent {
+            // testTag must not be on the same node with graphicsLayer, otherwise we will have
+            // semantics change notification.
+            Box(Modifier.graphicsLayer(scaleX = scale, scaleY = scale).requiredSize(300.dp)) {
+                Box(Modifier.matchParentSize().testTag("node"))
+            }
+        }
+
+        val node = rule.onNodeWithTag("node").fetchSemanticsNode()
+        var info: AccessibilityNodeInfo = AccessibilityNodeInfo.obtain()
+        rule.runOnUiThread {
+            info = provider.createAccessibilityNodeInfo(node.id)
+        }
+        with(rule.density) {
+            val size = 300.dp.roundToPx()
+            val rect = Rect()
+            info.getBoundsInScreen(rect)
+            assertEquals(size, rect.width())
+            assertEquals(size, rect.height())
+        }
+
+        scale = 0.5f
+        info.recycle()
+        rule.runOnIdle {
+            info = provider.createAccessibilityNodeInfo(node.id)
+        }
+        with(rule.density) {
+            val size = 150.dp.roundToPx()
+            val rect = Rect()
+            info.getBoundsInScreen(rect)
+            assertEquals(size, rect.width())
+            assertEquals(size, rect.height())
+        }
+    }
+
+    @Test
+    fun testLayerParamChange_setCorrectBounds_syntaxTwo() {
+        var scale by mutableStateOf(1f)
+        container.setContent {
+            // testTag must not be on the same node with graphicsLayer, otherwise we will have
+            // semantics change notification.
+            Box(
+                Modifier.graphicsLayer {
+                    scaleX = scale
+                    scaleY = scale
+                }.requiredSize(300.dp)
+            ) {
+                Box(Modifier.matchParentSize().testTag("node"))
+            }
+        }
+
+        val node = rule.onNodeWithTag("node").fetchSemanticsNode()
+        var info: AccessibilityNodeInfo = AccessibilityNodeInfo.obtain()
+        rule.runOnUiThread {
+            info = provider.createAccessibilityNodeInfo(node.id)
+        }
+        with(rule.density) {
+            val size = 300.dp.roundToPx()
+            val rect = Rect()
+            info.getBoundsInScreen(rect)
+            assertEquals(size, rect.width())
+            assertEquals(size, rect.height())
+        }
+
+        scale = 0.5f
+        info.recycle()
+        rule.runOnIdle {
+            info = provider.createAccessibilityNodeInfo(node.id)
+        }
+        with(rule.density) {
+            val size = 150.dp.roundToPx()
+            val rect = Rect()
+            info.getBoundsInScreen(rect)
+            assertEquals(size, rect.width())
+            assertEquals(size, rect.height())
+        }
+    }
+
+    @Test
     fun testDialog_setCorrectBounds() {
         var dialogComposeView: AndroidComposeView? = null
         container.setContent {
@@ -1370,10 +1471,10 @@
             val textPositionOnScreenX = viewPosition[0] + offset
             val textPositionOnScreenY = viewPosition[1] + offset
 
-            val textRect = android.graphics.Rect()
+            val textRect = Rect()
             info.getBoundsInScreen(textRect)
             assertEquals(
-                android.graphics.Rect(
+                Rect(
                     textPositionOnScreenX,
                     textPositionOnScreenY,
                     textPositionOnScreenX + size,
@@ -1657,15 +1758,19 @@
     @Test
     fun testReportedBounds_withOffset() {
         val size = 100.dp
+        val offset = 10.dp
+        val density = Density(1f)
         container.setContent {
-            Column {
-                Box(
-                    Modifier
-                        .size(size)
-                        .offset(10.dp, 10.dp)
-                        .testTag("tag")
-                        .semantics { contentDescription = "Test" }
-                )
+            CompositionLocalProvider(LocalDensity provides density) {
+                Column {
+                    Box(
+                        Modifier
+                            .size(size)
+                            .offset(offset, offset)
+                            .testTag("tag")
+                            .semantics { contentDescription = "Test" }
+                    )
+                }
             }
         }
 
@@ -1676,12 +1781,35 @@
         accessibilityNodeInfo.getBoundsInScreen(rect)
         val resultWidth = rect.right - rect.left
         val resultHeight = rect.bottom - rect.top
+        val resultInLocalCoords = androidComposeView.screenToLocal(rect.topLeftToOffset())
 
-        with(rule.density) {
+        with(density) {
             assertEquals(size.roundToPx(), resultWidth)
             assertEquals(size.roundToPx(), resultHeight)
-            assertEquals(10.dp.roundToPx(), rect.left)
-            assertEquals(10.dp.roundToPx(), rect.top)
+            assertEquals(10.dp.toPx(), resultInLocalCoords.x)
+            assertEquals(10.dp.toPx(), resultInLocalCoords.y)
+        }
+    }
+
+    @Test
+    fun testSemanticsNodePositionAndBounds_doesNotThrow_whenLayoutNodeNotAttached() {
+        var emitNode by mutableStateOf(true)
+        rule.setContent {
+            if (emitNode) {
+                Box(Modifier.size(100.dp).testTag("tag"))
+            }
+        }
+
+        val semanticNode = rule.onNodeWithTag("tag").fetchSemanticsNode()
+        rule.runOnIdle {
+            emitNode = false
+        }
+
+        rule.runOnIdle {
+            assertEquals(Offset.Zero, semanticNode.positionInRoot)
+            assertEquals(Offset.Zero, semanticNode.positionInWindow)
+            assertEquals(androidx.compose.ui.geometry.Rect.Zero, semanticNode.boundsInRoot)
+            assertEquals(androidx.compose.ui.geometry.Rect.Zero, semanticNode.boundsInWindow)
         }
     }
 
@@ -1717,4 +1845,57 @@
         rule.mainClock.advanceTimeBy(5000)
         rule.waitForIdle()
     }
+
+    private fun createMovementGranularityCharacterArgs(): Bundle {
+        return Bundle().apply {
+            this.putInt(
+                AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
+                AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
+            )
+            this.putBoolean(
+                AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
+                false
+            )
+        }
+    }
+
+    private fun createSelectionChangedFromIndexOneToOneEvent(
+        textNode: SemanticsNode
+    ): AccessibilityEvent {
+        return delegate.createEvent(
+            textNode.id,
+            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
+        ).apply {
+            this.fromIndex = 1
+            this.toIndex = 1
+            getTraversedText(textNode)?.let {
+                this.itemCount = it.length
+                this.text.add(it)
+            }
+        }
+    }
+
+    private fun createCharacterTraverseFromIndexZeroEvent(
+        textNode: SemanticsNode
+    ): AccessibilityEvent {
+        return delegate.createEvent(
+            textNode.id,
+            AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
+        ).apply {
+            this.fromIndex = 0
+            this.toIndex = 1
+            this.action = AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
+            this.movementGranularity = AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
+            getTraversedText(textNode)?.let { this.text.add(it) }
+        }
+    }
+
+    private fun getTraversedText(textNode: SemanticsNode): String? {
+        return (
+            textNode.config.getOrNull(SemanticsProperties.EditableText)
+                ?: textNode.config.getOrNull(SemanticsProperties.Text)
+            )?.text
+    }
 }
+
+private fun Rect.topLeftToOffset() = Offset(this.left.toFloat(), this.top.toFloat())
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
index 74117be..653c6ca 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
@@ -1,3 +1,4 @@
+
 /*
  * Copyright 2020 The Android Open Source Project
  *
@@ -23,10 +24,7 @@
 import android.view.accessibility.AccessibilityNodeInfo
 import android.widget.FrameLayout
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.foundation.selection.selectableGroup
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
@@ -62,6 +60,7 @@
 import androidx.compose.ui.semantics.heading
 import androidx.compose.ui.semantics.horizontalScrollAxisRange
 import androidx.compose.ui.semantics.liveRegion
+import androidx.compose.ui.semantics.error
 import androidx.compose.ui.semantics.onClick
 import androidx.compose.ui.semantics.onLongClick
 import androidx.compose.ui.semantics.pasteText
@@ -499,6 +498,31 @@
     }
 
     @Test
+    fun testPopulateAccessibilityNodeInfoProperties_setContentInvalid_customDescription() {
+        val errorDescription = "Invalid format"
+        val semanticsNode = createSemanticsNodeWithProperties(1, true) {
+            error(errorDescription)
+        }
+
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, semanticsNode)
+
+        assertTrue(info.isContentInvalid)
+        assertEquals(errorDescription, info.error)
+    }
+
+    @Test
+    fun testPopulateAccessibilityNodeInfoProperties_setContentInvalid_emptyDescription() {
+        val semanticsNode = createSemanticsNodeWithProperties(1, true) {
+            error("")
+        }
+
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, semanticsNode)
+
+        assertTrue(info.isContentInvalid)
+        assertTrue(info.error.isEmpty())
+    }
+
+    @Test
     fun test_PasteAction_ifFocused() {
         rule.setContent {
             LocalClipboardManager.current.setText(AnnotatedString("test"))
@@ -821,46 +845,6 @@
     }
 
     @Test
-    fun testCollectionItemInfo() {
-        rule.setContent {
-            Column(Modifier.selectableGroup()) {
-                Box(Modifier.selectable(selected = true, onClick = {}).testTag("item"))
-                Box(Modifier.selectable(selected = false, onClick = {}))
-            }
-        }
-        val itemNode = rule.onNodeWithTag("item").fetchSemanticsNode()
-        accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, itemNode)
-
-        val resultCollectionItemInfo = info.collectionItemInfo
-        assertEquals(0, resultCollectionItemInfo.rowIndex)
-        assertEquals(1, resultCollectionItemInfo.rowSpan)
-        assertEquals(0, resultCollectionItemInfo.columnIndex)
-        assertEquals(1, resultCollectionItemInfo.columnSpan)
-        assertEquals(true, resultCollectionItemInfo.isSelected)
-    }
-
-    @Test
-    fun testCollectionInfo() {
-        rule.setContent {
-            Column(Modifier.selectableGroup().testTag("collection")) {
-                Box(Modifier.size(50.dp).selectable(selected = true, onClick = {}))
-                Box(Modifier.size(50.dp).selectable(selected = false, onClick = {}))
-            }
-        }
-        val collectionNode = rule.onNodeWithTag("collection").fetchSemanticsNode()
-        accessibilityDelegate.populateAccessibilityNodeInfoProperties(1, info, collectionNode)
-
-        val resultCollectionInfo = info.collectionInfo
-        assertEquals(2, resultCollectionInfo.rowCount)
-        assertEquals(1, resultCollectionInfo.columnCount)
-        assertEquals(false, resultCollectionInfo.isHierarchical)
-        assertEquals(
-            AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_SINGLE,
-            resultCollectionInfo.selectionMode
-        )
-    }
-
-    @Test
     fun testSemanticsNodePositionAndBounds_doesNotThrow_whenLayoutNodeNotAttached() {
         var emitNode by mutableStateOf(true)
         rule.setContent {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt
new file mode 100644
index 0000000..d14771c
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/accessibility/CollectionInfoTest.kt
@@ -0,0 +1,297 @@
+/*
+ * 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.accessibility
+
+import android.view.ViewGroup
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.foundation.selection.selectable
+import androidx.compose.foundation.selection.selectableGroup
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.OpenComposeView
+import androidx.compose.ui.platform.AndroidComposeView
+import androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.CollectionInfo
+import androidx.compose.ui.semantics.CollectionItemInfo
+import androidx.compose.ui.semantics.collectionInfo
+import androidx.compose.ui.semantics.collectionItemInfo
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.unit.dp
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.After
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class CollectionInfoTest {
+    @get:Rule
+    val rule = createAndroidComposeRule<TestActivity>()
+
+    private lateinit var accessibilityDelegate: AndroidComposeViewAccessibilityDelegateCompat
+    private lateinit var info: AccessibilityNodeInfoCompat
+
+    @Before
+    fun setup() {
+        val container = OpenComposeView(rule.activity)
+
+        rule.runOnUiThread {
+            rule.activity.setContentView(
+                container,
+                ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.WRAP_CONTENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
+            )
+        }
+
+        val composeView = container.getChildAt(0) as AndroidComposeView
+        accessibilityDelegate = AndroidComposeViewAccessibilityDelegateCompat(composeView).apply {
+            accessibilityForceEnabledForTesting = true
+        }
+        info = AccessibilityNodeInfoCompat.obtain()
+    }
+
+    @After
+    fun cleanup() {
+        info.recycle()
+    }
+
+    // Collection Info tests
+    @Test
+    fun testCollectionInfo_withSelectableGroup() {
+        rule.setContent {
+            Column(Modifier.selectableGroup().testTag("collection")) {
+                Box(Modifier.size(50.dp).selectable(selected = true, onClick = {}))
+                Box(Modifier.size(50.dp).selectable(selected = false, onClick = {}))
+            }
+        }
+        val collectionNode = rule.onNodeWithTag("collection").fetchSemanticsNode()
+        accessibilityDelegate
+            .populateAccessibilityNodeInfoProperties(collectionNode.id, info, collectionNode)
+
+        val resultCollectionInfo = info.collectionInfo
+        Assert.assertEquals(2, resultCollectionInfo.rowCount)
+        Assert.assertEquals(1, resultCollectionInfo.columnCount)
+        Assert.assertEquals(false, resultCollectionInfo.isHierarchical)
+    }
+
+    @Test
+    fun testDefaultCollectionInfo_lazyList() {
+        val tag = "LazyColumn"
+        rule.setContent {
+            LazyColumn(Modifier.testTag(tag)) {
+                items(2) { BasicText("Text") }
+            }
+        }
+
+        val itemNode = rule.onNodeWithTag(tag).fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionInfo = info.collectionInfo
+        Assert.assertEquals(-1, resultCollectionInfo.rowCount)
+        Assert.assertEquals(1, resultCollectionInfo.columnCount)
+        Assert.assertEquals(false, resultCollectionInfo.isHierarchical)
+    }
+
+    @Test
+    fun testCollectionInfo_lazyList() {
+        val tag = "LazyColumn"
+        rule.setContent {
+            LazyColumn(
+                Modifier
+                    .testTag(tag)
+                    .semantics { collectionInfo = CollectionInfo(2, 1) }
+            ) {
+                items(2) { BasicText("Text") }
+            }
+        }
+
+        val itemNode = rule.onNodeWithTag(tag).fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionInfo = info.collectionInfo
+        Assert.assertEquals(2, resultCollectionInfo.rowCount)
+        Assert.assertEquals(1, resultCollectionInfo.columnCount)
+        Assert.assertEquals(false, resultCollectionInfo.isHierarchical)
+    }
+
+    @Test
+    fun testCollectionInfo_withSelectableGroup_andDefaultLazyListSemantics() {
+        val tag = "LazyColumn"
+        rule.setContent {
+            LazyColumn(Modifier.testTag(tag).selectableGroup()) {
+                items(2) { BasicText("Text") }
+            }
+        }
+
+        val itemNode = rule.onNodeWithTag(tag).fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionInfo = info.collectionInfo
+        Assert.assertEquals(-1, resultCollectionInfo.rowCount)
+        Assert.assertEquals(1, resultCollectionInfo.columnCount)
+        Assert.assertEquals(false, resultCollectionInfo.isHierarchical)
+    }
+
+    @Test
+    fun testCollectionInfo_withSelectableGroup_andLazyListSemantics() {
+        val tag = "LazyColumn"
+        rule.setContent {
+            LazyColumn(
+                Modifier
+                    .testTag(tag)
+                    .selectableGroup()
+                    .semantics { collectionInfo = CollectionInfo(2, 1) }
+            ) {
+                items(2) { BasicText("Text") }
+            }
+        }
+
+        val itemNode = rule.onNodeWithTag(tag).fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionInfo = info.collectionInfo
+        Assert.assertEquals(2, resultCollectionInfo.rowCount)
+        Assert.assertEquals(1, resultCollectionInfo.columnCount)
+        Assert.assertEquals(false, resultCollectionInfo.isHierarchical)
+    }
+
+    // Collection Item Info tests
+    @Test
+    fun testCollectionItemInfo_withSelectableGroup() {
+        rule.setContent {
+            Column(Modifier.selectableGroup()) {
+                Box(Modifier.selectable(selected = true, onClick = {}).testTag("item"))
+                Box(Modifier.selectable(selected = false, onClick = {}))
+            }
+        }
+
+        val itemNode = rule.onNodeWithTag("item").fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionItemInfo = info.collectionItemInfo
+        Assert.assertEquals(0, resultCollectionItemInfo.rowIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.rowSpan)
+        Assert.assertEquals(0, resultCollectionItemInfo.columnIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.columnSpan)
+        Assert.assertEquals(true, resultCollectionItemInfo.isSelected)
+    }
+
+    @Test
+    fun testNoCollectionItemInfo_lazyList() {
+        rule.setContent {
+            LazyColumn {
+                itemsIndexed(listOf("Text", "Text")) { index, item -> BasicText(item + index) }
+            }
+        }
+
+        val itemNode = rule.onNodeWithText("Text0").fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        Assert.assertNull(info.collectionItemInfo)
+    }
+
+    @Test
+    fun testCollectionItemInfo_defaultLazyListSemantics() {
+        rule.setContent {
+            LazyColumn {
+                itemsIndexed(listOf("Text", "Text")) { index, item ->
+                    BasicText(
+                        item + index,
+                        Modifier.semantics {
+                            collectionItemInfo = CollectionItemInfo(index, 1, 0, 1)
+                        }
+                    )
+                }
+            }
+        }
+
+        val itemNode = rule.onNodeWithText("Text0").fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionItemInfo = info.collectionItemInfo
+        Assert.assertEquals(0, resultCollectionItemInfo.rowIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.rowSpan)
+        Assert.assertEquals(0, resultCollectionItemInfo.columnIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.columnSpan)
+    }
+
+    @Test
+    fun testCollectionItemInfo_lazyList() {
+        rule.setContent {
+            LazyColumn(Modifier.semantics { collectionInfo = CollectionInfo(2, 1) }) {
+                itemsIndexed(listOf("Text", "Text")) { index, item ->
+                    BasicText(
+                        item + index,
+                        Modifier.semantics {
+                            collectionItemInfo = CollectionItemInfo(index, 1, 0, 1)
+                        }
+                    )
+                }
+            }
+        }
+
+        val itemNode = rule.onNodeWithText("Text0").fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionItemInfo = info.collectionItemInfo
+        Assert.assertEquals(0, resultCollectionItemInfo.rowIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.rowSpan)
+        Assert.assertEquals(0, resultCollectionItemInfo.columnIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.columnSpan)
+    }
+
+    @Test
+    fun testCollectionItemInfo_withSelectableGroup_andDefaultLazyListSemantics() {
+        rule.setContent {
+            LazyColumn(Modifier.selectableGroup()) {
+                itemsIndexed(listOf("Text", "Text")) { index, item ->
+                    BasicText(
+                        item + index,
+                        Modifier.semantics {
+                            collectionItemInfo = CollectionItemInfo(index, 1, 0, 1)
+                        }
+                    )
+                }
+            }
+        }
+
+        val itemNode = rule.onNodeWithText("Text0").fetchSemanticsNode()
+        accessibilityDelegate.populateAccessibilityNodeInfoProperties(itemNode.id, info, itemNode)
+
+        val resultCollectionItemInfo = info.collectionItemInfo
+        Assert.assertEquals(0, resultCollectionItemInfo.rowIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.rowSpan)
+        Assert.assertEquals(0, resultCollectionItemInfo.columnIndex)
+        Assert.assertEquals(1, resultCollectionItemInfo.columnSpan)
+    }
+}
\ No newline at end of file
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 d389b61..d3805e3 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
@@ -16,14 +16,15 @@
 
 package androidx.compose.ui.focus
 
-import androidx.compose.ui.focus.FocusDirectionInternal.Down
-import androidx.compose.ui.focus.FocusDirectionInternal.In
-import androidx.compose.ui.focus.FocusDirectionInternal.Left
-import androidx.compose.ui.focus.FocusDirectionInternal.Next
-import androidx.compose.ui.focus.FocusDirectionInternal.Out
-import androidx.compose.ui.focus.FocusDirectionInternal.Previous
-import androidx.compose.ui.focus.FocusDirectionInternal.Right
-import androidx.compose.ui.focus.FocusDirectionInternal.Up
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+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.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.input.key.Key
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.nativeKeyCode
@@ -137,6 +138,7 @@
         val focusDirection = owner.getFocusDirection(keyEvent)
 
         // Assert.
+        @OptIn(ExperimentalComposeUiApi::class)
         assertThat(focusDirection).isEqualTo(In)
     }
 
@@ -149,6 +151,7 @@
         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/focus/SetRootFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
index 07efd25..1e3b648 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/SetRootFocusTest.kt
@@ -71,20 +71,16 @@
         }
         rule.onNodeWithTag(focusable).performClick()
         rule.waitForIdle()
-        focusChanged.await(10, SECONDS)
-        rule.runOnIdle {
-            assertThat(isFocused).isTrue()
-            focusChanged = CountDownLatch(1)
-        }
+        focusChanged.await(1, SECONDS)
+        rule.runOnIdle { assertThat(isFocused).isTrue() }
+        focusChanged = CountDownLatch(1)
 
         // Act.
         rule.onNodeWithTag(nonFocusable).performClick()
 
         // Assert.
         rule.waitForIdle()
-        focusChanged.await(10, SECONDS)
-        rule.runOnIdle {
-            assertThat(isFocused).isFalse()
-        }
+        focusChanged.await(1, SECONDS)
+        rule.runOnIdle { assertThat(isFocused).isFalse() }
     }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInTest.kt
index b758a44..a8d6b64 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInTest.kt
@@ -20,6 +20,7 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.focus.FocusDirection.Companion.In
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -56,7 +57,7 @@
         }
 
         // Act.
-        focusManager.moveFocusIn()
+        focusManager.moveFocus(In)
 
         // Assert.
         rule.runOnIdle {
@@ -84,7 +85,7 @@
         }
 
         // Act.
-        focusManager.moveFocusIn()
+        focusManager.moveFocus(In)
 
         // Assert.
         rule.runOnIdle {
@@ -117,7 +118,7 @@
         }
 
         // Act.
-        focusManager.moveFocusIn()
+        focusManager.moveFocus(In)
 
         // Assert.
         rule.runOnIdle {
@@ -156,7 +157,7 @@
         }
 
         // Act.
-        focusManager.moveFocusIn()
+        focusManager.moveFocus(In)
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
index b9cdd1a..2980541 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalInitialFocusTest.kt
@@ -25,10 +25,10 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusDirection.Down
-import androidx.compose.ui.focus.FocusDirection.Left
-import androidx.compose.ui.focus.FocusDirection.Right
-import androidx.compose.ui.focus.FocusDirection.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -43,14 +43,16 @@
 
 @MediumTest
 @RunWith(Parameterized::class)
-class TwoDimensionalFocusTraversalInitialFocusTest(private val focusDirection: FocusDirection) {
+class TwoDimensionalFocusTraversalInitialFocusTest(focusDirectionInt: Int) {
     @get:Rule
     val rule = createComposeRule()
 
+    private val focusDirection = FocusDirection(focusDirectionInt)
+
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun initParameters() = listOf(Left, Right, Up, Down)
+        fun initParameters() = listOf(Left, Right, Up, Down).map { it.value }
     }
 
     @Test
@@ -93,7 +95,7 @@
     @Test
     fun initialFocus_whenThereIsOnlyOneFocusable() {
         // Arrange.
-        var isFocused = mutableStateOf(false)
+        val isFocused = mutableStateOf(false)
         lateinit var view: View
         lateinit var focusManager: FocusManager
         rule.setContent {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalOutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalOutTest.kt
index 671cd23..9af59e7 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalOutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalOutTest.kt
@@ -19,10 +19,11 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.focus.FocusDirection.Down
-import androidx.compose.ui.focus.FocusDirection.Left
-import androidx.compose.ui.focus.FocusDirection.Right
-import androidx.compose.ui.focus.FocusDirection.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Out
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -57,7 +58,7 @@
         }
 
         // Act.
-        focusManager.moveFocusOut()
+        focusManager.moveFocus(Out)
 
         // Assert.
         rule.runOnIdle {
@@ -84,7 +85,7 @@
         }
 
         // Act.
-        focusManager.moveFocusOut()
+        focusManager.moveFocus(Out)
 
         // Assert.
         rule.runOnIdle {
@@ -117,7 +118,7 @@
         }
 
         // Act.
-        focusManager.moveFocusOut()
+        focusManager.moveFocus(Out)
 
         // Assert.
         rule.runOnIdle {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
index 603bca7..faef106 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalThreeItemsTest.kt
@@ -18,10 +18,10 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.focus.FocusDirection.Down
-import androidx.compose.ui.focus.FocusDirection.Left
-import androidx.compose.ui.focus.FocusDirection.Right
-import androidx.compose.ui.focus.FocusDirection.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -36,17 +36,18 @@
 private const val invalid = "Not applicable to a 2D focus search."
 
 @RunWith(Parameterized::class)
-class TwoDimensionalFocusTraversalThreeItemsTest(private val focusDirection: FocusDirection) {
+class TwoDimensionalFocusTraversalThreeItemsTest(focusDirectionInt: Int) {
     @get:Rule
     val rule = createComposeRule()
 
     private lateinit var focusManager: FocusManager
     private val initialFocus: FocusRequester = FocusRequester()
+    private val focusDirection = FocusDirection(focusDirectionInt)
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "direction={0}")
-        fun initParameters() = listOf(Left, Right, Up, Down)
+        @Parameterized.Parameters(name = "{0}")
+        fun initParameters() = listOf(Left, Right, Up, Down).map { it.value }
     }
 
     /**
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
index 067199a..c5459ce 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusTraversalTwoItemsTest.kt
@@ -19,10 +19,10 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.focus.FocusDirection.Down
-import androidx.compose.ui.focus.FocusDirection.Left
-import androidx.compose.ui.focus.FocusDirection.Right
-import androidx.compose.ui.focus.FocusDirection.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.test.junit4.ComposeContentTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
@@ -37,7 +37,7 @@
 private const val invalid = "Not applicable to a 2D focus search."
 
 @RunWith(Parameterized::class)
-class TwoDimensionalFocusTraversalTwoItemsTest(private val focusDirection: FocusDirection) {
+class TwoDimensionalFocusTraversalTwoItemsTest(focusDirectionInt: Int) {
     @get:Rule
     val rule = createComposeRule()
 
@@ -45,11 +45,12 @@
     private val initialFocus: FocusRequester = FocusRequester()
     private val focusedItem = mutableStateOf(false)
     private val candidate = mutableStateOf(false)
+    private val focusDirection = FocusDirection(focusDirectionInt)
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "direction={0}")
-        fun initParameters() = listOf(Left, Right, Up, Down)
+        @Parameterized.Parameters(name = "{0}")
+        fun initParameters() = listOf(Left, Right, Up, Down).map { it.value }
     }
 
     /**
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
index 750100f..085ecbd 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/AndroidProcessKeyInputTest.kt
@@ -27,8 +27,8 @@
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.setFocusableContent
 import androidx.compose.ui.input.key.Key.Companion.A
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
-import androidx.compose.ui.input.key.KeyEventType.KeyUp
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.test.filters.SmallTest
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
index d719480..7aad0ba 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/key/ProcessKeyInputTest.kt
@@ -27,9 +27,8 @@
 import android.view.KeyEvent.ACTION_DOWN
 import android.view.KeyEvent.ACTION_UP
 import androidx.compose.ui.input.key.Key.Companion.A
-import androidx.compose.ui.input.key.KeyEventType.KeyUp
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
-import androidx.compose.ui.input.key.KeyEventType.Unknown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onRoot
 import androidx.compose.ui.test.performKeyPress
@@ -400,7 +399,7 @@
         val action = when (keyEventType) {
             KeyDown -> ACTION_DOWN
             KeyUp -> ACTION_UP
-            Unknown -> error("Unknown key event type")
+            else -> error("Unknown key event type")
         }
         return KeyEvent(AndroidKeyEvent(0L, 0L, action, keycode, 0, 0))
     }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
index 629dae5..bd43161 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/AndroidPointerInputTest.kt
@@ -22,12 +22,16 @@
 import android.view.ViewGroup
 import androidx.activity.ComponentActivity
 import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.wrapContentSize
 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.runtime.snapshots.Snapshot
+import androidx.compose.ui.AbsoluteAlignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.OpenComposeView
 import androidx.compose.ui.composed
@@ -181,18 +185,20 @@
         var consumedDownPosition: Offset? = null
         rule.runOnUiThread {
             container.setContent {
-                Layout(
-                    {},
-                    Modifier
-                        .consumeDownGestureFilter {
-                            consumedDownPosition = it
-                        }
-                        .onGloballyPositioned {
-                            latch.countDown()
-                        }
-                ) { _, _ ->
-                    val sizePx = size.value
-                    layout(sizePx, sizePx) {}
+                Box(Modifier.fillMaxSize().wrapContentSize(align = AbsoluteAlignment.TopLeft)) {
+                    Layout(
+                        {},
+                        Modifier
+                            .consumeDownGestureFilter {
+                                consumedDownPosition = it
+                            }
+                            .onGloballyPositioned {
+                                latch.countDown()
+                            }
+                    ) { _, _ ->
+                        val sizePx = size.value
+                        layout(sizePx, sizePx) {}
+                    }
                 }
             }
         }
@@ -204,7 +210,6 @@
             size.value = 20
             // this call will synchronously mark the LayoutNode as needs remeasure
             Snapshot.sendApplyNotifications()
-            val androidComposeView = container.getChildAt(0) as AndroidComposeView
             val locationInWindow = IntArray(2).also {
                 container.getLocationInWindow(it)
             }
@@ -219,7 +224,7 @@
             )
 
             // we expect it to first remeasure and only then process
-            androidComposeView.dispatchTouchEvent(motionEvent)
+            findRootView(container).dispatchTouchEvent(motionEvent)
 
             assertThat(consumedDownPosition).isEqualTo(Offset(15f, 15f))
         }
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 cd96e64..d74228e 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
@@ -37,7 +37,7 @@
 
     @Before
     fun setup() {
-        hitPathTracker = HitPathTracker()
+        hitPathTracker = HitPathTracker(LayoutCoordinatesStub())
     }
 
     @Test
@@ -443,10 +443,12 @@
 
     @Test
     fun dispatchChanges_noNodes_nothingChanges() {
-        val (result, _) = hitPathTracker.dispatchChanges(internalPointerEventOf(down(5)))
+        val internalPointerEvent = internalPointerEventOf(down(5))
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         PointerInputChangeSubject
-            .assertThat(result.changes.values.first())
+            .assertThat(internalPointerEvent.changes.values.first())
             .isStructurallyEqualTo(down(5))
     }
 
@@ -463,10 +465,12 @@
 
         hitPathTracker.addHitPath(PointerId(13), listOf(pif1))
 
-        val (result, _) = hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
+        val internalPointerEvent = internalPointerEventOf(down(13))
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         PointerInputChangeSubject
-            .assertThat(result.changes.values.first())
+            .assertThat(internalPointerEvent.changes.values.first())
             .isStructurallyEqualTo(down(13).apply { consumeDownChange() })
     }
 
@@ -508,7 +512,9 @@
         val expectedChange = actualChange.deepCopy()
         val consumedExpectedChange = actualChange.deepCopy().apply { consumePositionChange() }
 
-        val (result, _) = hitPathTracker.dispatchChanges(internalPointerEventOf(actualChange))
+        val internalPointerEvent = internalPointerEventOf(actualChange)
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
@@ -570,7 +576,7 @@
         assertThat(log1[5].pass).isEqualTo(PointerEventPass.Main)
 
         PointerInputChangeSubject
-            .assertThat(result.changes.values.first())
+            .assertThat(internalPointerEvent.changes.values.first())
             .isStructurallyEqualTo(
                 consumedExpectedChange
             )
@@ -628,9 +634,9 @@
         val consumedExpectedEvent1 = expectedEvent1.deepCopy().apply { consumePositionChange() }
         val consumedExpectedEvent2 = expectedEvent2.deepCopy().apply { consumePositionChange() }
 
-        val (result, _) = hitPathTracker.dispatchChanges(
-            internalPointerEventOf(actualEvent1, actualEvent2)
-        )
+        val internalPointerEvent = internalPointerEventOf(actualEvent1, actualEvent2)
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
@@ -712,14 +718,14 @@
             )
         assertThat(log2[3].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(result.changes).hasSize(2)
+        assertThat(internalPointerEvent.changes).hasSize(2)
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent1.id])
+            .assertThat(internalPointerEvent.changes[actualEvent1.id])
             .isStructurallyEqualTo(
                 consumedExpectedEvent1
             )
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent2.id])
+            .assertThat(internalPointerEvent.changes[actualEvent2.id])
             .isStructurallyEqualTo(
                 consumedExpectedEvent2
             )
@@ -770,9 +776,9 @@
         val consumedEvent1 = expectedEvent1.deepCopy().apply { consumePositionChange() }
         val consumedEvent2 = expectedEvent2.deepCopy().apply { consumePositionChange() }
 
-        val (result, _) = hitPathTracker.dispatchChanges(
-            internalPointerEventOf(actualEvent1, actualEvent2)
-        )
+        val internalPointerEvent = internalPointerEventOf(actualEvent1, actualEvent2)
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
@@ -823,13 +829,13 @@
             )
         assertThat(log1[5].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(result.changes).hasSize(2)
+        assertThat(internalPointerEvent.changes).hasSize(2)
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent1.id])
+            .assertThat(internalPointerEvent.changes[actualEvent1.id])
             .isStructurallyEqualTo(consumedEvent1)
 
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent2.id])
+            .assertThat(internalPointerEvent.changes[actualEvent2.id])
             .isStructurallyEqualTo(consumedEvent2)
     }
 
@@ -866,9 +872,9 @@
         val consumedEvent1 = expectedEvent1.deepCopy().apply { consumePositionChange() }
         val consumedEvent2 = expectedEvent2.deepCopy().apply { consumePositionChange() }
 
-        val (result, _) = hitPathTracker.dispatchChanges(
-            internalPointerEventOf(actualEvent1, actualEvent2)
-        )
+        val internalPointerEvent = internalPointerEventOf(actualEvent1, actualEvent2)
+
+        hitPathTracker.dispatchChanges(internalPointerEvent)
 
         val log1 = log.getOnPointerEventLog()
             .filter { it.pass == PointerEventPass.Initial || it.pass == PointerEventPass.Main }
@@ -912,14 +918,14 @@
             )
         assertThat(log1[3].pass).isEqualTo(PointerEventPass.Main)
 
-        assertThat(result.changes).hasSize(2)
+        assertThat(internalPointerEvent.changes).hasSize(2)
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent1.id])
+            .assertThat(internalPointerEvent.changes[actualEvent1.id])
             .isStructurallyEqualTo(
                 consumedEvent1
             )
         PointerInputChangeSubject
-            .assertThat(result.changes[actualEvent2.id])
+            .assertThat(internalPointerEvent.changes[actualEvent2.id])
             .isStructurallyEqualTo(
                 consumedEvent2
             )
@@ -2842,7 +2848,7 @@
 
     @Test
     fun dispatchChanges_noNodes_reportsWasDispatchedToNothing() {
-        val (_, hitSomething) = hitPathTracker.dispatchChanges(internalPointerEventOf(down(0)))
+        val hitSomething = hitPathTracker.dispatchChanges(internalPointerEventOf(down(0)))
         assertThat(hitSomething).isFalse()
     }
 
@@ -2851,7 +2857,7 @@
         val pif = PointerInputFilterMock()
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
-        val (_, hitSomething) = hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
+        val hitSomething = hitPathTracker.dispatchChanges(internalPointerEventOf(down(13)))
 
         assertThat(hitSomething).isTrue()
     }
@@ -2861,7 +2867,7 @@
         val pif = PointerInputFilterMock()
         hitPathTracker.addHitPath(PointerId(13), listOf(pif))
 
-        val (_, hitSomething) = hitPathTracker.dispatchChanges(internalPointerEventOf(down(69)))
+        val hitSomething = hitPathTracker.dispatchChanges(internalPointerEventOf(down(69)))
 
         assertThat(hitSomething).isFalse()
     }
@@ -3109,7 +3115,7 @@
         if (actualNode.children.size != expectedNode.children.size) {
             return false
         }
-        for (child in actualNode.children) {
+        actualNode.children.forEach { child ->
             check = check && expectedNode.children.any {
                 areEqual(child, it)
             }
@@ -3137,7 +3143,7 @@
         if (actualNode.children.size != expectedNode.children.size) {
             return false
         }
-        for (child in actualNode.children) {
+        actualNode.children.forEach { child ->
             check = check && expectedNode.children.any {
                 areEqual(child, it)
             }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
index b55dd28..db78ad7 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapterTest.kt
@@ -1050,25 +1050,32 @@
             arrayOf(PointerCoords(30f, 31f))
         )
 
+        // Test the different events sequentially, since the returned event contains a list that
+        // will be reused by convertToPointerInputEvent for performance, so it shouldn't be held
+        // for longer than needed during the sequential dispatch.
+
         val pointerInputEventDown1 = motionEventAdapter.convertToPointerInputEvent(down1)
-        val pointerInputEventUp1 = motionEventAdapter.convertToPointerInputEvent(up1)
-        val pointerInputEventDown2 = motionEventAdapter.convertToPointerInputEvent(down2)
-        val pointerInputEventUp2 = motionEventAdapter.convertToPointerInputEvent(up2)
-        val pointerInputEventDown3 = motionEventAdapter.convertToPointerInputEvent(down3)
-        val pointerInputEventUp3 = motionEventAdapter.convertToPointerInputEvent(up3)
-
         assertThat(pointerInputEventDown1).isNotNull()
-        assertThat(pointerInputEventUp1).isNotNull()
-        assertThat(pointerInputEventDown2).isNotNull()
-        assertThat(pointerInputEventUp2).isNotNull()
-        assertThat(pointerInputEventDown3).isNotNull()
-        assertThat(pointerInputEventUp3).isNotNull()
-
         assertThat(pointerInputEventDown1!!.pointers[0].id).isEqualTo(PointerId(0))
+
+        val pointerInputEventUp1 = motionEventAdapter.convertToPointerInputEvent(up1)
+        assertThat(pointerInputEventUp1).isNotNull()
         assertThat(pointerInputEventUp1!!.pointers[0].id).isEqualTo(PointerId(0))
+
+        val pointerInputEventDown2 = motionEventAdapter.convertToPointerInputEvent(down2)
+        assertThat(pointerInputEventDown2).isNotNull()
         assertThat(pointerInputEventDown2!!.pointers[0].id).isEqualTo(PointerId(1))
+
+        val pointerInputEventUp2 = motionEventAdapter.convertToPointerInputEvent(up2)
+        assertThat(pointerInputEventUp2).isNotNull()
         assertThat(pointerInputEventUp2!!.pointers[0].id).isEqualTo(PointerId(1))
+
+        val pointerInputEventDown3 = motionEventAdapter.convertToPointerInputEvent(down3)
+        assertThat(pointerInputEventDown3).isNotNull()
         assertThat(pointerInputEventDown3!!.pointers[0].id).isEqualTo(PointerId(2))
+
+        val pointerInputEventUp3 = motionEventAdapter.convertToPointerInputEvent(up3)
+        assertThat(pointerInputEventUp3).isNotNull()
         assertThat(pointerInputEventUp3!!.pointers[0].id).isEqualTo(PointerId(2))
     }
 
@@ -1119,21 +1126,26 @@
             )
         )
 
+        // Test the different events sequentially, since the returned event contains a list that
+        // will be reused by convertToPointerInputEvent for performance, so it shouldn't be held
+        // for longer than needed during the sequential dispatch.
+
         val pointerInputEventDown1 = motionEventAdapter.convertToPointerInputEvent(down1)
-        val pointerInputEventDown2 = motionEventAdapter.convertToPointerInputEvent(down2)
-        val pointerInputEventDown3 = motionEventAdapter.convertToPointerInputEvent(down3)
 
         assertThat(pointerInputEventDown1).isNotNull()
-        assertThat(pointerInputEventDown2).isNotNull()
-        assertThat(pointerInputEventDown3).isNotNull()
-
         assertThat(pointerInputEventDown1!!.pointers).hasSize(1)
         assertThat(pointerInputEventDown1.pointers[0].id).isEqualTo(PointerId(0))
 
+        val pointerInputEventDown2 = motionEventAdapter.convertToPointerInputEvent(down2)
+
+        assertThat(pointerInputEventDown2).isNotNull()
         assertThat(pointerInputEventDown2!!.pointers).hasSize(2)
         assertThat(pointerInputEventDown2.pointers[0].id).isEqualTo(PointerId(0))
         assertThat(pointerInputEventDown2.pointers[1].id).isEqualTo(PointerId(1))
 
+        val pointerInputEventDown3 = motionEventAdapter.convertToPointerInputEvent(down3)
+
+        assertThat(pointerInputEventDown3).isNotNull()
         assertThat(pointerInputEventDown3!!.pointers).hasSize(3)
         assertThat(pointerInputEventDown2.pointers[0].id).isEqualTo(PointerId(0))
         assertThat(pointerInputEventDown2.pointers[1].id).isEqualTo(PointerId(1))
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 4bd3812..f67e8b7 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
@@ -21,7 +21,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.autofill.Autofill
 import androidx.compose.ui.autofill.AutofillTree
-import androidx.compose.ui.focus.FocusDirectionInternal
+import androidx.compose.ui.focus.FocusDirection
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
@@ -3085,7 +3085,7 @@
     override fun onLayoutChange(layoutNode: LayoutNode) {
     }
 
-    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirectionInternal? {
+    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         TODO("Not yet implemented")
     }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
index 9046500..49c2c27 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilterTest.kt
@@ -22,11 +22,11 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.testutils.TestViewConfiguration
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.ValueElement
-import androidx.compose.ui.platform.ViewConfiguration
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.unit.IntSize
@@ -68,7 +68,7 @@
 
     @Test
     fun testAwaitSingleEvent(): Unit = runBlockingTest {
-        val filter = SuspendingPointerInputFilter(FakeViewConfiguration())
+        val filter = SuspendingPointerInputFilter(TestViewConfiguration())
 
         val result = CompletableDeferred<PointerEvent>()
         launch {
@@ -97,7 +97,7 @@
 
     @Test
     fun testAwaitSeveralEvents(): Unit = runBlockingTest {
-        val filter = SuspendingPointerInputFilter(FakeViewConfiguration())
+        val filter = SuspendingPointerInputFilter(TestViewConfiguration())
         val results = Channel<PointerEvent>(Channel.UNLIMITED)
         launch {
             with(filter) {
@@ -132,7 +132,7 @@
 
     @Test
     fun testSyntheticCancelEvent(): Unit = runBlockingTest {
-        val filter = SuspendingPointerInputFilter(FakeViewConfiguration())
+        val filter = SuspendingPointerInputFilter(TestViewConfiguration())
         val results = Channel<PointerEvent>(Channel.UNLIMITED)
         launch {
             with(filter) {
@@ -200,7 +200,7 @@
 
     @Test
     fun testCancelledHandlerBlock() = runBlockingTest {
-        val filter = SuspendingPointerInputFilter(FakeViewConfiguration())
+        val filter = SuspendingPointerInputFilter(TestViewConfiguration())
         val counter = TestCounter()
         val handler = launch {
             with(filter) {
@@ -305,17 +305,6 @@
     }
 }
 
-private class FakeViewConfiguration : ViewConfiguration {
-    override val longPressTimeoutMillis: Long
-        get() = 500
-    override val doubleTapTimeoutMillis: Long
-        get() = 300
-    override val doubleTapMinTimeMillis: Long
-        get() = 40
-    override val touchSlop: Float
-        get() = 18f
-}
-
 private class TestCounter {
     private var count = 0
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
index 3082620..56fea1c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/OnGloballyPositionedTest.kt
@@ -50,6 +50,7 @@
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.window.Popup
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertEquals
@@ -285,6 +286,7 @@
         }
     }
 
+    @FlakyTest(bugId = 180508644)
     @Test
     fun onPositionedIsCalledWhenComposeContainerIsScrolled() {
         var positionedLatch = CountDownLatch(1)
@@ -337,6 +339,7 @@
         return offset
     }
 
+    @FlakyTest(bugId = 180508644)
     @Test
     fun onPositionedIsCalledWhenComposeContainerPositionChanged() {
         var positionedLatch = CountDownLatch(1)
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
index 22e4869..88cd537 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
@@ -20,17 +20,22 @@
 import android.widget.FrameLayout
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.runtime.Composable
 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
+import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.background
 import androidx.compose.ui.draw.assertColor
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.layout.RootMeasurePolicy.measure
 import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.LocalDensity
@@ -66,6 +71,7 @@
 
     @get:Rule
     val rule = createAndroidComposeRule<TestActivity>()
+
     @get:Rule
     val excessiveAssertions = AndroidOwnerExtraAssertionsRule()
 
@@ -555,6 +561,450 @@
             stateUsedLatch.await(1, TimeUnit.SECONDS)
         )
     }
+
+    @Test
+    fun precompose() {
+        val addSlot = mutableStateOf(false)
+        var composingCounter = 0
+        var composedDuringMeasure = false
+        val state = SubcomposeLayoutState()
+        val content: @Composable () -> Unit = {
+            composingCounter++
+        }
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                if (addSlot.value) {
+                    composedDuringMeasure = true
+                    subcompose(Unit, content)
+                }
+                layout(10, 10) {}
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(composingCounter).isEqualTo(0)
+            state.precompose(Unit, content)
+        }
+
+        rule.runOnIdle {
+            assertThat(composingCounter).isEqualTo(1)
+
+            assertThat(composedDuringMeasure).isFalse()
+            addSlot.value = true
+        }
+
+        rule.runOnIdle {
+            assertThat(composedDuringMeasure).isTrue()
+            assertThat(composingCounter).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun disposePrecomposedItem() {
+        var composed = false
+        var disposed = false
+        val state = SubcomposeLayoutState()
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                layout(10, 10) {}
+            }
+        }
+
+        val slot = rule.runOnIdle {
+            state.precompose(Unit) {
+                DisposableEffect(Unit) {
+                    composed = true
+                    onDispose {
+                        disposed = true
+                    }
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(composed).isTrue()
+            assertThat(disposed).isFalse()
+
+            slot.dispose()
+        }
+
+        rule.runOnIdle {
+            assertThat(disposed).isTrue()
+        }
+    }
+
+    @Test
+    fun composeItemRegularlyAfterDisposingPrecomposedItem() {
+        val addSlot = mutableStateOf(false)
+        var composingCounter = 0
+        var enterCounter = 0
+        var exitCounter = 0
+        val state = SubcomposeLayoutState()
+        val content: @Composable () -> Unit = @Composable {
+            composingCounter++
+            DisposableEffect(Unit) {
+                enterCounter++
+                onDispose {
+                    exitCounter++
+                }
+            }
+        }
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                if (addSlot.value) {
+                    subcompose(Unit, content)
+                }
+                layout(10, 10) {}
+            }
+        }
+
+        val slot = rule.runOnIdle {
+            state.precompose(Unit, content)
+        }
+
+        rule.runOnIdle {
+            slot.dispose()
+        }
+
+        rule.runOnIdle {
+            assertThat(composingCounter).isEqualTo(1)
+            assertThat(enterCounter).isEqualTo(1)
+            assertThat(exitCounter).isEqualTo(1)
+
+            addSlot.value = true
+        }
+
+        rule.runOnIdle {
+            assertThat(composingCounter).isEqualTo(2)
+            assertThat(enterCounter).isEqualTo(2)
+            assertThat(exitCounter).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun precomposeTwoItems() {
+        val addSlots = mutableStateOf(false)
+        var composing1Counter = 0
+        var composing2Counter = 0
+        val state = SubcomposeLayoutState()
+        val content1: @Composable () -> Unit = {
+            composing1Counter++
+        }
+        val content2: @Composable () -> Unit = {
+            composing2Counter++
+        }
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                subcompose(0) { }
+                if (addSlots.value) {
+                    subcompose(1, content1)
+                    subcompose(2, content2)
+                }
+                subcompose(3) { }
+                layout(10, 10) {}
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(composing1Counter).isEqualTo(0)
+            assertThat(composing2Counter).isEqualTo(0)
+            state.precompose(1, content1)
+            state.precompose(2, content2)
+        }
+
+        rule.runOnIdle {
+            assertThat(composing1Counter).isEqualTo(1)
+            assertThat(composing2Counter).isEqualTo(1)
+            addSlots.value = true
+        }
+
+        rule.runOnIdle {
+            assertThat(composing1Counter).isEqualTo(1)
+            assertThat(composing2Counter).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun precomposedItemDisposedWhenSubcomposeLayoutIsDisposed() {
+        val emitLayout = mutableStateOf(true)
+        var enterCounter = 0
+        var exitCounter = 0
+        val state = SubcomposeLayoutState()
+        val content: @Composable () -> Unit = @Composable {
+            DisposableEffect(Unit) {
+                enterCounter++
+                onDispose {
+                    exitCounter++
+                }
+            }
+        }
+
+        rule.setContent {
+            if (emitLayout.value) {
+                SubcomposeLayout(state) {
+                    layout(10, 10) {}
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            state.precompose(Unit, content)
+        }
+
+        rule.runOnIdle {
+            assertThat(enterCounter).isEqualTo(1)
+            assertThat(exitCounter).isEqualTo(0)
+            emitLayout.value = false
+        }
+
+        rule.runOnIdle {
+            assertThat(exitCounter).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun precomposeIsNotTriggeringParentRemeasure() {
+        val state = SubcomposeLayoutState()
+
+        var measureCount = 0
+        var layoutCount = 0
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                measureCount++
+                layout(10, 10) {
+                    layoutCount++
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(measureCount).isEqualTo(1)
+            assertThat(layoutCount).isEqualTo(1)
+            state.precompose(Unit) {
+                Box(Modifier.fillMaxSize())
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(measureCount).isEqualTo(1)
+            assertThat(layoutCount).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun precomposedItemDisposalIsNotTriggeringParentRemeasure() {
+        val state = SubcomposeLayoutState()
+
+        var measureCount = 0
+        var layoutCount = 0
+
+        rule.setContent {
+            SubcomposeLayout(state) {
+                measureCount++
+                layout(10, 10) {
+                    layoutCount++
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(measureCount).isEqualTo(1)
+            assertThat(layoutCount).isEqualTo(1)
+            val handle = state.precompose(Unit) {
+                Box(Modifier.fillMaxSize())
+            }
+            handle.dispose()
+        }
+
+        rule.runOnIdle {
+            assertThat(measureCount).isEqualTo(1)
+            assertThat(layoutCount).isEqualTo(1)
+        }
+    }
+
+    @Test
+    fun slotsKeptForReuse() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(2)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3)
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(2, 3) + /*reusable*/ listOf(1, 4),
+            doesNotExist = /*disposed*/ listOf(0)
+        )
+    }
+
+    @Test
+    fun newSlotIsUsingReusedSlot() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(2)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3)
+            // 1 and 4 are now in reusable buffer
+        }
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3, 5)
+            // the last reusable slot (4) will be used for composing 5
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(2, 3, 5) + /*reusable*/ listOf(1),
+            doesNotExist = /*disposed*/ listOf(0, 4)
+        )
+    }
+
+    @Test
+    fun theSameSlotIsUsedWhileItIsInReusableList() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(2)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3)
+            // 1 and 4 are now in reusable buffer
+        }
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3, 1)
+            // slot 1 should be taken back from reusable
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(2, 3, 1) + /*reusable*/ listOf(4)
+        )
+    }
+
+    @Test
+    fun prefetchIsUsingReusableNodes() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(2)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2, 3)
+            // 1 and 4 are now in reusable buffer
+        }
+
+        rule.runOnIdle {
+            state.precompose(5) {
+                ItemContent(5)
+            }
+            // prefetch should take slot 4 from reuse
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(2, 3) + /*prefetch*/ listOf(5) + /*reusable*/ listOf(1)
+        )
+    }
+
+    @Test
+    fun prefetchSlotWhichIsInReusableList() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(3)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2)
+            // 1, 3 and 4 are now in reusable buffer
+        }
+
+        rule.runOnIdle {
+            state.precompose(3) {
+                ItemContent(3)
+            }
+            // prefetch should take slot 3 from reuse
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(2) + /*prefetch*/ listOf(3) + /*reusable*/ listOf(1, 4),
+            doesNotExist = listOf(0)
+        )
+    }
+
+    @Test
+    fun nothingIsReusedWhenMaxSlotsAre0() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val state = SubcomposeLayoutState(0)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(2, 4)
+        }
+
+        assertNodes(
+            exists = listOf(2, 4),
+            doesNotExist = listOf(0, 1, 3)
+        )
+    }
+
+    @Test
+    fun reuse1Node() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3))
+        val state = SubcomposeLayoutState(1)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(0, 1)
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(0, 1) + /*reusable*/ listOf(3),
+            doesNotExist = /*disposed*/ listOf(2)
+        )
+    }
+
+    private fun composeItems(
+        state: SubcomposeLayoutState,
+        items: MutableState<List<Int>>
+    ) {
+        rule.setContent {
+            SubcomposeLayout(state) { constraints ->
+                items.value.forEach {
+                    subcompose(it) {
+                        ItemContent(it)
+                    }.forEach {
+                        it.measure(constraints)
+                    }
+                }
+                layout(10, 10) {}
+            }
+        }
+    }
+
+    @Composable
+    private fun ItemContent(index: Int) {
+        Box(Modifier.fillMaxSize().testTag("$index"))
+    }
+
+    private fun assertNodes(exists: List<Int>, doesNotExist: List<Int> = emptyList()) {
+        exists.forEach {
+            rule.onNodeWithTag("$it")
+                .assertExists()
+        }
+        doesNotExist.forEach {
+            rule.onNodeWithTag("$it")
+                .assertDoesNotExist()
+        }
+    }
 }
 
 fun ImageBitmap.assertCenterPixelColor(expectedColor: Color) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt
new file mode 100644
index 0000000..6c7f678
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoaderTest.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.compose.ui.platform
+
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.font.test.R
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+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 org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalTextApi::class)
+class AndroidFontResourceLoaderTest {
+    private val context = InstrumentationRegistry.getInstrumentation().context
+
+    @Test
+    fun test_font_loading_from_res() {
+        val loader = AndroidFontResourceLoader(context)
+        val typeface = loader.load(
+            Font(
+                resId = R.font.sample_font,
+                weight = FontWeight.Normal,
+                style = FontStyle.Normal
+            )
+        )
+        assertThat(typeface).isNotNull()
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
index fe77ad6..7efb51d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
@@ -17,27 +17,34 @@
 package androidx.compose.ui.platform
 
 import android.app.Activity
+import android.view.View
+import android.view.ViewGroup
 import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.text.BasicText
 import androidx.compose.runtime.Recomposer
 import androidx.compose.ui.InternalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.background
 import androidx.compose.ui.graphics.Color
+import androidx.core.view.get
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import androidx.test.filters.MediumTest
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertNotSame
 import org.junit.Assert.assertNull
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.lang.ref.WeakReference
 
-@LargeTest
 @RunWith(AndroidJUnit4::class)
 class WindowRecomposerTest {
 
@@ -81,4 +88,45 @@
             }
         }
     }
+
+    /**
+     * The Android framework may reuse the window decor views in some cases of activity
+     * recreation for configuration changes, notably during dynamic window resizing in
+     * multi-window modes. Confirm that the [windowRecomposer] extension returns a recomposer
+     * based in the content views, not in the decor itself, as this can cause a recomposer to
+     * become decoupled from its `DESTROYED` host lifecycle - the old Activity instance.
+     *
+     * Regression test for https://issuetracker.google.com/issues/184293033
+     */
+    @Test
+    @MediumTest
+    fun windowRecomposerResetsWithContentChild() {
+        ActivityScenario.launch(ComponentActivity::class.java).use { scenario ->
+            var firstRecomposer: Recomposer? = null
+            scenario.onActivity {
+                it.setContent {
+                    BasicText("Hello, world")
+                }
+                val contentParent = it.findViewById<ViewGroup>(android.R.id.content)
+                assertEquals("child count of @android:id/content", 1, contentParent.childCount)
+                firstRecomposer = contentParent[0].windowRecomposer
+            }
+
+            var secondRecomposer: Recomposer? = null
+            scenario.onActivity {
+                // force removal of the old composition host view and don't reuse
+                it.setContentView(View(it))
+                it.setContent {
+                    BasicText("Hello, again!")
+                }
+                val contentParent = it.findViewById<ViewGroup>(android.R.id.content)
+                assertEquals("child count of @android:id/content", 1, contentParent.childCount)
+                secondRecomposer = contentParent[0].windowRecomposer
+            }
+
+            assertNotNull("first recomposer", firstRecomposer)
+            assertNotNull("second recomposer", secondRecomposer)
+            assertNotSame(firstRecomposer, secondRecomposer)
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
index 8879e6e..e8563c3 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WrapperTest.kt
@@ -121,15 +121,20 @@
     @Test
     fun detachedFromLifecycleWhenDisposed() {
         lateinit var owner: RegistryOwner
-        activityScenario.onActivity {
-            owner = RegistryOwner()
-        }
         val composedLatch = CountDownLatch(1)
-
         lateinit var view: ComposeView
         activityScenario.onActivity {
+            owner = RegistryOwner()
             view = ComposeView(it)
-            it.setContentView(view)
+            it.setContentView(
+                // Wrap the ComposeView in a FrameLayout to be the content view;
+                // the default recomposer factory will install itself at the content view
+                // and use the available ViewTreeLifecycleOwner there. The added layer of
+                // nesting here isolates *only* the ComposeView's lifecycle observation.
+                FrameLayout(it).apply {
+                    addView(view)
+                }
+            )
             ViewTreeLifecycleOwner.set(view, owner)
             view.setContent {
                 composedLatch.countDown()
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
index db0b1eb..35b6b36 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/AndroidViewTest.kt
@@ -70,6 +70,7 @@
 import org.hamcrest.CoreMatchers.endsWith
 import org.hamcrest.CoreMatchers.equalTo
 import org.hamcrest.CoreMatchers.instanceOf
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -465,7 +466,9 @@
         }
     }
 
+    @Ignore
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun androidView_clipsToBounds() {
         val size = 20
         val sizeDp = with(rule.density) { size.toDp() }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
index ffd35e4..bbdc761 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PositionInWindowTest.kt
@@ -15,22 +15,42 @@
  */
 package androidx.compose.ui.window
 
+import android.os.Build
+import android.view.ViewGroup
 import androidx.activity.ComponentActivity
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.awaitFirstDown
+import androidx.compose.foundation.gestures.drag
+import androidx.compose.foundation.gestures.forEachGesture
 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.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.consumeAllChanges
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInWindow
+import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.test.swipe
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.round
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Rule
@@ -89,4 +109,144 @@
             assertThat(newPosition).isEqualTo(position)
         }
     }
+
+    // Make sure that the position in the window changes when the decor view's scroll changes.
+    @Test
+    fun positionInWindowOnScrollDecorView() {
+        var coordinates: LayoutCoordinates? = null
+
+        rule.setContent {
+            with(LocalDensity.current) {
+                Box(Modifier.requiredSize(10.toDp()).onGloballyPositioned { coordinates = it })
+            }
+        }
+
+        var position = Offset.Zero
+        rule.runOnIdle {
+            position = coordinates!!.positionInWindow()
+            activity.window.decorView.scrollY = -100
+        }
+
+        rule.runOnIdle {
+            val newPosition = coordinates!!.positionInWindow()
+            assertThat(newPosition.y).isEqualTo(position.y + 100)
+        }
+    }
+
+    // Make sure that the position in the window changes when the decor view's scroll changes.
+    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun positionInWindowOnScrollWindow() {
+        var coordinates: LayoutCoordinates? = null
+        rule.runOnUiThread {
+            val window = activity.window
+            val layoutParams = window.attributes
+            layoutParams.x = 0
+            layoutParams.y = 0
+            layoutParams.width = 20
+            layoutParams.height = 10
+            window.attributes = layoutParams
+
+            val composeView = ComposeView(activity)
+            val composeViewLayoutParams = ViewGroup.LayoutParams(20, 20)
+            activity.setContentView(composeView, composeViewLayoutParams)
+
+            composeView.setContent {
+                with(LocalDensity.current) {
+                    Box(Modifier.requiredSize(20.toDp()).onGloballyPositioned { coordinates = it })
+                }
+            }
+        }
+
+        var position = Offset.Zero
+        rule.runOnIdle {
+            position = coordinates!!.positionInWindow()
+
+            // Can't easily scroll the window as if the window insets have changed, so
+            // just directly modify the properties of ViewRootImpl
+            val viewRootImpl = activity.window.decorView.parent
+            val viewRootImplClass = viewRootImpl.javaClass
+            val scrollYField = viewRootImplClass.getDeclaredField("mScrollY")
+            scrollYField.isAccessible = true
+            scrollYField.set(viewRootImpl, -10)
+            val curScrollYField = viewRootImplClass.getDeclaredField("mCurScrollY")
+            curScrollYField.isAccessible = true
+            curScrollYField.set(viewRootImpl, -10)
+        }
+
+        rule.runOnIdle {
+            val newPosition = coordinates!!.positionInWindow()
+            assertThat(newPosition.y).isEqualTo(position.y + 10)
+        }
+    }
+
+    // Make sure that the position in the window changes when the decor view's position changes.
+    @Test
+    fun positionInWindowWithViewOffset() {
+        var coordinates: LayoutCoordinates? = null
+        rule.runOnUiThread {
+            val composeView = ComposeView(activity)
+            val composeViewLayoutParams = ViewGroup.LayoutParams(20, 20)
+            activity.setContentView(composeView, composeViewLayoutParams)
+
+            composeView.setContent {
+                with(LocalDensity.current) {
+                    Box(Modifier.requiredSize(20.toDp()).onGloballyPositioned { coordinates = it })
+                }
+            }
+        }
+
+        var position = Offset.Zero
+        rule.runOnIdle {
+            position = coordinates!!.positionInWindow()
+        }
+
+        rule.runOnIdle {
+            activity.window.decorView.offsetTopAndBottom(10)
+            val newPosition = coordinates!!.positionInWindow()
+            assertThat(newPosition.y).isEqualTo(position.y + 10)
+        }
+    }
+
+    @FlakyTest(bugId = 186669179)
+    @Test
+    fun positionInMovingPopup() {
+        val smallBoxTag = "smallBox"
+        var offset by mutableStateOf(Offset.Zero)
+        val endOffsetPx = 200f
+
+        rule.setContent {
+            Box(Modifier.fillMaxSize().background(Color.White)) {
+                Popup(offset = offset.round()) {
+                    Box(
+                        Modifier.size(10.dp, 10.dp)
+                            .background(Color.Black)
+                            .testTag(smallBoxTag)
+                            .pointerInput(Unit) {
+                                forEachGesture {
+                                    awaitPointerEventScope {
+                                        val down = awaitFirstDown()
+                                        var previous = down.position
+                                        drag(down.id) {
+                                            it.consumeAllChanges()
+                                            offset += it.position - previous
+                                            previous = it.position
+                                        }
+                                    }
+                                }
+                            }
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(smallBoxTag)
+            .performGesture {
+                swipe(Offset.Zero, Offset(endOffsetPx, endOffsetPx))
+            }
+
+        rule.runOnIdle {
+            assertThat(offset).isEqualTo(Offset(endOffsetPx, endOffsetPx))
+        }
+    }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/res/values/strings.xml b/compose/ui/ui/src/androidAndroidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from compose/ui/ui/src/androidAndroidTest/res/values/strings.xml
rename to compose/ui/ui/src/androidAndroidTest/res/values/donottranslate-strings.xml
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
index fec9aaa..e0a35a3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/key/KeyEvent.android.kt
@@ -18,9 +18,9 @@
 
 import android.view.KeyEvent.ACTION_DOWN
 import android.view.KeyEvent.ACTION_UP
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
-import androidx.compose.ui.input.key.KeyEventType.KeyUp
-import androidx.compose.ui.input.key.KeyEventType.Unknown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
+import androidx.compose.ui.input.key.KeyEventType.Companion.Unknown
 
 /**
  * The native Android [KeyEvent][NativeKeyEvent].
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
index 084a35a..8643ebf 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.android.kt
@@ -19,11 +19,11 @@
 import android.view.MotionEvent
 
 internal actual class InternalPointerEvent constructor(
-    actual var changes: MutableMap<PointerId, PointerInputChange>,
+    actual val changes: Map<PointerId, PointerInputChange>,
     val motionEvent: MotionEvent
 ) {
     actual constructor(
-        changes: MutableMap<PointerId, PointerInputChange>,
+        changes: Map<PointerId, PointerInputChange>,
         pointerInputEvent: PointerInputEvent
     ) : this(changes, pointerInputEvent.motionEvent)
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
index 1284beb..7ebf120 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
@@ -43,6 +43,8 @@
     @VisibleForTesting
     internal val motionEventToComposePointerIdMap: MutableMap<Int, PointerId> = mutableMapOf()
 
+    private val pointers: MutableList<PointerInputEventData> = mutableListOf()
+
     /**
      * Converts a single [MotionEvent] from an Android event stream into a [PointerInputEvent], or
      * null if the [MotionEvent.getActionMasked] is [ACTION_CANCEL].
@@ -76,12 +78,10 @@
             else -> null
         }
 
-        // TODO(shepshapard): Avoid allocating for every event.
-        val pointers: MutableList<PointerInputEventData> = mutableListOf()
+        pointers.clear()
 
         // This converts the MotionEvent into a list of PointerInputEventData, and updates
         // internal record keeping.
-        @Suppress("NAME_SHADOWING")
         for (i in 0 until motionEvent.pointerCount) {
             pointers.add(
                 createPointerInputEventData(
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 d8eb154..cdff2ff 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
@@ -19,7 +19,6 @@
 import android.annotation.SuppressLint
 import android.content.Context
 import android.content.res.Configuration
-import android.graphics.Matrix
 import android.graphics.Rect
 import android.os.Build
 import android.os.Looper
@@ -30,6 +29,7 @@
 import android.view.ViewGroup
 import android.view.ViewStructure
 import android.view.ViewTreeObserver
+import android.view.animation.AnimationUtils
 import android.view.autofill.AutofillValue
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputConnection
@@ -51,20 +51,21 @@
 import androidx.compose.ui.autofill.unregisterCallback
 import androidx.compose.ui.focus.FOCUS_TAG
 import androidx.compose.ui.focus.FocusDirection
-import androidx.compose.ui.focus.FocusDirectionInternal
-import androidx.compose.ui.focus.FocusDirectionInternal.Down
-import androidx.compose.ui.focus.FocusDirectionInternal.In
-import androidx.compose.ui.focus.FocusDirectionInternal.Left
-import androidx.compose.ui.focus.FocusDirectionInternal.Next
-import androidx.compose.ui.focus.FocusDirectionInternal.Out
-import androidx.compose.ui.focus.FocusDirectionInternal.Previous
-import androidx.compose.ui.focus.FocusDirectionInternal.Right
-import androidx.compose.ui.focus.FocusDirectionInternal.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+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.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 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.CanvasHolder
+import androidx.compose.ui.graphics.Matrix
+import androidx.compose.ui.graphics.setFrom
 import androidx.compose.ui.hapticfeedback.AndroidHapticFeedback
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.input.key.Key.Companion.Back
@@ -75,7 +76,7 @@
 import androidx.compose.ui.input.key.Key.Companion.DirectionUp
 import androidx.compose.ui.input.key.Key.Companion.Tab
 import androidx.compose.ui.input.key.KeyEvent
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
+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
@@ -162,21 +163,8 @@
             val focusDirection = getFocusDirection(it)
             if (focusDirection == null || it.type != KeyDown) return@KeyInputModifier false
 
-            val focusMoveSuccess = with(focusManager) {
-                when (focusDirection) {
-                    Up -> moveFocus(FocusDirection.Up)
-                    Down -> moveFocus(FocusDirection.Down)
-                    Left -> moveFocus(FocusDirection.Left)
-                    Right -> moveFocus(FocusDirection.Right)
-                    In -> moveFocusIn()
-                    Out -> moveFocusOut()
-                    Next -> moveFocus(FocusDirection.Next)
-                    Previous -> moveFocus(FocusDirection.Previous)
-                }
-            }
-
             // Consume the key event if we moved focus.
-            focusMoveSuccess
+            focusManager.moveFocus(focusDirection)
         },
         onPreviewKeyEvent = null
     )
@@ -278,8 +266,17 @@
     private var globalPosition: IntOffset = IntOffset.Zero
 
     private val tmpPositionArray = intArrayOf(0, 0)
-    private val tmpOffsetArray = floatArrayOf(0f, 0f)
-    private val tmpMatrix = Matrix()
+    private val viewToWindowMatrix = Matrix()
+    private val windowToViewMatrix = Matrix()
+    private val tmpCalculationMatrix = Matrix()
+    private var lastMatrixRecalculationAnimationTime = -1L
+
+    /**
+     * On some devices, the `getLocationOnScreen()` returns `(0, 0)` even when the Window
+     * is offset in special circumstances. This contains the screen coordinates of the containing
+     * Window the last time the [viewToWindowMatrix] and [windowToViewMatrix] were recalculated.
+     */
+    private var windowPosition = Offset.Infinite
 
     // Used to track whether or not there was an exception while creating an MRenderNode
     // so that we don't have to continue using try/catch after fails once.
@@ -623,7 +620,7 @@
         accessibilityDelegate.onLayoutChange(layoutNode)
     }
 
-    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirectionInternal? {
+    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         return when (keyEvent.key) {
             Tab -> if (keyEvent.isShiftPressed) Previous else Next
             DirectionRight -> Right
@@ -785,31 +782,46 @@
     }
 
     override fun localToScreen(localPosition: Offset): Offset {
-        tmpMatrix.reset()
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            TransformMatrixApi29.transformMatrixToScreen(this, tmpMatrix)
-        } else {
-            TransformMatrixApi28.transformMatrixToScreen(this, tmpMatrix, tmpPositionArray)
-        }
-        val points = tmpOffsetArray
-        points[0] = localPosition.x
-        points[1] = localPosition.y
-        tmpMatrix.mapPoints(points)
-        return Offset(points[0], points[1])
+        recalculateWindowPosition()
+        val local = viewToWindowMatrix.map(localPosition)
+        return Offset(
+            local.x + windowPosition.x,
+            local.y + windowPosition.y
+        )
     }
 
     override fun screenToLocal(positionOnScreen: Offset): Offset {
-        tmpMatrix.reset()
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            TransformMatrixApi29.transformMatrixFromScreen(this, tmpMatrix)
-        } else {
-            TransformMatrixApi28.transformMatrixFromScreen(this, tmpMatrix, tmpPositionArray)
+        recalculateWindowPosition()
+        val x = positionOnScreen.x - windowPosition.x
+        val y = positionOnScreen.y - windowPosition.y
+        return windowToViewMatrix.map(Offset(x, y))
+    }
+
+    private fun recalculateWindowPosition() {
+        val animationTime = AnimationUtils.currentAnimationTimeMillis()
+        if (animationTime != lastMatrixRecalculationAnimationTime) {
+            lastMatrixRecalculationAnimationTime = animationTime
+            recalculateWindowViewTransforms()
+            var viewParent = parent
+            var view: View = this
+            while (viewParent is ViewGroup) {
+                view = viewParent
+                viewParent = view.parent
+            }
+            view.getLocationOnScreen(tmpPositionArray)
+            val screenX = tmpPositionArray[0].toFloat()
+            val screenY = tmpPositionArray[1].toFloat()
+            view.getLocationInWindow(tmpPositionArray)
+            val windowX = tmpPositionArray[0].toFloat()
+            val windowY = tmpPositionArray[1].toFloat()
+            windowPosition = Offset(screenX - windowX, screenY - windowY)
         }
-        val points = tmpOffsetArray
-        points[0] = positionOnScreen.x
-        points[1] = positionOnScreen.y
-        tmpMatrix.mapPoints(points)
-        return Offset(points[0], points[1])
+    }
+
+    private fun recalculateWindowViewTransforms() {
+        viewToWindowMatrix.reset()
+        transformMatrixToWindow(this, viewToWindowMatrix)
+        viewToWindowMatrix.invertTo(windowToViewMatrix)
     }
 
     override fun onCheckIsTextEditor(): Boolean = textInputServiceAndroid.isEditorFocused()
@@ -818,31 +830,13 @@
         textInputServiceAndroid.createInputConnection(outAttrs)
 
     override fun calculateLocalPosition(positionInWindow: Offset): Offset {
-        tmpMatrix.reset()
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            TransformMatrixApi29.transformMatrixFromWindow(this, tmpMatrix, tmpPositionArray)
-        } else {
-            TransformMatrixApi28.transformMatrixFromWindow(this, tmpMatrix)
-        }
-        val points = tmpOffsetArray
-        points[0] = positionInWindow.x
-        points[1] = positionInWindow.y
-        tmpMatrix.mapPoints(points)
-        return Offset(points[0], points[1])
+        recalculateWindowPosition()
+        return windowToViewMatrix.map(positionInWindow)
     }
 
     override fun calculatePositionInWindow(localPosition: Offset): Offset {
-        tmpMatrix.reset()
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-            TransformMatrixApi29.transformMatrixToWindow(this, tmpMatrix, tmpPositionArray)
-        } else {
-            TransformMatrixApi28.transformMatrixToWindow(this, tmpMatrix)
-        }
-        val points = tmpOffsetArray
-        points[0] = localPosition.x
-        points[1] = localPosition.y
-        tmpMatrix.mapPoints(points)
-        return Offset(points[0], points[1])
+        recalculateWindowPosition()
+        return viewToWindowMatrix.map(localPosition)
     }
 
     override fun onConfigurationChanged(newConfig: Configuration) {
@@ -902,6 +896,7 @@
      * Q and later, AccessibilityInteractionController#findViewByAccessibilityId uses
      * AccessibilityNodeIdManager and findViewByAccessibilityIdTraversal is only used by autofill.
      */
+    @Suppress("unused")
     fun findViewByAccessibilityIdTraversal(accessibilityId: Int): View? {
         try {
             // AccessibilityInteractionController#findViewByAccessibilityId doesn't call this
@@ -927,6 +922,42 @@
         get() = viewTreeOwners?.lifecycleOwner
             ?.lifecycle?.currentState == Lifecycle.State.RESUMED
 
+    private fun transformMatrixToWindow(view: View, matrix: Matrix) {
+        val parentView = view.parent
+        if (parentView is View) {
+            transformMatrixToWindow(parentView, matrix)
+            matrix.preTranslate(-view.scrollX.toFloat(), -view.scrollY.toFloat())
+            matrix.preTranslate(view.left.toFloat(), view.top.toFloat())
+        } else {
+            view.getLocationInWindow(tmpPositionArray)
+            matrix.preTranslate(-view.scrollX.toFloat(), -view.scrollY.toFloat())
+            matrix.preTranslate(tmpPositionArray[0].toFloat(), tmpPositionArray[1].toFloat())
+        }
+
+        val viewMatrix = view.matrix
+        if (!viewMatrix.isIdentity) {
+            matrix.preConcat(viewMatrix)
+        }
+    }
+
+    /**
+     * Like [android.graphics.Matrix.preConcat], for a Compose [Matrix] that accepts an [other]
+     * [android.graphics.Matrix].
+     */
+    private fun Matrix.preConcat(other: android.graphics.Matrix) {
+        tmpCalculationMatrix.setFrom(other)
+        preTransform(tmpCalculationMatrix)
+    }
+
+    /**
+     * Like [android.graphics.Matrix.preTranslate], for a Compose [Matrix]
+     */
+    private fun Matrix.preTranslate(x: Float, y: Float) {
+        tmpCalculationMatrix.reset()
+        tmpCalculationMatrix.translate(x, y)
+        preTransform(tmpCalculationMatrix)
+    }
+
     companion object {
         private var systemPropertiesClass: Class<*>? = null
         private var getBooleanMethod: Method? = null
@@ -982,94 +1013,6 @@
     else -> LayoutDirection.Ltr
 }
 
-private fun View.findRootView(): View {
-    var contentView: View = this
-    var parent = contentView.parent
-    while (parent is View) {
-        contentView = parent
-        parent = contentView.parent
-    }
-    return contentView
-}
-
-private class TransformMatrixApi28 {
-    companion object {
-        fun transformMatrixToWindow(view: View, matrix: Matrix) =
-            transformFromLocal(view, matrix, null)
-
-        fun transformMatrixToScreen(view: View, matrix: Matrix, tmpPositionArray: IntArray) =
-            transformFromLocal(view, matrix, tmpPositionArray)
-
-        fun transformMatrixFromWindow(view: View, matrix: Matrix) =
-            transformToLocal(view, matrix, null)
-
-        fun transformMatrixFromScreen(view: View, matrix: Matrix, tmpPositionArray: IntArray) =
-            transformToLocal(view, matrix, tmpPositionArray)
-
-        private fun transformFromLocal(view: View, transform: Matrix, tmpPositionArray: IntArray?) {
-            val parentView = view.parent
-            if (parentView is View) {
-                transformFromLocal(parentView, transform, tmpPositionArray)
-                transform.preTranslate(-view.scrollX.toFloat(), -view.scrollY.toFloat())
-                transform.preTranslate(view.left.toFloat(), view.top.toFloat())
-            } else if (tmpPositionArray != null) {
-                view.getLocationOnScreen(tmpPositionArray)
-                transform.preTranslate(tmpPositionArray[0].toFloat(), tmpPositionArray[1].toFloat())
-            }
-
-            val matrix = view.matrix
-            if (!matrix.isIdentity) {
-                transform.preConcat(matrix)
-            }
-        }
-
-        private fun transformToLocal(view: View, transform: Matrix, tmpPositionArray: IntArray?) {
-            val parentView = view.parent
-            if (parentView is View) {
-                transformToLocal(parentView, transform, tmpPositionArray)
-                transform.postTranslate(view.scrollX.toFloat(), view.scrollY.toFloat())
-                transform.postTranslate(-view.left.toFloat(), -view.top.toFloat())
-            } else if (tmpPositionArray != null) {
-                view.getLocationOnScreen(tmpPositionArray)
-                transform.postTranslate(
-                    -tmpPositionArray[0].toFloat(),
-                    -tmpPositionArray[1].toFloat()
-                )
-            }
-
-            val matrix = view.matrix
-            if (!matrix.isIdentity) {
-                matrix.invert(matrix)
-                transform.postConcat(matrix)
-            }
-        }
-    }
-}
-
-private class TransformMatrixApi29 {
-    @RequiresApi(Build.VERSION_CODES.Q)
-    companion object {
-        fun transformMatrixToScreen(view: View, matrix: Matrix) =
-            view.transformMatrixToGlobal(matrix)
-
-        fun transformMatrixToWindow(view: View, matrix: Matrix, tmpPositionArray: IntArray) {
-            val rootView = view.findRootView()
-            rootView.getLocationOnScreen(tmpPositionArray)
-            matrix.preTranslate(-tmpPositionArray[0].toFloat(), -tmpPositionArray[1].toFloat())
-            view.transformMatrixToGlobal(matrix)
-        }
-        fun transformMatrixFromScreen(view: View, matrix: Matrix) =
-            view.transformMatrixToLocal(matrix)
-
-        fun transformMatrixFromWindow(view: View, matrix: Matrix, tmpPositionArray: IntArray) {
-            val rootView = view.findRootView()
-            rootView.getLocationOnScreen(tmpPositionArray)
-            matrix.postTranslate(tmpPositionArray[0].toFloat(), tmpPositionArray[1].toFloat())
-            view.transformMatrixToLocal(matrix)
-        }
-    }
-}
-
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @InternalComposeUiApi // used by testing infra
@@ -1091,3 +1034,105 @@
         view.defaultFocusHighlightEnabled = defaultFocusHighlightEnabled
     }
 }
+
+/**
+ * Sets this [Matrix] to be the result of this * [other]
+ */
+private fun Matrix.preTransform(other: Matrix) {
+    val v00 = dot(other, 0, this, 0)
+    val v01 = dot(other, 0, this, 1)
+    val v02 = dot(other, 0, this, 2)
+    val v03 = dot(other, 0, this, 3)
+    val v10 = dot(other, 1, this, 0)
+    val v11 = dot(other, 1, this, 1)
+    val v12 = dot(other, 1, this, 2)
+    val v13 = dot(other, 1, this, 3)
+    val v20 = dot(other, 2, this, 0)
+    val v21 = dot(other, 2, this, 1)
+    val v22 = dot(other, 2, this, 2)
+    val v23 = dot(other, 2, this, 3)
+    val v30 = dot(other, 3, this, 0)
+    val v31 = dot(other, 3, this, 1)
+    val v32 = dot(other, 3, this, 2)
+    val v33 = dot(other, 3, this, 3)
+    this[0, 0] = v00
+    this[0, 1] = v01
+    this[0, 2] = v02
+    this[0, 3] = v03
+    this[1, 0] = v10
+    this[1, 1] = v11
+    this[1, 2] = v12
+    this[1, 3] = v13
+    this[2, 0] = v20
+    this[2, 1] = v21
+    this[2, 2] = v22
+    this[2, 3] = v23
+    this[3, 0] = v30
+    this[3, 1] = v31
+    this[3, 2] = v32
+    this[3, 3] = v33
+}
+
+// Taken from Matrix.kt
+private fun dot(m1: Matrix, row: Int, m2: Matrix, column: Int): Float {
+    return m1[row, 0] * m2[0, column] +
+        m1[row, 1] * m2[1, column] +
+        m1[row, 2] * m2[2, column] +
+        m1[row, 3] * m2[3, column]
+}
+
+/**
+ * Sets [other] to be the inverse of this
+ */
+private fun Matrix.invertTo(other: Matrix) {
+    val a00 = this[0, 0]
+    val a01 = this[0, 1]
+    val a02 = this[0, 2]
+    val a03 = this[0, 3]
+    val a10 = this[1, 0]
+    val a11 = this[1, 1]
+    val a12 = this[1, 2]
+    val a13 = this[1, 3]
+    val a20 = this[2, 0]
+    val a21 = this[2, 1]
+    val a22 = this[2, 2]
+    val a23 = this[2, 3]
+    val a30 = this[3, 0]
+    val a31 = this[3, 1]
+    val a32 = this[3, 2]
+    val a33 = this[3, 3]
+    val b00 = a00 * a11 - a01 * a10
+    val b01 = a00 * a12 - a02 * a10
+    val b02 = a00 * a13 - a03 * a10
+    val b03 = a01 * a12 - a02 * a11
+    val b04 = a01 * a13 - a03 * a11
+    val b05 = a02 * a13 - a03 * a12
+    val b06 = a20 * a31 - a21 * a30
+    val b07 = a20 * a32 - a22 * a30
+    val b08 = a20 * a33 - a23 * a30
+    val b09 = a21 * a32 - a22 * a31
+    val b10 = a21 * a33 - a23 * a31
+    val b11 = a22 * a33 - a23 * a32
+    val det =
+        (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06)
+    if (det == 0.0f) {
+        return
+    }
+    val invDet = 1.0f / det
+    other[0, 0] = ((a11 * b11 - a12 * b10 + a13 * b09) * invDet)
+    other[0, 1] = ((-a01 * b11 + a02 * b10 - a03 * b09) * invDet)
+    other[0, 2] = ((a31 * b05 - a32 * b04 + a33 * b03) * invDet)
+    other[0, 3] = ((-a21 * b05 + a22 * b04 - a23 * b03) * invDet)
+    other[1, 0] = ((-a10 * b11 + a12 * b08 - a13 * b07) * invDet)
+    other[1, 1] = ((a00 * b11 - a02 * b08 + a03 * b07) * invDet)
+    other[1, 2] = ((-a30 * b05 + a32 * b02 - a33 * b01) * invDet)
+    other[1, 3] = ((a20 * b05 - a22 * b02 + a23 * b01) * invDet)
+    other[2, 0] = ((a10 * b10 - a11 * b08 + a13 * b06) * invDet)
+    other[2, 1] = ((-a00 * b10 + a01 * b08 - a03 * b06) * invDet)
+    other[2, 2] = ((a30 * b04 - a31 * b02 + a33 * b00) * invDet)
+    other[2, 3] = ((-a20 * b04 + a21 * b02 - a23 * b00) * invDet)
+    other[3, 0] = ((-a10 * b09 + a11 * b07 - a12 * b06) * invDet)
+    other[3, 1] = ((a00 * b09 - a01 * b07 + a02 * b06) * invDet)
+    other[3, 2] = ((-a30 * b03 + a31 * b01 - a32 * b00) * invDet)
+    other[3, 3] = ((a20 * b03 - a21 * b01 + a22 * b00) * invDet)
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index cb3b8ea..a11842b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -23,6 +23,7 @@
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.os.SystemClock
 import android.util.Log
 import android.view.MotionEvent
 import android.view.View
@@ -59,9 +60,9 @@
 import androidx.compose.ui.util.fastForEach
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.fastJoinToString
-import androidx.compose.ui.fastReduce
-import androidx.compose.ui.fastZipWithNext
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.accessibility.setCollectionInfo
+import androidx.compose.ui.platform.accessibility.setCollectionItemInfo
 import androidx.compose.ui.semantics.AccessibilityAction
 import androidx.compose.ui.semantics.LiveRegionMode
 import androidx.compose.ui.semantics.ProgressBarRangeInfo
@@ -76,7 +77,6 @@
 import androidx.core.view.accessibility.AccessibilityNodeProviderCompat
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.delay
-import kotlin.math.abs
 import kotlin.math.ceil
 import kotlin.math.floor
 
@@ -118,6 +118,12 @@
          * frame.
          */
         const val SendRecurringAccessibilityEventsIntervalMillis: Long = 100
+
+        /**
+         * Timeout to determine whether a text selection changed event and the pending text
+         * traversed event could be resulted from the same traverse action.
+         */
+        const val TextTraversedEventTimeoutMillis: Long = 1000
         private val AccessibilityActionsResourceIds = intArrayOf(
             R.id.accessibility_custom_action_0,
             R.id.accessibility_custom_action_1,
@@ -178,6 +184,16 @@
     private val boundsUpdateChannel = Channel<Unit>(Channel.CONFLATED)
     private var currentSemanticsNodesInvalidated = true
 
+    private class PendingTextTraversedEvent(
+        val node: SemanticsNode,
+        val action: Int,
+        val granularity: Int,
+        val fromIndex: Int,
+        val toIndex: Int,
+        val traverseTime: Long
+    )
+    private var pendingTextTraversedEvent: PendingTextTraversedEvent? = null
+
     // Up to date semantics nodes in pruned semantics tree. It always reflects the current
     // semantics tree. They key is the virtual view id(the root node has a key of
     // AccessibilityNodeProviderCompat.HOST_VIEW_ID and other node has a key of its id).
@@ -322,6 +338,7 @@
         }
 
         setText(semanticsNode, info)
+        setContentInvalid(semanticsNode, info)
         info.stateDescription =
             semanticsNode.config.getOrNull(SemanticsProperties.StateDescription)
 
@@ -681,6 +698,14 @@
         }
     }
 
+    /** Set the error text for this node */
+    private fun setContentInvalid(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
+        if (node.config.contains(SemanticsProperties.Error)) {
+            info.isContentInvalid = true
+            info.error = node.config.getOrNull(SemanticsProperties.Error)
+        }
+    }
+
     @OptIn(InternalTextApi::class)
     private fun setText(
         node: SemanticsNode,
@@ -841,6 +866,24 @@
         return event
     }
 
+    private fun createTextSelectionChangedEvent(
+        virtualViewId: Int,
+        fromIndex: Int?,
+        toIndex: Int?,
+        itemCount: Int?,
+        text: String?
+    ): AccessibilityEvent {
+        return createEvent(
+            virtualViewId,
+            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
+        ).apply {
+            fromIndex?.let { this.fromIndex = it }
+            toIndex?.let { this.toIndex = it }
+            itemCount?.let { this.itemCount = it }
+            text?.let { this.text.add(it) }
+        }
+    }
+
     /**
      * Attempts to clear accessibility focus from a virtual view.
      *
@@ -1347,17 +1390,17 @@
                     // are covered and which nodes are not, so the currentSemanticsNodes is not
                     // up to date anymore.
                     // After the subtree events are sent, accessibility services will get the
-                    // current visible/invisible state. We also update our copy here so that our
-                    // incremental changes (represented by accessibility events) are consistent
+                    // current visible/invisible state. We also try to do semantics tree diffing
+                    // to send out the proper accessibility events and update our copy here so that
+                    // our incremental changes (represented by accessibility events) are consistent
                     // with accessibility services. That is: change - notify - new change -
-                    // notify, if we don't update our copy here, we will combine change and new
-                    // change, which is missing finer-grained notification.
-                    // Note that we could update our copy before this delay by posting an update
-                    // copy runnable in onLayoutChange(a code version is in aosp/1553311), similar
-                    // to semanticsChangeChecker, but I think update copy after the subtree
-                    // change events are sent is more accurate because before accessibility
-                    // services receive subtree events, they are not aware of the subtree change.
-                    updateSemanticsNodesCopyAndPanes()
+                    // notify, if we don't do the tree diffing and update our copy here, we will
+                    // combine old change and new change, which is missing finer-grained
+                    // notification.
+                    if (!checkingForSemanticsChanges) {
+                        checkingForSemanticsChanges = true
+                        handler.post(semanticsChangeChecker)
+                    }
                 }
                 subtreeChangedLayoutNodes.clear()
                 delay(SendRecurringAccessibilityEventsIntervalMillis)
@@ -1556,16 +1599,16 @@
                     // do we need to overwrite TextRange equals?
                     SemanticsProperties.TextSelectionRange -> {
                         val newText = getTextForTextField(newNode) ?: ""
-                        val event = createEvent(
-                            semanticsNodeIdToAccessibilityVirtualNodeId(id),
-                            AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
-                        )
                         val textRange = newNode.config[SemanticsProperties.TextSelectionRange]
-                        event.fromIndex = textRange.start
-                        event.toIndex = textRange.end
-                        event.itemCount = newText.length
-                        event.text.add(trimToSize(newText, ParcelSafeTextLength))
+                        val event = createTextSelectionChangedEvent(
+                            semanticsNodeIdToAccessibilityVirtualNodeId(id),
+                            textRange.start,
+                            textRange.end,
+                            newText.length,
+                            trimToSize(newText, ParcelSafeTextLength)
+                        )
                         sendEvent(event)
+                        sendPendingTextTraversedAtGranularityEvent(newNode.id)
                     }
                     SemanticsProperties.HorizontalScrollAxisRange,
                     SemanticsProperties.VerticalScrollAxisRange -> {
@@ -1764,34 +1807,45 @@
             selectionStart = if (forward) segmentEnd else segmentStart
             selectionEnd = selectionStart
         }
-        setAccessibilitySelection(node, selectionStart, selectionEnd, true)
         val action =
             if (forward)
                 AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
             else AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
-        sendViewTextTraversedAtGranularityEvent(node, action, granularity, segmentStart, segmentEnd)
+        pendingTextTraversedEvent = PendingTextTraversedEvent(
+            node,
+            action,
+            granularity,
+            segmentStart,
+            segmentEnd,
+            SystemClock.uptimeMillis()
+        )
+        setAccessibilitySelection(node, selectionStart, selectionEnd, true)
         return true
     }
 
-    private fun sendViewTextTraversedAtGranularityEvent(
-        node: SemanticsNode,
-        action: Int,
-        granularity: Int,
-        fromIndex: Int,
-        toIndex: Int
-    ) {
-        val event = createEvent(
-            node.id,
-            AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
-        )
-        event.fromIndex = fromIndex
-        event.toIndex = toIndex
-        event.action = action
-        event.movementGranularity = granularity
-        event.text.add(
-            getIterableTextForAccessibility(node) ?: calculateContentDescriptionFromChildren(node)
-        )
-        sendEvent(event)
+    private fun sendPendingTextTraversedAtGranularityEvent(semanticsNodeId: Int) {
+        pendingTextTraversedEvent?.let {
+            // not the same node, do nothing. Don't set pendingTextTraversedEvent to null either.
+            if (semanticsNodeId != it.node.id) {
+                return
+            }
+            if (SystemClock.uptimeMillis() - it.traverseTime <= TextTraversedEventTimeoutMillis) {
+                val event = createEvent(
+                    semanticsNodeIdToAccessibilityVirtualNodeId(it.node.id),
+                    AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY
+                )
+                event.fromIndex = it.fromIndex
+                event.toIndex = it.toIndex
+                event.action = it.action
+                event.movementGranularity = it.granularity
+                event.text.add(
+                    getIterableTextForAccessibility(it.node)
+                        ?: calculateContentDescriptionFromChildren(it.node)
+                )
+                sendEvent(event)
+            }
+        }
+        pendingTextTraversedEvent = null
     }
 
     private fun setAccessibilitySelection(
@@ -1816,17 +1870,22 @@
         if (start == end && end == accessibilityCursorPosition) {
             return false
         }
-        if (getIterableTextForAccessibility(node) == null) {
-            return false
-        }
-        accessibilityCursorPosition = if (start >= 0 && start == end &&
-            end <= getIterableTextForAccessibility(node)!!.length
-        ) {
+        val text = getIterableTextForAccessibility(node) ?: return false
+        accessibilityCursorPosition = if (start >= 0 && start == end && end <= text.length) {
             start
         } else {
             AccessibilityCursorPositionUndefined
         }
-        sendEventForVirtualView(node.id, AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED)
+        val nonEmptyText = text.isNotEmpty()
+        val event = createTextSelectionChangedEvent(
+            semanticsNodeIdToAccessibilityVirtualNodeId(node.id),
+            if (nonEmptyText) accessibilityCursorPosition else null,
+            if (nonEmptyText) accessibilityCursorPosition else null,
+            if (nonEmptyText) text.length else null,
+            text
+        )
+        sendEvent(event)
+        sendPendingTextTraversedAtGranularityEvent(node.id)
         return true
     }
 
@@ -2036,104 +2095,6 @@
         return null
     }
 
-    private fun setCollectionInfo(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
-        val groupedChildren = mutableListOf<SemanticsNode>()
-
-        if (node.config.getOrNull(SemanticsProperties.SelectableGroup) != null) {
-            node.children.fastForEach { childNode ->
-                // we assume that Tabs and RadioButtons are not mixed under a single group
-                if (childNode.config.contains(SemanticsProperties.Selected)) {
-                    groupedChildren.add(childNode)
-                }
-            }
-        }
-
-        if (groupedChildren.isNotEmpty()) {
-            /* When we provide a more complex CollectionInfo object, we will use it to determine
-            the number of rows, columns, and selection mode. Currently we assume mutual
-            exclusivity and liner layout (aka Column or Row). We determine if the layout is
-            horizontal or vertical by checking the bounds of the children
-            */
-            val isHorizontal = calculateIfHorizontallyStacked(groupedChildren)
-            info.setCollectionInfo(
-                AccessibilityNodeInfoCompat.CollectionInfoCompat.obtain(
-                    if (isHorizontal) 1 else groupedChildren.count(),
-                    if (isHorizontal) groupedChildren.count() else 1,
-                    false,
-                    getSelectionMode(groupedChildren)
-                )
-            )
-        }
-    }
-
-    private fun setCollectionItemInfo(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
-        if (!node.config.contains(SemanticsProperties.Selected)) return
-
-        val groupedChildren = mutableListOf<SemanticsNode>()
-
-        // for "tab" item find all siblings to calculate the index
-        val parentNode = node.parent ?: return
-        if (parentNode.config.getOrNull(SemanticsProperties.SelectableGroup) != null) {
-            // find all siblings to calculate the index
-            parentNode.children.fastForEach { childNode ->
-                if (childNode.config.contains(SemanticsProperties.Selected)) {
-                    groupedChildren.add(childNode)
-                }
-            }
-        }
-
-        if (groupedChildren.isNotEmpty()) {
-            val isHorizontal = calculateIfHorizontallyStacked(groupedChildren)
-
-            groupedChildren.fastForEachIndexed { index, tabNode ->
-                if (tabNode.id == node.id) {
-                    val itemInfo = AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
-                        if (isHorizontal) 0 else index,
-                        1,
-                        if (isHorizontal) index else 0,
-                        1,
-                        false,
-                        tabNode.config.getOrElse(SemanticsProperties.Selected) { false }
-                    )
-                    if (itemInfo != null) {
-                        info.setCollectionItemInfo(itemInfo)
-                    }
-                }
-            }
-        }
-    }
-
-    /** A naïve algorithm to determine if elements are stacked vertically or horizontally */
-    private fun calculateIfHorizontallyStacked(items: List<SemanticsNode>): Boolean {
-        if (items.count() < 2) return true
-
-        val deltas = items.fastZipWithNext { el1, el2 ->
-            Offset(
-                abs(el1.boundsInRoot.center.x - el2.boundsInRoot.center.x),
-                abs(el1.boundsInRoot.center.y - el2.boundsInRoot.center.y)
-            )
-        }
-        val (deltaX, deltaY) = when (deltas.count()) {
-            1 -> deltas.first()
-            else -> deltas.fastReduce { result, element -> result + element }
-        }
-        return deltaY < deltaX
-    }
-
-    private fun getSelectionMode(items: List<SemanticsNode>): Int {
-        var numberOfSelectedItems = 0
-        items.fastForEach {
-            if (it.config.getOrElse(SemanticsProperties.Selected) { false }) {
-                numberOfSelectedItems += 1
-            }
-        }
-        return when (numberOfSelectedItems) {
-            0 -> AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_NONE
-            1 -> AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_SINGLE
-            else -> AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_MULTIPLE
-        }
-    }
-
     // TODO(b/160820721): use AccessibilityNodeProviderCompat instead of AccessibilityNodeProvider
     inner class MyNodeProvider : AccessibilityNodeProvider() {
         override fun createAccessibilityNodeInfo(virtualViewId: Int):
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
index bf071f4..fedc81b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidFontResourceLoader.android.kt
@@ -18,18 +18,40 @@
 
 import android.content.Context
 import android.graphics.Typeface
+import android.os.Build
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.ResourceFont
 import androidx.core.content.res.ResourcesCompat
 
 /**
- * Android implementation for [Font.ResourceLoader]
+ * Android implementation for [Font.ResourceLoader]. It is designed to load only [ResourceFont].
  */
 internal class AndroidFontResourceLoader(private val context: Context) : Font.ResourceLoader {
     override fun load(font: Font): Typeface {
         return when (font) {
-            is ResourceFont -> ResourcesCompat.getFont(context, font.resId)!!
+            is ResourceFont ->
+                if (Build.VERSION.SDK_INT >= 26) {
+                    AndroidFontResourceLoaderHelper.create(context, font.resId)
+                } else {
+                    ResourcesCompat.getFont(context, font.resId)!!
+                }
             else -> throw IllegalArgumentException("Unknown font type: $font")
         }
     }
 }
+
+/**
+ * This class is 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(26)
+private object AndroidFontResourceLoaderHelper {
+    @RequiresApi(26)
+    @DoNotInline
+    fun create(context: Context, resourceId: Int): Typeface {
+        return context.resources.getFont(resourceId)
+    }
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
index fcf2250..a49103d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/DeviceRenderNode.android.kt
@@ -59,6 +59,7 @@
         drawBlock: (Canvas) -> Unit
     )
     fun getMatrix(matrix: android.graphics.Matrix)
+    fun getInverseMatrix(matrix: android.graphics.Matrix)
     fun drawInto(canvas: android.graphics.Canvas)
     fun setHasOverlappingRendering(hasOverlappingRendering: Boolean): Boolean
 
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
index d06944b..0a7f460 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi23.android.kt
@@ -217,6 +217,10 @@
         return renderNode.getMatrix(matrix)
     }
 
+    override fun getInverseMatrix(matrix: android.graphics.Matrix) {
+        return renderNode.getInverseMatrix(matrix)
+    }
+
     override fun drawInto(canvas: android.graphics.Canvas) {
         (canvas as DisplayListCanvas).drawRenderNode(renderNode)
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
index 3e07da4..125d5c5 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeApi29.android.kt
@@ -165,6 +165,10 @@
         return renderNode.getMatrix(matrix)
     }
 
+    override fun getInverseMatrix(matrix: android.graphics.Matrix) {
+        return renderNode.getInverseMatrix(matrix)
+    }
+
     override fun drawInto(canvas: android.graphics.Canvas) {
         canvas.drawRenderNode(renderNode)
     }
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 7ba69c3..d2a88b5 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
@@ -17,7 +17,11 @@
 package androidx.compose.ui.platform
 
 import android.os.Build
+import android.view.View
 import androidx.annotation.RequiresApi
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.MutableRect
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Canvas
@@ -47,9 +51,10 @@
     private var isDirty = false
     private val outlineResolver = OutlineResolver(ownerView.density)
     private var isDestroyed = false
-    private var androidMatrixCache: android.graphics.Matrix? = null
     private var drawnWithZ = false
 
+    private val matrixCache = RenderNodeMatrixCache()
+
     private val canvasHolder = CanvasHolder()
 
     /**
@@ -68,6 +73,23 @@
     override val layerId: Long
         get() = renderNode.uniqueId
 
+    @ExperimentalComposeUiApi
+    override val ownerViewId: Long
+        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
+        } else {
+            -1
+        }
+
+    @RequiresApi(29)
+    private class UniqueDrawingIdApi29 {
+        @RequiresApi(29)
+        companion object {
+            @JvmStatic
+            fun getUniqueDrawingId(view: View) = view.uniqueDrawingId
+        }
+    }
+
     override fun updateLayerProperties(
         scaleX: Float,
         scaleY: Float,
@@ -117,6 +139,7 @@
         if (!drawnWithZ && renderNode.elevation > 0f) {
             invalidateParentLayer()
         }
+        matrixCache.invalidate()
     }
 
     override fun resize(size: IntSize) {
@@ -134,6 +157,7 @@
             outlineResolver.update(Size(width.toFloat(), height.toFloat()))
             renderNode.setOutline(outlineResolver.outline)
             invalidate()
+            matrixCache.invalidate()
         }
     }
 
@@ -146,6 +170,7 @@
             renderNode.offsetLeftAndRight(newLeft - oldLeft)
             renderNode.offsetTopAndBottom(newTop - oldTop)
             triggerRepaint()
+            matrixCache.invalidate()
         }
     }
 
@@ -205,12 +230,115 @@
         ownerView.requestClearInvalidObservations()
     }
 
-    override fun getMatrix(matrix: Matrix) {
-        val androidMatrix = androidMatrixCache ?: android.graphics.Matrix().also {
-            androidMatrixCache = it
+    override fun mapOffset(point: Offset, inverse: Boolean): Offset {
+        return if (inverse) {
+            matrixCache.getInverseMatrix(renderNode).map(point)
+        } else {
+            matrixCache.getMatrix(renderNode).map(point)
         }
-        renderNode.getMatrix(androidMatrix)
-        matrix.setFrom(androidMatrix)
+    }
+
+    override fun mapBounds(rect: MutableRect, inverse: Boolean) {
+        if (inverse) {
+            matrixCache.getInverseMatrix(renderNode).map(rect)
+        } else {
+            matrixCache.getMatrix(renderNode).map(rect)
+        }
+    }
+}
+
+/**
+ * Helper class to cache a [Matrix] and inverse [Matrix], allowing the instance to be reused until
+ * the [RenderNodeLayer]'s properties have changed, causing it to call [invalidate].
+ *
+ * This caches both the inverse and normal matrix as a slight fast path which lets us use
+ * [DeviceRenderNode.getInverseMatrix], instead of needing to manually invert the matrix.
+ *
+ * This allows us to avoid repeated calls to [android.graphics.Matrix.getValues], which calls
+ * an expensive native method (nGetValues). If we know the matrix hasn't changed, we can just
+ * re-use it without needing to read and update values.
+ */
+private class RenderNodeMatrixCache {
+    private var oldAndroidMatrixCache: android.graphics.Matrix? = null
+    private var newAndroidMatrixCache: android.graphics.Matrix? = null
+    private var matrixCache: Matrix? = null
+
+    private var oldInverseAndroidMatrixCache: android.graphics.Matrix? = null
+    private var newInverseAndroidMatrixCache: android.graphics.Matrix? = null
+    private var inverseMatrixCache: Matrix? = null
+
+    private var isDirty = true
+    private var isInverseDirty = true
+
+    /**
+     * Ensures that the internal matrix will be updated next time [getMatrix] or [getInverseMatrix]
+     * is called - this should be called when something that will change the matrix calculation
+     * has happened.
+     */
+    fun invalidate() {
+        isDirty = true
+        isInverseDirty = true
+    }
+
+    /**
+     * Returns the cached [Matrix], updating it if required (if [invalidate] was previously called).
+     */
+    fun getMatrix(renderNode: DeviceRenderNode): Matrix {
+        val matrix = matrixCache ?: Matrix().also {
+            matrixCache = it
+        }
+        if (!isDirty) {
+            return matrix
+        }
+
+        val new = newAndroidMatrixCache ?: android.graphics.Matrix().also {
+            newAndroidMatrixCache = it
+        }
+
+        renderNode.getMatrix(new)
+
+        if (oldAndroidMatrixCache != new) {
+            // Update the Compose matrix if the underlying Android matrix has changed
+            matrix.setFrom(new)
+            if (oldAndroidMatrixCache == null) {
+                oldAndroidMatrixCache = android.graphics.Matrix(new)
+            } else {
+                oldAndroidMatrixCache!!.set(new)
+            }
+        }
+        isDirty = false
+        return matrix
+    }
+
+    /**
+     * Returns the cached inverse [Matrix], updating it if required (if [invalidate] was previously
+     * called).
+     */
+    fun getInverseMatrix(renderNode: DeviceRenderNode): Matrix {
+        val matrix = inverseMatrixCache ?: Matrix().also {
+            inverseMatrixCache = it
+        }
+        if (!isInverseDirty) {
+            return matrix
+        }
+
+        val new = newInverseAndroidMatrixCache ?: android.graphics.Matrix().also {
+            newInverseAndroidMatrixCache = it
+        }
+
+        renderNode.getInverseMatrix(new)
+
+        if (oldInverseAndroidMatrixCache != new) {
+            // Update the Compose matrix if the underlying Android matrix has changed
+            matrix.setFrom(new)
+            if (oldInverseAndroidMatrixCache == null) {
+                oldInverseAndroidMatrixCache = android.graphics.Matrix(new)
+            } else {
+                oldInverseAndroidMatrixCache!!.set(new)
+            }
+        }
+        isInverseDirty = false
+        return matrix
     }
 }
 
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 13238a3..8e1d244 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
@@ -19,6 +19,10 @@
 import android.os.Build
 import android.view.View
 import android.view.ViewOutlineProvider
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.MutableRect
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.CanvasHolder
@@ -55,6 +59,8 @@
     private var drawnWithZ = false
     private val canvasHolder = CanvasHolder()
 
+    private val matrixCache = ViewLayerMatrixCache()
+
     /**
      * Local copy of the transform origin as GraphicsLayerModifier can be implemented
      * as a model object. Update this field within [updateLayerProperties] and use it
@@ -71,6 +77,23 @@
     override val layerId: Long
         get() = id.toLong()
 
+    @ExperimentalComposeUiApi
+    override val ownerViewId: Long
+        get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            UniqueDrawingIdApi29.getUniqueDrawingId(ownerView)
+        } else {
+            -1
+        }
+
+    @RequiresApi(29)
+    private class UniqueDrawingIdApi29 {
+        @RequiresApi(29)
+        companion object {
+            @JvmStatic
+            fun getUniqueDrawingId(view: View) = view.uniqueDrawingId
+        }
+    }
+
     /**
      * Configure the camera distance on the View in pixels. View already has a get/setCameraDistance
      * API however, that operates in Dp values.
@@ -135,6 +158,7 @@
         if (!drawnWithZ && elevation > 0) {
             invalidateParentLayer()
         }
+        matrixCache.invalidate()
     }
 
     private fun updateOutlineResolver() {
@@ -168,6 +192,7 @@
             updateOutlineResolver()
             layout(left, top, left + width, top + height)
             resetClipBounds()
+            matrixCache.invalidate()
         }
     }
 
@@ -176,10 +201,12 @@
 
         if (left != this.left) {
             offsetLeftAndRight(left - this.left)
+            matrixCache.invalidate()
         }
         val top = position.y
         if (top != this.top) {
             offsetTopAndBottom(top - this.top)
+            matrixCache.invalidate()
         }
     }
 
@@ -241,9 +268,20 @@
         // should not do anything. If we keep this, we get more redrawing than is necessary.
     }
 
-    override fun getMatrix(matrix: Matrix) {
-        val androidMatrix = super.getMatrix()
-        matrix.setFrom(androidMatrix)
+    override fun mapOffset(point: Offset, inverse: Boolean): Offset {
+        return if (inverse) {
+            matrixCache.getInverseMatrix(this).map(point)
+        } else {
+            matrixCache.getMatrix(this).map(point)
+        }
+    }
+
+    override fun mapBounds(rect: MutableRect, inverse: Boolean) {
+        if (inverse) {
+            matrixCache.getInverseMatrix(this).map(rect)
+        } else {
+            matrixCache.getMatrix(this).map(rect)
+        }
     }
 
     companion object {
@@ -300,3 +338,85 @@
         }
     }
 }
+
+/**
+ * Helper class to cache a [Matrix] and inverse [Matrix], allowing the instance to be reused until
+ * the [RenderNodeLayer]'s properties have changed, causing it to call [invalidate].
+ *
+ * This allows us to avoid repeated calls to [android.graphics.Matrix.getValues], which calls
+ * an expensive native method (nGetValues). If we know the matrix hasn't changed, we can just
+ * re-use it without needing to read and update values.
+ */
+private class ViewLayerMatrixCache {
+    private var androidMatrixCache: android.graphics.Matrix? = null
+    private var inverseAndroidMatrixCache: android.graphics.Matrix? = null
+    private var matrixCache: Matrix? = null
+    private var inverseMatrixCache: Matrix? = null
+
+    private var isDirty = true
+    private var isInverseDirty = true
+
+    /**
+     * Ensures that the internal matrix will be updated next time [getMatrix] or [getInverseMatrix]
+     * is called - this should be called when something that will change the matrix calculation
+     * has happened.
+     */
+    fun invalidate() {
+        isDirty = true
+        isInverseDirty = true
+    }
+
+    /**
+     * Returns the cached [Matrix], updating it if required (if [invalidate] was previously called).
+     */
+    fun getMatrix(view: View): Matrix {
+        val matrix = matrixCache ?: Matrix().also {
+            matrixCache = it
+        }
+        if (!isDirty) {
+            return matrix
+        }
+
+        val new = view.matrix
+
+        if (androidMatrixCache != new) {
+            // Update the Compose matrix if the underlying Android matrix has changed
+            matrix.setFrom(new)
+            if (androidMatrixCache == null) {
+                androidMatrixCache = android.graphics.Matrix(new)
+            } else {
+                androidMatrixCache!!.set(new)
+            }
+        }
+        isDirty = false
+        return matrix
+    }
+
+    /**
+     * Returns the cached inverse [Matrix], updating it if required (if [invalidate] was previously
+     * called).
+     */
+    fun getInverseMatrix(view: View): Matrix {
+        val matrix = inverseMatrixCache ?: Matrix().also {
+            inverseMatrixCache = it
+        }
+        if (!isInverseDirty) {
+            return matrix
+        }
+
+        val new = view.matrix
+
+        if (inverseAndroidMatrixCache != new) {
+            // Update the Compose matrix if the underlying Android matrix has changed
+            matrix.setFrom(new)
+            matrix.invert()
+            if (inverseAndroidMatrixCache == null) {
+                inverseAndroidMatrixCache = android.graphics.Matrix(new)
+            } else {
+                inverseAndroidMatrixCache!!.set(new)
+            }
+        }
+        isInverseDirty = false
+        return matrix
+    }
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
index ccd2990..f946d04 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
@@ -26,6 +26,7 @@
 import androidx.compose.ui.R
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineStart
@@ -176,8 +177,13 @@
             object : View.OnAttachStateChangeListener {
                 override fun onViewAttachedToWindow(v: View) {}
                 override fun onViewDetachedFromWindow(v: View) {
-                    unsetJob.cancel()
                     v.removeOnAttachStateChangeListener(this)
+                    // cancel the job to clean up the view tags.
+                    // this will happen immediately since unsetJob is on an immediate dispatcher
+                    // for this view's UI thread instead of waiting for the recomposer to join.
+                    // NOTE: This does NOT cancel the returned recomposer itself, as it may be
+                    // a shared-instance recomposer that should remain running/is reused elsewhere.
+                    unsetJob.cancel()
                 }
             }
         )
@@ -186,6 +192,28 @@
 }
 
 /**
+ * Find the "content child" for this view. The content child is the view that is either
+ * a direct child of the view with id [android.R.id.content] (and was therefore set as a
+ * content view into an activity or dialog window) or the root view of the window.
+ *
+ * This is used as opposed to [View.getRootView] as the Android framework can reuse an activity
+ * window's decor views across activity recreation events. Since a window recomposer is associated
+ * with the lifecycle of the host activity, we want that recomposer to shut down and create a new
+ * one for the new activity instance.
+ */
+private val View.contentChild: View
+    get() {
+        var self: View = this
+        var parent: ViewParent? = self.parent
+        while (parent is View) {
+            if (parent.id == android.R.id.content) return self
+            self = parent
+            parent = self.parent
+        }
+        return self
+    }
+
+/**
  * Get or lazily create a [Recomposer] for this view's window. The view must be attached
  * to a window with a [ViewTreeLifecycleOwner] registered at the root to access this property.
  */
@@ -195,7 +223,7 @@
         check(isAttachedToWindow) {
             "Cannot locate windowRecomposer; View $this is not attached to a window"
         }
-        val rootView = rootView
+        val rootView = contentChild
         return when (val rootParentRef = rootView.compositionContext) {
             null -> WindowRecomposerPolicy.createAndInstallWindowRecomposer(rootView)
             is Recomposer -> rootParentRef
@@ -214,20 +242,43 @@
     val viewTreeLifecycleOwner = checkNotNull(ViewTreeLifecycleOwner.get(this)) {
         "ViewTreeLifecycleOwner not found from $this"
     }
+    // Removing the view holding the ViewTreeRecomposer means we may never be reattached again.
+    // Since this factory function is used to create a new recomposer for each invocation and
+    // doesn't reuse a single instance like other factories might, shut it down whenever it
+    // becomes detached. This can easily happen as part of setting a new content view.
+    addOnAttachStateChangeListener(
+        object : View.OnAttachStateChangeListener {
+            override fun onViewAttachedToWindow(v: View?) {}
+            override fun onViewDetachedFromWindow(v: View?) {
+                removeOnAttachStateChangeListener(this)
+                recomposer.cancel()
+            }
+        }
+    )
     viewTreeLifecycleOwner.lifecycle.addObserver(
-        LifecycleEventObserver { _, event ->
-            @Suppress("NON_EXHAUSTIVE_WHEN")
-            when (event) {
-                Lifecycle.Event.ON_CREATE ->
-                    // Undispatched launch since we've configured this scope
-                    // to be on the UI thread
-                    runRecomposeScope.launch(start = CoroutineStart.UNDISPATCHED) {
-                        recomposer.runRecomposeAndApplyChanges()
+        object : LifecycleEventObserver {
+            override fun onStateChanged(lifecycleOwner: LifecycleOwner, event: Lifecycle.Event) {
+                val self = this
+                @Suppress("NON_EXHAUSTIVE_WHEN")
+                when (event) {
+                    Lifecycle.Event.ON_CREATE ->
+                        // Undispatched launch since we've configured this scope
+                        // to be on the UI thread
+                        runRecomposeScope.launch(start = CoroutineStart.UNDISPATCHED) {
+                            try {
+                                recomposer.runRecomposeAndApplyChanges()
+                            } finally {
+                                // If runRecomposeAndApplyChanges returns or this coroutine is
+                                // cancelled it means we no longer care about this lifecycle.
+                                // Clean up the dangling references tied to this observer.
+                                lifecycleOwner.lifecycle.removeObserver(self)
+                            }
+                        }
+                    Lifecycle.Event.ON_START -> pausableClock?.resume()
+                    Lifecycle.Event.ON_STOP -> pausableClock?.pause()
+                    Lifecycle.Event.ON_DESTROY -> {
+                        recomposer.cancel()
                     }
-                Lifecycle.Event.ON_START -> pausableClock?.resume()
-                Lifecycle.Event.ON_STOP -> pausableClock?.pause()
-                Lifecycle.Event.ON_DESTROY -> {
-                    recomposer.cancel()
                 }
             }
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt
new file mode 100644
index 0000000..7bfbdb9
--- /dev/null
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt
@@ -0,0 +1,150 @@
+/*
+ * 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.accessibility
+
+import androidx.compose.ui.fastReduce
+import androidx.compose.ui.fastZipWithNext
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.semantics.CollectionInfo
+import androidx.compose.ui.semantics.CollectionItemInfo
+import androidx.compose.ui.semantics.SemanticsNode
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
+import kotlin.math.abs
+
+internal fun setCollectionInfo(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
+    // prioritise collection info provided by developer
+    val collectionInfo = node.config.getOrNull(SemanticsProperties.CollectionInfo)
+    if (collectionInfo != null) {
+        info.setCollectionInfo(collectionInfo.toAccessibilityCollectionInfo())
+        return
+    }
+
+    // if no collection info is provided, we'll check the 'SelectableGroup'
+    val groupedChildren = mutableListOf<SemanticsNode>()
+
+    if (node.config.getOrNull(SemanticsProperties.SelectableGroup) != null) {
+        node.children.fastForEach { childNode ->
+            // we assume that Tabs and RadioButtons are not mixed under a single group
+            if (childNode.config.contains(SemanticsProperties.Selected)) {
+                groupedChildren.add(childNode)
+            }
+        }
+    }
+
+    if (groupedChildren.isNotEmpty()) {
+        val isHorizontal = calculateIfHorizontallyStacked(groupedChildren)
+        info.setCollectionInfo(
+            AccessibilityNodeInfoCompat.CollectionInfoCompat.obtain(
+                if (isHorizontal) 1 else groupedChildren.count(),
+                if (isHorizontal) groupedChildren.count() else 1,
+                false,
+                AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_NONE
+            )
+        )
+    }
+}
+
+internal fun setCollectionItemInfo(node: SemanticsNode, info: AccessibilityNodeInfoCompat) {
+    // prioritise collection item info provided by developer
+    val collectionItemInfo = node.config.getOrNull(SemanticsProperties.CollectionItemInfo)
+    if (collectionItemInfo != null) {
+        info.setCollectionItemInfo(collectionItemInfo.toAccessibilityCollectionItemInfo(node))
+    }
+
+    // if no collection item info is provided, we'll check the 'SelectableGroup'
+    val parentNode = node.parent ?: return
+    if (parentNode.config.getOrNull(SemanticsProperties.SelectableGroup) != null) {
+        // first check if parent has a CollectionInfo. If it does and any of the counters is
+        // unknown, then we assume that it is a lazy collection so we won't provide
+        // collectionItemInfo using `SelectableGroup`
+        val collectionInfo = parentNode.config.getOrNull(SemanticsProperties.CollectionInfo)
+        if (collectionInfo != null && collectionInfo.isLazyCollection) return
+
+        // `SelectableGroup` designed for selectable elements
+        if (!node.config.contains(SemanticsProperties.Selected)) return
+
+        val groupedChildren = mutableListOf<SemanticsNode>()
+
+        // find all siblings to calculate the index
+        parentNode.children.fastForEach { childNode ->
+            if (childNode.config.contains(SemanticsProperties.Selected)) {
+                groupedChildren.add(childNode)
+            }
+        }
+
+        if (groupedChildren.isNotEmpty()) {
+            val isHorizontal = calculateIfHorizontallyStacked(groupedChildren)
+
+            groupedChildren.fastForEachIndexed { index, tabNode ->
+                if (tabNode.id == node.id) {
+                    val itemInfo = AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
+                        if (isHorizontal) 0 else index,
+                        1,
+                        if (isHorizontal) index else 0,
+                        1,
+                        false,
+                        tabNode.config.getOrElse(SemanticsProperties.Selected) { false }
+                    )
+                    if (itemInfo != null) {
+                        info.setCollectionItemInfo(itemInfo)
+                    }
+                }
+            }
+        }
+    }
+}
+
+/** A naïve algorithm to determine if elements are stacked vertically or horizontally */
+private fun calculateIfHorizontallyStacked(items: List<SemanticsNode>): Boolean {
+    if (items.count() < 2) return true
+
+    val deltas = items.fastZipWithNext { el1, el2 ->
+        Offset(
+            abs(el1.boundsInRoot.center.x - el2.boundsInRoot.center.x),
+            abs(el1.boundsInRoot.center.y - el2.boundsInRoot.center.y)
+        )
+    }
+    val (deltaX, deltaY) = when (deltas.count()) {
+        1 -> deltas.first()
+        else -> deltas.fastReduce { result, element -> result + element }
+    }
+    return deltaY < deltaX
+}
+
+private val CollectionInfo.isLazyCollection get() = rowCount < 0 || columnCount < 0
+
+private fun CollectionInfo.toAccessibilityCollectionInfo() =
+    AccessibilityNodeInfoCompat.CollectionInfoCompat.obtain(
+        rowCount,
+        columnCount,
+        false,
+        AccessibilityNodeInfoCompat.CollectionInfoCompat.SELECTION_MODE_NONE
+    )
+
+private fun CollectionItemInfo.toAccessibilityCollectionItemInfo(itemNode: SemanticsNode) =
+    AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(
+        rowIndex,
+        rowSpan,
+        columnIndex,
+        columnSpan,
+        false,
+        itemNode.config.getOrElse(SemanticsProperties.Selected) { false }
+    )
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index f63254f..8c0172d 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -21,17 +21,19 @@
 import android.graphics.Outline
 import android.graphics.PixelFormat
 import android.graphics.Rect
+import android.os.Build
 import android.view.Gravity
 import android.view.KeyEvent
 import android.view.MotionEvent
 import android.view.View
 import android.view.ViewOutlineProvider
 import android.view.WindowManager
+import androidx.annotation.RequiresApi
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.compositionLocalOf
 import androidx.compose.runtime.derivedStateOf
@@ -42,6 +44,7 @@
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.layout.Layout
@@ -55,8 +58,8 @@
 import androidx.compose.ui.semantics.popup
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
@@ -78,16 +81,42 @@
  * focusable then this property does nothing.
  * @property dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
  * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
- * @param securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the popup's
+ * @property securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the popup's
  * window.
+ * @property excludeFromSystemGesture A flag to check whether to set the systemGestureExclusionRects.
+ * The default is true.
+ * @property clippingEnabled Whether to allow the popup window to extend beyond the bounds of the
+ * screen. By default the window is clipped to the screen boundaries. Setting this to false will
+ * allow windows to be accurately positioned.
+ * The default value is true.
  */
 @Immutable
-class PopupProperties(
+class PopupProperties @ExperimentalComposeUiApi constructor(
     val focusable: Boolean = false,
     val dismissOnBackPress: Boolean = true,
     val dismissOnClickOutside: Boolean = true,
-    val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit
+    val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
+    @get:ExperimentalComposeUiApi
+    val excludeFromSystemGesture: Boolean = true,
+    @get:ExperimentalComposeUiApi
+    val clippingEnabled: Boolean = true
 ) {
+    @OptIn(ExperimentalComposeUiApi::class)
+    constructor(
+        focusable: Boolean = false,
+        dismissOnBackPress: Boolean = true,
+        dismissOnClickOutside: Boolean = true,
+        securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
+    ) : this (
+        focusable,
+        dismissOnBackPress,
+        dismissOnClickOutside,
+        securePolicy,
+        excludeFromSystemGesture = true,
+        clippingEnabled = true
+    )
+
+    @OptIn(ExperimentalComposeUiApi::class)
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is PopupProperties) return false
@@ -96,16 +125,21 @@
         if (dismissOnBackPress != other.dismissOnBackPress) return false
         if (dismissOnClickOutside != other.dismissOnClickOutside) return false
         if (securePolicy != other.securePolicy) return false
+        if (excludeFromSystemGesture != other.excludeFromSystemGesture) return false
+        if (clippingEnabled != other.clippingEnabled) return false
 
         return true
     }
 
+    @OptIn(ExperimentalComposeUiApi::class)
     override fun hashCode(): Int {
         var result = dismissOnBackPress.hashCode()
         result = 31 * result + focusable.hashCode()
         result = 31 * result + dismissOnBackPress.hashCode()
         result = 31 * result + dismissOnClickOutside.hashCode()
         result = 31 * result + securePolicy.hashCode()
+        result = 31 * result + excludeFromSystemGesture.hashCode()
+        result = 31 * result + clippingEnabled.hashCode()
         return result
     }
 }
@@ -329,6 +363,12 @@
 
     private val maxSupportedElevation = 30.dp
 
+    private val popupLayoutHelper: PopupLayoutHelper = if (Build.VERSION.SDK_INT >= 29) {
+        PopupLayoutHelperImpl29()
+    } else {
+        PopupLayoutHelperImpl()
+    }
+
     init {
         id = android.R.id.content
         ViewTreeLifecycleOwner.set(this, ViewTreeLifecycleOwner.get(composeView))
@@ -419,6 +459,14 @@
         )
     }
 
+    private fun setClippingEnabled(clippingEnabled: Boolean) = applyNewFlags(
+        if (clippingEnabled) {
+            params.flags and (WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS.inv())
+        } else {
+            params.flags or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+        }
+    )
+
     fun updateParameters(
         onDismissRequest: (() -> Unit)?,
         properties: PopupProperties,
@@ -430,6 +478,7 @@
         this.testTag = testTag
         setIsFocusable(properties.focusable)
         setSecurePolicy(properties.securePolicy)
+        setClippingEnabled(properties.clippingEnabled)
         superSetLayoutDirection(layoutDirection)
     }
 
@@ -441,6 +490,7 @@
     /**
      * Updates the position of the popup based on current position properties.
      */
+    @OptIn(ExperimentalComposeUiApi::class)
     fun updatePosition() {
         val parentBounds = parentBounds ?: return
         val popupContentSize = popupContentSize ?: return
@@ -461,6 +511,12 @@
         params.x = popupPosition.x
         params.y = popupPosition.y
 
+        if (properties.excludeFromSystemGesture) {
+            // Resolve conflict with gesture navigation back when dragging this handle view on the
+            // edge of the screen.
+            popupLayoutHelper.setGestureExclusionRects(this, windowSize.width, windowSize.height)
+        }
+
         windowManager.updateViewLayout(this, params)
     }
 
@@ -524,7 +580,6 @@
                 WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES or
                     WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
                     WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
-                    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
                     WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM or
                     WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                 ).inv()
@@ -553,6 +608,30 @@
     )
 }
 
+private interface PopupLayoutHelper {
+    fun setGestureExclusionRects(composeView: View, width: Int, height: Int)
+}
+
+private class PopupLayoutHelperImpl : PopupLayoutHelper {
+    override fun setGestureExclusionRects(composeView: View, width: Int, height: Int) {
+        // do nothing
+    }
+}
+
+@RequiresApi(29)
+private class PopupLayoutHelperImpl29 : PopupLayoutHelper {
+    override fun setGestureExclusionRects(composeView: View, width: Int, height: Int) {
+        composeView.systemGestureExclusionRects = mutableListOf(
+            Rect(
+                0,
+                0,
+                width,
+                height
+            )
+        )
+    }
+}
+
 internal fun View.isFlagSecureEnabled(): Boolean {
     val windowParams = rootView.layoutParams as? WindowManager.LayoutParams
     if (windowParams != null) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
index a9dfd8a..3bdf690 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/ComposedModifier.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui
 
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.ComposeCompilerApi
 import androidx.compose.runtime.Composer
 import androidx.compose.ui.platform.InspectorInfo
 import androidx.compose.ui.platform.InspectorValueInfo
@@ -55,7 +54,6 @@
  * You almost certainly do not need to call this function directly.
  */
 @Suppress("ModifierFactoryExtensionFunction")
-@OptIn(ComposeCompilerApi::class)
 fun Composer.materialize(modifier: Modifier): Modifier {
     if (modifier.all { it !is ComposedModifier }) return modifier
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
index f83d3e3..5c7561e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusManager.kt
@@ -60,25 +60,39 @@
      */
     fun moveFocus(focusDirection: FocusDirection): Boolean
 
-    // TODO(b/184086802): In 2.0, after deleting FocusDirectionInternal and adding "In" to
-    //  FocusDirection, deprecate and remove this function.
     /**
      * Moves focus to one of the children of the currently focused item.
      *
-     * @return true if focus was moved successfully.
-     */
-    @ExperimentalComposeUiApi
-    fun moveFocusIn(): Boolean
-
-    // TODO(b/184086802): In 2.0, after deleting FocusDirectionInternal and adding "Out" to
-    //  FocusDirection, deprecate and remove this function.
-    /**
-     * Moves focus to the nearest focusable parent of the currently focused item.
+     * This function is deprecated. Use FocusManager.moveFocus(FocusDirection.In) instead.
      *
      * @return true if focus was moved successfully.
      */
     @ExperimentalComposeUiApi
-    fun moveFocusOut(): Boolean
+    @Deprecated(
+        message = "Use FocusManager.moveFocus(FocusDirection.In) instead",
+        ReplaceWith(
+            "moveFocus(In)",
+            "androidx.compose.ui.focus.FocusDirection.Companion.In"
+        )
+    )
+    fun moveFocusIn(): Boolean = false
+
+    /**
+     * Moves focus to the nearest focusable parent of the currently focused item.
+     *
+     *  This function is deprecated. Use FocusManager.moveFocus(FocusDirection.Out) instead.
+     *
+     * @return true if focus was moved successfully.
+     */
+    @ExperimentalComposeUiApi
+    @Deprecated(
+        message = "Use FocusManager.moveFocus(FocusDirection.Out) instead",
+        ReplaceWith(
+            "moveFocus(Out)",
+            "androidx.compose.ui.focus.FocusDirection.Companion.Out"
+        )
+    )
+    fun moveFocusOut(): Boolean = false
 }
 
 /**
@@ -173,35 +187,7 @@
      * @return true if focus was moved successfully. false if the focused item is unchanged.
      */
     override fun moveFocus(focusDirection: FocusDirection): Boolean {
-        val internalFocusDirection = when (focusDirection) {
-            FocusDirection.Next -> FocusDirectionInternal.Next
-            FocusDirection.Previous -> FocusDirectionInternal.Previous
-            FocusDirection.Left -> FocusDirectionInternal.Left
-            FocusDirection.Right -> FocusDirectionInternal.Right
-            FocusDirection.Up -> FocusDirectionInternal.Up
-            FocusDirection.Down -> FocusDirectionInternal.Down
-        }
-        return focusModifier.focusNode.moveFocus(internalFocusDirection)
-    }
-
-    /**
-     * Moves focus to one of the children of the currently focused item.
-     *
-     * @return true if focus was moved successfully.
-     */
-    @ExperimentalComposeUiApi
-    override fun moveFocusIn(): Boolean {
-        return focusModifier.focusNode.moveFocus(FocusDirectionInternal.In)
-    }
-
-    /**
-     * Moves focus to the nearest focusable parent of the currently focused item.
-     *
-     * @return true if focus was moved successfully.
-     */
-    @ExperimentalComposeUiApi
-    override fun moveFocusOut(): Boolean {
-        return focusModifier.focusNode.moveFocus(FocusDirectionInternal.Out)
+        return focusModifier.focusNode.moveFocus(focusDirection)
     }
 }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
index 8a902f0..66cd24e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusTraversal.kt
@@ -16,14 +16,15 @@
 
 package androidx.compose.ui.focus
 
-import androidx.compose.ui.focus.FocusDirectionInternal.Down
-import androidx.compose.ui.focus.FocusDirectionInternal.In
-import androidx.compose.ui.focus.FocusDirectionInternal.Left
-import androidx.compose.ui.focus.FocusDirectionInternal.Next
-import androidx.compose.ui.focus.FocusDirectionInternal.Out
-import androidx.compose.ui.focus.FocusDirectionInternal.Previous
-import androidx.compose.ui.focus.FocusDirectionInternal.Right
-import androidx.compose.ui.focus.FocusDirectionInternal.Up
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+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.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.focus.FocusRequester.Companion.Default
 import androidx.compose.ui.focus.FocusState.Active
 import androidx.compose.ui.focus.FocusState.ActiveParent
@@ -35,20 +36,84 @@
 import androidx.compose.ui.unit.LayoutDirection.Ltr
 import androidx.compose.ui.unit.LayoutDirection.Rtl
 
-/**
- * This enum specifies the direction of the requested focus change.
- */
-enum class FocusDirection { Next, Previous, Left, Right, Up, Down }
+private const val invalidFocusDirection = "Invalid FocusDirection"
 
-// TODO(b/184086802): In 2.0, delete FocusDirectionInternal and add In and Out to FocusDirection.
 /**
- * This enum specifies the direction of the requested focus change.
+ * The [FocusDirection] is used to specify direction when a focus change request is made via
+ * [moveFocus].
  *
- * This enum is similar to [FocusDirection], but it contains the additional values [In] which can
- * be used to move focus from a parent to one of its children, and [Out] which moves focus to
- * the parent.
+ * @sample androidx.compose.ui.samples.MoveFocusSample
  */
-internal enum class FocusDirectionInternal { Next, Previous, Left, Right, Up, Down, In, Out }
+inline class FocusDirection(val value: Int) {
+
+    override fun toString(): String {
+        return when (this) {
+            Next -> "Next"
+            Previous -> "Previous"
+            Left -> "Left"
+            Right -> "Right"
+            Up -> "Up"
+            Down -> "Down"
+            @OptIn(ExperimentalComposeUiApi::class)
+            In -> "In"
+            @OptIn(ExperimentalComposeUiApi::class)
+            Out -> "Out"
+            else -> invalidFocusDirection
+        }
+    }
+
+    companion object {
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item.
+         */
+        val Next: FocusDirection = FocusDirection(1)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the previous
+         *  focusable item.
+         */
+        val Previous: FocusDirection = FocusDirection(2)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item to the left of the currently focused item.
+         */
+        val Left: FocusDirection = FocusDirection(3)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item to the right of the currently focused item.
+         */
+        val Right: FocusDirection = FocusDirection(4)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item that is above the currently focused item.
+         */
+        val Up: FocusDirection = FocusDirection(5)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item that is below the currently focused item.
+         */
+        val Down: FocusDirection = FocusDirection(6)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you are searching for the next
+         *  focusable item that is a child of the currently focused item.
+         */
+        @ExperimentalComposeUiApi
+        val In: FocusDirection = FocusDirection(7)
+
+        /**
+         *  Direction used in [moveFocus] to indicate that you want to move focus to the parent
+         *  of the currently focused item.
+         */
+        @ExperimentalComposeUiApi
+        val Out: FocusDirection = FocusDirection(8)
+    }
+}
 
 /**
  * Moves focus based on the requested focus direction.
@@ -57,7 +122,7 @@
  * @return whether a focus node was found. If a focus node was found and the focus request was
  * not granted, this function still returns true.
  */
-internal fun ModifiedFocusNode.moveFocus(focusDirection: FocusDirectionInternal): Boolean {
+internal fun ModifiedFocusNode.moveFocus(focusDirection: FocusDirection): Boolean {
     // TODO(b/176847718): Pass the layout direction as a parameter instead of this hardcoded value.
     val layoutDirection: LayoutDirection = Ltr
 
@@ -81,12 +146,15 @@
     val nextNode = when (focusDirection) {
         Next, Previous -> null // TODO(b/170155659): Perform one dimensional focus search.
         Left, Right, Up, Down -> twoDimensionalFocusSearch(focusDirection)
+        @OptIn(ExperimentalComposeUiApi::class)
         In -> {
             // we search among the children of the active item.
             val direction = when (layoutDirection) { Rtl -> Left; Ltr -> Right }
             activeNode.twoDimensionalFocusSearch(direction)
         }
+        @OptIn(ExperimentalComposeUiApi::class)
         Out -> activeNode.findParentFocusNode()
+        else -> error(invalidFocusDirection)
     } ?: return false
 
     // If we found a potential next item, call requestFocus() to move focus to it.
@@ -108,7 +176,7 @@
  * children.
  */
 private fun ModifiedFocusNode.customFocusSearch(
-    focusDirection: FocusDirectionInternal,
+    focusDirection: FocusDirection,
     layoutDirection: LayoutDirection
 ): FocusRequester {
     val focusOrder = FocusOrder()
@@ -132,6 +200,10 @@
         //  the user presses dPad center. (They can also redirect the "In" to some other item).
         //  Developers can specify a custom "Out" to specify which composable should take focus
         //  when the user presses the back button.
-        In, Out -> Default
+        @OptIn(ExperimentalComposeUiApi::class)
+        In -> Default
+        @OptIn(ExperimentalComposeUiApi::class)
+        Out -> Default
+        else -> error(invalidFocusDirection)
     }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
index 1fbe574..c5d8b9e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/TwoDimensionalFocusSearch.kt
@@ -16,10 +16,10 @@
 
 package androidx.compose.ui.focus
 
-import androidx.compose.ui.focus.FocusDirectionInternal.Down
-import androidx.compose.ui.focus.FocusDirectionInternal.Left
-import androidx.compose.ui.focus.FocusDirectionInternal.Right
-import androidx.compose.ui.focus.FocusDirectionInternal.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+import androidx.compose.ui.focus.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.focus.FocusState.Active
 import androidx.compose.ui.focus.FocusState.ActiveParent
 import androidx.compose.ui.focus.FocusState.Captured
@@ -36,13 +36,13 @@
 
 /**
  *  Perform a search among the immediate children of this [node][ModifiedFocusNode] in the
- *  specified [direction][FocusDirectionInternal] and return the node that is to be focused next. If one
+ *  specified [direction][FocusDirection] and return the node that is to be focused next. If one
  *  of the children is currently focused, we start from that point and search in the specified
- *  [direction][FocusDirectionInternal]. If none of the children are currently focused, we pick the
- *  top-left or bottom right based on the specified [direction][FocusDirectionInternal].
+ *  [direction][FocusDirection]. If none of the children are currently focused, we pick the
+ *  top-left or bottom right based on the specified [direction][FocusDirection].
  */
 internal fun ModifiedFocusNode.twoDimensionalFocusSearch(
-    direction: FocusDirectionInternal
+    direction: FocusDirection
 ): ModifiedFocusNode? {
     return when (focusState) {
         Inactive -> this
@@ -89,7 +89,7 @@
 //  valid candidates.
 private fun List<ModifiedFocusNode>.findBestCandidate(
     focusRect: Rect,
-    direction: FocusDirectionInternal
+    direction: FocusDirection
 ): ModifiedFocusNode? {
     // Pick an impossible rectangle as the initial best candidate Rect.
     var bestCandidate = when (direction) {
@@ -118,7 +118,7 @@
     proposedCandidate: Rect,
     currentCandidate: Rect,
     focusedRect: Rect,
-    direction: FocusDirectionInternal
+    direction: FocusDirection
 ): Boolean {
 
     // Is this Rect a candidate for the next focus given the direction? This checks whether the
@@ -191,7 +191,7 @@
     source: Rect,
     rect1: Rect,
     rect2: Rect,
-    direction: FocusDirectionInternal
+    direction: FocusDirection
 ): Boolean {
     // Do the "beams" w.r.t the given direction's axis of rect1 and rect2 overlap?
     fun Rect.inSourceBeam() = when (direction) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
index 088b52f..c14d519 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/key/KeyEvent.kt
@@ -79,19 +79,31 @@
 /**
  * The type of Key Event.
  */
-enum class KeyEventType {
-    /**
-     * Unknown key event.
-     */
-    Unknown,
+inline class KeyEventType(val value: Int) {
 
-    /**
-     * Type of KeyEvent sent when the user lifts their finger off a key on the keyboard.
-     */
-    KeyUp,
+    override fun toString(): String {
+        return when (this) {
+            KeyUp -> "KeyUp"
+            KeyDown -> "KeyDown"
+            Unknown -> "Unknown"
+            else -> "Invalid"
+        }
+    }
 
-    /**
-     * Type of KeyEvent sent when the user presses down their finger on a key on the keyboard.
-     */
-    KeyDown
+    companion object {
+        /**
+         * Unknown key event.
+         */
+        val Unknown: KeyEventType = KeyEventType(0)
+
+        /**
+         * Type of KeyEvent sent when the user lifts their finger off a key on the keyboard.
+         */
+        val KeyUp: KeyEventType = KeyEventType(1)
+
+        /**
+         * Type of KeyEvent sent when the user presses down their finger on a key on the keyboard.
+         */
+        val KeyDown: KeyEventType = KeyEventType(2)
+    }
 }
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 7dde65a..8bf9f48 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
@@ -16,37 +16,24 @@
 
 package androidx.compose.ui.input.pointer
 
+import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.findRoot
 import androidx.compose.ui.node.InternalCoreApi
 
 /**
  * Organizes pointers and the [PointerInputFilter]s that they hit into a hierarchy such that
  * [PointerInputChange]s can be dispatched to the [PointerInputFilter]s in a hierarchical fashion.
+ *
+ * @property rootCoordinates the root [LayoutCoordinates] that [PointerInputChange]s will be
+ * relative to.
  */
 @OptIn(InternalCoreApi::class)
-internal class HitPathTracker {
+internal class HitPathTracker(private val rootCoordinates: LayoutCoordinates) {
 
     /*@VisibleForTesting*/
     internal val root: NodeParent = NodeParent()
 
-    private val retainedHitPaths: MutableSet<PointerId> = mutableSetOf()
-
-    internal interface DispatchChangesRetVal {
-        operator fun component1(): InternalPointerEvent
-        operator fun component2(): Boolean
-    }
-
-    private class DispatchChangesRetValImpl : DispatchChangesRetVal {
-        lateinit var internalPointerEvent: InternalPointerEvent
-        var wasDispatchedToSomething: Boolean = false
-        override operator fun component1() = internalPointerEvent
-        override operator fun component2() = wasDispatchedToSomething
-    }
-
-    // See https://youtrack.jetbrains.com/issue/KT-39905.
-    private val dispatchChangesRetVal = DispatchChangesRetValImpl()
-
     /**
      * Associates a [pointerId] to a list of hit [pointerInputFilters] and keeps track of them.
      *
@@ -65,9 +52,11 @@
         eachPin@ for (i in pointerInputFilters.indices) {
             val pointerInputFilter = pointerInputFilters[i]
             if (merging) {
-                val node = parent.children.find { it.pointerInputFilter == pointerInputFilter }
+                val node = parent.children.firstOrNull {
+                    it.pointerInputFilter == pointerInputFilter
+                }
                 if (node != null) {
-                    node.pointerIds.add(pointerId)
+                    if (pointerId !in node.pointerIds) node.pointerIds.add(pointerId)
                     parent = node
                     continue@eachPin
                 } else {
@@ -87,52 +76,34 @@
      * therefore no longer associated with any pointer ids.
      */
     fun removeHitPath(pointerId: PointerId) {
-        removeHitPathInternal(pointerId)
-        removeHitPathInternal(pointerId)
+        root.recursivelyRemovePointerId(pointerId)
     }
 
     /**
      * Dispatches [internalPointerEvent] through the hierarchy.
      *
-     * Returns a [DispatchChangesRetVal] that should not be referenced directly, but instead
-     * should be destrutured immediately.  Each instance of [HitPathTracker] reuses a single
-     * [DispatchChangesRetVal] and mutates it for each return for performance reasons.
-     *
-     * [DispatchChangesRetVal.component1] references the resulting changes after dispatch.
-     * [DispatchChangesRetVal.component2] is true if the dispatch reached at least one
-     * [PointerInputModifier].
-     *
      * @param internalPointerEvent The change to dispatch.
      *
-     * @return The DispatchChangesRetVal that should be destructured immediately.
+     * @return whether this event was dispatched to a [PointerInputFilter]
      */
-    fun dispatchChanges(internalPointerEvent: InternalPointerEvent): DispatchChangesRetVal {
-        var dispatchHit = false
+    fun dispatchChanges(internalPointerEvent: InternalPointerEvent): Boolean {
+        var dispatchHit = root.dispatchMainEventPass(
+            internalPointerEvent.changes,
+            rootCoordinates,
+            internalPointerEvent
+        )
+        dispatchHit = root.dispatchFinalEventPass() || dispatchHit
 
-        dispatchHit = root.dispatchChanges(
-            internalPointerEvent,
-            PointerEventPass.Initial,
-            PointerEventPass.Main
-        ) || dispatchHit
-        dispatchHit = root.dispatchChanges(
-            internalPointerEvent,
-            PointerEventPass.Final,
-            null
-        ) || dispatchHit
-
-        dispatchChangesRetVal.wasDispatchedToSomething = dispatchHit
-        dispatchChangesRetVal.internalPointerEvent = internalPointerEvent
-        return dispatchChangesRetVal
+        return dispatchHit
     }
 
     /**
      * Dispatches cancel events to all tracked [PointerInputFilter]s to notify them that
-     * [PointerInputFilter.onPointerInput] will not be called again until all pointers have been
+     * [PointerInputFilter.onPointerEvent] will not be called again until all pointers have been
      * removed from the application and then at least one is added again, and removes all tracked
      * data.
      */
     fun processCancel() {
-        retainedHitPaths.clear()
         root.dispatchCancel()
         root.clear()
     }
@@ -146,13 +117,6 @@
     fun removeDetachedPointerInputFilters() {
         root.removeDetachedPointerInputFilters()
     }
-
-    /**
-     * Actually removes hit paths.
-     */
-    private fun removeHitPathInternal(pointerId: PointerId) {
-        root.removePointerId(pointerId)
-    }
 }
 
 /**
@@ -163,27 +127,48 @@
 /*@VisibleForTesting*/
 @OptIn(InternalCoreApi::class)
 internal open class NodeParent {
-    val children: MutableSet<Node> = mutableSetOf()
+    val children: MutableVector<Node> = mutableVectorOf()
 
     /**
-     * Dispatches the [InternalPointerEvent] down the tree.
+     * Dispatches [changes] down the tree, for the initial and main pass.
      *
-     * Note: [InternalPointerEvent] is expected to be mutated during dispatch.
+     * [changes] and other properties needed in all passes should be cached inside this method so
+     * they can be reused in [dispatchFinalEventPass], since the passes happen consecutively.
+     *
+     * @param changes the map containing [PointerInputChange]s that will be dispatched to
+     * relevant [PointerInputFilter]s
+     * @param parentCoordinates the [LayoutCoordinates] the positional information in [changes]
+     * is relative to
+     * @param internalPointerEvent the [InternalPointerEvent] needed to construct [PointerEvent]s
      */
-    open fun dispatchChanges(
-        internalPointerEvent: InternalPointerEvent,
-        downPass: PointerEventPass,
-        upPass: PointerEventPass?
+    open fun dispatchMainEventPass(
+        changes: Map<PointerId, PointerInputChange>,
+        parentCoordinates: LayoutCoordinates,
+        internalPointerEvent: InternalPointerEvent
     ): Boolean {
-        var dispatchedToSomething = false
+        var dispatched = false
         children.forEach {
-            dispatchedToSomething = it.dispatchChanges(
-                internalPointerEvent,
-                downPass,
-                upPass
-            ) || dispatchedToSomething
+            dispatched = it.dispatchMainEventPass(
+                changes,
+                parentCoordinates,
+                internalPointerEvent
+            ) || dispatched
         }
-        return dispatchedToSomething
+        return dispatched
+    }
+
+    /**
+     * Dispatches the final event pass down the tree.
+     *
+     * Properties cached in [dispatchMainEventPass] should be reset after this method, to ensure
+     * clean state for a future pass where pointer IDs / positions might be different.
+     */
+    open fun dispatchFinalEventPass(): Boolean {
+        var dispatched = false
+        children.forEach {
+            dispatched = it.dispatchFinalEventPass() || dispatched
+        }
+        return dispatched
     }
 
     /**
@@ -204,54 +189,33 @@
      * Removes all child [Node]s that are no longer attached to the compose tree.
      */
     fun removeDetachedPointerInputFilters() {
-        children.removeAndProcess(
-            removeIf = {
-                !it.pointerInputFilter.isAttached
-            },
-            ifRemoved = {
-                it.dispatchCancel()
-            },
-            ifKept = {
-                it.removeDetachedPointerInputFilters()
+        var index = 0
+        while (index < children.size) {
+            val child = children[index]
+            if (!child.pointerInputFilter.isAttached) {
+                children.removeAt(index)
+                child.dispatchCancel()
+            } else {
+                index++
+                child.removeDetachedPointerInputFilters()
             }
-        )
+        }
     }
 
     /**
      * Removes the tracking of [pointerId] and removes all child [Node]s that are no longer
-     * tracking
-     * any [PointerId]s.
+     * tracking any [PointerId]s.
      */
-    fun removePointerId(pointerId: PointerId) {
-        children.forEach {
-            it.pointerIds.remove(pointerId)
-        }
-        children.removeAll {
-            it.pointerIds.isEmpty()
-        }
-        children.forEach {
-            it.removePointerId(pointerId)
-        }
-    }
-
-    /**
-     * With each item, if calling [removeIf] with it is true, removes the item from [this] and calls
-     * [ifRemoved] with it, otherwise calls [ifKept] with it.
-     */
-    private fun <T> MutableIterable<T>.removeAndProcess(
-        removeIf: (T) -> Boolean,
-        ifRemoved: (T) -> Unit,
-        ifKept: (T) -> Unit
-    ) {
-        with(iterator()) {
-            while (hasNext()) {
-                val next = next()
-                if (removeIf(next)) {
-                    remove()
-                    ifRemoved(next)
-                } else {
-                    ifKept(next)
-                }
+    fun recursivelyRemovePointerId(pointerId: PointerId) {
+        var index = 0
+        while (index < children.size) {
+            val child = children[index]
+            child.pointerIds.remove(pointerId)
+            if (child.pointerIds.isEmpty()) {
+                children.removeAt(index)
+            } else {
+                child.recursivelyRemovePointerId(pointerId)
+                index++
             }
         }
     }
@@ -265,53 +229,156 @@
 @OptIn(InternalCoreApi::class)
 internal class Node(val pointerInputFilter: PointerInputFilter) : NodeParent() {
 
-    val pointerIds: MutableSet<PointerId> = mutableSetOf()
+    // Note: this is essentially a set, and writes should be guarded accordingly. We use a
+    // MutableVector here instead since a set ends up being quite heavy, and calls to
+    // set.contains() show up noticeably (~1%) in traces. Since the maximum size of this vector
+    // is small (due to the limited amount of concurrent PointerIds there _could_ be), iterating
+    // through the small vector in most cases should have a lower performance impact than using a
+    // set.
+    val pointerIds: MutableVector<PointerId> = mutableVectorOf()
 
-    override fun dispatchChanges(
-        internalPointerEvent: InternalPointerEvent,
-        downPass: PointerEventPass,
-        upPass: PointerEventPass?
+    /**
+     * Cached properties that will be set before the main event pass, and reset after the final
+     * pass. Since we know that these won't change within the entire pass, we don't need to
+     * calculate / create these for each pass / multiple times during a pass.
+     *
+     * @see buildCache
+     * @see clearCache
+     */
+    private val relevantChanges: MutableMap<PointerId, PointerInputChange> = mutableMapOf()
+    private var coordinates: LayoutCoordinates? = null
+    private var pointerEvent: PointerEvent? = null
+
+    override fun dispatchMainEventPass(
+        changes: Map<PointerId, PointerInputChange>,
+        parentCoordinates: LayoutCoordinates,
+        internalPointerEvent: InternalPointerEvent
     ): Boolean {
-
-        // TODO(shepshapard): Creating a new map everytime here, we could create a reusable one
-        //  per node.
-        // Filter for changes that are associated with pointer ids that are relevant to this node.
-        val relevantChanges =
-            internalPointerEvent.changes.filterTo(mutableMapOf()) { entry ->
-                pointerIds.contains(entry.key)
-            }
-
-        if (relevantChanges.isEmpty()) {
-            // If there are not relevant changes, there is nothing to process so return false.
-            return false
-        }
-
-        // Store all of the changes locally and put the relevant changes back into our event.
-        val allChanges = internalPointerEvent.changes
-        internalPointerEvent.changes = relevantChanges
+        // Build the cache that will be used for both the main and final pass
+        buildCache(changes, parentCoordinates, internalPointerEvent)
 
         // TODO(b/158243568): The below dispatching operations may cause the pointerInputFilter to
         //  become detached. Currently, they just no-op if it becomes detached and the detached
         //  pointerInputFilters are removed from being tracked with the next event. I currently
         //  believe they should be detached immediately. Though, it is possible they should be
         //  detached after the conclusion of dispatch (so onCancel isn't called during calls
-        //  to onPointerEvent).
+        //  to onPointerEvent). As a result we guard each successive dispatch with the same check.
+        return dispatchIfNeeded {
+            val event = pointerEvent!!
+            val size = coordinates!!.size
+            // Dispatch on the tunneling pass.
+            pointerInputFilter.onPointerEvent(event, PointerEventPass.Initial, size)
 
-        // Dispatch on the tunneling pass.
-        internalPointerEvent.dispatchToPointerInputFilter(pointerInputFilter, downPass)
+            // Dispatch to children.
+            if (pointerInputFilter.isAttached) {
+                children.forEach {
+                    it.dispatchMainEventPass(
+                        // Pass only the already-filtered and position-translated changes down to
+                        // children
+                        relevantChanges,
+                        coordinates!!,
+                        internalPointerEvent
+                    )
+                }
+            }
 
-        // Dispatch to children.
-        if (pointerInputFilter.isAttached) {
-            children.forEach { it.dispatchChanges(internalPointerEvent, downPass, upPass) }
+            if (pointerInputFilter.isAttached) {
+                // Dispatch on the bubbling pass.
+                pointerInputFilter.onPointerEvent(event, PointerEventPass.Main, size)
+            }
+        }
+    }
+
+    override fun dispatchFinalEventPass(): Boolean {
+        // TODO(b/158243568): The below dispatching operations may cause the pointerInputFilter to
+        //  become detached. Currently, they just no-op if it becomes detached and the detached
+        //  pointerInputFilters are removed from being tracked with the next event. I currently
+        //  believe they should be detached immediately. Though, it is possible they should be
+        //  detached after the conclusion of dispatch (so onCancel isn't called during calls
+        //  to onPointerEvent). As a result we guard each successive dispatch with the same check.
+        val result = dispatchIfNeeded {
+            val event = pointerEvent!!
+            val size = coordinates!!.size
+            // Dispatch on the tunneling pass.
+            pointerInputFilter.onPointerEvent(event, PointerEventPass.Final, size)
+
+            // Dispatch to children.
+            if (pointerInputFilter.isAttached) {
+                children.forEach { it.dispatchFinalEventPass() }
+            }
+        }
+        clearCache()
+        return result
+    }
+
+    /**
+     * Calculates cached properties that will be stored in this [Node] for the duration of both
+     * [dispatchMainEventPass] and [dispatchFinalEventPass]. This allows us to avoid repeated
+     * work between passes, and within passes, as these properties won't change during the
+     * overall dispatch.
+     *
+     * @see clearCache
+     */
+    private fun buildCache(
+        changes: Map<PointerId, PointerInputChange>,
+        parentCoordinates: LayoutCoordinates,
+        internalPointerEvent: InternalPointerEvent
+    ) {
+        // Avoid future work if we know this node will no-op
+        if (!pointerInputFilter.isAttached) return
+
+        coordinates = pointerInputFilter.layoutCoordinates
+
+        for ((key, change) in changes) {
+            // Filter for changes that are associated with pointer ids that are relevant to this
+            // node
+            if (key in pointerIds) {
+                // And translate their position relative to the parent coordinates, to give us a
+                // change local to the PointerInputFilter's coordinates
+                relevantChanges[key] = change.copy(
+                    previousPosition = coordinates!!.localPositionOf(
+                        parentCoordinates,
+                        change.previousPosition
+                    ),
+                    currentPosition = coordinates!!.localPositionOf(
+                        parentCoordinates,
+                        change.position
+                    )
+                )
+            }
         }
 
-        // Dispatch on the bubbling pass.
-        internalPointerEvent.dispatchToPointerInputFilter(pointerInputFilter, upPass)
+        if (relevantChanges.isEmpty()) return
 
-        // Put all of the relevant changes that were in the internalPointerEvent back into all of
-        // the changes, and then set all of the changes back onto the internalPointerEvent.
-        allChanges.putAll(internalPointerEvent.changes)
-        internalPointerEvent.changes = allChanges
+        pointerEvent = PointerEvent(relevantChanges.values.toList(), internalPointerEvent)
+    }
+
+    /**
+     * Resets cached properties in case this node will continue to track different [pointerIds]
+     * than the ones we built the cache for, instead of being removed.
+     *
+     * @see buildCache
+     */
+    private fun clearCache() {
+        relevantChanges.clear()
+        coordinates = null
+        pointerEvent = null
+    }
+
+    /**
+     * Calls [block] if there are relevant changes, and if [pointerInputFilter] is attached
+     *
+     * @return whether [block] was called
+     */
+    private inline fun dispatchIfNeeded(
+        block: () -> Unit
+    ): Boolean {
+        // If there are no relevant changes, there is nothing to process so return false.
+        if (relevantChanges.isEmpty()) return false
+        // If the input filter is not attached, avoid dispatching
+        if (!pointerInputFilter.isAttached) return false
+
+        block()
 
         // We dispatched to at least one pointer input filter so return true.
         return true
@@ -333,81 +400,4 @@
         return "Node(pointerInputFilter=$pointerInputFilter, children=$children, " +
             "pointerIds=$pointerIds)"
     }
-
-    /**
-     * Dispatches [this] to [filter].
-     *
-     * This includes offsetting the pointer coordinates to be relative to [filter].  Also manages
-     * cases where the [filter] is removed from the hierarchy during dispatch.
-     *
-     * Is a no-op if [filter] is not attached or [pass] is null.
-     */
-    private fun InternalPointerEvent.dispatchToPointerInputFilter(
-        filter: PointerInputFilter,
-        pass: PointerEventPass?
-    ) {
-        if (pass == null || !pointerInputFilter.isAttached) {
-            return
-        }
-
-        // Get the position before dispatch as the PointerInputFilter may not be attached after
-        // dispatch or could have moved in some synchronous way (an Android parent may have moved
-        // for example) and we actually want to add back whatever position was previously
-        // subtracted.
-        val coordinates = filter.layoutCoordinates!!
-        val root = coordinates.findRoot()
-
-        val pointerEvent = PointerEvent(changesInLocal(root, coordinates), this)
-        filter.onPointerEvent(pointerEvent, pass, coordinates.size)
-    }
-
-    private fun InternalPointerEvent.changesInLocal(
-        root: LayoutCoordinates,
-        local: LayoutCoordinates
-    ): List<PointerInputChange> {
-        val list = mutableListOf<PointerInputChange>()
-        changes.values.forEach { change ->
-            list += change.copy(
-                previousPosition = local.localPositionOf(root, change.previousPosition),
-                currentPosition = local.localPositionOf(root, change.position)
-            )
-        }
-        return list
-    }
-}
-
-private inline fun <K, V> MutableMap<K, V>.putOrUpdate(
-    key: K,
-    putValue: V,
-    updateBlock: (valueToUpdate: V) -> V
-) {
-    val value = get(key)
-    if (value == null) {
-        put(key, putValue)
-    } else {
-        put(key, updateBlock(value))
-    }
-}
-
-/**
- * Removes the item at [key] if [removePredicate] returns true, otherwise updates the item with the
- * value returned by [updateBlock].
- *
- * @return True if value was removed, false if updated.
- */
-private inline fun <K, V> MutableMap<K, V>.removeOrUpdate(
-    key: K,
-    removePredicate: (valueToRemove: V) -> Boolean,
-    updateBlock: (valueToUpdate: V) -> V
-): Boolean {
-    val value = get(key)
-    if (value != null) {
-        if (removePredicate(value)) {
-            remove(key)
-            return true
-        } else {
-            put(key, updateBlock(value))
-        }
-    }
-    return false
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
index b1107e1..21dab8f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
@@ -54,8 +54,8 @@
  */
 @OptIn(InternalCoreApi::class)
 internal expect class InternalPointerEvent(
-    changes: MutableMap<PointerId, PointerInputChange>,
+    changes: Map<PointerId, PointerInputChange>,
     pointerInputEvent: PointerInputEvent
 ) {
-    var changes: MutableMap<PointerId, PointerInputChange>
+    val changes: Map<PointerId, PointerInputChange>
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
index aa6be16..0278801 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
@@ -32,8 +32,9 @@
 @OptIn(InternalCoreApi::class)
 internal class PointerInputEventProcessor(val root: LayoutNode) {
 
-    private val hitPathTracker = HitPathTracker()
+    private val hitPathTracker = HitPathTracker(root.coordinates)
     private val pointerInputChangeEventProducer = PointerInputChangeEventProducer()
+    private val hitResult: MutableList<PointerInputFilter> = mutableListOf()
 
     /**
      * Receives [PointerInputEvent]s and process them through the tree rooted on [root].
@@ -54,44 +55,41 @@
         val internalPointerEvent =
             pointerInputChangeEventProducer.produce(pointerEvent, positionCalculator)
 
-        // TODO(shepshapard): Create fast forEach for maps?
-
         // Add new hit paths to the tracker due to down events.
-        internalPointerEvent
-            .changes
-            .filter { (_, pointerInputChange) -> pointerInputChange.changedToDownIgnoreConsumed() }
-            .forEach { (_, pointerInputChange) ->
-                val hitResult: MutableList<PointerInputFilter> = mutableListOf()
+        internalPointerEvent.changes.values.forEach { pointerInputChange ->
+            if (pointerInputChange.changedToDownIgnoreConsumed()) {
                 root.hitTest(
                     pointerInputChange.position,
                     hitResult
                 )
                 if (hitResult.isNotEmpty()) {
                     hitPathTracker.addHitPath(pointerInputChange.id, hitResult)
+                    hitResult.clear()
                 }
             }
+        }
 
         // Remove [PointerInputFilter]s that are no longer valid and refresh the offset information
         // for those that are.
         hitPathTracker.removeDetachedPointerInputFilters()
 
         // Dispatch to PointerInputFilters
-        val (resultingChanges, dispatchedToSomething) =
-            hitPathTracker.dispatchChanges(internalPointerEvent)
+        val dispatchedToSomething = hitPathTracker.dispatchChanges(internalPointerEvent)
 
-        // Remove hit paths from the tracker due to up events.
-        internalPointerEvent
-            .changes
-            .filter { (_, pointerInputChange) -> pointerInputChange.changedToUpIgnoreConsumed() }
-            .forEach { (_, pointerInputChange) ->
+        var anyMovementConsumed = false
+
+        // Remove hit paths from the tracker due to up events, and calculate if we have consumed
+        // any movement
+        internalPointerEvent.changes.values.forEach { pointerInputChange ->
+            if (pointerInputChange.changedToUpIgnoreConsumed()) {
                 hitPathTracker.removeHitPath(pointerInputChange.id)
             }
+            if (pointerInputChange.positionChangeConsumed()) {
+                anyMovementConsumed = true
+            }
+        }
 
-        // TODO(shepshapard): Don't allocate on every call.
-        return ProcessResult(
-            dispatchedToSomething,
-            resultingChanges.changes.any { (_, value) -> value.positionChangeConsumed() }
-        )
+        return ProcessResult(dispatchedToSomething, anyMovementConsumed)
     }
 
     /**
@@ -120,7 +118,9 @@
      */
     fun produce(pointerInputEvent: PointerInputEvent, positionCalculator: PositionCalculator):
         InternalPointerEvent {
-            val changes: MutableMap<PointerId, PointerInputChange> = mutableMapOf()
+            val changes: MutableMap<PointerId, PointerInputChange> =
+                // Set initial capacity to avoid resizing - we know the size the map will be.
+                LinkedHashMap(pointerInputEvent.pointers.size)
             pointerInputEvent.pointers.fastForEach {
                 val previousTime: Long
                 val previousPosition: Offset
@@ -154,8 +154,7 @@
                     previousPointerInputData[it.id] = PointerInputData(
                         it.uptime,
                         it.positionOnScreen,
-                        it.down,
-                        it.type
+                        it.down
                     )
                 } else {
                     previousPointerInputData.remove(it.id)
@@ -167,15 +166,14 @@
     /**
      * Clears all tracked information.
      */
-    internal fun clear() {
+    fun clear() {
         previousPointerInputData.clear()
     }
 
     private class PointerInputData(
         val uptime: Long,
         val positionOnScreen: Offset,
-        val down: Boolean,
-        val type: PointerType
+        val down: Boolean
     )
 }
 
@@ -183,7 +181,6 @@
  * The result of a call to [PointerInputEventProcessor.process].
  */
 // TODO(shepshpard): Not sure if storing these values in a int is most efficient overall.
-@Suppress("EXPERIMENTAL_FEATURE_WARNING")
 internal inline class ProcessResult(private val value: Int) {
     val dispatchedToAPointerInputModifier
         get() = (value and 1) != 0
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
index aef6f62..53cccdb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
@@ -147,7 +147,8 @@
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
  * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
  * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection.
+ * may be defined to perform higher-level gesture detection. The pointer input handling [block]
+ * will be cancelled and **re-started** when [pointerInput] is recomposed with a different [key1].
  */
 fun Modifier.pointerInput(
     key1: Any?,
@@ -174,7 +175,9 @@
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
  * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
  * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection.
+ * may be defined to perform higher-level gesture detection. The pointer input handling [block]
+ * will be cancelled and **re-started** when [pointerInput] is recomposed with a different [key1] or
+ * [key2].
  */
 fun Modifier.pointerInput(
     key1: Any?,
@@ -203,7 +206,8 @@
  * [pointerInput] [block]s may call [PointerInputScope.awaitPointerEventScope] to install a pointer
  * input handler that can [AwaitPointerEventScope.awaitPointerEvent] to receive and consume
  * pointer input events. Extension functions on [PointerInputScope] or [AwaitPointerEventScope]
- * may be defined to perform higher-level gesture detection.
+ * may be defined to perform higher-level gesture detection. The pointer input handling [block]
+ * will be cancelled and **re-started** when [pointerInput] is recomposed with any different [keys].
  */
 fun Modifier.pointerInput(
     vararg keys: Any?,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
index 0165bf0..686cfb5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.layout
 
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 
 /**
@@ -79,4 +80,13 @@
      * LayoutNode.
      */
     val layerId: Long
+
+    /**
+     * The uniqueDrawingId of the owner view of this graphics layer. This is used by
+     * tooling to match a layer to the associated owner AndroidComposeView.
+     */
+    @get:ExperimentalComposeUiApi
+    @ExperimentalComposeUiApi
+    val ownerViewId: Long
+        get() = 0
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
index 273d498..92a69d7 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.Composition
 import androidx.compose.runtime.CompositionContext
-import androidx.compose.runtime.RememberObserver
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.currentComposer
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCompositionContext
@@ -60,8 +60,45 @@
     modifier: Modifier = Modifier,
     measurePolicy: SubcomposeMeasureScope.(Constraints) -> MeasureResult
 ) {
-    val state = remember { SubcomposeLayoutState() }
+    SubcomposeLayout(
+        state = remember { SubcomposeLayoutState() },
+        modifier = modifier,
+        measurePolicy = measurePolicy
+    )
+}
+
+/**
+ * Analogue of [Layout] which allows to subcompose the actual content during the measuring stage
+ * for example to use the values calculated during the measurement as params for the composition
+ * of the children.
+ *
+ * Possible use cases:
+ * * You need to know the constraints passed by the parent during the composition and can't solve
+ * your use case with just custom [Layout] or [LayoutModifier].
+ * See [androidx.compose.foundation.layout.BoxWithConstraints].
+ * * You want to use the size of one child during the composition of the second child.
+ * * You want to compose your items lazily based on the available size. For example you have a
+ * list of 100 items and instead of composing all of them you only compose the ones which are
+ * currently visible(say 5 of them) and compose next items when the component is scrolled.
+ *
+ * @sample androidx.compose.ui.samples.SubcomposeLayoutSample
+ *
+ * @param state the state object to be used by the layout.
+ * @param modifier [Modifier] to apply for the layout.
+ * @param measurePolicy Measure policy which provides ability to subcompose during the measuring.
+ */
+@Composable
+fun SubcomposeLayout(
+    state: SubcomposeLayoutState,
+    modifier: Modifier = Modifier,
+    measurePolicy: SubcomposeMeasureScope.(Constraints) -> MeasureResult
+) {
     state.compositionContext = rememberCompositionContext()
+    DisposableEffect(state) {
+        onDispose {
+            state.disposeCurrentNodes()
+        }
+    }
 
     val materialized = currentComposer.materialize(modifier)
     val density = LocalDensity.current
@@ -97,38 +134,68 @@
     fun subcompose(slotId: Any?, content: @Composable () -> Unit): List<Measurable>
 }
 
-private class SubcomposeLayoutState :
-    SubcomposeMeasureScope,
-    RememberObserver {
-    var compositionContext: CompositionContext? = null
+/**
+ * State used by [SubcomposeLayout].
+ *
+ * @param maxSlotsToRetainForReuse when non-zero the layout will keep active up to this count
+ * slots which we were used but not used anymore instead of disposing them. Later when you try to
+ * compose a new slot instead of creating a completely new slot the layout would reuse the
+ * previous slot which allows to do less work especially if the slot contents are similar.
+ */
+class SubcomposeLayoutState(
+    private val maxSlotsToRetainForReuse: Int
+) {
+    /**
+     * State used by [SubcomposeLayout].
+     */
+    constructor() : this(0)
 
-    // MeasureScope delegation
-    override var layoutDirection: LayoutDirection = LayoutDirection.Rtl
-    override var density: Float = 0f
-    override var fontScale: Float = 0f
+    internal var compositionContext: CompositionContext? = null
 
     // Pre-allocated lambdas to update LayoutNode
-    val setRoot: LayoutNode.() -> Unit = { root = this }
-    val setMeasurePolicy:
+    internal val setRoot: LayoutNode.() -> Unit = { _root = this }
+    internal val setMeasurePolicy:
         LayoutNode.(SubcomposeMeasureScope.(Constraints) -> MeasureResult) -> Unit =
             { measurePolicy = createMeasurePolicy(it) }
 
     // inner state
-    private var root: LayoutNode? = null
+    private var _root: LayoutNode? = null
+    private val root: LayoutNode get() = requireNotNull(_root)
     private var currentIndex = 0
     private val nodeToNodeState = mutableMapOf<LayoutNode, NodeState>()
-    private val slodIdToNode = mutableMapOf<Any?, LayoutNode>()
+    // this map contains active slotIds (without precomposed or reusable nodes)
+    private val slotIdToNode = mutableMapOf<Any?, LayoutNode>()
+    private val scope = Scope()
+    private val precomposeMap = mutableMapOf<Any?, LayoutNode>()
 
-    override fun subcompose(slotId: Any?, content: @Composable () -> Unit): List<Measurable> {
-        val root = root!!
+    /**
+     * `root.foldedChildren` list consist of:
+     * 1) all the active children (used during the last measure pass)
+     * 2) `reusableCount` nodes in the middle of the list which were active and stopped being
+     * used. now we keep them (up to `maxCountOfSlotsToReuse`) in order to reuse next time we
+     * will need to compose a new item
+     * 4) `precomposedCount` nodes in the end of the list which were precomposed and
+     * are waiting to be used during the next measure passes.
+     */
+    private var reusableCount = 0
+    private var precomposedCount = 0
+
+    internal fun subcompose(slotId: Any?, content: @Composable () -> Unit): List<Measurable> {
         val layoutState = root.layoutState
         check(layoutState == LayoutState.Measuring || layoutState == LayoutState.LayingOut) {
             "subcompose can only be used inside the measure or layout blocks"
         }
 
-        val node = slodIdToNode.getOrPut(slotId) {
-            LayoutNode(isVirtual = true).also {
-                root.insertAt(currentIndex, it)
+        val node = slotIdToNode.getOrPut(slotId) {
+            val precomposed = precomposeMap.remove(slotId)
+            if (precomposed != null) {
+                check(precomposedCount > 0)
+                precomposedCount--
+                precomposed
+            } else if (reusableCount > 0) {
+                takeNodeFromReusables(slotId)
+            } else {
+                createNodeAt(currentIndex)
             }
         }
 
@@ -139,10 +206,15 @@
             )
         }
         if (currentIndex != itemIndex) {
-            root.move(itemIndex, currentIndex, 1)
+            move(itemIndex, currentIndex)
         }
         currentIndex++
 
+        subcompose(node, slotId, content)
+        return node.children
+    }
+
+    private fun subcompose(node: LayoutNode, slotId: Any?, content: @Composable () -> Unit) {
         val nodeState = nodeToNodeState.getOrPut(node) {
             NodeState(slotId, {})
         }
@@ -151,21 +223,22 @@
             nodeState.content = content
             subcompose(node, nodeState)
         }
-        return node.children
     }
 
     private fun subcompose(node: LayoutNode, nodeState: NodeState) {
         node.withNoSnapshotReadObservation {
-            val content = nodeState.content
-            nodeState.composition = subcomposeInto(
-                existing = nodeState.composition,
-                container = node,
-                parent = compositionContext ?: error("parent composition reference not set"),
-                // Do not optimize this by passing nodeState.content directly; the additional
-                // composable function call from the lambda expression affects the scope of
-                // recomposition and recomposition of siblings.
-                composable = { content() }
-            )
+            ignoreRemeasureRequests {
+                val content = nodeState.content
+                nodeState.composition = subcomposeInto(
+                    existing = nodeState.composition,
+                    container = node,
+                    parent = compositionContext ?: error("parent composition reference not set"),
+                    // Do not optimize this by passing nodeState.content directly; the additional
+                    // composable function call from the lambda expression affects the scope of
+                    // recomposition and recomposition of siblings.
+                    composable = { content() }
+                )
+            }
         }
     }
 
@@ -186,14 +259,64 @@
     }
 
     private fun disposeAfterIndex(currentIndex: Int) {
-        val root = root!!
-        for (i in currentIndex until root.foldedChildren.size) {
+        val precomposedNodesSectionStart = root.foldedChildren.size - precomposedCount
+        val reusableNodesSectionStart = maxOf(
+            currentIndex,
+            precomposedNodesSectionStart - maxSlotsToRetainForReuse
+        )
+
+        // keep up to maxCountOfSlotsToReuse last nodes to be reused later
+        reusableCount = precomposedNodesSectionStart - reusableNodesSectionStart
+        for (i in reusableNodesSectionStart until reusableNodesSectionStart + reusableCount) {
             val node = root.foldedChildren[i]
-            val nodeState = nodeToNodeState.remove(node)!!
-            nodeState.composition!!.dispose()
-            slodIdToNode.remove(nodeState.slotId)
+            val state = nodeToNodeState[node]!!
+            // remove them from slotIdToNode so they are not considered active
+            slotIdToNode.remove(state.slotId)
         }
-        root.removeAt(currentIndex, root.foldedChildren.size - currentIndex)
+
+        // dispose the rest of the nodes
+        val nodesToDispose = reusableNodesSectionStart - currentIndex
+        if (nodesToDispose > 0) {
+            ignoreRemeasureRequests {
+                for (i in currentIndex until currentIndex + nodesToDispose) {
+                    disposeNode(root.foldedChildren[i])
+                }
+                root.removeAt(currentIndex, nodesToDispose)
+            }
+        }
+    }
+
+    private fun takeNodeFromReusables(slotId: Any?): LayoutNode {
+        check(reusableCount > 0)
+        val reusableNodesSectionEnd = root.foldedChildren.size - precomposedCount
+        val reusableNodesSectionStart = reusableNodesSectionEnd - reusableCount
+        var index = reusableNodesSectionStart
+        while (true) {
+            val node = root.foldedChildren[index]
+            val nodeState = nodeToNodeState.getValue(node)
+            if (nodeState.slotId == slotId) {
+                // we have a node with the same slotId
+                break
+            } else if (index == reusableNodesSectionEnd - 1) {
+                // it is the last available reusable node
+                nodeState.slotId = slotId
+                break
+            } else {
+                index++
+            }
+        }
+        if (index != reusableNodesSectionStart) {
+            // we need to rearrange the items
+            move(index, reusableNodesSectionStart, 1)
+        }
+        reusableCount--
+        return root.foldedChildren[reusableNodesSectionStart]
+    }
+
+    private fun disposeNode(node: LayoutNode) {
+        val nodeState = nodeToNodeState.remove(node)!!
+        nodeState.composition!!.dispose()
+        slotIdToNode.remove(nodeState.slotId)
     }
 
     private fun createMeasurePolicy(
@@ -205,11 +328,11 @@
             measurables: List<Measurable>,
             constraints: Constraints
         ): MeasureResult {
-            [email protected] = layoutDirection
-            [email protected] = density
-            [email protected] = fontScale
+            scope.layoutDirection = layoutDirection
+            scope.density = density
+            scope.fontScale = fontScale
             currentIndex = 0
-            val result = block(constraints)
+            val result = scope.block(constraints)
             val indexAfterMeasure = currentIndex
             return object : MeasureResult {
                 override val width: Int
@@ -228,23 +351,115 @@
         }
     }
 
-    override fun onRemembered() {
-        // do nothing
-    }
-
-    override fun onForgotten() {
+    internal fun disposeCurrentNodes() {
         nodeToNodeState.values.forEach {
             it.composition!!.dispose()
         }
         nodeToNodeState.clear()
-        slodIdToNode.clear()
+        slotIdToNode.clear()
     }
 
-    override fun onAbandoned() = onForgotten()
+    /**
+     * Composes the content for the given [slotId]. This makes the next scope.subcompose(slotId)
+     * call during the measure pass faster as the content is already composed.
+     *
+     * If the [slotId] was precomposed already but after the future calculations ended up to not be
+     * needed anymore (meaning this slotId is not going to be used during the measure pass
+     * anytime soon) you can use [PrecomposedSlotHandle.dispose] on a returned object to dispose the
+     * content.
+     *
+     * @param slotId unique id which represents the slot we are composing into.
+     * @param content the composable content which defines the slot.
+     * @return [PrecomposedSlotHandle] instance which allows you to dispose the content.
+     */
+    fun precompose(slotId: Any?, content: @Composable () -> Unit): PrecomposedSlotHandle {
+        if (!slotIdToNode.containsKey(slotId)) {
+            val node = precomposeMap.getOrPut(slotId) {
+                if (reusableCount > 0) {
+                    val node = takeNodeFromReusables(slotId)
+                    // now move this node to the end where we keep precomposed items
+                    val nodeIndex = root.foldedChildren.indexOf(node)
+                    move(nodeIndex, root.foldedChildren.size, 1)
+                    precomposedCount++
+                    node
+                } else {
+                    createNodeAt(root.foldedChildren.size).also {
+                        precomposedCount++
+                    }
+                }
+            }
+            subcompose(node, slotId, content)
+        }
+        return object : PrecomposedSlotHandle {
+            override fun dispose() {
+                val node = precomposeMap.remove(slotId)
+                if (node != null) {
+                    val itemIndex = root.foldedChildren.indexOf(node)
+                    check(itemIndex != -1)
+                    if (reusableCount < maxSlotsToRetainForReuse) {
+                        val reusableNodesSectionStart =
+                            root.foldedChildren.size - precomposedCount - reusableCount
+                        move(itemIndex, reusableNodesSectionStart, 1)
+                        reusableCount++
+                    } else {
+                        ignoreRemeasureRequests {
+                            disposeNode(node)
+                            root.removeAt(itemIndex, 1)
+                        }
+                    }
+                    check(precomposedCount > 0)
+                    precomposedCount--
+                }
+            }
+        }
+    }
+
+    private fun createNodeAt(index: Int) = LayoutNode(isVirtual = true).also {
+        ignoreRemeasureRequests {
+            root.insertAt(index, it)
+        }
+    }
+
+    private fun move(from: Int, to: Int, count: Int = 1) {
+        ignoreRemeasureRequests {
+            root.move(from, to, count)
+        }
+    }
+
+    private inline fun ignoreRemeasureRequests(block: () -> Unit) =
+        root.ignoreRemeasureRequests(block)
 
     private class NodeState(
-        val slotId: Any?,
+        var slotId: Any?,
         var content: @Composable () -> Unit,
         var composition: Composition? = null
     )
+
+    private inner class Scope : SubcomposeMeasureScope {
+        // MeasureScope delegation
+        override var layoutDirection: LayoutDirection = LayoutDirection.Rtl
+        override var density: Float = 0f
+        override var fontScale: Float = 0f
+
+        override fun subcompose(slotId: Any?, content: @Composable () -> Unit) =
+            [email protected](slotId, content)
+    }
+
+    /**
+     * Instance of this interface is returned by [precompose] function.
+     */
+    interface PrecomposedSlotHandle {
+
+        /**
+         * This function allows to dispose the content for the slot which was precomposed
+         * previously via [precompose].
+         *
+         * If this slot was already used during the regular measure pass via
+         * [SubcomposeMeasureScope.subcompose] this function will do nothing.
+         *
+         * This could be useful if after the future calculations this item is not anymore expected to
+         * be used during the measure pass anytime soon.
+         */
+        fun dispose()
+    }
 }
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 c381939..ce522152 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
@@ -145,7 +145,7 @@
 
     /**
      * The parent node in the LayoutNode hierarchy. This is `null` when the [LayoutNode]
-     * is not attached attached to a hierarchy or is the root of the hierarchy.
+     * is not attached to a hierarchy or is the root of the hierarchy.
      */
     internal var parent: LayoutNode? = null
         get() {
@@ -185,6 +185,11 @@
     private var wrapperCache = mutableVectorOf<DelegatingLayoutNodeWrapper<*>>()
 
     /**
+     * [requestRemeasure] calls will be ignored while this flag is true.
+     */
+    private var ignoreRemeasureRequests = false
+
+    /**
      * Inserts a child [LayoutNode] at a particular index. If this LayoutNode [owner] is not `null`
      * then [instance] will become [attach]ed also. [instance] must have a `null` [parent].
      */
@@ -1036,7 +1041,15 @@
      * Used to request a new measurement + layout pass from the owner.
      */
     internal fun requestRemeasure() {
-        owner?.onRequestMeasure(this)
+        if (!ignoreRemeasureRequests) {
+            owner?.onRequestMeasure(this)
+        }
+    }
+
+    internal inline fun ignoreRemeasureRequests(block: () -> Unit) {
+        ignoreRemeasureRequests = true
+        block()
+        ignoreRemeasureRequests = false
     }
 
     /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
index 9958594..b584d63 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
@@ -26,7 +26,6 @@
 import androidx.compose.ui.geometry.toRect
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.GraphicsLayerScope
-import androidx.compose.ui.graphics.Matrix
 import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.graphics.ReusableGraphicsLayerScope
 import androidx.compose.ui.input.nestedscroll.NestedScrollDelegatingWrapper
@@ -141,11 +140,6 @@
 
     private val snapshotObserver get() = layoutNode.requireOwner().snapshotObserver
 
-    // TODO (njawad): This cache matrix is not thread safe
-    private var _matrixCache: Matrix? = null
-    private val matrixCache: Matrix
-        get() = _matrixCache ?: Matrix().also { _matrixCache = it }
-
     /**
      * Whether a pointer that is relative to the [LayoutNodeWrapper] is in the bounds of this
      * LayoutNodeWrapper.
@@ -257,6 +251,9 @@
                 it.destroy()
                 layoutNode.innerLayerWrapperIsDirty = true
                 invalidateParentLayer()
+                if (isAttached) {
+                    layoutNode.owner?.onLayoutChange(layoutNode)
+                }
             }
             layer = null
         }
@@ -291,6 +288,7 @@
         } else {
             require(layerBlock == null)
         }
+        layoutNode.owner?.onLayoutChange(layoutNode)
     }
 
     private val invalidateParentLayer: () -> Unit = {
@@ -439,9 +437,7 @@
         val targetPosition = if (layer == null) {
             position
         } else {
-            val matrix = matrixCache
-            layer.getMatrix(matrix)
-            matrix.map(position)
+            layer.mapOffset(position, inverse = false)
         }
         return targetPosition + this.position
     }
@@ -456,10 +452,7 @@
         return if (layer == null) {
             relativeToWrapperPosition
         } else {
-            val inverse = matrixCache
-            layer.getMatrix(inverse)
-            inverse.invert()
-            inverse.map(relativeToWrapperPosition)
+            layer.mapOffset(relativeToWrapperPosition, inverse = true)
         }
     }
 
@@ -521,9 +514,7 @@
                     return
                 }
             }
-            val matrix = matrixCache
-            layer.getMatrix(matrix)
-            matrix.map(bounds)
+            layer.mapBounds(bounds, inverse = false)
         }
 
         val x = position.x
@@ -550,10 +541,7 @@
 
         val layer = layer
         if (layer != null) {
-            val matrix = matrixCache
-            layer.getMatrix(matrix)
-            matrix.invert()
-            matrix.map(bounds)
+            layer.mapBounds(bounds, inverse = true)
             if (isClipping && clipBounds) {
                 bounds.intersect(0f, 0f, size.width.toFloat(), size.height.toFloat())
                 if (bounds.isEmpty) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
index 5be6bfd..8e5e27c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OwnedLayer.kt
@@ -16,6 +16,8 @@
 
 package androidx.compose.ui.node
 
+import androidx.compose.ui.geometry.MutableRect
+import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Matrix
 import androidx.compose.ui.graphics.Shape
@@ -81,7 +83,23 @@
     fun destroy()
 
     /**
-     * Modifies [matrix] to be the transform that this layer applies to its content.
+     * Transforms [point] to this layer's bounds, returning an [Offset] with the transformed x
+     * and y values.
+     *
+     * @param point the [Offset] to transform to this layer's bounds
+     * @param inverse whether to invert this layer's transform [Matrix] first, such as when
+     * converting an offset in a parent layer to be in this layer's coordinates.
      */
-    fun getMatrix(matrix: Matrix)
+    fun mapOffset(point: Offset, inverse: Boolean): Offset
+
+    /**
+     * Transforms the provided [rect] to this layer's bounds, then updates [rect] to match the
+     * new bounds after the transform.
+     *
+     * @param rect the bounds to transform to this layer's bounds, and then mutate with the
+     * resulting value
+     * @param inverse whether to invert this layer's transform [Matrix] first, such as when
+     * converting bounds in a parent layer to be in this layer's coordinates.
+     */
+    fun mapBounds(rect: MutableRect, inverse: Boolean)
 }
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 03306b7..5a70959 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
@@ -18,7 +18,7 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.autofill.Autofill
 import androidx.compose.ui.autofill.AutofillTree
-import androidx.compose.ui.focus.FocusDirectionInternal
+import androidx.compose.ui.focus.FocusDirection
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
@@ -180,9 +180,9 @@
     fun onLayoutChange(layoutNode: LayoutNode)
 
     /**
-     * The [FocusDirection][FocusDirectionInternal] represented by the specified keyEvent.
+     * The [FocusDirection] represented by the specified keyEvent.
      */
-    fun getFocusDirection(keyEvent: KeyEvent): FocusDirectionInternal?
+    fun getFocusDirection(keyEvent: KeyEvent): FocusDirection?
 
     val measureIteration: Long
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index b4c10ad..d99109b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -16,13 +16,13 @@
 
 package androidx.compose.ui.semantics
 
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.state.ToggleableState
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.buildAnnotatedString
 import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.ExperimentalComposeUiApi
 import kotlin.reflect.KProperty
 
 /**
@@ -67,6 +67,12 @@
     /** @see SemanticsPropertyReceiver.selectableGroup */
     val SelectableGroup = SemanticsPropertyKey<Unit>("SelectableGroup")
 
+    /** @see SemanticsPropertyReceiver.collectionInfo */
+    val CollectionInfo = SemanticsPropertyKey<CollectionInfo>("CollectionInfo")
+
+    /** @see SemanticsPropertyReceiver.collectionItemInfo */
+    val CollectionItemInfo = SemanticsPropertyKey<CollectionItemInfo>("CollectionItemInfo")
+
     /**
      * @see SemanticsPropertyReceiver.heading
      */
@@ -206,6 +212,16 @@
      * @see SemanticsPropertyReceiver.password
      */
     val Password = SemanticsPropertyKey<Unit>("Password")
+
+    /**
+     * @see SemanticsPropertyReceiver.error
+     */
+    val Error = SemanticsPropertyKey<String>("Error")
+
+    /**
+     * @see SemanticsPropertyReceiver.indexForKey
+     */
+    val IndexForKey = SemanticsPropertyKey<(Any) -> Int>("IndexForKey")
 }
 
 /**
@@ -239,6 +255,11 @@
     val ScrollBy = ActionPropertyKey<(x: Float, y: Float) -> Boolean>("ScrollBy")
 
     /**
+     * @see SemanticsPropertyReceiver.scrollToIndex
+     */
+    val ScrollToIndex = ActionPropertyKey<(Int) -> Boolean>("ScrollToIndex")
+
+    /**
      * @see SemanticsPropertyReceiver.setProgress
      */
     val SetProgress = ActionPropertyKey<(progress: Float) -> Boolean>("SetProgress")
@@ -466,6 +487,39 @@
 }
 
 /**
+ * Information about the collection.
+ *
+ * A collection of items has [rowCount] rows and [columnCount] columns.
+ * For example, a vertical list is a collection with one column, as many rows as the list items
+ * that are important for accessibility; A table is a collection with several rows and several
+ * columns.
+ *
+ * @param rowCount the number of rows in the collection, or -1 if unknown
+ * @param columnCount the number of columns in the collection, or -1 if unknown
+ */
+class CollectionInfo(val rowCount: Int, val columnCount: Int)
+
+/**
+ * Information about the item of a collection.
+ *
+ * A collection item is contained in a collection, it starts at a given [rowIndex] and
+ * [columnIndex] in the collection, and spans one or more rows and columns. For example, a header
+ * of two related table columns starts at the first row and the first column, spans one row and
+ * two columns.
+ *
+ * @param rowIndex the index of the row at which item is located
+ * @param rowSpan the number of rows the item spans
+ * @param columnIndex the index of the column at which item is located
+ * @param columnSpan the number of columns the item spans
+ */
+class CollectionItemInfo(
+    val rowIndex: Int,
+    val rowSpan: Int,
+    val columnIndex: Int,
+    val columnSpan: Int
+)
+
+/**
  * The scroll state of one axis if this node is scrollable.
  *
  * @param value current 0-based scroll position value (either in pixels, or lazy-item count)
@@ -678,8 +732,6 @@
  * properties of this element. But some elements with subtle differences need an exact role. If
  * an exact role is not listed in [Role], this property should not be set and the framework will
  * automatically resolve it.
- *
- * @see SemanticsProperties.Role
  */
 var SemanticsPropertyReceiver.role by SemanticsProperties.Role
 
@@ -722,6 +774,21 @@
 var SemanticsPropertyReceiver.selected by SemanticsProperties.Selected
 
 /**
+ * This semantics marks node as a collection and provides the required information.
+ *
+ * @see collectionItemInfo
+ */
+var SemanticsPropertyReceiver.collectionInfo by SemanticsProperties.CollectionInfo
+
+/**
+ * This semantics marks node as an items of a collection and provides the required information.
+ *
+ * If you mark items of a collection, you should also be marking the collection with
+ * [collectionInfo].
+ */
+var SemanticsPropertyReceiver.collectionItemInfo by SemanticsProperties.CollectionItemInfo
+
+/**
  * The state of a toggleable component.
  *
  * The presence of this property indicates that the element is toggleable.
@@ -737,8 +804,30 @@
 }
 
 /**
+ * Mark semantics node that contains invalid input or error.
+ *
+ * @param [description] a localized description explaining an error to the accessibility user
+ */
+fun SemanticsPropertyReceiver.error(description: String) {
+    this[SemanticsProperties.Error] = description
+}
+
+/**
+ * The index of an item identified by a given key. The key is usually defined during the creation
+ * of the container. If the key did not match any of the items' keys, the [mapping] must return -1.
+ */
+fun SemanticsPropertyReceiver.indexForKey(mapping: (Any) -> Int) {
+    this[SemanticsProperties.IndexForKey] = mapping
+}
+
+/**
  * The node is marked as a collection of horizontally or vertically stacked selectable elements.
  *
+ * Unlike [collectionInfo] which marks a collection of any elements and asks developer to
+ * provide all the required information like number of elements etc., this semantics will
+ * populate the number of selectable elements automatically. Note that if you use this semantics
+ * with lazy collections, it won't get the number of elements in the collection.
+ *
  * @see SemanticsPropertyReceiver.selected
 */
 fun SemanticsPropertyReceiver.selectableGroup() {
@@ -800,6 +889,18 @@
 }
 
 /**
+ * Action to scroll a container to the index of one of its items.
+ *
+ * The [action] should throw an [IllegalArgumentException] if the index is out of bounds.
+ */
+fun SemanticsPropertyReceiver.scrollToIndex(
+    label: String? = null,
+    action: (Int) -> Boolean
+) {
+    this[SemanticsActions.ScrollToIndex] = AccessibilityAction(label, action)
+}
+
+/**
  * Action to set the current value of the progress bar.
  *
  * Expected to be used in conjunction with progressBarRangeInfo.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
index 874e013..071661a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
@@ -111,7 +111,7 @@
             "AppWindow should be created inside AWT Event Thread (use SwingUtilities.invokeLater " +
                 "or just dsl for creating window: Window { })"
         }
-        window = ComposeWindow(parent = this)
+        window = ComposeWindow()
         window.apply {
             defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
             addWindowListener(object : WindowAdapter() {
@@ -122,7 +122,7 @@
                             onDispose?.invoke()
                             onDismiss?.invoke()
                             events.invokeOnClose()
-                            AppManager.removeWindow(parent)
+                            AppManager.removeWindow(this@AppWindow)
                         }
                     }
                 }
@@ -137,7 +137,7 @@
                 override fun windowGainedFocus(event: WindowEvent) {
                     // Dialogs should not receive a common application menu bar
                     if (invoker == null) {
-                        window.setJMenuBar(parent.menuBar?.menuBar)
+                        window.setJMenuBar([email protected]?.menuBar)
                     }
                     events.invokeOnFocusGet()
                 }
@@ -417,7 +417,6 @@
         window.setContent(parentComposition) {
             CompositionLocalProvider(
                 LocalAppWindow provides this,
-                LocalLayerContainer provides window,
                 content = content
             )
         }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeLayer.desktop.kt
index 92cfd5c..296411b 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeLayer.desktop.kt
@@ -175,7 +175,7 @@
         })
         wrapped.addMouseMotionListener(object : MouseMotionAdapter() {
             override fun mouseDragged(event: MouseEvent) = events.post {
-                owners.onMouseDragged(
+                owners.onMouseMoved(
                     (event.x * density.density).toInt(),
                     (event.y * density.density).toInt(),
                     event
@@ -185,7 +185,8 @@
             override fun mouseMoved(event: MouseEvent) = events.post {
                 owners.onMouseMoved(
                     (event.x * density.density).toInt(),
-                    (event.y * density.density).toInt()
+                    (event.y * density.density).toInt(),
+                    event
                 )
             }
         })
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
index 90c25cf..273b3b0 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/ComposeWindow.desktop.kt
@@ -17,6 +17,7 @@
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.CompositionLocalProvider
 import org.jetbrains.skiko.ClipComponent
 import org.jetbrains.skiko.GraphicsApi
 import java.awt.Component
@@ -26,9 +27,8 @@
 /**
  * ComposeWindow is a window for building UI using Compose for Desktop.
  * ComposeWindow inherits javax.swing.JFrame.
- * @param parent The parent AppFrame that wraps the ComposeWindow.
  */
-class ComposeWindow(val parent: AppFrame) : JFrame() {
+class ComposeWindow : JFrame() {
     private var isDisposed = false
     internal val layer = ComposeLayer()
     private val pane = object : JLayeredPane() {
@@ -73,8 +73,13 @@
     ) {
         layer.setContent(
             parentComposition = parentComposition,
-            content = content
-        )
+        ) {
+            CompositionLocalProvider(
+                LocalLayerContainer provides this
+            ) {
+                content()
+            }
+        }
     }
 
     override fun dispose() {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
index 3f95aee..cc1fc6d 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
@@ -19,11 +19,11 @@
 import java.awt.event.MouseEvent
 
 internal actual class InternalPointerEvent constructor(
-    actual var changes: MutableMap<PointerId, PointerInputChange>,
+    actual val changes: Map<PointerId, PointerInputChange>,
     val mouseEvent: MouseEvent?
 ) {
     actual constructor(
-        changes: MutableMap<PointerId, PointerInputChange>,
+        changes: Map<PointerId, PointerInputChange>,
         pointerInputEvent: PointerInputEvent
     ) : this(changes, pointerInputEvent.mouseEvent)
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt
index f4d8d4e..9f4ad8a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt
@@ -22,6 +22,5 @@
 // TODO(demin): implement HapticFeedback
 internal class DesktopHapticFeedback : HapticFeedback {
     override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {
-        println("HapticFeedback.performHapticFeedback not implemented yet")
     }
 }
\ No newline at end of file
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 c8f41fd..2b768bc 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
@@ -25,15 +25,14 @@
 import androidx.compose.ui.autofill.Autofill
 import androidx.compose.ui.autofill.AutofillTree
 import androidx.compose.ui.focus.FocusDirection
-import androidx.compose.ui.focus.FocusDirectionInternal
-import androidx.compose.ui.focus.FocusDirectionInternal.Down
-import androidx.compose.ui.focus.FocusDirectionInternal.In
-import androidx.compose.ui.focus.FocusDirectionInternal.Left
-import androidx.compose.ui.focus.FocusDirectionInternal.Next
-import androidx.compose.ui.focus.FocusDirectionInternal.Out
-import androidx.compose.ui.focus.FocusDirectionInternal.Previous
-import androidx.compose.ui.focus.FocusDirectionInternal.Right
-import androidx.compose.ui.focus.FocusDirectionInternal.Up
+import androidx.compose.ui.focus.FocusDirection.Companion.Down
+import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Left
+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.FocusDirection.Companion.Right
+import androidx.compose.ui.focus.FocusDirection.Companion.Up
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusManagerImpl
 import androidx.compose.ui.geometry.Offset
@@ -48,7 +47,7 @@
 import androidx.compose.ui.input.key.Key.Companion.Tab
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.KeyEventType
-import androidx.compose.ui.input.key.KeyEventType.KeyDown
+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
@@ -60,6 +59,7 @@
 import androidx.compose.ui.input.pointer.PointerInputFilter
 import androidx.compose.ui.input.pointer.PointerMoveEventFilter
 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.layout.boundsInWindow
@@ -118,21 +118,8 @@
             val focusDirection = getFocusDirection(it)
             if (focusDirection == null || it.type != KeyDown) return@KeyInputModifier false
 
-            val focusMoveSuccess = with(focusManager) {
-                when (focusDirection) {
-                    Up -> moveFocus(FocusDirection.Up)
-                    Down -> moveFocus(FocusDirection.Down)
-                    Left -> moveFocus(FocusDirection.Left)
-                    Right -> moveFocus(FocusDirection.Right)
-                    In -> moveFocusIn()
-                    Out -> moveFocusOut()
-                    Next -> moveFocus(FocusDirection.Next)
-                    Previous -> moveFocus(FocusDirection.Previous)
-                }
-            }
-
             // Consume the key event if we moved focus.
-            focusMoveSuccess
+            focusManager.moveFocus(focusDirection)
         },
         onPreviewKeyEvent = null
     )
@@ -286,7 +273,7 @@
 
     override fun onLayoutChange(layoutNode: LayoutNode) = Unit
 
-    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirectionInternal? {
+    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         return when (keyEvent.key) {
             Tab -> if (keyEvent.isShiftPressed) Previous else Next
             DirectionRight -> Right
@@ -317,9 +304,9 @@
         root.draw(DesktopCanvas(canvas))
     }
 
-    internal fun processPointerInput(event: PointerInputEvent) {
+    internal fun processPointerInput(event: PointerInputEvent): ProcessResult {
         measureAndLayout()
-        pointerInputEventProcessor.process(event, this)
+        return pointerInputEventProcessor.process(event, this)
     }
 
     override fun processPointerInput(nanoTime: Long, pointers: List<TestPointerInputEventData>) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
index e077417..7a27e67 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
@@ -34,7 +34,7 @@
 import java.awt.event.MouseEvent
 import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
 
-internal val DesktopOwnersAmbient = staticCompositionLocalOf<DesktopOwners> {
+internal val LocalDesktopOwners = staticCompositionLocalOf<DesktopOwners> {
     error("CompositionLocal DesktopOwnersAmbient not provided")
 }
 
@@ -73,7 +73,7 @@
 
     private val dispatcher = FlushCoroutineDispatcher(coroutineScope)
     private val frameClock = BroadcastFrameClock(onNewAwaiters = ::invalidateIfNeeded)
-    private val coroutineContext = dispatcher + frameClock
+    private val coroutineContext = coroutineScope.coroutineContext + dispatcher + frameClock
 
     internal val recomposer = Recomposer(coroutineContext)
     internal val platformInputService: DesktopPlatformInput = DesktopPlatformInput(component)
@@ -119,11 +119,11 @@
             dispatcher.flush()
             frameClock.sendFrame(nanoTime)
 
-            listCopy.clear()
             listCopy.addAll(list)
             for (owner in listCopy) {
                 owner.render(canvas, width, height)
             }
+            listCopy.clear()
         }
 
         invalidateIfNeeded()
@@ -143,8 +143,13 @@
         pointerId += 1
     }
 
-    fun onMouseDragged(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
-        lastOwner?.processPointerInput(pointerInputEvent(nativeEvent, x, y, isMousePressed))
+    fun onMouseMoved(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
+        val event = pointerInputEvent(nativeEvent, x, y, isMousePressed)
+        val result = lastOwner?.processPointerInput(event)
+        if (result?.anyMovementConsumed != true) {
+            val position = Offset(x.toFloat(), y.toFloat())
+            lastOwner?.onPointerMove(position)
+        }
     }
 
     fun onMouseScroll(x: Int, y: Int, event: MouseScrollEvent) {
@@ -152,11 +157,6 @@
         lastOwner?.onMouseScroll(position, event)
     }
 
-    fun onMouseMoved(x: Int, y: Int) {
-        val position = Offset(x.toFloat(), y.toFloat())
-        lastOwner?.onPointerMove(position)
-    }
-
     fun onMouseEntered(x: Int, y: Int) {
         val position = Offset(x.toFloat(), y.toFloat())
         lastOwner?.onPointerEnter(position)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
index 02326b9..d7cd1e4 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatform.desktop.kt
@@ -18,7 +18,12 @@
 
 import androidx.compose.runtime.staticCompositionLocalOf
 
-val DesktopPlatformAmbient = staticCompositionLocalOf(DesktopPlatform::Current)
+// TODO(demin): changing DesktopPlatform is confusing.
+//  Replace DesktopPlatform by DesktopLookAndFeel
+//  (https://github.com/JetBrains/compose-jb/issues/303).
+//  Or get rid of it completely
+//  and provide appropriate Local's (LocalMouseScrollConfig, etc).
+val LocalDesktopPlatform = staticCompositionLocalOf(DesktopPlatform::Current)
 
 enum class DesktopPlatform {
     Linux,
@@ -30,7 +35,7 @@
          * Identify OS on which the application is currently running.
          *
          * If it is needed to know the current platform in @Composable function,
-         * use [DesktopPlatformAmbient] instead of this function, so composable functions can
+         * use [LocalDesktopPlatform] instead of this function, so composable functions can
          * change their behaviour if we change platform in tests or in application settings
          * (some applications maybe will have this setting)
          */
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt
index a8c5b99..62fd237 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt
@@ -24,7 +24,6 @@
         get() = TextToolbarStatus.Hidden
 
     override fun hide() {
-        println("TextToolbar.hide not implemented yet")
     }
 
     override fun showMenu(
@@ -34,6 +33,5 @@
         onCutRequested: ActionCallback?,
         onSelectAllRequested: ActionCallback?
     ) {
-        println("TextToolbar.showMenu not implemented yet")
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt
index 50ab18f65..c19d564 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt
@@ -48,11 +48,11 @@
 
     fun flush() {
         synchronized(tasks) {
-            tasksCopy.clear()
             tasksCopy.addAll(tasks)
             tasks.clear()
         }
 
         tasksCopy.forEach(Runnable::run)
+        tasksCopy.clear()
     }
 }
\ No newline at end of file
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 02855bf..fd87f34 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
@@ -17,10 +17,11 @@
 package androidx.compose.ui.platform
 
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.snapshots.ObserverHandle
+import androidx.compose.ui.platform.GlobalSnapshotManager.ensureStarted
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.channels.consumeEach
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.swing.Swing
 import java.util.concurrent.atomic.AtomicBoolean
@@ -38,56 +39,17 @@
  */
 internal object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
-    private var commitPending = false
-    private var removeWriteObserver: ObserverHandle? = null
-
-    private val scheduleScope = CoroutineScope(Dispatchers.Swing + SupervisorJob())
 
     fun ensureStarted() {
         if (started.compareAndSet(false, true)) {
-            removeWriteObserver = Snapshot.registerGlobalWriteObserver(globalWriteObserver)
-        }
-    }
-
-    private val globalWriteObserver: (Any) -> Unit = {
-        // Race, but we don't care too much if we end up with multiple calls scheduled.
-        if (!commitPending) {
-            commitPending = true
-            schedule {
-                commitPending = false
-                Snapshot.sendApplyNotifications()
+            val channel = Channel<Unit>(Channel.CONFLATED)
+            CoroutineScope(Dispatchers.Swing).launch {
+                channel.consumeEach {
+                    Snapshot.sendApplyNotifications()
+                }
             }
-        }
-    }
-
-    /**
-     * List of deferred callbacks to run serially. Guarded by its own monitor lock.
-     */
-    private val scheduledCallbacks = mutableListOf<() -> Unit>()
-
-    /**
-     * Guarded by [scheduledCallbacks]'s monitor lock.
-     */
-    private var isSynchronizeScheduled = false
-
-    /**
-     * Synchronously executes any outstanding callbacks and brings snapshots into a
-     * consistent, updated state.
-     */
-    private fun synchronize() {
-        synchronized(scheduledCallbacks) {
-            scheduledCallbacks.forEach { it.invoke() }
-            scheduledCallbacks.clear()
-            isSynchronizeScheduled = false
-        }
-    }
-
-    private fun schedule(block: () -> Unit) {
-        synchronized(scheduledCallbacks) {
-            scheduledCallbacks.add(block)
-            if (!isSynchronizeScheduled) {
-                isSynchronizeScheduled = true
-                scheduleScope.launch { synchronize() }
+            Snapshot.registerGlobalWriteObserver {
+                channel.offer(Unit)
             }
         }
     }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt
index c398cb8..8f515e6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkijaLayer.desktop.kt
@@ -16,6 +16,9 @@
 
 package androidx.compose.ui.platform
 
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.MutableRect
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.toRect
 import androidx.compose.ui.graphics.Canvas
@@ -54,7 +57,8 @@
     private var position = IntOffset.Zero
     private var outlineCache =
         OutlineCache(getDensity(), size, RectangleShape, LayoutDirection.Ltr)
-    private val matrix = Matrix()
+    // Internal for testing
+    internal val matrix = Matrix()
     private val pictureRecorder = PictureRecorder()
     private var picture: Picture? = null
     private var isDestroyed = false
@@ -73,6 +77,10 @@
 
     override val layerId = lastId++
 
+    @ExperimentalComposeUiApi
+    override val ownerViewId: Long
+        get() = 0
+
     override fun destroy() {
         picture?.close()
         pictureRecorder.close()
@@ -96,8 +104,23 @@
         }
     }
 
-    override fun getMatrix(matrix: Matrix) {
-        matrix.setFrom(this.matrix)
+    override fun mapOffset(point: Offset, inverse: Boolean): Offset {
+        return getMatrix(inverse).map(point)
+    }
+
+    override fun mapBounds(rect: MutableRect, inverse: Boolean) {
+        getMatrix(inverse).map(rect)
+    }
+
+    private fun getMatrix(inverse: Boolean): Matrix {
+        return if (inverse) {
+            Matrix().apply {
+                setFrom(matrix)
+                invert()
+            }
+        } else {
+            matrix
+        }
     }
 
     override fun updateLayerProperties(
@@ -224,7 +247,7 @@
         val zParams = Point3(0f, 0f, shadowElevation)
 
         // TODO: configurable?
-        val lightPos = Point3(0f, 0f, 600.dp.toPx())
+        val lightPos = Point3(0f, -300.dp.toPx(), 600.dp.toPx())
         val lightRad = 800.dp.toPx()
 
         val ambientAlpha = 0.039f * alpha
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
index fb2f66b..cddba9b 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
@@ -25,6 +25,7 @@
 import androidx.compose.ui.unit.Density
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.Runnable
 import kotlinx.coroutines.cancel
 import org.jetbrains.skija.Surface
@@ -59,7 +60,7 @@
     private val canvas = surface.canvas
     private var owner: DesktopOwner? = null
 
-    private val coroutineScope = CoroutineScope(coroutineContext)
+    private val coroutineScope = CoroutineScope(coroutineContext + Job())
     private val frameDispatcher: FrameDispatcher = FrameDispatcher(
         onFrame = { onFrame() },
         context = coroutineScope.coroutineContext
@@ -104,7 +105,7 @@
         val owner = DesktopOwner(owners, density)
         owner.setContent {
             CompositionLocalProvider(
-                DesktopPlatformAmbient provides desktopPlatform
+                LocalDesktopPlatform provides desktopPlatform
             ) {
                 content()
             }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
index 5ea7190..13e7f34 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
@@ -37,16 +37,16 @@
 
     val composition = Composition(DesktopUiApplier(root), parent ?: container.recomposer)
     composition.setContent {
-        ProvideDesktopAmbients(this, content)
+        ProvideDesktopCompositionsLocals(this, content)
     }
 
     return composition
 }
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
-private fun ProvideDesktopAmbients(owner: DesktopOwner, content: @Composable () -> Unit) {
+private fun ProvideDesktopCompositionsLocals(owner: DesktopOwner, content: @Composable () -> Unit) {
     CompositionLocalProvider(
-        DesktopOwnersAmbient provides owner.container
+        LocalDesktopOwners provides owner.container
     ) {
         ProvideCommonCompositionLocals(
             owner = owner,
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 4fa42a9..949a8ad 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
@@ -15,28 +15,32 @@
  */
 package androidx.compose.ui.window
 
+import androidx.compose.desktop.LocalLayerContainer
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.rememberCompositionContext
 import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCompositionContext
+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.input.pointer.changedToDown
-import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.input.pointer.PointerEventPass
 import androidx.compose.ui.input.pointer.PointerInputScope
+import androidx.compose.ui.input.pointer.changedToDown
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.DesktopOwner
-import androidx.compose.ui.platform.DesktopOwnersAmbient
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalDesktopOwners
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.round
+import java.awt.Point
 
 /**
  * Opens a popup with the given content.
@@ -50,7 +54,7 @@
  * @param offset An offset from the original aligned position of the popup. Offset respects the
  * Ltr/Rtl context, thus in Ltr it will be added to the original aligned position and in Rtl it
  * will be subtracted from it.
- * @param isFocusable Indicates if the popup can grab the focus.
+ * @param focusable Indicates if the popup can grab the focus.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
  * @param content The content to be displayed inside the popup.
  */
@@ -58,7 +62,7 @@
 fun Popup(
     alignment: Alignment = Alignment.TopStart,
     offset: IntOffset = IntOffset(0, 0),
-    isFocusable: Boolean = false,
+    focusable: Boolean = false,
     onDismissRequest: (() -> Unit)? = null,
     content: @Composable () -> Unit
 ) {
@@ -71,8 +75,8 @@
 
     Popup(
         popupPositionProvider = popupPositioner,
-        isFocusable = isFocusable,
         onDismissRequest = onDismissRequest,
+        focusable = focusable,
         content = content
     )
 }
@@ -85,39 +89,47 @@
  * @sample androidx.compose.ui.samples.PopupSample
  *
  * @param popupPositionProvider Provides the screen position of the popup.
- * @param isFocusable Indicates if the popup can grab the focus.
  * @param onDismissRequest Executes when the user clicks outside of the popup.
+ * @param focusable Indicates if the popup can grab the focus.
+ * @property contextMenu Places the popup window below the lower-right rectangle of the mouse
+ * cursor image (basic context menu behaviour).
  * @param content The content to be displayed inside the popup.
  */
 @Composable
 fun Popup(
     popupPositionProvider: PopupPositionProvider,
-    isFocusable: Boolean = false,
+    offset: IntOffset = IntOffset.Zero,
     onDismissRequest: (() -> Unit)? = null,
+    focusable: Boolean = false,
+    contextMenu: Boolean = false,
     content: @Composable () -> Unit
 ) {
-    PopupLayout(popupPositionProvider, isFocusable, onDismissRequest, content)
+    PopupLayout(popupPositionProvider, offset, focusable, contextMenu, onDismissRequest, content)
 }
 
 @Composable
 private fun PopupLayout(
     popupPositionProvider: PopupPositionProvider,
-    isFocusable: Boolean,
+    offset: IntOffset,
+    focusable: Boolean,
+    contextMenu: Boolean,
     onDismissRequest: (() -> Unit)?,
     content: @Composable () -> Unit
 ) {
-    val owners = DesktopOwnersAmbient.current
+    val owners = LocalDesktopOwners.current
     val density = LocalDensity.current
+    val container = LocalLayerContainer.current
 
-    val parentBounds = remember { mutableStateOf(IntRect.Zero) }
-    val popupBounds = remember { mutableStateOf(IntRect.Zero) }
+    var parentBounds by remember { mutableStateOf(IntRect.Zero) }
+    var popupBounds by remember { mutableStateOf(IntRect.Zero) }
+    val pointClick = remember { container.getMousePosition() }
 
     // getting parent bounds
     Layout(
         content = {},
         modifier = Modifier.onGloballyPositioned { childCoordinates ->
             val coordinates = childCoordinates.parentCoordinates!!
-            parentBounds.value = IntRect(
+            parentBounds = IntRect(
                 coordinates.localToWindow(Offset.Zero).round(),
                 coordinates.size
             )
@@ -133,10 +145,10 @@
         val composition = owner.setContent(parent = parentComposition) {
             Layout(
                 content = content,
-                modifier = Modifier.pointerInput(isFocusable, onDismissRequest) {
+                modifier = Modifier.pointerInput(focusable, onDismissRequest) {
                     detectDown(
-                        onDown = { offset ->
-                            if (isFocusable && isOutsideRectTap(popupBounds.value, offset)) {
+                        onDown = { point ->
+                            if (focusable && isOutsideRectTap(popupBounds, point)) {
                                 onDismissRequest?.invoke()
                             }
                         }
@@ -154,17 +166,27 @@
                     layout(constraints.maxWidth, constraints.maxHeight) {
                         measurables.forEach {
                             val placeable = it.measure(constraints)
-                            val offset = popupPositionProvider.calculatePosition(
-                                anchorBounds = parentBounds.value,
-                                windowSize = windowSize,
-                                layoutDirection = layoutDirection,
-                                popupContentSize = IntSize(placeable.width, placeable.height)
-                            )
-                            popupBounds.value = IntRect(
-                                offset,
+                            var position: IntOffset
+                            if (contextMenu) {
+                                position = calculateContextMenuPosition(
+                                    pointClick,
+                                    offset,
+                                    parentBounds,
+                                    density.density
+                                )
+                            } else {
+                                position = popupPositionProvider.calculatePosition(
+                                    anchorBounds = parentBounds,
+                                    windowSize = windowSize,
+                                    layoutDirection = layoutDirection,
+                                    popupContentSize = IntSize(placeable.width, placeable.height)
+                                )
+                            }
+                            popupBounds = IntRect(
+                                position,
                                 IntSize(placeable.width, placeable.height)
                             )
-                            placeable.place(offset.x, offset.y)
+                            placeable.place(position.x, position.y)
                         }
                     }
                 }
@@ -196,3 +218,15 @@
         }
     }
 }
+
+private fun calculateContextMenuPosition(
+    point: Point,
+    dropdownMenuPadding: IntOffset,
+    parentRect: IntRect,
+    density: Float
+): IntOffset {
+    return IntOffset(
+        (point.x * density).toInt(),
+        ((point.y + dropdownMenuPadding.y) * density).toInt() - parentRect.height
+    )
+}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
index 24533e3..87efdf6 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/key/KeyInputUtil.kt
@@ -32,7 +32,7 @@
     val action = when (keyEventType) {
         KeyEventType.KeyDown -> KEY_PRESSED
         KeyEventType.KeyUp -> KEY_RELEASED
-        KeyEventType.Unknown -> error("Unknown key event type")
+        else -> error("Unknown key event type")
     }
     return KeyEvent(
         KeyEventAwt(
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
index d3345e2..b6073f5 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
@@ -46,8 +46,11 @@
 import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
+import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
 import org.junit.Assert.assertFalse
 import org.junit.Rule
 import org.junit.Test
@@ -55,6 +58,8 @@
 class DesktopOwnerTest {
     @get:Rule
     val screenshotRule = DesktopScreenshotTestRule("ui/ui-desktop/ui")
+    @get:Rule
+    val composeRule = createComposeRule()
 
     @Test(timeout = 5000)
     fun `rendering of Box state change`() = renderingTest(width = 40, height = 40) {
@@ -349,4 +354,18 @@
         awaitNextRender()
         Truth.assertThat(effectIsLaunched).isTrue()
     }
+
+    @Test(expected = TestException::class)
+    fun `catch exception in LaunchedEffect`() {
+        runBlocking(Dispatchers.Main) {
+            composeRule.setContent {
+                LaunchedEffect(Unit) {
+                    throw TestException()
+                }
+            }
+            composeRule.awaitIdle()
+        }
+    }
+
+    private class TestException : RuntimeException()
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
index 434aec0..ad1f238 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
@@ -80,7 +80,7 @@
         owner?.dispose()
         val owner = DesktopOwner(owners)
         owner.setContent {
-            CompositionLocalProvider(DesktopPlatformAmbient provides platform) {
+            CompositionLocalProvider(LocalDesktopPlatform provides platform) {
                 content()
             }
         }
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt
index ced4b1a..f61bb8e 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkijaLayerTest.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.platform
 
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Matrix
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.TransformOrigin
@@ -39,12 +38,11 @@
     val rule = createComposeRule()
 
     private val layer = TestSkijaLayer()
-    private val matrix = Matrix()
     private val cos45 = cos(PI / 4)
 
     @Test
     fun initial() {
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -53,7 +51,7 @@
     @Test
     fun move() {
         layer.move(IntOffset(10, 20))
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -62,7 +60,7 @@
     @Test
     fun resize() {
         layer.resize(IntSize(100, 10))
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -72,7 +70,7 @@
     fun `resize and move`() {
         layer.resize(IntSize(100, 10))
         layer.move(IntOffset(10, 20))
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -86,7 +84,7 @@
             translationY = 20f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(10, 20), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(110, 30), matrix.map(Offset(100f, 10f)).round())
@@ -100,7 +98,7 @@
             translationY = 20f,
             transformOrigin = TransformOrigin(1f, 1f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(10, 20), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(110, 30), matrix.map(Offset(100f, 10f)).round())
@@ -114,7 +112,7 @@
             scaleY = 4f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(200, 40), matrix.map(Offset(100f, 10f)).round())
@@ -128,7 +126,7 @@
             scaleY = 4f,
             transformOrigin = TransformOrigin(1f, 1f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(-100, -30), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -141,7 +139,7 @@
             rotationX = 45f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val y = (10 * cos45).roundToInt()
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
@@ -155,11 +153,9 @@
             rotationX = 45f,
             transformOrigin = TransformOrigin(1f, 1f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val y = 10 * (1 - cos45.toFloat())
-        println(matrix.map(Offset(0f, 0f)))
-        println(matrix.map(Offset(100f, 10f)))
         assertEquals(Offset(0f, y), matrix.map(Offset(0f, 0f)))
         assertEquals(Offset(100f, 10f), matrix.map(Offset(100f, 10f)))
     }
@@ -171,7 +167,7 @@
             rotationY = 45f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val x = (100 * cos45).roundToInt()
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
@@ -185,7 +181,7 @@
             rotationY = 45f,
             transformOrigin = TransformOrigin(1f, 1f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val x = (100 * (1 - cos45)).roundToInt()
         assertEquals(IntOffset(x, 0), matrix.map(Offset(0f, 0f)).round())
@@ -199,7 +195,7 @@
             rotationZ = 90f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(-10, 100), matrix.map(Offset(100f, 10f)).round())
@@ -212,7 +208,7 @@
             rotationZ = 90f,
             transformOrigin = TransformOrigin(1f, 1f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(110, -90), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100, 10), matrix.map(Offset(100f, 10f)).round())
@@ -228,7 +224,7 @@
             scaleY = 4f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0 + 60, 0 + 7), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(100 * 2 + 60, 10 * 4 + 7), matrix.map(Offset(100f, 10f)).round())
@@ -243,7 +239,7 @@
             rotationZ = 90f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0 + 60, 0 + 7), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(-10 + 60, 100 + 7), matrix.map(Offset(100f, 10f)).round())
@@ -258,7 +254,7 @@
             rotationX = 45f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val y = (10 * cos45).roundToInt()
         val translationY = (7 * cos45).roundToInt()
@@ -275,7 +271,7 @@
             rotationY = 45f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         val x = (100 * cos45).roundToInt()
         val translationX = (60 * cos45).roundToInt()
@@ -292,7 +288,7 @@
             rotationZ = 90f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0, 0), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(-10 * 4, 100 * 2), matrix.map(Offset(100f, 10f)).round())
@@ -309,7 +305,7 @@
             rotationZ = 90f,
             transformOrigin = TransformOrigin(0f, 0f)
         )
-        layer.getMatrix(matrix)
+        val matrix = layer.matrix
 
         assertEquals(IntOffset(0 + 60, 0 + 7), matrix.map(Offset(0f, 0f)).round())
         assertEquals(IntOffset(-10 * 4 + 60, 100 * 2 + 7), matrix.map(Offset(100f, 10f)).round())
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/TestComposeWindowTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/TestComposeWindowTest.kt
index a85f9da..7fd119a 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/TestComposeWindowTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/TestComposeWindowTest.kt
@@ -23,6 +23,9 @@
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.AccountBox
 import androidx.compose.ui.Modifier
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.swing.Swing
 import org.junit.Test
 
 class TestComposeWindowTest {
@@ -41,4 +44,12 @@
             }
         }
     }
+
+    @Test(timeout = 5000)
+    fun `disposing TestComposeWindow should not cancel coroutineContext's Job`() {
+        runBlocking(Dispatchers.Swing) {
+            val window = TestComposeWindow(100, 100, coroutineContext = coroutineContext)
+            window.dispose()
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
index efceb69..be0c4a9 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/DesktopPopupTest.kt
@@ -48,22 +48,22 @@
     val rule = createComposeRule()
 
     @Test
-    fun `pass ambients to popup`() {
-        val ambient = staticCompositionLocalOf<Int> {
+    fun `pass composition locals to popup`() {
+        val compositionLocal = staticCompositionLocalOf<Int> {
             error("not set")
         }
 
-        var actualAmbientValue = 0
+        var actualLocalValue = 0
 
         rule.setContent {
-            CompositionLocalProvider(ambient provides 3) {
+            CompositionLocalProvider(compositionLocal provides 3) {
                 Popup {
-                    actualAmbientValue = ambient.current
+                    actualLocalValue = compositionLocal.current
                 }
             }
         }
 
-        Truth.assertThat(actualAmbientValue).isEqualTo(3)
+        Truth.assertThat(actualLocalValue).isEqualTo(3)
     }
 
     @Test
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidAutofillTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidAutofillTest.kt
deleted file mode 100644
index 6ef2547..0000000
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidAutofillTest.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.autofill
-
-import android.app.Activity
-import android.view.View
-import android.view.autofill.AutofillManager
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.graphics.toComposeRect
-import androidx.compose.ui.test.ComposeUiRobolectricTestRunner
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.ExpectedException
-import org.junit.runner.RunWith
-import org.robolectric.Robolectric
-import org.robolectric.annotation.Config
-import org.robolectric.annotation.Implementation
-import org.robolectric.annotation.Implements
-import org.robolectric.shadow.api.Shadow
-import android.graphics.Rect as AndroidRect
-
-@OptIn(ExperimentalComposeUiApi::class)
-@RunWith(ComposeUiRobolectricTestRunner::class)
-@Config(
-    shadows = [ShadowAutofillManager::class],
-    minSdk = 26
-)
-class AndroidAutofillTest {
-
-    @get:Rule
-    val expectedException = ExpectedException.none()!!
-
-    private lateinit var androidAutofill: AndroidAutofill
-    private lateinit var autofillManager: ShadowAutofillManager
-    private lateinit var view: View
-    private val autofillTree = AutofillTree()
-
-    @Before
-    fun setup() {
-        val activity = Robolectric.buildActivity(Activity::class.java).get()
-        view = View(activity)
-        activity.setContentView(view)
-
-        autofillManager = Shadow.extract<ShadowAutofillManager>(
-            activity.getSystemService(AutofillManager::class.java)
-        )
-
-        androidAutofill = AndroidAutofill(view, autofillTree)
-    }
-
-    @Test
-    fun importantForAutofill_is_yes() {
-        assertThat(view.importantForAutofill).isEqualTo(View.IMPORTANT_FOR_AUTOFILL_YES)
-    }
-
-    @Test
-    fun requestAutofillForNode_calls_notifyViewEntered() {
-        // Arrange.
-        val bounds = Rect(0f, 0f, 0f, 0f)
-        val autofillNode = AutofillNode(onFill = {}, boundingBox = bounds)
-
-        // Act.
-        androidAutofill.requestAutofillForNode(autofillNode)
-
-        // Assert.
-        assertThat(autofillManager.viewEnteredStats).containsExactly(
-            ShadowAutofillManager.NotifyViewEntered(view, autofillNode.id, bounds)
-        )
-    }
-
-    @Test
-    fun requestAutofillForNode_beforeComposableIsPositioned_throwsError() {
-        // Arrange - Before the composable is positioned, the boundingBox is null.
-        val autofillNode = AutofillNode(onFill = {})
-
-        // Assert.
-        expectedException.expectMessage("requestAutofill called before onChildPositioned()")
-
-        // Act.
-        androidAutofill.requestAutofillForNode(autofillNode)
-    }
-
-    @Test
-    fun cancelAutofillForNode_calls_notifyViewExited() {
-        // Arrange.
-        val autofillNode = AutofillNode(onFill = {})
-
-        // Act.
-        androidAutofill.cancelAutofillForNode(autofillNode)
-
-        // Assert.
-        assertThat(autofillManager.viewExitedStats).containsExactly(
-            ShadowAutofillManager.NotifyViewExited(view, autofillNode.id)
-        )
-    }
-}
-
-@Implements(value = AutofillManager::class, minSdk = 26)
-internal class ShadowAutofillManager {
-    data class NotifyViewEntered(val view: View, val virtualId: Int, val rect: Rect)
-    data class NotifyViewExited(val view: View, val virtualId: Int)
-
-    val viewEnteredStats = mutableListOf<NotifyViewEntered>()
-    val viewExitedStats = mutableListOf<NotifyViewExited>()
-
-    @Implementation
-    fun notifyViewEntered(view: View, virtualId: Int, rect: AndroidRect) {
-        viewEnteredStats += NotifyViewEntered(view, virtualId, rect.toComposeRect())
-    }
-
-    @Implementation
-    fun notifyViewExited(view: View, virtualId: Int) {
-        viewExitedStats += NotifyViewExited(view, virtualId)
-    }
-}
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
index f223b15..204ad58a 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPerformAutofillTest.kt
@@ -22,16 +22,16 @@
 import android.view.autofill.AutofillValue
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.test.ComposeUiRobolectricTestRunner
 import com.google.common.truth.Truth
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 
 @OptIn(ExperimentalComposeUiApi::class)
-@RunWith(ComposeUiRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(minSdk = 26)
 class AndroidPerformAutofillTest {
     private val autofillTree = AutofillTree()
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
index 0e4c59d..f56a090 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AndroidPopulateViewStructureTest.kt
@@ -22,16 +22,16 @@
 import androidx.autofill.HintConstants.AUTOFILL_HINT_PERSON_NAME
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.test.ComposeUiRobolectricTestRunner
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 
 @OptIn(ExperimentalComposeUiApi::class)
-@RunWith(ComposeUiRobolectricTestRunner::class)
+@RunWith(RobolectricTestRunner::class)
 @Config(
     manifest = Config.NONE,
     minSdk = 26
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
index 42294c67..c11fd2e 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/autofill/AutofillNodeTest.kt
@@ -16,18 +16,121 @@
 
 package androidx.compose.ui.autofill
 
+import android.app.Activity
+import android.view.View
+import android.view.autofill.AutofillManager
 import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.toComposeRect
 import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
+import org.junit.rules.ExpectedException
 import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.Implementation
+import org.robolectric.annotation.Implements
+import org.robolectric.shadow.api.Shadow
 
 @OptIn(ExperimentalComposeUiApi::class)
-@RunWith(JUnit4::class)
+@RunWith(RobolectricTestRunner::class)
+@Config(
+    shadows = [ShadowAutofillManager::class],
+    minSdk = 26
+)
 class AutofillNodeTest {
+    @get:Rule
+    val expectedException = ExpectedException.none()!!
+
+    private lateinit var androidAutofill: AndroidAutofill
+    private lateinit var autofillManager: ShadowAutofillManager
+    private lateinit var view: View
+    private val autofillTree = AutofillTree()
+
+    @Before
+    fun setup() {
+        val activity = Robolectric.buildActivity(Activity::class.java).get()
+        view = View(activity)
+        activity.setContentView(view)
+
+        autofillManager = Shadow.extract<ShadowAutofillManager>(
+            activity.getSystemService(AutofillManager::class.java)
+        )
+
+        androidAutofill = AndroidAutofill(view, autofillTree)
+    }
+
     @Test
     fun eachInstanceHasUniqueId() {
         assertThat(listOf(AutofillNode {}.id, AutofillNode {}.id, AutofillNode {}.id))
             .containsNoDuplicates()
     }
-}
\ No newline at end of file
+
+    @Test
+    fun importantForAutofill_is_yes() {
+        assertThat(view.importantForAutofill).isEqualTo(View.IMPORTANT_FOR_AUTOFILL_YES)
+    }
+
+    @Test
+    fun requestAutofillForNode_calls_notifyViewEntered() {
+        // Arrange.
+        val bounds = Rect(0f, 0f, 0f, 0f)
+        val autofillNode = AutofillNode(onFill = {}, boundingBox = bounds)
+
+        // Act.
+        androidAutofill.requestAutofillForNode(autofillNode)
+
+        // Assert.
+        assertThat(autofillManager.viewEnteredStats).containsExactly(
+            ShadowAutofillManager.NotifyViewEntered(view, autofillNode.id, bounds)
+        )
+    }
+
+    @Test
+    fun requestAutofillForNode_beforeComposableIsPositioned_throwsError() {
+        // Arrange - Before the composable is positioned, the boundingBox is null.
+        val autofillNode = AutofillNode(onFill = {})
+
+        // Assert.
+        expectedException.expectMessage("requestAutofill called before onChildPositioned()")
+
+        // Act.
+        androidAutofill.requestAutofillForNode(autofillNode)
+    }
+
+    @Test
+    fun cancelAutofillForNode_calls_notifyViewExited() {
+        // Arrange.
+        val autofillNode = AutofillNode(onFill = {})
+
+        // Act.
+        androidAutofill.cancelAutofillForNode(autofillNode)
+
+        // Assert.
+        assertThat(autofillManager.viewExitedStats).containsExactly(
+            ShadowAutofillManager.NotifyViewExited(view, autofillNode.id)
+        )
+    }
+}
+
+@Implements(value = AutofillManager::class, minSdk = 26)
+internal class ShadowAutofillManager {
+    data class NotifyViewEntered(val view: View, val virtualId: Int, val rect: Rect)
+    data class NotifyViewExited(val view: View, val virtualId: Int)
+
+    val viewEnteredStats = mutableListOf<NotifyViewEntered>()
+    val viewExitedStats = mutableListOf<NotifyViewExited>()
+
+    @Implementation
+    fun notifyViewEntered(view: View, virtualId: Int, rect: android.graphics.Rect) {
+        viewEnteredStats += NotifyViewEntered(view, virtualId, rect.toComposeRect())
+    }
+
+    @Implementation
+    fun notifyViewExited(view: View, virtualId: Int) {
+        viewExitedStats += NotifyViewExited(view, virtualId)
+    }
+}
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 9e31c55..bdf16a9 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
@@ -21,11 +21,11 @@
 import androidx.compose.ui.autofill.AutofillTree
 import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.draw.drawBehind
-import androidx.compose.ui.focus.FocusDirectionInternal
+import androidx.compose.ui.focus.FocusDirection
 import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.geometry.MutableRect
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Matrix
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.drawscope.ContentDrawScope
@@ -1682,6 +1682,22 @@
     }
 
     @Test
+    fun layerParamChangeCallsOnLayoutChange() {
+        val node = LayoutNode(20, 20, 100, 100, Modifier.graphicsLayer())
+        val owner = MockOwner()
+        node.attach(owner)
+        assertEquals(0, owner.layoutChangeCount)
+        node.innerLayoutNodeWrapper.onLayerBlockUpdated { scaleX = 0.5f }
+        assertEquals(1, owner.layoutChangeCount)
+        repeat(2) {
+            node.innerLayoutNodeWrapper.onLayerBlockUpdated { scaleX = 1f }
+        }
+        assertEquals(2, owner.layoutChangeCount)
+        node.innerLayoutNodeWrapper.onLayerBlockUpdated(null)
+        assertEquals(3, owner.layoutChangeCount)
+    }
+
+    @Test
     fun reuseModifiersThatImplementMultipleModifierInterfaces() {
         val drawAndLayoutModifier: Modifier = object : DrawModifier, LayoutModifier {
             override fun MeasureScope.measure(
@@ -1804,6 +1820,7 @@
     override fun measureAndLayout() {
     }
 
+    @ExperimentalComposeUiApi
     override fun createLayer(
         drawBlock: (Canvas) -> Unit,
         invalidateParentLayer: () -> Unit
@@ -1812,6 +1829,10 @@
             override val layerId: Long
                 get() = 0
 
+            @ExperimentalComposeUiApi
+            override val ownerViewId: Long
+                get() = 0
+
             override fun updateLayerProperties(
                 scaleX: Float,
                 scaleY: Float,
@@ -1849,8 +1870,10 @@
             override fun destroy() {
             }
 
-            override fun getMatrix(matrix: Matrix) {
+            override fun mapBounds(rect: MutableRect, inverse: Boolean) {
             }
+
+            override fun mapOffset(point: Offset, inverse: Boolean) = point
         }
     }
 
@@ -1861,7 +1884,7 @@
         layoutChangeCount++
     }
 
-    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirectionInternal? {
+    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
         TODO("Not yet implemented")
     }
 
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/test/ComposeUiRobolectricTestRunner.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/test/ComposeUiRobolectricTestRunner.kt
deleted file mode 100644
index 77cc9d9..0000000
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/test/ComposeUiRobolectricTestRunner.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.test
-
-import org.junit.runners.model.FrameworkMethod
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.internal.bytecode.InstrumentationConfiguration
-
-/**
- * A [RobolectricTestRunner] for [androidx.compose].
- *
- * It has instrumentation turned off for the [androidx.compose] package.
- *
- * Robolectric tries to instrument Kotlin classes, and it throws errors when it encounters
- * companion objects and constructors with default values for parameters. We don't need
- * shadowing of our classes because we want to use the actual objects in our tests.
- *
- * We can also make the argument that no external developer should shadow any of
- * androidx.compose, as they shouldn't be testing library code. This concern is being tracked by
- * b/139828620 which will make a change to Robolectric code to prevent instrumentation of all
- * classes under [androidx.compose].
- */
-class ComposeUiRobolectricTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
-    override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration {
-        val builder = InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
-        // TODO: b/160233169 remove 'androidx.ui' when everything is migrated to androidx.compose
-        builder.doNotInstrumentPackage("androidx.ui")
-        builder.doNotInstrumentPackage("androidx.compose")
-        return builder.build()
-    }
-}
diff --git a/concurrent/futures-ktx/lint-baseline.xml b/concurrent/futures-ktx/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/concurrent/futures-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/concurrent/futures/build.gradle b/concurrent/futures/build.gradle
index 23d69ea..b1a0910 100644
--- a/concurrent/futures/build.gradle
+++ b/concurrent/futures/build.gradle
@@ -32,9 +32,6 @@
     testImplementation(TRUTH)
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 androidx {
     name = "AndroidX Futures"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/concurrent/futures/lint-baseline.xml b/concurrent/futures/lint-baseline.xml
index 0f0c805..dcd5ad3 100644
--- a/concurrent/futures/lint-baseline.xml
+++ b/concurrent/futures/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/concurrent/listenablefuture-callback/api/1.0.0-beta02.txt b/concurrent/listenablefuture-callback/api/1.0.0-beta02.txt
deleted file mode 100644
index d95deda..0000000
--- a/concurrent/listenablefuture-callback/api/1.0.0-beta02.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent.callback {
-
-  public final class CallbackToFutureAdapter {
-    method public static <T> androidx.concurrent.ListenableFuture<T!> getFuture(androidx.concurrent.callback.CallbackToFutureAdapter.Resolver<T!>);
-  }
-
-  public static final class CallbackToFutureAdapter.Completer<T> {
-    method public void addCancellationListener(Runnable, java.util.concurrent.Executor);
-    method protected void finalize();
-    method public boolean set(T!);
-    method public boolean setCancelled();
-    method public boolean setException(Throwable);
-  }
-
-  public static interface CallbackToFutureAdapter.Resolver<T> {
-    method public Object? attachCompleter(androidx.concurrent.callback.CallbackToFutureAdapter.Completer<T!>) throws java.lang.Exception;
-  }
-
-}
-
diff --git a/concurrent/listenablefuture-callback/api/1.0.0-rc01.txt b/concurrent/listenablefuture-callback/api/1.0.0-rc01.txt
deleted file mode 100644
index d95deda..0000000
--- a/concurrent/listenablefuture-callback/api/1.0.0-rc01.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent.callback {
-
-  public final class CallbackToFutureAdapter {
-    method public static <T> androidx.concurrent.ListenableFuture<T!> getFuture(androidx.concurrent.callback.CallbackToFutureAdapter.Resolver<T!>);
-  }
-
-  public static final class CallbackToFutureAdapter.Completer<T> {
-    method public void addCancellationListener(Runnable, java.util.concurrent.Executor);
-    method protected void finalize();
-    method public boolean set(T!);
-    method public boolean setCancelled();
-    method public boolean setException(Throwable);
-  }
-
-  public static interface CallbackToFutureAdapter.Resolver<T> {
-    method public Object? attachCompleter(androidx.concurrent.callback.CallbackToFutureAdapter.Completer<T!>) throws java.lang.Exception;
-  }
-
-}
-
diff --git a/concurrent/listenablefuture-callback/api/restricted_1.0.0-beta02.txt b/concurrent/listenablefuture-callback/api/restricted_1.0.0-beta02.txt
deleted file mode 100644
index 0f47ccd..0000000
--- a/concurrent/listenablefuture-callback/api/restricted_1.0.0-beta02.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent.callback {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class AbstractResolvableFuture<V> implements androidx.concurrent.ListenableFuture<V> {
-    ctor protected AbstractResolvableFuture();
-    method public final void addListener(Runnable!, java.util.concurrent.Executor!);
-    method protected void afterDone();
-    method public final boolean cancel(boolean);
-    method public final V! get(long, java.util.concurrent.TimeUnit!) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    method public final V! get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method protected void interruptTask();
-    method public final boolean isCancelled();
-    method public final boolean isDone();
-    method protected String? pendingToString();
-    method protected boolean set(V?);
-    method protected boolean setException(Throwable!);
-    method protected boolean setFuture(androidx.concurrent.ListenableFuture<? extends V>!);
-    method protected final boolean wasInterrupted();
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResolvableFuture<V> extends androidx.concurrent.callback.AbstractResolvableFuture<V> {
-    method public static <V> androidx.concurrent.callback.ResolvableFuture<V!>! create();
-    method public boolean set(V?);
-    method public boolean setException(Throwable!);
-    method public boolean setFuture(androidx.concurrent.ListenableFuture<? extends V>!);
-  }
-
-}
-
diff --git a/concurrent/listenablefuture-callback/api/restricted_1.0.0-rc01.txt b/concurrent/listenablefuture-callback/api/restricted_1.0.0-rc01.txt
deleted file mode 100644
index 0f47ccd..0000000
--- a/concurrent/listenablefuture-callback/api/restricted_1.0.0-rc01.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent.callback {
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class AbstractResolvableFuture<V> implements androidx.concurrent.ListenableFuture<V> {
-    ctor protected AbstractResolvableFuture();
-    method public final void addListener(Runnable!, java.util.concurrent.Executor!);
-    method protected void afterDone();
-    method public final boolean cancel(boolean);
-    method public final V! get(long, java.util.concurrent.TimeUnit!) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    method public final V! get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method protected void interruptTask();
-    method public final boolean isCancelled();
-    method public final boolean isDone();
-    method protected String? pendingToString();
-    method protected boolean set(V?);
-    method protected boolean setException(Throwable!);
-    method protected boolean setFuture(androidx.concurrent.ListenableFuture<? extends V>!);
-    method protected final boolean wasInterrupted();
-  }
-
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResolvableFuture<V> extends androidx.concurrent.callback.AbstractResolvableFuture<V> {
-    method public static <V> androidx.concurrent.callback.ResolvableFuture<V!>! create();
-    method public boolean set(V?);
-    method public boolean setException(Throwable!);
-    method public boolean setFuture(androidx.concurrent.ListenableFuture<? extends V>!);
-  }
-
-}
-
diff --git a/concurrent/listenablefuture-callback/lint-baseline.xml b/concurrent/listenablefuture-callback/lint-baseline.xml
deleted file mode 100644
index bdd761e..0000000
--- a/concurrent/listenablefuture-callback/lint-baseline.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 3.5.0-beta04" client="gradle" version="3.5.0-beta04">
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 V get(long timeout, TimeUnit unit)"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="353"
-            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 final V get(long timeout, TimeUnit unit)"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="353"
-            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 final V get() throws InterruptedException, ExecutionException {"
-        errorLine2="                 ~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="468"
-            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 final void addListener(Runnable listener, Executor executor) {"
-        errorLine2="                                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="651"
-            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 final void addListener(Runnable listener, Executor executor) {"
-        errorLine2="                                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="651"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 setException(Throwable throwable) {"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="708"
-            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 boolean setFuture(ListenableFuture&lt;? extends V> future) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/AbstractResolvableFuture.java"
-            line="744"
-            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 boolean set(T value) {"
-        errorLine2="                           ~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/CallbackToFutureAdapter.java"
-            line="245"
-            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 static &lt;V> ResolvableFuture&lt;V> create() {"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/ResolvableFuture.java"
-            line="43"
-            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 boolean setException(Throwable throwable) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/ResolvableFuture.java"
-            line="53"
-            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 boolean setFuture(ListenableFuture&lt;? extends V> future) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/concurrent/callback/ResolvableFuture.java"
-            line="58"
-            column="30"/>
-    </issue>
-
-</issues>
diff --git a/concurrent/listenablefuture/api/1.0.0-beta02.txt b/concurrent/listenablefuture/api/1.0.0-beta02.txt
deleted file mode 100644
index 54c6f60..0000000
--- a/concurrent/listenablefuture/api/1.0.0-beta02.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent {
-
-  public interface ListenableFuture<V> extends java.util.concurrent.Future<V> {
-    method public void addListener(Runnable, java.util.concurrent.Executor);
-  }
-
-}
-
diff --git a/concurrent/listenablefuture/api/1.0.0-rc01.txt b/concurrent/listenablefuture/api/1.0.0-rc01.txt
deleted file mode 100644
index 54c6f60..0000000
--- a/concurrent/listenablefuture/api/1.0.0-rc01.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-// Signature format: 3.0
-package androidx.concurrent {
-
-  public interface ListenableFuture<V> extends java.util.concurrent.Future<V> {
-    method public void addListener(Runnable, java.util.concurrent.Executor);
-  }
-
-}
-
diff --git a/concurrent/listenablefuture/api/restricted_1.0.0-beta02.txt b/concurrent/listenablefuture/api/restricted_1.0.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/concurrent/listenablefuture/api/restricted_1.0.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/concurrent/listenablefuture/api/restricted_1.0.0-rc01.txt b/concurrent/listenablefuture/api/restricted_1.0.0-rc01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/concurrent/listenablefuture/api/restricted_1.0.0-rc01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/contentpager/contentpager/build.gradle b/contentpager/contentpager/build.gradle
index 33bc9f0..17c5064 100644
--- a/contentpager/contentpager/build.gradle
+++ b/contentpager/contentpager/build.gradle
@@ -34,7 +34,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
 }
 
 androidx {
diff --git a/contentpager/contentpager/lint-baseline.xml b/contentpager/contentpager/lint-baseline.xml
index 4e1327a..e8504e7 100644
--- a/contentpager/contentpager/lint-baseline.xml
+++ b/contentpager/contentpager/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.contentpager.content.ContentPager is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.contentpager.content.ContentPager is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            extras = extras.deepCopy();"
         errorLine2="                            ~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.contentpager.content.Query is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return resolver.query("
         errorLine2="                            ~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.contentpager.content.Query is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return resolver.query("
         errorLine2="                            ~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.contentpager.content.Query is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (mCancellationSignal != null &amp;&amp; !mCancellationSignal.isCanceled()) {"
         errorLine2="                                                                    ~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.contentpager.content.Query is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.contentpager.content.Query is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mCancellationSignal.cancel();"
         errorLine2="                                    ~~~~~~">
         <location
diff --git a/coordinatorlayout/coordinatorlayout/build.gradle b/coordinatorlayout/coordinatorlayout/build.gradle
index 98639d0..8acc494 100644
--- a/coordinatorlayout/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/coordinatorlayout/build.gradle
@@ -18,20 +18,16 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.coordinatorlayout", module: "coordinatorlayout"
     })
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     sourceSets {
         main.res.srcDirs = [
                 "src/main/res",
diff --git a/coordinatorlayout/coordinatorlayout/lint-baseline.xml b/coordinatorlayout/coordinatorlayout/lint-baseline.xml
index 5088e0f..059c772 100644
--- a/coordinatorlayout/coordinatorlayout/lint-baseline.xml
+++ b/coordinatorlayout/coordinatorlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -8,7 +8,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="256"
+            line="255"
             column="46"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="346"
+            line="345"
             column="38"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="398"
+            line="397"
             column="18"/>
     </issue>
 
@@ -41,7 +41,7 @@
         errorLine2="                                         ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="563"
+            line="562"
             column="42"/>
     </issue>
 
@@ -52,7 +52,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="585"
+            line="584"
             column="33"/>
     </issue>
 
@@ -63,7 +63,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="794"
+            line="793"
             column="32"/>
     </issue>
 
@@ -74,7 +74,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="961"
+            line="960"
             column="24"/>
     </issue>
 
@@ -85,7 +85,7 @@
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1288"
+            line="1287"
             column="33"/>
     </issue>
 
@@ -96,7 +96,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1288"
+            line="1287"
             column="48"/>
     </issue>
 
@@ -107,7 +107,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1775"
+            line="1761"
             column="12"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="                                             ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1775"
+            line="1761"
             column="46"/>
     </issue>
 
@@ -129,7 +129,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1780"
+            line="1766"
             column="15"/>
     </issue>
 
@@ -140,7 +140,7 @@
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1780"
+            line="1766"
             column="49"/>
     </issue>
 
@@ -151,7 +151,7 @@
         errorLine2="              ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1790"
+            line="1776"
             column="15"/>
     </issue>
 
@@ -162,7 +162,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1795"
+            line="1781"
             column="41"/>
     </issue>
 
@@ -173,7 +173,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1800"
+            line="1786"
             column="40"/>
     </issue>
 
@@ -184,7 +184,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1800"
+            line="1786"
             column="52"/>
     </issue>
 
@@ -195,7 +195,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1806"
+            line="1792"
             column="40"/>
     </issue>
 
@@ -206,7 +206,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1806"
+            line="1792"
             column="52"/>
     </issue>
 
@@ -217,7 +217,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1831"
+            line="1817"
             column="40"/>
     </issue>
 
@@ -228,7 +228,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1831"
+            line="1817"
             column="52"/>
     </issue>
 
@@ -239,7 +239,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1837"
+            line="1823"
             column="40"/>
     </issue>
 
@@ -250,7 +250,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1837"
+            line="1823"
             column="52"/>
     </issue>
 
@@ -261,7 +261,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1858"
+            line="1844"
             column="36"/>
     </issue>
 
@@ -272,7 +272,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1864"
+            line="1850"
             column="36"/>
     </issue>
 
@@ -283,7 +283,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1886"
+            line="1872"
             column="32"/>
     </issue>
 
@@ -294,7 +294,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1893"
+            line="1879"
             column="32"/>
     </issue>
 
@@ -305,7 +305,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1948"
+            line="1934"
             column="35"/>
     </issue>
 
@@ -316,7 +316,7 @@
         errorLine2="                                                               ~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1948"
+            line="1934"
             column="64"/>
     </issue>
 
@@ -327,7 +327,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1954"
+            line="1940"
             column="35"/>
     </issue>
 
@@ -338,7 +338,7 @@
         errorLine2="                                                               ~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1954"
+            line="1940"
             column="64"/>
     </issue>
 
@@ -349,7 +349,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="1997"
+            line="1983"
             column="34"/>
     </issue>
 
@@ -360,7 +360,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2027"
+            line="2013"
             column="37"/>
     </issue>
 
@@ -371,7 +371,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2138"
+            line="2124"
             column="25"/>
     </issue>
 
@@ -382,7 +382,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2138"
+            line="2124"
             column="42"/>
     </issue>
 
@@ -393,7 +393,7 @@
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2943"
+            line="2929"
             column="29"/>
     </issue>
 
@@ -404,7 +404,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2947"
+            line="2933"
             column="29"/>
     </issue>
 
@@ -415,7 +415,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="2951"
+            line="2937"
             column="29"/>
     </issue>
 
@@ -426,7 +426,7 @@
         errorLine2="                                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="3276"
+            line="3262"
             column="43"/>
     </issue>
 
@@ -437,7 +437,7 @@
         errorLine2="              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="3304"
+            line="3290"
             column="15"/>
     </issue>
 
@@ -448,7 +448,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="3328"
+            line="3314"
             column="50"/>
     </issue>
 
@@ -459,7 +459,7 @@
         errorLine2="                                                             ~~~~">
         <location
             file="src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java"
-            line="3328"
+            line="3314"
             column="62"/>
     </issue>
 
diff --git a/core/core-animation-integration-tests/testapp/build.gradle b/core/core-animation-integration-tests/testapp/build.gradle
index 5e2863f..f1a3103 100644
--- a/core/core-animation-integration-tests/testapp/build.gradle
+++ b/core/core-animation-integration-tests/testapp/build.gradle
@@ -27,7 +27,7 @@
     implementation(project(":core:core-animation"))
     implementation(project(":core:core-animation-testing"))
 
-    implementation(ANDROIDX_TEST_EXT_JUNIT, libs.exclude_for_espresso)
-    implementation(ANDROIDX_TEST_CORE, libs.exclude_for_espresso)
-    implementation(ANDROIDX_TEST_RULES, libs.exclude_for_espresso)
+    implementation(ANDROIDX_TEST_EXT_JUNIT, excludes.espresso)
+    implementation(ANDROIDX_TEST_CORE, excludes.espresso)
+    implementation(ANDROIDX_TEST_RULES, excludes.espresso)
 }
diff --git a/core/core-animation-integration-tests/testapp/lint-baseline.xml b/core/core-animation-integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/core/core-animation-integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/core/core-animation-testing/lint-baseline.xml b/core/core-animation-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/core/core-animation-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/core/core-animation/build.gradle b/core/core-animation/build.gradle
index 2b4bbef..d7061d3 100644
--- a/core/core-animation/build.gradle
+++ b/core/core-animation/build.gradle
@@ -29,8 +29,8 @@
     implementation("androidx.core:core:1.3.1")
     implementation("androidx.collection:collection:1.1.0")
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT, libs.exclude_for_espresso)
-    androidTestImplementation(ANDROIDX_TEST_RULES, libs.exclude_for_espresso)
+    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT, excludes.espresso)
+    androidTestImplementation(ANDROIDX_TEST_RULES, excludes.espresso)
 }
 
 androidx {
diff --git a/core/core-animation/lint-baseline.xml b/core/core-animation/lint-baseline.xml
index c83551b..cb992aa2 100644
--- a/core/core-animation/lint-baseline.xml
+++ b/core/core-animation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -74,13 +74,13 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/animation/PropertyValuesHolder.java"
-            line="1485"
+            line="1486"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.animation.PathUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.animation.PathUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return path.approximate(precision);"
         errorLine2="                        ~~~~~~~~~~~">
         <location
diff --git a/core/core-appdigest/build.gradle b/core/core-appdigest/build.gradle
index 8270040..e7d2bba 100644
--- a/core/core-appdigest/build.gradle
+++ b/core/core-appdigest/build.gradle
@@ -24,13 +24,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
     api("androidx.core:core:1.0.0")
diff --git a/core/core-appdigest/lint-baseline.xml b/core/core-appdigest/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/core/core-appdigest/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/core/core-google-shortcuts/api/1.0.0-beta01.txt b/core/core-google-shortcuts/api/1.0.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/core/core-google-shortcuts/api/1.0.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/core/core-google-shortcuts/api/public_plus_experimental_1.0.0-beta01.txt b/core/core-google-shortcuts/api/public_plus_experimental_1.0.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/core/core-google-shortcuts/api/public_plus_experimental_1.0.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/core/core-google-shortcuts/api/res-1.0.0-beta01.txt b/core/core-google-shortcuts/api/res-1.0.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/core/core-google-shortcuts/api/res-1.0.0-beta01.txt
diff --git a/core/core-google-shortcuts/api/restricted_1.0.0-beta01.txt b/core/core-google-shortcuts/api/restricted_1.0.0-beta01.txt
new file mode 100644
index 0000000..bdb2746
--- /dev/null
+++ b/core/core-google-shortcuts/api/restricted_1.0.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) androidx.core.google.shortcuts {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ShortcutInfoChangeListenerImpl extends androidx.core.content.pm.ShortcutInfoChangeListener {
+    method public static androidx.core.google.shortcuts.ShortcutInfoChangeListenerImpl getInstance(android.content.Context);
+  }
+
+}
+
diff --git a/core/core-google-shortcuts/build.gradle b/core/core-google-shortcuts/build.gradle
index 56bca79..ea77000 100644
--- a/core/core-google-shortcuts/build.gradle
+++ b/core/core-google-shortcuts/build.gradle
@@ -27,19 +27,15 @@
 
 android {
     defaultConfig {
-        minSdkVersion 21
+        multiDexEnabled = true
     }
 }
 
 dependencies {
-    api(KOTLIN_STDLIB)
     api(project(":core:core"))
 
     implementation("com.google.firebase:firebase-appindexing:19.2.0")
-
-    // Use these version to avoid b/164901843
-    implementation("com.google.crypto.tink:tink-android:1.4.0-rc2")
-    implementation("androidx.security:security-crypto:1.1.0-alpha01")
+    implementation("com.google.crypto.tink:tink-android:1.5.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
@@ -47,9 +43,10 @@
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(ESPRESSO_INTENTS)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(TRUTH)
+    androidTestImplementation(MULTIDEX)
 }
 
 androidx {
diff --git a/core/core-google-shortcuts/src/androidTest/AndroidManifest.xml b/core/core-google-shortcuts/src/androidTest/AndroidManifest.xml
index 8a5a29d..f5f3686 100644
--- a/core/core-google-shortcuts/src/androidTest/AndroidManifest.xml
+++ b/core/core-google-shortcuts/src/androidTest/AndroidManifest.xml
@@ -15,8 +15,10 @@
   limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="androidx.core.google.shortcuts.test">
-    <application>
+    <uses-sdk tools:overrideLibrary="com.google.firebase.icing"/>
+    <application android:name="androidx.multidex.MultiDexApplication">
         <activity android:name=".TestActivity"/>
     </application>
 </manifest>
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
index b6543e1..97b77a7 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
@@ -16,36 +16,27 @@
 
 package androidx.core.google.shortcuts;
 
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_DESCRIPTION_KEY;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_LABEL_KEY;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_TAG_KEY;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_URL_KEY;
-
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.only;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.Intent;
-import android.util.Base64;
 
 import androidx.core.content.pm.ShortcutInfoCompat;
+import androidx.core.google.shortcuts.builders.CapabilityBuilder;
+import androidx.core.google.shortcuts.builders.ParameterBuilder;
+import androidx.core.google.shortcuts.builders.ShortcutBuilder;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
-import com.google.android.gms.tasks.Task;
-import com.google.android.gms.tasks.Tasks;
 import com.google.common.collect.ImmutableList;
-import com.google.crypto.tink.KeysetHandle;
-import com.google.crypto.tink.Mac;
 import com.google.firebase.appindexing.Action;
 import com.google.firebase.appindexing.FirebaseAppIndex;
 import com.google.firebase.appindexing.FirebaseUserActions;
@@ -56,13 +47,13 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 
-import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21) // This module should only be called for version 21+.
 public class ShortcutInfoChangeListenerImplTest {
     private FirebaseAppIndex mFirebaseAppIndex;
     private FirebaseUserActions mFirebaseUserActions;
@@ -82,9 +73,8 @@
     @SmallTest
     public void onShortcutUpdated_publicIntent_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
 
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
+        Intent intent = Intent.parseUri("app://shortcut", 0);
         ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
                 .setShortLabel("short label")
                 .setLongLabel("long label")
@@ -96,78 +86,22 @@
 
         verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
         List<Indexable> allValues = indexableCaptor.getAllValues();
-        Indexable expected = new Indexable.Builder()
-                .setName("short label")
+        Indexable expected = new ShortcutBuilder()
                 .setId("publicIntent")
+                .setShortcutLabel("short label")
+                .setShortcutDescription("long label")
                 .setUrl(ShortcutUtils.getIndexableUrl(mContext, "publicIntent"))
-                .put(SHORTCUT_LABEL_KEY, "short label")
-                .put(SHORTCUT_DESCRIPTION_KEY, "long label")
-                .put(SHORTCUT_URL_KEY, ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                        null))
-                .setImage("content://abc")
+                .setShortcutUrl(ShortcutUtils.getIndexableShortcutUrl(mContext, intent, null))
                 .build();
         assertThat(allValues).containsExactly(expected);
     }
 
     @Test
     @SmallTest
-    public void onShortcutAdded_updateSuccess_reportUsage() throws Exception {
-        ArgumentCaptor<Action> actionCaptor = ArgumentCaptor.forClass(Action.class);
-        Task<Void> result = Tasks.forResult(null);
-        when(mFirebaseAppIndex.update(any())).thenReturn(result);
-
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
-        ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
-                .setShortLabel("short label")
-                .setLongLabel("long label")
-                .setIntent(intent)
-                .setIcon(IconCompat.createWithContentUri("content://abc"))
-                .build();
-
-        mShortcutInfoChangeListener.onShortcutAdded(Collections.singletonList(shortcut));
-
-        // Sleep to make sure the asynchronous call finishes. Since the method is mocked this
-        // should be really quick.
-        Thread.sleep(100);
-        verify(mFirebaseUserActions).end(actionCaptor.capture());
-
-        Action action = actionCaptor.getValue();
-        Action expectedAction = new Action.Builder(Action.Builder.VIEW_ACTION)
-                .setObject("", ShortcutUtils.getIndexableUrl(mContext, "publicIntent"))
-                .setMetadata(new Action.Metadata.Builder().setUpload(false))
-                .build();
-        assertThat(action.toString()).isEqualTo(expectedAction.toString());
-    }
-
-    @Test
-    @SmallTest
-    public void onShortcutAdded_updateError_doNotReportUsage() throws Exception {
-        when(mFirebaseAppIndex.update(any()))
-                .thenReturn(Tasks.forException(new RuntimeException()));
-
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
-        ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
-                .setShortLabel("short label")
-                .setLongLabel("long label")
-                .setIntent(intent)
-                .setIcon(IconCompat.createWithContentUri("content://abc"))
-                .build();
-
-        mShortcutInfoChangeListener.onShortcutAdded(Collections.singletonList(shortcut));
-
-        // Sleep to make sure the asynchronous call finishes. Since the method is mocked this
-        // should be really quick.
-        Thread.sleep(100);
-        verify(mFirebaseUserActions, never()).end(any());
-    }
-
-    @Test
-    @SmallTest
     public void onShortcutUpdated_withCapabilityBinding_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
 
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
+        Intent intent = Intent.parseUri("app://shortcut", 0);
         ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
                 .setShortLabel("short label")
                 .setLongLabel("long label")
@@ -182,38 +116,40 @@
 
         verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
         List<Indexable> allValues = indexableCaptor.getAllValues();
-        Indexable.Builder expectedBuilder = new Indexable.Builder()
-                .setName("short label")
+        ShortcutBuilder expectedBuilder = new ShortcutBuilder()
                 .setId("publicIntent")
+                .setShortcutLabel("short label")
+                .setShortcutDescription("long label")
                 .setUrl(ShortcutUtils.getIndexableUrl(mContext, "publicIntent"))
-                .put(SHORTCUT_LABEL_KEY, "short label")
-                .put(SHORTCUT_DESCRIPTION_KEY, "long label")
-                .put(SHORTCUT_URL_KEY, ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                        null));
-        // The order of isPartOf field matters during comparison. However since the order is not
+                .setShortcutUrl(ShortcutUtils.getIndexableShortcutUrl(mContext, intent, null));
+        // The order of capability field matters during comparison. However since the order is not
         // deterministic because the data is stored in maps and sets in ShortcutInfoCompat, we
         // check for all possible orderings to make the test more reliable.
         Indexable expected1 = expectedBuilder
-                .setIsPartOf(
-                        new Indexable.Builder()
-                                .setId("actions.intent.STOP_EXERCISE/exercise.name")
-                                .setName("stop running")
-                                .setAlternateName("stop jogging"),
-                        new Indexable.Builder()
-                                .setId("actions.intent.START_EXERCISE/exercise.name")
-                                .setName("start running")
-                                .setAlternateName("start jogging"))
+                .setCapability(
+                        new CapabilityBuilder()
+                                .setName("actions.intent.STOP_EXERCISE")
+                                .setParameter(new ParameterBuilder()
+                                        .setName("exercise.name")
+                                        .setValue("stop running", "stop jogging")),
+                        new CapabilityBuilder()
+                                .setName("actions.intent.START_EXERCISE")
+                                .setParameter(new ParameterBuilder()
+                                        .setName("exercise.name")
+                                        .setValue("start running", "start jogging")))
                 .build();
         Indexable expected2 = expectedBuilder
-                .setIsPartOf(
-                        new Indexable.Builder()
-                                .setId("actions.intent.START_EXERCISE/exercise.name")
-                                .setName("start running")
-                                .setAlternateName("start jogging"),
-                        new Indexable.Builder()
-                                .setId("actions.intent.STOP_EXERCISE/exercise.name")
-                                .setName("stop running")
-                                .setAlternateName("stop jogging"))
+                .setCapability(
+                        new CapabilityBuilder()
+                                .setName("actions.intent.START_EXERCISE")
+                                .setParameter(new ParameterBuilder()
+                                        .setName("exercise.name")
+                                        .setValue("start running", "start jogging")),
+                        new CapabilityBuilder()
+                                .setName("actions.intent.STOP_EXERCISE")
+                                .setParameter(new ParameterBuilder()
+                                        .setName("exercise.name")
+                                        .setValue("stop running", "stop jogging")))
                 .build();
         assertThat(allValues).hasSize(1);
         assertThat(allValues).containsAnyOf(expected1, expected2);
@@ -223,9 +159,8 @@
     @SmallTest
     public void onShortcutUpdated_withCapabilityBindingNoParams_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
 
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
+        Intent intent = Intent.parseUri("app://shortcut", 0);
         ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "publicIntent")
                 .setShortLabel("short label")
                 .setLongLabel("long label")
@@ -237,15 +172,13 @@
 
         verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
         List<Indexable> allValues = indexableCaptor.getAllValues();
-        Indexable expected = new Indexable.Builder()
-                .setName("short label")
+        Indexable expected = new ShortcutBuilder()
                 .setId("publicIntent")
+                .setShortcutLabel("short label")
+                .setShortcutDescription("long label")
                 .setUrl(ShortcutUtils.getIndexableUrl(mContext, "publicIntent"))
-                .put(SHORTCUT_LABEL_KEY, "short label")
-                .put(SHORTCUT_DESCRIPTION_KEY, "long label")
-                .put(SHORTCUT_URL_KEY, ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                        null))
-                .setIsPartOf(new Indexable.Builder().setId("actions.intent.TWEET"))
+                .setShortcutUrl(ShortcutUtils.getIndexableShortcutUrl(mContext, intent, null))
+                .setCapability(new CapabilityBuilder().setName("actions.intent.TWEET"))
                 .build();
         assertThat(allValues).containsExactly(expected);
     }
@@ -254,7 +187,6 @@
     @SmallTest
     public void onShortcutUpdated_privateIntent_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
 
         String privateIntentUri = "#Intent;component=androidx.core.google.shortcuts.test/androidx"
                 + ".core.google.shortcuts.TrampolineActivity;end";
@@ -269,13 +201,12 @@
 
         verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
         List<Indexable> allValues = indexableCaptor.getAllValues();
-        Indexable expected = new Indexable.Builder()
+        Indexable expected = new ShortcutBuilder()
                 .setName("short label")
-                .setUrl(ShortcutUtils.getIndexableUrl(mContext, "privateIntent"))
                 .setId("privateIntent")
-                .put("shortcutLabel", "short label")
-                .put("shortcutUrl", ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                        null))
+                .setShortcutLabel("short label")
+                .setUrl(ShortcutUtils.getIndexableUrl(mContext, "privateIntent"))
+                .setShortcutUrl(ShortcutUtils.getIndexableShortcutUrl(mContext, intent, null))
                 .build();
         assertThat(allValues).containsExactly(expected);
     }
@@ -284,9 +215,8 @@
     @SmallTest
     public void onShortcutAdded_savesToAppIndex() throws Exception {
         ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
 
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
+        Intent intent = Intent.parseUri("app://shortcut", 0);
         ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "intent")
                 .setShortLabel("short label")
                 .setLongLabel("long label")
@@ -298,56 +228,18 @@
 
         verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
         List<Indexable> allValues = indexableCaptor.getAllValues();
-        Indexable expected = new Indexable.Builder()
+        Indexable expected = new ShortcutBuilder()
                 .setName("short label")
                 .setId("intent")
+                .setShortcutLabel("short label")
+                .setDescription("long label")
+                .setShortcutDescription("long label")
                 .setUrl(ShortcutUtils.getIndexableUrl(mContext, "intent"))
-                .put(SHORTCUT_LABEL_KEY, "short label")
-                .put(SHORTCUT_DESCRIPTION_KEY, "long label")
-                .put(SHORTCUT_URL_KEY, ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                        null))
-                .setImage("content://abc")
+                .setShortcutUrl(ShortcutUtils.getIndexableShortcutUrl(mContext, intent, null))
                 .build();
         assertThat(allValues).containsExactly(expected);
     }
 
-    @SmallTest
-    @Test
-    public void onShortcutAdded_withMacSignature_canVerifySignature() throws Exception {
-        ArgumentCaptor<Indexable> indexableCaptor = ArgumentCaptor.forClass(Indexable.class);
-        when(mFirebaseAppIndex.update(any())).thenReturn(Tasks.forResult(null));
-
-        KeysetHandle keysetHandle = ShortcutUtils.getOrCreateShortcutKeysetHandle(mContext);
-        // Make sure keyset can be created.
-        assertThat(keysetHandle).isNotNull();
-
-        mShortcutInfoChangeListener = new ShortcutInfoChangeListenerImpl(
-                mContext, mFirebaseAppIndex, mFirebaseUserActions, keysetHandle);
-
-        Intent intent = Intent.parseUri("http://www.google.com", 0);
-        ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(mContext, "intent")
-                .setShortLabel("short label")
-                .setIntent(intent)
-                .build();
-        mShortcutInfoChangeListener.onShortcutAdded(Collections.singletonList(shortcut));
-
-        verify(mFirebaseAppIndex, only()).update(indexableCaptor.capture());
-        String trampolineIntentString = ShortcutUtils.getIndexableShortcutUrl(mContext, intent,
-                keysetHandle);
-
-        Intent trampolineIntent = Intent.parseUri(trampolineIntentString, 0);
-        // Make sure the trampoline activity is package restricted.
-        assertThat(trampolineIntent.getPackage()).isEqualTo(mContext.getPackageName());
-
-        String tag = trampolineIntent.getStringExtra(SHORTCUT_TAG_KEY);
-        String shortcutUrl = trampolineIntent.getStringExtra(SHORTCUT_URL_KEY);
-        Mac mac = keysetHandle.getPrimitive(Mac.class);
-
-        // Will throw exception if verification fails.
-        mac.verifyMac(Base64.decode(tag, Base64.DEFAULT),
-                shortcutUrl.getBytes(StandardCharsets.UTF_8));
-    }
-
     @Test
     @SmallTest
     public void onShortcutRemoved_removeFromAppIndex() {
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutUtilsTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutUtilsTest.java
index f731f1d..f30f720 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutUtilsTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutUtilsTest.java
@@ -30,6 +30,7 @@
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import com.google.crypto.tink.KeysetHandle;
@@ -38,6 +39,7 @@
 import org.junit.runner.RunWith;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21) // This module should only be called for version 21+.
 public class ShortcutUtilsTest {
     private static final String TEST_PACKAGE = "com.test.package";
 
@@ -65,7 +67,7 @@
 
         String shortcutUrl = ShortcutUtils.getIndexableShortcutUrl(context, intent, null);
 
-        String expectedShortcutUrl = "http://www.google.com";
+        String expectedShortcutUrl = "intent://www.google.com#Intent;scheme=http;end";
         assertThat(shortcutUrl).isEqualTo(expectedShortcutUrl);
     }
 
@@ -84,7 +86,7 @@
         assertThat(trampolineIntent.getPackage()).isEqualTo(context.getPackageName());
         assertThat(trampolineIntent.getAction()).isEqualTo(SHORTCUT_LISTENER_INTENT_FILTER_ACTION);
         assertThat(trampolineIntent.getStringExtra(SHORTCUT_TAG_KEY)).isNotEmpty();
-        String expectedShortcutUrl = "http://www.google.com";
+        String expectedShortcutUrl = "intent://www.google.com#Intent;scheme=http;end";
         assertThat(trampolineIntent.getStringExtra(SHORTCUT_URL_KEY))
                 .isEqualTo(expectedShortcutUrl);
     }
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/TrampolineActivityTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/TrampolineActivityTest.java
index 6a82d85..8705d6f 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/TrampolineActivityTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/TrampolineActivityTest.java
@@ -35,6 +35,7 @@
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.espresso.intent.Intents;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
 import com.google.crypto.tink.KeysetHandle;
@@ -47,6 +48,7 @@
 import java.util.List;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21) // This module should only be called for version 21+.
 public class TrampolineActivityTest {
     private static final String SHORTCUT_LISTENER_INTENT_FILTER_ACTION = "androidx.core.content.pm"
             + ".SHORTCUT_LISTENER";
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/builders/ShortcutBuilderTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/builders/ShortcutBuilderTest.java
new file mode 100644
index 0000000..6b4763f
--- /dev/null
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/builders/ShortcutBuilderTest.java
@@ -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.core.google.shortcuts.builders;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import com.google.firebase.appindexing.Indexable;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21) // This module should only be called for version 21+.
+public class ShortcutBuilderTest {
+
+    @SmallTest
+    @Test
+    public void testBuildShortcut() {
+        Indexable shortcutIndexable = new ShortcutBuilder()
+                .setId("id")
+                .setShortcutLabel("shortcut label")
+                .setShortcutDescription("shortcut description")
+                .setUrl("url")
+                .setShortcutUrl("shortcut url")
+                .build();
+
+        assertThat(shortcutIndexable).isEqualTo(new Indexable.Builder("Shortcut")
+                .setId("id")
+                .setName("shortcut label")
+                .setDescription("shortcut description")
+                .setUrl("url")
+                .put("shortcutLabel", "shortcut label")
+                .put("shortcutDescription", "shortcut description")
+                .put("shortcutUrl", "shortcut url")
+                .build());
+    }
+
+    @SmallTest
+    @Test
+    public void testBuildShortcutWithCapability() throws Exception {
+        Indexable shortcutIndexable = new ShortcutBuilder()
+                .setCapability(
+                        new CapabilityBuilder().setName("capability1"),
+                        new CapabilityBuilder().setName("capability2"))
+                .build();
+
+        assertThat(shortcutIndexable).isEqualTo(new Indexable.Builder("Shortcut")
+                .put("capability",
+                        new Indexable.Builder("Capability").setName("capability1").build(),
+                        new Indexable.Builder("Capability").setName("capability2").build())
+                .build());
+    }
+
+    @SmallTest
+    @Test
+    public void testBuildShortcutWithCapabilityAndParameter() throws Exception {
+        Indexable shortcutIndexable = new ShortcutBuilder()
+                .setCapability(new CapabilityBuilder()
+                        .setName("capability")
+                        .setParameter(
+                                new ParameterBuilder()
+                                        .setName("parameter1")
+                                        .setValue("value1", "value2"),
+                                new ParameterBuilder()
+                                        .setName("parameter2")
+                                        .setValue("value3", "value4")))
+                .build();
+
+        assertThat(shortcutIndexable).isEqualTo(new Indexable.Builder("Shortcut")
+                .put("capability", new Indexable.Builder("Capability")
+                        .setName("capability")
+                        .put("parameter",
+                                new Indexable.Builder("Parameter")
+                                        .setName("parameter1")
+                                        .put("value", "value1", "value2")
+                                        .build(),
+                                new Indexable.Builder("Parameter")
+                                        .setName("parameter2")
+                                        .put("value", "value3", "value4")
+                                        .build())
+                        .build())
+                .build());
+    }
+}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
index 4796e78..88e9a59 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImpl.java
@@ -19,30 +19,29 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 import static androidx.core.google.shortcuts.ShortcutUtils.CAPABILITY_PARAM_SEPARATOR;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_DESCRIPTION_KEY;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_LABEL_KEY;
-import static androidx.core.google.shortcuts.ShortcutUtils.SHORTCUT_URL_KEY;
 
 import android.content.Context;
-import android.util.Log;
+import android.os.Build;
+import android.os.PersistableBundle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.pm.ShortcutInfoChangeListener;
 import androidx.core.content.pm.ShortcutInfoCompat;
-import androidx.core.graphics.drawable.IconCompat;
+import androidx.core.google.shortcuts.builders.CapabilityBuilder;
+import androidx.core.google.shortcuts.builders.ParameterBuilder;
+import androidx.core.google.shortcuts.builders.ShortcutBuilder;
 
 import com.google.crypto.tink.KeysetHandle;
 import com.google.firebase.appindexing.Action;
 import com.google.firebase.appindexing.FirebaseAppIndex;
 import com.google.firebase.appindexing.FirebaseUserActions;
 import com.google.firebase.appindexing.Indexable;
-import com.google.firebase.appindexing.builders.IndexableBuilder;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -52,8 +51,6 @@
  */
 @RestrictTo(LIBRARY_GROUP)
 public class ShortcutInfoChangeListenerImpl extends ShortcutInfoChangeListener {
-    private static final String TAG = "ShortcutInfoChangeListe";
-
     private final Context mContext;
     private final FirebaseAppIndex mFirebaseAppIndex;
     private final FirebaseUserActions mFirebaseUserActions;
@@ -88,7 +85,7 @@
      */
     @Override
     public void onShortcutAdded(@NonNull List<ShortcutInfoCompat> shortcuts) {
-        updateAndReportUsage(shortcuts);
+        mFirebaseAppIndex.update(buildIndexables(shortcuts));
     }
 
     /**
@@ -98,7 +95,7 @@
      */
     @Override
     public void onShortcutUpdated(@NonNull List<ShortcutInfoCompat> shortcuts) {
-        updateAndReportUsage(shortcuts);
+        mFirebaseAppIndex.update(buildIndexables(shortcuts));
     }
 
     /**
@@ -139,25 +136,6 @@
         mFirebaseAppIndex.removeAll();
     }
 
-    private void updateAndReportUsage(@NonNull List<ShortcutInfoCompat> shortcuts) {
-        mFirebaseAppIndex.update(buildIndexables(shortcuts))
-                .continueWithTask((task) -> {
-                    if (task.isSuccessful()) {
-                        reportUsages(shortcuts);
-                    } else {
-                        Log.e(TAG, "failed to update shortcuts to firebase", task.getException());
-                    }
-                    return null;
-                });
-    }
-
-    private void reportUsages(@NonNull List<ShortcutInfoCompat> shortcuts) {
-        for (ShortcutInfoCompat shortcut : shortcuts) {
-            String url = ShortcutUtils.getIndexableUrl(mContext, shortcut.getId());
-            mFirebaseUserActions.end(buildAction(url));
-        }
-    }
-
     @NonNull
     private Action buildAction(@NonNull String url) {
         // The reported action isn't uploaded to the server.
@@ -183,69 +161,79 @@
         String url = ShortcutUtils.getIndexableUrl(mContext, shortcut.getId());
         String shortcutUrl = ShortcutUtils.getIndexableShortcutUrl(mContext, shortcut.getIntent(),
                 mKeysetHandle);
+        String name = shortcut.getShortLabel().toString();
 
-        Indexable.Builder builder = new Indexable.Builder()
+        ShortcutBuilder shortcutBuilder = new ShortcutBuilder()
                 .setId(shortcut.getId())
                 .setUrl(url)
-                .setName(shortcut.getShortLabel().toString())
-                .put(SHORTCUT_URL_KEY, shortcutUrl)
-                .put(SHORTCUT_LABEL_KEY, shortcut.getShortLabel().toString());
-
+                .setShortcutLabel(name)
+                .setShortcutUrl(shortcutUrl);
         if (shortcut.getLongLabel() != null) {
-            builder.put(SHORTCUT_DESCRIPTION_KEY, shortcut.getLongLabel().toString());
-        }
-
-        if (shortcut.getIcon() != null && shortcut.getIcon().getType() == IconCompat.TYPE_URI) {
-            builder.setImage(shortcut.getIcon().getUri().toString());
+            shortcutBuilder.setShortcutDescription(shortcut.getLongLabel().toString());
         }
 
         // Add capability binding
-        if (shortcut.getCategories() != null) {
-            List<Indexable.Builder> partOfList = new ArrayList<>();
-            for (String capability : shortcut.getCategories()) {
-                if (!ShortcutUtils.isAppActionCapability(capability)) {
-                    continue;
-                }
-
-                if (shortcut.getExtras() == null
-                        || shortcut.getExtras().getStringArray(capability) == null
-                        || shortcut.getExtras().getStringArray(capability).length == 0) {
-                    // Shortcut has a capability binding without any parameter binding.
-                    partOfList.add(buildPartOfIndexable(capability, null));
-                } else {
-                    String[] params = shortcut.getExtras().getStringArray(capability);
-                    for (String param : params) {
-                        String capabilityParam = capability + CAPABILITY_PARAM_SEPARATOR + param;
-                        partOfList.add(buildPartOfIndexable(capabilityParam,
-                                shortcut.getExtras().getStringArray(capabilityParam)));
+        if (Build.VERSION.SDK_INT >= 21) {
+            if (shortcut.getCategories() != null) {
+                List<CapabilityBuilder> capabilityList = new ArrayList<>();
+                for (String capability : shortcut.getCategories()) {
+                    if (!ShortcutUtils.isAppActionCapability(capability)) {
+                        continue;
                     }
-                }
-            }
 
-            if (!partOfList.isEmpty()) {
-                builder.setIsPartOf(partOfList.toArray(new IndexableBuilder[0]));
+                    capabilityList.add(Api21Impl.buildCapability(capability, shortcut.getExtras()));
+                }
+
+                if (!capabilityList.isEmpty()) {
+                    shortcutBuilder
+                            .setCapability(capabilityList.toArray(new CapabilityBuilder[0]));
+                }
             }
         }
 
         // By default, the indexable will be saved only on-device.
-        return builder.build();
+        return shortcutBuilder.build();
     }
 
-    @NonNull
-    private Indexable.Builder buildPartOfIndexable(@NonNull String capabilityParam,
-            @Nullable String[] values) {
-        Indexable.Builder partOfBuilder = new Indexable.Builder()
-                .setId(capabilityParam);
-        if (values == null) {
-            return partOfBuilder;
+    @RequiresApi(21)
+    private static class Api21Impl {
+        @NonNull
+        static CapabilityBuilder buildCapability(@NonNull String capability,
+                @Nullable PersistableBundle shortcutInfoExtras) {
+            CapabilityBuilder capabilityBuilder = new CapabilityBuilder()
+                    .setName(capability);
+            if (shortcutInfoExtras == null) {
+                return capabilityBuilder;
+            }
+
+            String[] params = shortcutInfoExtras.getStringArray(capability);
+            if (params == null) {
+                return capabilityBuilder;
+            }
+
+            List<ParameterBuilder> parameterBuilders = new ArrayList<>();
+            for (String param : params) {
+                ParameterBuilder parameterBuilder =
+                        new ParameterBuilder()
+                                .setName(param);
+                String capabilityParamKey = capability + CAPABILITY_PARAM_SEPARATOR + param;
+                String[] values = shortcutInfoExtras.getStringArray(capabilityParamKey);
+                if (values == null || values.length == 0) {
+                    // ignore this parameter since no values were given
+                    continue;
+                }
+
+                parameterBuilder.setValue(values);
+                parameterBuilders.add(parameterBuilder);
+            }
+
+            if (parameterBuilders.size() > 0) {
+                capabilityBuilder
+                        .setParameter(parameterBuilders.toArray(new ParameterBuilder[0]));
+            }
+            return capabilityBuilder;
         }
 
-        if (values.length > 0) {
-            partOfBuilder.setName(values[0]);
-        }
-        if (values.length > 1) {
-            partOfBuilder.setAlternateName(Arrays.copyOfRange(values, 1, values.length));
-        }
-        return partOfBuilder;
+        private Api21Impl() {}
     }
 }
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutUtils.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutUtils.java
index 5b11811..7f457d9 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutUtils.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/ShortcutUtils.java
@@ -34,20 +34,18 @@
 import com.google.crypto.tink.mac.MacConfig;
 
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
+import java.nio.charset.Charset;
 import java.security.GeneralSecurityException;
 
 /**
- * Utility methods and constants used by the google shortcuts library.
+ * Utility methods and constants used by the Google shortcuts library.
  *
  * @hide
  */
 @RestrictTo(LIBRARY)
 class ShortcutUtils {
-    public static final String SHORTCUT_LABEL_KEY = "shortcutLabel";
-    public static final String SHORTCUT_DESCRIPTION_KEY = "shortcutDescription";
-    public static final String SHORTCUT_URL_KEY = "shortcutUrl";
     public static final String ID_KEY = "id";
+    public static final String SHORTCUT_URL_KEY = "shortcutUrl";
     public static final String CAPABILITY_PARAM_SEPARATOR = "/";
     public static final String SHORTCUT_TAG_KEY = "shortcutTag";
     public static final String SHORTCUT_LISTENER_INTENT_FILTER_ACTION = "androidx.core.content.pm"
@@ -88,7 +86,7 @@
      */
     public static String getIndexableShortcutUrl(@NonNull Context context,
             @NonNull Intent shortcutIntent, @Nullable KeysetHandle keysetHandle) {
-        String shortcutUrl = shortcutIntent.toUri(0);
+        String shortcutUrl = shortcutIntent.toUri(Intent.URI_INTENT_SCHEME);
         if (keysetHandle == null) {
             // If keyset handle is null, then create the shortcut without using the Trampoline
             // Activity. This means that only shortcuts with exported intent will work. Those with
@@ -104,7 +102,7 @@
             // 2. only the shortcut that was indexed using this library can be opened. You cannot
             // use the Trampoline Activity to open arbitrary shortcuts.
             Mac mac = keysetHandle.getPrimitive(Mac.class);
-            byte[] tag = mac.computeMac(shortcutUrl.getBytes(StandardCharsets.UTF_8));
+            byte[] tag = mac.computeMac(shortcutUrl.getBytes(Charset.forName("UTF-8")));
             String tagString = Base64.encodeToString(tag, Base64.DEFAULT);
 
             Intent trampolineIntent = new Intent(context, TrampolineActivity.class);
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/TrampolineActivity.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/TrampolineActivity.java
index 3dfe866..adf51d0 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/TrampolineActivity.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/TrampolineActivity.java
@@ -33,7 +33,7 @@
 import com.google.crypto.tink.Mac;
 
 import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
+import java.nio.charset.Charset;
 import java.security.GeneralSecurityException;
 
 
@@ -67,9 +67,9 @@
                     Mac mac = sKeysetHandle.getPrimitive(Mac.class);
                     // Will throw GeneralSecurityException when verifyMac fails.
                     mac.verifyMac(Base64.decode(tag, Base64.DEFAULT),
-                            shortcutUrl.getBytes(StandardCharsets.UTF_8));
+                            shortcutUrl.getBytes(Charset.forName("UTF-8")));
 
-                    Intent shortcutIntent = Intent.parseUri(shortcutUrl, 0);
+                    Intent shortcutIntent = Intent.parseUri(shortcutUrl, Intent.URI_INTENT_SCHEME);
                     startActivity(shortcutIntent);
                 } catch (GeneralSecurityException | URISyntaxException e) {
                     Log.w(TAG, "failed to open shortcut url", e);
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/CapabilityBuilder.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/CapabilityBuilder.java
new file mode 100644
index 0000000..d18753f
--- /dev/null
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/CapabilityBuilder.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.core.google.shortcuts.builders;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.core.google.shortcuts.builders.Constants.CAPABILITY_PARAMETER_KEY;
+import static androidx.core.google.shortcuts.builders.Constants.CAPABILITY_TYPE;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import com.google.firebase.appindexing.builders.IndexableBuilder;
+
+/**
+ * Builder for the Capability section in the Shortcut Corpus.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class CapabilityBuilder extends IndexableBuilder<CapabilityBuilder> {
+    public CapabilityBuilder() {
+        super(CAPABILITY_TYPE);
+    }
+
+    /** Sets one or more parameters for the given capability. */
+    @NonNull
+    public CapabilityBuilder setParameter(
+            @NonNull ParameterBuilder... parameter) {
+        return put(CAPABILITY_PARAMETER_KEY, parameter);
+    }
+}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/Constants.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/Constants.java
new file mode 100644
index 0000000..35f8981
--- /dev/null
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/Constants.java
@@ -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.
+ */
+
+package androidx.core.google.shortcuts.builders;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import androidx.annotation.RestrictTo;
+
+/**
+ * Constants for the Shortcut Corpus.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class Constants {
+    public static final String SHORTCUT_TYPE = "Shortcut";
+    public static final String CAPABILITY_TYPE = "Capability";
+    public static final String PARAMETER_TYPE = "Parameter";
+
+    public static final String SHORTCUT_LABEL_KEY = "shortcutLabel";
+    public static final String SHORTCUT_DESCRIPTION_KEY = "shortcutDescription";
+    public static final String SHORTCUT_URL_KEY = "shortcutUrl";
+    public static final String SHORTCUT_CAPABILITY_KEY = "capability";
+
+    public static final String CAPABILITY_PARAMETER_KEY = "parameter";
+
+    public static final String PARAMETER_VALUE_KEY = "value";
+
+    private Constants() {}
+}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ParameterBuilder.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ParameterBuilder.java
new file mode 100644
index 0000000..4ea41e04
--- /dev/null
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ParameterBuilder.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.core.google.shortcuts.builders;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.core.google.shortcuts.builders.Constants.PARAMETER_TYPE;
+import static androidx.core.google.shortcuts.builders.Constants.PARAMETER_VALUE_KEY;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import com.google.firebase.appindexing.builders.IndexableBuilder;
+
+/**
+ * Builder for the Parameter section in the Shortcut Corpus.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ParameterBuilder
+        extends IndexableBuilder<ParameterBuilder> {
+    public ParameterBuilder() {
+        super(PARAMETER_TYPE);
+    }
+
+    /** Sets one or more values for given parameter. */
+    @NonNull
+    public ParameterBuilder setValue(@NonNull String... value) {
+        return put(PARAMETER_VALUE_KEY, value);
+    }
+}
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ShortcutBuilder.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ShortcutBuilder.java
new file mode 100644
index 0000000..37758b4
--- /dev/null
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/builders/ShortcutBuilder.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.core.google.shortcuts.builders;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.core.google.shortcuts.builders.Constants.SHORTCUT_CAPABILITY_KEY;
+import static androidx.core.google.shortcuts.builders.Constants.SHORTCUT_DESCRIPTION_KEY;
+import static androidx.core.google.shortcuts.builders.Constants.SHORTCUT_LABEL_KEY;
+import static androidx.core.google.shortcuts.builders.Constants.SHORTCUT_TYPE;
+import static androidx.core.google.shortcuts.builders.Constants.SHORTCUT_URL_KEY;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import com.google.firebase.appindexing.builders.IndexableBuilder;
+
+/**
+ * Builder for the Shortcut Corpus.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public class ShortcutBuilder extends IndexableBuilder<ShortcutBuilder> {
+    public ShortcutBuilder() {
+        super(SHORTCUT_TYPE);
+    }
+
+    /** Sets the label for the shortcut. */
+    @NonNull
+    public ShortcutBuilder setShortcutLabel(@NonNull String shortcutLabel) {
+        setName(shortcutLabel);
+        return put(SHORTCUT_LABEL_KEY, shortcutLabel);
+    }
+
+    /** Sets the description for the shortcut. */
+    @NonNull
+    public ShortcutBuilder setShortcutDescription(@NonNull String shortcutDescription) {
+        setDescription(shortcutDescription);
+        return put(SHORTCUT_DESCRIPTION_KEY, shortcutDescription);
+    }
+
+    /** Sets the {@link android.content.Intent} url for the shortcut. */
+    @NonNull
+    public ShortcutBuilder setShortcutUrl(@NonNull String shortcutUrl) {
+        return put(SHORTCUT_URL_KEY, shortcutUrl);
+    }
+
+    /** Sets one or more capabilities for the shortcut. */
+    @NonNull
+    public ShortcutBuilder setCapability(@NonNull CapabilityBuilder... capability) {
+        return put(SHORTCUT_CAPABILITY_KEY, capability);
+    }
+}
diff --git a/core/core-ktx/api/1.6.0-beta01.txt b/core/core-ktx/api/1.6.0-beta01.txt
new file mode 100644
index 0000000..ea0fa5f
--- /dev/null
+++ b/core/core-ktx/api/1.6.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(int);
+    method @RequiresApi(26) public static inline float getAlpha(long);
+    method public static inline int getBlue(int);
+    method @RequiresApi(26) public static inline float getBlue(long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(long);
+    method public static inline int getGreen(int);
+    method @RequiresApi(26) public static inline float getGreen(long);
+    method @RequiresApi(26) public static inline float getLuminance(int);
+    method @RequiresApi(26) public static inline float getLuminance(long);
+    method public static inline int getRed(int);
+    method @RequiresApi(26) public static inline float getRed(long);
+    method @RequiresApi(26) public static inline boolean isSrgb(long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_1.6.0-beta01.txt b/core/core-ktx/api/public_plus_experimental_1.6.0-beta01.txt
new file mode 100644
index 0000000..ea0fa5f
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.6.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(int);
+    method @RequiresApi(26) public static inline float getAlpha(long);
+    method public static inline int getBlue(int);
+    method @RequiresApi(26) public static inline float getBlue(long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(long);
+    method public static inline int getGreen(int);
+    method @RequiresApi(26) public static inline float getGreen(long);
+    method @RequiresApi(26) public static inline float getLuminance(int);
+    method @RequiresApi(26) public static inline float getLuminance(long);
+    method public static inline int getRed(int);
+    method @RequiresApi(26) public static inline float getRed(long);
+    method @RequiresApi(26) public static inline boolean isSrgb(long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/api/res-1.6.0-beta01.txt b/core/core-ktx/api/res-1.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/core/core-ktx/api/res-1.6.0-beta01.txt
diff --git a/core/core-ktx/api/restricted_1.6.0-beta01.txt b/core/core-ktx/api/restricted_1.6.0-beta01.txt
new file mode 100644
index 0000000..ea0fa5f
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.6.0-beta01.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+  public final class AnimatorKt {
+    method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+    method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+    method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentValuesKt {
+    method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ContextKt {
+    method public static inline <reified T> T! getSystemService(android.content.Context);
+    method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+    method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+  }
+
+  public final class SharedPreferencesKt {
+    method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class TypedArrayKt {
+    method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+    method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorKt {
+    method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+    method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+    method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+    method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+    method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+    method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+    method public static inline String? getStringOrNull(android.database.Cursor, int index);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteDatabaseKt {
+    method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapKt {
+    method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+    method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+    method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+    method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+    method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+    method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+  }
+
+  public final class CanvasKt {
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class ColorKt {
+    method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+    method public static inline operator int component1(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+    method public static inline operator int component2(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+    method public static inline operator int component3(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+    method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+    method public static inline operator int component4(@ColorInt int);
+    method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+    method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+    method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+    method public static inline int getAlpha(int);
+    method @RequiresApi(26) public static inline float getAlpha(long);
+    method public static inline int getBlue(int);
+    method @RequiresApi(26) public static inline float getBlue(long);
+    method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(long);
+    method public static inline int getGreen(int);
+    method @RequiresApi(26) public static inline float getGreen(long);
+    method @RequiresApi(26) public static inline float getLuminance(int);
+    method @RequiresApi(26) public static inline float getLuminance(long);
+    method public static inline int getRed(int);
+    method @RequiresApi(26) public static inline float getRed(long);
+    method @RequiresApi(26) public static inline boolean isSrgb(long);
+    method @RequiresApi(26) public static inline boolean isWideGamut(long);
+    method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+    method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+    method @ColorInt public static inline int toColorInt(String);
+    method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+  }
+
+  public final class ImageDecoderKt {
+    method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+    method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+  }
+
+  public final class MatrixKt {
+    method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+    method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+    method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+    method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+    method public static inline float[] values(android.graphics.Matrix);
+  }
+
+  public final class PaintKt {
+    method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+  }
+
+  public final class PathKt {
+    method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+    method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+    method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+  }
+
+  public final class PictureKt {
+    method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class PointKt {
+    method public static inline operator int component1(android.graphics.Point);
+    method public static inline operator float component1(android.graphics.PointF);
+    method public static inline operator int component2(android.graphics.Point);
+    method public static inline operator float component2(android.graphics.PointF);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+    method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+    method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+    method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+    method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+    method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+  }
+
+  public final class PorterDuffKt {
+    method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+    method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class RectKt {
+    method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator int component1(android.graphics.Rect);
+    method public static inline operator float component1(android.graphics.RectF);
+    method public static inline operator int component2(android.graphics.Rect);
+    method public static inline operator float component2(android.graphics.RectF);
+    method public static inline operator int component3(android.graphics.Rect);
+    method public static inline operator float component3(android.graphics.RectF);
+    method public static inline operator int component4(android.graphics.Rect);
+    method public static inline operator float component4(android.graphics.RectF);
+    method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+    method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+    method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+    method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+    method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+    method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+    method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+    method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+    method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+    method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+    method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+    method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+  }
+
+  public final class RegionKt {
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+    method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+    method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region not(android.graphics.Region);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+    method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+    method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+    method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+  }
+
+  public final class ShaderKt {
+    method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class BitmapDrawableKt {
+    method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+  }
+
+  public final class ColorDrawableKt {
+    method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+    method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+  }
+
+  public final class DrawableKt {
+    method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+    method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+  }
+
+  public final class IconKt {
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+    method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+  }
+
+}
+
+package androidx.core.location {
+
+  public final class LocationKt {
+    method public static inline operator double component1(android.location.Location);
+    method public static inline operator double component2(android.location.Location);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class UriKt {
+    method public static java.io.File toFile(android.net.Uri);
+    method public static inline android.net.Uri toUri(String);
+    method public static inline android.net.Uri toUri(java.io.File);
+  }
+
+}
+
+package androidx.core.os {
+
+  public final class BundleKt {
+    method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class HandlerKt {
+    method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+  }
+
+  public final class PersistableBundleKt {
+    method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class TraceKt {
+    method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class CharSequenceKt {
+    method public static inline boolean isDigitsOnly(CharSequence);
+    method public static inline int trimmedLength(CharSequence);
+  }
+
+  public final class HtmlKt {
+    method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+    method public static inline String toHtml(android.text.Spanned, optional int option);
+  }
+
+  public final class LocaleKt {
+    method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+  }
+
+  public final class SpannableStringBuilderKt {
+    method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+    method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+  }
+
+  public final class SpannableStringKt {
+    method public static inline void clearSpans(android.text.Spannable);
+    method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+    method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+    method public static inline android.text.Spannable toSpannable(CharSequence);
+  }
+
+  public final class SpannedStringKt {
+    method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+    method public static inline android.text.Spanned toSpanned(CharSequence);
+  }
+
+  public final class StringKt {
+    method public static inline String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.transition {
+
+  public final class TransitionKt {
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+    method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+  }
+
+}
+
+package androidx.core.util {
+
+  public final class AtomicFileKt {
+    method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+    method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+    method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+    method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+    method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+  }
+
+  public final class HalfKt {
+    method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+    method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+  }
+
+  public final class LongSparseArrayKt {
+    method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+    method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+    method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+    method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+    method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+    method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+    method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+    method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+  }
+
+  public final class LruCacheKt {
+    method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+  }
+
+  public final class PairKt {
+    method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+    method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+    method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+    method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+  }
+
+  public final class RangeKt {
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+    method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+    method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+    method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+  }
+
+  public final class SizeKt {
+    method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+    method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+    method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+  }
+
+  public final class SparseArrayKt {
+    method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+    method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+    method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+    method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public static inline <T> int getSize(android.util.SparseArray<T>);
+    method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+    method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+    method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+    method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+    method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+    method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+    method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+  }
+
+  public final class SparseBooleanArrayKt {
+    method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+    method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+    method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+    method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+    method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+    method public static inline int getSize(android.util.SparseBooleanArray);
+    method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+    method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+    method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+    method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+    method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+    method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+  }
+
+  public final class SparseIntArrayKt {
+    method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+    method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+    method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+    method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+    method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+    method public static inline int getSize(android.util.SparseIntArray);
+    method public static inline boolean isEmpty(android.util.SparseIntArray);
+    method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+    method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+    method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+    method public static boolean remove(android.util.SparseIntArray, int key, int value);
+    method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+    method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+  }
+
+  public final class SparseLongArrayKt {
+    method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+    method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+    method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+    method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+    method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+    method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+    method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+    method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+    method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+    method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+  }
+
+}
+
+package androidx.core.view {
+
+  public final class MenuKt {
+    method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+    method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+    method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+    method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+    method public static inline int getSize(android.view.Menu);
+    method public static inline boolean isEmpty(android.view.Menu);
+    method public static inline boolean isNotEmpty(android.view.Menu);
+    method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+    method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+  }
+
+  public final class ViewGroupKt {
+    method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+    method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+    method public static operator android.view.View get(android.view.ViewGroup, int index);
+    method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+    method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+    method public static inline int getSize(android.view.ViewGroup);
+    method public static inline boolean isEmpty(android.view.ViewGroup);
+    method public static inline boolean isNotEmpty(android.view.ViewGroup);
+    method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+    method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+    method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+    method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+  public final class ViewKt {
+    method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+    method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+    method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+    method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+    method public static inline int getMarginBottom(android.view.View);
+    method public static inline int getMarginEnd(android.view.View);
+    method public static inline int getMarginLeft(android.view.View);
+    method public static inline int getMarginRight(android.view.View);
+    method public static inline int getMarginStart(android.view.View);
+    method public static inline int getMarginTop(android.view.View);
+    method public static inline boolean isGone(android.view.View);
+    method public static inline boolean isInvisible(android.view.View);
+    method public static inline boolean isVisible(android.view.View);
+    method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+    method public static inline void setGone(android.view.View, boolean value);
+    method public static inline void setInvisible(android.view.View, boolean value);
+    method public static inline void setPadding(android.view.View, @Px int size);
+    method public static inline void setVisible(android.view.View, boolean value);
+    method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+    method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+    method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+    method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public final class TextViewKt {
+    method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+    method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+    method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+  }
+
+}
+
diff --git a/core/core-ktx/lint-baseline.xml b/core/core-ktx/lint-baseline.xml
index 51b9c8b..0a482c4 100644
--- a/core/core-ktx/lint-baseline.xml
+++ b/core/core-ktx/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.animation.AnimatorKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.animation.AnimatorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    addPauseListener(listener)"
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.util.AtomicFileKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val stream = startWrite()"
         errorLine2="                 ~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.util.AtomicFileKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            finishWrite(stream)"
         errorLine2="            ~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.util.AtomicFileKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            failWrite(stream)"
         errorLine2="            ~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.util.AtomicFileKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun AtomicFile.readBytes(): ByteArray = readFully()"
         errorLine2="                                                      ~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.util.AtomicFileKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    return readFully().toString(charset)"
         errorLine2="           ~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.BitmapKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.BitmapKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    colorSpace: ColorSpace = ColorSpace.get(ColorSpace.Named.SRGB)"
         errorLine2="                                        ~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.BitmapKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.BitmapKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    return Bitmap.createBitmap(width, height, config, hasAlpha, colorSpace)"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.os.BundleKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    putBinder(key, value)"
         errorLine2="                    ~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.BundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    putSize(key, value)"
         errorLine2="                    ~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.BundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    putSizeF(key, value)"
         errorLine2="                    ~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Color.component1(): Float = getComponent(0)"
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Color.component2(): Float = getComponent(1)"
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Color.component3(): Float = getComponent(2)"
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Color.component4(): Float = getComponent(3)"
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.luminance(this)"
         errorLine2="                  ~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun @receiver:ColorInt Int.toColor(): Color = Color.valueOf(this)"
         errorLine2="                                                                  ~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun @receiver:ColorInt Int.toColorLong(): Long = Color.pack(this)"
         errorLine2="                                                                     ~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun @receiver:ColorLong Long.component1(): Float = Color.red(this)"
         errorLine2="                                                                                ~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun @receiver:ColorLong Long.component2(): Float = Color.green(this)"
         errorLine2="                                                                                ~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun @receiver:ColorLong Long.component3(): Float = Color.blue(this)"
         errorLine2="                                                                                ~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun @receiver:ColorLong Long.component4(): Float = Color.alpha(this)"
         errorLine2="                                                                                ~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.alpha(this)"
         errorLine2="                  ~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.red(this)"
         errorLine2="                  ~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.green(this)"
         errorLine2="                  ~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.blue(this)"
         errorLine2="                  ~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.luminance(this)"
         errorLine2="                  ~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun @receiver:ColorLong Long.toColor(): Color = Color.valueOf(this)"
         errorLine2="                                                                    ~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun @receiver:ColorLong Long.toColorInt(): Int = Color.toArgb(this)"
         errorLine2="                                                                     ~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.isSrgb(this)"
         errorLine2="                  ~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = Color.isWideGamut(this)"
         errorLine2="                  ~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline val @receiver:ColorLong Long.colorSpace: ColorSpace get() = Color.colorSpace(this)"
         errorLine2="                                                                                ~~~~~~~~~~">
         <location
@@ -354,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, ColorSpace.get(colorSpace))"
         errorLine2="          ~~~~~~~">
         <location
@@ -365,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, ColorSpace.get(colorSpace))"
         errorLine2="                                   ~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, colorSpace)"
         errorLine2="          ~~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, ColorSpace.get(colorSpace))"
         errorLine2="          ~~~~~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, ColorSpace.get(colorSpace))"
         errorLine2="                                   ~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    Color.convert(this, colorSpace)"
         errorLine2="          ~~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    convert(ColorSpace.get(colorSpace))"
         errorLine2="    ~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    convert(ColorSpace.get(colorSpace))"
         errorLine2="                       ~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline infix fun Color.convertTo(colorSpace: ColorSpace): Color = convert(colorSpace)"
         errorLine2="                                                                         ~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.drawable.ColorDrawableKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.ColorDrawableKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun Color.toDrawable(): ColorDrawable = ColorDrawable(toArgb())"
         errorLine2="                                                                    ~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.util.HalfKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun @receiver:HalfFloat Short.toHalf(): Half = Half.valueOf(this)"
         errorLine2="                                                                  ~~~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.util.HalfKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun Float.toHalf(): Half = Half.valueOf(this)"
         errorLine2="                                              ~~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.util.HalfKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun String.toHalf(): Half = Half.valueOf(this)"
         errorLine2="                                               ~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.drawable.IconKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun Bitmap.toAdaptiveIcon(): Icon = Icon.createWithAdaptiveBitmap(this)"
         errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconKt is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun Bitmap.toIcon(): Icon = Icon.createWithBitmap(this)"
         errorLine2="                                               ~~~~~~~~~~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconKt is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun Uri.toIcon(): Icon = Icon.createWithContentUri(this)"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -530,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconKt is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun ByteArray.toIcon(): Icon = Icon.createWithData(this, 0, size)"
         errorLine2="                                                  ~~~~~~~~~~~~~~">
         <location
@@ -541,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.ImageDecoderKt is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.ImageDecoderKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    return ImageDecoder.decodeBitmap(this) { decoder, info, source ->"
         errorLine2="                        ~~~~~~~~~~~~">
         <location
@@ -552,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.ImageDecoderKt is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.ImageDecoderKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    return ImageDecoder.decodeDrawable(this) { decoder, info, source ->"
         errorLine2="                        ~~~~~~~~~~~~~~">
         <location
@@ -563,8 +563,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.LocaleKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.LocaleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get() = TextUtils.getLayoutDirectionFromLocale(this)"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -574,8 +574,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline val &lt;T> LongSparseArray&lt;T>.size: Int get() = size()"
         errorLine2="                                                           ~~~~">
         <location
@@ -585,8 +585,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    indexOfKey(key) >= 0"
         errorLine2="    ~~~~~~~~~~">
         <location
@@ -596,8 +596,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun &lt;T> LongSparseArray&lt;T>.set(key: Long, value: T): Unit = put(key, value)"
         errorLine2="                                                                                   ~~~">
         <location
@@ -607,8 +607,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = LongSparseArray&lt;T>(size() + other.size())"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -618,8 +618,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = LongSparseArray&lt;T>(size() + other.size())"
         errorLine2="                                 ~~~~">
         <location
@@ -629,8 +629,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = LongSparseArray&lt;T>(size() + other.size())"
         errorLine2="                                                ~~~~">
         <location
@@ -640,8 +640,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun &lt;T> LongSparseArray&lt;T>.containsKey(key: Long): Boolean = indexOfKey(key) >= 0"
         errorLine2="                                                                           ~~~~~~~~~~">
         <location
@@ -651,8 +651,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    indexOfValue(value) >= 0"
         errorLine2="    ~~~~~~~~~~~~">
         <location
@@ -662,8 +662,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get(key) ?: defaultValue"
         errorLine2="    ~~~">
         <location
@@ -673,8 +673,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get(key) ?: defaultValue()"
         errorLine2="    ~~~">
         <location
@@ -684,8 +684,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun &lt;T> LongSparseArray&lt;T>.isEmpty(): Boolean = size() == 0"
         errorLine2="                                                              ~~~~">
         <location
@@ -695,8 +695,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun &lt;T> LongSparseArray&lt;T>.isNotEmpty(): Boolean = size() != 0"
         errorLine2="                                                                 ~~~~">
         <location
@@ -706,8 +706,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val index = indexOfKey(key)"
         errorLine2="                ~~~~~~~~~~">
         <location
@@ -717,8 +717,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    if (index >= 0 &amp;&amp; value == valueAt(index)) {"
         errorLine2="                               ~~~~~~~">
         <location
@@ -728,8 +728,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        removeAt(index)"
         errorLine2="        ~~~~~~~~">
         <location
@@ -739,8 +739,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    for (index in 0 until size()) {"
         errorLine2="                          ~~~~">
         <location
@@ -750,8 +750,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        action(keyAt(index), valueAt(index))"
         errorLine2="               ~~~~~">
         <location
@@ -761,8 +761,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.util.LongSparseArrayKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        action(keyAt(index), valueAt(index))"
         errorLine2="                             ~~~~~~~">
         <location
@@ -772,8 +772,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun hasNext() = index &lt; size()"
         errorLine2="                                     ~~~~">
         <location
@@ -783,8 +783,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun nextLong() = keyAt(index++)"
         errorLine2="                              ~~~~~">
         <location
@@ -794,8 +794,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun hasNext() = index &lt; size()"
         errorLine2="                                     ~~~~">
         <location
@@ -805,8 +805,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun next() = valueAt(index++)"
         errorLine2="                          ~~~~~~~">
         <location
@@ -816,8 +816,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.PathKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        op(p, Path.Op.UNION)"
         errorLine2="        ~~">
         <location
@@ -827,8 +827,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.PathKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        op(p, Path.Op.DIFFERENCE)"
         errorLine2="        ~~">
         <location
@@ -838,8 +838,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.PathKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        op(this@and, p, Path.Op.INTERSECT)"
         errorLine2="        ~~">
         <location
@@ -849,8 +849,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.PathKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        op(p, Path.Op.XOR)"
         errorLine2="        ~~">
         <location
@@ -860,8 +860,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="): PersistableBundle = PersistableBundle(pairs.size).apply {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -871,8 +871,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            null -> putString(key, null) // Any nullable type will suffice."
         errorLine2="                    ~~~~~~~~~">
         <location
@@ -882,8 +882,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    putBoolean(key, value)"
         errorLine2="                    ~~~~~~~~~~">
         <location
@@ -893,8 +893,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is Double -> putDouble(key, value)"
         errorLine2="                         ~~~~~~~~~">
         <location
@@ -904,8 +904,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is Int -> putInt(key, value)"
         errorLine2="                      ~~~~~~">
         <location
@@ -915,8 +915,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is Long -> putLong(key, value)"
         errorLine2="                       ~~~~~~~">
         <location
@@ -926,8 +926,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is String -> putString(key, value)"
         errorLine2="                         ~~~~~~~~~">
         <location
@@ -937,8 +937,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    putBooleanArray(key, value)"
         errorLine2="                    ~~~~~~~~~~~~~~~">
         <location
@@ -948,8 +948,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is DoubleArray -> putDoubleArray(key, value)"
         errorLine2="                              ~~~~~~~~~~~~~~">
         <location
@@ -959,8 +959,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is IntArray -> putIntArray(key, value)"
         errorLine2="                           ~~~~~~~~~~~">
         <location
@@ -970,8 +970,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            is LongArray -> putLongArray(key, value)"
         errorLine2="                            ~~~~~~~~~~~~">
         <location
@@ -981,8 +981,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.PersistableBundleKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        putStringArray(key, value as Array&lt;String>)"
         errorLine2="                        ~~~~~~~~~~~~~~">
         <location
@@ -992,8 +992,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.RangeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline infix fun &lt;T : Comparable&lt;T>> T.rangeTo(that: T): Range&lt;T> = Range(this, that)"
         errorLine2="                                                                           ~~~~~~~~~~~~~~~~~">
         <location
@@ -1003,8 +1003,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.RangeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun &lt;T : Comparable&lt;T>> Range&lt;T>.plus(value: T): Range&lt;T> = extend(value)"
         errorLine2="                                                                                   ~~~~~~">
         <location
@@ -1014,8 +1014,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.RangeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    extend(other)"
         errorLine2="    ~~~~~~">
         <location
@@ -1025,8 +1025,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.RangeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    intersect(other)"
         errorLine2="    ~~~~~~~~~">
         <location
@@ -1036,8 +1036,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override val endInclusive get() = upper"
         errorLine2="                                      ~~~~~">
         <location
@@ -1047,8 +1047,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override val start get() = lower"
         errorLine2="                               ~~~~~">
         <location
@@ -1058,8 +1058,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.RangeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public fun &lt;T : Comparable&lt;T>> ClosedRange&lt;T>.toRange(): Range&lt;T> = Range(start, endInclusive)"
         errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1069,8 +1069,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.SizeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Size.component1(): Int = width"
         errorLine2="                                                    ~~~~~">
         <location
@@ -1080,8 +1080,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.SizeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun Size.component2(): Int = height"
         errorLine2="                                                    ~~~~~~">
         <location
@@ -1091,8 +1091,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.SizeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun SizeF.component1(): Float = width"
         errorLine2="                                                       ~~~~~">
         <location
@@ -1102,8 +1102,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.util.SizeKt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun SizeF.component2(): Float = height"
         errorLine2="                                                       ~~~~~~">
         <location
@@ -1113,8 +1113,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline val SparseLongArray.size: Int get() = size()"
         errorLine2="                                                    ~~~~">
         <location
@@ -1124,8 +1124,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun SparseLongArray.contains(key: Int): Boolean = indexOfKey(key) >= 0"
         errorLine2="                                                                         ~~~~~~~~~~">
         <location
@@ -1135,8 +1135,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline operator fun SparseLongArray.set(key: Int, value: Long): Unit = put(key, value)"
         errorLine2="                                                                              ~~~">
         <location
@@ -1146,8 +1146,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = SparseLongArray(size() + other.size())"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1157,8 +1157,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = SparseLongArray(size() + other.size())"
         errorLine2="                              ~~~~">
         <location
@@ -1168,8 +1168,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val new = SparseLongArray(size() + other.size())"
         errorLine2="                                             ~~~~">
         <location
@@ -1179,8 +1179,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun SparseLongArray.containsKey(key: Int): Boolean = indexOfKey(key) >= 0"
         errorLine2="                                                                   ~~~~~~~~~~">
         <location
@@ -1190,8 +1190,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun SparseLongArray.containsValue(value: Long): Boolean = indexOfValue(value) >= 0"
         errorLine2="                                                                        ~~~~~~~~~~~~">
         <location
@@ -1201,8 +1201,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    get(key, defaultValue)"
         errorLine2="    ~~~">
         <location
@@ -1212,8 +1212,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    indexOfKey(key).let { if (it >= 0) valueAt(it) else defaultValue() }"
         errorLine2="    ~~~~~~~~~~">
         <location
@@ -1223,8 +1223,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    indexOfKey(key).let { if (it >= 0) valueAt(it) else defaultValue() }"
         errorLine2="                                       ~~~~~~~">
         <location
@@ -1234,8 +1234,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun SparseLongArray.isEmpty(): Boolean = size() == 0"
         errorLine2="                                                       ~~~~">
         <location
@@ -1245,8 +1245,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="public inline fun SparseLongArray.isNotEmpty(): Boolean = size() != 0"
         errorLine2="                                                          ~~~~">
         <location
@@ -1256,8 +1256,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    val index = indexOfKey(key)"
         errorLine2="                ~~~~~~~~~~">
         <location
@@ -1267,8 +1267,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    if (index >= 0 &amp;&amp; value == valueAt(index)) {"
         errorLine2="                               ~~~~~~~">
         <location
@@ -1278,8 +1278,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        removeAt(index)"
         errorLine2="        ~~~~~~~~">
         <location
@@ -1289,8 +1289,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    for (index in 0 until size()) {"
         errorLine2="                          ~~~~">
         <location
@@ -1300,8 +1300,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        action(keyAt(index), valueAt(index))"
         errorLine2="               ~~~~~">
         <location
@@ -1311,8 +1311,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.util.SparseLongArrayKt is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        action(keyAt(index), valueAt(index))"
         errorLine2="                             ~~~~~~~">
         <location
@@ -1322,8 +1322,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class null is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun hasNext() = index &lt; size()"
         errorLine2="                                     ~~~~">
         <location
@@ -1333,8 +1333,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class null is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun nextInt() = keyAt(index++)"
         errorLine2="                             ~~~~~">
         <location
@@ -1344,8 +1344,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class null is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun hasNext() = index &lt; size()"
         errorLine2="                                     ~~~~">
         <location
@@ -1355,8 +1355,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class null is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    override fun nextLong() = valueAt(index++)"
         errorLine2="                              ~~~~~~~">
         <location
@@ -1366,8 +1366,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.transition.TransitionKt is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.transition.TransitionKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    addListener(listener)"
         errorLine2="    ~~~~~~~~~~~">
         <location
@@ -1377,8 +1377,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.content.res.TypedArrayKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.content.res.TypedArrayKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    return getFont(index)!!"
         errorLine2="           ~~~~~~~">
         <location
@@ -1388,8 +1388,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    @Px start: Int = paddingStart,"
         errorLine2="                     ~~~~~~~~~~~~">
         <location
@@ -1399,8 +1399,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    @Px end: Int = paddingEnd,"
         errorLine2="                   ~~~~~~~~~~">
         <location
@@ -1410,8 +1410,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    setPaddingRelative(start, top, end, bottom)"
         errorLine2="    ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1421,8 +1421,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewKt is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    postOnAnimationDelayed(runnable, delayInMillis)"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1432,8 +1432,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewGroupKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    @Px start: Int = marginStart,"
         errorLine2="                     ~~~~~~~~~~~">
         <location
@@ -1443,8 +1443,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewGroupKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    @Px end: Int = marginEnd,"
         errorLine2="                   ~~~~~~~~~">
         <location
@@ -1454,8 +1454,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewGroupKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    marginStart = start"
         errorLine2="    ~~~~~~~~~~~">
         <location
@@ -1465,8 +1465,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewGroupKt is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="    marginEnd = end"
         errorLine2="    ~~~~~~~~~">
         <location
diff --git a/core/core-ktx/src/androidTest/res/values/strings.xml b/core/core-ktx/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from core/core-ktx/src/androidTest/res/values/strings.xml
rename to core/core-ktx/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/core/core-role/lint-baseline.xml b/core/core-role/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/core/core-role/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/core/core/api/1.6.0-beta01.txt b/core/core/api/1.6.0-beta01.txt
new file mode 100644
index 0000000..2cf275c
--- /dev/null
+++ b/core/core/api/1.6.0-beta01.txt
@@ -0,0 +1,3547 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public void onPostParceling();
+    method public void onPreParceling(boolean);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setMock(android.location.Location, boolean);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static final CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/current.ignore b/core/core/api/current.ignore
deleted file mode 100644
index 15be615..0000000
--- a/core/core/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedClass: androidx.core.os.HandlerExecutor:
-    Removed class androidx.core.os.HandlerExecutor
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 024bf6e..2cf275c 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1704,6 +1704,19 @@
 
 }
 
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
 package androidx.core.telephony.mbms {
 
   public final class MbmsHelper {
@@ -1854,6 +1867,8 @@
     method public static boolean equals(Object?, Object?);
     method public static int hash(java.lang.Object!...);
     method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
     method public static String? toString(Object?, String?);
   }
 
diff --git a/core/core/api/public_plus_experimental_1.6.0-beta01.txt b/core/core/api/public_plus_experimental_1.6.0-beta01.txt
new file mode 100644
index 0000000..3934ab1
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.6.0-beta01.txt
@@ -0,0 +1,3545 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method @Deprecated public android.app.Notification getNotification();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public void addCompatExtras(android.os.Bundle);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification? build();
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method public static int checkCallingPermission(android.content.Context, String, String?);
+    method public static int checkPermission(android.content.Context, String, int, int, String?);
+    method public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+}
+
+package androidx.core.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method public abstract void onFontRetrievalFailed(int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setMock(android.location.Location, boolean);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, int);
+    method public static boolean addLinks(android.widget.TextView, int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(int);
+  }
+
+  public interface NestedScrollingParent {
+    method public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static final CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static boolean startNestedScroll(android.view.View, int, int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(int);
+    method public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method public static int captionBar();
+    method public static int displayCutout();
+    method public static int ime();
+    method public static int mandatorySystemGestures();
+    method public static int navigationBars();
+    method public static int statusBars();
+    method public static int systemBars();
+    method public static int systemGestures();
+    method public static int tappableElement();
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    method public void onClick(android.view.View);
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 7854121..3934ab1 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1702,6 +1702,19 @@
 
 }
 
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
 package androidx.core.telephony.mbms {
 
   public final class MbmsHelper {
@@ -1852,6 +1865,8 @@
     method public static boolean equals(Object?, Object?);
     method public static int hash(java.lang.Object!...);
     method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
     method public static String? toString(Object?, String?);
   }
 
diff --git a/core/core/api/res-1.6.0-beta01.txt b/core/core/api/res-1.6.0-beta01.txt
new file mode 100644
index 0000000..36ad356
--- /dev/null
+++ b/core/core/api/res-1.6.0-beta01.txt
@@ -0,0 +1,20 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr queryPatterns
+attr shortcutMatchRequired
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/res-current.txt b/core/core/api/res-current.txt
index 43cbfa4..36ad356 100644
--- a/core/core/api/res-current.txt
+++ b/core/core/api/res-current.txt
@@ -10,6 +10,8 @@
 attr fontStyle
 attr fontVariationSettings
 attr fontWeight
+attr queryPatterns
+attr shortcutMatchRequired
 attr ttcIndex
 style TextAppearance_Compat_Notification
 style TextAppearance_Compat_Notification_Info
diff --git a/core/core/api/restricted_1.6.0-beta01.txt b/core/core/api/restricted_1.6.0-beta01.txt
new file mode 100644
index 0000000..46113a6
--- /dev/null
+++ b/core/core/api/restricted_1.6.0-beta01.txt
@@ -0,0 +1,4030 @@
+// Signature format: 4.0
+package android.support.v4.os {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+    ctor public ResultReceiver(android.os.Handler!);
+    method public int describeContents();
+    method protected void onReceiveResult(int, android.os.Bundle!);
+    method public void send(int, android.os.Bundle!);
+    method public void writeToParcel(android.os.Parcel!, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+  }
+
+}
+
+package androidx.core.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static String capabilityToString(int);
+    method public static String feedbackTypeToString(int);
+    method public static String? flagToString(int);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package androidx.core.app {
+
+  public class ActivityCompat extends androidx.core.content.ContextCompat {
+    ctor protected ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate! getPermissionCompatDelegate();
+    method public static android.net.Uri? getReferrer(android.app.Activity);
+    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void recreate(android.app.Activity);
+    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public void onRequestPermissionsResult(int, String![], int[]);
+  }
+
+  public static interface ActivityCompat.PermissionCompatDelegate {
+    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+    method public void validateRequestPermissionsRequestCode(int);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect? getLaunchBounds();
+    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+    method public android.os.Bundle? toBundle();
+    method public void update(androidx.core.app.ActivityOptionsCompat);
+    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public final class AlarmManagerCompat {
+    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+  }
+
+  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+    ctor public AppComponentFactory();
+    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+  }
+
+  public class AppLaunchChecker {
+    ctor @Deprecated public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, String, int, String);
+    method public static int noteOpNoThrow(android.content.Context, String, int, String);
+    method public static int noteProxyOp(android.content.Context, String, String);
+    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+    method public static String? permissionToOp(String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_ERRORED = 2; // 0x2
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+    ctor public ComponentActivity();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+    ctor @Deprecated public ComponentActivity.ExtraData();
+  }
+
+  @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+    ctor public CoreComponentFactory();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+    method public Object! getWrapper();
+  }
+
+  public class DialogCompat {
+    method public static android.view.View requireViewById(android.app.Dialog, int);
+  }
+
+  public class FrameMetricsAggregator {
+    ctor public FrameMetricsAggregator();
+    ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+    method public void add(android.app.Activity);
+    method public android.util.SparseIntArray![]? getMetrics();
+    method public android.util.SparseIntArray![]? remove(android.app.Activity);
+    method public android.util.SparseIntArray![]? reset();
+    method public android.util.SparseIntArray![]? stop();
+    field public static final int ANIMATION_DURATION = 256; // 0x100
+    field public static final int ANIMATION_INDEX = 8; // 0x8
+    field public static final int COMMAND_DURATION = 32; // 0x20
+    field public static final int COMMAND_INDEX = 5; // 0x5
+    field public static final int DELAY_DURATION = 128; // 0x80
+    field public static final int DELAY_INDEX = 7; // 0x7
+    field public static final int DRAW_DURATION = 8; // 0x8
+    field public static final int DRAW_INDEX = 3; // 0x3
+    field public static final int EVERY_DURATION = 511; // 0x1ff
+    field public static final int INPUT_DURATION = 2; // 0x2
+    field public static final int INPUT_INDEX = 1; // 0x1
+    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+    field public static final int SWAP_DURATION = 64; // 0x40
+    field public static final int SWAP_INDEX = 6; // 0x6
+    field public static final int SYNC_DURATION = 16; // 0x10
+    field public static final int SYNC_INDEX = 4; // 0x4
+    field public static final int TOTAL_DURATION = 1; // 0x1
+    field public static final int TOTAL_INDEX = 0; // 0x0
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+  }
+
+  public abstract class JobIntentService extends android.app.Service {
+    ctor public JobIntentService();
+    method public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+    method public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+    method public boolean isStopped();
+    method public android.os.IBinder! onBind(android.content.Intent);
+    method protected abstract void onHandleWork(android.content.Intent);
+    method public boolean onStopCurrentWork();
+    method public void setInterruptIfStopped(boolean);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static String? getParentActivityName(android.app.Activity);
+    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+    method public android.app.Notification.Builder! getBuilder();
+  }
+
+  public class NotificationChannelCompat {
+    method public boolean canBubble();
+    method public boolean canBypassDnd();
+    method public boolean canShowBadge();
+    method public android.media.AudioAttributes? getAudioAttributes();
+    method public String? getConversationId();
+    method public String? getDescription();
+    method public String? getGroup();
+    method public String getId();
+    method public int getImportance();
+    method public int getLightColor();
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public int getLockscreenVisibility();
+    method public CharSequence? getName();
+    method public String? getParentChannelId();
+    method public android.net.Uri? getSound();
+    method public long[]? getVibrationPattern();
+    method public boolean isImportantConversation();
+    method public boolean shouldShowLights();
+    method public boolean shouldVibrate();
+    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+  }
+
+  public static class NotificationChannelCompat.Builder {
+    ctor public NotificationChannelCompat.Builder(String, int);
+    method public androidx.core.app.NotificationChannelCompat build();
+    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+  }
+
+  public class NotificationChannelGroupCompat {
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+    method public String? getDescription();
+    method public String getId();
+    method public CharSequence? getName();
+    method public boolean isBlocked();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+  }
+
+  public static class NotificationChannelGroupCompat.Builder {
+    ctor public NotificationChannelGroupCompat.Builder(String);
+    method public androidx.core.app.NotificationChannelGroupCompat build();
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+  }
+
+  public class NotificationCompat {
+    ctor @Deprecated public NotificationCompat();
+    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+    method public static boolean getAutoCancel(android.app.Notification);
+    method public static int getBadgeIconType(android.app.Notification);
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+    method public static String? getCategory(android.app.Notification);
+    method public static String? getChannelId(android.app.Notification);
+    method public static int getColor(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+    method public static android.os.Bundle? getExtras(android.app.Notification);
+    method public static String? getGroup(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification);
+    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+    method public static boolean getOngoing(android.app.Notification);
+    method public static boolean getOnlyAlertOnce(android.app.Notification);
+    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+    method public static android.app.Notification? getPublicVersion(android.app.Notification);
+    method public static CharSequence? getSettingsText(android.app.Notification);
+    method public static String? getShortcutId(android.app.Notification);
+    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+    method public static String? getSortKey(android.app.Notification);
+    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+    method public static long getTimeoutAfter(android.app.Notification);
+    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+    method @androidx.core.app.NotificationCompat.NotificationVisibility public static int getVisibility(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final int BADGE_ICON_LARGE = 2; // 0x2
+    field public static final int BADGE_ICON_NONE = 0; // 0x0
+    field public static final int BADGE_ICON_SMALL = 1; // 0x1
+    field public static final String CATEGORY_ALARM = "alarm";
+    field public static final String CATEGORY_CALL = "call";
+    field public static final String CATEGORY_EMAIL = "email";
+    field public static final String CATEGORY_ERROR = "err";
+    field public static final String CATEGORY_EVENT = "event";
+    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+    field public static final String CATEGORY_MESSAGE = "msg";
+    field public static final String CATEGORY_MISSED_CALL = "missed_call";
+    field public static final String CATEGORY_NAVIGATION = "navigation";
+    field public static final String CATEGORY_PROGRESS = "progress";
+    field public static final String CATEGORY_PROMO = "promo";
+    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final String CATEGORY_REMINDER = "reminder";
+    field public static final String CATEGORY_SERVICE = "service";
+    field public static final String CATEGORY_SOCIAL = "social";
+    field public static final String CATEGORY_STATUS = "status";
+    field public static final String CATEGORY_STOPWATCH = "stopwatch";
+    field public static final String CATEGORY_SYSTEM = "sys";
+    field public static final String CATEGORY_TRANSPORT = "transport";
+    field public static final String CATEGORY_WORKOUT = "workout";
+    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+    field public static final String EXTRA_COLORIZED = "android.colorized";
+    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+    field public static final String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final String EXTRA_MESSAGES = "android.messages";
+    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+    field public static final String EXTRA_PICTURE = "android.picture";
+    field public static final String EXTRA_PROGRESS = "android.progress";
+    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final String EXTRA_SMALL_ICON = "android.icon";
+    field public static final String EXTRA_SUB_TEXT = "android.subText";
+    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final String EXTRA_TEMPLATE = "android.template";
+    field public static final String EXTRA_TEXT = "android.text";
+    field public static final String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final String EXTRA_TITLE = "android.title";
+    field public static final String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_BUBBLE = 4096; // 0x1000
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int GROUP_ALERT_ALL = 0; // 0x0
+    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+    field public static final String GROUP_KEY_SILENT = "silent";
+    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    method public android.app.PendingIntent? getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+    method public android.os.Bundle getExtras();
+    method @Deprecated public int getIcon();
+    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+    method public boolean getShowsUserInterface();
+    method public CharSequence? getTitle();
+    method public boolean isContextual();
+    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+    field public android.app.PendingIntent! actionIntent;
+    field @Deprecated public int icon;
+    field public CharSequence! title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+    method public androidx.core.app.NotificationCompat.Action build();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+    method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Action.Builder fromAndroidAction(android.app.Notification.Action);
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+  }
+
+  public static interface NotificationCompat.Action.Extender {
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+    method @Deprecated public CharSequence? getCancelLabel();
+    method @Deprecated public CharSequence? getConfirmLabel();
+    method public boolean getHintDisplayActionInline();
+    method public boolean getHintLaunchesActivity();
+    method @Deprecated public CharSequence? getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata {
+    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+    method public boolean getAutoExpandBubble();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+    method @DimenRes public int getDesiredHeightResId();
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public android.app.PendingIntent? getIntent();
+    method public String? getShortcutId();
+    method public boolean isNotificationSuppressed();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFlags(int);
+    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+  }
+
+  public static final class NotificationCompat.BubbleMetadata.Builder {
+    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+    ctor public NotificationCompat.Builder(android.content.Context, String);
+    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+    method public android.app.Notification build();
+    method public androidx.core.app.NotificationCompat.Builder clearActions();
+    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+    method public androidx.core.app.NotificationCompat.Builder clearPeople();
+    method public android.widget.RemoteViews? createBigContentView();
+    method public android.widget.RemoteViews? createContentView();
+    method public android.widget.RemoteViews? createHeadsUpContentView();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+    method @ColorInt @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+    method public android.os.Bundle getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+    method @Deprecated public android.app.Notification getNotification();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, @androidx.core.app.NotificationCompat.StreamType int);
+    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+    method public androidx.core.app.NotificationCompat.Builder setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.Person!> mPersonList;
+  }
+
+  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method @ColorInt public int getColor();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+    method @Deprecated public long getLatestTimestamp();
+    method @Deprecated public String![]? getMessages();
+    method @Deprecated public String? getParticipant();
+    method @Deprecated public String![]? getParticipants();
+    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+  }
+
+  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+  }
+
+  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.DecoratedCustomViewStyle();
+  }
+
+  public static interface NotificationCompat.Extender {
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+  }
+
+  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+    method public CharSequence? getConversationTitle();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+    method public androidx.core.app.Person getUser();
+    method @Deprecated public CharSequence? getUserDisplayName();
+    method public boolean isGroupConversation();
+    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+    method public String? getDataMimeType();
+    method public android.net.Uri? getDataUri();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.Person? getPerson();
+    method @Deprecated public CharSequence? getSender();
+    method public CharSequence? getText();
+    method public long getTimestamp();
+    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+  }
+
+  @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+  }
+
+  @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+  }
+
+  public abstract static class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews applyStandardTemplate(boolean, int, boolean);
+    method public android.app.Notification? build();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void clearCompatExtraKeys(android.os.Bundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean displayCustomViewInline();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Style? extractStyleFromNotification(android.app.Notification);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected String? getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle);
+    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+  }
+
+  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+    method public androidx.core.app.NotificationCompat.WearableExtender clone();
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+    method @Deprecated public android.graphics.Bitmap? getBackground();
+    method public String? getBridgeTag();
+    method public int getContentAction();
+    method @Deprecated public int getContentIcon();
+    method @Deprecated public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method @Deprecated public int getCustomContentHeight();
+    method @Deprecated public int getCustomSizePreset();
+    method public String? getDismissalId();
+    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+    method @Deprecated public int getGravity();
+    method @Deprecated public boolean getHintAmbientBigPicture();
+    method @Deprecated public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method @Deprecated public boolean getHintHideIcon();
+    method @Deprecated public int getHintScreenTimeout();
+    method @Deprecated public boolean getHintShowBackgroundOnly();
+    method @Deprecated public java.util.List<android.app.Notification!> getPages();
+    method public boolean getStartScrollBottom();
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(String!, int, String!);
+    method public abstract void cancelAll(String!);
+    method public abstract void notify(String!, int, String!, android.app.Notification!);
+    method public android.os.IBinder! onBind(android.content.Intent!);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(android.app.NotificationChannel);
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public android.app.NotificationChannel? getNotificationChannel(String);
+    method public android.app.NotificationChannel? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+    method public void notify(int, android.app.Notification);
+    method public void notify(String?, int, android.app.Notification);
+    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public class Person {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public String? getKey();
+    method public CharSequence? getName();
+    method public String? getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String resolveToLegacyUri();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+    method public androidx.core.app.Person.Builder toBuilder();
+    method public android.os.Bundle toBundle();
+    method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public androidx.core.app.Person build();
+    method public androidx.core.app.Person.Builder setBot(boolean);
+    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+    method public androidx.core.app.Person.Builder setImportant(boolean);
+    method public androidx.core.app.Person.Builder setKey(String?);
+    method public androidx.core.app.Person.Builder setName(CharSequence?);
+    method public androidx.core.app.Person.Builder setUri(String?);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+    method public android.app.PendingIntent getActionIntent();
+    method public CharSequence getContentDescription();
+    method public androidx.core.graphics.drawable.IconCompat getIcon();
+    method public CharSequence getTitle();
+    method public boolean isEnabled();
+    method public void setEnabled(boolean);
+    method public void setShouldShowIcon(boolean);
+    method public boolean shouldShowIcon();
+    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(4) public android.app.PendingIntent! mActionIntent;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(3) public CharSequence! mContentDescription;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(5) public boolean mEnabled;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(1) public androidx.core.graphics.drawable.IconCompat! mIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(6) public boolean mShouldShowIcon;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(2) public CharSequence! mTitle;
+  }
+
+  public final class RemoteInput {
+    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+    method public boolean getAllowFreeFormInput();
+    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+    method public CharSequence![]! getChoices();
+    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+    method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence! getLabel();
+    method public String! getResultKey();
+    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+    method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+    method public boolean isDataOnly();
+    method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+    field public static final int SOURCE_CHOICE = 1; // 0x1
+    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(String);
+    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public androidx.core.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+  }
+
+  @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+  }
+
+  public final class ServiceCompat {
+    method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+    field public static final int START_STICKY = 1; // 0x1
+    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+  }
+
+  public final class ShareCompat {
+    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+    method public static String? getCallingPackage(android.app.Activity);
+    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    ctor public ShareCompat.IntentBuilder(android.content.Context);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    ctor public ShareCompat.IntentReader(android.app.Activity);
+    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName? getCallingActivity();
+    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+    method public CharSequence? getCallingApplicationLabel();
+    method public String? getCallingPackage();
+    method public String![]? getEmailBcc();
+    method public String![]? getEmailCc();
+    method public String![]? getEmailTo();
+    method public String? getHtmlText();
+    method public android.net.Uri? getStream();
+    method public android.net.Uri? getStream(int);
+    method public int getStreamCount();
+    method public String? getSubject();
+    method public CharSequence? getText();
+    method public String? getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+  }
+
+  public static interface SharedElementCallback.OnSharedElementsReadyListener {
+    method public void onSharedElementsReady();
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent? editIntentAt(int);
+    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+    method @Deprecated public android.content.Intent! getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent![] getIntents();
+    method public android.app.PendingIntent? getPendingIntent(int, int);
+    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle?);
+  }
+
+  public static interface TaskStackBuilder.SupportParentable {
+    method public android.content.Intent? getSupportParentActivityIntent();
+  }
+
+}
+
+package androidx.core.content {
+
+  public final class ContentProviderCompat {
+    method public static android.content.Context requireContext(android.content.ContentProvider);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+  }
+
+  public class ContextCompat {
+    ctor protected ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, String);
+    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+    method public static String? getAttributionTag(android.content.Context);
+    method public static java.io.File! getCodeCacheDir(android.content.Context);
+    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+    method public static java.io.File? getDataDir(android.content.Context);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+    method public static java.util.concurrent.Executor! getMainExecutor(android.content.Context!);
+    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File![] getObbDirs(android.content.Context);
+    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+    method public static String? getSystemServiceName(android.content.Context, Class<?>);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+    method public static void startForegroundService(android.content.Context, android.content.Intent);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, String?, String![]?);
+    method public String! getType(android.net.Uri);
+    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+    method public boolean onCreate();
+    method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainSelectorActivity(String, String);
+    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+  }
+
+  public final class LocusIdCompat {
+    ctor public LocusIdCompat(String);
+    method public String getId();
+    method @RequiresApi(29) public android.content.LocusId toLocusId();
+    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+  }
+
+  public final class MimeTypeFilter {
+    method public static boolean matches(String?, String);
+    method public static String? matches(String?, String![]);
+    method public static String? matches(String![]?, String);
+    method public static String![] matchesMany(String![]?, String);
+  }
+
+  public final class PermissionChecker {
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+    method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+  }
+
+  @Deprecated public final class SharedPreferencesCompat {
+  }
+
+  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+  }
+
+}
+
+package androidx.core.content.pm {
+
+  @Deprecated public final class ActivityInfoCompat {
+    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+  public final class PackageInfoCompat {
+    method public static long getLongVersionCode(android.content.pm.PackageInfo);
+    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public final class PermissionInfoCompat {
+    method public static int getProtection(android.content.pm.PermissionInfo);
+    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoChangeListener {
+    ctor public ShortcutInfoChangeListener();
+    method @AnyThread public void onAllShortcutsRemoved();
+    method @AnyThread public void onShortcutAdded(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutRemoved(java.util.List<java.lang.String!>);
+    method @AnyThread public void onShortcutUpdated(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method @AnyThread public void onShortcutUsageReported(java.util.List<java.lang.String!>);
+  }
+
+  public class ShortcutInfoCompat {
+    method public android.content.ComponentName? getActivity();
+    method public java.util.Set<java.lang.String!>? getCategories();
+    method public CharSequence? getDisabledMessage();
+    method public int getDisabledReason();
+    method public android.os.PersistableBundle? getExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+    method public String getId();
+    method public android.content.Intent getIntent();
+    method public android.content.Intent![] getIntents();
+    method public long getLastChangedTimestamp();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public CharSequence? getLongLabel();
+    method public String getPackage();
+    method public int getRank();
+    method public CharSequence getShortLabel();
+    method public android.os.UserHandle? getUserHandle();
+    method public boolean hasKeyFieldsOnly();
+    method public boolean isCached();
+    method public boolean isDeclaredInManifest();
+    method public boolean isDynamic();
+    method public boolean isEnabled();
+    method public boolean isImmutable();
+    method public boolean isPinned();
+    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+  }
+
+  public static class ShortcutInfoCompat.Builder {
+    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+    ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat build();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+    ctor public ShortcutInfoCompatSaver();
+    method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+    method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+    method @AnyThread public abstract T! removeAllShortcuts();
+    method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+  }
+
+  public class ShortcutManagerCompat {
+    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+    method public static int getIconMaxHeight(android.content.Context);
+    method public static int getIconMaxWidth(android.content.Context);
+    method public static int getMaxShortcutCountPerActivity(android.content.Context);
+    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, @androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags int);
+    method public static boolean isRateLimitingActive(android.content.Context);
+    method public static boolean isRequestPinShortcutSupported(android.content.Context);
+    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+    method public static void removeAllDynamicShortcuts(android.content.Context);
+    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+    method public static void reportShortcutUsed(android.content.Context, String);
+    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+  }
+
+  @IntDef(flag=true, value={androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_MANIFEST, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_DYNAMIC, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_PINNED, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_CACHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutManagerCompat.ShortcutMatchFlags {
+  }
+
+}
+
+package androidx.core.content.res {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+    method @ColorInt public int getColor();
+    method public android.graphics.Shader? getShader();
+    method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+    method public boolean isGradient();
+    method public boolean isStateful();
+    method public boolean onStateChanged(int[]!);
+    method public void setColor(@ColorInt int);
+    method public boolean willDraw();
+  }
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+    method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser!, android.content.res.Resources!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static java.util.List<java.util.List<byte[]!>!>! readCerts(android.content.res.Resources!, @ArrayRes int);
+    field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+    field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+    field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+  }
+
+  public static interface FontResourcesParserCompat.FamilyResourceEntry {
+  }
+
+  @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+  }
+
+  public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+    method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+  }
+
+  public static final class FontResourcesParserCompat.FontFileResourceEntry {
+    ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+    method public String getFileName();
+    method public int getResourceId();
+    method public int getTtcIndex();
+    method public String? getVariationSettings();
+    method public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+    ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+    method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+    method public androidx.core.provider.FontRequest getRequest();
+    method public int getTimeout();
+  }
+
+  public final class ResourcesCompat {
+    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+    method public static float getFloat(android.content.res.Resources, @DimenRes int);
+    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFont(android.content.Context, @FontRes int, android.util.TypedValue!, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+    field @AnyRes public static final int ID_NULL = 0; // 0x0
+  }
+
+  public abstract static class ResourcesCompat.FontCallback {
+    ctor public ResourcesCompat.FontCallback();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface!, android.os.Handler?);
+    method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public abstract void onFontRetrieved(android.graphics.Typeface);
+  }
+
+  public static final class ResourcesCompat.ThemeCompat {
+    method public static void rebase(android.content.res.Resources.Theme);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+    method public static int getAttr(android.content.Context, int, int);
+    method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+    method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+    method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+    method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+    method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+    method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+    method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+    method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+    method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+    method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+    method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+    method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+    method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+    method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+  }
+
+}
+
+package androidx.core.database {
+
+  public final class CursorWindowCompat {
+    method public static android.database.CursorWindow create(String?, long);
+  }
+
+  @Deprecated public final class DatabaseUtilsCompat {
+    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+    method @Deprecated public static String! concatenateWhere(String!, String!);
+  }
+
+}
+
+package androidx.core.database.sqlite {
+
+  public final class SQLiteCursorCompat {
+    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+  }
+
+}
+
+package androidx.core.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public class BlendModeColorFilterCompat {
+    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+  }
+
+  public enum BlendModeCompat {
+    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+  }
+
+  public final class ColorUtils {
+    method @ColorInt public static int HSLToColor(float[]);
+    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double);
+    method public static void XYZToLAB(@FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_X) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Y) double, @FloatRange(from=0.0f, to=androidx.core.graphics.ColorUtils.XYZ_WHITE_REFERENCE_Z) double, double[]);
+    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+    method public static double calculateContrast(@ColorInt int, @ColorInt int);
+    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+    method public static void colorToHSL(@ColorInt int, float[]);
+    method public static void colorToLAB(@ColorInt int, double[]);
+    method public static void colorToXYZ(@ColorInt int, double[]);
+    method public static int compositeColors(@ColorInt int, @ColorInt int);
+    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+    method public static double distanceEuclidean(double[], double[]);
+    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+  }
+
+  public final class Insets {
+    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public static androidx.core.graphics.Insets of(int, int, int, int);
+    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+    field public static final androidx.core.graphics.Insets NONE;
+    field public final int bottom;
+    field public final int left;
+    field public final int right;
+    field public final int top;
+  }
+
+  public final class PaintCompat {
+    method public static boolean hasGlyph(android.graphics.Paint, String);
+    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+  }
+
+  public final class PathSegment {
+    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+    method public android.graphics.PointF getEnd();
+    method public float getEndFraction();
+    method public android.graphics.PointF getStart();
+    method public float getStartFraction();
+  }
+
+  public final class PathUtils {
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+  }
+
+  public class TypefaceCompat {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static void clearCache();
+    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+  }
+
+  @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi26Impl();
+    method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+    method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+    method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+    field protected final java.lang.reflect.Method! mAbortCreation;
+    field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+    field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+    field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+    field protected final Class<?>! mFontFamily;
+    field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+    field protected final java.lang.reflect.Method! mFreeze;
+  }
+
+  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+    ctor public TypefaceCompatApi28Impl();
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+    ctor public TypefaceCompatApi29Impl();
+    method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+    method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+    method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+    method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+    method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+    method public static void closeQuietly(java.io.Closeable!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
+    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
+    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
+    method public static java.io.File? getTempFile(android.content.Context!);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+  }
+
+}
+
+package androidx.core.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+  }
+
+  @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+    method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+    method @IdRes public int getResId();
+    method public String getResPackage();
+    method public int getType();
+    method public android.net.Uri getUri();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
+    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.os.Bundle toBundle();
+    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+    field public static final int TYPE_BITMAP = 1; // 0x1
+    field public static final int TYPE_DATA = 3; // 0x3
+    field public static final int TYPE_RESOURCE = 2; // 0x2
+    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int TYPE_URI = 4; // 0x4
+    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.ParcelField(value=1, defaultValue="androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN") public int mType;
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap? getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setCornerRadius(float);
+    method public void setDither(boolean);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+    method public void setTint(@ColorInt int);
+    method public void setTintList(android.content.res.ColorStateList!);
+    method public void setTintMode(android.graphics.PorterDuff.Mode!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+  }
+
+}
+
+package androidx.core.hardware.display {
+
+  public final class DisplayManagerCompat {
+    method public android.view.Display? getDisplay(int);
+    method public android.view.Display![] getDisplays();
+    method public android.view.Display![] getDisplays(String?);
+    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+  @Deprecated public class FingerprintManagerCompat {
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+  }
+
+  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+    method @Deprecated public void onAuthenticationError(int, CharSequence!);
+    method @Deprecated public void onAuthenticationFailed();
+    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+  }
+
+  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+  }
+
+  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method @Deprecated public javax.crypto.Cipher? getCipher();
+    method @Deprecated public javax.crypto.Mac? getMac();
+    method @Deprecated public java.security.Signature? getSignature();
+  }
+
+}
+
+package androidx.core.internal.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+    method public void setGroupDividerEnabled(boolean);
+    field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+    field public static final int CATEGORY_SHIFT = 16; // 0x10
+    field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+    field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+    field public static final int USER_MASK = 65535; // 0xffff
+    field public static final int USER_SHIFT = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+    method public int getAlphabeticModifiers();
+    method public CharSequence! getContentDescription();
+    method public android.content.res.ColorStateList! getIconTintList();
+    method public android.graphics.PorterDuff.Mode! getIconTintMode();
+    method public int getNumericModifiers();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTooltipText();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setAlphabeticShortcut(char, int);
+    method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setIconTintList(android.content.res.ColorStateList!);
+    method public android.view.MenuItem! setIconTintMode(android.graphics.PorterDuff.Mode!);
+    method public android.view.MenuItem! setNumericShortcut(char, int);
+    method public android.view.MenuItem! setShortcut(char, char, int, int);
+    method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+  }
+
+}
+
+package androidx.core.location {
+
+  public abstract class GnssStatusCompat {
+    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+    method public abstract int getConstellationType(@IntRange(from=0) int);
+    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+    method @IntRange(from=0) public abstract int getSatelliteCount();
+    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+    method public abstract boolean usedInFix(@IntRange(from=0) int);
+    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+    field public static final int CONSTELLATION_GPS = 1; // 0x1
+    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+    field public static final int CONSTELLATION_QZSS = 4; // 0x4
+    field public static final int CONSTELLATION_SBAS = 2; // 0x2
+    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+  }
+
+  public abstract static class GnssStatusCompat.Callback {
+    ctor public GnssStatusCompat.Callback();
+    method public void onFirstFix(@IntRange(from=0) int);
+    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+    method public void onStarted();
+    method public void onStopped();
+  }
+
+  public final class LocationCompat {
+    method public static long getElapsedRealtimeMillis(android.location.Location);
+    method public static long getElapsedRealtimeNanos(android.location.Location);
+    method public static boolean isMock(android.location.Location);
+    method public static void setMock(android.location.Location, boolean);
+  }
+
+  public final class LocationManagerCompat {
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+    method public static String? getGnssHardwareModelName(android.location.LocationManager);
+    method public static int getGnssYearOfHardware(android.location.LocationManager);
+    method public static boolean isLocationEnabled(android.location.LocationManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+  }
+
+}
+
+package androidx.core.math {
+
+  public class MathUtils {
+    method public static float clamp(float, float, float);
+    method public static double clamp(double, double, double);
+    method public static int clamp(int, int, int);
+    method public static long clamp(long, long, long);
+  }
+
+}
+
+package androidx.core.net {
+
+  public final class ConnectivityManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+  }
+
+  @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+  }
+
+  public final class MailTo {
+    method public String? getBcc();
+    method public String? getBody();
+    method public String? getCc();
+    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+    method public String? getSubject();
+    method public String? getTo();
+    method public static boolean isMailTo(String?);
+    method public static boolean isMailTo(android.net.Uri?);
+    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+    field public static final String MAILTO_SCHEME = "mailto:";
+  }
+
+  public class ParseException extends java.lang.RuntimeException {
+    field public final String response;
+  }
+
+  public final class TrafficStatsCompat {
+    method @Deprecated public static void clearThreadStatsTag();
+    method @Deprecated public static int getThreadStatsTag();
+    method @Deprecated public static void incrementOperationCount(int);
+    method @Deprecated public static void incrementOperationCount(int, int);
+    method @Deprecated public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+  }
+
+  public final class UriCompat {
+    method public static String toSafeString(android.net.Uri);
+  }
+
+}
+
+package androidx.core.os {
+
+  public class BuildCompat {
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+    method @ChecksSdkIntAtLeast(codename="S") public static boolean isAtLeastS();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public Object? getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+    method public void throwIfCanceled();
+  }
+
+  public static interface CancellationSignal.OnCancelListener {
+    method public void onCancel();
+  }
+
+  public final class ConfigurationCompat {
+    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+  }
+
+  public final class EnvironmentCompat {
+    method public static String getStorageState(java.io.File);
+    field public static final String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public final class ExecutorCompat {
+    method public static java.util.concurrent.Executor create(android.os.Handler);
+  }
+
+  public final class HandlerCompat {
+    method public static android.os.Handler createAsync(android.os.Looper);
+    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+  }
+
+  public final class LocaleListCompat {
+    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+    method public java.util.Locale! get(int);
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+    method public java.util.Locale? getFirstMatch(String![]);
+    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+    method public boolean isEmpty();
+    method @IntRange(from=0) public int size();
+    method public String toLanguageTags();
+    method public Object? unwrap();
+    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+  }
+
+  public final class MessageCompat {
+    method public static boolean isAsynchronous(android.os.Message);
+    method public static void setAsynchronous(android.os.Message, boolean);
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(String?);
+  }
+
+  public final class ParcelCompat {
+    method public static boolean readBoolean(android.os.Parcel);
+    method public static void writeBoolean(android.os.Parcel, boolean);
+  }
+
+  @Deprecated public final class ParcelableCompat {
+    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+  }
+
+  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+    method @Deprecated public T![]! newArray(int);
+  }
+
+  public final class ProcessCompat {
+    method public static boolean isApplicationUid(int);
+  }
+
+  @Deprecated public final class TraceCompat {
+    method @Deprecated public static void beginAsyncSection(String, int);
+    method @Deprecated public static void beginSection(String);
+    method @Deprecated public static void endAsyncSection(String, int);
+    method @Deprecated public static void endSection();
+    method @Deprecated public static boolean isEnabled();
+    method @Deprecated public static void setCounter(String, int);
+  }
+
+  @RequiresApi(17) public class UserHandleCompat {
+    method public static android.os.UserHandle getUserHandleForUid(int);
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package androidx.core.provider {
+
+  public final class FontRequest {
+    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+    ctor public FontRequest(String, String, String, @ArrayRes int);
+    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+    method @ArrayRes public int getCertificatesArrayResId();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+    method public String getProviderAuthority();
+    method public String getProviderPackage();
+    method public String getQuery();
+  }
+
+  public class FontsContractCompat {
+    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+    method @Deprecated @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+  }
+
+  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+    ctor public FontsContractCompat.Columns();
+    field public static final String FILE_ID = "file_id";
+    field public static final String ITALIC = "font_italic";
+    field public static final String RESULT_CODE = "result_code";
+    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+    field public static final int RESULT_CODE_OK = 0; // 0x0
+    field public static final String TTC_INDEX = "font_ttc_index";
+    field public static final String VARIATION_SETTINGS = "font_variation_settings";
+    field public static final String WEIGHT = "font_weight";
+  }
+
+  public static class FontsContractCompat.FontFamilyResult {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+    method public int getStatusCode();
+    field public static final int STATUS_OK = 0; // 0x0
+    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+  }
+
+  public static class FontsContractCompat.FontInfo {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+    method public int getResultCode();
+    method @IntRange(from=0) public int getTtcIndex();
+    method public android.net.Uri getUri();
+    method @IntRange(from=1, to=1000) public int getWeight();
+    method public boolean isItalic();
+  }
+
+  public static class FontsContractCompat.FontRequestCallback {
+    ctor public FontsContractCompat.FontRequestCallback();
+    method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+    method public void onTypefaceRetrieved(android.graphics.Typeface!);
+    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+    ctor @Deprecated public SelfDestructiveThread(String!, int, int);
+    method @Deprecated @VisibleForTesting public int getGeneration();
+    method @Deprecated @VisibleForTesting public boolean isRunning();
+    method @Deprecated public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+    method @Deprecated public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+  }
+
+  @Deprecated public static interface SelfDestructiveThread.ReplyCallback<T> {
+    method @Deprecated public void onReply(T!);
+  }
+
+}
+
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
+package androidx.core.telephony.mbms {
+
+  public final class MbmsHelper {
+    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+  }
+
+}
+
+package androidx.core.text {
+
+  public final class BidiFormatter {
+    method public static androidx.core.text.BidiFormatter! getInstance();
+    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+    method public boolean getStereoReset();
+    method public boolean isRtl(String!);
+    method public boolean isRtl(CharSequence!);
+    method public boolean isRtlContext();
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+    method public String! unicodeWrap(String!, boolean);
+    method public CharSequence! unicodeWrap(CharSequence!, boolean);
+    method public String! unicodeWrap(String!);
+    method public CharSequence! unicodeWrap(CharSequence!);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale!);
+    method public androidx.core.text.BidiFormatter! build();
+    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+  }
+
+  public final class HtmlCompat {
+    method public static android.text.Spanned fromHtml(String, int);
+    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+    method public static String toHtml(android.text.Spanned, int);
+    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+  }
+
+  public final class ICUCompat {
+    method public static String? maximizeAndGetScript(java.util.Locale!);
+  }
+
+  public class PrecomputedTextCompat implements android.text.Spannable {
+    method public char charAt(int);
+    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+    method @IntRange(from=0) public int getParagraphCount();
+    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+    method public int getSpanEnd(Object!);
+    method public int getSpanFlags(Object!);
+    method public int getSpanStart(Object!);
+    method public <T> T![]! getSpans(int, int, Class<T!>!);
+    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+    method public int length();
+    method public int nextSpanTransition(int, int, Class!);
+    method public void removeSpan(Object!);
+    method public void setSpan(Object!, int, int, int);
+    method public CharSequence! subSequence(int, int);
+  }
+
+  public static final class PrecomputedTextCompat.Params {
+    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+    method @RequiresApi(23) public int getBreakStrategy();
+    method @RequiresApi(23) public int getHyphenationFrequency();
+    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+    method public android.text.TextPaint getTextPaint();
+  }
+
+  public static class PrecomputedTextCompat.Params.Builder {
+    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+    method public androidx.core.text.PrecomputedTextCompat.Params build();
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+  }
+
+  public interface TextDirectionHeuristicCompat {
+    method public boolean isRtl(char[]!, int, int);
+    method public boolean isRtl(CharSequence!, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+    method public static String htmlEncode(String);
+  }
+
+}
+
+package androidx.core.text.util {
+
+  public final class LinkifyCompat {
+    method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+  }
+
+  @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+  }
+
+}
+
+package androidx.core.util {
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream?);
+    method public void finishWrite(java.io.FileOutputStream?);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public interface Consumer<T> {
+    method public void accept(T!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+    method public static void buildShortClassTag(Object!, StringBuilder!);
+  }
+
+  @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+    ctor @Deprecated public LogWriter(String!);
+    method @Deprecated public void close();
+    method @Deprecated public void flush();
+    method @Deprecated public void write(char[]!, int, int);
+  }
+
+  public class ObjectsCompat {
+    method public static boolean equals(Object?, Object?);
+    method public static int hash(java.lang.Object!...);
+    method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
+    method public static String? toString(Object?, String?);
+  }
+
+  public class Pair<F, S> {
+    ctor public Pair(F!, S!);
+    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+    field public final F! first;
+    field public final S! second;
+  }
+
+  public final class PatternsCompat {
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_EMAIL_ADDRESS;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_WEB_URL;
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static interface Pools.Pool<T> {
+    method public T? acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+    ctor public Pools.SimplePool(int);
+    method public T! acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+    method public static void checkArgument(boolean);
+    method public static void checkArgument(boolean, Object);
+    method public static int checkArgumentInRange(int, int, int, String);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+    method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+    method public static int checkFlagsArgument(int, int);
+    method public static <T> T checkNotNull(T?);
+    method public static <T> T checkNotNull(T?, Object);
+    method public static void checkState(boolean, String?);
+    method public static void checkState(boolean);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, Object);
+    method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, String, java.lang.Object!...);
+  }
+
+  public interface Predicate<T> {
+    method public boolean test(T!);
+  }
+
+  public interface Supplier<T> {
+    method public T! get();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+  }
+
+}
+
+package androidx.core.view {
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+    method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+    method public void sendAccessibilityEvent(android.view.View!, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context!);
+    method public android.content.Context! getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View! onCreateActionView();
+    method public android.view.View! onCreateActionView(android.view.MenuItem!);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu!);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener!);
+    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+    method public void onSubUiVisibilityChanged(boolean);
+  }
+
+  public static interface ActionProvider.VisibilityListener {
+    method public void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class ContentInfoCompat {
+    method public android.content.ClipData getClip();
+    method public android.os.Bundle? getExtras();
+    method @androidx.core.view.ContentInfoCompat.Flags public int getFlags();
+    method public android.net.Uri? getLinkUri();
+    method @androidx.core.view.ContentInfoCompat.Source public int getSource();
+    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+    field public static final int SOURCE_APP = 0; // 0x0
+    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+  }
+
+  public static final class ContentInfoCompat.Builder {
+    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+    ctor public ContentInfoCompat.Builder(android.content.ClipData, @androidx.core.view.ContentInfoCompat.Source int);
+    method public androidx.core.view.ContentInfoCompat build();
+    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+    method public androidx.core.view.ContentInfoCompat.Builder setFlags(@androidx.core.view.ContentInfoCompat.Flags int);
+    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+    method public androidx.core.view.ContentInfoCompat.Builder setSource(@androidx.core.view.ContentInfoCompat.Source int);
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Flags {
+  }
+
+  @IntDef({androidx.core.view.ContentInfoCompat.SOURCE_APP, androidx.core.view.ContentInfoCompat.SOURCE_CLIPBOARD, androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD, androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Source {
+  }
+
+  public final class DisplayCompat {
+    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+  }
+
+  public static final class DisplayCompat.ModeCompat {
+    method public int getPhysicalHeight();
+    method public int getPhysicalWidth();
+    method @Deprecated public boolean isNative();
+    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+  }
+
+  public final class DisplayCutoutCompat {
+    ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+    method public java.util.List<android.graphics.Rect!> getBoundingRects();
+    method public int getSafeInsetBottom();
+    method public int getSafeInsetLeft();
+    method public int getSafeInsetRight();
+    method public int getSafeInsetTop();
+    method public androidx.core.graphics.Insets getWaterfallInsets();
+  }
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity!, android.view.DragEvent!);
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point!);
+    method public boolean onLongClick(android.view.View!);
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+  }
+
+  public static interface DragStartHelper.OnDragStartListener {
+    method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+    ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent!);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+    method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+    method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+    method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+  }
+
+  public static interface KeyEventDispatcher.Component {
+    method public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+  }
+
+  public final class LayoutInflaterCompat {
+    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+  }
+
+  @Deprecated public interface LayoutInflaterFactory {
+    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+  }
+
+  public final class MenuCompat {
+    method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+  }
+
+  public final class MenuItemCompat {
+    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+    method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+    method public static int getAlphabeticModifiers(android.view.MenuItem!);
+    method public static CharSequence! getContentDescription(android.view.MenuItem!);
+    method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+    method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+    method public static int getNumericModifiers(android.view.MenuItem!);
+    method public static CharSequence! getTooltipText(android.view.MenuItem!);
+    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+    method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+    method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+    method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+    method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+    method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+    method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+    method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+    method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+  }
+
+  public final class MotionEventCompat {
+    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+    method @Deprecated public static int getSource(android.view.MotionEvent!);
+    method @Deprecated public static float getX(android.view.MotionEvent!, int);
+    method @Deprecated public static float getY(android.view.MotionEvent!, int);
+    method public static boolean isFromSource(android.view.MotionEvent!, int);
+    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+    field @Deprecated public static final int AXIS_RX = 12; // 0xc
+    field @Deprecated public static final int AXIS_RY = 13; // 0xd
+    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SCROLL = 26; // 0x1a
+    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+    field @Deprecated public static final int AXIS_X = 0; // 0x0
+    field @Deprecated public static final int AXIS_Y = 1; // 0x1
+    field @Deprecated public static final int AXIS_Z = 11; // 0xb
+    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public interface NestedScrollingChild {
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void stopNestedScroll();
+  }
+
+  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+    method public boolean hasNestedScrollingParent();
+    method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void stopNestedScroll();
+    method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent {
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public boolean onNestedFling(android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.view.View, float, float);
+    method public void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+    method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+    method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public void onStopNestedScroll(android.view.View);
+    method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+  }
+
+  public interface OnApplyWindowInsetsListener {
+    method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+  }
+
+  public interface OnReceiveContentListener {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  public interface OnReceiveContentViewBehavior {
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+  }
+
+  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+    method public boolean onPreDraw();
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+    method public void removeListener();
+  }
+
+  public final class PointerIconCompat {
+    method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object! getPointerIcon();
+    method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+    method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+  }
+
+  public interface ScrollingView {
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+  }
+
+  public interface TintableBackgroundView {
+    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @Deprecated public final class VelocityTrackerCompat {
+    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+  }
+
+  public class ViewCompat {
+    ctor @Deprecated protected ViewCompat();
+    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+    method public static void cancelDragAndDrop(android.view.View);
+    method @Deprecated public static int combineMeasuredStates(int, int);
+    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static void enableAccessibleClickableSpanSupport(android.view.View!);
+    method public static int generateViewId();
+    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View);
+    method @UiThread public static CharSequence! getAccessibilityPaneTitle(android.view.View!);
+    method @Deprecated public static float getAlpha(android.view.View!);
+    method public static android.content.res.ColorStateList! getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode! getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect? getClipBounds(android.view.View);
+    method public static android.view.Display? getDisplay(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getImportantForAutofill(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method @Deprecated public static int getLayerType(android.view.View!);
+    method public static int getLayoutDirection(android.view.View);
+    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+    method @Deprecated public static int getMeasuredState(android.view.View!);
+    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static int getNextClusterForwardId(android.view.View);
+    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+    method @Deprecated public static int getOverScrollMode(android.view.View!);
+    method @Px public static int getPaddingEnd(android.view.View);
+    method @Px public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent! getParentForAccessibility(android.view.View);
+    method @Deprecated public static float getPivotX(android.view.View!);
+    method @Deprecated public static float getPivotY(android.view.View!);
+    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+    method @Deprecated public static float getRotation(android.view.View!);
+    method @Deprecated public static float getRotationX(android.view.View!);
+    method @Deprecated public static float getRotationY(android.view.View!);
+    method @Deprecated public static float getScaleX(android.view.View!);
+    method @Deprecated public static float getScaleY(android.view.View!);
+    method public static int getScrollIndicators(android.view.View);
+    method @UiThread public static final CharSequence? getStateDescription(android.view.View);
+    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+    method public static String? getTransitionName(android.view.View);
+    method @Deprecated public static float getTranslationX(android.view.View!);
+    method @Deprecated public static float getTranslationY(android.view.View!);
+    method public static float getTranslationZ(android.view.View);
+    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method @Deprecated public static float getX(android.view.View!);
+    method @Deprecated public static float getY(android.view.View!);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasExplicitFocusable(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method @UiThread public static boolean isAccessibilityHeading(android.view.View!);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isFocusedByDefault(android.view.View);
+    method public static boolean isImportantForAccessibility(android.view.View);
+    method public static boolean isImportantForAutofill(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isKeyboardNavigationCluster(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method @Deprecated public static boolean isOpaque(android.view.View!);
+    method public static boolean isPaddingRelative(android.view.View);
+    method @UiThread public static boolean isScreenReaderFocusable(android.view.View!);
+    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+    method public static android.view.View! keyboardNavigationClusterSearch(android.view.View, android.view.View!, @androidx.core.view.ViewCompat.FocusDirection int);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle!);
+    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, Runnable!);
+    method public static void postOnAnimationDelayed(android.view.View, Runnable!, long);
+    method public static void removeAccessibilityAction(android.view.View, int);
+    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+    method public static void requestApplyInsets(android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+    method @Deprecated public static int resolveSizeAndState(int, int, int);
+    method public static boolean restoreDefaultFocus(android.view.View);
+    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat!);
+    method @UiThread public static void setAccessibilityHeading(android.view.View!, boolean);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method @UiThread public static void setAccessibilityPaneTitle(android.view.View!, CharSequence!);
+    method @Deprecated public static void setActivated(android.view.View!, boolean);
+    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+    method public static void setAutofillHints(android.view.View, java.lang.String!...);
+    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList!);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode!);
+    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect!);
+    method public static void setElevation(android.view.View, float);
+    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+    method public static void setFocusedByDefault(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setImportantForAutofill(android.view.View, int);
+    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+    method public static void setLabelFor(android.view.View, @IdRes int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint!);
+    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setNextClusterForwardId(android.view.View, int);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+    method @Deprecated public static void setPivotX(android.view.View!, float);
+    method @Deprecated public static void setPivotY(android.view.View!, float);
+    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat!);
+    method @Deprecated public static void setRotation(android.view.View!, float);
+    method @Deprecated public static void setRotationX(android.view.View!, float);
+    method @Deprecated public static void setRotationY(android.view.View!, float);
+    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+    method @Deprecated public static void setScaleX(android.view.View!, float);
+    method @Deprecated public static void setScaleY(android.view.View!, float);
+    method @UiThread public static void setScreenReaderFocusable(android.view.View!, boolean);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+    method public static void setTooltipText(android.view.View, CharSequence?);
+    method public static void setTransitionName(android.view.View, String!);
+    method @Deprecated public static void setTranslationX(android.view.View!, float);
+    method @Deprecated public static void setTranslationY(android.view.View!, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+    method @Deprecated public static void setX(android.view.View!, float);
+    method @Deprecated public static void setY(android.view.View!, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData!, android.view.View.DragShadowBuilder!, Object!, int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+    method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void stopNestedScroll(android.view.View);
+    method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder!);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+    field public static final int TYPE_NON_TOUCH = 1; // 0x1
+    field public static final int TYPE_TOUCH = 0; // 0x0
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+  }
+
+  @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+  }
+
+  @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+  }
+
+  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+    method public boolean onUnhandledKeyEvent(android.view.View!, android.view.KeyEvent!);
+  }
+
+  @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+    method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+    method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+    method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator! getInterpolator();
+    method public long getStartDelay();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+    method public void start();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+    method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+  }
+
+  public interface ViewPropertyAnimatorListener {
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View!);
+    method public void onAnimationEnd(android.view.View!);
+    method public void onAnimationStart(android.view.View!);
+  }
+
+  public interface ViewPropertyAnimatorUpdateListener {
+    method public void onAnimationUpdate(android.view.View!);
+  }
+
+  public final class WindowCompat {
+    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public final class WindowInsetsAnimationCompat {
+    ctor public WindowInsetsAnimationCompat(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, android.view.animation.Interpolator?, long);
+    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+    method public long getDurationMillis();
+    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+    method public float getInterpolatedFraction();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypeMask();
+    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public static final class WindowInsetsAnimationCompat.BoundsCompat {
+    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+    method public androidx.core.graphics.Insets getLowerBound();
+    method public androidx.core.graphics.Insets getUpperBound();
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+  }
+
+  public abstract static class WindowInsetsAnimationCompat.Callback {
+    ctor public WindowInsetsAnimationCompat.Callback(@androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode int);
+    method @androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode public final int getDispatchMode();
+    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+  }
+
+  @IntDef({androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsAnimationCompat.Callback.DispatchMode {
+  }
+
+  public interface WindowInsetsAnimationControlListenerCompat {
+    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+  public final class WindowInsetsAnimationControllerCompat {
+    method public void finish(boolean);
+    method public float getCurrentAlpha();
+    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+    method public androidx.core.graphics.Insets getCurrentInsets();
+    method public androidx.core.graphics.Insets getHiddenStateInsets();
+    method public androidx.core.graphics.Insets getShownStateInsets();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypes();
+    method public boolean isCancelled();
+    method public boolean isFinished();
+    method public boolean isReady();
+    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+    method public androidx.core.graphics.Insets getInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+    method @Deprecated public int getStableInsetBottom();
+    method @Deprecated public int getStableInsetLeft();
+    method @Deprecated public int getStableInsetRight();
+    method @Deprecated public int getStableInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+    method @Deprecated public int getSystemWindowInsetBottom();
+    method @Deprecated public int getSystemWindowInsetLeft();
+    method @Deprecated public int getSystemWindowInsetRight();
+    method @Deprecated public int getSystemWindowInsetTop();
+    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+    method public boolean hasInsets();
+    method @Deprecated public boolean hasStableInsets();
+    method @Deprecated public boolean hasSystemWindowInsets();
+    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public boolean isVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+  }
+
+  public static final class WindowInsetsCompat.Builder {
+    ctor public WindowInsetsCompat.Builder();
+    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+    method public androidx.core.view.WindowInsetsCompat build();
+    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, boolean);
+  }
+
+  public static final class WindowInsetsCompat.Type {
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int captionBar();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int displayCutout();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int ime();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int mandatorySystemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int navigationBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int statusBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemBars();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemGestures();
+    method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int tappableElement();
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.WindowInsetsCompat.Type.STATUS_BARS, androidx.core.view.WindowInsetsCompat.Type.NAVIGATION_BARS, androidx.core.view.WindowInsetsCompat.Type.CAPTION_BAR, androidx.core.view.WindowInsetsCompat.Type.IME, androidx.core.view.WindowInsetsCompat.Type.WINDOW_DECOR, androidx.core.view.WindowInsetsCompat.Type.SYSTEM_GESTURES, androidx.core.view.WindowInsetsCompat.Type.MANDATORY_SYSTEM_GESTURES, androidx.core.view.WindowInsetsCompat.Type.TAPPABLE_ELEMENT, androidx.core.view.WindowInsetsCompat.Type.DISPLAY_CUTOUT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsCompat.Type.InsetsType {
+  }
+
+  public final class WindowInsetsControllerCompat {
+    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void controlWindowInsetsAnimation(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+    method public int getSystemBarsBehavior();
+    method public void hide(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method public boolean isAppearanceLightNavigationBars();
+    method public boolean isAppearanceLightStatusBars();
+    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+    method public void setAppearanceLightNavigationBars(boolean);
+    method public void setAppearanceLightStatusBars(boolean);
+    method public void setSystemBarsBehavior(int);
+    method public void show(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+  }
+
+  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+  }
+
+}
+
+package androidx.core.view.accessibility {
+
+  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!, int);
+    method public void onClick(android.view.View);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+  }
+
+  public final class AccessibilityEventCompat {
+    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+    method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+    method @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+    method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType int);
+    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  @IntDef(flag=true, value={androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AccessibilityEventCompat.ContentChangeType {
+  }
+
+  public final class AccessibilityManagerCompat {
+    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+  }
+
+  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    method @Deprecated public void onAccessibilityStateChanged(boolean);
+  }
+
+  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
+  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+    method public void onTouchExplorationStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+    method public void addAction(int);
+    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public void addChild(android.view.View!);
+    method public void addChild(android.view.View!, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+    method public boolean canOpenPopup();
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+    method public int getActions();
+    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public CharSequence! getClassName();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+    method public CharSequence! getContentDescription();
+    method public int getDrawingOrder();
+    method public CharSequence! getError();
+    method public android.os.Bundle! getExtras();
+    method public CharSequence? getHintText();
+    method @Deprecated public Object! getInfo();
+    method public int getInputType();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public CharSequence! getPackageName();
+    method public CharSequence? getPaneTitle();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+    method public CharSequence? getRoleDescription();
+    method public CharSequence? getStateDescription();
+    method public CharSequence! getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public CharSequence? getTooltipText();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+    method public String! getViewIdResourceName();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isHeading();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScreenReaderFocusable();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isShowingHintText();
+    method public boolean isTextEntryKey();
+    method public boolean isVisibleToUser();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle!);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+    method public boolean removeChild(android.view.View!);
+    method public boolean removeChild(android.view.View!, int);
+    method public void setAccessibilityFocused(boolean);
+    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+    method public void setBoundsInScreen(android.graphics.Rect!);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(CharSequence!);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(Object!);
+    method public void setCollectionItemInfo(Object!);
+    method public void setContentDescription(CharSequence!);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(CharSequence!);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setHeading(boolean);
+    method public void setHintText(CharSequence?);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View!);
+    method public void setLabelFor(android.view.View!, int);
+    method public void setLabeledBy(android.view.View!);
+    method public void setLabeledBy(android.view.View!, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(CharSequence!);
+    method public void setPaneTitle(CharSequence?);
+    method public void setParent(android.view.View!);
+    method public void setParent(android.view.View!, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+    method public void setRoleDescription(CharSequence?);
+    method public void setScreenReaderFocusable(boolean);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setShowingHintText(boolean);
+    method public void setSource(android.view.View!);
+    method public void setSource(android.view.View!, int);
+    method public void setStateDescription(CharSequence?);
+    method public void setText(CharSequence!);
+    method public void setTextEntryKey(boolean);
+    method public void setTextSelection(int, int);
+    method public void setTooltipText(CharSequence?);
+    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+    method public void setTraversalAfter(android.view.View!);
+    method public void setTraversalAfter(android.view.View!, int);
+    method public void setTraversalBefore(android.view.View!);
+    method public void setTraversalBefore(android.view.View!, int);
+    method public void setViewIdResourceName(String!);
+    method public void setVisibleToUser(boolean);
+    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+    method public int getId();
+    method public CharSequence! getLabel();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method @Deprecated public boolean isHeading();
+    method public boolean isSelected();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+    method @IntRange(from=0) public int getRegionCount();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(Object!);
+    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+    method public Object! getProvider();
+    method public boolean performAction(int, int, android.os.Bundle!);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor @Deprecated public AccessibilityRecordCompat(Object!);
+    method @Deprecated public boolean equals(Object?);
+    method @Deprecated public int getAddedCount();
+    method @Deprecated public CharSequence! getBeforeText();
+    method @Deprecated public CharSequence! getClassName();
+    method @Deprecated public CharSequence! getContentDescription();
+    method @Deprecated public int getCurrentItemIndex();
+    method @Deprecated public int getFromIndex();
+    method @Deprecated public Object! getImpl();
+    method @Deprecated public int getItemCount();
+    method @Deprecated public int getMaxScrollX();
+    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public int getMaxScrollY();
+    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+    method @Deprecated public android.os.Parcelable! getParcelableData();
+    method @Deprecated public int getRemovedCount();
+    method @Deprecated public int getScrollX();
+    method @Deprecated public int getScrollY();
+    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+    method @Deprecated public int getToIndex();
+    method @Deprecated public int getWindowId();
+    method @Deprecated public int hashCode();
+    method @Deprecated public boolean isChecked();
+    method @Deprecated public boolean isEnabled();
+    method @Deprecated public boolean isFullScreen();
+    method @Deprecated public boolean isPassword();
+    method @Deprecated public boolean isScrollable();
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+    method @Deprecated public void recycle();
+    method @Deprecated public void setAddedCount(int);
+    method @Deprecated public void setBeforeText(CharSequence!);
+    method @Deprecated public void setChecked(boolean);
+    method @Deprecated public void setClassName(CharSequence!);
+    method @Deprecated public void setContentDescription(CharSequence!);
+    method @Deprecated public void setCurrentItemIndex(int);
+    method @Deprecated public void setEnabled(boolean);
+    method @Deprecated public void setFromIndex(int);
+    method @Deprecated public void setFullScreen(boolean);
+    method @Deprecated public void setItemCount(int);
+    method @Deprecated public void setMaxScrollX(int);
+    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setMaxScrollY(int);
+    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+    method @Deprecated public void setParcelableData(android.os.Parcelable!);
+    method @Deprecated public void setPassword(boolean);
+    method @Deprecated public void setRemovedCount(int);
+    method @Deprecated public void setScrollX(int);
+    method @Deprecated public void setScrollY(int);
+    method @Deprecated public void setScrollable(boolean);
+    method @Deprecated public void setSource(android.view.View!);
+    method @Deprecated public void setSource(android.view.View!, int);
+    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+    method @Deprecated public void setToIndex(int);
+  }
+
+  public interface AccessibilityViewCommand {
+    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+  }
+
+  public abstract static class AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.CommandArguments();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle!);
+  }
+
+  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+    method public boolean getExtendSelection();
+    method public int getGranularity();
+  }
+
+  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveHtmlArguments();
+    method public String! getHTMLElement();
+  }
+
+  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.MoveWindowArguments();
+    method public int getX();
+    method public int getY();
+  }
+
+  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+    method public int getColumn();
+    method public int getRow();
+  }
+
+  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetProgressArguments();
+    method public float getProgress();
+  }
+
+  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetSelectionArguments();
+    method public int getEnd();
+    method public int getStart();
+  }
+
+  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+    ctor public AccessibilityViewCommand.SetTextArguments();
+    method public CharSequence! getText();
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect!);
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+    method public CharSequence! getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package androidx.core.view.animation {
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+    method public static android.view.animation.Interpolator! create(float, float);
+    method public static android.view.animation.Interpolator! create(float, float, float, float);
+  }
+
+}
+
+package androidx.core.view.inputmethod {
+
+  public final class EditorInfoCompat {
+    ctor @Deprecated public EditorInfoCompat();
+    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo!);
+    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+  }
+
+  public final class InputConnectionCompat {
+    ctor @Deprecated public InputConnectionCompat();
+    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+    method public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+  }
+
+  public static interface InputConnectionCompat.OnCommitContentListener {
+    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat!, int, android.os.Bundle!);
+  }
+
+  public final class InputContentInfoCompat {
+    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+    method public android.net.Uri getContentUri();
+    method public android.content.ClipDescription getDescription();
+    method public android.net.Uri? getLinkUri();
+    method public void releasePermission();
+    method public void requestPermission();
+    method public Object? unwrap();
+    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+  }
+
+}
+
+package androidx.core.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public abstract void scrollTargetBy(int, int);
+    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+    method public int getAutoSizeMaxTextSize();
+    method public int getAutoSizeMinTextSize();
+    method public int getAutoSizeStepGranularity();
+    method public int[]! getAutoSizeTextAvailableSizes();
+    method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+    method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+  }
+
+  public final class CheckedTextViewCompat {
+    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public final class EdgeEffectCompat {
+    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+    method @Deprecated public boolean draw(android.graphics.Canvas!);
+    method @Deprecated public void finish();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean onAbsorb(int);
+    method @Deprecated public boolean onPull(float);
+    method @Deprecated public boolean onPull(float, float);
+    method public static void onPull(android.widget.EdgeEffect, float, float);
+    method @Deprecated public boolean onRelease();
+    method @Deprecated public void setSize(int, int);
+  }
+
+  public class ImageViewCompat {
+    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+  }
+
+  public final class ListPopupWindowCompat {
+    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static boolean canScrollList(android.widget.ListView, int);
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean arrowScroll(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+    method public void onNestedScroll(android.view.View, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+    method public void onStopNestedScroll(android.view.View, int);
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollBy(int, int, int);
+    method public final void smoothScrollTo(int, int);
+    method public final void smoothScrollTo(int, int, int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+  }
+
+  public static interface NestedScrollView.OnScrollChangeListener {
+    method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  @Deprecated public final class ScrollerCompat {
+    method @Deprecated public void abortAnimation();
+    method @Deprecated public boolean computeScrollOffset();
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+    method @Deprecated public float getCurrVelocity();
+    method @Deprecated public int getCurrX();
+    method @Deprecated public int getCurrY();
+    method @Deprecated public int getFinalX();
+    method @Deprecated public int getFinalY();
+    method @Deprecated public boolean isFinished();
+    method @Deprecated public boolean isOverScrolled();
+    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+    method @Deprecated public boolean springBack(int, int, int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int);
+    method @Deprecated public void startScroll(int, int, int, int, int);
+  }
+
+  public final class TextViewCompat {
+    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+    method public static int getAutoSizeMinTextSize(android.widget.TextView);
+    method public static int getAutoSizeStepGranularity(android.widget.TextView);
+    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+    method public static int getAutoSizeTextType(android.widget.TextView);
+    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
+    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+  }
+
+  @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextViewOnReceiveContentListener implements androidx.core.view.OnReceiveContentListener {
+    ctor public TextViewOnReceiveContentListener();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableCheckedTextView {
+    method public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundButton {
+    method public android.content.res.ColorStateList? getSupportButtonTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface TintableCompoundDrawablesView {
+    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+    method public android.content.res.ColorStateList? getSupportImageTintList();
+    method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+}
+
diff --git a/core/core/api/restricted_current.ignore b/core/core/api/restricted_current.ignore
index 15be615..02c76df 100644
--- a/core/core/api/restricted_current.ignore
+++ b/core/core/api/restricted_current.ignore
@@ -1,3 +1,3 @@
 // Baseline format: 1.0
-RemovedClass: androidx.core.os.HandlerExecutor:
-    Removed class androidx.core.os.HandlerExecutor
+InvalidNullConversion: androidx.core.widget.TextViewCompat#wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback):
+    Attempted to change method return from @NonNull to @Nullable: incompatible change for method androidx.core.widget.TextViewCompat.wrapCustomSelectionActionModeCallback(android.widget.TextView,android.view.ActionMode.Callback)
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 66203e4..46113a6 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -2047,6 +2047,19 @@
 
 }
 
+package androidx.core.telephony {
+
+  @RequiresApi(22) public class SubscriptionManagerCompat {
+    method public static int getSlotIndex(int);
+  }
+
+  public class TelephonyManagerCompat {
+    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+    method public static int getSubscriptionId(android.telephony.TelephonyManager);
+  }
+
+}
+
 package androidx.core.telephony.mbms {
 
   public final class MbmsHelper {
@@ -2213,6 +2226,8 @@
     method public static boolean equals(Object?, Object?);
     method public static int hash(java.lang.Object!...);
     method public static int hashCode(Object?);
+    method public static <T> T requireNonNull(T?);
+    method public static <T> T requireNonNull(T?, String);
     method public static String? toString(Object?, String?);
   }
 
@@ -3969,7 +3984,8 @@
     method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
     method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
     method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
     field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
     field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
   }
diff --git a/core/core/build.gradle b/core/core/build.gradle
index 80c146b..ca41212 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -24,15 +24,15 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(MULTIDEX)
 
     // Including both dexmakers allows support for all API levels plus final mocking support on
     // API 28+. The implementation is swapped based on the finality of the mock type. This
     // delegation is handled manually inside androidx.core.util.mockito.CustomMockMaker.
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO_INLINE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO_INLINE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0") {
         exclude group: "androidx.core", module: "core"
     }
@@ -52,10 +52,6 @@
         aidl = true
     }
     testOptions.unitTests.includeAndroidResources = true
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     aaptOptions {
         noCompress "ttf"
     }
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index d40b651..1430b6f 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -30,7 +30,7 @@
         errorLine2="    ^">
         <location
             file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="589"
+            line="602"
             column="5"/>
     </issue>
 
@@ -217,7 +217,7 @@
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/os/ProcessCompat.java"
-            line="141"
+            line="142"
             column="48"/>
     </issue>
 
@@ -228,7 +228,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="541"
+            line="679"
             column="29"/>
     </issue>
 
@@ -239,7 +239,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="605"
+            line="625"
             column="25"/>
     </issue>
 
@@ -360,7 +360,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2455"
+            line="2456"
             column="13"/>
     </issue>
 
@@ -371,7 +371,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/WindowInsetsCompat.java"
-            line="1128"
+            line="1141"
             column="39"/>
     </issue>
 
@@ -387,6 +387,11160 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.AccessibilityDelegateCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Object provider = mOriginalDelegate.getAccessibilityNodeProvider(host);"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+            line="320"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.AccessibilityDelegateCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            success = mOriginalDelegate.performAccessibilityAction(host, action, args);"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+            line="355"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            event.setContentChangeTypes(changeTypes);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="323"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return event.getContentChangeTypes();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="344"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            event.setMovementGranularity(granularity);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="359"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return event.getMovementGranularity();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="370"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            event.setAction(action);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="395"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityEventCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return event.getAction();"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+            line="406"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return manager.addTouchExplorationStateChangeListener("
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+            line="172"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return manager.removeTouchExplorationStateChangeListener("
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+            line="191"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mAction = new AccessibilityNodeInfo.AccessibilityAction(id, label);"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="641"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.AccessibilityAction) mAction).getId();"
+        errorLine2="                                                                             ~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="655"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.AccessibilityAction) mAction).getLabel();"
+        errorLine2="                                                                             ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="669"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
+        errorLine2="                                                                                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="780"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
+        errorLine2="                                                                                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="783"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
+        errorLine2="                                                                                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="802"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getColumnCount();"
+        errorLine2="                                                                      ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="820"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getRowCount();"
+        errorLine2="                                                                      ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="833"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).isHierarchical();"
+        errorLine2="                                                                      ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="846"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getSelectionMode();"
+        errorLine2="                                                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="864"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
+        errorLine2="                                                                                             ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="901"
+            column="94"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
+        errorLine2="                                                                                             ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="904"
+            column="94"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
+        errorLine2="                                                                                             ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="926"
+            column="94"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnIndex();"
+        errorLine2="                                                                          ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="944"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnSpan();"
+        errorLine2="                                                                          ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="957"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowIndex();"
+        errorLine2="                                                                          ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="970"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowSpan();"
+        errorLine2="                                                                          ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="983"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isHeading();"
+        errorLine2="                                                                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1000"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isSelected();"
+        errorLine2="                                                                          ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1013"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        AccessibilityNodeInfo.RangeInfo.obtain(type, min, max, current));"
+        errorLine2="                                                        ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1043"
+            column="57"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getCurrent();"
+        errorLine2="                                                                 ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1062"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMax();"
+        errorLine2="                                                                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1075"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMin();"
+        errorLine2="                                                                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1088"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getType();"
+        errorLine2="                                                                 ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1105"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mInfo = new TouchDelegateInfo(targetMap);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1125"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return mInfo.getRegionCount();"
+        errorLine2="                             ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1147"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return mInfo.getRegionAt(index);"
+        errorLine2="                             ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1166"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                AccessibilityNodeInfo info = mInfo.getTargetForRegion(region);"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1194"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    AccessibilityNodeInfo.obtain(root, virtualDescendantId));"
+        errorLine2="                                          ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1755"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setSource(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1817"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.findFocus(focus));"
+        errorLine2="                                                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1834"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.focusSearch(direction));"
+        errorLine2="                                                                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1856"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.addChild(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1928"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.removeChild(child);"
+        errorLine2="                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1948"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.removeChild(root, virtualDescendantId);"
+        errorLine2="                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="1966"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        ArrayList&lt;Integer> list = mInfo.getExtras()"
+        errorLine2="                                        ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2004"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putIntegerArrayList(key, list);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2008"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.addAction((AccessibilityNodeInfo.AccessibilityAction) action.mAction);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2031"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.removeAction((AccessibilityNodeInfo.AccessibilityAction) action.mAction);"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2056"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.performAction(action, arguments);"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2093"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setMovementGranularities(granularities);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2113"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getMovementGranularities();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2124"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setParent(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2210"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isVisibleToUser();"
+        errorLine2="                         ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2380"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setVisibleToUser(visibleToUser);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2400"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isAccessibilityFocused();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2411"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setAccessibilityFocused(focused);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2431"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isImportantForAccessibility();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2589"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setImportantForAccessibility(important);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2608"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().remove(SPANS_START_KEY);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2767"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().remove(SPANS_END_KEY);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2768"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().remove(SPANS_FLAGS_KEY);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2769"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().remove(SPANS_ID_KEY);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2770"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras().getCharSequence(STATE_DESCRIPTION_KEY);"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2815"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putCharSequence(STATE_DESCRIPTION_KEY, stateDescription);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2850"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setViewIdResourceName(viewId);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2878"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getViewIdResourceName();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2896"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getLiveRegion();"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2922"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setLiveRegion(mode);"
+        errorLine2="                  ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2942"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getDrawingOrder();"
+        errorLine2="                         ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2959"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setDrawingOrder(drawingOrderInParent);"
+        errorLine2="                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2978"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AccessibilityNodeInfo.CollectionInfo info = mInfo.getCollectionInfo();"
+        errorLine2="                                                              ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="2990"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setCollectionInfo((collectionInfo == null) ? null"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3000"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setCollectionItemInfo((collectionItemInfo == null) ? null"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3009"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AccessibilityNodeInfo.CollectionItemInfo info = mInfo.getCollectionItemInfo();"
+        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3023"
+            column="67"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AccessibilityNodeInfo.RangeInfo info = mInfo.getRangeInfo();"
+        errorLine2="                                                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3038"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo.mInfo);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3058"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            actions = (List&lt;Object>) (List&lt;?>) mInfo.getActionList();"
+        errorLine2="                                                     ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3076"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setContentInvalid(contentInvalid);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3104"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isContentInvalid();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3116"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isContextClickable();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3129"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setContextClickable(contextClickable);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3148"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getHintText();"
+        errorLine2="                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3159"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras().getCharSequence(HINT_TEXT_KEY);"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3161"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setHintText(hintText);"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3181"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putCharSequence(HINT_TEXT_KEY, hintText);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3183"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setError(error);"
+        errorLine2="                  ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3202"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getError();"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3213"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setLabelFor(labeled);"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3227"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setLabelFor(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3247"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabelFor());"
+        errorLine2="                                                                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3264"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setLabeledBy(label);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3278"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setLabeledBy(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3303"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabeledBy());"
+        errorLine2="                                                                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3320"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.canOpenPopup();"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3333"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setCanOpenPopup(opensPopup);"
+        errorLine2="                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3351"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            List&lt;AccessibilityNodeInfo> nodes = mInfo.findAccessibilityNodeInfosByViewId(viewId);"
+        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3380"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras();"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3406"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getInputType();"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3419"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setInputType(inputType);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3440"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setMaxTextLength(max);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3461"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getMaxTextLength();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3473"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTextSelection(start, end);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3494"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getTextSelectionStart();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3505"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getTextSelectionEnd();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3518"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getTraversalBefore());"
+        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3535"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTraversalBefore(view);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3557"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTraversalBefore(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3584"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getTraversalAfter());"
+        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3600"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTraversalAfter(view);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3622"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTraversalAfter(root, virtualDescendantId);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3648"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AccessibilityWindowInfoCompat.wrapNonNullInstance(mInfo.getWindow());"
+        errorLine2="                                                                           ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3661"
+            column="76"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isDismissable();"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3674"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setDismissable(dismissable);"
+        errorLine2="                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3692"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isEditable();"
+        errorLine2="                         ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3703"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setEditable(editable);"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3723"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isMultiLine();"
+        errorLine2="                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3734"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setMultiLine(multiLine);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3752"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getTooltipText();"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3764"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras().getCharSequence(TOOLTIP_TEXT_KEY);"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3766"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTooltipText(tooltipText);"
+        errorLine2="                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3786"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putCharSequence(TOOLTIP_TEXT_KEY, tooltipText);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3788"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setPaneTitle(paneTitle);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3806"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putCharSequence(PANE_TITLE_KEY, paneTitle);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3808"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getPaneTitle();"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3820"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras().getCharSequence(PANE_TITLE_KEY);"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3822"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isScreenReaderFocusable();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3839"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setScreenReaderFocusable(screenReaderFocusable);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3858"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isShowingHintText();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3873"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setShowingHintText(showingHintText);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3893"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isHeading();"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3910"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setHeading(isHeading);"
+        errorLine2="                  ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3930"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.isTextEntryKey();"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3943"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTextEntryKey(isTextEntryKey);"
+        errorLine2="                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3961"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.refresh();"
+        errorLine2="                         ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3978"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mInfo.getExtras().getCharSequence(ROLE_DESCRIPTION_KEY);"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="3990"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.getExtras().putCharSequence(ROLE_DESCRIPTION_KEY, roleDescription);"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="4022"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TouchDelegateInfo delegateInfo = mInfo.getTouchDelegateInfo();"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="4044"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.setTouchDelegateInfo(delegatedInfo.mInfo);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+            line="4071"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.accessibility.AccessibilityRecordCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            record.setSource(root, virtualDescendantId);"
+        errorLine2="                   ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+            line="140"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.view.accessibility.AccessibilityRecordCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return record.getMaxScrollX();"
+        errorLine2="                          ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+            line="483"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.view.accessibility.AccessibilityRecordCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            record.setMaxScrollX(maxScrollX);"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+            line="509"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.view.accessibility.AccessibilityRecordCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return record.getMaxScrollY();"
+        errorLine2="                          ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+            line="533"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.view.accessibility.AccessibilityRecordCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            record.setMaxScrollY(maxScrollY);"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+            line="559"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return info.loadDescription(packageManager);"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"
+            line="199"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return info.getCapabilities();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"
+            line="288"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getType();"
+        errorLine2="                                                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="100"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getLayer();"
+        errorLine2="                                                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="114"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ((AccessibilityWindowInfo) mInfo).getRoot());"
+        errorLine2="                                                      ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="128"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return wrapNonNullInstance(((AccessibilityWindowInfo) mInfo).getParent());"
+        errorLine2="                                                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="141"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getId();"
+        errorLine2="                                                     ~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="154"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((AccessibilityWindowInfo) mInfo).getBoundsInScreen(outBounds);"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="167"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isActive();"
+        errorLine2="                                                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="180"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isFocused();"
+        errorLine2="                                                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="193"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isAccessibilityFocused();"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="206"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getChildCount();"
+        errorLine2="                                                     ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="219"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return wrapNonNullInstance(((AccessibilityWindowInfo) mInfo).getChild(index));"
+        errorLine2="                                                                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="233"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getTitle();"
+        errorLine2="                                                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="247"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ((AccessibilityWindowInfo) mInfo).getAnchor());"
+        errorLine2="                                                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="261"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return wrapNonNullInstance(AccessibilityWindowInfo.obtain());"
+        errorLine2="                                                               ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="275"
+            column="64"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            AccessibilityWindowInfo.obtain((AccessibilityWindowInfo) info.mInfo));"
+        errorLine2="                                                    ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="294"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((AccessibilityWindowInfo) mInfo).recycle();"
+        errorLine2="                                              ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+            line="310"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.startActivityForResult(intent, requestCode, options);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="237"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="274"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.finishAffinity();"
+        errorLine2="                     ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="291"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.finishAfterTransition();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="308"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return activity.getReferrer();"
+        errorLine2="                            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="333"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return activity.requireViewById(id);"
+        errorLine2="                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="366"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.setEnterSharedElementCallback(frameworkCallback);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="390"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.setExitSharedElementCallback(frameworkCallback);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="409"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.postponeEnterTransition();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="415"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.startPostponedEnterTransition();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="421"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            activity.requestPermissions(permissions, requestCode);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="516"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.ActivityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return activity.shouldShowRequestPermissionRationale(permission);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="553"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            listener.onSharedElementsReady();"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityCompat.java"
+            line="697"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.ActivityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return activityManager.isLowRamDevice();"
+        errorLine2="                                   ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityManagerCompat.java"
+            line="41"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeCustomAnimation(context,"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="69"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeScaleUpAnimation("
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="99"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeClipRevealAnimation("
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="123"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeThumbnailScaleUpAnimation("
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="152"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeSceneTransitionAnimation("
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="180"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ActivityOptions.makeSceneTransitionAnimation(activity, pairs));"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="217"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeTaskLaunchBehind());"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="235"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.ActivityOptionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeBasic());"
+        errorLine2="                                                                 ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="247"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mActivityOptions.requestUsageTimeReport(receiver);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="277"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mActivityOptions.setLaunchBounds(screenSpacePixelRect));"
+        errorLine2="                                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="288"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mActivityOptions.getLaunchBounds();"
+        errorLine2="                                    ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+            line="296"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.AlarmManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent),"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
+            line="60"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.AlarmManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent),"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
+            line="60"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AlarmManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
+            line="118"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.AlarmManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            alarmManager.setExact(type, triggerAtMillis, operation);"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
+            line="163"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AlarmManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
+            line="223"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return AppOpsManager.permissionToOp(permission);"
+        errorLine2="                                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="76"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return appOpsManager.noteOp(op, uid, packageName);"
+        errorLine2="                                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="107"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return appOpsManager.noteOpNoThrow(op, uid, packageName);"
+        errorLine2="                                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="127"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="157"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return appOpsManager.noteProxyOp(op, proxiedPackageName);"
+        errorLine2="                                 ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="158"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="176"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.AppOpsManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return appOpsManager.noteProxyOpNoThrow(op, proxiedPackageName);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
+            line="177"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.graphics.BitmapCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return bitmap.hasMipMap();"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
+            line="29"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.graphics.BitmapCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            bitmap.setHasMipMap(hasMipMap);"
+        errorLine2="                   ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
+            line="36"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.BitmapCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return bitmap.getAllocationByteCount();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
+            line="49"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.BlendModeColorFilterCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ? new BlendModeColorFilter(color, blendMode) : null;"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java"
+            line="45"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.app.BundleCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return bundle.getBinder(key);"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/BundleCompat.java"
+            line="106"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.app.BundleCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            bundle.putBinder(key, binder);"
+        errorLine2="                   ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/BundleCompat.java"
+            line="122"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.os.CancellationSignal is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                ((android.os.CancellationSignal) obj).cancel();"
+        errorLine2="                                                      ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"
+            line="84"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.os.CancellationSignal is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mCancellationSignalObj = new android.os.CancellationSignal();"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"
+            line="143"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.os.CancellationSignal is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ((android.os.CancellationSignal) mCancellationSignalObj).cancel();"
+        errorLine2="                                                                             ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/CancellationSignal.java"
+            line="145"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
+        errorLine2="                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="92"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
+        errorLine2="                                       ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="92"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
+        errorLine2="                                                              ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="92"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    &quot;Color models must match (&quot; + foreground.getModel() + &quot; vs. &quot;"
+        errorLine2="                                                             ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="94"
+            column="62"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            + background.getModel() + &quot;)&quot;);"
+        errorLine2="                                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="95"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
+        errorLine2="                          ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="98"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
+        errorLine2="                                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="98"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
+        errorLine2="                                                                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="98"
+            column="73"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                : foreground.convert(background.getColorSpace());"
+        errorLine2="                             ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="100"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                : foreground.convert(background.getColorSpace());"
+        errorLine2="                                                ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="100"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        float[] src = s.getComponents();"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="102"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        float[] dst = background.getComponents();"
+        errorLine2="                                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="103"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        float sa = s.alpha();"
+        errorLine2="                     ~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="105"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        float da = background.alpha() * (1.0f - sa);"
+        errorLine2="                              ~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="107"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        int ai = background.getComponentCount() - 1;"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="111"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
+        errorLine2="                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="127"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
+        errorLine2="                                             ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/ColorUtils.java"
+            line="127"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.CompoundButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            button.setButtonTintList(tint);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
+            line="58"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.CompoundButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return button.getButtonTintList();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
+            line="72"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.CompoundButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            button.setButtonTintMode(tintMode);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
+            line="94"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.CompoundButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return button.getButtonTintMode();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
+            line="108"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.CompoundButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return button.getButtonDrawable();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
+            line="124"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.os.ConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return LocaleListCompat.wrap(configuration.getLocales());"
+        errorLine2="                                                       ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/ConfigurationCompat.java"
+            line="42"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.net.ConnectivityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return cm.isActiveNetworkMetered();"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"
+            line="101"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.net.ConnectivityManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return cm.getRestrictBackgroundStatus();"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"
+            line="160"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.content.ContentResolverCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return resolver.query(uri, projection, selection, selectionArgs, sortOrder,"
+        errorLine2="                                ~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+            line="81"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.database.CursorWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CursorWindow(name, windowSizeBytes);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/database/CursorWindowCompat.java"
+            line="43"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.database.CursorWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CursorWindow(name);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/database/CursorWindowCompat.java"
+            line="45"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.DialogCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return dialog.requireViewById(id);"
+        errorLine2="                          ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/DialogCompat.java"
+            line="56"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.DisplayCompat.ModeCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mPhysicalSize = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCompat.java"
+            line="346"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.DisplayCompat.ModeCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mPhysicalSize = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());"
+        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCompat.java"
+            line="346"
+            column="69"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        this(SDK_INT >= 28 ? new DisplayCutout(safeInsets, boundingRects) : null);"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="56"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new DisplayCutout(safeInsets.toPlatformInsets(), boundLeft,"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="88"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new DisplayCutout(safeInsetRect, boundingRects);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="106"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetTop();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="119"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetBottom();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="128"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetLeft();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="137"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetRight();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="146"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.DisplayCutoutCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((DisplayCutout) mDisplayCutout).getBoundingRects();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+            line="164"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.hardware.display.DisplayManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .getDisplay(displayId);"
+        errorLine2="                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
+            line="86"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.hardware.display.DisplayManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .getDisplays();"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
+            line="106"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.hardware.display.DisplayManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .getDisplays(category);"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
+            line="135"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.DragAndDropPermissionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    activity.requestDragAndDropPermissions(dragEvent);"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+            line="52"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.DragAndDropPermissionsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((DragAndDropPermissions) mDragAndDropPermissions).release();"
+        errorLine2="                                                               ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+            line="65"
+            column="64"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setAutoMirrored(mirrored);"
+        errorLine2="                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="79"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.isAutoMirrored();"
+        errorLine2="                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="96"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setHotspot(x, y);"
+        errorLine2="                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="111"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setHotspotBounds(left, top, right, bottom);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="124"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setTint(tint);"
+        errorLine2="                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="136"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setTintList(tint);"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="150"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.setTintMode(tintMode);"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="164"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.getAlpha();"
+        errorLine2="                            ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="178"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.applyTheme(theme);"
+        errorLine2="                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="189"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.canApplyTheme();"
+        errorLine2="                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="198"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.getColorFilter();"
+        errorLine2="                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="211"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                clearColorFilter(((InsetDrawable) drawable).getDrawable());"
+        errorLine2="                                                            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="232"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        child = state.getChild(i);"
+        errorLine2="                                      ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="242"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            drawable.inflate(res, parser, attrs, theme);"
+        errorLine2="                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="269"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.setLayoutDirection(layoutDirection);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="355"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.DrawableCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return drawable.getLayoutDirection();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+            line="392"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.EdgeEffectCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            edgeEffect.onPull(deltaDistance, displacement);"
+        errorLine2="                       ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+            line="153"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.EnvironmentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Environment.getExternalStorageState(path);"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/EnvironmentCompat.java"
+            line="60"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.os.EnvironmentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Environment.getStorageState(path);"
+        errorLine2="                               ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/EnvironmentCompat.java"
+            line="62"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.FileProvider is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    File[] externalMediaDirs = context.getExternalMediaDirs();"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/FileProvider.java"
+            line="702"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return (fp != null) &amp;&amp; fp.hasEnrolledFingerprints();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="68"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return (fp != null) &amp;&amp; fp.isHardwareDetected();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="83"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                fp.authenticate("
+        errorLine2="                   ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="113"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(FingerprintManager.class);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="127"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(FingerprintManager.class);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="130"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getCipher());"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="141"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getSignature());"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="143"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getMac());"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="145"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        } else if (cryptoObject.getCipher() != null) {"
+        errorLine2="                                ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="155"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CryptoObject(cryptoObject.getCipher());"
+        errorLine2="                                                 ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="156"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        } else if (cryptoObject.getSignature() != null) {"
+        errorLine2="                                ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="157"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CryptoObject(cryptoObject.getSignature());"
+        errorLine2="                                                 ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="158"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        } else if (cryptoObject.getMac() != null) {"
+        errorLine2="                                ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="159"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CryptoObject(cryptoObject.getMac());"
+        errorLine2="                                                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="160"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        unwrapCryptoObject(result.getCryptoObject())));"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+            line="183"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.provider.FontProvider is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                cursor = context.getContentResolver().query(uri, projection, &quot;query = ?&quot;,"
+        errorLine2="                                                      ~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontProvider.java"
+            line="139"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.res.FontResourcesParserCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return typedArray.getType(index);"
+        errorLine2="                              ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+            line="254"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.TOTAL_DURATION));"
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="355"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="359"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="364"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.DRAW_DURATION));"
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="369"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.SYNC_DURATION));"
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="373"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="377"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="382"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="387"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            frameMetrics.getMetric("
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
+            line="392"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.hasCarrierFrequencyHz(satelliteIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
+            line="89"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.location.GnssStatusWrapper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.getCarrierFrequencyHz(satelliteIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
+            line="98"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.GravityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Gravity.apply(gravity, w, h, container, outRect, layoutDirection);"
+        errorLine2="                    ~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"
+            line="65"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.GravityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Gravity.apply(gravity, w, h, container, xAdj, yAdj, outRect, layoutDirection);"
+        errorLine2="                    ~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"
+            line="99"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.GravityCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Gravity.applyDisplay(gravity, display, inoutObj, layoutDirection);"
+        errorLine2="                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/GravityCompat.java"
+            line="127"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.HtmlCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Html.fromHtml(source, flags);"
+        errorLine2="                        ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/HtmlCompat.java"
+            line="148"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.HtmlCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Html.fromHtml(source, flags, imageGetter, tagHandler);"
+        errorLine2="                        ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/HtmlCompat.java"
+            line="163"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.HtmlCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Html.toHtml(text, options);"
+        errorLine2="                        ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/HtmlCompat.java"
+            line="176"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.ICUCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ULocale uLocale = ULocale.addLikelySubtags(ULocale.forLocale(locale));"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/ICUCompat.java"
+            line="90"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.ICUCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ULocale uLocale = ULocale.addLikelySubtags(ULocale.forLocale(locale));"
+        errorLine2="                                                               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/ICUCompat.java"
+            line="90"
+            column="64"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.ICUCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return uLocale.getScript();"
+        errorLine2="                           ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/ICUCompat.java"
+            line="91"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.ICUCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return ((Locale) sAddLikelySubtagsMethod.invoke(null, args)).getScript();"
+        errorLine2="                                                                             ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/ICUCompat.java"
+            line="95"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.ICUCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return locale.getScript();"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/ICUCompat.java"
+            line="101"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                icon = Icon.createWithBitmap((Bitmap) mObj1);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="546"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="550"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    icon = Icon.createWithBitmap("
+        errorLine2="                                ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="552"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                icon = Icon.createWithResource(getResPackage(), mInt1);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="557"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);"
+        errorLine2="                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="560"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                icon = Icon.createWithContentUri((String) mObj1);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="563"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="580"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon("
+        errorLine2="                                ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="582"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            icon.setTintList(mTintList);"
+        errorLine2="                 ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="590"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            icon.setTintMode(mTintMode);"
+        errorLine2="                 ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="593"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return toIcon(context).loadDrawable(context);"
+        errorLine2="                                   ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="641"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        return new AdaptiveIconDrawable(null,"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="694"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return icon.getType();"
+        errorLine2="                        ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="1101"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return icon.getResPackage();"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="1129"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return icon.getResId();"
+        errorLine2="                        ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="1158"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return icon.getUri();"
+        errorLine2="                        ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+            line="1186"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getImageTintList();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="38"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setImageTintList(tintList);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="51"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if ((imageViewDrawable != null) &amp;&amp; (view.getImageTintList() != null)) {"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="57"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getImageTintMode();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="75"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setImageTintMode(mode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="89"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.ImageViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if ((imageViewDrawable != null) &amp;&amp; (view.getImageTintList() != null)) {"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
+            line="95"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.view.inputmethod.InputConnectionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return inputConnection.commitContent("
+        errorLine2="                                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java"
+            line="145"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.Insets is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return android.graphics.Insets.of(left, top, right, bottom);"
+        errorLine2="                                       ~~">
+        <location
+            file="src/main/java/androidx/core/graphics/Insets.java"
+            line="198"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.content.IntentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Intent.makeMainSelectorActivity(selectorAction, selectorCategory);"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/IntentCompat.java"
+            line="108"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.JobIntentService.JobServiceEngineImpl.WrapperWorkItem is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return mJobWork.getIntent();"
+        errorLine2="                                ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/JobIntentService.java"
+            line="260"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.JobIntentService.JobServiceEngineImpl.WrapperWorkItem is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mParams.completeWork(mJobWork);"
+        errorLine2="                                ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/JobIntentService.java"
+            line="267"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.util.LinkifyCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Linkify.addLinks(text, pattern, defaultScheme, schemes, matchFilter, transformFilter);"
+        errorLine2="                    ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/util/LinkifyCompat.java"
+            line="260"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.util.LinkifyCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Linkify.addLinks(spannable, pattern, defaultScheme, schemes, matchFilter,"
+        errorLine2="                           ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/util/LinkifyCompat.java"
+            line="336"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.ListPopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return listPopupWindow.createDragToOpenListener(src);"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+            line="98"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            listView.scrollListBy(y);"
+        errorLine2="                     ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListViewCompat.java"
+            line="39"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return listView.canScrollList(direction);"
+        errorLine2="                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/ListViewCompat.java"
+            line="69"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return wrap(new LocaleList(localeList));"
+        errorLine2="                        ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/LocaleListCompat.java"
+            line="74"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        ? Locale.forLanguageTag(tags[i])"
+        errorLine2="                                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/LocaleListCompat.java"
+            line="165"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return LocaleListCompat.wrap(LocaleList.getAdjustedDefault());"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/LocaleListCompat.java"
+            line="206"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return LocaleListCompat.wrap(LocaleList.getDefault());"
+        errorLine2="                                                    ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/LocaleListCompat.java"
+            line="226"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.os.LocaleListCompatWrapper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            final String script = locale.getScript();"
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/LocaleListCompatWrapper.java"
+            line="163"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (locationManager.registerGnssStatusCallback(transport, baseHandler)) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+            line="300"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    locationManager.unregisterGnssStatusCallback(transport);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+            line="385"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.location.LocationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    locationManager.unregisterGnssStatusCallback(transport);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+            line="394"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return lp.getMarginStart();"
+        errorLine2="                      ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="43"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return lp.getMarginEnd();"
+        errorLine2="                      ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="62"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            lp.setMarginStart(marginStart);"
+        errorLine2="               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="81"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            lp.setMarginEnd(marginEnd);"
+        errorLine2="               ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="100"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return lp.isMarginRelative();"
+        errorLine2="                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="113"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            result = lp.getLayoutDirection();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="128"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            lp.setLayoutDirection(layoutDirection);"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="151"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.MarginLayoutParamsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            lp.resolveLayoutDirection(layoutDirection);"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+            line="162"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        LocaleList localeList = context.getResources().getConfiguration().getLocales();"
+        errorLine2="                                                                          ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="60"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        int numLanguagesSupportedByService = serviceInfo.getNamedContentLocales().size();"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="62"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        for (Locale l : serviceInfo.getNamedContentLocales()) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="69"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            supportedLanguages[i] = l.toLanguageTag();"
+        errorLine2="                                      ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="70"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        Locale bestLocale = localeList.getFirstMatch(supportedLanguages);"
+        errorLine2="                                       ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="74"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.telephony.mbms.MbmsHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return bestLocale == null ? null : serviceInfo.getNameForLocale(bestLocale);"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
+            line="75"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.MenuCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            menu.setGroupDividerEnabled(enabled);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuCompat.java"
+            line="51"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setContentDescription(contentDescription);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="325"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getContentDescription();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="339"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setTooltipText(tooltipText);"
+        errorLine2="                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="354"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getTooltipText();"
+        errorLine2="                        ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="368"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setShortcut(numericChar, alphaChar, numericModifiers, alphaModifiers);"
+        errorLine2="                 ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="401"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setNumericShortcut(numericChar, numericModifiers);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="421"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getNumericModifiers();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="440"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setAlphabeticShortcut(alphaChar, alphaModifiers);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="466"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getAlphabeticModifiers();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="485"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setIconTintList(tint);"
+        errorLine2="                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="506"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getIconTintList();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="519"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            item.setIconTintMode(tintMode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="537"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.MenuItemCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return item.getIconTintMode();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/MenuItemCompat.java"
+            line="552"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.MessageCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            message.setAsynchronous(async);"
+        errorLine2="                    ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"
+            line="72"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.MessageCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                message.setAsynchronous(async);"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"
+            line="79"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.MessageCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return message.isAsynchronous();"
+        errorLine2="                           ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"
+            line="98"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.os.MessageCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return message.isAsynchronous();"
+        errorLine2="                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/MessageCompat.java"
+            line="104"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NavUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return sourceActivity.shouldUpRecreateTask(targetIntent);"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"
+            line="61"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NavUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            sourceActivity.navigateUpTo(upIntent);"
+        errorLine2="                           ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"
+            line="109"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NavUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Intent result = sourceActivity.getParentActivityIntent();"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NavUtils.java"
+            line="132"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.NestedScrollView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.LOLLIPOP || getClipToPadding()) {"
+        errorLine2="                                                                            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/NestedScrollView.java"
+            line="2008"
+            column="77"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.NestedScrollView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &amp;&amp; getClipToPadding()) {"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/NestedScrollView.java"
+            line="2012"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.NestedScrollView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.LOLLIPOP || getClipToPadding()) {"
+        errorLine2="                                                                            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/NestedScrollView.java"
+            line="2029"
+            column="77"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.widget.NestedScrollView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &amp;&amp; getClipToPadding()) {"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/NestedScrollView.java"
+            line="2033"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        this(channel.getId(), channel.getImportance());"
+        errorLine2="                     ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="284"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        this(channel.getId(), channel.getImportance());"
+        errorLine2="                                      ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="284"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mName = channel.getName();"
+        errorLine2="                        ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="286"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mDescription = channel.getDescription();"
+        errorLine2="                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="287"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mGroupId = channel.getGroup();"
+        errorLine2="                           ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="288"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mShowBadge = channel.canShowBadge();"
+        errorLine2="                             ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="289"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mSound = channel.getSound();"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="290"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mAudioAttributes = channel.getAudioAttributes();"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="291"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mLights = channel.shouldShowLights();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="292"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mLightColor = channel.getLightColor();"
+        errorLine2="                              ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="293"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mVibrationEnabled = channel.shouldVibrate();"
+        errorLine2="                                    ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="294"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mVibrationPattern = channel.getVibrationPattern();"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="295"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mBypassDnd = channel.canBypassDnd();"
+        errorLine2="                             ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="301"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mLockscreenVisibility = channel.getLockscreenVisibility();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="302"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mCanBubble = channel.canBubble();"
+        errorLine2="                                 ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="304"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        NotificationChannel channel = new NotificationChannel(mId, mName, mImportance);"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="320"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setDescription(mDescription);"
+        errorLine2="                ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="321"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setGroup(mGroupId);"
+        errorLine2="                ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="322"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setShowBadge(mShowBadge);"
+        errorLine2="                ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="323"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setSound(mSound, mAudioAttributes);"
+        errorLine2="                ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="324"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.enableLights(mLights);"
+        errorLine2="                ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="325"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setLightColor(mLightColor);"
+        errorLine2="                ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="326"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.setVibrationPattern(mVibrationPattern);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="327"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        channel.enableVibration(mVibrationEnabled);"
+        errorLine2="                ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
+            line="328"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        this(group.getId());"
+        errorLine2="                   ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="115"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mName = group.getName();"
+        errorLine2="                      ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="117"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mDescription = group.getDescription();"
+        errorLine2="                                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="119"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBlocked = group.isBlocked();"
+        errorLine2="                             ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="123"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mChannels = getChannelsCompat(group.getChannels());"
+        errorLine2="                                                ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="124"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (mId.equals(channel.getGroup())) {"
+        errorLine2="                                   ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="136"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        NotificationChannelGroup group = new NotificationChannelGroup(mId, mName);"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="152"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            group.setDescription(mDescription);"
+        errorLine2="                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
+            line="154"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                this.mSmallIcon = notification.getSmallIcon();"
+        errorLine2="                                               ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="959"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1466"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1467"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1468"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .build();"
+        errorLine2="                         ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1469"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1495"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
+        errorLine2="                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1496"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setLegacyStreamType(streamType)"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1497"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .build();"
+        errorLine2="                         ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="1498"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
+        errorLine2="                                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2048"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .createContentView();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2049"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
+        errorLine2="                                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2082"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .createBigContentView();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2083"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        Notification.Builder.recoverBuilder(mContext, notification);"
+        errorLine2="                                             ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2117"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return platformBuilder.createHeadsUpContentView();"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2118"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX,"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2788"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);"
+        errorLine2="                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2792"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        contentView.setChronometerCountDown(R.id.chronometer,"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2803"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                outerView.setViewPadding(R.id.notification_main_column_container,"
+        errorLine2="                          ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="2884"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        new Notification.BigPictureStyle(builder.getBuilder())"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3002"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setBigContentTitle(mBigContentTitle)"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3003"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .bigPicture(mPicture);"
+        errorLine2="                                 ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3004"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        new Notification.BigTextStyle(builder.getBuilder())"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3197"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setBigContentTitle(mBigContentTitle)"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3198"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .bigText(mBigText);"
+        errorLine2="                                 ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3199"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    style.setSummaryText(mSummaryText);"
+        errorLine2="                          ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3201"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.toAndroidPerson());"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3548"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.getName());"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3550"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkStyle.addMessage(message.toAndroidMessage());"
+        errorLine2="                                   ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3554"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        frameworkStyle.addHistoricMessage(historicMessage.toAndroidMessage());"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3559"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkStyle.setConversationTitle(mConversationTitle);"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3571"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkStyle.setGroupConversation(mIsGroupConversation);"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3577"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                frameworkStyle.setBuilder(builder.getBuilder());"
+        errorLine2="                               ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3579"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    new Notification.BigTextStyle(builder.getBuilder())"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3612"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            .setBigContentTitle(null)"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3613"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            .bigText(completeMessage);"
+        errorLine2="                             ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="3614"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4000"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4004"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    frameworkMessage.setData(getDataMimeType(), getDataUri());"
+        errorLine2="                                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4010"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        new Notification.InboxStyle(builder.getBuilder())"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4101"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setBigContentTitle(mBigContentTitle);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4102"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    style.setSummaryText(mSummaryText);"
+        errorLine2="                          ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4104"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    style.addLine(text);"
+        errorLine2="                          ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4107"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
+        errorLine2="                                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4201"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4201"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                button.setContentDescription(R.id.action_container, action.title);"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4319"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (Build.VERSION.SDK_INT >= 23 &amp;&amp; action.getIcon() != null) {"
+        errorLine2="                                                          ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4603"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    IconCompat iconCompat = IconCompat.createFromIcon(action.getIcon());"
+        errorLine2="                                                                             ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4604"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    android.app.RemoteInput[] remoteInputs = action.getRemoteInputs();"
+        errorLine2="                                                                    ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4612"
+            column="69"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    builder.mAllowGeneratedReplies = action.getAllowGeneratedReplies();"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4620"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    builder.setSemanticAction(action.getSemanticAction());"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4623"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    builder.setContextual(action.isContextual());"
+        errorLine2="                                                 ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="4626"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder = new Notification.Action.Builder("
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5461"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder = new Notification.Action.Builder("
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5470"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder.setAllowGeneratedReplies(actionCompat.getAllowGeneratedReplies());"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5482"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            actionBuilder.addExtras(actionExtras);"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5484"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    actionBuilder.addRemoteInput(remoteInput);"
+        errorLine2="                                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5489"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return actionBuilder.build();"
+        errorLine2="                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="5492"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ? new RemoteInput(remoteInput.getResultKey(),"
+        errorLine2="                                                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6238"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    remoteInput.getLabel(),"
+        errorLine2="                                ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6239"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    remoteInput.getChoices(),"
+        errorLine2="                                ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6240"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    remoteInput.getAllowFreeFormInput(),"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6241"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            ? remoteInput.getEditChoicesBeforeSending()"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6243"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    remoteInput.getExtras(),"
+        errorLine2="                                ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6245"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        new android.app.RemoteInput.Builder(remoteInputCompat.getResultKey())"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6271"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setLabel(remoteInputCompat.getLabel())"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6272"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setChoices(remoteInputCompat.getChoices())"
+        errorLine2="                                 ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6273"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .setAllowFreeFormInput(remoteInputCompat.getAllowFreeFormInput())"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6274"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .addExtras(remoteInputCompat.getExtras())"
+        errorLine2="                                 ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6275"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                .build();"
+        errorLine2="                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="6276"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return BubbleMetadata.fromPlatform(notification.getBubbleMetadata());"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7253"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        final android.app.RemoteInput[] srcArray = action.getRemoteInputs();"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7263"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        src.getResultKey(),"
+        errorLine2="                            ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7271"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        src.getLabel(),"
+        errorLine2="                            ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7272"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        src.getChoices(),"
+        errorLine2="                            ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7273"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        src.getAllowFreeFormInput(),"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7274"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                ? src.getEditChoicesBeforeSending()"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7276"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        src.getExtras(),"
+        errorLine2="                            ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7278"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
+        errorLine2="                                           ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7285"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    || action.getAllowGeneratedReplies();"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7287"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
+        errorLine2="                                           ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7289"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                action.getExtras().getBoolean(Action.EXTRA_SHOWS_USER_INTERFACE, true);"
+        errorLine2="                       ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7294"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            semanticAction = action.getSemanticAction();"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7298"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            semanticAction = action.getExtras().getInt("
+        errorLine2="                                    ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7300"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        final boolean isContextual = Build.VERSION.SDK_INT >= 29 ? action.isContextual() : false;"
+        errorLine2="                                                                          ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7304"
+            column="75"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (action.getIcon() == null &amp;&amp; action.icon != 0) {"
+        errorLine2="                       ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7307"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        action.getExtras(), remoteInputs, null, allowGeneratedReplies,"
+        errorLine2="                               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7309"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            IconCompat icon = action.getIcon() == null"
+        errorLine2="                                     ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7312"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ? null : IconCompat.createFromIconOrNullIfZeroResId(action.getIcon());"
+        errorLine2="                                                                               ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7313"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new Action(icon, action.title, action.actionIntent, action.getExtras(),"
+        errorLine2="                                                                              ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7314"
+            column="79"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new Action(action.icon, action.title, action.actionIntent, action.getExtras(),"
+        errorLine2="                                                                                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7318"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getGroup();"
+        errorLine2="                                ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7434"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getSortKey();"
+        errorLine2="                                ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7542"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getChannelId();"
+        errorLine2="                                ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7558"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getTimeoutAfter();"
+        errorLine2="                                ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7570"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getBadgeIconType();"
+        errorLine2="                                ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7583"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getShortcutId();"
+        errorLine2="                                ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7595"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getSettingsText();"
+        errorLine2="                                ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7606"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            LocusId locusId = notification.getLocusId();"
+        errorLine2="                                           ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7622"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getGroupAlertBehavior();"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7637"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return notification.getAllowSystemGeneratedContextualActions();"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompat.java"
+            line="7650"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder = new Notification.Builder(b.mContext, b.mChannelId);"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="72"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setSubText(b.mSubText)"
+        errorLine2="                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="101"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setUsesChronometer(b.mUseChronometer)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="102"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setPriority(b.mPriority);"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="103"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setShowWhen(b.mShowWhen);"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="133"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setLocalOnly(b.mLocalOnly)"
+        errorLine2="                     ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="145"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setGroup(b.mGroupKey)"
+        errorLine2="                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="146"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setGroupSummary(b.mGroupSummary)"
+        errorLine2="                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="147"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setSortKey(b.mSortKey);"
+        errorLine2="                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="148"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setCategory(b.mCategory)"
+        errorLine2="                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="153"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setColor(b.mColor)"
+        errorLine2="                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="154"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setVisibility(b.mVisibility)"
+        errorLine2="                     ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="155"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setPublicVersion(b.mPublicVersion)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="156"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setSound(n.sound, n.audioAttributes);"
+        errorLine2="                     ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="157"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mBuilder.addPerson(person);"
+        errorLine2="                             ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="168"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setSmallIcon(b.mSmallIcon);"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="202"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setExtras(b.mExtras)"
+        errorLine2="                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="206"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setRemoteInputHistory(b.mRemoteInputHistory);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="207"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setCustomContentView(b.mContentView);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="209"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setCustomBigContentView(b.mBigContentView);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="212"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setCustomHeadsUpContentView(b.mHeadsUpContentView);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="215"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setBadgeIconType(b.mBadgeIcon)"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="219"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setSettingsText(b.mSettingsText)"
+        errorLine2="                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="220"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setShortcutId(b.mShortcutId)"
+        errorLine2="                     ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="221"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setTimeoutAfter(b.mTimeout)"
+        errorLine2="                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="222"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .setGroupAlertBehavior(b.mGroupAlertBehavior);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="223"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setColorized(b.mColorized);"
+        errorLine2="                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="225"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.addPerson(p.toAndroidPerson());"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="237"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setAllowSystemGeneratedContextualActions("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="241"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setBubbleMetadata("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="244"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setLocusId(b.mLocusId.toLocusId());"
+        errorLine2="                         ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="247"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mBuilder.setGroup(NotificationCompat.GROUP_KEY_SILENT);"
+        errorLine2="                             ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="266"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mBuilder.setGroupAlertBehavior(mGroupAlertBehavior);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="268"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder = new Notification.Action.Builder("
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="353"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder = new Notification.Action.Builder("
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="358"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    actionBuilder.addRemoteInput(remoteInput);"
+        errorLine2="                                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="366"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="378"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder.setSemanticAction(action.getSemanticAction());"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="384"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                actionBuilder.setContextual(action.isContextual());"
+        errorLine2="                              ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="388"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            actionBuilder.addExtras(actionExtras);"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="393"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.addAction(actionBuilder.build());"
+        errorLine2="                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="394"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.addAction(actionBuilder.build());"
+        errorLine2="                                             ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="394"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mBuilder.build();"
+        errorLine2="                            ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="404"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Notification notification =  mBuilder.build();"
+        errorLine2="                                                  ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="406"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="410"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="416"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setExtras(mExtras);"
+        errorLine2="                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="425"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Notification notification = mBuilder.build();"
+        errorLine2="                                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="426"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="439"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="445"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setExtras(mExtras);"
+        errorLine2="                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="453"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Notification notification = mBuilder.build();"
+        errorLine2="                                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="454"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="464"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (notification.getGroup() != null"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="470"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBuilder.setExtras(mExtras);"
+        errorLine2="                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="486"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Notification notification = mBuilder.build();"
+        errorLine2="                                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="487"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Notification notification = mBuilder.build();"
+        errorLine2="                                                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+            line="496"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.areNotificationsEnabled();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="232"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getImportance();"
+        errorLine2="                                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="263"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannel(channel);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="291"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannelGroup(group);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="330"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannels(channels);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="357"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannels(platformChannels);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="376"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannelGroups(groups);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="390"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.createNotificationChannelGroups(platformGroups);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="409"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.deleteNotificationChannel(channelId);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="424"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mNotificationManager.deleteNotificationChannelGroup(groupId);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="436"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            for (NotificationChannel channel : mNotificationManager.getNotificationChannels()) {"
+        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="451"
+            column="69"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (channelIds.contains(channel.getId())) {"
+        errorLine2="                                                ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="452"
+            column="49"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="459"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
+        errorLine2="                                                                       ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="459"
+            column="72"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getNotificationChannel(channelId);"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="472"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getNotificationChannelGroup(channelGroupId);"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="538"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (group.getId().equals(channelGroupId)) return group;"
+        errorLine2="                          ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="542"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getNotificationChannels();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="580"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mNotificationManager.getNotificationChannelGroups();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
+            line="612"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.util.ObjectsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Objects.equals(a, b);"
+        errorLine2="                           ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/util/ObjectsCompat.java"
+            line="51"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.util.ObjectsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Objects.hash(values);"
+        errorLine2="                           ~~~~">
+        <location
+            file="src/main/java/androidx/core/util/ObjectsCompat.java"
+            line="93"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.content.pm.PackageInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return info.getLongVersionCode();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/PackageInfoCompat.java"
+            line="51"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return paint.hasGlyph(string);"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/PaintCompat.java"
+            line="52"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/PaintCompat.java"
+            line="127"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.animation.PathInterpolatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PathInterpolator(path);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+            line="49"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.animation.PathInterpolatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PathInterpolator(controlX, controlY);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+            line="64"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.animation.PathInterpolatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PathInterpolator(controlX1, controlY1, controlX2, controlY2);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+            line="82"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.PathUtils is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        float[] pathData = path.approximate(error);"
+        errorLine2="                                ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/PathUtils.java"
+            line="60"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.content.pm.PermissionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return permissionInfo.getProtection();"
+        errorLine2="                                  ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/PermissionInfoCompat.java"
+            line="75"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.content.pm.PermissionInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return permissionInfo.getProtectionFlags();"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/PermissionInfoCompat.java"
+            line="89"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setName(bundle.getString(NAME_KEY))"
+        errorLine2="                                ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="71"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setUri(bundle.getString(URI_KEY))"
+        errorLine2="                               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="72"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setKey(bundle.getString(KEY_KEY))"
+        errorLine2="                               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="73"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setBot(bundle.getBoolean(IS_BOT_KEY))"
+        errorLine2="                               ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="74"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setImportant(bundle.getBoolean(IS_IMPORTANT_KEY))"
+        errorLine2="                                     ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="75"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setName(person.getName())"
+        errorLine2="                                ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="89"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        (person.getIcon() != null)"
+        errorLine2="                                ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="91"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                ? IconCompat.createFromIcon(person.getIcon())"
+        errorLine2="                                                                   ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="92"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setUri(person.getUri())"
+        errorLine2="                               ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="94"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setKey(person.getKey())"
+        errorLine2="                               ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="95"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setBot(person.isBot())"
+        errorLine2="                               ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="96"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setImportant(person.isImportant())"
+        errorLine2="                                     ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="97"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        PersistableBundle result = new PersistableBundle();"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="151"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        result.putString(NAME_KEY, mName != null ? mName.toString() : null);"
+        errorLine2="               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="152"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        result.putString(URI_KEY, mUri);"
+        errorLine2="               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="153"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        result.putString(KEY_KEY, mKey);"
+        errorLine2="               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="154"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        result.putBoolean(IS_BOT_KEY, mIsBot);"
+        errorLine2="               ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="155"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        result.putBoolean(IS_IMPORTANT_KEY, mIsImportant);"
+        errorLine2="               ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="156"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return new android.app.Person.Builder()"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="175"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setName(getName())"
+        errorLine2="                 ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="176"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setIcon((getIcon() != null) ? getIcon().toIcon() : null)"
+        errorLine2="                 ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="177"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setUri(getUri())"
+        errorLine2="                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="178"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setKey(getKey())"
+        errorLine2="                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="179"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setBot(isBot())"
+        errorLine2="                 ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="180"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setImportant(isImportant())"
+        errorLine2="                 ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="181"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .build();"
+        errorLine2="                 ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/Person.java"
+            line="182"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.PointerIconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PointerIconCompat(PointerIcon.getSystemIcon(context, style));"
+        errorLine2="                                                     ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/PointerIconCompat.java"
+            line="131"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.PointerIconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PointerIconCompat(PointerIcon.create(bitmap, hotSpotX, hotSpotY));"
+        errorLine2="                                                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/PointerIconCompat.java"
+            line="152"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.PointerIconCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PointerIconCompat(PointerIcon.load(resources, resourceId));"
+        errorLine2="                                                     ~~~~">
+        <location
+            file="src/main/java/androidx/core/view/PointerIconCompat.java"
+            line="181"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.PopupMenuCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return ((PopupMenu) popupMenu).getDragToOpenListener();"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupMenuCompat.java"
+            line="56"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.PopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            popup.showAsDropDown(anchor, xoff, yoff, gravity);"
+        errorLine2="                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
+            line="69"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.PopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            popupWindow.setOverlapAnchor(overlapAnchor);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
+            line="91"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.PopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return popupWindow.getOverlapAnchor();"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
+            line="120"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.PopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            popupWindow.setWindowLayoutType(layoutType);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
+            line="154"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.PopupWindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return popupWindow.getWindowLayoutType();"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
+            line="184"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mWrapped = new PrecomputedText.Params.Builder(paint)"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="199"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setBreakStrategy(strategy)"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="200"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setHyphenationFrequency(frequency)"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="201"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setTextDirection(textDir)"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="202"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .build();"
+        errorLine2="                         ~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="203"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mPaint = wrapped.getTextPaint();"
+        errorLine2="                             ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="215"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mTextDir = wrapped.getTextDirection();"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="216"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mBreakStrategy = wrapped.getBreakStrategy();"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="217"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mHyphenationFrequency = wrapped.getHyphenationFrequency();"
+        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="218"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (mPaint.getLetterSpacing() != other.getTextPaint().getLetterSpacing()) {"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="294"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (mPaint.getLetterSpacing() != other.getTextPaint().getLetterSpacing()) {"
+        errorLine2="                                                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="294"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!TextUtils.equals(mPaint.getFontFeatureSettings(),"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="297"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        other.getTextPaint().getFontFeatureSettings())) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="298"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!mPaint.getTextLocales().equals(other.getTextPaint().getTextLocales())) {"
+        errorLine2="                            ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="306"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!mPaint.getTextLocales().equals(other.getTextPaint().getTextLocales())) {"
+        errorLine2="                                                                         ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="306"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
+        errorLine2="                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="310"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
+        errorLine2="                                                                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="310"
+            column="73"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextSkewX(), mPaint.getLetterSpacing(), mPaint.getFlags(),"
+        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="354"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextLocales(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
+        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="355"
+            column="79"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextLocales(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
+        errorLine2="                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="355"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextSkewX(), mPaint.getLetterSpacing(), mPaint.getFlags(),"
+        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="359"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
+        errorLine2="                               ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="360"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="360"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
+        errorLine2="                                                                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="364"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
+        errorLine2="                                                                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="368"
+            column="74"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sb.append(&quot;, letterSpacing=&quot; + mPaint.getLetterSpacing());"
+        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="384"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sb.append(&quot;, elegantTextHeight=&quot; + mPaint.isElegantTextHeight());"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="385"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sb.append(&quot;, textLocale=&quot; + mPaint.getTextLocales());"
+        errorLine2="                                                   ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="388"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sb.append(&quot;, textLocale=&quot; + mPaint.getTextLocale());"
+        errorLine2="                                                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="390"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sb.append(&quot;, variationSettings=&quot; + mPaint.getFontVariationSettings());"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="394"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        PrecomputedText.create(text, params.mWrapped), params);"
+        errorLine2="                                        ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="440"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                StaticLayout.Builder.obtain(text, 0, text.length(), params.getTextPaint(),"
+        errorLine2="                                     ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="468"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setBreakStrategy(params.getBreakStrategy())"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="470"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setHyphenationFrequency(params.getHyphenationFrequency())"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="471"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setTextDirection(params.getTextDirection())"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="472"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .build();"
+        errorLine2="                         ~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="473"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.getParagraphCount();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="532"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.getParagraphStart(paraIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="545"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mWrapped.getParagraphEnd(paraIndex);"
+        errorLine2="                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+            line="558"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                IconCompat.createFromIcon(remoteAction.getIcon()), remoteAction.getTitle(),"
+        errorLine2="                                                       ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="117"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                IconCompat.createFromIcon(remoteAction.getIcon()), remoteAction.getTitle(),"
+        errorLine2="                                                                                ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="117"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                remoteAction.getContentDescription(), remoteAction.getActionIntent());"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="118"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                remoteAction.getContentDescription(), remoteAction.getActionIntent());"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="118"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        action.setEnabled(remoteAction.isEnabled());"
+        errorLine2="                                       ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="119"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            action.setShouldShowIcon(remoteAction.shouldShowIcon());"
+        errorLine2="                                                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="121"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        RemoteAction action = new RemoteAction(mIcon.toIcon(), mTitle, mContentDescription,"
+        errorLine2="                              ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="190"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        action.setEnabled(isEnabled());"
+        errorLine2="               ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="192"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.RemoteActionCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            action.setShouldShowIcon(shouldShowIcon());"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+            line="194"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return android.app.RemoteInput.getDataResultsFromIntent(intent, remoteInputResultKey);"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="339"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return android.app.RemoteInput.getResultsFromIntent(intent);"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="377"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            android.app.RemoteInput.addResultsToIntent(fromCompat(remoteInputs), intent, results);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="403"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                android.app.RemoteInput.addResultsToIntent("
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="426"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            intent.setClipData(ClipData.newIntent(RemoteInput.RESULTS_CLIP_LABEL, clipDataIntent));"
+        errorLine2="                   ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="452"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            android.app.RemoteInput.addDataResultToIntent(fromCompat(remoteInput), intent, results);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="467"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            intent.setClipData(ClipData.newIntent(RemoteInput.RESULTS_CLIP_LABEL, clipDataIntent));"
+        errorLine2="                   ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="487"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            android.app.RemoteInput.setResultsSource(intent, source);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="506"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            intent.setClipData(ClipData.newIntent(RESULTS_CLIP_LABEL, clipDataIntent));"
+        errorLine2="                   ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="513"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return android.app.RemoteInput.getResultsSource(intent);"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="531"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                new android.app.RemoteInput.Builder(src.getResultKey())"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="562"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setLabel(src.getLabel())"
+        errorLine2="                         ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="563"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setChoices(src.getChoices())"
+        errorLine2="                         ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="564"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setAllowFreeFormInput(src.getAllowFreeFormInput())"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="565"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .addExtras(src.getExtras());"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="566"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="568"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return builder.build();"
+        errorLine2="                       ~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="570"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                new RemoteInput.Builder(src.getResultKey())"
+        errorLine2="                                            ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="576"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setLabel(src.getLabel())"
+        errorLine2="                                      ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="577"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setChoices(src.getChoices())"
+        errorLine2="                                        ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="578"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .setAllowFreeFormInput(src.getAllowFreeFormInput())"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="579"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .addExtras(src.getExtras());"
+        errorLine2="                                       ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="580"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="582"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.RemoteInput is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        ClipData clipData = intent.getClipData();"
+        errorLine2="                                   ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/RemoteInput.java"
+            line="589"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.res.ResourcesCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return res.getDrawable(id, theme);"
+        errorLine2="                       ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+            line="104"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.res.ResourcesCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return res.getDrawableForDensity(id, density, theme);"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+            line="137"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.content.res.ResourcesCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return res.getDrawableForDensity(id, density);"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+            line="139"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.res.ResourcesCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return res.getColor(id, theme);"
+        errorLine2="                       ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+            line="167"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.res.ResourcesCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return res.getColorStateList(id, theme);"
+        errorLine2="                       ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+            line="195"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.database.sqlite.SQLiteCursorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            cursor.setFillWindowForwardOnly(fillWindowForwardOnly);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java"
+            line="46"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ScaleGestureDetectorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            scaleGestureDetector.setQuickScaleEnabled(enabled);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+            line="54"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ScaleGestureDetectorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return scaleGestureDetector.isQuickScaleEnabled();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+            line="79"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.app.ServiceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            service.stopForeground(flags);"
+        errorLine2="                    ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ServiceCompat.java"
+            line="99"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.ShareCompat.IntentReader is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        result = Html.escapeHtml(text);"
+        errorLine2="                                      ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/ShareCompat.java"
+            line="835"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mContext, mId)"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="108"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setShortLabel(mLabel)"
+        errorLine2="                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="109"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                .setIntents(mIntents);"
+        errorLine2="                 ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="110"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setIcon(mIcon.toIcon(mContext));"
+        errorLine2="                    ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="112"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setLongLabel(mLongLabel);"
+        errorLine2="                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="115"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setDisabledMessage(mDisabledMessage);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="118"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setActivity(mActivity);"
+        errorLine2="                    ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="121"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setCategories(mCategories);"
+        errorLine2="                    ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="124"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        builder.setRank(mRank);"
+        errorLine2="                ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="126"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setExtras(mExtras);"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="128"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.setPersons(persons);"
+        errorLine2="                        ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="136"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.setLocusId(mLocusId.toLocusId());"
+        errorLine2="                        ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="139"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setLongLived(mIsLongLived);"
+        errorLine2="                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="141"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setExtras(buildLegacyExtrasBundle());"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="146"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return builder.build();"
+        errorLine2="                       ~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="148"
+            column="24"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mExtras = new PersistableBundle();"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="158"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mExtras.putInt(EXTRA_PERSON_COUNT, mPersons.length);"
+        errorLine2="                    ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="161"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mExtras.putPersistableBundle(EXTRA_PERSON_ + (i + 1),"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="163"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mExtras.putString(EXTRA_LOCUS_ID, mLocusId.getId());"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="168"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mExtras.putBoolean(EXTRA_LONG_LIVED, mIsLongLived);"
+        errorLine2="                ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="170"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (bundle == null || !bundle.containsKey(EXTRA_PERSON_COUNT)) {"
+        errorLine2="                                      ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="337"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        int personsLength = bundle.getInt(EXTRA_PERSON_COUNT);"
+        errorLine2="                                   ~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="341"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    bundle.getPersistableBundle(EXTRA_PERSON_ + (i + 1)));"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="345"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (bundle == null || !bundle.containsKey(EXTRA_LONG_LIVED)) {"
+        errorLine2="                                      ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="357"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        return bundle.getBoolean(EXTRA_LONG_LIVED);"
+        errorLine2="                      ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="360"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (shortcutInfo.getLocusId() == null) return null;"
+        errorLine2="                             ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="474"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return LocusIdCompat.toLocusIdCompat(shortcutInfo.getLocusId());"
+        errorLine2="                                                              ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="475"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return getLocusIdFromExtra(shortcutInfo.getExtras());"
+        errorLine2="                                                    ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="477"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        final String locusId = bundle.getString(EXTRA_LOCUS_ID);"
+        errorLine2="                                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="489"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mId = shortcutInfo.getId();"
+        errorLine2="                                     ~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="558"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mPackageName = shortcutInfo.getPackage();"
+        errorLine2="                                              ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="559"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Intent[] intents = shortcutInfo.getIntents();"
+        errorLine2="                                            ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="560"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mActivity = shortcutInfo.getActivity();"
+        errorLine2="                                           ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="562"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mLabel = shortcutInfo.getShortLabel();"
+        errorLine2="                                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="563"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mLongLabel = shortcutInfo.getLongLabel();"
+        errorLine2="                                            ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="564"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mDisabledMessage = shortcutInfo.getDisabledMessage();"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="565"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mInfo.mDisabledReason = shortcutInfo.getDisabledReason();"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="567"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mInfo.mDisabledReason = shortcutInfo.isEnabled()"
+        errorLine2="                                                     ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="569"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mCategories = shortcutInfo.getCategories();"
+        errorLine2="                                             ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="573"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mPersons = ShortcutInfoCompat.getPersonsFromExtra(shortcutInfo.getExtras());"
+        errorLine2="                                                                                 ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="574"
+            column="82"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mUser = shortcutInfo.getUserHandle();"
+        errorLine2="                                       ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="575"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mLastChangedTimestamp = shortcutInfo.getLastChangedTimestamp();"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="576"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mIsDynamic = shortcutInfo.isDynamic();"
+        errorLine2="                                            ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="580"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mIsPinned = shortcutInfo.isPinned();"
+        errorLine2="                                           ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="581"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mIsDeclaredInManifest = shortcutInfo.isDeclaredInManifest();"
+        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="582"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mIsImmutable = shortcutInfo.isImmutable();"
+        errorLine2="                                              ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="583"
+            column="47"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mIsEnabled = shortcutInfo.isEnabled();"
+        errorLine2="                                            ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="584"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mHasKeyFieldsOnly = shortcutInfo.hasKeyFieldsOnly();"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="585"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mRank = shortcutInfo.getRank();"
+        errorLine2="                                       ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="587"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mInfo.mExtras = shortcutInfo.getExtras();"
+        errorLine2="                                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="588"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mInfo.mExtras = new PersistableBundle();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="908"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mInfo.mExtras.putStringArray("
+        errorLine2="                                      ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="915"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                            mInfo.mExtras.putStringArray(capability + &quot;/&quot; + paramName,"
+        errorLine2="                                          ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="921"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mInfo.mExtras = new PersistableBundle();"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="928"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mInfo.mExtras.putString(EXTRA_SLICE_URI, UriCompat.toSafeString(mSliceUri));"
+        errorLine2="                                  ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+            line="930"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).isRequestPinShortcutSupported();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="154"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).isRequestPinShortcutSupported();"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="154"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).requestPinShortcut("
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="191"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).requestPinShortcut("
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="191"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            result = context.getSystemService(ShortcutManager.class)"
+        errorLine2="                             ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="235"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .createShortcutResultIntent(shortcut.toShortcutInfo());"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="236"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    context.getSystemService(ShortcutManager.class).getShortcuts(matchFlags);"
+        errorLine2="                            ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="276"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            final ShortcutManager manager = context.getSystemService(ShortcutManager.class);"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="279"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                shortcuts.addAll(manager.getManifestShortcuts());"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="282"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                shortcuts.addAll(manager.getDynamicShortcuts());"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="285"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                shortcuts.addAll(manager.getPinnedShortcuts());"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="288"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).addDynamicShortcuts(shortcuts)) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="324"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).addDynamicShortcuts(shortcuts)) {"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="324"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getMaxShortcutCountPerActivity();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="343"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getMaxShortcutCountPerActivity();"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="343"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).isRateLimitingActive();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="360"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).isRateLimitingActive();"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="360"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxWidth();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="380"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxWidth();"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="380"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxHeight();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="391"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxHeight();"
+        errorLine2="                                                                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="391"
+            column="68"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).reportShortcutUsed(shortcutId);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="418"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).reportShortcutUsed(shortcutId);"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="418"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).setDynamicShortcuts(shortcuts)) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="456"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).setDynamicShortcuts(shortcuts)) {"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="456"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            List&lt;ShortcutInfo> shortcuts = context.getSystemService("
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="480"
+            column="52"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    ShortcutManager.class).getDynamicShortcuts();"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="481"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).updateShortcuts(shortcuts)) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="519"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.getSystemService(ShortcutManager.class).updateShortcuts(shortcuts)) {"
+        errorLine2="                                                                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="519"
+            column="66"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class)"
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="586"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    .disableShortcuts(shortcutIds, disabledMessage);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="587"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).enableShortcuts(shortcutIds);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="617"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).enableShortcuts(shortcutIds);"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="617"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).removeDynamicShortcuts(shortcutIds);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="636"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).removeDynamicShortcuts(shortcutIds);"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="636"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).removeAllDynamicShortcuts();"
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="654"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).removeAllDynamicShortcuts();"
+        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="654"
+            column="61"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        context.getSystemService(ShortcutManager.class).removeLongLivedShortcuts(shortcutIds);"
+        errorLine2="                ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="681"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            context.getSystemService(ShortcutManager.class).pushDynamicShortcut("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="734"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            final ShortcutManager sm = context.getSystemService(ShortcutManager.class);"
+        errorLine2="                                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="737"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (sm.isRateLimitingActive()) {"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="738"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            final List&lt;ShortcutInfo> shortcuts = sm.getDynamicShortcuts();"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="741"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                sm.removeDynamicShortcuts(Arrays.asList("
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="743"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 25; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            sm.addDynamicShortcuts(Arrays.asList(shortcut.toShortcutInfo()));"
+        errorLine2="               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="746"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.content.pm.ShortcutManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                Build.VERSION.SDK_INT &lt; 19 || am == null || am.isLowRamDevice();"
+        errorLine2="                                                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
+            line="801"
+            column="64"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.app.TaskStackBuilder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return PendingIntent.getActivities(mSourceContext, requestCode, intents, flags,"
+        errorLine2="                                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+            line="341"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.text.TextUtilsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return TextUtils.getLayoutDirectionFromLocale(locale);"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/text/TextUtilsCompat.java"
+            line="91"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setCompoundDrawablesRelative(start, top, end, bottom);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="152"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="154"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="179"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="181"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="211"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="213"
+            column="36"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getMaxLines();"
+        errorLine2="                            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="227"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getMinLines();"
+        errorLine2="                            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="253"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setTextAppearance(resId);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="284"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getCompoundDrawablesRelative();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="296"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            final boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="299"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setAutoSizeTextTypeWithDefaults(autoSizeTextType);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="327"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setAutoSizeTextTypeUniformWithConfiguration("
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="362"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="388"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getAutoSizeTextType();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="407"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getAutoSizeStepGranularity();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="423"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getAutoSizeMinTextSize();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="440"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getAutoSizeMaxTextSize();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="457"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getAutoSizeTextAvailableSizes();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="474"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setFirstBaselineToTopHeight(firstBaselineToTopHeight);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="715"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                || textView.getIncludeFontPadding()) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="724"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                || textView.getIncludeFontPadding()) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="765"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new PrecomputedTextCompat.Params(textView.getTextMetricsParams());"
+        errorLine2="                                                             ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="836"
+            column="62"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.setBreakStrategy(textView.getBreakStrategy());"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="841"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                builder.setHyphenationFrequency(textView.getHyphenationFrequency());"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="842"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setTextDirection(getTextDirection(params.getTextDirection()));"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="863"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setBreakStrategy(params.getBreakStrategy());"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="886"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setHyphenationFrequency(params.getHyphenationFrequency());"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="887"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        DecimalFormatSymbols.getInstance(textView.getTextLocale());"
+        errorLine2="                                                                  ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="939"
+            column="67"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        DecimalFormatSymbols.getInstance(textView.getTextLocale());"
+        errorLine2="                                             ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="939"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                final String zero = symbols.getDigitStrings()[0];"
+        errorLine2="                                            ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="940"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        final boolean defaultIsRtl = (textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);"
+        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="955"
+            column="48"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        switch (textView.getTextDirection()) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="958"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setCompoundDrawableTintList(tint);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="1015"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getCompoundDrawableTintList();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="1031"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            textView.setCompoundDrawableTintMode(tintMode);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="1049"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.widget.TextViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return textView.getCompoundDrawableTintMode();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/widget/TextViewCompat.java"
+            line="1066"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return Trace.isEnabled();"
+        errorLine2="                         ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="79"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.beginSection(sectionName);"
+        errorLine2="                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="105"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.endSection();"
+        errorLine2="                  ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="118"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.beginAsyncSection(methodName, cookie);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="134"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.endAsyncSection(methodName, cookie);"
+        errorLine2="                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="154"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.os.TraceCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.setCounter(counterName, counterValue);"
+        errorLine2="                  ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/TraceCompat.java"
+            line="173"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.net.TrafficStatsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TrafficStats.tagDatagramSocket(socket);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+            line="138"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.net.TrafficStatsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TrafficStats.untagDatagramSocket(socket);"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+            line="155"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.TypefaceCompatUtil is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, &quot;r&quot;, cancellationSignal)) {"
+        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+            line="110"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.os.UserManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/UserManagerCompat.java"
+            line="42"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.os.UserManagerCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
+        errorLine2="                                                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/os/UserManagerCompat.java"
+            line="42"
+            column="64"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            v.setAutofillHints(autofillHints);"
+        errorLine2="              ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="762"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return v.getImportantForAutofill();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="783"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            v.setImportantForAutofill(mode);"
+        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="827"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return v.isImportantForAutofill();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="896"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return v.getAccessibilityDelegate();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="946"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.hasTransientState();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="989"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setHasTransientState(hasTransientState);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1003"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.postInvalidateOnAnimation();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1018"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.postInvalidateOnAnimation(left, top, right, bottom);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1040"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.postOnAnimation(action);"
+        errorLine2="                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1058"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.postOnAnimationDelayed(action, delayMillis);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1080"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getImportantForAccessibility();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1102"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setImportantForAccessibility(mode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1129"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setImportantForAccessibility(mode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1138"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isImportantForAccessibility();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1180"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.performAccessibilityAction(action, arguments);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1202"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();"
+        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1437"
+            column="55"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getLabelFor();"
+        errorLine2="                        ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1532"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setLabelFor(labeledId);"
+        errorLine2="                 ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1546"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setLayerPaint(paint);"
+        errorLine2="                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1582"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getLayoutDirection();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1605"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setLayoutDirection(layoutDirection);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1629"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getParentForAccessibility();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1643"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.requireViewById(id);"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1666"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getAccessibilityLiveRegion();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1783"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setAccessibilityLiveRegion(mode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1819"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getPaddingStart();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1834"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getPaddingEnd();"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1850"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setPaddingRelative(start, top, end, bottom);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1871"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.dispatchStartTemporaryDetach();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1894"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.dispatchFinishTemporaryDetach();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1917"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getMinimumWidth();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="1994"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getMinimumHeight();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2028"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setElevation(elevation);"
+        errorLine2="                 ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2335"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getElevation();"
+        errorLine2="                        ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2346"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setTranslationZ(translationZ);"
+        errorLine2="                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2356"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getTranslationZ();"
+        errorLine2="                        ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2367"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setTransitionName(transitionName);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2381"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getTransitionName();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2403"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getWindowSystemUiVisibility();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2416"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.requestApplyInsets();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2427"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.requestFitSystemWindows();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2429"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return v.getFitsSystemWindows();"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2472"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                WindowInsets result = view.onApplyWindowInsets(unwrapped);"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2533"
+            column="44"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                final WindowInsets result = view.dispatchApplyWindowInsets(unwrapped);"
+        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2561"
+            column="50"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setSystemGestureExclusionRects(rects);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2585"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getSystemGestureExclusionRects();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2600"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.hasOverlappingRendering();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2866"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isPaddingRelative();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2879"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setBackground(background);"
+        errorLine2="                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2892"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getBackgroundTintList();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2906"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setBackgroundTintList(tintList);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2922"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                boolean hasTint = (view.getBackgroundTintList() != null)"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2928"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        || (view.getBackgroundTintMode() != null);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2929"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    view.setBackground(background);"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2934"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getBackgroundTintMode();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2951"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setBackgroundTintMode(mode);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2969"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                boolean hasTint = (view.getBackgroundTintList() != null)"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2975"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        || (view.getBackgroundTintMode() != null);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2976"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    view.setBackground(background);"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="2981"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setNestedScrollingEnabled(enabled);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3007"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isNestedScrollingEnabled();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3030"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.startNestedScroll(axes);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3052"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.stopNestedScroll();"
+        errorLine2="                 ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3071"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.hasNestedScrollingParent();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3088"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3117"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3148"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.dispatchNestedFling(velocityX, velocityY, consumed);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3372"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.dispatchNestedPreFling(velocityX, velocityY);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3415"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isInLayout();"
+        errorLine2="                        ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3437"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isLaidOut();"
+        errorLine2="                        ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3448"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isLayoutDirectionResolved();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3465"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getZ();"
+        errorLine2="                        ~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3479"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setZ(z);"
+        errorLine2="                 ~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3498"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setClipBounds(clipBounds);"
+        errorLine2="                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3617"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getClipBounds();"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3632"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isAttachedToWindow();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3642"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.hasOnClickListeners();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3654"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setScrollIndicators(indicators);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3672"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setScrollIndicators(indicators, mask);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3706"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getScrollIndicators();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3724"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setPointerIcon((PointerIcon) (pointerIcon != null"
+        errorLine2="                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3735"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getDisplay();"
+        errorLine2="                        ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3754"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setTooltipText(tooltipText);"
+        errorLine2="                 ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3774"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return v.startDragAndDrop(data, shadowBuilder, localState, flags);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3784"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            v.cancelDragAndDrop();"
+        errorLine2="              ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3795"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            v.updateDragShadow(shadowBuilder);"
+        errorLine2="              ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3804"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getNextClusterForwardId();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3816"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setNextClusterForwardId(nextClusterForwardId);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3830"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isKeyboardNavigationCluster();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3842"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setKeyboardNavigationCluster(isCluster);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3856"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.isFocusedByDefault();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3871"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setFocusedByDefault(isFocusedByDefault);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3890"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.keyboardNavigationClusterSearch(currentCluster, direction);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3908"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.addKeyboardNavigationClusters(views, direction);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3924"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.restoreDefaultFocus();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3938"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.hasExplicitFocusable();"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3960"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return View.generateViewId();"
+        errorLine2="                        ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="3973"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return view.isScreenReaderFocusable();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4170"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.setScreenReaderFocusable(value);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4176"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return view.getAccessibilityPaneTitle();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4242"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.setAccessibilityPaneTitle(value);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4248"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return view.isAccessibilityHeading();"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4322"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.setAccessibilityHeading(value);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4328"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            event.setContentChangeTypes(changeType);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4423"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            event.setContentChangeTypes(changeType);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4433"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.getParent().notifySubtreeAccessibilityStateChanged(view, view, changeType);"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4440"
+            column="34"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewCompat.AccessibilityPaneVisibilityManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (pane.isAttachedToWindow()) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4500"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewCompat.AccessibilityPaneVisibilityManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewCompat.java"
+            line="4531"
+            column="40"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return config.getScaledHorizontalScrollFactor();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+            line="82"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.core.view.ViewConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return config.getScaledVerticalScrollFactor();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+            line="99"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.ViewConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return config.getScaledHoverSlop();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+            line="129"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.ViewConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return config.shouldShowMenuShortcutsWhenKeyboardPresent();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+            line="142"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return group.getLayoutMode();"
+        errorLine2="                         ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+            line="115"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            group.setLayoutMode(mode);"
+        errorLine2="                  ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+            line="131"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            group.setTransitionGroup(isTransitionGroup);"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+            line="145"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return group.isTransitionGroup();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+            line="158"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewGroupCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return group.getNestedScrollAxes();"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+            line="182"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    return parent.onStartNestedScroll(child, target, nestedScrollAxes);"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="215"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    parent.onNestedScrollAccepted(child, target, nestedScrollAxes);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="256"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    parent.onStopNestedScroll(target);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="289"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        parent.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed,"
+        errorLine2="                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="346"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    parent.onNestedPreScroll(target, dx, dy, consumed);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="391"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return parent.onNestedFling(target, velocityX, velocityY, consumed);"
+        errorLine2="                              ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="426"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return parent.onNestedPreFling(target, velocityX, velocityY);"
+        errorLine2="                              ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="463"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewParentCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            parent.notifySubtreeAccessibilityStateChanged(child, source, changeType);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewParentCompat.java"
+            line="493"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().withEndAction(runnable);"
+        errorLine2="                               ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="218"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return (Interpolator) view.animate().getInterpolator();"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="269"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().translationZBy(value);"
+        errorLine2="                               ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="572"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().translationZ(value);"
+        errorLine2="                               ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="591"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().z(value);"
+        errorLine2="                               ~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="610"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().zBy(value);"
+        errorLine2="                               ~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="629"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().withLayer();"
+        errorLine2="                               ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="682"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().withStartAction(runnable);"
+        errorLine2="                               ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="710"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.ViewPropertyAnimatorCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                view.animate().setUpdateListener(wrapped);"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+            line="787"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.core.view.WindowCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.requireViewById(id);"
+        errorLine2="                          ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/WindowCompat.java"
+            line="89"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.view.WindowInsetsCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (view != null &amp;&amp; view.isAttachedToWindow()) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/view/WindowInsetsCompat.java"
+            line="169"
+            column="34"/>
+    </issue>
+
+    <issue
         id="PrivateConstructorForUtilityClass"
         message="Utility class with non private constructor"
         errorLine1="public class AppLaunchChecker {"
@@ -404,7 +11558,7 @@
         errorLine2="             ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="150"
+            line="156"
             column="14"/>
     </issue>
 
@@ -459,7 +11613,7 @@
         errorLine2="                         ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="770"
+            line="875"
             column="26"/>
     </issue>
 
@@ -486,11358 +11640,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.AccessibilityDelegateCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Object provider = mOriginalDelegate.getAccessibilityNodeProvider(host);"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
-            line="320"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.AccessibilityDelegateCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            success = mOriginalDelegate.performAccessibilityAction(host, action, args);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
-            line="355"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            event.setContentChangeTypes(changeTypes);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="323"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return event.getContentChangeTypes();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="344"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            event.setMovementGranularity(granularity);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="359"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return event.getMovementGranularity();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="370"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            event.setAction(action);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="395"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityEventCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return event.getAction();"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
-            line="406"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return manager.addTouchExplorationStateChangeListener("
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
-            line="172"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return manager.removeTouchExplorationStateChangeListener("
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
-            line="191"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                mAction = new AccessibilityNodeInfo.AccessibilityAction(id, label);"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="641"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return ((AccessibilityNodeInfo.AccessibilityAction) mAction).getId();"
-        errorLine2="                                                                             ~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="655"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return ((AccessibilityNodeInfo.AccessibilityAction) mAction).getLabel();"
-        errorLine2="                                                                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="669"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
-        errorLine2="                                                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="780"
-            column="86"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
-        errorLine2="                                                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="783"
-            column="86"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return new CollectionInfoCompat(AccessibilityNodeInfo.CollectionInfo.obtain("
-        errorLine2="                                                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="802"
-            column="86"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getColumnCount();"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="820"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getRowCount();"
-        errorLine2="                                                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="833"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).isHierarchical();"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="846"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionInfo) mInfo).getSelectionMode();"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="864"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
-        errorLine2="                                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="901"
-            column="94"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
-        errorLine2="                                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="904"
-            column="94"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return new CollectionItemInfoCompat(AccessibilityNodeInfo.CollectionItemInfo.obtain("
-        errorLine2="                                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="926"
-            column="94"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnIndex();"
-        errorLine2="                                                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="944"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getColumnSpan();"
-        errorLine2="                                                                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="957"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowIndex();"
-        errorLine2="                                                                          ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="970"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).getRowSpan();"
-        errorLine2="                                                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="983"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isHeading();"
-        errorLine2="                                                                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1000"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isSelected();"
-        errorLine2="                                                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1013"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                        AccessibilityNodeInfo.RangeInfo.obtain(type, min, max, current));"
-        errorLine2="                                                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1043"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getCurrent();"
-        errorLine2="                                                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1062"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMax();"
-        errorLine2="                                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1075"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getMin();"
-        errorLine2="                                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1088"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return ((AccessibilityNodeInfo.RangeInfo) mInfo).getType();"
-        errorLine2="                                                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1105"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                mInfo = new TouchDelegateInfo(targetMap);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1125"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                return mInfo.getRegionCount();"
-        errorLine2="                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1147"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                return mInfo.getRegionAt(index);"
-        errorLine2="                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1166"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                AccessibilityNodeInfo info = mInfo.getTargetForRegion(region);"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1194"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    AccessibilityNodeInfo.obtain(root, virtualDescendantId));"
-        errorLine2="                                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1755"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.setSource(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1817"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.findFocus(focus));"
-        errorLine2="                                                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1834"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.focusSearch(direction));"
-        errorLine2="                                                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1856"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.addChild(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1928"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return mInfo.removeChild(child);"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1948"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return mInfo.removeChild(root, virtualDescendantId);"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="1966"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        ArrayList&lt;Integer> list = mInfo.getExtras()"
-        errorLine2="                                        ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2004"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putIntegerArrayList(key, list);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2008"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mInfo.addAction((AccessibilityNodeInfo.AccessibilityAction) action.mAction);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2031"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return mInfo.removeAction((AccessibilityNodeInfo.AccessibilityAction) action.mAction);"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2056"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return mInfo.performAction(action, arguments);"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2093"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.setMovementGranularities(granularities);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2113"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return mInfo.getMovementGranularities();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2124"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.setParent(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2210"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return mInfo.isVisibleToUser();"
-        errorLine2="                         ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2380"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.setVisibleToUser(visibleToUser);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2400"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return mInfo.isAccessibilityFocused();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2411"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mInfo.setAccessibilityFocused(focused);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2431"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return mInfo.isImportantForAccessibility();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2589"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            mInfo.setImportantForAccessibility(important);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2608"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().remove(SPANS_START_KEY);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2767"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().remove(SPANS_END_KEY);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2768"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().remove(SPANS_FLAGS_KEY);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2769"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().remove(SPANS_ID_KEY);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2770"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras().getCharSequence(STATE_DESCRIPTION_KEY);"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2815"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putCharSequence(STATE_DESCRIPTION_KEY, stateDescription);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2850"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            mInfo.setViewIdResourceName(viewId);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2878"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return mInfo.getViewIdResourceName();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2896"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getLiveRegion();"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2922"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setLiveRegion(mode);"
-        errorLine2="                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2942"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return mInfo.getDrawingOrder();"
-        errorLine2="                         ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2959"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            mInfo.setDrawingOrder(drawingOrderInParent);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2978"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            AccessibilityNodeInfo.CollectionInfo info = mInfo.getCollectionInfo();"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="2990"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setCollectionInfo((collectionInfo == null) ? null"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3000"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setCollectionItemInfo((collectionItemInfo == null) ? null"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3009"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            AccessibilityNodeInfo.CollectionItemInfo info = mInfo.getCollectionItemInfo();"
-        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3023"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            AccessibilityNodeInfo.RangeInfo info = mInfo.getRangeInfo();"
-        errorLine2="                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3038"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo.mInfo);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3058"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            actions = (List&lt;Object>) (List&lt;?>) mInfo.getActionList();"
-        errorLine2="                                                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3076"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setContentInvalid(contentInvalid);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3104"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.isContentInvalid();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3116"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return mInfo.isContextClickable();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3129"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            mInfo.setContextClickable(contextClickable);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3148"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mInfo.getHintText();"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3159"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras().getCharSequence(HINT_TEXT_KEY);"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3161"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mInfo.setHintText(hintText);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3181"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putCharSequence(HINT_TEXT_KEY, hintText);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3183"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mInfo.setError(error);"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3202"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return mInfo.getError();"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3213"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            mInfo.setLabelFor(labeled);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3227"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            mInfo.setLabelFor(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3247"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabelFor());"
-        errorLine2="                                                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3264"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            mInfo.setLabeledBy(label);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3278"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            mInfo.setLabeledBy(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3303"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getLabeledBy());"
-        errorLine2="                                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3320"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.canOpenPopup();"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3333"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setCanOpenPopup(opensPopup);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3351"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            List&lt;AccessibilityNodeInfo> nodes = mInfo.findAccessibilityNodeInfosByViewId(viewId);"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3379"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras();"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3405"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getInputType();"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3418"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setInputType(inputType);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3439"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mInfo.setMaxTextLength(max);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3460"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return mInfo.getMaxTextLength();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3472"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            mInfo.setTextSelection(start, end);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3493"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return mInfo.getTextSelectionStart();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3504"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return mInfo.getTextSelectionEnd();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3517"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getTraversalBefore());"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3534"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            mInfo.setTraversalBefore(view);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3556"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            mInfo.setTraversalBefore(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3583"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            return AccessibilityNodeInfoCompat.wrapNonNullInstance(mInfo.getTraversalAfter());"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3599"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            mInfo.setTraversalAfter(view);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3621"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            mInfo.setTraversalAfter(root, virtualDescendantId);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3647"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return AccessibilityWindowInfoCompat.wrapNonNullInstance(mInfo.getWindow());"
-        errorLine2="                                                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3660"
-            column="76"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.isDismissable();"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3673"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setDismissable(dismissable);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3691"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return mInfo.isEditable();"
-        errorLine2="                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3702"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            mInfo.setEditable(editable);"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3722"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.isMultiLine();"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3733"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.setMultiLine(multiLine);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3751"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mInfo.getTooltipText();"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3763"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras().getCharSequence(TOOLTIP_TEXT_KEY);"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3765"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mInfo.setTooltipText(tooltipText);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3785"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putCharSequence(TOOLTIP_TEXT_KEY, tooltipText);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3787"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mInfo.setPaneTitle(paneTitle);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3805"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putCharSequence(PANE_TITLE_KEY, paneTitle);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3807"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mInfo.getPaneTitle();"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3819"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras().getCharSequence(PANE_TITLE_KEY);"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3821"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mInfo.isScreenReaderFocusable();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3838"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mInfo.setScreenReaderFocusable(screenReaderFocusable);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3857"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mInfo.isShowingHintText();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3872"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mInfo.setShowingHintText(showingHintText);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3892"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mInfo.isHeading();"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3909"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mInfo.setHeading(isHeading);"
-        errorLine2="                  ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3929"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return mInfo.isTextEntryKey();"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3942"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            mInfo.setTextEntryKey(isTextEntryKey);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3960"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return mInfo.refresh();"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3977"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return mInfo.getExtras().getCharSequence(ROLE_DESCRIPTION_KEY);"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3989"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mInfo.getExtras().putCharSequence(ROLE_DESCRIPTION_KEY, roleDescription);"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="4021"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            TouchDelegateInfo delegateInfo = mInfo.getTouchDelegateInfo();"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="4043"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.accessibility.AccessibilityNodeInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            mInfo.setTouchDelegateInfo(delegatedInfo.mInfo);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="4070"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.accessibility.AccessibilityRecordCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            record.setSource(root, virtualDescendantId);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
-            line="140"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.view.accessibility.AccessibilityRecordCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return record.getMaxScrollX();"
-        errorLine2="                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
-            line="483"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.view.accessibility.AccessibilityRecordCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            record.setMaxScrollX(maxScrollX);"
-        errorLine2="                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
-            line="509"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.view.accessibility.AccessibilityRecordCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return record.getMaxScrollY();"
-        errorLine2="                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
-            line="533"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.view.accessibility.AccessibilityRecordCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            record.setMaxScrollY(maxScrollY);"
-        errorLine2="                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
-            line="559"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return info.loadDescription(packageManager);"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"
-            line="199"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.accessibilityservice.AccessibilityServiceInfoCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return info.getCapabilities();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/accessibilityservice/AccessibilityServiceInfoCompat.java"
-            line="288"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getType();"
-        errorLine2="                                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="100"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getLayer();"
-        errorLine2="                                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="114"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    ((AccessibilityWindowInfo) mInfo).getRoot());"
-        errorLine2="                                                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="128"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return wrapNonNullInstance(((AccessibilityWindowInfo) mInfo).getParent());"
-        errorLine2="                                                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="141"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getId();"
-        errorLine2="                                                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="154"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            ((AccessibilityWindowInfo) mInfo).getBoundsInScreen(outBounds);"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="167"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isActive();"
-        errorLine2="                                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="180"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isFocused();"
-        errorLine2="                                                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="193"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).isAccessibilityFocused();"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="206"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getChildCount();"
-        errorLine2="                                                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="219"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return wrapNonNullInstance(((AccessibilityWindowInfo) mInfo).getChild(index));"
-        errorLine2="                                                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="233"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return ((AccessibilityWindowInfo) mInfo).getTitle();"
-        errorLine2="                                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="247"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    ((AccessibilityWindowInfo) mInfo).getAnchor());"
-        errorLine2="                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="261"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return wrapNonNullInstance(AccessibilityWindowInfo.obtain());"
-        errorLine2="                                                               ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="275"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                            AccessibilityWindowInfo.obtain((AccessibilityWindowInfo) info.mInfo));"
-        errorLine2="                                                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="294"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.accessibility.AccessibilityWindowInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            ((AccessibilityWindowInfo) mInfo).recycle();"
-        errorLine2="                                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
-            line="310"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            activity.startActivityForResult(intent, requestCode, options);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="237"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            activity.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="274"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            activity.finishAffinity();"
-        errorLine2="                     ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="291"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            activity.finishAfterTransition();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="308"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            return activity.getReferrer();"
-        errorLine2="                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="333"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return activity.requireViewById(id);"
-        errorLine2="                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="366"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            activity.setEnterSharedElementCallback(frameworkCallback);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="390"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            activity.setExitSharedElementCallback(frameworkCallback);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="409"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            activity.postponeEnterTransition();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="415"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            activity.startPostponedEnterTransition();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="421"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            activity.requestPermissions(permissions, requestCode);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="516"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.ActivityCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return activity.shouldShowRequestPermissionRationale(permission);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="553"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                            listener.onSharedElementsReady();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityCompat.java"
-            line="697"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.ActivityManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return activityManager.isLowRamDevice();"
-        errorLine2="                                   ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityManagerCompat.java"
-            line="41"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeCustomAnimation(context,"
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="69"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeScaleUpAnimation("
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="99"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeClipRevealAnimation("
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="123"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeThumbnailScaleUpAnimation("
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="152"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeSceneTransitionAnimation("
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="180"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    ActivityOptions.makeSceneTransitionAnimation(activity, pairs));"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="217"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeTaskLaunchBehind());"
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="235"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.ActivityOptionsCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new ActivityOptionsCompatImpl(ActivityOptions.makeBasic());"
-        errorLine2="                                                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="247"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                mActivityOptions.requestUsageTimeReport(receiver);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="277"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    mActivityOptions.setLaunchBounds(screenSpacePixelRect));"
-        errorLine2="                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="288"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.ActivityOptionsCompat.ActivityOptionsCompatImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return mActivityOptions.getLaunchBounds();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
-            line="296"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.AlarmManagerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent),"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
-            line="60"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.AlarmManagerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent),"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
-            line="60"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AlarmManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
-            line="118"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.AlarmManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            alarmManager.setExact(type, triggerAtMillis, operation);"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
-            line="163"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AlarmManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AlarmManagerCompat.java"
-            line="223"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return AppOpsManager.permissionToOp(permission);"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="76"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return appOpsManager.noteOp(op, uid, packageName);"
-        errorLine2="                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="107"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return appOpsManager.noteOpNoThrow(op, uid, packageName);"
-        errorLine2="                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="127"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="157"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return appOpsManager.noteProxyOp(op, proxiedPackageName);"
-        errorLine2="                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="158"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="176"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.AppOpsManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return appOpsManager.noteProxyOpNoThrow(op, proxiedPackageName);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/AppOpsManagerCompat.java"
-            line="177"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.graphics.BitmapCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return bitmap.hasMipMap();"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
-            line="29"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.graphics.BitmapCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            bitmap.setHasMipMap(hasMipMap);"
-        errorLine2="                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
-            line="36"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.BitmapCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return bitmap.getAllocationByteCount();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/BitmapCompat.java"
-            line="49"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.graphics.BlendModeColorFilterCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                    ? new BlendModeColorFilter(color, blendMode) : null;"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java"
-            line="45"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.app.BundleCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return bundle.getBinder(key);"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/BundleCompat.java"
-            line="106"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.app.BundleCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            bundle.putBinder(key, binder);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/BundleCompat.java"
-            line="122"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.os.CancellationSignal is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                ((android.os.CancellationSignal) obj).cancel();"
-        errorLine2="                                                      ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/CancellationSignal.java"
-            line="84"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.os.CancellationSignal is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                mCancellationSignalObj = new android.os.CancellationSignal();"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/CancellationSignal.java"
-            line="143"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.os.CancellationSignal is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    ((android.os.CancellationSignal) mCancellationSignalObj).cancel();"
-        errorLine2="                                                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/CancellationSignal.java"
-            line="145"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    &quot;Color models must match (&quot; + foreground.getModel() + &quot; vs. &quot;"
-        errorLine2="                                                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="94"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                            + background.getModel() + &quot;)&quot;);"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="95"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        float[] src = s.getComponents();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="102"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        float[] dst = background.getComponents();"
-        errorLine2="                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="103"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        float sa = s.alpha();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="105"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        float da = background.alpha() * (1.0f - sa);"
-        errorLine2="                              ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="107"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        int ai = background.getComponentCount() - 1;"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="111"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.ColorUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.CompoundButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            button.setButtonTintList(tint);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
-            line="58"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.CompoundButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return button.getButtonTintList();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
-            line="72"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.CompoundButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            button.setButtonTintMode(tintMode);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
-            line="94"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.CompoundButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return button.getButtonTintMode();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
-            line="108"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.CompoundButtonCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return button.getButtonDrawable();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/CompoundButtonCompat.java"
-            line="124"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.os.ConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return LocaleListCompat.wrap(configuration.getLocales());"
-        errorLine2="                                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/ConfigurationCompat.java"
-            line="42"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.net.ConnectivityManagerCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return cm.isActiveNetworkMetered();"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"
-            line="101"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.net.ConnectivityManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return cm.getRestrictBackgroundStatus();"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/net/ConnectivityManagerCompat.java"
-            line="160"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.content.ContentResolverCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                return resolver.query(uri, projection, selection, selectionArgs, sortOrder,"
-        errorLine2="                                ~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContentResolverCompat.java"
-            line="81"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            context.startActivities(intents, options);"
-        errorLine2="                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="224"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            context.startActivity(intent, options);"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="251"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return context.getDataDir();"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="275"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return context.getObbDirs();"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="328"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return context.getExternalFilesDirs(type);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="381"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return context.getExternalCacheDirs();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="434"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return context.getDrawable(id);"
-        errorLine2="                           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="455"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getColorStateList(id);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="494"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getColor(id);"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="517"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return context.getNoBackupFilesDir();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="558"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return context.getCodeCacheDir();"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="582"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return context.createDeviceProtectedStorageContext();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="637"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return context.isDeviceProtectedStorage();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="651"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return context.getMainExecutor();"
-        errorLine2="                           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="664"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            context.startForegroundService(intent);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="696"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(serviceClass);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="716"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.ContextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemServiceName(serviceClass);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="736"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.database.CursorWindowCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return new CursorWindow(name, windowSizeBytes);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/database/CursorWindowCompat.java"
-            line="43"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.database.CursorWindowCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return new CursorWindow(name);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/database/CursorWindowCompat.java"
-            line="45"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.DialogCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return dialog.requireViewById(id);"
-        errorLine2="                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/DialogCompat.java"
-            line="56"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.DisplayCompat.ModeCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            mPhysicalSize = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCompat.java"
-            line="346"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.DisplayCompat.ModeCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            mPhysicalSize = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCompat.java"
-            line="346"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="        this(SDK_INT >= 28 ? new DisplayCutout(safeInsets, boundingRects) : null);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="56"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return new DisplayCutout(safeInsets.toPlatformInsets(), boundLeft,"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="88"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return new DisplayCutout(safeInsetRect, boundingRects);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="106"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetTop();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="119"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetBottom();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="128"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetLeft();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="137"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return ((DisplayCutout) mDisplayCutout).getSafeInsetRight();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="146"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.DisplayCutoutCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return ((DisplayCutout) mDisplayCutout).getBoundingRects();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
-            line="164"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.hardware.display.DisplayManagerCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                    .getDisplay(displayId);"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
-            line="86"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.hardware.display.DisplayManagerCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                    .getDisplays();"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
-            line="106"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.hardware.display.DisplayManagerCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                    .getDisplays(category);"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/display/DisplayManagerCompat.java"
-            line="135"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.DragAndDropPermissionsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    activity.requestDragAndDropPermissions(dragEvent);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
-            line="52"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.DragAndDropPermissionsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            ((DragAndDropPermissions) mDragAndDropPermissions).release();"
-        errorLine2="                                                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
-            line="65"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            drawable.setAutoMirrored(mirrored);"
-        errorLine2="                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="79"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return drawable.isAutoMirrored();"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="96"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.setHotspot(x, y);"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="111"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.setHotspotBounds(left, top, right, bottom);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="124"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.setTint(tint);"
-        errorLine2="                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="136"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.setTintList(tint);"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="150"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.setTintMode(tintMode);"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="164"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return drawable.getAlpha();"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="178"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.applyTheme(theme);"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="189"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return drawable.canApplyTheme();"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="198"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return drawable.getColorFilter();"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="211"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                clearColorFilter(((InsetDrawable) drawable).getDrawable());"
-        errorLine2="                                                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="232"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                        child = state.getChild(i);"
-        errorLine2="                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="242"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            drawable.inflate(res, parser, attrs, theme);"
-        errorLine2="                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="269"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return drawable.setLayoutDirection(layoutDirection);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="355"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.DrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return drawable.getLayoutDirection();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
-            line="392"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.EdgeEffectCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            edgeEffect.onPull(deltaDistance, displacement);"
-        errorLine2="                       ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
-            line="153"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.EnvironmentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return Environment.getExternalStorageState(path);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/EnvironmentCompat.java"
-            line="60"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.os.EnvironmentCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return Environment.getStorageState(path);"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/EnvironmentCompat.java"
-            line="62"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.FileProvider is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    File[] externalMediaDirs = context.getExternalMediaDirs();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/FileProvider.java"
-            line="702"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return (fp != null) &amp;&amp; fp.hasEnrolledFingerprints();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="68"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return (fp != null) &amp;&amp; fp.isHardwareDetected();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="83"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                fp.authenticate("
-        errorLine2="                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="113"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(FingerprintManager.class);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="127"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(FingerprintManager.class);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="130"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getCipher());"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="141"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getSignature());"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="143"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new FingerprintManager.CryptoObject(cryptoObject.getMac());"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="145"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        } else if (cryptoObject.getCipher() != null) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="155"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new CryptoObject(cryptoObject.getCipher());"
-        errorLine2="                                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="156"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        } else if (cryptoObject.getSignature() != null) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="157"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new CryptoObject(cryptoObject.getSignature());"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="158"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        } else if (cryptoObject.getMac() != null) {"
-        errorLine2="                                ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="159"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.hardware.fingerprint.FingerprintManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return new CryptoObject(cryptoObject.getMac());"
-        errorLine2="                                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="160"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        unwrapCryptoObject(result.getCryptoObject())));"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
-            line="183"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.res.FontResourcesParserCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return typedArray.getType(index);"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
-            line="231"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.provider.FontsContractCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                cursor = context.getContentResolver().query(uri, new String[] {"
-        errorLine2="                                                      ~~~~~">
-        <location
-            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="836"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.TOTAL_DURATION));"
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="355"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="359"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="364"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.DRAW_DURATION));"
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="369"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric(android.view.FrameMetrics.SYNC_DURATION));"
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="373"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="377"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="382"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="387"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                            frameMetrics.getMetric("
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/FrameMetricsAggregator.java"
-            line="392"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.location.GnssStatusWrapper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mWrapped.hasCarrierFrequencyHz(satelliteIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
-            line="89"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.location.GnssStatusWrapper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mWrapped.getCarrierFrequencyHz(satelliteIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/GnssStatusWrapper.java"
-            line="98"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.GravityCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            Gravity.apply(gravity, w, h, container, outRect, layoutDirection);"
-        errorLine2="                    ~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/GravityCompat.java"
-            line="65"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.GravityCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            Gravity.apply(gravity, w, h, container, xAdj, yAdj, outRect, layoutDirection);"
-        errorLine2="                    ~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/GravityCompat.java"
-            line="99"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.GravityCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            Gravity.applyDisplay(gravity, display, inoutObj, layoutDirection);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/GravityCompat.java"
-            line="127"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.os.HandlerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return Handler.createAsync(looper);"
-        errorLine2="                           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/HandlerCompat.java"
-            line="52"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.os.HandlerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return Handler.createAsync(looper, callback);"
-        errorLine2="                           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/HandlerCompat.java"
-            line="93"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.os.HandlerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return handler.postDelayed(r, token, delayMillis);"
-        errorLine2="                           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/HandlerCompat.java"
-            line="144"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.HtmlCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return Html.fromHtml(source, flags);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/HtmlCompat.java"
-            line="148"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.HtmlCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return Html.fromHtml(source, flags, imageGetter, tagHandler);"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/HtmlCompat.java"
-            line="163"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.HtmlCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return Html.toHtml(text, options);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/HtmlCompat.java"
-            line="176"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.ICUCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            ULocale uLocale = ULocale.addLikelySubtags(ULocale.forLocale(locale));"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/ICUCompat.java"
-            line="90"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.ICUCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            ULocale uLocale = ULocale.addLikelySubtags(ULocale.forLocale(locale));"
-        errorLine2="                                                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/ICUCompat.java"
-            line="90"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.ICUCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return uLocale.getScript();"
-        errorLine2="                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/ICUCompat.java"
-            line="91"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.ICUCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return ((Locale) sAddLikelySubtagsMethod.invoke(null, args)).getScript();"
-        errorLine2="                                                                             ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/ICUCompat.java"
-            line="95"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.ICUCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return locale.getScript();"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/ICUCompat.java"
-            line="101"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                icon = Icon.createWithBitmap((Bitmap) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="546"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="550"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    icon = Icon.createWithBitmap("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="552"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                icon = Icon.createWithResource(getResPackage(), mInt1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="557"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="560"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                icon = Icon.createWithContentUri((String) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="563"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="580"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="582"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            icon.setTintList(mTintList);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="590"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            icon.setTintMode(mTintMode);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="593"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return toIcon(context).loadDrawable(context);"
-        errorLine2="                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="641"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        return new AdaptiveIconDrawable(null,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="694"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return icon.getType();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1101"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return icon.getResPackage();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1129"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return icon.getResId();"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1158"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.graphics.drawable.IconCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return icon.getUri();"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1186"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getImageTintList();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="38"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setImageTintList(tintList);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="51"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if ((imageViewDrawable != null) &amp;&amp; (view.getImageTintList() != null)) {"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="57"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getImageTintMode();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="75"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setImageTintMode(mode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="89"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.ImageViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if ((imageViewDrawable != null) &amp;&amp; (view.getImageTintList() != null)) {"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ImageViewCompat.java"
-            line="95"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.view.inputmethod.InputConnectionCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return inputConnection.commitContent("
-        errorLine2="                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java"
-            line="145"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.graphics.Insets is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="        return android.graphics.Insets.of(left, top, right, bottom);"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/core/graphics/Insets.java"
-            line="196"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.content.IntentCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return Intent.makeMainSelectorActivity(selectorAction, selectorCategory);"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/IntentCompat.java"
-            line="108"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.JobIntentService.JobServiceEngineImpl.WrapperWorkItem is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                return mJobWork.getIntent();"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/JobIntentService.java"
-            line="260"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.JobIntentService.JobServiceEngineImpl.WrapperWorkItem is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        mParams.completeWork(mJobWork);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/JobIntentService.java"
-            line="267"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.util.LinkifyCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            Linkify.addLinks(text, pattern, defaultScheme, schemes, matchFilter, transformFilter);"
-        errorLine2="                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/util/LinkifyCompat.java"
-            line="260"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.util.LinkifyCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return Linkify.addLinks(spannable, pattern, defaultScheme, schemes, matchFilter,"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/util/LinkifyCompat.java"
-            line="336"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.widget.ListPopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return listPopupWindow.createDragToOpenListener(src);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
-            line="98"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.widget.ListViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            listView.scrollListBy(y);"
-        errorLine2="                     ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ListViewCompat.java"
-            line="39"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.widget.ListViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return listView.canScrollList(direction);"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/ListViewCompat.java"
-            line="69"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.os.LocaleListCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return wrap(new LocaleList(localeList));"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/LocaleListCompat.java"
-            line="74"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.LocaleListCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        ? Locale.forLanguageTag(tags[i])"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/LocaleListCompat.java"
-            line="165"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.os.LocaleListCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return LocaleListCompat.wrap(LocaleList.getAdjustedDefault());"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/LocaleListCompat.java"
-            line="206"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.os.LocaleListCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return LocaleListCompat.wrap(LocaleList.getDefault());"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/LocaleListCompat.java"
-            line="226"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.os.LocaleListCompatWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            final String script = locale.getScript();"
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/LocaleListCompatWrapper.java"
-            line="163"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.location.LocationManagerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return locationManager.isLocationEnabled();"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
-            line="71"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.location.LocationManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                if (locationManager.registerGnssStatusCallback(transport, baseHandler)) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
-            line="189"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.location.LocationManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    locationManager.unregisterGnssStatusCallback(transport);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
-            line="274"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.location.LocationManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    locationManager.unregisterGnssStatusCallback(transport);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/location/LocationManagerCompat.java"
-            line="283"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return lp.getMarginStart();"
-        errorLine2="                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="43"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return lp.getMarginEnd();"
-        errorLine2="                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="62"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            lp.setMarginStart(marginStart);"
-        errorLine2="               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="81"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            lp.setMarginEnd(marginEnd);"
-        errorLine2="               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="100"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return lp.isMarginRelative();"
-        errorLine2="                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="113"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            result = lp.getLayoutDirection();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="128"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            lp.setLayoutDirection(layoutDirection);"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="151"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.MarginLayoutParamsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            lp.resolveLayoutDirection(layoutDirection);"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
-            line="162"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="        LocaleList localeList = context.getResources().getConfiguration().getLocales();"
-        errorLine2="                                                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="60"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="        int numLanguagesSupportedByService = serviceInfo.getNamedContentLocales().size();"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="62"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="        for (Locale l : serviceInfo.getNamedContentLocales()) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="69"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            supportedLanguages[i] = l.toLanguageTag();"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="70"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="        Locale bestLocale = localeList.getFirstMatch(supportedLanguages);"
-        errorLine2="                                       ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="74"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.telephony.mbms.MbmsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="        return bestLocale == null ? null : serviceInfo.getNameForLocale(bestLocale);"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/telephony/mbms/MbmsHelper.java"
-            line="75"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.MenuCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            menu.setGroupDividerEnabled(enabled);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuCompat.java"
-            line="51"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setContentDescription(contentDescription);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="325"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getContentDescription();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="339"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setTooltipText(tooltipText);"
-        errorLine2="                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="354"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getTooltipText();"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="368"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setShortcut(numericChar, alphaChar, numericModifiers, alphaModifiers);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="401"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setNumericShortcut(numericChar, numericModifiers);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="421"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getNumericModifiers();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="440"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setAlphabeticShortcut(alphaChar, alphaModifiers);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="466"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getAlphabeticModifiers();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="485"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setIconTintList(tint);"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="506"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getIconTintList();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="519"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            item.setIconTintMode(tintMode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="537"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.MenuItemCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return item.getIconTintMode();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/MenuItemCompat.java"
-            line="552"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.MessageCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            message.setAsynchronous(async);"
-        errorLine2="                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/MessageCompat.java"
-            line="72"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.MessageCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="                message.setAsynchronous(async);"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/MessageCompat.java"
-            line="79"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.MessageCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="            return message.isAsynchronous();"
-        errorLine2="                           ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/MessageCompat.java"
-            line="98"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.os.MessageCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="                return message.isAsynchronous();"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/MessageCompat.java"
-            line="104"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NavUtils is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return sourceActivity.shouldUpRecreateTask(targetIntent);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NavUtils.java"
-            line="61"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NavUtils is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            sourceActivity.navigateUpTo(upIntent);"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NavUtils.java"
-            line="109"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NavUtils is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Intent result = sourceActivity.getParentActivityIntent();"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NavUtils.java"
-            line="132"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.NestedScrollView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.LOLLIPOP || getClipToPadding()) {"
-        errorLine2="                                                                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2007"
-            column="77"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.NestedScrollView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &amp;&amp; getClipToPadding()) {"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2011"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.NestedScrollView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.LOLLIPOP || getClipToPadding()) {"
-        errorLine2="                                                                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2028"
-            column="77"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.widget.NestedScrollView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &amp;&amp; getClipToPadding()) {"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2032"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        this(channel.getId(), channel.getImportance());"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="284"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        this(channel.getId(), channel.getImportance());"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="284"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mName = channel.getName();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="286"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mDescription = channel.getDescription();"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="287"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mGroupId = channel.getGroup();"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="288"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mShowBadge = channel.canShowBadge();"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="289"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mSound = channel.getSound();"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="290"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mAudioAttributes = channel.getAudioAttributes();"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="291"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mLights = channel.shouldShowLights();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="292"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mLightColor = channel.getLightColor();"
-        errorLine2="                              ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="293"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mVibrationEnabled = channel.shouldVibrate();"
-        errorLine2="                                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="294"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mVibrationPattern = channel.getVibrationPattern();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="295"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mBypassDnd = channel.canBypassDnd();"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="301"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mLockscreenVisibility = channel.getLockscreenVisibility();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="302"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            mCanBubble = channel.canBubble();"
-        errorLine2="                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="304"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        NotificationChannel channel = new NotificationChannel(mId, mName, mImportance);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="320"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setDescription(mDescription);"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="321"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setGroup(mGroupId);"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="322"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setShowBadge(mShowBadge);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="323"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setSound(mSound, mAudioAttributes);"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="324"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.enableLights(mLights);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="325"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setLightColor(mLightColor);"
-        errorLine2="                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="326"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.setVibrationPattern(mVibrationPattern);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="327"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        channel.enableVibration(mVibrationEnabled);"
-        errorLine2="                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"
-            line="328"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        this(group.getId());"
-        errorLine2="                   ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="115"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        mName = group.getName();"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="117"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mDescription = group.getDescription();"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="119"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mBlocked = group.isBlocked();"
-        errorLine2="                             ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="123"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mChannels = getChannelsCompat(group.getChannels());"
-        errorLine2="                                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="124"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            if (mId.equals(channel.getGroup())) {"
-        errorLine2="                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="136"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        NotificationChannelGroup group = new NotificationChannelGroup(mId, mName);"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="152"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationChannelGroupCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            group.setDescription(mDescription);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"
-            line="154"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                this.mSmallIcon = notification.getSmallIcon();"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="959"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1466"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1467"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1468"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1469"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1495"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1496"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .setLegacyStreamType(streamType)"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1497"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="1498"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
-        errorLine2="                                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2048"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        .createContentView();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2049"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
-        errorLine2="                                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2082"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        .createBigContentView();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2083"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        Notification.Builder.recoverBuilder(mContext, notification);"
-        errorLine2="                                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2117"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                return platformBuilder.createHeadsUpContentView();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2118"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.Style is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX,"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2788"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.Style is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2792"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Style is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        contentView.setChronometerCountDown(R.id.chronometer,"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2803"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.Style is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                outerView.setViewPadding(R.id.notification_main_column_container,"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="2884"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigPictureStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                        new Notification.BigPictureStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3002"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigPictureStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle)"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3003"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigPictureStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                                .bigPicture(mPicture);"
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3004"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigTextStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                        new Notification.BigTextStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3197"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigTextStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle)"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3198"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigTextStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                                .bigText(mBigText);"
-        errorLine2="                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3199"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.BigTextStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    style.setSummaryText(mSummaryText);"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3201"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.toAndroidPerson());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3548"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.getName());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3550"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    frameworkStyle.addMessage(message.toAndroidMessage());"
-        errorLine2="                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3554"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        frameworkStyle.addHistoricMessage(historicMessage.toAndroidMessage());"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3559"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    frameworkStyle.setConversationTitle(mConversationTitle);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3571"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    frameworkStyle.setGroupConversation(mIsGroupConversation);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3577"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                frameworkStyle.setBuilder(builder.getBuilder());"
-        errorLine2="                               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3579"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    new Notification.BigTextStyle(builder.getBuilder())"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3612"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                            .setBigContentTitle(null)"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3613"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.MessagingStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                            .bigText(completeMessage);"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="3614"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4000"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4004"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    frameworkMessage.setData(getDataMimeType(), getDataUri());"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4010"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.InboxStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                        new Notification.InboxStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4101"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.InboxStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4102"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.InboxStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    style.setSummaryText(mSummaryText);"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4104"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.InboxStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    style.addLine(text);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4107"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4201"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4201"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="                button.setContentDescription(R.id.action_container, action.title);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4319"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                if (Build.VERSION.SDK_INT >= 23 &amp;&amp; action.getIcon() != null) {"
-        errorLine2="                                                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4603"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    IconCompat iconCompat = IconCompat.createFromIcon(action.getIcon());"
-        errorLine2="                                                                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4604"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    android.app.RemoteInput[] remoteInputs = action.getRemoteInputs();"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4612"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    builder.mAllowGeneratedReplies = action.getAllowGeneratedReplies();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4620"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    builder.setSemanticAction(action.getSemanticAction());"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4623"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat.Action.Builder is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                    builder.setContextual(action.isContextual());"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="4626"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5461"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5470"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                actionBuilder.setAllowGeneratedReplies(actionCompat.getAllowGeneratedReplies());"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5482"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            actionBuilder.addExtras(actionExtras);"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5484"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    actionBuilder.addRemoteInput(remoteInput);"
-        errorLine2="                                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5489"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.WearableExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return actionBuilder.build();"
-        errorLine2="                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="5492"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    ? new RemoteInput(remoteInput.getResultKey(),"
-        errorLine2="                                                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6238"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    remoteInput.getLabel(),"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6239"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    remoteInput.getChoices(),"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6240"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    remoteInput.getAllowFreeFormInput(),"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6241"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                            ? remoteInput.getEditChoicesBeforeSending()"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6243"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    remoteInput.getExtras(),"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6245"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        new android.app.RemoteInput.Builder(remoteInputCompat.getResultKey())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6271"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                                .setLabel(remoteInputCompat.getLabel())"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6272"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                                .setChoices(remoteInputCompat.getChoices())"
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6273"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                                .setAllowFreeFormInput(remoteInputCompat.getAllowFreeFormInput())"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6274"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                                .addExtras(remoteInputCompat.getExtras())"
-        errorLine2="                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6275"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat.CarExtender is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                                .build();"
-        errorLine2="                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="6276"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return BubbleMetadata.fromPlatform(notification.getBubbleMetadata());"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7253"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="        final android.app.RemoteInput[] srcArray = action.getRemoteInputs();"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7263"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        src.getResultKey(),"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7271"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        src.getLabel(),"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7272"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        src.getChoices(),"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7273"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        src.getAllowFreeFormInput(),"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7274"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                                ? src.getEditChoicesBeforeSending()"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7276"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        src.getExtras(),"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7278"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7285"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    || action.getAllowGeneratedReplies();"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7287"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7289"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                action.getExtras().getBoolean(Action.EXTRA_SHOWS_USER_INTERFACE, true);"
-        errorLine2="                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7294"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            semanticAction = action.getSemanticAction();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7298"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            semanticAction = action.getExtras().getInt("
-        errorLine2="                                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7300"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="        final boolean isContextual = Build.VERSION.SDK_INT >= 29 ? action.isContextual() : false;"
-        errorLine2="                                                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7304"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (action.getIcon() == null &amp;&amp; action.icon != 0) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7307"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        action.getExtras(), remoteInputs, null, allowGeneratedReplies,"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7309"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            IconCompat icon = action.getIcon() == null"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7312"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    ? null : IconCompat.createFromIconOrNullIfZeroResId(action.getIcon());"
-        errorLine2="                                                                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7313"
-            column="80"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return new Action(icon, action.title, action.actionIntent, action.getExtras(),"
-        errorLine2="                                                                              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7314"
-            column="79"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return new Action(action.icon, action.title, action.actionIntent, action.getExtras(),"
-        errorLine2="                                                                                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7318"
-            column="86"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return notification.getGroup();"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7434"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return notification.getSortKey();"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7542"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getChannelId();"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7558"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getTimeoutAfter();"
-        errorLine2="                                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7570"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getBadgeIconType();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7583"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getShortcutId();"
-        errorLine2="                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7595"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getSettingsText();"
-        errorLine2="                                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7606"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            LocusId locusId = notification.getLocusId();"
-        errorLine2="                                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7622"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return notification.getGroupAlertBehavior();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7637"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return notification.getAllowSystemGeneratedContextualActions();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"
-            line="7650"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mBuilder = new Notification.Builder(b.mContext, b.mChannelId);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="72"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            mBuilder.setSubText(b.mSubText)"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="101"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    .setUsesChronometer(b.mUseChronometer)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="102"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    .setPriority(b.mPriority);"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="103"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            mBuilder.setShowWhen(b.mShowWhen);"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="133"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            mBuilder.setLocalOnly(b.mLocalOnly)"
-        errorLine2="                     ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="145"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    .setGroup(b.mGroupKey)"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="146"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    .setGroupSummary(b.mGroupSummary)"
-        errorLine2="                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="147"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    .setSortKey(b.mSortKey);"
-        errorLine2="                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="148"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mBuilder.setCategory(b.mCategory)"
-        errorLine2="                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="153"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    .setColor(b.mColor)"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="154"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    .setVisibility(b.mVisibility)"
-        errorLine2="                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="155"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    .setPublicVersion(b.mPublicVersion)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="156"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    .setSound(n.sound, n.audioAttributes);"
-        errorLine2="                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="157"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    mBuilder.addPerson(person);"
-        errorLine2="                             ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="168"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                mBuilder.setSmallIcon(b.mSmallIcon);"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="202"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mBuilder.setExtras(b.mExtras)"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="206"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                    .setRemoteInputHistory(b.mRemoteInputHistory);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="207"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                mBuilder.setCustomContentView(b.mContentView);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="209"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                mBuilder.setCustomBigContentView(b.mBigContentView);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="212"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                mBuilder.setCustomHeadsUpContentView(b.mHeadsUpContentView);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="215"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mBuilder.setBadgeIconType(b.mBadgeIcon)"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="219"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    .setSettingsText(b.mSettingsText)"
-        errorLine2="                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="220"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    .setShortcutId(b.mShortcutId)"
-        errorLine2="                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="221"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    .setTimeoutAfter(b.mTimeout)"
-        errorLine2="                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="222"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    .setGroupAlertBehavior(b.mGroupAlertBehavior);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="223"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                mBuilder.setColorized(b.mColorized);"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="225"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                mBuilder.addPerson(p.toAndroidPerson());"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="237"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            mBuilder.setAllowSystemGeneratedContextualActions("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="241"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            mBuilder.setBubbleMetadata("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="244"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                mBuilder.setLocusId(b.mLocusId.toLocusId());"
-        errorLine2="                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="247"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    mBuilder.setGroup(NotificationCompat.GROUP_KEY_SILENT);"
-        errorLine2="                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="266"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                mBuilder.setGroupAlertBehavior(mGroupAlertBehavior);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="268"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="353"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="358"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                    actionBuilder.addRemoteInput(remoteInput);"
-        errorLine2="                                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="366"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                actionBuilder.setAllowGeneratedReplies(action.getAllowGeneratedReplies());"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="378"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                actionBuilder.setSemanticAction(action.getSemanticAction());"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="384"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                actionBuilder.setContextual(action.isContextual());"
-        errorLine2="                              ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="388"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            actionBuilder.addExtras(actionExtras);"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="393"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            mBuilder.addAction(actionBuilder.build());"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="394"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            mBuilder.addAction(actionBuilder.build());"
-        errorLine2="                                             ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="394"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return mBuilder.build();"
-        errorLine2="                            ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="404"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Notification notification =  mBuilder.build();"
-        errorLine2="                                                  ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="406"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="410"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="416"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mBuilder.setExtras(mExtras);"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="425"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Notification notification = mBuilder.build();"
-        errorLine2="                                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="426"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="439"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="445"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mBuilder.setExtras(mExtras);"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="453"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Notification notification = mBuilder.build();"
-        errorLine2="                                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="454"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="464"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                if (notification.getGroup() != null"
-        errorLine2="                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="470"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mBuilder.setExtras(mExtras);"
-        errorLine2="                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="486"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Notification notification = mBuilder.build();"
-        errorLine2="                                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="487"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.NotificationCompatBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            Notification notification = mBuilder.build();"
-        errorLine2="                                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
-            line="496"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return mNotificationManager.areNotificationsEnabled();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="232"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return mNotificationManager.getImportance();"
-        errorLine2="                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="263"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannel(channel);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="291"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannelGroup(group);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="330"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannels(channels);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="357"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannels(platformChannels);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="376"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannelGroups(groups);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="390"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.createNotificationChannelGroups(platformGroups);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="409"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.deleteNotificationChannel(channelId);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="424"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            mNotificationManager.deleteNotificationChannelGroup(groupId);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="436"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            for (NotificationChannel channel : mNotificationManager.getNotificationChannels()) {"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="451"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                if (channelIds.contains(channel.getId())) {"
-        errorLine2="                                                ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="452"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="459"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
-        errorLine2="                                                                       ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="459"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mNotificationManager.getNotificationChannel(channelId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="472"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mNotificationManager.getNotificationChannelGroup(channelGroupId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="538"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                if (group.getId().equals(channelGroupId)) return group;"
-        errorLine2="                          ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="542"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mNotificationManager.getNotificationChannels();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="580"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.NotificationManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return mNotificationManager.getNotificationChannelGroups();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"
-            line="611"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.util.ObjectsCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return Objects.equals(a, b);"
-        errorLine2="                           ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/util/ObjectsCompat.java"
-            line="51"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.util.ObjectsCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return Objects.hash(values);"
-        errorLine2="                           ~~~~">
-        <location
-            file="src/main/java/androidx/core/util/ObjectsCompat.java"
-            line="93"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.content.pm.PackageInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return info.getLongVersionCode();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/PackageInfoCompat.java"
-            line="51"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.graphics.PaintCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return paint.hasGlyph(string);"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="52"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.graphics.PaintCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="127"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.animation.PathInterpolatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new PathInterpolator(path);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
-            line="49"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.animation.PathInterpolatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new PathInterpolator(controlX, controlY);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
-            line="64"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.animation.PathInterpolatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new PathInterpolator(controlX1, controlY1, controlX2, controlY2);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
-            line="82"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.graphics.PathUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        float[] pathData = path.approximate(error);"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathUtils.java"
-            line="60"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.content.pm.PermissionInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return permissionInfo.getProtection();"
-        errorLine2="                                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/PermissionInfoCompat.java"
-            line="75"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.content.pm.PermissionInfoCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return permissionInfo.getProtectionFlags();"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/PermissionInfoCompat.java"
-            line="89"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                .setName(bundle.getString(NAME_KEY))"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="71"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                .setUri(bundle.getString(URI_KEY))"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="72"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                .setKey(bundle.getString(KEY_KEY))"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="73"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="                .setBot(bundle.getBoolean(IS_BOT_KEY))"
-        errorLine2="                               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="74"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="                .setImportant(bundle.getBoolean(IS_IMPORTANT_KEY))"
-        errorLine2="                                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="75"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setName(person.getName())"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="89"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        (person.getIcon() != null)"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="91"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                                ? IconCompat.createFromIcon(person.getIcon())"
-        errorLine2="                                                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="92"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setUri(person.getUri())"
-        errorLine2="                               ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="94"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setKey(person.getKey())"
-        errorLine2="                               ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="95"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setBot(person.isBot())"
-        errorLine2="                               ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="96"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setImportant(person.isImportant())"
-        errorLine2="                                     ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="97"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        PersistableBundle result = new PersistableBundle();"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="151"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        result.putString(NAME_KEY, mName != null ? mName.toString() : null);"
-        errorLine2="               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="152"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        result.putString(URI_KEY, mUri);"
-        errorLine2="               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="153"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        result.putString(KEY_KEY, mKey);"
-        errorLine2="               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="154"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="        result.putBoolean(IS_BOT_KEY, mIsBot);"
-        errorLine2="               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="155"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="        result.putBoolean(IS_IMPORTANT_KEY, mIsImportant);"
-        errorLine2="               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="156"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="        return new android.app.Person.Builder()"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="175"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setName(getName())"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="176"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setIcon((getIcon() != null) ? getIcon().toIcon() : null)"
-        errorLine2="                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="177"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setUri(getUri())"
-        errorLine2="                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="178"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setKey(getKey())"
-        errorLine2="                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="179"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setBot(isBot())"
-        errorLine2="                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="180"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .setImportant(isImportant())"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="181"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.Person is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                .build();"
-        errorLine2="                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/Person.java"
-            line="182"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.PointerIconCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return new PointerIconCompat(PointerIcon.getSystemIcon(context, style));"
-        errorLine2="                                                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/PointerIconCompat.java"
-            line="131"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.PointerIconCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return new PointerIconCompat(PointerIcon.create(bitmap, hotSpotX, hotSpotY));"
-        errorLine2="                                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/PointerIconCompat.java"
-            line="152"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.PointerIconCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return new PointerIconCompat(PointerIcon.load(resources, resourceId));"
-        errorLine2="                                                     ~~~~">
-        <location
-            file="src/main/java/androidx/core/view/PointerIconCompat.java"
-            line="181"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.widget.PopupMenuCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return ((PopupMenu) popupMenu).getDragToOpenListener();"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupMenuCompat.java"
-            line="56"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.widget.PopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            popup.showAsDropDown(anchor, xoff, yoff, gravity);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
-            line="69"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.PopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            popupWindow.setOverlapAnchor(overlapAnchor);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
-            line="91"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.PopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return popupWindow.getOverlapAnchor();"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
-            line="120"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.PopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            popupWindow.setWindowLayoutType(layoutType);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
-            line="154"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.PopupWindowCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return popupWindow.getWindowLayoutType();"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/PopupWindowCompat.java"
-            line="184"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                mWrapped = new PrecomputedText.Params.Builder(paint)"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="199"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        .setBreakStrategy(strategy)"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="200"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        .setHyphenationFrequency(frequency)"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="201"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        .setTextDirection(textDir)"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="202"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="203"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mPaint = wrapped.getTextPaint();"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="215"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mTextDir = wrapped.getTextDirection();"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="216"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mBreakStrategy = wrapped.getBreakStrategy();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="217"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            mHyphenationFrequency = wrapped.getHyphenationFrequency();"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="218"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (mPaint.getLetterSpacing() != other.getTextPaint().getLetterSpacing()) {"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="294"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (mPaint.getLetterSpacing() != other.getTextPaint().getLetterSpacing()) {"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="294"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                if (!TextUtils.equals(mPaint.getFontFeatureSettings(),"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="297"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        other.getTextPaint().getFontFeatureSettings())) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="298"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                if (!mPaint.getTextLocales().equals(other.getTextPaint().getTextLocales())) {"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="306"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                if (!mPaint.getTextLocales().equals(other.getTextPaint().getTextLocales())) {"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="306"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="310"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                if (!mPaint.getTextLocale().equals(other.getTextPaint().getTextLocale())) {"
-        errorLine2="                                                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="310"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getLetterSpacing(), mPaint.getFlags(),"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="354"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        mPaint.getTextLocales(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
-        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="355"
-            column="79"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        mPaint.getTextLocales(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="355"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getLetterSpacing(), mPaint.getFlags(),"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="359"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
-        errorLine2="                               ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="360"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        mPaint.getTextLocale(), mPaint.getTypeface(), mPaint.isElegantTextHeight(),"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="360"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
-        errorLine2="                                                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="364"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                        mPaint.getTextSkewX(), mPaint.getFlags(), mPaint.getTextLocale(),"
-        errorLine2="                                                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="368"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                sb.append(&quot;, letterSpacing=&quot; + mPaint.getLetterSpacing());"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="384"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                sb.append(&quot;, elegantTextHeight=&quot; + mPaint.isElegantTextHeight());"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="385"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                sb.append(&quot;, textLocale=&quot; + mPaint.getTextLocales());"
-        errorLine2="                                                   ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="388"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                sb.append(&quot;, textLocale=&quot; + mPaint.getTextLocale());"
-        errorLine2="                                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="390"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.text.PrecomputedTextCompat.Params is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                sb.append(&quot;, variationSettings=&quot; + mPaint.getFontVariationSettings());"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="394"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        PrecomputedText.create(text, params.mWrapped), params);"
-        errorLine2="                                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="440"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                StaticLayout.Builder.obtain(text, 0, text.length(), params.getTextPaint(),"
-        errorLine2="                                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="468"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        .setBreakStrategy(params.getBreakStrategy())"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="470"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        .setHyphenationFrequency(params.getHyphenationFrequency())"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="471"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        .setTextDirection(params.getTextDirection())"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="472"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="473"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mWrapped.getParagraphCount();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="532"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mWrapped.getParagraphStart(paraIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="545"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.text.PrecomputedTextCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return mWrapped.getParagraphEnd(paraIndex);"
-        errorLine2="                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
-            line="558"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                IconCompat.createFromIcon(remoteAction.getIcon()), remoteAction.getTitle(),"
-        errorLine2="                                                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="117"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                IconCompat.createFromIcon(remoteAction.getIcon()), remoteAction.getTitle(),"
-        errorLine2="                                                                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="117"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                remoteAction.getContentDescription(), remoteAction.getActionIntent());"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="118"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                remoteAction.getContentDescription(), remoteAction.getActionIntent());"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="118"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        action.setEnabled(remoteAction.isEnabled());"
-        errorLine2="                                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="119"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            action.setShouldShowIcon(remoteAction.shouldShowIcon());"
-        errorLine2="                                                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="121"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        RemoteAction action = new RemoteAction(mIcon.toIcon(), mTitle, mContentDescription,"
-        errorLine2="                              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="190"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="        action.setEnabled(isEnabled());"
-        errorLine2="               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="192"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.RemoteActionCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            action.setShouldShowIcon(shouldShowIcon());"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteActionCompat.java"
-            line="194"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return android.app.RemoteInput.getDataResultsFromIntent(intent, remoteInputResultKey);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="339"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            return android.app.RemoteInput.getResultsFromIntent(intent);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="377"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            android.app.RemoteInput.addResultsToIntent(fromCompat(remoteInputs), intent, results);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="403"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                android.app.RemoteInput.addResultsToIntent("
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="426"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            intent.setClipData(ClipData.newIntent(RemoteInput.RESULTS_CLIP_LABEL, clipDataIntent));"
-        errorLine2="                   ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="452"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            android.app.RemoteInput.addDataResultToIntent(fromCompat(remoteInput), intent, results);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="467"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            intent.setClipData(ClipData.newIntent(RemoteInput.RESULTS_CLIP_LABEL, clipDataIntent));"
-        errorLine2="                   ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="487"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            android.app.RemoteInput.setResultsSource(intent, source);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="506"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            intent.setClipData(ClipData.newIntent(RESULTS_CLIP_LABEL, clipDataIntent));"
-        errorLine2="                   ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="513"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return android.app.RemoteInput.getResultsSource(intent);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="531"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                new android.app.RemoteInput.Builder(src.getResultKey())"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="562"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setLabel(src.getLabel())"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="563"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setChoices(src.getChoices())"
-        errorLine2="                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="564"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setAllowFreeFormInput(src.getAllowFreeFormInput())"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="565"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .addExtras(src.getExtras());"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="566"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="568"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="        return builder.build();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="570"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                new RemoteInput.Builder(src.getResultKey())"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="576"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setLabel(src.getLabel())"
-        errorLine2="                                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="577"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setChoices(src.getChoices())"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="578"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .setAllowFreeFormInput(src.getAllowFreeFormInput())"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="579"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                        .addExtras(src.getExtras());"
-        errorLine2="                                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="580"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="582"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.RemoteInput is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="        ClipData clipData = intent.getClipData();"
-        errorLine2="                                   ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/RemoteInput.java"
-            line="589"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.res.ResourcesCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return res.getDrawable(id, theme);"
-        errorLine2="                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="94"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.res.ResourcesCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return res.getDrawableForDensity(id, density, theme);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="127"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.content.res.ResourcesCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return res.getDrawableForDensity(id, density);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="129"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.res.ResourcesCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return res.getColor(id, theme);"
-        errorLine2="                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="157"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.res.ResourcesCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return res.getColorStateList(id, theme);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="187"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.database.sqlite.SQLiteCursorCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            cursor.setFillWindowForwardOnly(fillWindowForwardOnly);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java"
-            line="46"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ScaleGestureDetectorCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            scaleGestureDetector.setQuickScaleEnabled(enabled);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
-            line="54"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ScaleGestureDetectorCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return scaleGestureDetector.isQuickScaleEnabled();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
-            line="79"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.app.ServiceCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            service.stopForeground(flags);"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ServiceCompat.java"
-            line="99"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.ShareCompat.IntentReader is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                        result = Html.escapeHtml(text);"
-        errorLine2="                                      ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/ShareCompat.java"
-            line="835"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="        ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mContext, mId)"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="101"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                .setShortLabel(mLabel)"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="102"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                .setIntents(mIntents);"
-        errorLine2="                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="103"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setIcon(mIcon.toIcon(mContext));"
-        errorLine2="                    ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="105"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setLongLabel(mLongLabel);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="108"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setDisabledMessage(mDisabledMessage);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="111"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setActivity(mActivity);"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="114"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setCategories(mCategories);"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="117"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="        builder.setRank(mRank);"
-        errorLine2="                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="119"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setExtras(mExtras);"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="121"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                builder.setPersons(persons);"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="129"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                builder.setLocusId(mLocusId.toLocusId());"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="132"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            builder.setLongLived(mIsLongLived);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="134"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            builder.setExtras(buildLegacyExtrasBundle());"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="139"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="        return builder.build();"
-        errorLine2="                       ~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="141"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mExtras = new PersistableBundle();"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="151"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mExtras.putInt(EXTRA_PERSON_COUNT, mPersons.length);"
-        errorLine2="                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="154"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                mExtras.putPersistableBundle(EXTRA_PERSON_ + (i + 1),"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="156"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            mExtras.putString(EXTRA_LOCUS_ID, mLocusId.getId());"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="161"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="        mExtras.putBoolean(EXTRA_LONG_LIVED, mIsLongLived);"
-        errorLine2="                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="163"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        if (bundle == null || !bundle.containsKey(EXTRA_PERSON_COUNT)) {"
-        errorLine2="                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="330"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        int personsLength = bundle.getInt(EXTRA_PERSON_COUNT);"
-        errorLine2="                                   ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="334"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    bundle.getPersistableBundle(EXTRA_PERSON_ + (i + 1)));"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="338"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        if (bundle == null || !bundle.containsKey(EXTRA_LONG_LIVED)) {"
-        errorLine2="                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="350"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
-        errorLine1="        return bundle.getBoolean(EXTRA_LONG_LIVED);"
-        errorLine2="                      ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="353"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            if (shortcutInfo.getLocusId() == null) return null;"
-        errorLine2="                             ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="467"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return LocusIdCompat.toLocusIdCompat(shortcutInfo.getLocusId());"
-        errorLine2="                                                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="468"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return getLocusIdFromExtra(shortcutInfo.getExtras());"
-        errorLine2="                                                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="470"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.content.pm.ShortcutInfoCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        final String locusId = bundle.getString(EXTRA_LOCUS_ID);"
-        errorLine2="                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="482"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mId = shortcutInfo.getId();"
-        errorLine2="                                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="548"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mPackageName = shortcutInfo.getPackage();"
-        errorLine2="                                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="549"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            Intent[] intents = shortcutInfo.getIntents();"
-        errorLine2="                                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="550"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mActivity = shortcutInfo.getActivity();"
-        errorLine2="                                           ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="552"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mLabel = shortcutInfo.getShortLabel();"
-        errorLine2="                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="553"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mLongLabel = shortcutInfo.getLongLabel();"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="554"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mDisabledMessage = shortcutInfo.getDisabledMessage();"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="555"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                mInfo.mDisabledReason = shortcutInfo.getDisabledReason();"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="557"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                mInfo.mDisabledReason = shortcutInfo.isEnabled()"
-        errorLine2="                                                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="559"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mCategories = shortcutInfo.getCategories();"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="563"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mPersons = ShortcutInfoCompat.getPersonsFromExtra(shortcutInfo.getExtras());"
-        errorLine2="                                                                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="564"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mUser = shortcutInfo.getUserHandle();"
-        errorLine2="                                       ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="565"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mLastChangedTimestamp = shortcutInfo.getLastChangedTimestamp();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="566"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mIsDynamic = shortcutInfo.isDynamic();"
-        errorLine2="                                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="570"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mIsPinned = shortcutInfo.isPinned();"
-        errorLine2="                                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="571"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mIsDeclaredInManifest = shortcutInfo.isDeclaredInManifest();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="572"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mIsImmutable = shortcutInfo.isImmutable();"
-        errorLine2="                                              ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="573"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mIsEnabled = shortcutInfo.isEnabled();"
-        errorLine2="                                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="574"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mHasKeyFieldsOnly = shortcutInfo.hasKeyFieldsOnly();"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="575"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mRank = shortcutInfo.getRank();"
-        errorLine2="                                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="577"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutInfoCompat.Builder is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            mInfo.mExtras = shortcutInfo.getExtras();"
-        errorLine2="                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="578"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).isRequestPinShortcutSupported();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="137"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).isRequestPinShortcutSupported();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="137"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).requestPinShortcut("
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="174"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).requestPinShortcut("
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="174"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            result = context.getSystemService(ShortcutManager.class)"
-        errorLine2="                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="218"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    .createShortcutResultIntent(shortcut.toShortcutInfo());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="219"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    context.getSystemService(ShortcutManager.class).getShortcuts(matchFlags);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="259"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            final ShortcutManager manager = context.getSystemService(ShortcutManager.class);"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="262"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                shortcuts.addAll(manager.getManifestShortcuts());"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="265"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                shortcuts.addAll(manager.getDynamicShortcuts());"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="268"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                shortcuts.addAll(manager.getPinnedShortcuts());"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="271"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).addDynamicShortcuts(shortcuts)) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="307"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).addDynamicShortcuts(shortcuts)) {"
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="307"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getMaxShortcutCountPerActivity();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="323"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getMaxShortcutCountPerActivity();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="323"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).isRateLimitingActive();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="340"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).isRateLimitingActive();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="340"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxWidth();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="360"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxWidth();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="360"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxHeight();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="371"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            return context.getSystemService(ShortcutManager.class).getIconMaxHeight();"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="371"
-            column="68"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).reportShortcutUsed(shortcutId);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="398"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).reportShortcutUsed(shortcutId);"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="398"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).setDynamicShortcuts(shortcuts)) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="432"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).setDynamicShortcuts(shortcuts)) {"
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="432"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            List&lt;ShortcutInfo> shortcuts = context.getSystemService("
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="451"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                    ShortcutManager.class).getDynamicShortcuts();"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="452"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).updateShortcuts(shortcuts)) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="490"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            if (!context.getSystemService(ShortcutManager.class).updateShortcuts(shortcuts)) {"
-        errorLine2="                                                                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="490"
-            column="66"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="554"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                    .disableShortcuts(shortcutIds, disabledMessage);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="555"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).enableShortcuts(shortcutIds);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="582"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).enableShortcuts(shortcutIds);"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="582"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).removeDynamicShortcuts(shortcutIds);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="598"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).removeDynamicShortcuts(shortcutIds);"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="598"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).removeAllDynamicShortcuts();"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="613"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).removeAllDynamicShortcuts();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="613"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        context.getSystemService(ShortcutManager.class).removeLongLivedShortcuts(shortcutIds);"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="637"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            context.getSystemService(ShortcutManager.class).pushDynamicShortcut("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="687"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            final ShortcutManager sm = context.getSystemService(ShortcutManager.class);"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="690"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            if (sm.isRateLimitingActive()) {"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="691"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            final List&lt;ShortcutInfo> shortcuts = sm.getDynamicShortcuts();"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="694"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="                sm.removeDynamicShortcuts(Arrays.asList("
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="696"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 25, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 25. Either annotate the containing class with at least @RequiresApi(25) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(25)."
-        errorLine1="            sm.addDynamicShortcuts(Arrays.asList(shortcut.toShortcutInfo()));"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="699"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.content.pm.ShortcutManagerCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                Build.VERSION.SDK_INT &lt; 19 || am == null || am.isLowRamDevice();"
-        errorLine2="                                                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java"
-            line="739"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.app.TaskStackBuilder is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return PendingIntent.getActivities(mSourceContext, requestCode, intents, flags,"
-        errorLine2="                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/TaskStackBuilder.java"
-            line="341"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.text.TextUtilsCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return TextUtils.getLayoutDirectionFromLocale(locale);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/text/TextUtilsCompat.java"
-            line="91"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            textView.setCompoundDrawablesRelative(start, top, end, bottom);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="152"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="154"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="179"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="181"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            textView.setCompoundDrawablesRelativeWithIntrinsicBounds(start, top, end, bottom);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="211"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="213"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return textView.getMaxLines();"
-        errorLine2="                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="227"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return textView.getMinLines();"
-        errorLine2="                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="253"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            textView.setTextAppearance(resId);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="284"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return textView.getCompoundDrawablesRelative();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="296"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            final boolean rtl = textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="299"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            textView.setAutoSizeTextTypeWithDefaults(autoSizeTextType);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="327"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            textView.setAutoSizeTextTypeUniformWithConfiguration("
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="362"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            textView.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="388"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return textView.getAutoSizeTextType();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="407"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return textView.getAutoSizeStepGranularity();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="423"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return textView.getAutoSizeMinTextSize();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="440"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return textView.getAutoSizeMaxTextSize();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="457"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return textView.getAutoSizeTextAvailableSizes();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="474"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            textView.setFirstBaselineToTopHeight(firstBaselineToTopHeight);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="695"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                || textView.getIncludeFontPadding()) {"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="704"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                || textView.getIncludeFontPadding()) {"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="745"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return new PrecomputedTextCompat.Params(textView.getTextMetricsParams());"
-        errorLine2="                                                             ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="816"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                builder.setBreakStrategy(textView.getBreakStrategy());"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="821"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                builder.setHyphenationFrequency(textView.getHyphenationFrequency());"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="822"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            textView.setTextDirection(getTextDirection(params.getTextDirection()));"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="843"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            textView.setBreakStrategy(params.getBreakStrategy());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="866"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            textView.setHyphenationFrequency(params.getHyphenationFrequency());"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="867"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="                        DecimalFormatSymbols.getInstance(textView.getTextLocale());"
-        errorLine2="                                                                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="919"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        DecimalFormatSymbols.getInstance(textView.getTextLocale());"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="919"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                final String zero = symbols.getDigitStrings()[0];"
-        errorLine2="                                            ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="920"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="        final boolean defaultIsRtl = (textView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="935"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="        switch (textView.getTextDirection()) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="938"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            textView.setCompoundDrawableTintList(tint);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="995"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return textView.getCompoundDrawableTintList();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="1011"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            textView.setCompoundDrawableTintMode(tintMode);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="1029"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.widget.TextViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return textView.getCompoundDrawableTintMode();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/widget/TextViewCompat.java"
-            line="1046"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return Trace.isEnabled();"
-        errorLine2="                         ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="79"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            Trace.beginSection(sectionName);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="105"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            Trace.endSection();"
-        errorLine2="                  ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="118"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            Trace.beginAsyncSection(methodName, cookie);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="134"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            Trace.endAsyncSection(methodName, cookie);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="154"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.os.TraceCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            Trace.setCounter(counterName, counterValue);"
-        errorLine2="                  ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/TraceCompat.java"
-            line="173"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.net.TrafficStatsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            TrafficStats.tagDatagramSocket(socket);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
-            line="138"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.net.TrafficStatsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            TrafficStats.untagDatagramSocket(socket);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
-            line="155"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.TypefaceCompatUtil is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, &quot;r&quot;, cancellationSignal)) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="104"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.os.UserManagerCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
-        errorLine2="                           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/UserManagerCompat.java"
-            line="42"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.os.UserManagerCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
-        errorLine2="                                                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/os/UserManagerCompat.java"
-            line="42"
-            column="64"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            v.setAutofillHints(autofillHints);"
-        errorLine2="              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="761"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return v.getImportantForAutofill();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="782"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            v.setImportantForAutofill(mode);"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="826"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return v.isImportantForAutofill();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="895"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return v.getAccessibilityDelegate();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="945"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.hasTransientState();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="988"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.setHasTransientState(hasTransientState);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1002"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.postInvalidateOnAnimation();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1017"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.postInvalidateOnAnimation(left, top, right, bottom);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1039"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.postOnAnimation(action);"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1057"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.postOnAnimationDelayed(action, delayMillis);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1079"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.getImportantForAccessibility();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1101"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.setImportantForAccessibility(mode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1128"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.setImportantForAccessibility(mode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1137"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.isImportantForAccessibility();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1179"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.performAccessibilityAction(action, arguments);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1201"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();"
-        errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1436"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.getLabelFor();"
-        errorLine2="                        ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1531"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            view.setLabelFor(labeledId);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1545"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            view.setLayerPaint(paint);"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1581"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.getLayoutDirection();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1604"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            view.setLayoutDirection(layoutDirection);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1628"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.getParentForAccessibility();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1642"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return view.requireViewById(id);"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1665"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return view.getAccessibilityLiveRegion();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1782"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            view.setAccessibilityLiveRegion(mode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1818"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.getPaddingStart();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1833"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.getPaddingEnd();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1849"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            view.setPaddingRelative(start, top, end, bottom);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1870"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            view.dispatchStartTemporaryDetach();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1893"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            view.dispatchFinishTemporaryDetach();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1916"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.getMinimumWidth();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1993"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.getMinimumHeight();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2027"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setElevation(elevation);"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2334"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getElevation();"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2345"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setTranslationZ(translationZ);"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2355"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getTranslationZ();"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2366"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setTransitionName(transitionName);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2380"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getTransitionName();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2402"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.getWindowSystemUiVisibility();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2415"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            view.requestApplyInsets();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2426"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.requestFitSystemWindows();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2428"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return v.getFitsSystemWindows();"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2471"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                WindowInsets result = view.onApplyWindowInsets(unwrapped);"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2532"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="                final WindowInsets result = view.dispatchApplyWindowInsets(unwrapped);"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2560"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            view.setSystemGestureExclusionRects(rects);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2584"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="            return view.getSystemGestureExclusionRects();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2599"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return view.hasOverlappingRendering();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2856"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.isPaddingRelative();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2869"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.setBackground(background);"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2882"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getBackgroundTintList();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2896"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setBackgroundTintList(tintList);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2912"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                boolean hasTint = (view.getBackgroundTintList() != null)"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2918"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        || (view.getBackgroundTintMode() != null);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2919"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    view.setBackground(background);"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2924"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getBackgroundTintMode();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2941"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setBackgroundTintMode(mode);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2959"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                boolean hasTint = (view.getBackgroundTintList() != null)"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2965"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        || (view.getBackgroundTintMode() != null);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2966"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                    view.setBackground(background);"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2971"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setNestedScrollingEnabled(enabled);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2997"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.isNestedScrollingEnabled();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3020"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.startNestedScroll(axes);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3042"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.stopNestedScroll();"
-        errorLine2="                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3061"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.hasNestedScrollingParent();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3078"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3107"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3138"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.dispatchNestedFling(velocityX, velocityY, consumed);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3362"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.dispatchNestedPreFling(velocityX, velocityY);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3405"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return view.isInLayout();"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3427"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return view.isLaidOut();"
-        errorLine2="                        ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3438"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return view.isLayoutDirectionResolved();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3455"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return view.getZ();"
-        errorLine2="                        ~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3469"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            view.setZ(z);"
-        errorLine2="                 ~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3488"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            view.setClipBounds(clipBounds);"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3607"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return view.getClipBounds();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3622"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return view.isAttachedToWindow();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3632"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
-        errorLine1="            return view.hasOnClickListeners();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3644"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            view.setScrollIndicators(indicators);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3662"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            view.setScrollIndicators(indicators, mask);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3696"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return view.getScrollIndicators();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3714"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            view.setPointerIcon((PointerIcon) (pointerIcon != null"
-        errorLine2="                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3725"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return view.getDisplay();"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3744"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            view.setTooltipText(tooltipText);"
-        errorLine2="                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3764"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            return v.startDragAndDrop(data, shadowBuilder, localState, flags);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3774"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            v.cancelDragAndDrop();"
-        errorLine2="              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3785"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            v.updateDragShadow(shadowBuilder);"
-        errorLine2="              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3794"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.getNextClusterForwardId();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3806"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            view.setNextClusterForwardId(nextClusterForwardId);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3820"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.isKeyboardNavigationCluster();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3832"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            view.setKeyboardNavigationCluster(isCluster);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3846"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.isFocusedByDefault();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3861"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            view.setFocusedByDefault(isFocusedByDefault);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3880"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.keyboardNavigationClusterSearch(currentCluster, direction);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3898"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            view.addKeyboardNavigationClusters(views, direction);"
-        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3914"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.restoreDefaultFocus();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3928"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return view.hasExplicitFocusable();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3950"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            return View.generateViewId();"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3963"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                return view.isScreenReaderFocusable();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4160"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                view.setScreenReaderFocusable(value);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4166"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                return view.getAccessibilityPaneTitle();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4232"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                view.setAccessibilityPaneTitle(value);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4238"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                return view.isAccessibilityHeading();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4312"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class null is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                view.setAccessibilityHeading(value);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4318"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            event.setContentChangeTypes(changeType);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4413"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            event.setContentChangeTypes(changeType);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4423"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                view.getParent().notifySubtreeAccessibilityStateChanged(view, view, changeType);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4430"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewCompat.AccessibilityPaneVisibilityManager is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            if (pane.isAttachedToWindow()) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4490"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewCompat.AccessibilityPaneVisibilityManager is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4521"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return config.getScaledHorizontalScrollFactor();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
-            line="82"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.core.view.ViewConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            return config.getScaledVerticalScrollFactor();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
-            line="99"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.ViewConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return config.getScaledHoverSlop();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
-            line="129"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.ViewConfigurationCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return config.shouldShowMenuShortcutsWhenKeyboardPresent();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
-            line="142"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewGroupCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            return group.getLayoutMode();"
-        errorLine2="                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
-            line="115"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewGroupCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            group.setLayoutMode(mode);"
-        errorLine2="                  ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
-            line="131"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewGroupCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            group.setTransitionGroup(isTransitionGroup);"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
-            line="145"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewGroupCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return group.isTransitionGroup();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
-            line="158"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewGroupCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return group.getNestedScrollAxes();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewGroupCompat.java"
-            line="182"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    return parent.onStartNestedScroll(child, target, nestedScrollAxes);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="215"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    parent.onNestedScrollAccepted(child, target, nestedScrollAxes);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="256"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    parent.onStopNestedScroll(target);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="289"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                        parent.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed,"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="346"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    parent.onNestedPreScroll(target, dx, dy, consumed);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="391"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return parent.onNestedFling(target, velocityX, velocityY, consumed);"
-        errorLine2="                              ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="426"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                return parent.onNestedPreFling(target, velocityX, velocityY);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="463"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewParentCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            parent.notifySubtreeAccessibilityStateChanged(child, source, changeType);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewParentCompat.java"
-            line="493"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                view.animate().withEndAction(runnable);"
-        errorLine2="                               ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="218"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="                return (Interpolator) view.animate().getInterpolator();"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="269"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                view.animate().translationZBy(value);"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="572"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                view.animate().translationZ(value);"
-        errorLine2="                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="591"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                view.animate().z(value);"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="610"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                view.animate().zBy(value);"
-        errorLine2="                               ~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="629"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                view.animate().withLayer();"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="682"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                view.animate().withStartAction(runnable);"
-        errorLine2="                               ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="710"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.ViewPropertyAnimatorCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                view.animate().setUpdateListener(wrapped);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
-            line="787"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.core.view.WindowCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="            return window.requireViewById(id);"
-        errorLine2="                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/WindowCompat.java"
-            line="89"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.view.WindowInsetsCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        if (view != null &amp;&amp; view.isAttachedToWindow()) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/view/WindowInsetsCompat.java"
-            line="170"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.WrappedDrawableApi14 is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        mDrawable.setAutoMirrored(mirrored);"
-        errorLine2="                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi14.java"
-            line="198"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.core.graphics.drawable.WrappedDrawableApi14 is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        return mDrawable.isAutoMirrored();"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi14.java"
-            line="204"
-            column="26"/>
-    </issue>
-
-    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `parent` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public AccessibilityNodeInfoCompat getParent() {"
@@ -11930,11 +11732,11 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3532"
+            line="3533"
             column="40"/>
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3554"
+            line="3555"
             column="17"/>
     </issue>
 
@@ -11945,11 +11747,11 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3597"
+            line="3598"
             column="40"/>
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3619"
+            line="3620"
             column="17"/>
     </issue>
 
@@ -12019,7 +11821,7 @@
         errorLine2="                                    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/os/HandlerCompat.java"
-            line="142"
+            line="181"
             column="37"/>
     </issue>
 
@@ -12041,7 +11843,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="165"
+            line="169"
             column="58"/>
     </issue>
 
@@ -12052,7 +11854,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1077"
+            line="1078"
             column="13"/>
     </issue>
 
@@ -13394,7 +13196,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3377"
+            line="3378"
             column="12"/>
     </issue>
 
@@ -13405,7 +13207,7 @@
         errorLine2="                                                                                ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3377"
+            line="3378"
             column="81"/>
     </issue>
 
@@ -13416,7 +13218,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3403"
+            line="3404"
             column="12"/>
     </issue>
 
@@ -13427,7 +13229,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3532"
+            line="3533"
             column="12"/>
     </issue>
 
@@ -13438,7 +13240,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3554"
+            line="3555"
             column="36"/>
     </issue>
 
@@ -13449,7 +13251,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3581"
+            line="3582"
             column="36"/>
     </issue>
 
@@ -13460,7 +13262,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3597"
+            line="3598"
             column="12"/>
     </issue>
 
@@ -13471,7 +13273,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3619"
+            line="3620"
             column="35"/>
     </issue>
 
@@ -13482,7 +13284,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3645"
+            line="3646"
             column="35"/>
     </issue>
 
@@ -13493,7 +13295,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
-            line="3658"
+            line="3659"
             column="12"/>
     </issue>
 
@@ -14637,7 +14439,7 @@
         errorLine2="                  ~~~~">
         <location
             file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="580"
+            line="593"
             column="19"/>
     </issue>
 
@@ -14648,7 +14450,7 @@
         errorLine2="                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="662"
+            line="675"
             column="19"/>
     </issue>
 
@@ -14659,7 +14461,7 @@
         errorLine2="                                           ~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/ContextCompat.java"
-            line="662"
+            line="675"
             column="44"/>
     </issue>
 
@@ -15088,7 +14890,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontRequest.java"
-            line="142"
+            line="156"
             column="12"/>
     </issue>
 
@@ -15099,7 +14901,7 @@
         errorLine2="                                                      ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
-            line="165"
+            line="181"
             column="55"/>
     </issue>
 
@@ -15110,7 +14912,7 @@
         errorLine2="                                                                            ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
-            line="165"
+            line="181"
             column="77"/>
     </issue>
 
@@ -15121,7 +14923,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
-            line="245"
+            line="269"
             column="19"/>
     </issue>
 
@@ -15132,51 +14934,18 @@
         errorLine2="                                               ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
-            line="245"
+            line="269"
             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 static Typeface getFontSync(final Context context, final FontRequest request,"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="228"
-            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 Typeface getFontSync(final Context context, final FontRequest request,"
-        errorLine2="                                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="228"
-            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 Typeface getFontSync(final Context context, final FontRequest request,"
-        errorLine2="                                                                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="228"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
         errorLine1="        public FontInfo[] getFonts() {"
         errorLine2="               ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="436"
+            line="399"
             column="16"/>
     </issue>
 
@@ -15187,51 +14956,84 @@
         errorLine2="                                        ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="501"
+            line="486"
             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 Map&lt;Uri, ByteBuffer> prepareFontData(Context context, FontInfo[] fonts,"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Typeface getFontSync("
+        errorLine2="                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="688"
+            line="543"
             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 Map&lt;Uri, ByteBuffer> prepareFontData(Context context, FontInfo[] fonts,"
-        errorLine2="                                                       ~~~~~~~">
+        errorLine1="            final Context context,"
+        errorLine2="                  ~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="688"
-            column="56"/>
+            line="544"
+            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 Map&lt;Uri, ByteBuffer> prepareFontData(Context context, FontInfo[] fonts,"
-        errorLine2="                                                                        ~~~~~~~~~~">
+        errorLine1="            final FontRequest request,"
+        errorLine2="                  ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="688"
-            column="73"/>
+            line="545"
+            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="            CancellationSignal cancellationSignal) {"
+        errorLine1="    public static Map&lt;Uri, ByteBuffer> prepareFontData("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+            line="588"
+            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="            Context context,"
+        errorLine2="            ~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+            line="589"
+            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="            FontInfo[] fonts,"
+        errorLine2="            ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+            line="590"
+            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="            CancellationSignal cancellationSignal"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/FontsContractCompat.java"
-            line="689"
+            line="591"
             column="13"/>
     </issue>
 
@@ -16595,7 +16397,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="96"
+            line="97"
             column="29"/>
     </issue>
 
@@ -16606,7 +16408,7 @@
         errorLine2="                              ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="246"
+            line="247"
             column="31"/>
     </issue>
 
@@ -16617,7 +16419,7 @@
         errorLine2="                                                           ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="252"
+            line="253"
             column="60"/>
     </issue>
 
@@ -16628,7 +16430,7 @@
         errorLine2="                                                                           ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="252"
+            line="253"
             column="76"/>
     </issue>
 
@@ -16639,7 +16441,7 @@
         errorLine2="                              ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="286"
+            line="287"
             column="31"/>
     </issue>
 
@@ -16650,7 +16452,7 @@
         errorLine2="                                                           ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="292"
+            line="293"
             column="60"/>
     </issue>
 
@@ -16661,7 +16463,7 @@
         errorLine2="                                                                           ~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="292"
+            line="293"
             column="76"/>
     </issue>
 
@@ -16672,7 +16474,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="471"
+            line="472"
             column="25"/>
     </issue>
 
@@ -16683,7 +16485,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="480"
+            line="481"
             column="25"/>
     </issue>
 
@@ -16694,7 +16496,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="489"
+            line="490"
             column="25"/>
     </issue>
 
@@ -16705,7 +16507,7 @@
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="489"
+            line="490"
             column="37"/>
     </issue>
 
@@ -16716,7 +16518,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="498"
+            line="499"
             column="25"/>
     </issue>
 
@@ -16727,7 +16529,7 @@
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="498"
+            line="499"
             column="48"/>
     </issue>
 
@@ -16738,7 +16540,7 @@
         errorLine2="                                    ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="619"
+            line="620"
             column="37"/>
     </issue>
 
@@ -16749,7 +16551,7 @@
         errorLine2="                                         ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="716"
+            line="717"
             column="42"/>
     </issue>
 
@@ -16760,7 +16562,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="827"
+            line="828"
             column="33"/>
     </issue>
 
@@ -16771,7 +16573,7 @@
         errorLine2="                                        ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1010"
+            line="1011"
             column="41"/>
     </issue>
 
@@ -16782,7 +16584,7 @@
         errorLine2="                                ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1573"
+            line="1574"
             column="33"/>
     </issue>
 
@@ -16793,7 +16595,7 @@
         errorLine2="                                           ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1589"
+            line="1590"
             column="44"/>
     </issue>
 
@@ -16804,7 +16606,7 @@
         errorLine2="                                                           ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1724"
+            line="1725"
             column="60"/>
     </issue>
 
@@ -16815,7 +16617,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1790"
+            line="1791"
             column="35"/>
     </issue>
 
@@ -16826,7 +16628,7 @@
         errorLine2="                                              ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1790"
+            line="1791"
             column="47"/>
     </issue>
 
@@ -16837,7 +16639,7 @@
         errorLine2="            ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1810"
+            line="1811"
             column="13"/>
     </issue>
 
@@ -16848,7 +16650,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1837"
+            line="1838"
             column="50"/>
     </issue>
 
@@ -16859,7 +16661,7 @@
         errorLine2="                                                             ~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1837"
+            line="1838"
             column="62"/>
     </issue>
 
@@ -16870,7 +16672,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="1997"
+            line="1998"
             column="22"/>
     </issue>
 
@@ -16881,7 +16683,7 @@
         errorLine2="                                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2078"
+            line="2079"
             column="43"/>
     </issue>
 
@@ -16892,7 +16694,7 @@
         errorLine2="              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/widget/NestedScrollView.java"
-            line="2091"
+            line="2092"
             column="15"/>
     </issue>
 
@@ -18146,7 +17948,7 @@
         errorLine2="                                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="306"
+            line="433"
             column="54"/>
     </issue>
 
@@ -18157,7 +17959,7 @@
         errorLine2="                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="374"
+            line="502"
             column="19"/>
     </issue>
 
@@ -18168,7 +17970,7 @@
         errorLine2="                                                                              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
-            line="374"
+            line="502"
             column="79"/>
     </issue>
 
@@ -18355,7 +18157,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="79"
+            line="83"
             column="13"/>
     </issue>
 
@@ -18366,7 +18168,7 @@
         errorLine2="                     ~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="128"
+            line="132"
             column="22"/>
     </issue>
 
@@ -18377,7 +18179,7 @@
         errorLine2="                                       ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="136"
+            line="140"
             column="40"/>
     </issue>
 
@@ -18388,7 +18190,7 @@
         errorLine2="                                                                   ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="136"
+            line="140"
             column="68"/>
     </issue>
 
@@ -18399,7 +18201,7 @@
         errorLine2="               ~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="165"
+            line="169"
             column="16"/>
     </issue>
 
@@ -18410,7 +18212,7 @@
         errorLine2="                                   ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
-            line="165"
+            line="169"
             column="36"/>
     </issue>
 
@@ -18641,7 +18443,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="100"
+            line="107"
             column="12"/>
     </issue>
 
@@ -18652,7 +18454,7 @@
         errorLine2="           ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="318"
+            line="325"
             column="12"/>
     </issue>
 
@@ -18663,7 +18465,7 @@
         errorLine2="                               ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
-            line="652"
+            line="662"
             column="32"/>
     </issue>
 
@@ -19246,7 +19048,7 @@
         errorLine2="                                                                            ~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompat.java"
-            line="146"
+            line="174"
             column="77"/>
     </issue>
 
@@ -19664,7 +19466,7 @@
         errorLine2="                                   ~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="62"
+            line="68"
             column="36"/>
     </issue>
 
@@ -19675,7 +19477,7 @@
         errorLine2="                                  ~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="102"
+            line="108"
             column="35"/>
     </issue>
 
@@ -19686,7 +19488,7 @@
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="102"
+            line="108"
             column="52"/>
     </issue>
 
@@ -19697,7 +19499,7 @@
         errorLine2="                                                                                          ~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="102"
+            line="108"
             column="91"/>
     </issue>
 
@@ -19708,7 +19510,7 @@
         errorLine2="                                                ~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="123"
+            line="129"
             column="49"/>
     </issue>
 
@@ -19719,7 +19521,7 @@
         errorLine2="                                                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="123"
+            line="129"
             column="66"/>
     </issue>
 
@@ -19730,7 +19532,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="141"
+            line="147"
             column="38"/>
     </issue>
 
@@ -19741,7 +19543,7 @@
         errorLine2="                                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="141"
+            line="147"
             column="49"/>
     </issue>
 
@@ -19752,7 +19554,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="164"
+            line="170"
             column="38"/>
     </issue>
 
@@ -19763,7 +19565,7 @@
         errorLine2="                                                ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="164"
+            line="170"
             column="49"/>
     </issue>
 
@@ -19774,7 +19576,7 @@
         errorLine2="                                    ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="174"
+            line="180"
             column="37"/>
     </issue>
 
@@ -19807,7 +19609,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="537"
+            line="538"
             column="49"/>
     </issue>
 
@@ -19818,7 +19620,7 @@
         errorLine2="                                              ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="551"
+            line="552"
             column="47"/>
     </issue>
 
@@ -19829,7 +19631,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="568"
+            line="569"
             column="41"/>
     </issue>
 
@@ -19840,7 +19642,7 @@
         errorLine2="                                         ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="588"
+            line="589"
             column="42"/>
     </issue>
 
@@ -19851,7 +19653,7 @@
         errorLine2="                                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="628"
+            line="629"
             column="53"/>
     </issue>
 
@@ -19862,7 +19664,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="628"
+            line="629"
             column="61"/>
     </issue>
 
@@ -19873,7 +19675,7 @@
         errorLine2="                                                      ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="660"
+            line="661"
             column="55"/>
     </issue>
 
@@ -19884,7 +19686,7 @@
         errorLine2="                                                              ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="660"
+            line="661"
             column="63"/>
     </issue>
 
@@ -19895,7 +19697,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="692"
+            line="693"
             column="13"/>
     </issue>
 
@@ -19906,7 +19708,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="722"
+            line="723"
             column="30"/>
     </issue>
 
@@ -19917,7 +19719,7 @@
         errorLine2="                                                           ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1055"
+            line="1056"
             column="60"/>
     </issue>
 
@@ -19928,7 +19730,7 @@
         errorLine2="                                                                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1076"
+            line="1077"
             column="67"/>
     </issue>
 
@@ -19939,7 +19741,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1199"
+            line="1200"
             column="13"/>
     </issue>
 
@@ -19950,7 +19752,7 @@
         errorLine2="                                                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1405"
+            line="1406"
             column="61"/>
     </issue>
 
@@ -19961,7 +19763,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1434"
+            line="1435"
             column="19"/>
     </issue>
 
@@ -19972,7 +19774,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1454"
+            line="1455"
             column="34"/>
     </issue>
 
@@ -19983,7 +19785,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1493"
+            line="1494"
             column="37"/>
     </issue>
 
@@ -19994,7 +19796,7 @@
         errorLine2="                                                                         ~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1493"
+            line="1494"
             column="74"/>
     </issue>
 
@@ -20005,7 +19807,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1517"
+            line="1518"
             column="36"/>
     </issue>
 
@@ -20016,7 +19818,7 @@
         errorLine2="                                                         ~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1579"
+            line="1580"
             column="58"/>
     </issue>
 
@@ -20027,7 +19829,7 @@
         errorLine2="                  ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1640"
+            line="1641"
             column="19"/>
     </issue>
 
@@ -20038,7 +19840,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1684"
+            line="1685"
             column="36"/>
     </issue>
 
@@ -20049,7 +19851,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1721"
+            line="1722"
             column="48"/>
     </issue>
 
@@ -20060,7 +19862,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1738"
+            line="1739"
             column="49"/>
     </issue>
 
@@ -20071,7 +19873,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1752"
+            line="1753"
             column="40"/>
     </issue>
 
@@ -20082,7 +19884,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1944"
+            line="1945"
             column="41"/>
     </issue>
 
@@ -20093,7 +19895,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1958"
+            line="1959"
             column="41"/>
     </issue>
 
@@ -20104,7 +19906,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="1980"
+            line="1981"
             column="36"/>
     </issue>
 
@@ -20115,7 +19917,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2082"
+            line="2083"
             column="40"/>
     </issue>
 
@@ -20126,7 +19928,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2099"
+            line="2100"
             column="40"/>
     </issue>
 
@@ -20137,7 +19939,7 @@
         errorLine2="                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2116"
+            line="2117"
             column="33"/>
     </issue>
 
@@ -20148,7 +19950,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2131"
+            line="2132"
             column="29"/>
     </issue>
 
@@ -20159,7 +19961,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2146"
+            line="2147"
             column="29"/>
     </issue>
 
@@ -20170,7 +19972,7 @@
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2159"
+            line="2160"
             column="36"/>
     </issue>
 
@@ -20181,7 +19983,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2173"
+            line="2174"
             column="37"/>
     </issue>
 
@@ -20192,7 +19994,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2187"
+            line="2188"
             column="37"/>
     </issue>
 
@@ -20203,7 +20005,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2200"
+            line="2201"
             column="34"/>
     </issue>
 
@@ -20214,7 +20016,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2213"
+            line="2214"
             column="34"/>
     </issue>
 
@@ -20225,7 +20027,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2224"
+            line="2225"
             column="35"/>
     </issue>
 
@@ -20236,7 +20038,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2240"
+            line="2241"
             column="34"/>
     </issue>
 
@@ -20247,7 +20049,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2253"
+            line="2254"
             column="35"/>
     </issue>
 
@@ -20258,7 +20060,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2269"
+            line="2270"
             column="34"/>
     </issue>
 
@@ -20269,7 +20071,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2277"
+            line="2278"
             column="37"/>
     </issue>
 
@@ -20280,7 +20082,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2285"
+            line="2286"
             column="38"/>
     </issue>
 
@@ -20291,7 +20093,7 @@
         errorLine2="                                     ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2293"
+            line="2294"
             column="38"/>
     </issue>
 
@@ -20302,7 +20104,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2301"
+            line="2302"
             column="35"/>
     </issue>
 
@@ -20313,7 +20115,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2309"
+            line="2310"
             column="35"/>
     </issue>
 
@@ -20324,7 +20126,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2317"
+            line="2318"
             column="30"/>
     </issue>
 
@@ -20335,7 +20137,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2325"
+            line="2326"
             column="30"/>
     </issue>
 
@@ -20346,7 +20148,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2378"
+            line="2379"
             column="62"/>
     </issue>
 
@@ -20357,7 +20159,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2444"
+            line="2445"
             column="55"/>
     </issue>
 
@@ -20368,7 +20170,7 @@
         errorLine2="                                            ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2485"
+            line="2486"
             column="45"/>
     </issue>
 
@@ -20379,7 +20181,7 @@
         errorLine2="                                                   ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2499"
+            line="2500"
             column="52"/>
     </issue>
 
@@ -20390,7 +20192,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2820"
+            line="2830"
             column="49"/>
     </issue>
 
@@ -20401,7 +20203,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2836"
+            line="2846"
             column="37"/>
     </issue>
 
@@ -20412,7 +20214,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2894"
+            line="2904"
             column="19"/>
     </issue>
 
@@ -20423,7 +20225,7 @@
         errorLine2="                                                                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2910"
+            line="2920"
             column="66"/>
     </issue>
 
@@ -20434,7 +20236,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2939"
+            line="2949"
             column="19"/>
     </issue>
 
@@ -20445,7 +20247,7 @@
         errorLine2="                                                                 ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="2957"
+            line="2967"
             column="66"/>
     </issue>
 
@@ -20456,7 +20258,7 @@
         errorLine2="                                                         ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3605"
+            line="3615"
             column="58"/>
     </issue>
 
@@ -20467,7 +20269,7 @@
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3723"
+            line="3733"
             column="59"/>
     </issue>
 
@@ -20478,7 +20280,7 @@
         errorLine2="                                                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3771"
+            line="3781"
             column="61"/>
     </issue>
 
@@ -20489,7 +20291,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3772"
+            line="3782"
             column="13"/>
     </issue>
 
@@ -20500,7 +20302,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3772"
+            line="3782"
             column="51"/>
     </issue>
 
@@ -20511,7 +20313,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3792"
+            line="3802"
             column="58"/>
     </issue>
 
@@ -20522,7 +20324,7 @@
         errorLine2="                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3895"
+            line="3905"
             column="19"/>
     </issue>
 
@@ -20533,7 +20335,7 @@
         errorLine2="                                                                           ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="3895"
+            line="3905"
             column="76"/>
     </issue>
 
@@ -20544,7 +20346,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4093"
+            line="4103"
             column="37"/>
     </issue>
 
@@ -20555,7 +20357,7 @@
         errorLine2="                                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4093"
+            line="4103"
             column="45"/>
     </issue>
 
@@ -20566,7 +20368,7 @@
         errorLine2="                                                ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4129"
+            line="4139"
             column="49"/>
     </issue>
 
@@ -20577,7 +20379,7 @@
         errorLine2="                                                  ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4148"
+            line="4158"
             column="51"/>
     </issue>
 
@@ -20588,7 +20390,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4195"
+            line="4205"
             column="50"/>
     </issue>
 
@@ -20599,7 +20401,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4195"
+            line="4205"
             column="61"/>
     </issue>
 
@@ -20610,7 +20412,7 @@
         errorLine2="                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4221"
+            line="4231"
             column="19"/>
     </issue>
 
@@ -20621,7 +20423,7 @@
         errorLine2="                                                         ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4221"
+            line="4231"
             column="58"/>
     </issue>
 
@@ -20632,7 +20434,7 @@
         errorLine2="                                                 ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4284"
+            line="4294"
             column="50"/>
     </issue>
 
@@ -20643,7 +20445,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/core/view/ViewCompat.java"
-            line="4301"
+            line="4311"
             column="48"/>
     </issue>
 
diff --git a/core/core/src/androidTest/AndroidManifest.xml b/core/core/src/androidTest/AndroidManifest.xml
index 751c901..acea6c4 100644
--- a/core/core/src/androidTest/AndroidManifest.xml
+++ b/core/core/src/androidTest/AndroidManifest.xml
@@ -30,6 +30,9 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+
     <application
         android:name="androidx.multidex.MultiDexApplication"
         android:supportsRtl="true"
diff --git a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutManagerCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutManagerCompatTest.java
index ae8a695..41cce42 100644
--- a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutManagerCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutManagerCompatTest.java
@@ -366,6 +366,9 @@
                 ArgumentCaptor.forClass(ArrayList.class);
         verify(mShortcutInfoCompatSaver).addShortcuts(shortcutInfoCaptor.capture());
         verify(mShortcutInfoChangeListener).onShortcutAdded(shortcutInfoCaptor.capture());
+        verify(mShortcutInfoChangeListener, times(1))
+                .onShortcutUsageReported(Collections.singletonList(shortcutInfo.getId()));
+        verify(mockShortcutManager, times(1)).reportShortcutUsed(shortcutInfo.getId());
         final List<ShortcutInfoCompat> actualShortcutInfos = shortcutInfoCaptor.getValue();
         assertEquals(1, actualShortcutInfos.size());
         assertEquals(shortcutInfo, actualShortcutInfos.get(0));
@@ -401,7 +404,7 @@
 
     @SmallTest
     @Test
-    @SdkSuppress(minSdkVersion = 21)
+    @SdkSuppress(minSdkVersion = 23)
     public void testShortcutInfoListenerServiceDiscovery() {
         ShortcutManagerCompat.setShortcutInfoChangeListeners(null);
         // Initialize the listener.
@@ -413,6 +416,21 @@
         assertTrue(listeners.get(0) instanceof TestShortcutInfoChangeListener);
     }
 
+    @SmallTest
+    @Test
+    @SdkSuppress(minSdkVersion = 25)
+    public void testReportShortcutUsed() {
+        final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
+        doReturn(mockShortcutManager).when(mContext).getSystemService(
+                eq(Context.SHORTCUT_SERVICE));
+
+        ShortcutManagerCompat.reportShortcutUsed(mContext, "id");
+
+        verify(mockShortcutManager, times(1)).reportShortcutUsed("id");
+        verify(mShortcutInfoChangeListener, times(1))
+                .onShortcutUsageReported(Collections.singletonList("id"));
+    }
+
     private void verifyLegacyIntent(Intent intent) {
         assertNotNull(intent);
         assertEquals("Test shortcut", intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME));
diff --git a/core/core/src/androidTest/java/androidx/core/content/res/ColorStateListInflaterCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/res/ColorStateListInflaterCompatTest.java
index 23d80c9..72572a4 100644
--- a/core/core/src/androidTest/java/androidx/core/content/res/ColorStateListInflaterCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/res/ColorStateListInflaterCompatTest.java
@@ -25,7 +25,10 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Color;
+import android.view.ContextThemeWrapper;
 
+import androidx.annotation.AttrRes;
+import androidx.annotation.ColorInt;
 import androidx.core.test.R;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -47,19 +50,15 @@
 
     @Before
     public void setup() {
-        mContext = ApplicationProvider.getApplicationContext();
+        mContext = new ContextThemeWrapper(ApplicationProvider.getApplicationContext(),
+                R.style.ThemeOverlay_Core_ColorStateListInflaterCompat);
         mResources = mContext.getResources();
     }
 
     @Test
     public void testGetColorStateListWithThemedAttributes() throws Exception {
-        TypedArray a = TypedArrayUtils.obtainAttributes(mResources, mContext.getTheme(), null,
-                new int[]{android.R.attr.colorForeground});
-        final int colorForeground = a.getColor(0, 0);
-        a.recycle();
-
-        @SuppressLint("ResourceType")
-        final ColorStateList result =
+        final int colorForeground = getColorFromTheme(android.R.attr.colorForeground);
+        @SuppressLint("ResourceType") final ColorStateList result =
                 ColorStateListInflaterCompat.createFromXml(mResources,
                         mResources.getXml(R.color.color_state_list_themed_attrs),
                         mContext.getTheme());
@@ -71,10 +70,40 @@
         // Disabled color should be colorForeground with 50% of its alpha
         final int expectedDisabled = Color.argb(128, Color.red(colorForeground),
                 Color.green(colorForeground), Color.blue(colorForeground));
-        assertEquals(expectedDisabled, result.getColorForState(
-                new int[]{-android.R.attr.state_enabled}, 0));
+        assertEquals(expectedDisabled, getColorForDisabledState(result));
 
         // Default color should equal colorForeground
         assertEquals(colorForeground, result.getDefaultColor());
     }
+
+    @Test
+    public void testGetNestedColorStateList() throws Exception {
+        final int textColorPrimary = getColorFromTheme(android.R.attr.textColorPrimary);
+        @SuppressLint("ResourceType") final ColorStateList result =
+                ColorStateListInflaterCompat.createFromXml(mResources,
+                        mResources.getXml(R.color.color_state_list_secondary_text),
+                        mContext.getTheme());
+        assertNotNull(result);
+
+        // Now check the state colors
+
+        // Default color should be textColorPrimary with 54% (138) of its alpha
+        final int expectedTextColorSecondary = Color.argb(138, Color.red(textColorPrimary),
+                Color.green(textColorPrimary), Color.blue(textColorPrimary));
+        assertEquals(expectedTextColorSecondary, result.getDefaultColor());
+    }
+
+    @ColorInt
+    private int getColorFromTheme(@AttrRes int attrResId) {
+        TypedArray a = TypedArrayUtils.obtainAttributes(mResources, mContext.getTheme(), null,
+                new int[]{attrResId});
+        final int colorForeground = a.getColor(0, 0);
+        a.recycle();
+        return colorForeground;
+    }
+
+    private int getColorForDisabledState(ColorStateList colorStateList) {
+        return colorStateList.getColorForState(
+                new int[]{-android.R.attr.state_enabled}, 0);
+    }
 }
diff --git a/core/core/src/androidTest/java/androidx/core/content/res/ResourcesCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/res/ResourcesCompatTest.java
index e24d9b5..83f26de 100644
--- a/core/core/src/androidTest/java/androidx/core/content/res/ResourcesCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/res/ResourcesCompatTest.java
@@ -97,37 +97,35 @@
                 unthemedColorStateList.getColorForState(
                         new int[]{android.R.attr.state_pressed}, 0));
 
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following tests are only expected to pass on v23+ devices. The result of
-            // calling theme-aware getColorStateList() in pre-v23 is undefined.
-            final Resources.Theme yellowTheme = mResources.newTheme();
-            yellowTheme.applyStyle(R.style.YellowTheme, true);
-            final ColorStateList themedYellowColorStateList =
-                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
-                            yellowTheme);
-            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
-                    themedYellowColorStateList.getDefaultColor());
-            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_focused}, 0));
-            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_pressed}, 0));
+        final Resources.Theme yellowTheme = mResources.newTheme();
+        yellowTheme.applyStyle(R.style.YellowTheme, true);
+        final ColorStateList themedYellowColorStateList =
+                ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
+                        yellowTheme);
+        assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
+                themedYellowColorStateList.getDefaultColor());
+        assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
+                themedYellowColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
+                themedYellowColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
 
-            final Resources.Theme lilacTheme = mResources.newTheme();
-            lilacTheme.applyStyle(R.style.LilacTheme, true);
-            final ColorStateList themedLilacColorStateList =
-                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
-                            lilacTheme);
-            assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
-                    themedLilacColorStateList.getDefaultColor());
-            assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
-                    themedLilacColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_focused}, 0));
-            assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
-                    themedLilacColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_pressed}, 0));
-        }
+        // reloading the same resource with a different theme should not result in the cached CSL
+        // being returned; it should inflate a new one
+        final Resources.Theme lilacTheme = mResources.newTheme();
+        lilacTheme.applyStyle(R.style.LilacTheme, true);
+        final ColorStateList themedLilacColorStateList =
+                ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
+                        lilacTheme);
+        assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
+                themedLilacColorStateList.getDefaultColor());
+        assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
+                themedLilacColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
+                themedLilacColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
     }
 
     @Test
diff --git a/core/core/src/androidTest/java/androidx/core/telephony/SubscriptionManagerCompatTest.java b/core/core/src/androidTest/java/androidx/core/telephony/SubscriptionManagerCompatTest.java
new file mode 100644
index 0000000..06182ef
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/telephony/SubscriptionManagerCompatTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.telephony;
+
+import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * Test for {@link androidx.core.telephony.SubscriptionManagerCompat}.
+ */
+@SdkSuppress(minSdkVersion = 22)
+@SmallTest
+public class SubscriptionManagerCompatTest {
+
+    private SubscriptionManager mSubscriptionManager;
+
+    @Before
+    public void setUp() {
+        Context context = ApplicationProvider.getApplicationContext();
+        mSubscriptionManager = (SubscriptionManager) context.getSystemService(
+                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+    }
+
+    @Test
+    public void testGetSlotIndex() {
+        assertEquals(INVALID_SIM_SLOT_INDEX,
+                SubscriptionManagerCompat.getSlotIndex(INVALID_SUBSCRIPTION_ID));
+
+        // check this doesn't crash at least
+        SubscriptionManagerCompat.getSlotIndex(DEFAULT_SUBSCRIPTION_ID);
+
+        List<SubscriptionInfo> subInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (subInfos != null) {
+            for (SubscriptionInfo subInfo : subInfos) {
+                assertEquals(subInfo.getSimSlotIndex(),
+                        SubscriptionManagerCompat.getSlotIndex(subInfo.getSubscriptionId()));
+            }
+        }
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/telephony/TelephonyManagerCompatTest.java b/core/core/src/androidTest/java/androidx/core/telephony/TelephonyManagerCompatTest.java
new file mode 100644
index 0000000..f7fe966
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/telephony/TelephonyManagerCompatTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.telephony;
+
+import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.SubscriptionManager.getDefaultSubscriptionId;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.os.Build.VERSION;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * Test for {@link androidx.core.telephony.TelephonyManagerCompat}.
+ */
+@SmallTest
+public class TelephonyManagerCompatTest {
+
+    private Context mContext;
+    private TelephonyManager mTelephonyManager;
+
+    @Before
+    public void setUp() {
+        mContext = ApplicationProvider.getApplicationContext();
+        mTelephonyManager =
+                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+    }
+
+    @Test
+    public void testGetSubscriptionId() {
+        SubscriptionManager subscriptionManager = (SubscriptionManager) mContext.getSystemService(
+                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+
+        int defaultSubId = TelephonyManagerCompat.getSubscriptionId(mTelephonyManager);
+        assertSubIdsEqual(DEFAULT_SUBSCRIPTION_ID, defaultSubId);
+
+        if (VERSION.SDK_INT >= 24) {
+            mTelephonyManager = mTelephonyManager.createForSubscriptionId(DEFAULT_SUBSCRIPTION_ID);
+            assertSubIdsEqual(DEFAULT_SUBSCRIPTION_ID,
+                    TelephonyManagerCompat.getSubscriptionId(mTelephonyManager));
+
+            List<SubscriptionInfo> subInfos = subscriptionManager.getActiveSubscriptionInfoList();
+            if (subInfos != null) {
+                for (SubscriptionInfo subInfo : subInfos) {
+                    mTelephonyManager =
+                            mTelephonyManager.createForSubscriptionId(subInfo.getSubscriptionId());
+                    assertSubIdsEqual(subInfo.getSubscriptionId(),
+                            TelephonyManagerCompat.getSubscriptionId(mTelephonyManager));
+                }
+            }
+        }
+    }
+
+    // from 29+ the api requires privileged permissions
+    @SdkSuppress(maxSdkVersion = 28)
+    @Test
+    public void testGetImei() {
+        // check this doesn't crash at least
+        TelephonyManagerCompat.getImei(mTelephonyManager);
+
+        if (VERSION.SDK_INT >= 24) {
+            mTelephonyManager = mTelephonyManager.createForSubscriptionId(DEFAULT_SUBSCRIPTION_ID);
+            TelephonyManagerCompat.getImei(mTelephonyManager);
+
+            SubscriptionManager subscriptionManager =
+                    mContext.getSystemService(SubscriptionManager.class);
+            List<SubscriptionInfo> subInfos = subscriptionManager.getActiveSubscriptionInfoList();
+            if (subInfos != null) {
+                for (SubscriptionInfo subInfo : subInfos) {
+                    mTelephonyManager =
+                            mTelephonyManager.createForSubscriptionId(subInfo.getSubscriptionId());
+                    TelephonyManagerCompat.getImei(mTelephonyManager);
+                }
+            }
+        }
+    }
+
+    private void assertSubIdsEqual(int expected, int actual) {
+        try {
+            assertEquals(expected, actual);
+        } catch (AssertionError e) {
+            if (expected == DEFAULT_SUBSCRIPTION_ID) {
+                assertEquals(getDefaultSubscriptionId(), actual);
+            } else if (actual == DEFAULT_SUBSCRIPTION_ID) {
+                assertEquals(expected, getDefaultSubscriptionId());
+            } else {
+                throw e;
+            }
+        }
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/util/ObjectsCompatTest.java b/core/core/src/androidTest/java/androidx/core/util/ObjectsCompatTest.java
index 4b6502d..9b571be 100644
--- a/core/core/src/androidTest/java/androidx/core/util/ObjectsCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/util/ObjectsCompatTest.java
@@ -66,4 +66,20 @@
         assertEquals(ObjectsCompat.toString(a, b), a);
         assertEquals(ObjectsCompat.toString(null, b), b);
     }
+
+    @Test
+    public void testRequireNotNull() {
+        ObjectsCompat.requireNonNull(new Object(), "Message");
+        ObjectsCompat.requireNonNull(new Object());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testRequireNonNullException() {
+        ObjectsCompat.requireNonNull(null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testRequireNotNullExceptionWithMessage() {
+        ObjectsCompat.requireNonNull(null, "Message");
+    }
 }
diff --git a/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
index b6767d5..9ecc7281 100644
--- a/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
@@ -169,7 +169,7 @@
 
     @Test
     @SdkSuppress(minSdkVersion = 19, maxSdkVersion = 27)
-    @FlakyTest
+    @FlakyTest(bugId = 187190911)
     public void testAccessibilityPaneTitle_isntTrackedAsPaneWithoutTitle() {
         // This test isn't to test the propagation up, just that the event is sent correctly
         ViewCompat.setAccessibilityLiveRegion(mView,
diff --git a/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
index ef19488..3bd4559 100644
--- a/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
@@ -54,6 +54,7 @@
 import androidx.test.filters.SdkSuppress;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -316,6 +317,7 @@
                 bundleCaptor.getValue().getInt(ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT));
     }
 
+    @Ignore
     @Test
     public void testGetWindowInsetsController_UnwrapsContextWrappers()
             throws Throwable {
diff --git a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsAnimationCompatActivityTest.kt b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsAnimationCompatActivityTest.kt
index cc0fb65..ed40508 100644
--- a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsAnimationCompatActivityTest.kt
+++ b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsAnimationCompatActivityTest.kt
@@ -24,6 +24,7 @@
 import androidx.core.test.R
 import androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE
 import androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP
+import androidx.core.view.WindowInsetsCompat.Type.statusBars
 import androidx.core.view.WindowInsetsCompat.Type.systemBars
 import androidx.test.core.app.ActivityScenario
 import androidx.test.espresso.Espresso.onIdle
@@ -50,6 +51,8 @@
 
     private lateinit var scenario: ActivityScenario<WindowInsetsCompatActivity>
 
+    private var barsShown = true
+
     @Before
     public fun setup() {
         scenario = ActivityScenario.launch(WindowInsetsCompatActivity::class.java)
@@ -59,28 +62,30 @@
         scenario.onActivity {
             WindowCompat.setDecorFitsSystemWindows(it.window, false)
             WindowCompat.getInsetsController(it.window, it.window.decorView)!!.show(systemBars())
+            barsShown = true
         }
         onIdle()
     }
 
     @Test
-    public fun add_remove_listener() {
+    public fun add_both_listener() {
         assumeNotCuttlefish()
 
         val container = scenario.withActivity { findViewById(R.id.container) }
         var applyInsetsCalled = false
         var insetsAnimationCallbackCalled = false
-        var latch = CountDownLatch(2)
+        val insetsLatch = CountDownLatch(1)
+        val animationLatch = CountDownLatch(1)
         val animationCallback = createCallback(
             onPrepare = {
                 insetsAnimationCallbackCalled = true
-                latch.countDown()
+                animationLatch.countDown()
             }
         )
         val insetListener: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
             { _, insetsCompat ->
                 applyInsetsCalled = true
-                latch.countDown()
+                insetsLatch.countDown()
                 insetsCompat
             }
 
@@ -88,7 +93,8 @@
         ViewCompat.setOnApplyWindowInsetsListener(container, insetListener)
         ViewCompat.setWindowInsetsAnimationCallback(container, animationCallback)
         triggerInsetAnimation(container)
-        latch.await(4, TimeUnit.SECONDS)
+        animationLatch.await(4, TimeUnit.SECONDS)
+        insetsLatch.await(4, TimeUnit.SECONDS)
         assertTrue(
             "The WindowInsetsAnimationCallback has not been called",
             insetsAnimationCallbackCalled
@@ -97,16 +103,36 @@
             "onApplyWindowInsetsListener has not been called",
             applyInsetsCalled
         )
-        resetBars(container)
+    }
 
-        // Remove the applyWindowInsets listener and check that the animation callback is still
-        // called
-        applyInsetsCalled = false
-        insetsAnimationCallbackCalled = false
-        latch = CountDownLatch(1)
+    @Test
+    public fun remove_insets_listener() {
+        assumeNotCuttlefish()
+
+        val container = scenario.withActivity { findViewById(R.id.container) }
+        var applyInsetsCalled = false
+        var insetsAnimationCallbackCalled = false
+        val insetsLatch = CountDownLatch(1)
+        val animationLatch = CountDownLatch(1)
+        val animationCallback = createCallback(
+            onPrepare = {
+                insetsAnimationCallbackCalled = true
+                animationLatch.countDown()
+            }
+        )
+        val insetListener: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
+            { _, insetsCompat ->
+                applyInsetsCalled = true
+                insetsLatch.countDown()
+                insetsCompat
+            }
+
+        // Check that both ApplyWindowInsets and the Animation Callback are called
+        ViewCompat.setOnApplyWindowInsetsListener(container, insetListener)
+        ViewCompat.setWindowInsetsAnimationCallback(container, animationCallback)
         ViewCompat.setOnApplyWindowInsetsListener(container, null)
         triggerInsetAnimation(container)
-        latch.await(4, TimeUnit.SECONDS)
+        animationLatch.await(4, TimeUnit.SECONDS)
         assertFalse(
             "onApplyWindowInsetsListener should NOT have been called",
             applyInsetsCalled
@@ -115,18 +141,35 @@
             "The WindowInsetsAnimationCallback has not been called",
             insetsAnimationCallbackCalled
         )
+    }
 
-        resetBars(container)
+    @Test
+    public fun remove_animation_listener() {
+        assumeNotCuttlefish()
 
-        // Add an applyWindowInsets listener and remove the animation callback and check if the
-        // listener is called
-        applyInsetsCalled = false
-        insetsAnimationCallbackCalled = false
-        latch = CountDownLatch(1)
+        val container = scenario.withActivity { findViewById(R.id.container) }
+        var applyInsetsCalled = false
+        var insetsAnimationCallbackCalled = false
+        val insetsLatch = CountDownLatch(1)
+        val animationLatch = CountDownLatch(1)
+        val animationCallback = createCallback(
+            onPrepare = {
+                insetsAnimationCallbackCalled = true
+                animationLatch.countDown()
+            }
+        )
+        val insetListener: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
+            { _, insetsCompat ->
+                applyInsetsCalled = true
+                insetsLatch.countDown()
+                insetsCompat
+            }
+
         ViewCompat.setOnApplyWindowInsetsListener(container, insetListener)
+        ViewCompat.setWindowInsetsAnimationCallback(container, animationCallback)
         ViewCompat.setWindowInsetsAnimationCallback(container, null)
         triggerInsetAnimation(container)
-        latch.await(4, TimeUnit.SECONDS)
+        insetsLatch.await(4, TimeUnit.SECONDS)
         assertTrue("onApplyWindowInsetsListener has not been called", applyInsetsCalled)
         assertFalse(
             "The WindowInsetsAnimationCallback should NOT have been called",
@@ -182,13 +225,13 @@
 
     private fun triggerInsetAnimation(container: View) {
         scenario.onActivity {
-            ViewCompat.getWindowInsetsController(container)!!.hide(systemBars())
-        }
-    }
-
-    private fun resetBars(container: View) {
-        scenario.onActivity {
-            ViewCompat.getWindowInsetsController(container)!!.show(systemBars())
+            if (barsShown) {
+                ViewCompat.getWindowInsetsController(container)!!.hide(statusBars())
+                barsShown = false
+            } else {
+                ViewCompat.getWindowInsetsController(container)!!.show(statusBars())
+                barsShown = true
+            }
         }
     }
 
@@ -200,7 +243,8 @@
         var applyInsetsCalled3 = false
         var insetsAnimationCallbackCalled1 = false
         var insetsAnimationCallbackCalled2 = false
-        val latch = CountDownLatch(2)
+        val insetsLatch = CountDownLatch(1)
+        val animationLatch = CountDownLatch(1)
         val animationCallback1 = createCallback(
             onPrepare = {
                 insetsAnimationCallbackCalled1 = true
@@ -209,7 +253,7 @@
         val animationCallback2 = createCallback(
             onPrepare = {
                 insetsAnimationCallbackCalled2 = true
-                latch.countDown()
+                animationLatch.countDown()
             }
         )
         val insetListener1: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
@@ -227,7 +271,7 @@
         val insetListener3: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
             { _, insetsCompat ->
                 applyInsetsCalled3 = true
-                latch.countDown()
+                insetsLatch.countDown()
                 insetsCompat
             }
 
@@ -238,7 +282,8 @@
         ViewCompat.setWindowInsetsAnimationCallback(container, animationCallback2)
         ViewCompat.setOnApplyWindowInsetsListener(container, insetListener3)
         triggerInsetAnimation(container)
-        latch.await(5, TimeUnit.SECONDS)
+        animationLatch.await(5, TimeUnit.SECONDS)
+        insetsLatch.await(5, TimeUnit.SECONDS)
         assertFalse(
             "The WindowInsetsAnimationCallback #1 should have not been called",
             insetsAnimationCallbackCalled1
@@ -268,24 +313,26 @@
         val container = scenario.withActivity { findViewById(R.id.container) }
         var applyInsetsCalled = false
         var insetsAnimationCallbackCalled = false
-        var latch = CountDownLatch(2)
+        val insetsLatch = CountDownLatch(1)
+        val animationLatch = CountDownLatch(1)
         val animationCallback = createCallback(
             onPrepare = {
                 insetsAnimationCallbackCalled = true
-                latch.countDown()
+                animationLatch.countDown()
             }
         )
         val insetListener: (v: View, insets: WindowInsetsCompat) -> WindowInsetsCompat =
             { _, insetsCompat ->
                 applyInsetsCalled = true
-                latch.countDown()
+                insetsLatch.countDown()
                 insetsCompat
             }
 
         ViewCompat.setWindowInsetsAnimationCallback(container, animationCallback)
         ViewCompat.setOnApplyWindowInsetsListener(container, insetListener)
         triggerInsetAnimation(container)
-        latch.await(4, TimeUnit.SECONDS)
+        animationLatch.await(4, TimeUnit.SECONDS)
+        insetsLatch.await(4, TimeUnit.SECONDS)
         assertTrue(
             "The WindowInsetsAnimationCallback has not been called",
             insetsAnimationCallbackCalled
@@ -395,10 +442,6 @@
             childListenerCalledCount
         )
 
-        // Then we do the same but without consuming the insets in the parent, so the child
-        // listener should be called.
-        resetBars(container)
-
         onPrepareLatch = CountDownLatch(1)
         val dispatchCallback = createCallback(
             onPrepare = {
diff --git a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
index ba0899c..456e8ae 100644
--- a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
+++ b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsCompatActivityTest.kt
@@ -37,6 +37,7 @@
 import androidx.test.espresso.matcher.ViewMatchers.hasFocus
 import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
 import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.withActivity
@@ -292,6 +293,7 @@
     }
 
     @Test
+    @FlakyTest
     @SdkSuppress(minSdkVersion = 21)
     public fun rootInsets_no_ime() {
         scenario.onActivity { activity ->
diff --git a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt
index 667fc08..ca37b0c 100644
--- a/core/core/src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt
+++ b/core/core/src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt
@@ -71,11 +71,13 @@
         }
         // Close the IME if it's open, so we start from a known scenario
         onView(withId(R.id.edittext)).perform(closeSoftKeyboard())
-        ViewCompat.getWindowInsetsController(container)!!.systemBarsBehavior =
-            WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
 
-        // Needed on API 23 to report the nav bar insets
-        scenario.withActivity { this.window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) }
+        scenario.withActivity {
+            ViewCompat.getWindowInsetsController(container)!!.systemBarsBehavior =
+                WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+            // Needed on API 23 to report the nav bar insets
+            this.window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
+        }
     }
 
     /**
@@ -260,6 +262,55 @@
         }
     }
 
+    @Test
+    @SdkSuppress(maxSdkVersion = 29) // Flag deprecated in 30+
+    public fun systemBarsBehavior_swipe() {
+        scenario.onActivity {
+            windowInsetsController.systemBarsBehavior =
+                WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE
+        }
+        val decorView = scenario.withActivity { window.decorView }
+        val sysUiVis = decorView.systemUiVisibility
+        assertEquals(
+            View.SYSTEM_UI_FLAG_IMMERSIVE,
+            sysUiVis and View.SYSTEM_UI_FLAG_IMMERSIVE
+        )
+        assertEquals(0, sysUiVis and View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
+    }
+
+    @Test
+    @SdkSuppress(maxSdkVersion = 29) // Flag deprecated in 30+
+    public fun systemBarsBehavior_transient() {
+        scenario.onActivity {
+            windowInsetsController.systemBarsBehavior =
+                WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+        }
+        val decorView = scenario.withActivity { window.decorView }
+        val sysUiVis = decorView.systemUiVisibility
+        assertEquals(
+            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY,
+            sysUiVis and View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+        )
+        assertEquals(0, sysUiVis and View.SYSTEM_UI_FLAG_IMMERSIVE)
+    }
+
+    @Test
+    public fun systemBarsBehavior_touch() {
+        scenario.onActivity {
+            windowInsetsController.systemBarsBehavior =
+                WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH
+        }
+        val decorView = scenario.withActivity { window.decorView }
+        val sysUiVis = decorView.systemUiVisibility
+        assertEquals(
+            0,
+            sysUiVis and (
+                View.SYSTEM_UI_FLAG_IMMERSIVE
+                    or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                )
+        )
+    }
+
     private fun assumeNotCuttlefish() {
         // TODO: remove this if b/159103848 is resolved
         assumeFalse(
diff --git a/core/core/src/androidTest/res/color/color_state_list_secondary_text.xml b/core/core/src/androidTest/res/color/color_state_list_secondary_text.xml
new file mode 100644
index 0000000..65a745f
--- /dev/null
+++ b/core/core/src/androidTest/res/color/color_state_list_secondary_text.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:color="?android:attr/textColorPrimary"
+        app:alpha="0.54" />
+</selector>
diff --git a/core/core/src/androidTest/res/values/strings.xml b/core/core/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from core/core/src/androidTest/res/values/strings.xml
rename to core/core/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/core/core/src/androidTest/res/values/styles.xml b/core/core/src/androidTest/res/values/styles.xml
index b74bacc..46580a2 100644
--- a/core/core/src/androidTest/res/values/styles.xml
+++ b/core/core/src/androidTest/res/values/styles.xml
@@ -34,4 +34,8 @@
         <item name="theme_color_focused">@color/theme_color_lilac_focused</item>
         <item name="theme_color_pressed">@color/theme_color_lilac_pressed</item>
     </style>
+
+    <style name="ThemeOverlay.Core.ColorStateListInflaterCompat" parent="">
+        <item name="android:textColorPrimary">@color/text_color</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/core/core/src/main/java/androidx/core/content/ContextCompat.java b/core/core/src/main/java/androidx/core/content/ContextCompat.java
index 0497817f3..882f35b 100644
--- a/core/core/src/main/java/androidx/core/content/ContextCompat.java
+++ b/core/core/src/main/java/androidx/core/content/ContextCompat.java
@@ -84,11 +84,13 @@
 import android.appwidget.AppWidgetManager;
 import android.bluetooth.BluetoothManager;
 import android.content.ClipboardManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.RestrictionsManager;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.hardware.ConsumerIrManager;
@@ -115,6 +117,7 @@
 import android.os.Handler;
 import android.os.PowerManager;
 import android.os.Process;
+import android.os.StatFs;
 import android.os.UserManager;
 import android.os.Vibrator;
 import android.os.storage.StorageManager;
@@ -133,10 +136,13 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.content.res.ResourcesCompat;
 import androidx.core.os.EnvironmentCompat;
 import androidx.core.os.ExecutorCompat;
 
@@ -145,7 +151,7 @@
 import java.util.concurrent.Executor;
 
 /**
- * Helper for accessing features in {@link android.content.Context}.
+ * Helper for accessing features in {@link Context}.
  */
 public class ContextCompat {
     private static final String TAG = "ContextCompat";
@@ -172,7 +178,7 @@
     @Nullable
     public static String getAttributionTag(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 30) {
-            return context.getAttributionTag();
+            return Api30Impl.getAttributionTag(context);
         }
 
         return null;
@@ -231,13 +237,13 @@
      * @param intents Array of intents defining the activities that will be started. The element
      *                length-1 will correspond to the top activity on the resulting task stack.
      * @param options Additional options for how the Activity should be started.
-     * See {@link android.content.Context#startActivity(Intent, android.os.Bundle)}
+     *                See {@link Context#startActivity(Intent, Bundle)}
      * @return true if the underlying API was available and the call was successful, false otherwise
      */
     public static boolean startActivities(@NonNull Context context, @NonNull Intent[] intents,
             @Nullable Bundle options) {
         if (Build.VERSION.SDK_INT >= 16) {
-            context.startActivities(intents, options);
+            Api16Impl.startActivities(context, intents, options);
         } else {
             context.startActivities(intents);
         }
@@ -254,7 +260,7 @@
      * not exist the activity will be launched normally.</p>
      *
      * @param context Context to launch activity from.
-     * @param intent The description of the activity to start.
+     * @param intent  The description of the activity to start.
      * @param options Additional options for how the Activity should be started.
      *                May be null if there are no options. See
      *                {@link ActivityOptionsCompat} for how to build the Bundle
@@ -264,7 +270,7 @@
     public static void startActivity(@NonNull Context context, @NonNull Intent intent,
             @Nullable Bundle options) {
         if (Build.VERSION.SDK_INT >= 16) {
-            context.startActivity(intent, options);
+            Api16Impl.startActivity(context, intent, options);
         } else {
             context.startActivity(intent);
         }
@@ -288,7 +294,7 @@
     @Nullable
     public static File getDataDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
-            return context.getDataDir();
+            return Api24Impl.getDataDir(context);
         } else {
             final String dataDir = context.getApplicationInfo().dataDir;
             return dataDir != null ? new File(dataDir) : null;
@@ -317,9 +323,9 @@
      * <p>
      * An application may store data on any or all of the returned devices. For
      * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
+     * most available space, as measured by {@link StatFs}.
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * Starting in {@link Build.VERSION_CODES#KITKAT}, no permissions
      * are required to write to the returned paths; they're always accessible to
      * the calling app. Before then,
      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
@@ -341,9 +347,9 @@
     @NonNull
     public static File[] getObbDirs(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return context.getObbDirs();
+            return Api19Impl.getObbDirs(context);
         } else {
-            return new File[] { context.getObbDir() };
+            return new File[]{context.getObbDir()};
         }
     }
 
@@ -369,9 +375,9 @@
      * <p>
      * An application may store data on any or all of the returned devices. For
      * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
+     * most available space, as measured by {@link StatFs}.
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * Starting in {@link Build.VERSION_CODES#KITKAT}, no permissions
      * are required to write to the returned paths; they're always accessible to
      * the calling app. Before then,
      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
@@ -394,9 +400,9 @@
     @NonNull
     public static File[] getExternalFilesDirs(@NonNull Context context, @Nullable String type) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return context.getExternalFilesDirs(type);
+            return Api19Impl.getExternalFilesDirs(context, type);
         } else {
-            return new File[] { context.getExternalFilesDir(type) };
+            return new File[]{context.getExternalFilesDir(type)};
         }
     }
 
@@ -422,9 +428,9 @@
      * <p>
      * An application may store data on any or all of the returned devices. For
      * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
+     * most available space, as measured by {@link StatFs}.
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * Starting in {@link Build.VERSION_CODES#KITKAT}, no permissions
      * are required to write to the returned paths; they're always accessible to
      * the calling app. Before then,
      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
@@ -447,16 +453,16 @@
     @NonNull
     public static File[] getExternalCacheDirs(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return context.getExternalCacheDirs();
+            return Api19Impl.getExternalCacheDirs(context);
         } else {
-            return new File[] { context.getExternalCacheDir() };
+            return new File[]{context.getExternalCacheDir()};
         }
     }
 
     /**
      * Returns a drawable object associated with a particular resource ID.
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the
+     * Starting in {@link Build.VERSION_CODES#LOLLIPOP}, the
      * returned drawable will be styled for the specified Context's theme.
      *
      * @param id The desired resource identifier, as generated by the aapt tool.
@@ -468,7 +474,7 @@
     @Nullable
     public static Drawable getDrawable(@NonNull Context context, @DrawableRes int id) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return context.getDrawable(id);
+            return Api21Impl.getDrawable(context, id);
         } else if (Build.VERSION.SDK_INT >= 16) {
             return context.getResources().getDrawable(id);
         } else {
@@ -491,32 +497,26 @@
     /**
      * Returns a color state list associated with a particular resource ID.
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
+     * Starting in {@link Build.VERSION_CODES#M}, the returned
      * color state list will be styled for the specified Context's theme.
      *
      * @param id The desired resource identifier, as generated by the aapt
      *           tool. This integer encodes the package, type, and resource
      *           entry. The value 0 is an invalid identifier.
      * @return A color state list, or {@code null} if the resource could not be
-     *         resolved.
+     * resolved.
      * @throws android.content.res.Resources.NotFoundException if the given ID
      *         does not exist.
      */
-    @SuppressWarnings("deprecation")
     @Nullable
-    public static ColorStateList getColorStateList(@NonNull Context context,
-            @ColorRes int id) {
-        if (Build.VERSION.SDK_INT >= 23) {
-            return context.getColorStateList(id);
-        } else {
-            return context.getResources().getColorStateList(id);
-        }
+    public static ColorStateList getColorStateList(@NonNull Context context, @ColorRes int id) {
+        return ResourcesCompat.getColorStateList(context.getResources(), id, context.getTheme());
     }
 
     /**
      * Returns a color associated with a particular resource ID
      * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
+     * Starting in {@link Build.VERSION_CODES#M}, the returned
      * color will be styled for the specified Context's theme.
      *
      * @param id The desired resource identifier, as generated by the aapt
@@ -530,7 +530,7 @@
     @ColorInt
     public static int getColor(@NonNull Context context, @ColorRes int id) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return context.getColor(id);
+            return Api23Impl.getColor(context, id);
         } else {
             return context.getResources().getColor(id);
         }
@@ -540,38 +540,35 @@
      * Determine whether <em>you</em> have been granted a particular permission.
      *
      * @param permission The name of the permission being checked.
-     *
-     * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if you have the
-     * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not.
-     *
-     * @see android.content.pm.PackageManager#checkPermission(String, String)
+     * @return {@link PackageManager#PERMISSION_GRANTED} if you have the
+     * permission, or {@link PackageManager#PERMISSION_DENIED} if not.
+     * @see PackageManager#checkPermission(String, String)
      */
     public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
         if (permission == null) {
             throw new IllegalArgumentException("permission is null");
         }
 
-        return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
+        return context.checkPermission(permission, Process.myPid(), Process.myUid());
     }
 
     /**
      * Returns the absolute path to the directory on the filesystem similar to
      * {@link Context#getFilesDir()}.  The difference is that files placed under this
      * directory will be excluded from automatic backup to remote storage on
-     * devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later.
+     * devices running {@link Build.VERSION_CODES#LOLLIPOP} or later.
      *
      * <p>No permissions are required to read or write to the returned path, since this
      * path is internal storage.
      *
      * @return The path of the directory holding application files that will not be
-     *         automatically backed up to remote storage.
-     *
-     * @see android.content.Context#getFilesDir()
+     * automatically backed up to remote storage.
+     * @see Context#getFilesDir()
      */
     @Nullable
     public static File getNoBackupFilesDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return context.getNoBackupFilesDir();
+            return Api21Impl.getNoBackupFilesDir(context);
         } else {
             ApplicationInfo appInfo = context.getApplicationInfo();
             return createFilesDir(new File(appInfo.dataDir, "no_backup"));
@@ -581,7 +578,7 @@
     /**
      * Returns the absolute path to the application specific cache directory on
      * the filesystem designed for storing cached code. On devices running
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later, the system will delete
+     * {@link Build.VERSION_CODES#LOLLIPOP} or later, the system will delete
      * any files stored in this location both when your specific application is
      * upgraded, and when the entire platform is upgraded.
      * <p>
@@ -595,7 +592,7 @@
      */
     public static File getCodeCacheDir(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return context.getCodeCacheDir();
+            return Api21Impl.getCodeCacheDir(context);
         } else {
             ApplicationInfo appInfo = context.getApplicationInfo();
             return createFilesDir(new File(appInfo.dataDir, "code_cache"));
@@ -650,7 +647,7 @@
     @Nullable
     public static Context createDeviceProtectedStorageContext(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
-            return context.createDeviceProtectedStorageContext();
+            return Api24Impl.createDeviceProtectedStorageContext(context);
         } else {
             return null;
         }
@@ -664,7 +661,7 @@
      */
     public static boolean isDeviceProtectedStorage(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
-            return context.isDeviceProtectedStorage();
+            return Api24Impl.isDeviceProtectedStorage(context);
         } else {
             return false;
         }
@@ -677,7 +674,7 @@
      */
     public static Executor getMainExecutor(Context context) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return context.getMainExecutor();
+            return Api28Impl.getMainExecutor(context);
         }
         return ExecutorCompat.create(new Handler(context.getMainLooper()));
     }
@@ -687,14 +684,13 @@
      * for before O.
      *
      * @param context Context to start Service from.
-     * @param intent The description of the Service to start.
-     *
+     * @param intent  The description of the Service to start.
      * @see Context#startForegroundService(Intent)
      * @see Context#startService(Intent)
      */
     public static void startForegroundService(@NonNull Context context, @NonNull Intent intent) {
         if (Build.VERSION.SDK_INT >= 26) {
-            context.startForegroundService(intent);
+            Api26Impl.startForegroundService(context, intent);
         } else {
             // Pre-O behavior.
             context.startService(intent);
@@ -704,17 +700,16 @@
     /**
      * Return the handle to a system-level service by class.
      *
-     * @param context Context to retrieve service from.
+     * @param context      Context to retrieve service from.
      * @param serviceClass The class of the desired service.
      * @return The service or null if the class is not a supported system service.
-     *
      * @see Context#getSystemService(Class)
      */
     @SuppressWarnings("unchecked")
     @Nullable
     public static <T> T getSystemService(@NonNull Context context, @NonNull Class<T> serviceClass) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return context.getSystemService(serviceClass);
+            return Api23Impl.getSystemService(context, serviceClass);
         }
 
         String serviceName = getSystemServiceName(context, serviceClass);
@@ -724,17 +719,16 @@
     /**
      * Gets the name of the system-level service that is represented by the specified class.
      *
-     * @param context Context to retrieve service name from.
+     * @param context      Context to retrieve service name from.
      * @param serviceClass The class of the desired service.
      * @return The service name or null if the class is not a supported system service.
-     *
      * @see Context#getSystemServiceName(Class)
      */
     @Nullable
     public static String getSystemServiceName(@NonNull Context context,
             @NonNull Class<?> serviceClass) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return context.getSystemServiceName(serviceClass);
+            return Api23Impl.getSystemServiceName(context, serviceClass);
         }
         return LegacyServiceMapHolder.SERVICES.get(serviceClass);
     }
@@ -809,4 +803,150 @@
             SERVICES.put(WindowManager.class, WINDOW_SERVICE);
         }
     }
+
+    @RequiresApi(16)
+    static class Api16Impl {
+        private Api16Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void startActivities(Context obj, Intent[] intents, Bundle options) {
+            obj.startActivities(intents, options);
+        }
+
+        @DoNotInline
+        static void startActivity(Context obj, Intent intent, Bundle options) {
+            obj.startActivity(intent, options);
+        }
+    }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static File[] getExternalCacheDirs(Context obj) {
+            return obj.getExternalCacheDirs();
+        }
+
+        @DoNotInline
+        static File[] getExternalFilesDirs(Context obj, String type) {
+            return obj.getExternalFilesDirs(type);
+        }
+
+        @DoNotInline
+        static File[] getObbDirs(Context obj) {
+            return obj.getObbDirs();
+        }
+    }
+
+    @RequiresApi(21)
+    static class Api21Impl {
+        private Api21Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Drawable getDrawable(Context obj, int id) {
+            return obj.getDrawable(id);
+        }
+
+        @DoNotInline
+        static File getNoBackupFilesDir(Context obj) {
+            return obj.getNoBackupFilesDir();
+        }
+
+        @DoNotInline
+        static File getCodeCacheDir(Context obj) {
+            return obj.getCodeCacheDir();
+        }
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static ColorStateList getColorStateList(Context obj, int id) {
+            return obj.getColorStateList(id);
+        }
+
+        @DoNotInline
+        static int getColor(Context obj, int id) {
+            return obj.getColor(id);
+        }
+
+        @DoNotInline
+        static <T> T getSystemService(Context obj, Class<T> serviceClass) {
+            return obj.getSystemService(serviceClass);
+        }
+
+        @DoNotInline
+        static String getSystemServiceName(Context obj, Class<?> serviceClass) {
+            return obj.getSystemServiceName(serviceClass);
+        }
+    }
+
+    @RequiresApi(24)
+    static class Api24Impl {
+        private Api24Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static File getDataDir(Context obj) {
+            return obj.getDataDir();
+        }
+
+        @DoNotInline
+        static Context createDeviceProtectedStorageContext(Context obj) {
+            return obj.createDeviceProtectedStorageContext();
+        }
+
+        @DoNotInline
+        static boolean isDeviceProtectedStorage(Context obj) {
+            return obj.isDeviceProtectedStorage();
+        }
+    }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static ComponentName startForegroundService(Context obj, Intent service) {
+            return obj.startForegroundService(service);
+        }
+    }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Executor getMainExecutor(Context obj) {
+            return obj.getMainExecutor();
+        }
+    }
+
+    @RequiresApi(30)
+    static class Api30Impl {
+        private Api30Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static String getAttributionTag(Context obj) {
+            return obj.getAttributionTag();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java b/core/core/src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java
index 5ad4c33..a6db56b 100644
--- a/core/core/src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java
+++ b/core/core/src/main/java/androidx/core/content/pm/ShortcutManagerCompat.java
@@ -760,6 +760,7 @@
             for (ShortcutInfoChangeListener listener : getShortcutInfoListeners(context)) {
                 listener.onShortcutAdded(Collections.singletonList(shortcut));
             }
+            reportShortcutUsed(context, shortcut.getId());
         }
         return false;
     }
diff --git a/core/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java b/core/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
index 0f90a91..2015927 100644
--- a/core/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
+++ b/core/core/src/main/java/androidx/core/content/res/ColorStateListInflaterCompat.java
@@ -25,9 +25,11 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.StateSet;
+import android.util.TypedValue;
 import android.util.Xml;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
 import androidx.annotation.FloatRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -46,6 +48,8 @@
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 public final class ColorStateListInflaterCompat {
 
+    private static final ThreadLocal<TypedValue> sTempTypedValue = new ThreadLocal<>();
+
     private ColorStateListInflaterCompat() {
     }
 
@@ -141,8 +145,18 @@
             }
 
             final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.ColorStateListItem);
-            final int baseColor = a.getColor(R.styleable.ColorStateListItem_android_color,
-                    Color.MAGENTA);
+            int resourceId = a.getResourceId(R.styleable.ColorStateListItem_android_color, -1);
+            int baseColor;
+            if (resourceId != -1 && !isColorInt(r, resourceId)) {
+                try {
+                    baseColor = createFromXml(r, r.getXml(resourceId), theme).getDefaultColor();
+                } catch (Exception e) {
+                    baseColor = a.getColor(R.styleable.ColorStateListItem_android_color,
+                            Color.MAGENTA);
+                }
+            } else {
+                baseColor = a.getColor(R.styleable.ColorStateListItem_android_color, Color.MAGENTA);
+            }
 
             float alphaMod = 1.0f;
             if (a.hasValue(R.styleable.ColorStateListItem_android_alpha)) {
@@ -186,6 +200,23 @@
         return new ColorStateList(stateSpecs, colors);
     }
 
+    private static boolean isColorInt(@NonNull Resources r, @ColorRes int resId) {
+        final TypedValue value = getTypedValue();
+        r.getValue(resId, value, true);
+        return value.type >= TypedValue.TYPE_FIRST_COLOR_INT
+                && value.type <= TypedValue.TYPE_LAST_COLOR_INT;
+    }
+
+    @NonNull
+    private static TypedValue getTypedValue() {
+        TypedValue tv = sTempTypedValue.get();
+        if (tv == null) {
+            tv = new TypedValue();
+            sTempTypedValue.set(tv);
+        }
+        return tv;
+    }
+
     private static TypedArray obtainAttributes(Resources res, Resources.Theme theme,
             AttributeSet set, int[] attrs) {
         return theme == null ? res.obtainAttributes(set, attrs)
diff --git a/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java b/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
index d05198e..ff21626c 100644
--- a/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
+++ b/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
@@ -23,6 +23,7 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.content.res.Resources.Theme;
@@ -32,6 +33,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
+import android.util.SparseArray;
 import android.util.TypedValue;
 
 import androidx.annotation.AnyRes;
@@ -48,19 +50,26 @@
 import androidx.core.graphics.TypefaceCompat;
 import androidx.core.provider.FontsContractCompat.FontRequestCallback;
 import androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason;
+import androidx.core.util.ObjectsCompat;
 import androidx.core.util.Preconditions;
 
+import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.WeakHashMap;
 
 /**
  * Helper for accessing features in {@link android.content.res.Resources}.
  */
 public final class ResourcesCompat {
     private static final String TAG = "ResourcesCompat";
+    private static final ThreadLocal<TypedValue> sTempTypedValue = new ThreadLocal<>();
+    private static final WeakHashMap<ColorStateListCacheKey, SparseArray<ColorStateListCacheEntry>>
+            sColorStateCaches = new WeakHashMap<>(0);
+    private static final Object sColorStateCacheLock = new Object();
 
     /**
      * The {@code null} resource ID. This denotes an invalid resource ID that is returned by the
@@ -165,9 +174,6 @@
      * Returns a themed color state list associated with a particular resource
      * ID. The resource may contain either a single raw color value or a
      * complex {@link ColorStateList} holding multiple possible colors.
-     * <p>
-     * Prior to API level 23, the theme will not be applied and this method
-     * calls through to {@link Resources#getColorStateList(int)}.
      *
      * @param id The desired resource identifier of a {@link ColorStateList},
      *           as generated by the aapt tool. This integer encodes the
@@ -185,9 +191,129 @@
     public static ColorStateList getColorStateList(@NonNull Resources res, @ColorRes int id,
             @Nullable Theme theme) throws NotFoundException {
         if (SDK_INT >= 23) {
+            // On M+ we can use the framework
             return res.getColorStateList(id, theme);
-        } else {
-            return res.getColorStateList(id);
+        }
+
+        // Before that, we'll try handle it ourselves
+        ColorStateListCacheKey key = new ColorStateListCacheKey(res, theme);
+        ColorStateList csl = getCachedColorStateList(key, id);
+        if (csl != null) {
+            return csl;
+        }
+        // Cache miss, so try and inflate it ourselves
+        csl = inflateColorStateList(res, id, theme);
+        if (csl != null) {
+            // If we inflated it, add it to the cache and return
+            addColorStateListToCache(key, id, csl);
+            return csl;
+        }
+        // If we reach here then we couldn't inflate it, so let the framework handle it
+        return res.getColorStateList(id);
+    }
+
+    /**
+     * Inflates a {@link ColorStateList} from resources, honouring theme attributes.
+     */
+    @Nullable
+    private static ColorStateList inflateColorStateList(Resources resources, int resId,
+            @Nullable Theme theme) {
+        if (isColorInt(resources, resId)) {
+            // The resource is a color int, we can't handle it so return null
+            return null;
+        }
+        final XmlPullParser xml = resources.getXml(resId);
+        try {
+            return ColorStateListInflaterCompat.createFromXml(resources, xml, theme);
+        } catch (Exception e) {
+            Log.e(TAG, "Failed to inflate ColorStateList, leaving it to the framework", e);
+        }
+        return null;
+    }
+
+    @Nullable
+    private static ColorStateList getCachedColorStateList(@NonNull ColorStateListCacheKey key,
+            @ColorRes int resId) {
+        synchronized (sColorStateCacheLock) {
+            final SparseArray<ColorStateListCacheEntry> entries = sColorStateCaches.get(key);
+            if (entries != null && entries.size() > 0) {
+                final ColorStateListCacheEntry entry = entries.get(resId);
+                if (entry != null) {
+                    if (entry.mConfiguration.equals(key.mResources.getConfiguration())) {
+                        // If the current configuration matches the entry's, we can use it
+                        return entry.mValue;
+                    } else {
+                        // Otherwise we'll remove the entry
+                        entries.remove(resId);
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private static void addColorStateListToCache(@NonNull ColorStateListCacheKey key,
+            @ColorRes int resId,
+            @NonNull ColorStateList value) {
+        synchronized (sColorStateCacheLock) {
+            SparseArray<ColorStateListCacheEntry> entries = sColorStateCaches.get(key);
+            if (entries == null) {
+                entries = new SparseArray<>();
+                sColorStateCaches.put(key, entries);
+            }
+            entries.append(resId, new ColorStateListCacheEntry(value,
+                    key.mResources.getConfiguration()));
+        }
+    }
+
+    private static boolean isColorInt(@NonNull Resources resources, @ColorRes int resId) {
+        final TypedValue value = getTypedValue();
+        resources.getValue(resId, value, true);
+        return value.type >= TypedValue.TYPE_FIRST_COLOR_INT
+                && value.type <= TypedValue.TYPE_LAST_COLOR_INT;
+    }
+
+    @NonNull
+    private static TypedValue getTypedValue() {
+        TypedValue tv = sTempTypedValue.get();
+        if (tv == null) {
+            tv = new TypedValue();
+            sTempTypedValue.set(tv);
+        }
+        return tv;
+    }
+
+    private static final class ColorStateListCacheKey {
+        final Resources mResources;
+        @Nullable final Theme mTheme;
+
+        ColorStateListCacheKey(@NonNull Resources resources, @Nullable Theme theme) {
+            mResources = resources;
+            mTheme = theme;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            ColorStateListCacheKey that = (ColorStateListCacheKey) o;
+            return mResources.equals(that.mResources)
+                    && ObjectsCompat.equals(mTheme, that.mTheme);
+        }
+
+        @Override
+        public int hashCode() {
+            return ObjectsCompat.hash(mResources, mTheme);
+        }
+    }
+
+    private static class ColorStateListCacheEntry {
+        final ColorStateList mValue;
+        final Configuration mConfiguration;
+        ColorStateListCacheEntry(@NonNull ColorStateList value,
+                @NonNull Configuration configuration) {
+            mValue = value;
+            mConfiguration = configuration;
         }
     }
 
@@ -202,9 +328,11 @@
      *         not exist or is not a floating-point value.
      */
     public static float getFloat(@NonNull Resources res, @DimenRes int id) {
-        // TODO call into platform on Q+
+        if (SDK_INT >= 29) {
+            return ImplApi29.getFloat(res, id);
+        }
 
-        TypedValue value = new TypedValue();
+        TypedValue value = getTypedValue();
         res.getValue(id, value, true);
         if (value.type == TypedValue.TYPE_FLOAT) {
             return value.getFloat();
@@ -492,6 +620,14 @@
         return null;
     }
 
+    @RequiresApi(29)
+    static class ImplApi29 {
+        private ImplApi29() {}
+        static float getFloat(@NonNull Resources res, @DimenRes int id) {
+            return res.getFloat(id);
+        }
+    }
+
     private ResourcesCompat() {}
 
     /**
diff --git a/core/core/src/main/java/androidx/core/telephony/SubscriptionManagerCompat.java b/core/core/src/main/java/androidx/core/telephony/SubscriptionManagerCompat.java
new file mode 100644
index 0000000..0bd6994
--- /dev/null
+++ b/core/core/src/main/java/androidx/core/telephony/SubscriptionManagerCompat.java
@@ -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.core.telephony;
+
+import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import android.os.Build;
+import android.telephony.SubscriptionManager;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.RequiresApi;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Helper for accessing features in {@link SubscriptionManager}.
+ */
+@RequiresApi(22)
+public class SubscriptionManagerCompat {
+
+    private static Method sGetSlotIndexMethod;
+
+    /**
+     * Returns the slot index associated with the subscription id.
+     */
+    public static int getSlotIndex(int subId) {
+        if (subId == INVALID_SUBSCRIPTION_ID) {
+            return INVALID_SIM_SLOT_INDEX;
+        }
+
+        if (Build.VERSION.SDK_INT >= 29) {
+            return Api29Impl.getSlotIndex(subId);
+        } else {
+            try {
+                if (sGetSlotIndexMethod == null) {
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        sGetSlotIndexMethod = SubscriptionManager.class.getDeclaredMethod(
+                                "getSlotIndex", int.class);
+                    } else {
+                        sGetSlotIndexMethod = SubscriptionManager.class.getDeclaredMethod(
+                                "getSlotId", int.class);
+                    }
+                    sGetSlotIndexMethod.setAccessible(true);
+                }
+
+                Integer slotIdx = (Integer) sGetSlotIndexMethod.invoke(null, subId);
+                if (slotIdx != null) {
+                    return slotIdx;
+                }
+            } catch (NoSuchMethodException ignored) {
+            } catch (IllegalAccessException ignored) {
+            } catch (InvocationTargetException ignored) {
+            }
+
+            return INVALID_SIM_SLOT_INDEX;
+        }
+    }
+
+    private SubscriptionManagerCompat() {}
+
+    @RequiresApi(29)
+    private static class Api29Impl {
+        private Api29Impl() {}
+
+        @DoNotInline
+        static int getSlotIndex(int subId) {
+            return SubscriptionManager.getSlotIndex(subId);
+        }
+    }
+}
diff --git a/core/core/src/main/java/androidx/core/telephony/TelephonyManagerCompat.java b/core/core/src/main/java/androidx/core/telephony/TelephonyManagerCompat.java
new file mode 100644
index 0000000..4751a51
--- /dev/null
+++ b/core/core/src/main/java/androidx/core/telephony/TelephonyManagerCompat.java
@@ -0,0 +1,171 @@
+/*
+ * 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.telephony;
+
+import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import android.annotation.SuppressLint;
+import android.os.Build.VERSION;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Helper for accessing features in {@link TelephonyManager}.
+ */
+public class TelephonyManagerCompat {
+
+    private static Method sGetDeviceIdMethod;
+    private static Method sGetSubIdMethod;
+
+    /**
+     * Returns the IMEI (International Mobile Equipment Identity) associated with the
+     * subscription id of the given TelephonyManager, or null if not available.
+     *
+     * <p>Below Android 10, this API requires any of:
+     * <ul>
+     *     <li>the caller holds the READ_PHONE_STATE permission</li>
+     *     <li>the caller has carrier privileges (see
+     *     {@link TelephonyManager#hasCarrierPrivileges()})</li>
+     * </ul>
+     *
+     * <p>On Android 10 and above, this API requires any of:
+     * <ul>
+     *     <li>the caller holds the READ_PRIVILEGED_PHONE_STATE permission</li>
+     *     <li>the caller is the device or profile owner and holds the READ_PHONE_STATE
+     *     permission</li>
+     *     <li>the caller has carrier privileges (see
+     *     {@link TelephonyManager#hasCarrierPrivileges()})</li>
+     *     <li>the caller is the default SMS role holder (see
+     *     {@link android.app.role.RoleManager#isRoleHeld(String)})</li>
+     *     <li>the caller holds the USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER permission</li>
+     * </ul>
+     */
+    @SuppressLint("MissingPermission")
+    @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+    @Nullable
+    public static String getImei(@NonNull TelephonyManager telephonyManager) {
+        if (VERSION.SDK_INT >= 26) {
+            return Api26Impl.getImei(telephonyManager);
+        } else if (VERSION.SDK_INT >= 22) {
+            // below Android O the telephony manager has a severe bug (b/137114239) where many
+            // methods do not properly respect the subscription id and always use the default
+            // subscription id. so if we have a non-default subscription id, we need to do the work
+            // ourselves...
+            int subId = getSubscriptionId(telephonyManager);
+            if (subId != DEFAULT_SUBSCRIPTION_ID && subId != INVALID_SUBSCRIPTION_ID) {
+                int slotIndex = SubscriptionManagerCompat.getSlotIndex(subId);
+                if (VERSION.SDK_INT >= 23) {
+                    return Api23Impl.getDeviceId(telephonyManager, slotIndex);
+                } else {
+                    try {
+                        if (sGetDeviceIdMethod == null) {
+                            sGetDeviceIdMethod = TelephonyManager.class.getDeclaredMethod(
+                                    "getDeviceId",
+                                    int.class);
+                            sGetDeviceIdMethod.setAccessible(true);
+                        }
+
+                        return (String) sGetDeviceIdMethod.invoke(telephonyManager, slotIndex);
+                    } catch (NoSuchMethodException ignored) {
+                    } catch (IllegalAccessException ignored) {
+                    } catch (InvocationTargetException ignored) {
+                    }
+
+                    return null;
+                }
+            }
+        }
+
+        return telephonyManager.getDeviceId();
+    }
+
+    /**
+     * Return the subscription ID the TelephonyManager was created with (via
+     * {@link TelephonyManager#createForSubscriptionId(int)}) if applicable, and otherwise the
+     * default subscription ID.
+     */
+    @SuppressLint("SoonBlockedPrivateApi")
+    public static int getSubscriptionId(@NonNull TelephonyManager telephonyManager) {
+        if (VERSION.SDK_INT >= 30) {
+            return Api30Impl.getSubscriptionId(telephonyManager);
+        } else if (VERSION.SDK_INT >= 22) {
+            try {
+                if (sGetSubIdMethod == null) {
+                    sGetSubIdMethod = TelephonyManager.class.getDeclaredMethod("getSubId");
+                    sGetSubIdMethod.setAccessible(true);
+                }
+
+                Integer subId = (Integer) sGetSubIdMethod.invoke(telephonyManager);
+                if (subId != null && subId != INVALID_SUBSCRIPTION_ID) {
+                    return subId;
+                }
+            } catch (InvocationTargetException ignored) {
+            } catch (IllegalAccessException ignored) {
+            } catch (NoSuchMethodException ignored) {
+            }
+        }
+
+        return DEFAULT_SUBSCRIPTION_ID;
+    }
+
+    private TelephonyManagerCompat() {}
+
+    @RequiresApi(30)
+    private static class Api30Impl {
+        private Api30Impl() {}
+
+        @DoNotInline
+        static int getSubscriptionId(TelephonyManager telephonyManager) {
+            return telephonyManager.getSubscriptionId();
+        }
+    }
+
+    @RequiresApi(26)
+    private static class Api26Impl {
+        private Api26Impl() {}
+
+        @SuppressLint("MissingPermission")
+        @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+        @DoNotInline
+        @Nullable
+        static String getImei(TelephonyManager telephonyManager) {
+            return telephonyManager.getImei();
+        }
+    }
+
+    @RequiresApi(23)
+    private static class Api23Impl {
+        private Api23Impl() {}
+
+        @SuppressLint("MissingPermission")
+        @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+        @DoNotInline
+        @Nullable
+        static String getDeviceId(TelephonyManager telephonyManager, int slotIndex) {
+            return telephonyManager.getDeviceId(slotIndex);
+        }
+    }
+}
diff --git a/core/core/src/main/java/androidx/core/util/ObjectsCompat.java b/core/core/src/main/java/androidx/core/util/ObjectsCompat.java
index dc6d2d9..a0b7e79 100644
--- a/core/core/src/main/java/androidx/core/util/ObjectsCompat.java
+++ b/core/core/src/main/java/androidx/core/util/ObjectsCompat.java
@@ -17,6 +17,7 @@
 
 import android.os.Build;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import java.util.Arrays;
@@ -109,4 +110,50 @@
     public static String toString(@Nullable Object o, @Nullable String nullDefault) {
         return (o != null) ? o.toString() : nullDefault;
     }
+
+    /**
+     * Checks that the specified object reference is not {@code null}. This
+     * method is designed primarily for doing parameter validation in methods
+     * and constructors, as demonstrated below:
+     * <blockquote><pre>
+     * public Foo(Bar bar) {
+     *     this.bar = Objects.requireNonNull(bar);
+     * }
+     * </pre></blockquote>
+     *
+     * @param obj the object reference to check for nullity
+     * @param <T> the type of the reference
+     * @return {@code obj} if not {@code null}
+     * @throws NullPointerException if {@code obj} is {@code null}
+     */
+    @NonNull
+    public static <T> T requireNonNull(@Nullable T obj) {
+        if (obj == null) throw new NullPointerException();
+        return obj;
+    }
+
+    /**
+     * Checks that the specified object reference is not {@code null} and
+     * throws a customized {@link NullPointerException} if it is. This method
+     * is designed primarily for doing parameter validation in methods and
+     * constructors with multiple parameters, as demonstrated below:
+     * <blockquote><pre>
+     * public Foo(Bar bar, Baz baz) {
+     *     this.bar = Objects.requireNonNull(bar, "bar must not be null");
+     *     this.baz = Objects.requireNonNull(baz, "baz must not be null");
+     * }
+     * </pre></blockquote>
+     *
+     * @param obj     the object reference to check for nullity
+     * @param message detail message to be used in the event that a {@code
+     *                NullPointerException} is thrown
+     * @param <T> the type of the reference
+     * @return {@code obj} if not {@code null}
+     * @throws NullPointerException if {@code obj} is {@code null}
+     */
+    @NonNull
+    public static <T> T requireNonNull(@Nullable T obj, @NonNull String message) {
+        if (obj == null) throw new NullPointerException(message);
+        return obj;
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/view/ContentInfoCompat.java b/core/core/src/main/java/androidx/core/view/ContentInfoCompat.java
index 68b7112..ec5f385 100644
--- a/core/core/src/main/java/androidx/core/view/ContentInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/ContentInfoCompat.java
@@ -147,11 +147,11 @@
     @Override
     public String toString() {
         return "ContentInfoCompat{"
-                + "clip=" + mClip
+                + "clip=" + mClip.getDescription()
                 + ", source=" + sourceToString(mSource)
                 + ", flags=" + flagsToString(mFlags)
-                + ", linkUri=" + mLinkUri
-                + ", extras=" + mExtras
+                + (mLinkUri == null ? "" : ", hasLinkUri(" + mLinkUri.toString().length() + ")")
+                + (mExtras == null ? "" : ", hasExtras")
                 + "}";
     }
 
diff --git a/core/core/src/main/java/androidx/core/view/ViewCompat.java b/core/core/src/main/java/androidx/core/view/ViewCompat.java
index 5e30e5f..e63c616 100644
--- a/core/core/src/main/java/androidx/core/view/ViewCompat.java
+++ b/core/core/src/main/java/androidx/core/view/ViewCompat.java
@@ -2606,7 +2606,7 @@
      * Provide original {@link WindowInsetsCompat} that are dispatched to the view hierarchy.
      * The insets are only available if the view is attached.
      * <p>
-     * On devices running API 22 and below, this method always returns null.
+     * On devices running API 20 and below, this method always returns null.
      *
      * @return WindowInsetsCompat from the top of the view hierarchy or null if View is detached
      */
diff --git a/core/core/src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java b/core/core/src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java
index 80268b9..c2c1409 100644
--- a/core/core/src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java
+++ b/core/core/src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java
@@ -730,7 +730,7 @@
 
                 if (DEBUG) {
                     int allTypes = WindowInsetsCompat.Type.all();
-                    Log.d(TAG, String.format("lastInsets: %s\ntargetInsets: %s",
+                    Log.d(TAG, String.format("lastInsets:   %s\ntargetInsets: %s",
                             mLastInsets.getInsets(allTypes),
                             targetInsets.getInsets(allTypes)));
                 }
@@ -746,6 +746,9 @@
                 // We only run the animation when the some insets are animating
                 final int animationMask = buildAnimationMask(targetInsets, mLastInsets);
                 if (animationMask == 0) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Insets applied bug no window animation to run");
+                    }
                     return forwardToViewIfNeeded(v, insets);
                 }
 
diff --git a/core/core/src/main/java/androidx/core/view/WindowInsetsControllerCompat.java b/core/core/src/main/java/androidx/core/view/WindowInsetsControllerCompat.java
index d904b05..dd5bcd3 100644
--- a/core/core/src/main/java/androidx/core/view/WindowInsetsControllerCompat.java
+++ b/core/core/src/main/java/androidx/core/view/WindowInsetsControllerCompat.java
@@ -468,7 +468,6 @@
             switch (type) {
                 case WindowInsetsCompat.Type.STATUS_BARS:
                     setSystemUiFlag(View.SYSTEM_UI_FLAG_FULLSCREEN);
-                    setWindowFlag(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                     return;
                 case WindowInsetsCompat.Type.NAVIGATION_BARS:
                     setSystemUiFlag(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
@@ -511,6 +510,20 @@
 
         @Override
         void setSystemBarsBehavior(int behavior) {
+            switch (behavior) {
+                case BEHAVIOR_SHOW_BARS_BY_SWIPE:
+                    unsetSystemUiFlag(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+                    setSystemUiFlag(View.SYSTEM_UI_FLAG_IMMERSIVE);
+                    break;
+                case BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE:
+                    unsetSystemUiFlag(View.SYSTEM_UI_FLAG_IMMERSIVE);
+                    setSystemUiFlag(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+                    break;
+                case BEHAVIOR_SHOW_BARS_BY_TOUCH:
+                    unsetSystemUiFlag(View.SYSTEM_UI_FLAG_IMMERSIVE
+                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+                    break;
+            }
         }
 
         @Override
diff --git a/core/core/src/main/java/androidx/core/widget/TextViewCompat.java b/core/core/src/main/java/androidx/core/widget/TextViewCompat.java
index b350576..9085d9f 100644
--- a/core/core/src/main/java/androidx/core/widget/TextViewCompat.java
+++ b/core/core/src/main/java/androidx/core/widget/TextViewCompat.java
@@ -512,12 +512,12 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @NonNull
+    @Nullable
     public static ActionMode.Callback wrapCustomSelectionActionModeCallback(
             @NonNull final TextView textView,
-            @NonNull final ActionMode.Callback callback) {
+            @Nullable final ActionMode.Callback callback) {
         if (Build.VERSION.SDK_INT < 26 || Build.VERSION.SDK_INT > 27
-                || callback instanceof OreoCallback) {
+                || callback instanceof OreoCallback || callback == null) {
             // If the bug does not affect the current SDK version, or if
             // the callback was already wrapped, no need to wrap it.
             return callback;
@@ -529,6 +529,21 @@
         return new OreoCallback(callback, textView);
     }
 
+
+    /**
+     * @see #setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)
+     * @hide
+     */
+    @RestrictTo(LIBRARY_GROUP_PREFIX)
+    @Nullable
+    public static ActionMode.Callback unwrapCustomSelectionActionModeCallback(
+            @Nullable ActionMode.Callback callback) {
+        if (callback instanceof OreoCallback && Build.VERSION.SDK_INT >= 26) {
+            return ((OreoCallback) callback).getWrappedCallback();
+        }
+        return callback;
+    }
+
     @RequiresApi(26)
     private static class OreoCallback implements ActionMode.Callback {
         // This constant should be correlated with its definition in the
@@ -573,6 +588,11 @@
             mCallback.onDestroyActionMode(mode);
         }
 
+        @NonNull
+        ActionMode.Callback getWrappedCallback() {
+            return mCallback;
+        }
+
         private void recomputeProcessTextMenuItems(final Menu menu) {
             final Context context = mTextView.getContext();
             final PackageManager packageManager = context.getPackageManager();
diff --git a/core/core/src/main/res/values/attrs.xml b/core/core/src/main/res/values/attrs.xml
index b77c646..5c644f0 100644
--- a/core/core/src/main/res/values/attrs.xml
+++ b/core/core/src/main/res/values/attrs.xml
@@ -161,4 +161,13 @@
         <!-- The current color for the offset inside the gradient. -->
         <attr name="android:color" />
     </declare-styleable>
+
+    <!-- Attributes that are read when parsing a <capability> tag. -->
+    <declare-styleable name="Capability">
+        <!-- Resource reference to the string array of query patterns for a custom capability. -->
+        <attr name="queryPatterns" format="reference" />
+        <!-- Indicates whether a parameter in a capability template can only contain a matched
+             shortcut id and not an arbitrary string. -->
+        <attr name="shortcutMatchRequired" format="boolean" />
+    </declare-styleable>
 </resources>
diff --git a/core/core/src/main/res/values/public.xml b/core/core/src/main/res/values/public.xml
index b27ee48..72fa773 100644
--- a/core/core/src/main/res/values/public.xml
+++ b/core/core/src/main/res/values/public.xml
@@ -30,6 +30,8 @@
     <public type="attr" name="fontWeight"/>
     <public type="attr" name="fontVariationSettings"/>
     <public type="attr" name="ttcIndex"/>
+    <public type="attr" name="queryPatterns"/>
+    <public type="attr" name="shortcutMatchRequired"/>
 
     <!-- Definitions of styles to be exposed as public -->
     <public type="style" name="TextAppearance.Compat.Notification"/>
diff --git a/cursoradapter/cursoradapter/lint-baseline.xml b/cursoradapter/cursoradapter/lint-baseline.xml
index 17fec5c..7bb7737 100644
--- a/cursoradapter/cursoradapter/lint-baseline.xml
+++ b/cursoradapter/cursoradapter/lint-baseline.xml
@@ -1,71 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="UnknownNullness"
-        message="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 Cursor mCursor;"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="62"
-            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 Context mContext;"
-        errorLine2="              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="68"
-            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 ChangeObserver mChangeObserver;"
-        errorLine2="              ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="80"
-            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 DataSetObserver mDataSetObserver;"
-        errorLine2="              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="86"
-            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 CursorFilter mCursorFilter;"
-        errorLine2="              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="92"
-            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 FilterQueryProvider mFilterQueryProvider;"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="98"
-            column="15"/>
-    </issue>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -74,7 +8,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="136"
+            line="87"
             column="26"/>
     </issue>
 
@@ -85,7 +19,7 @@
         errorLine2="                                          ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="136"
+            line="87"
             column="43"/>
     </issue>
 
@@ -96,7 +30,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="153"
+            line="104"
             column="26"/>
     </issue>
 
@@ -107,7 +41,7 @@
         errorLine2="                                          ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="153"
+            line="104"
             column="43"/>
     </issue>
 
@@ -118,7 +52,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="166"
+            line="117"
             column="26"/>
     </issue>
 
@@ -129,7 +63,7 @@
         errorLine2="                                          ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="166"
+            line="117"
             column="43"/>
     </issue>
 
@@ -140,7 +74,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="176"
+            line="127"
             column="25"/>
     </issue>
 
@@ -151,7 +85,7 @@
         errorLine2="                                         ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="176"
+            line="127"
             column="42"/>
     </issue>
 
@@ -162,7 +96,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="213"
+            line="164"
             column="12"/>
     </issue>
 
@@ -173,7 +107,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="233"
+            line="184"
             column="12"/>
     </issue>
 
@@ -184,7 +118,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="267"
+            line="218"
             column="12"/>
     </issue>
 
@@ -195,7 +129,7 @@
         errorLine2="                                      ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="267"
+            line="218"
             column="39"/>
     </issue>
 
@@ -206,7 +140,7 @@
         errorLine2="                                                        ~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="267"
+            line="218"
             column="57"/>
     </issue>
 
@@ -217,7 +151,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="285"
+            line="236"
             column="12"/>
     </issue>
 
@@ -228,7 +162,7 @@
         errorLine2="                                              ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="285"
+            line="236"
             column="47"/>
     </issue>
 
@@ -239,7 +173,7 @@
         errorLine2="                                                                ~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="285"
+            line="236"
             column="65"/>
     </issue>
 
@@ -250,7 +184,7 @@
         errorLine2="                    ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="309"
+            line="260"
             column="21"/>
     </issue>
 
@@ -261,7 +195,7 @@
         errorLine2="                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="309"
+            line="260"
             column="34"/>
     </issue>
 
@@ -272,7 +206,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="309"
+            line="260"
             column="51"/>
     </issue>
 
@@ -283,7 +217,7 @@
         errorLine2="                                                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="309"
+            line="260"
             column="66"/>
     </issue>
 
@@ -294,7 +228,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="319"
+            line="270"
             column="12"/>
     </issue>
 
@@ -305,7 +239,7 @@
         errorLine2="                                ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="319"
+            line="270"
             column="33"/>
     </issue>
 
@@ -316,7 +250,7 @@
         errorLine2="                                                 ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="319"
+            line="270"
             column="50"/>
     </issue>
 
@@ -327,7 +261,7 @@
         errorLine2="                                                                ~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="319"
+            line="270"
             column="65"/>
     </issue>
 
@@ -338,7 +272,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="330"
+            line="281"
             column="35"/>
     </issue>
 
@@ -349,7 +283,7 @@
         errorLine2="                                             ~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="330"
+            line="281"
             column="46"/>
     </issue>
 
@@ -360,7 +294,7 @@
         errorLine2="                                                              ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="330"
+            line="281"
             column="63"/>
     </issue>
 
@@ -371,7 +305,7 @@
         errorLine2="                             ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="339"
+            line="290"
             column="30"/>
     </issue>
 
@@ -382,7 +316,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="356"
+            line="307"
             column="12"/>
     </issue>
 
@@ -393,7 +327,7 @@
         errorLine2="                             ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="356"
+            line="307"
             column="30"/>
     </issue>
 
@@ -404,7 +338,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="392"
+            line="343"
             column="12"/>
     </issue>
 
@@ -415,7 +349,7 @@
         errorLine2="                                        ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="392"
+            line="343"
             column="41"/>
     </issue>
 
@@ -426,7 +360,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="422"
+            line="373"
             column="12"/>
     </issue>
 
@@ -437,7 +371,7 @@
         errorLine2="                                             ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="422"
+            line="373"
             column="46"/>
     </issue>
 
@@ -448,7 +382,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="431"
+            line="382"
             column="12"/>
     </issue>
 
@@ -459,7 +393,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="447"
+            line="398"
             column="12"/>
     </issue>
 
@@ -470,7 +404,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/cursoradapter/widget/CursorAdapter.java"
-            line="463"
+            line="414"
             column="40"/>
     </issue>
 
diff --git a/customview/customview/build.gradle b/customview/customview/build.gradle
index 4ec89b0..1bdb442 100644
--- a/customview/customview/build.gradle
+++ b/customview/customview/build.gradle
@@ -8,13 +8,6 @@
     id("kotlin-android")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.core:core:1.3.0-beta01")
diff --git a/customview/customview/lint-baseline.xml b/customview/customview/lint-baseline.xml
index c367f7a..411ede8 100644
--- a/customview/customview/lint-baseline.xml
+++ b/customview/customview/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -151,7 +151,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/customview/widget/ViewDragHelper.java"
-            line="356"
+            line="363"
             column="19"/>
     </issue>
 
@@ -162,7 +162,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/customview/widget/ViewDragHelper.java"
-            line="369"
+            line="376"
             column="19"/>
     </issue>
 
diff --git a/datastore/datastore-core/api/1.0.0-beta02.txt b/datastore/datastore-core/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..abfdd9c
--- /dev/null
+++ b/datastore/datastore-core/api/1.0.0-beta02.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.datastore.core {
+
+  public final class CorruptionException extends java.io.IOException {
+    ctor public CorruptionException(String message, optional Throwable? cause);
+  }
+
+  public interface DataMigration<T> {
+    method public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DataStore<T> {
+    method public kotlinx.coroutines.flow.Flow<T> getData();
+    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract kotlinx.coroutines.flow.Flow<T> data;
+  }
+
+  public final class DataStoreFactory {
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.core.DataStoreFactory INSTANCE;
+  }
+
+  public interface Serializer<T> {
+    method public T! getDefaultValue();
+    method public suspend Object? readFrom(java.io.InputStream input, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? writeTo(T? t, java.io.OutputStream output, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract T! defaultValue;
+  }
+
+}
+
+package androidx.datastore.core.handlers {
+
+  public final class ReplaceFileCorruptionHandler<T> {
+    ctor public ReplaceFileCorruptionHandler(kotlin.jvm.functions.Function1<? super androidx.datastore.core.CorruptionException,? extends T> produceNewData);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? handleCorruption(androidx.datastore.core.CorruptionException ex, kotlin.coroutines.Continuation<? super T> p) throws java.io.IOException;
+  }
+
+}
+
diff --git a/datastore/datastore-core/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-core/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..abfdd9c
--- /dev/null
+++ b/datastore/datastore-core/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.datastore.core {
+
+  public final class CorruptionException extends java.io.IOException {
+    ctor public CorruptionException(String message, optional Throwable? cause);
+  }
+
+  public interface DataMigration<T> {
+    method public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DataStore<T> {
+    method public kotlinx.coroutines.flow.Flow<T> getData();
+    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract kotlinx.coroutines.flow.Flow<T> data;
+  }
+
+  public final class DataStoreFactory {
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.core.DataStoreFactory INSTANCE;
+  }
+
+  public interface Serializer<T> {
+    method public T! getDefaultValue();
+    method public suspend Object? readFrom(java.io.InputStream input, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? writeTo(T? t, java.io.OutputStream output, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract T! defaultValue;
+  }
+
+}
+
+package androidx.datastore.core.handlers {
+
+  public final class ReplaceFileCorruptionHandler<T> {
+    ctor public ReplaceFileCorruptionHandler(kotlin.jvm.functions.Function1<? super androidx.datastore.core.CorruptionException,? extends T> produceNewData);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? handleCorruption(androidx.datastore.core.CorruptionException ex, kotlin.coroutines.Continuation<? super T> p) throws java.io.IOException;
+  }
+
+}
+
diff --git a/datastore/datastore-core/api/restricted_1.0.0-beta02.txt b/datastore/datastore-core/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..abfdd9c
--- /dev/null
+++ b/datastore/datastore-core/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.datastore.core {
+
+  public final class CorruptionException extends java.io.IOException {
+    ctor public CorruptionException(String message, optional Throwable? cause);
+  }
+
+  public interface DataMigration<T> {
+    method public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DataStore<T> {
+    method public kotlinx.coroutines.flow.Flow<T> getData();
+    method public suspend Object? updateData(kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super T>,?> transform, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract kotlinx.coroutines.flow.Flow<T> data;
+  }
+
+  public final class DataStoreFactory {
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<T>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public <T> androidx.datastore.core.DataStore<T> create(androidx.datastore.core.Serializer<T> serializer, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.core.DataStoreFactory INSTANCE;
+  }
+
+  public interface Serializer<T> {
+    method public T! getDefaultValue();
+    method public suspend Object? readFrom(java.io.InputStream input, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? writeTo(T? t, java.io.OutputStream output, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract T! defaultValue;
+  }
+
+}
+
+package androidx.datastore.core.handlers {
+
+  public final class ReplaceFileCorruptionHandler<T> {
+    ctor public ReplaceFileCorruptionHandler(kotlin.jvm.functions.Function1<? super androidx.datastore.core.CorruptionException,? extends T> produceNewData);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? handleCorruption(androidx.datastore.core.CorruptionException ex, kotlin.coroutines.Continuation<? super T> p) throws java.io.IOException;
+  }
+
+}
+
diff --git a/datastore/datastore-core/lint-baseline.xml b/datastore/datastore-core/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/datastore/datastore-core/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences-core/api/1.0.0-beta02.txt b/datastore/datastore-preferences-core/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..1b3e2d0
--- /dev/null
+++ b/datastore/datastore-preferences-core/api/1.0.0-beta02.txt
@@ -0,0 +1,63 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.core {
+
+  public final class MutablePreferences extends androidx.datastore.preferences.core.Preferences {
+    method public java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator void minusAssign(androidx.datastore.preferences.core.Preferences.Key<?> key);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences prefs);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences.Pair<?> pair);
+    method public void putAll(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public <T> T! remove(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> void set(androidx.datastore.preferences.core.Preferences.Key<T> key, T? value);
+  }
+
+  public final class PreferenceDataStoreFactory {
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.preferences.core.PreferenceDataStoreFactory INSTANCE;
+  }
+
+  public abstract class Preferences {
+    method public abstract java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public abstract operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public final androidx.datastore.preferences.core.MutablePreferences toMutablePreferences();
+    method public final androidx.datastore.preferences.core.Preferences toPreferences();
+  }
+
+  public static final class Preferences.Key<T> {
+    method public String getName();
+    method public infix androidx.datastore.preferences.core.Preferences.Pair<T> to(T? value);
+    property public final String name;
+  }
+
+  public static final class Preferences.Pair<T> {
+  }
+
+  public final class PreferencesFactory {
+    method public static androidx.datastore.preferences.core.Preferences create(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public static androidx.datastore.preferences.core.Preferences createEmpty();
+    method public static androidx.datastore.preferences.core.MutablePreferences createMutable(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+  }
+
+  public final class PreferencesKeys {
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Boolean> booleanKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Double> doubleKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Float> floatKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Integer> intKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Long> longKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.String> stringKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.util.Set<java.lang.String>> stringSetKey(String name);
+  }
+
+  public final class PreferencesKt {
+    method public static suspend Object? edit(androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>, kotlin.jvm.functions.Function2<? super androidx.datastore.preferences.core.MutablePreferences,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> transform, kotlin.coroutines.Continuation<? super androidx.datastore.preferences.core.Preferences> p);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-core/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-preferences-core/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..1b3e2d0
--- /dev/null
+++ b/datastore/datastore-preferences-core/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,63 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.core {
+
+  public final class MutablePreferences extends androidx.datastore.preferences.core.Preferences {
+    method public java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator void minusAssign(androidx.datastore.preferences.core.Preferences.Key<?> key);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences prefs);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences.Pair<?> pair);
+    method public void putAll(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public <T> T! remove(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> void set(androidx.datastore.preferences.core.Preferences.Key<T> key, T? value);
+  }
+
+  public final class PreferenceDataStoreFactory {
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.preferences.core.PreferenceDataStoreFactory INSTANCE;
+  }
+
+  public abstract class Preferences {
+    method public abstract java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public abstract operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public final androidx.datastore.preferences.core.MutablePreferences toMutablePreferences();
+    method public final androidx.datastore.preferences.core.Preferences toPreferences();
+  }
+
+  public static final class Preferences.Key<T> {
+    method public String getName();
+    method public infix androidx.datastore.preferences.core.Preferences.Pair<T> to(T? value);
+    property public final String name;
+  }
+
+  public static final class Preferences.Pair<T> {
+  }
+
+  public final class PreferencesFactory {
+    method public static androidx.datastore.preferences.core.Preferences create(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public static androidx.datastore.preferences.core.Preferences createEmpty();
+    method public static androidx.datastore.preferences.core.MutablePreferences createMutable(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+  }
+
+  public final class PreferencesKeys {
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Boolean> booleanKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Double> doubleKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Float> floatKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Integer> intKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Long> longKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.String> stringKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.util.Set<java.lang.String>> stringSetKey(String name);
+  }
+
+  public final class PreferencesKt {
+    method public static suspend Object? edit(androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>, kotlin.jvm.functions.Function2<? super androidx.datastore.preferences.core.MutablePreferences,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> transform, kotlin.coroutines.Continuation<? super androidx.datastore.preferences.core.Preferences> p);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-core/api/restricted_1.0.0-beta02.txt b/datastore/datastore-preferences-core/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..1b3e2d0
--- /dev/null
+++ b/datastore/datastore-preferences-core/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,63 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.core {
+
+  public final class MutablePreferences extends androidx.datastore.preferences.core.Preferences {
+    method public java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator void minusAssign(androidx.datastore.preferences.core.Preferences.Key<?> key);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences prefs);
+    method public operator void plusAssign(androidx.datastore.preferences.core.Preferences.Pair<?> pair);
+    method public void putAll(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public <T> T! remove(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public operator <T> void set(androidx.datastore.preferences.core.Preferences.Key<T> key, T? value);
+  }
+
+  public final class PreferenceDataStoreFactory {
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, optional kotlinx.coroutines.CoroutineScope scope, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>> migrations, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    method public androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences> create(kotlin.jvm.functions.Function0<? extends java.io.File> produceFile);
+    field public static final androidx.datastore.preferences.core.PreferenceDataStoreFactory INSTANCE;
+  }
+
+  public abstract class Preferences {
+    method public abstract java.util.Map<androidx.datastore.preferences.core.Preferences.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public abstract operator <T> T? get(androidx.datastore.preferences.core.Preferences.Key<T> key);
+    method public final androidx.datastore.preferences.core.MutablePreferences toMutablePreferences();
+    method public final androidx.datastore.preferences.core.Preferences toPreferences();
+  }
+
+  public static final class Preferences.Key<T> {
+    method public String getName();
+    method public infix androidx.datastore.preferences.core.Preferences.Pair<T> to(T? value);
+    property public final String name;
+  }
+
+  public static final class Preferences.Pair<T> {
+  }
+
+  public final class PreferencesFactory {
+    method public static androidx.datastore.preferences.core.Preferences create(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+    method public static androidx.datastore.preferences.core.Preferences createEmpty();
+    method public static androidx.datastore.preferences.core.MutablePreferences createMutable(androidx.datastore.preferences.core.Preferences.Pair<?>... pairs);
+  }
+
+  public final class PreferencesKeys {
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Boolean> booleanKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Double> doubleKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Float> floatKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Integer> intKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.Long> longKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.lang.String> stringKey(String name);
+    method public static androidx.datastore.preferences.core.Preferences.Key<java.util.Set<java.lang.String>> stringSetKey(String name);
+  }
+
+  public final class PreferencesKt {
+    method public static suspend Object? edit(androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>, kotlin.jvm.functions.Function2<? super androidx.datastore.preferences.core.MutablePreferences,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> transform, kotlin.coroutines.Continuation<? super androidx.datastore.preferences.core.Preferences> p);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-core/datastore-preferences-proto/lint-baseline.xml b/datastore/datastore-preferences-core/datastore-preferences-proto/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/datastore/datastore-preferences-core/datastore-preferences-proto/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences-core/lint-baseline.xml b/datastore/datastore-preferences-core/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/datastore/datastore-preferences-core/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences-rxjava2/api/1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava2/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..66b2ceb
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava2/api/1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava2 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..66b2ceb
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava2 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava2/api/res-1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava2/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava2/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore-preferences-rxjava2/api/restricted_1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava2/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..66b2ceb
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava2/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava2 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava2.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava2/lint-baseline.xml b/datastore/datastore-preferences-rxjava2/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-preferences-rxjava2/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences-rxjava3/api/1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava3/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..4e0b0bf
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava3/api/1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava3 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..4e0b0bf
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava3 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava3/api/res-1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava3/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava3/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore-preferences-rxjava3/api/restricted_1.0.0-beta02.txt b/datastore/datastore-preferences-rxjava3/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..4e0b0bf
--- /dev/null
+++ b/datastore/datastore-preferences-rxjava3/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,19 @@
+// Signature format: 4.0
+package androidx.datastore.preferences.rxjava3 {
+
+  public final class RxPreferenceDataStoreBuilder {
+    ctor public RxPreferenceDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile);
+    ctor public RxPreferenceDataStoreBuilder(android.content.Context context, String name);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addDataMigration(androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences> dataMigration);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<androidx.datastore.preferences.core.Preferences> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences> build();
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences> corruptionHandler);
+    method public androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxPreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<androidx.datastore.preferences.core.Preferences>> rxPreferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences-rxjava3/lint-baseline.xml b/datastore/datastore-preferences-rxjava3/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-preferences-rxjava3/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences/api/1.0.0-beta02.txt b/datastore/datastore-preferences/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..722515f
--- /dev/null
+++ b/datastore/datastore-preferences/api/1.0.0-beta02.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.datastore.preferences {
+
+  public final class PreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>> preferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class PreferenceDataStoreFile {
+    method public static java.io.File preferencesDataStoreFile(android.content.Context, String name);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-preferences/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..722515f
--- /dev/null
+++ b/datastore/datastore-preferences/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.datastore.preferences {
+
+  public final class PreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>> preferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class PreferenceDataStoreFile {
+    method public static java.io.File preferencesDataStoreFile(android.content.Context, String name);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences/api/res-1.0.0-beta02.txt b/datastore/datastore-preferences/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore-preferences/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore-preferences/api/restricted_1.0.0-beta02.txt b/datastore/datastore-preferences/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..722515f
--- /dev/null
+++ b/datastore/datastore-preferences/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.datastore.preferences {
+
+  public final class PreferenceDataStoreDelegateKt {
+    method public static kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<androidx.datastore.preferences.core.Preferences>> preferencesDataStore(String name, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<androidx.datastore.preferences.core.Preferences>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<androidx.datastore.preferences.core.Preferences>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class PreferenceDataStoreFile {
+    method public static java.io.File preferencesDataStoreFile(android.content.Context, String name);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate);
+    method public static androidx.datastore.migrations.SharedPreferencesMigration<androidx.datastore.preferences.core.Preferences> SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName);
+  }
+
+}
+
diff --git a/datastore/datastore-preferences/build.gradle b/datastore/datastore-preferences/build.gradle
index 5197a49..d1463f5 100644
--- a/datastore/datastore-preferences/build.gradle
+++ b/datastore/datastore-preferences/build.gradle
@@ -18,17 +18,10 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 
-buildscript {
-    dependencies {
-        classpath JARJAR
-    }
-}
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
     id("kotlin-android")
-    id("org.anarres.jarjar")
 }
 
 android{
diff --git a/datastore/datastore-preferences/lint-baseline.xml b/datastore/datastore-preferences/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-preferences/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-preferences/src/androidTest/java/androidx/datastore/preferences/SharedPreferencesToPreferencesTest.kt b/datastore/datastore-preferences/src/androidTest/java/androidx/datastore/preferences/SharedPreferencesToPreferencesTest.kt
index 08b2cb9..1d4aa8d 100644
--- a/datastore/datastore-preferences/src/androidTest/java/androidx/datastore/preferences/SharedPreferencesToPreferencesTest.kt
+++ b/datastore/datastore-preferences/src/androidTest/java/androidx/datastore/preferences/SharedPreferencesToPreferencesTest.kt
@@ -34,6 +34,7 @@
 import kotlinx.coroutines.test.TestCoroutineScope
 import kotlinx.coroutines.test.runBlockingTest
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
@@ -224,6 +225,7 @@
         assertEquals(1, prefs.asMap().size)
     }
 
+    @Ignore
     @Test
     fun migratedStringSetNotMutable() = runBlockingTest {
         val stringSetKey =
diff --git a/datastore/datastore-proto/lint-baseline.xml b/datastore/datastore-proto/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-proto/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-rxjava2/api/1.0.0-beta02.txt b/datastore/datastore-rxjava2/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..433238b
--- /dev/null
+++ b/datastore/datastore-rxjava2/api/1.0.0-beta02.txt
@@ -0,0 +1,42 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava2 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.Completable cleanUp();
+    method public io.reactivex.Single<T!> migrate(T?);
+    method public io.reactivex.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.disposables.Disposable {
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.Completable shutdownComplete();
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<T> build();
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava2.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava2.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..e662ed7
--- /dev/null
+++ b/datastore/datastore-rxjava2/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava2 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.Completable cleanUp();
+    method public io.reactivex.Single<T!> migrate(T?);
+    method public io.reactivex.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.disposables.Disposable {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public io.reactivex.Flowable<T> data();
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.Completable shutdownComplete();
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public io.reactivex.Single<T> updateDataAsync(io.reactivex.functions.Function<T,io.reactivex.Single<T>> transform);
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<T> build();
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava2.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava2.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava2/api/res-1.0.0-beta02.txt b/datastore/datastore-rxjava2/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore-rxjava2/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore-rxjava2/api/restricted_1.0.0-beta02.txt b/datastore/datastore-rxjava2/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..433238b
--- /dev/null
+++ b/datastore/datastore-rxjava2/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,42 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava2 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.Completable cleanUp();
+    method public io.reactivex.Single<T!> migrate(T?);
+    method public io.reactivex.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.disposables.Disposable {
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.Completable shutdownComplete();
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava2.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava2.RxDataStore<T> build();
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava2.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava2.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava2.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava2.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava2/lint-baseline.xml b/datastore/datastore-rxjava2/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-rxjava2/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-rxjava3/api/1.0.0-beta02.txt b/datastore/datastore-rxjava3/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..1033671
--- /dev/null
+++ b/datastore/datastore-rxjava3/api/1.0.0-beta02.txt
@@ -0,0 +1,42 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava3 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.rxjava3.core.Completable cleanUp();
+    method public io.reactivex.rxjava3.core.Single<T!> migrate(T?);
+    method public io.reactivex.rxjava3.core.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.rxjava3.disposables.Disposable {
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.rxjava3.core.Completable shutdownComplete();
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<T> build();
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.rxjava3.core.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.rxjava3.core.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava3.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava3.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..05fa237
--- /dev/null
+++ b/datastore/datastore-rxjava3/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava3 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.rxjava3.core.Completable cleanUp();
+    method public io.reactivex.rxjava3.core.Single<T!> migrate(T?);
+    method public io.reactivex.rxjava3.core.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.rxjava3.disposables.Disposable {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public io.reactivex.rxjava3.core.Flowable<T> data();
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.rxjava3.core.Completable shutdownComplete();
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public io.reactivex.rxjava3.core.Single<T> updateDataAsync(io.reactivex.rxjava3.functions.Function<T,io.reactivex.rxjava3.core.Single<T>> transform);
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<T> build();
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.rxjava3.core.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.rxjava3.core.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava3.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava3.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava3/api/res-1.0.0-beta02.txt b/datastore/datastore-rxjava3/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore-rxjava3/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore-rxjava3/api/restricted_1.0.0-beta02.txt b/datastore/datastore-rxjava3/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..1033671
--- /dev/null
+++ b/datastore/datastore-rxjava3/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,42 @@
+// Signature format: 4.0
+package androidx.datastore.rxjava3 {
+
+  public interface RxDataMigration<T> {
+    method public io.reactivex.rxjava3.core.Completable cleanUp();
+    method public io.reactivex.rxjava3.core.Single<T!> migrate(T?);
+    method public io.reactivex.rxjava3.core.Single<java.lang.Boolean!> shouldMigrate(T?);
+  }
+
+  public final class RxDataStore<T> implements io.reactivex.rxjava3.disposables.Disposable {
+    method public void dispose();
+    method public boolean isDisposed();
+    method public io.reactivex.rxjava3.core.Completable shutdownComplete();
+  }
+
+  public final class RxDataStoreBuilder<T> {
+    ctor public RxDataStoreBuilder(java.util.concurrent.Callable<java.io.File> produceFile, androidx.datastore.core.Serializer<T> serializer);
+    ctor public RxDataStoreBuilder(android.content.Context context, String fileName, androidx.datastore.core.Serializer<T> serializer);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addDataMigration(androidx.datastore.core.DataMigration<T> dataMigration);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> addRxDataMigration(androidx.datastore.rxjava3.RxDataMigration<T> rxDataMigration);
+    method public androidx.datastore.rxjava3.RxDataStore<T> build();
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setCorruptionHandler(androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T> corruptionHandler);
+    method public androidx.datastore.rxjava3.RxDataStoreBuilder<T> setIoScheduler(io.reactivex.rxjava3.core.Scheduler ioScheduler);
+  }
+
+  public final class RxDataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.rxjava3.RxDataStore<T>> rxDataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public interface RxSharedPreferencesMigration<T> {
+    method public io.reactivex.rxjava3.core.Single<T> migrate(androidx.datastore.migrations.SharedPreferencesView sharedPreferencesView, T? currentData);
+    method public default io.reactivex.rxjava3.core.Single<java.lang.Boolean> shouldMigrate(T? currentData);
+  }
+
+  public final class RxSharedPreferencesMigrationBuilder<T> {
+    ctor public RxSharedPreferencesMigrationBuilder(android.content.Context context, String sharedPreferencesName, androidx.datastore.rxjava3.RxSharedPreferencesMigration<T> rxSharedPreferencesMigration);
+    method public androidx.datastore.core.DataMigration<T> build();
+    method public androidx.datastore.rxjava3.RxSharedPreferencesMigrationBuilder<T> setKeysToMigrate(java.lang.String... keys);
+  }
+
+}
+
diff --git a/datastore/datastore-rxjava3/lint-baseline.xml b/datastore/datastore-rxjava3/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/datastore/datastore-rxjava3/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/datastore/datastore-sampleapp/lint-baseline.xml b/datastore/datastore-sampleapp/lint-baseline.xml
index a00a494..def8360 100644
--- a/datastore/datastore-sampleapp/lint-baseline.xml
+++ b/datastore/datastore-sampleapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="EnforceSampledAnnotation"
@@ -8,7 +8,7 @@
         errorLine2="                 ~~~~~~~~">
         <location
             file="src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt"
-            line="52"
+            line="49"
             column="18"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt"
-            line="69"
+            line="66"
             column="17"/>
     </issue>
 
diff --git a/datastore/datastore/api/1.0.0-beta02.txt b/datastore/datastore/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..46a48c7
--- /dev/null
+++ b/datastore/datastore/api/1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.datastore {
+
+  public final class DataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<T>> dataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class DataStoreFile {
+    method public static java.io.File dataStoreFile(android.content.Context, String fileName);
+  }
+
+}
+
+package androidx.datastore.migrations {
+
+  public final class SharedPreferencesMigration<T> implements androidx.datastore.core.DataMigration<T> {
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p) throws java.io.IOException;
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+  }
+
+  public final class SharedPreferencesView {
+    method public operator boolean contains(String key);
+    method public java.util.Map<java.lang.String,java.lang.Object> getAll();
+    method public boolean getBoolean(String key, boolean defValue);
+    method public float getFloat(String key, float defValue);
+    method public int getInt(String key, int defValue);
+    method public long getLong(String key, long defValue);
+    method public String? getString(String key, optional String? defValue);
+    method public java.util.Set<java.lang.String>? getStringSet(String key, optional java.util.Set<java.lang.String>? defValues);
+  }
+
+}
+
diff --git a/datastore/datastore/api/public_plus_experimental_1.0.0-beta02.txt b/datastore/datastore/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..46a48c7
--- /dev/null
+++ b/datastore/datastore/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.datastore {
+
+  public final class DataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<T>> dataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class DataStoreFile {
+    method public static java.io.File dataStoreFile(android.content.Context, String fileName);
+  }
+
+}
+
+package androidx.datastore.migrations {
+
+  public final class SharedPreferencesMigration<T> implements androidx.datastore.core.DataMigration<T> {
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p) throws java.io.IOException;
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+  }
+
+  public final class SharedPreferencesView {
+    method public operator boolean contains(String key);
+    method public java.util.Map<java.lang.String,java.lang.Object> getAll();
+    method public boolean getBoolean(String key, boolean defValue);
+    method public float getFloat(String key, float defValue);
+    method public int getInt(String key, int defValue);
+    method public long getLong(String key, long defValue);
+    method public String? getString(String key, optional String? defValue);
+    method public java.util.Set<java.lang.String>? getStringSet(String key, optional java.util.Set<java.lang.String>? defValues);
+  }
+
+}
+
diff --git a/datastore/datastore/api/res-1.0.0-beta02.txt b/datastore/datastore/api/res-1.0.0-beta02.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/datastore/datastore/api/res-1.0.0-beta02.txt
diff --git a/datastore/datastore/api/restricted_1.0.0-beta02.txt b/datastore/datastore/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..46a48c7
--- /dev/null
+++ b/datastore/datastore/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.datastore {
+
+  public final class DataStoreDelegateKt {
+    method public static <T> kotlin.properties.ReadOnlyProperty<android.content.Context,androidx.datastore.core.DataStore<T>> dataStore(String fileName, androidx.datastore.core.Serializer<T> serializer, optional androidx.datastore.core.handlers.ReplaceFileCorruptionHandler<T>? corruptionHandler, optional kotlin.jvm.functions.Function1<? super android.content.Context,? extends java.util.List<? extends androidx.datastore.core.DataMigration<T>>> produceMigrations, optional kotlinx.coroutines.CoroutineScope scope);
+  }
+
+  public final class DataStoreFile {
+    method public static java.io.File dataStoreFile(android.content.Context, String fileName);
+  }
+
+}
+
+package androidx.datastore.migrations {
+
+  public final class SharedPreferencesMigration<T> implements androidx.datastore.core.DataMigration<T> {
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(kotlin.jvm.functions.Function0<? extends android.content.SharedPreferences> produceSharedPreferences, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, optional kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> shouldRunMigration, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, optional java.util.Set<java.lang.String> keysToMigrate, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    ctor public SharedPreferencesMigration(android.content.Context context, String sharedPreferencesName, kotlin.jvm.functions.Function3<? super androidx.datastore.migrations.SharedPreferencesView,? super T,? super kotlin.coroutines.Continuation<? super T>,?> migrate);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public suspend Object? cleanUp(kotlin.coroutines.Continuation<? super kotlin.Unit> p) throws java.io.IOException;
+    method public suspend Object? migrate(T? currentData, kotlin.coroutines.Continuation<? super T> p);
+    method public suspend Object? shouldMigrate(T? currentData, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class SharedPreferencesMigrationKt {
+  }
+
+  public final class SharedPreferencesView {
+    method public operator boolean contains(String key);
+    method public java.util.Map<java.lang.String,java.lang.Object> getAll();
+    method public boolean getBoolean(String key, boolean defValue);
+    method public float getFloat(String key, float defValue);
+    method public int getInt(String key, int defValue);
+    method public long getLong(String key, long defValue);
+    method public String? getString(String key, optional String? defValue);
+    method public java.util.Set<java.lang.String>? getStringSet(String key, optional java.util.Set<java.lang.String>? defValues);
+  }
+
+}
+
diff --git a/datastore/datastore/lint-baseline.xml b/datastore/datastore/lint-baseline.xml
index 8f1aa4b..d1c7de0 100644
--- a/datastore/datastore/lint-baseline.xml
+++ b/datastore/datastore/lint-baseline.xml
@@ -1,4 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.datastore.migrations.SharedPreferencesMigration is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (!context.deleteSharedPreferences(name)) {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/datastore/migrations/SharedPreferencesMigration.kt"
+            line="180"
+            column="26"/>
+    </issue>
 
 </issues>
diff --git a/development/JetpadClient.py b/development/JetpadClient.py
index d0aef68..cec146c 100644
--- a/development/JetpadClient.py
+++ b/development/JetpadClient.py
@@ -20,7 +20,7 @@
 
 def getJetpadReleaseInfo(date):
 	try:
-		rawJetpadReleaseOutput = subprocess.check_output('span sql /span/global/androidx-jetpad:prod_instance \"SELECT GroupId, ArtifactId, ReleaseVersion, PreviousReleaseSHA, ReleaseSHA, Path, RequireSameVersionGroupBuild FROM LibraryReleases WHERE ReleaseDate = %s\"' % date, shell=True)
+		rawJetpadReleaseOutput = subprocess.check_output('span sql /span/global/androidx-jetpad:prod_instance \"SELECT GroupId, ArtifactId, ReleaseVersion, PreviousReleaseSHA, ReleaseSHA, Path, RequireSameVersionGroupBuild, ReleaseBuildId, ReleaseBranch FROM LibraryReleases WHERE ReleaseDate = %s\"' % date, shell=True)
 	except subprocess.CalledProcessError:
 		print_e('FAIL: Failed to get jetpad release info for  %s' %  date)
 		return None
@@ -51,6 +51,8 @@
 		requiresSameVersion = False
 		if artifactIdReleaseLine[7] == "true":
 			requiresSameVersion = True
+		buildId = artifactIdReleaseLine[8]
+		branch = artifactIdReleaseLine[9]
 		if groupId in releaseJsonObject["modules"]:
 			releaseJsonObject["modules"][groupId].append({
 				"groupId": groupId,
@@ -59,7 +61,9 @@
 				"fromSHA": fromSHA,
 				"untilSHA": untilSHA,
 				"requiresSameVersion": requiresSameVersion,
-				"path": path
+				"path": path,
+				"buildId": buildId,
+				"branch": branch,
 			})
 		else:
 			releaseJsonObject["modules"][groupId] = [{
@@ -69,7 +73,9 @@
 				"fromSHA": fromSHA,
 				"untilSHA": untilSHA,
 				"requiresSameVersion": requiresSameVersion,
-				"path": path
+				"path": path,
+				"buildId": buildId,
+				"branch": branch,
 			}]
 	return releaseJsonObject
 
diff --git a/development/auto-version-updater/update_versions_for_release.py b/development/auto-version-updater/update_versions_for_release.py
index 9031d71..3c0db04 100755
--- a/development/auto-version-updater/update_versions_for_release.py
+++ b/development/auto-version-updater/update_versions_for_release.py
@@ -285,9 +285,9 @@
     staged_changes = subprocess.check_output('git diff --cached', stderr=subprocess.STDOUT, shell=True)
     if not staged_changes:
         return
-    msg = "Update versions for release id %s\n\nThis commit was generated from the command:\n%s\n\n%s" % (release_date, " ".join(sys.argv), 'Test: ./gradlew checkApi')
+    msg = "'Update versions for release id %s\n\nThis commit was generated from the command:\n%s\n\n%s'" % (release_date, " ".join(sys.argv), "Test: ./gradlew checkApi")
     subprocess.check_call(['git', 'commit', '-m', msg])
-    subprocess.check_call(['yes', '|', 'repo', 'upload', '.', '--cbr', '--label', 'Presubmit-Ready+1'])
+    subprocess.check_output('yes | repo upload . --current-branch --no-verify --label Presubmit-Ready+1', stderr=subprocess.STDOUT, shell=True)
 
 def main(args):
     # Parse arguments and check for existence of build ID or file
@@ -299,8 +299,13 @@
     non_updated_libraries = []
     for group_id in release_json_object["modules"]:
         for artifact in release_json_object["modules"][group_id]:
-            updated = update_versions_in_library_versions_kt(group_id,
-                artifact["artifactId"], artifact["version"])
+            updated = False
+            if artifact["branch"].startswith("aosp-androidx-"):
+                # Only update versions for artifacts released from the AOSP
+                # androidx-main branch or from androidx release branches, but
+                # not from any other development branch.
+                updated = update_versions_in_library_versions_kt(group_id,
+                    artifact["artifactId"], artifact["version"])
             if not updated:
                 non_updated_libraries.append("%s:%s:%s" % (group_id,
                                              artifact["artifactId"],
diff --git a/development/build_log_simplifier/VALIDATION_FAILURE.md b/development/build_log_simplifier/VALIDATION_FAILURE.md
index d0f8519..fb94b9b 100644
--- a/development/build_log_simplifier/VALIDATION_FAILURE.md
+++ b/development/build_log_simplifier/VALIDATION_FAILURE.md
@@ -8,6 +8,18 @@
 
    *   Developers in the future might encounter unrelated build failures, and could have difficulty diagnosing them due to being distracted/confused by the output that you would be adding now
 
+# Can I see the full Gradle output?
+
+   *   The full output from Gradle (before build_log_simplifier.py processes it) should be found in gradle.log
+
+       *   If your build failed on the build server, you can download gradle.log via your browser:
+
+           *   Press the left arrow to go back to the screen that lists build server artifacts
+
+           *   Press "ctrl-f" and search for the file that you are looking for
+
+           *   Click the file to download it
+
 # How can I update the baseline file?
 
 ##   Where is the baseline file?
@@ -26,18 +38,16 @@
 
    *   You may copy the autogenerated, suggested exemptions file. This is probably the easiest option
 
-       *    If your build failed on the build server, it will list the filepath of the .ignore file it generated
+       *    If your build failed on the build server, it will list the filepath of the gradle.log.ignore file it generated
 
-           *   To download this file from the build server via your browser:
-
-               *   Press the left arrow to go back to the screen that lists build server artifacts
-
-               *   Press "ctrl-f" and search for the file that you are looking for (it should be something like "gradle.log.ignore")
-
-               *   Click the file to download it
+           *   To download gradle.log.ignore from the build server via your browser, see the instructions above about downloading gradle.log
 
         *    If your build failed on your computer, you can read its instructions about where to copy the suggested exemptions file from
 
     *   You can manually edit the exemptions file
 
         *   These build message exemptions files are each a list of regular expressions and comments, which you can modify manually
+
+        *   If you would like to test your changes to the exemptions file without having to rerun Gradle, you can download gradle.log (see above) and ask build_log_simplifier.py to validate the result:
+
+            *   `frameworks/support $ development/build_log_simplifier.py --validate ~/gradle.log`
diff --git a/development/build_log_simplifier/build_log_simplifier.py b/development/build_log_simplifier/build_log_simplifier.py
index 569b5a1..2f73f65 100755
--- a/development/build_log_simplifier/build_log_simplifier.py
+++ b/development/build_log_simplifier/build_log_simplifier.py
@@ -71,6 +71,8 @@
             if self.matches(text):
                 return 0
             return None
+        if not self.matches(text):
+            return None
         self.ensure_split()
         count = 0
         for child in self.children:
@@ -102,33 +104,15 @@
         return self.matcher.fullmatch(text)
 
 
-def select_failing_task_output(lines):
+def print_failing_task_names(lines):
     tasks_of_interest = []
     # first, find tasks of interest
     for line in lines:
         if line.startswith("Execution failed for task"):
             tasks_of_interest.append(line.split("task '")[1][:-3])
 
-
     print("Detected these failing tasks: " + str(tasks_of_interest))
 
-    # next, save all excerpts between start(interesting task) and end(interesting task)
-    current_interesting_tasks = []
-    retained_lines = []
-    for line in lines:
-        if line.startswith("Task ") and line.split(" ")[1] in tasks_of_interest:
-            if line.split(" ")[-1].strip() == "Starting":
-                current_interesting_tasks.append(line.split(" ")[1])
-            elif line.split(" ")[-1].strip() == "Finished":
-                current_interesting_tasks.remove(line.split(" ")[1])
-                retained_lines.append(line)
-        if current_interesting_tasks: retained_lines.append(line)
-    if retained_lines:
-        return retained_lines
-    # if no output was created by any failing tasks, then maybe there could be useful output from
-    # somewhere else
-    return lines
-
 def shorten_uninteresting_stack_frames(lines):
     result = []
     prev_line_is_boring = False
@@ -518,8 +502,7 @@
     validate = update or arguments.validate
     interesting_lines = all_lines
     if not validate:
-        interesting_lines = select_failing_task_output(interesting_lines)
-    interesting_lines = shorten_uninteresting_stack_frames(interesting_lines)
+        print_failing_task_names(interesting_lines)
     interesting_lines = remove_by_regexes(interesting_lines, exemption_regexes, validate)
     interesting_lines = collapse_tasks_having_no_output(interesting_lines)
     interesting_lines = collapse_consecutive_blank_lines(interesting_lines)
@@ -563,6 +546,7 @@
             print("  Autogenerated new baseline : " + new_exemptions_path)
             exit(1)
     else:
+        interesting_lines = shorten_uninteresting_stack_frames(interesting_lines)
         print("".join(interesting_lines))
 
 if __name__ == "__main__":
diff --git a/development/build_log_simplifier/gc.sh b/development/build_log_simplifier/gc.sh
index 4eaef24..8cfb3f8 100755
--- a/development/build_log_simplifier/gc.sh
+++ b/development/build_log_simplifier/gc.sh
@@ -2,15 +2,14 @@
 set -e
 
 function usage() {
-  echo "Usage: $0 <buildId>"
+  echo "Usage: $0 <buildId> [<buildId>...]"
   echo
-  echo "Downloads logs from build <buildId> and then garbage collects any messages in"
+  echo "Downloads logs from the given build Ids and then garbage collects any messages in"
   echo "messages.ignore that don't match any of the downloaded logs"
   exit 1
 }
 
-buildId="$1"
-if [ "$buildId" == "" ]; then
+if [ "$1" == "" ]; then
   usage
 fi
 
@@ -23,9 +22,11 @@
 
 # fetch_log <target>
 function fetch_logs() {
-  target="$1"
-  mkdir "$target"
-  cd "$target"
+  build_id="$1"
+  target="$2"
+  newDir="${build_id}_${target}"
+  mkdir $newDir
+  cd $newDir
   # download as many logs as exist
   for i in $(seq 20); do
     if fetch_artifact --bid "$buildId" --target "$target" "logs/gradle.${i}.log"; then
@@ -60,8 +61,12 @@
 
 # download log for each target
 setup_temp_dir
-for target in $targets; do
-  fetch_logs $target
+while [ "$1" != "" ]; do
+  buildId="$1"
+  for target in $targets; do
+    fetch_logs $buildId $target
+  done
+  shift
 done
 
 
diff --git a/development/build_log_simplifier/message-flakes.ignore b/development/build_log_simplifier/message-flakes.ignore
index 2226d60..843e9d4 100644
--- a/development/build_log_simplifier/message-flakes.ignore
+++ b/development/build_log_simplifier/message-flakes.ignore
@@ -15,6 +15,8 @@
 There were failing tests\. See the report at\: file\:\/\/\$OUT_DIR\/ui\/compose\/animation\/animation\-core\/build\/reports\/tests\/testDebugUnitTest\/index\.html
 # > Task :room:integration-tests:room-testapp-autovalue:compileDebugAndroidTestJavaWithJavac
 Stream closed
+# > Task :room:integration-tests:room-testapp:compileDebugJavaWithJavac
+java.io.IOException: Stream closed
 # > Task :compose:compiler:compiler-hosted:integration-tests:testDebugUnitTest
 # If a test fails, we don't want the build to fail, we want to pass the test output to the tests server and for the tests server to report the failure
 [0-9]+ test.*failed.*
@@ -38,9 +40,6 @@
 # > Task :jetifier-core:compileKotlin
 Could not perform incremental compilation\: Could not connect to Kotlin compile daemon
 Could not connect to kotlin daemon\. Using fallback strategy\.
-at org\.gradle\.workers\.internal\.AbstractWorker\.executeWrappedInBuildOperation\(AbstractWorker\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.NoIsolationWorkerFactory\$[0-9]+\.execute\(NoIsolationWorkerFactory\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.DefaultWorkerExecutor\.lambda\$submitWork\$[0-9]+\(DefaultWorkerExecutor\.java\:[0-9]+\)
 \.\.\. [0-9]+ more
 at java\.rmi\/sun\.rmi\.transport\.StreamRemoteCall\.exceptionReceivedFromServer\(StreamRemoteCall\.java\:[0-9]+\)
 at java\.rmi\/sun\.rmi\.transport\.StreamRemoteCall\.executeCall\(StreamRemoteCall\.java\:[0-9]+\)
@@ -52,12 +51,6 @@
 at org\.jetbrains\.kotlin\.compilerRunner\.GradleKotlinCompilerWork\.compileWithDaemon\(GradleKotlinCompilerWork\.kt\:[0-9]+\)
 at org\.jetbrains\.kotlin\.compilerRunner\.GradleKotlinCompilerWork\.compileWithDaemonOrFallbackImpl\(GradleKotlinCompilerWork\.kt\:[0-9]+\)
 at org\.jetbrains\.kotlin\.compilerRunner\.GradleKotlinCompilerWork\.run\(GradleKotlinCompilerWork\.kt\:[0-9]+\)
-at org\.gradle\.workers\.internal\.AdapterWorkAction\.execute\(AdapterWorkAction\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.DefaultWorkerServer\.execute\(DefaultWorkerServer\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.NoIsolationWorkerFactory\$[0-9]+\$[0-9]+\.create\(NoIsolationWorkerFactory\.java\:[0-9]+\)
-at org\.gradle\.internal\.classloader\.ClassLoaderUtils\.executeInClassloader\(ClassLoaderUtils\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.NoIsolationWorkerFactory\$[0-9]+\.lambda\$execute\$[0-9]+\(NoIsolationWorkerFactory\.java\:[0-9]+\)
-at org\.gradle\.workers\.internal\.AbstractWorker\$[0-9]+\.call\(AbstractWorker\.java\:[0-9]+\)
 Caused by\: java\.lang\.AssertionError\: Incremental compilation is not enabled
 at org\.jetbrains\.kotlin\.incremental\.IncrementalCompilerRunner\.compileImpl\(IncrementalCompilerRunner\.kt\:[0-9]+\)
 at org\.jetbrains\.kotlin\.incremental\.IncrementalCompilerRunner\.compile\(IncrementalCompilerRunner\.kt\:[0-9]+\)
@@ -69,12 +62,16 @@
 at java\.rmi\/sun\.rmi\.transport\.tcp\.TCPTransport\$ConnectionHandler\.run[0-9]+\(TCPTransport\.java\:[0-9]+\)
 at java\.rmi\/sun\.rmi\.transport\.tcp\.TCPTransport\$ConnectionHandler\.lambda\$run\$[0-9]+\(TCPTransport\.java\:[0-9]+\)
 at java\.rmi\/sun\.rmi\.transport\.tcp\.TCPTransport\$ConnectionHandler\.run\(TCPTransport\.java\:[0-9]+\)
-at org\.gradle\.internal\.work\.DefaultConditionalExecutionQueue\$ExecutionRunner\.runExecution\(DefaultConditionalExecutionQueue\.java\:[0-9]+\)
-at org\.gradle\.internal\.work\.DefaultConditionalExecutionQueue\$ExecutionRunner\.runBatch\(DefaultConditionalExecutionQueue\.java\:[0-9]+\)
-at org\.gradle\.internal\.work\.DefaultConditionalExecutionQueue\$ExecutionRunner\.run\(DefaultConditionalExecutionQueue\.java\:[0-9]+\)
 Compilation with Kotlin compile daemon was not successful
 java\.rmi\.ServerError\: Error occurred in server thread\; nested exception is\:
 java\.lang\.AssertionError\: Incremental compilation is not enabled
 at java\.rmi\/sun\.rmi\.server\.UnicastServerRef\.dispatch\(UnicastServerRef\.java\:[0-9]+\)
 at java\.rmi\/sun\.rmi\.transport\.Transport\$[0-9]+\.run\(Transport\.java\:[0-9]+\)
+# https://youtrack.jetbrains.com/issue/KT-46068
+# > Task :compose:ui:ui-graphics:compileReleaseKotlin
+java\.lang\.Exception: Unknown or invalid session [0-9]+
+at org\.jetbrains\.kotlin\.daemon\.common\.CompileService\$CallResult\$Error\.get\(CompileService\.kt:[0-9]+\)
+at java.base.*
+warning: ATTENTION!
+# b/185474400
 at org.gradle.*
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 50fda2b..3fe9a9d 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -15,8 +15,6 @@
 at org\.jetbrains\.dokka\.Formats\.JavaLayoutHtmlUriProvider\$DefaultImpls\.linkTo\(JavaLayoutHtmlFormat\.kt:[0-9]+\)
 at org\.jetbrains\.dokka\.Formats\.JavaLayoutHtmlFormatGenerator\.linkTo\(JavaLayoutHtmlGenerator\.kt:[0-9]+\)
 at jdk\.internal\.reflect\.GeneratedMethodAccessor[0-9]+\.invoke\(Unknown Source\)
-at java\.base/jdk\.internal\.reflect\.DelegatingMethodAccessorImpl\.invoke\(DelegatingMethodAccessorImpl\.java:[0-9]+\)
-at java\.base/java\.lang\.reflect\.Method\.invoke\(Method\.java:[0-9]+\)
 at com\.google\.inject\.internal\.DelegatingInvocationHandler\.invoke\(DelegatingInvocationHandler\.java:[0-9]+\)
 at com\.sun\.proxy\.\$Proxy[0-9]+\.linkTo\(Unknown Source\)
 at org\.jetbrains\.dokka\.Formats\.JavaLayoutHtmlFormatOutputBuilder\.a\(JavaLayoutHtmlFormatOutputBuilder\.kt:[0-9]+\)
@@ -66,93 +64,9 @@
 at org\.jetbrains\.dokka\.GeneratorKt\.buildAll\(Generator\.kt:[0-9]+\)
 at org\.jetbrains\.dokka\.DokkaGenerator\.generate\(DokkaGenerator\.kt:[0-9]+\)
 at org\.jetbrains\.dokka\.DokkaBootstrapImpl\.generate\(DokkaBootstrapImpl\.kt:[0-9]+\)
-at java\.base/jdk\.internal\.reflect\.NativeMethodAccessorImpl\.invoke[0-9]+\(Native Method\)
-at java\.base/jdk\.internal\.reflect\.NativeMethodAccessorImpl\.invoke\(NativeMethodAccessorImpl\.java:[0-9]+\)
 at org\.jetbrains\.dokka\.DelegatedInvocationHandler\.invoke\(ProxyUtils\.kt:[0-9]+\)
 at com\.sun\.proxy\.\$Proxy[0-9]+\.generate\(Unknown Source\)
 at org\.jetbrains\.dokka\.gradle\.DokkaTask\.generate\(main\.kt:[0-9]+\)
-at org\.gradle\.internal\.reflect\.JavaMethod\.invoke\(JavaMethod\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.project\.taskfactory\.StandardTaskAction\.doExecute\(StandardTaskAction\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.project\.taskfactory\.StandardTaskAction\.execute\(StandardTaskAction\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\$[0-9]+\.run\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationRunner\$[0-9]+\.execute\(DefaultBuildOperationRunner\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationRunner\.execute\(DefaultBuildOperationRunner\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationRunner\.run\(DefaultBuildOperationRunner\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationExecutor\.lambda\$run\$[0-9]+\(DefaultBuildOperationExecutor\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.UnmanagedBuildOperationWrapper\.runWithUnmanagedSupport\(UnmanagedBuildOperationWrapper\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationExecutor\.run\(DefaultBuildOperationExecutor\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.executeAction\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.executeActions\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.access\$[0-9]+\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\$TaskExecution\.executeWithPreviousOutputFiles\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\$TaskExecution\.execute\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ExecuteStep\.lambda\$executeOperation\$[0-9]+\(ExecuteStep\.java:[0-9]+\)
-at java\.base/java\.util\.Optional\.orElseGet\(Optional\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ExecuteStep\.executeOperation\(ExecuteStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ExecuteStep\.access\$[0-9]+\(ExecuteStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ExecuteStep\$[0-9]+\.call\(ExecuteStep\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationRunner\$CallableBuildOperationWorker\.execute\(DefaultBuildOperationRunner\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationRunner\.call\(DefaultBuildOperationRunner\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationExecutor\.lambda\$call\$[0-9]+\(DefaultBuildOperationExecutor\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.UnmanagedBuildOperationWrapper\.callWithUnmanagedSupport\(UnmanagedBuildOperationWrapper\.java:[0-9]+\)
-at org\.gradle\.internal\.operations\.DefaultBuildOperationExecutor\.call\(DefaultBuildOperationExecutor\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ExecuteStep\.execute\(ExecuteStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.RemovePreviousOutputsStep\.execute\(RemovePreviousOutputsStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ResolveInputChangesStep\.execute\(ResolveInputChangesStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.CancelExecutionStep\.execute\(CancelExecutionStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.TimeoutStep\.executeWithoutTimeout\(TimeoutStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.TimeoutStep\.execute\(TimeoutStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.CreateOutputsStep\.execute\(CreateOutputsStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.CaptureStateAfterExecutionStep\.execute\(CaptureStateAfterExecutionStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.BroadcastChangingOutputsStep\.execute\(BroadcastChangingOutputsStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.BuildCacheStep\.executeWithoutCache\(BuildCacheStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.BuildCacheStep\.execute\(BuildCacheStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.StoreExecutionStateStep\.execute\(StoreExecutionStateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.RecordOutputsStep\.execute\(RecordOutputsStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.SkipUpToDateStep\.executeBecause\(SkipUpToDateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.SkipUpToDateStep\.lambda\$execute\$[0-9]+\(SkipUpToDateStep\.java:[0-9]+\)
-at java\.base/java\.util\.Optional\.map\(Optional\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.SkipUpToDateStep\.execute\(SkipUpToDateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ResolveChangesStep\.execute\(ResolveChangesStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.legacy\.MarkSnapshottingInputsFinishedStep\.execute\(MarkSnapshottingInputsFinishedStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ResolveCachingStateStep\.execute\(ResolveCachingStateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.CaptureStateBeforeExecutionStep\.execute\(CaptureStateBeforeExecutionStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.ValidateStep\.execute\(ValidateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.SkipEmptyWorkStep\.lambda\$execute\$[0-9]+\(SkipEmptyWorkStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.SkipEmptyWorkStep\.execute\(SkipEmptyWorkStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.legacy\.MarkSnapshottingInputsStartedStep\.execute\(MarkSnapshottingInputsStartedStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.LoadExecutionStateStep\.execute\(LoadExecutionStateStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.AssignWorkspaceStep\.lambda\$execute\$[0-9]+\(AssignWorkspaceStep\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\$TaskExecution\$[0-9]+\.withWorkspace\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.AssignWorkspaceStep\.execute\(AssignWorkspaceStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.IdentityCacheStep\.execute\(IdentityCacheStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.steps\.IdentifyStep\.execute\(IdentifyStep\.java:[0-9]+\)
-at org\.gradle\.internal\.execution\.impl\.DefaultExecutionEngine\.execute\(DefaultExecutionEngine\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.lambda\$executeIfValid\$[0-9]+\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.executeIfValid\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ExecuteActionsTaskExecuter\.execute\(ExecuteActionsTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.CleanupStaleOutputsExecuter\.execute\(CleanupStaleOutputsExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.FinalizePropertiesTaskExecuter\.execute\(FinalizePropertiesTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.ResolveTaskExecutionModeExecuter\.execute\(ResolveTaskExecutionModeExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.SkipTaskWithNoActionsExecuter\.execute\(SkipTaskWithNoActionsExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.SkipOnlyIfTaskExecuter\.execute\(SkipOnlyIfTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.CatchExceptionTaskExecuter\.execute\(CatchExceptionTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.EventFiringTaskExecuter\$[0-9]+\.executeTask\(EventFiringTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.EventFiringTaskExecuter\$[0-9]+\.call\(EventFiringTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.api\.internal\.tasks\.execution\.EventFiringTaskExecuter\.execute\(EventFiringTaskExecuter\.java:[0-9]+\)
-at org\.gradle\.execution\.plan\.LocalTaskNodeExecutor\.execute\(LocalTaskNodeExecutor\.java:[0-9]+\)
-at org\.gradle\.execution\.taskgraph\.DefaultTaskExecutionGraph\$InvokeNodeExecutorsAction\.execute\(DefaultTaskExecutionGraph\.java:[0-9]+\)
-at org\.gradle\.execution\.taskgraph\.DefaultTaskExecutionGraph\$BuildOperationAwareExecutionAction\.execute\(DefaultTaskExecutionGraph\.java:[0-9]+\)
-at org\.gradle\.execution\.plan\.DefaultPlanExecutor\$ExecutorWorker\.lambda\$run\$[0-9]+\(DefaultPlanExecutor\.java:[0-9]+\)
-at org\.gradle\.execution\.plan\.DefaultPlanExecutor\$ExecutorWorker\.execute\(DefaultPlanExecutor\.java:[0-9]+\)
-at org\.gradle\.execution\.plan\.DefaultPlanExecutor\$ExecutorWorker\.executeNextNode\(DefaultPlanExecutor\.java:[0-9]+\)
-at org\.gradle\.execution\.plan\.DefaultPlanExecutor\$ExecutorWorker\.run\(DefaultPlanExecutor\.java:[0-9]+\)
-at org\.gradle\.internal\.concurrent\.ExecutorPolicy\$CatchAndRecordFailures\.onExecute\(ExecutorPolicy\.java:[0-9]+\)
-at org\.gradle\.internal\.concurrent\.ManagedExecutorImpl\$[0-9]+\.run\(ManagedExecutorImpl\.java:[0-9]+\)
-at java\.base/java\.util\.concurrent\.ThreadPoolExecutor\.runWorker\(ThreadPoolExecutor\.java:[0-9]+\)
-at java\.base/java\.util\.concurrent\.ThreadPoolExecutor\$Worker\.run\(ThreadPoolExecutor\.java:[0-9]+\)
-at org\.gradle\.internal\.concurrent\.ThreadFactoryImpl\$ManagedThreadRunnable\.run\(ThreadFactoryImpl\.java:[0-9]+\)
-at java\.base/java\.lang\.Thread\.run\(Thread\.java:[0-9]+\)
 Exception while resolving link to Module: Package:androidx\.compose\.animation\.core Class:KeyframesSpec Class:KeyframesSpecConfig Function:at Receiver:<this>
 at org\.jetbrains\.dokka\.Formats\.JavaLayoutHtmlFormatOutputBuilder\.nodeContent\(JavaLayoutHtmlFormatOutputBuilder\.kt:[0-9]+\)
 at org\.jetbrains\.dokka\.Formats\.DevsiteLayoutHtmlFormatOutputBuilder\$fullMemberDocs\$[0-9]+\.invoke\(DacHtmlFormat\.kt:[0-9]+\)
@@ -217,21 +131,23 @@
 DIST_DIR=\$DIST_DIR
 CHECKOUT=\$CHECKOUT
 GRADLE_USER_HOME=\$GRADLE_USER_HOME
+To honour the JVM settings for this build a single\-use Daemon process will be forked\. See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/gradle_daemon\.html\#sec:disabling_the_daemon\.
 Starting a Gradle Daemon \(subsequent builds will be faster\)
-Downloading file\:\$SUPPORT\/gradle\/wrapper\/\.\.\/\.\.\/\.\.\/\.\.\/tools\/external\/gradle\/gradle\-[0-9]+\.[0-9]+\.[0-9]+\-bin\.zip
-\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%\.\.\.\.\.\.\.\.\.\.[0-9]+%
-Welcome to Gradle [0-9]+\.[0-9]+\.[0-9]+\!
+Downloading file\:\$SUPPORT\/gradle\/wrapper\/.*
+\.\.\.\.\.\.\.\.\.\.10%\.\.\.\.\.\.\.\.\.\.\.20%\.\.\.\.\.\.\.\.\.\.\.30%\.\.\.\.\.\.\.\.\.\.40%\.\.\.\.\.\.\.\.\.\.\.50%\.\.\.\.\.\.\.\.\.\.\.60%\.\.\.\.\.\.\.\.\.\.\.70%\.\.\.\.\.\.\.\.\.\.80%\.\.\.\.\.\.\.\.\.\.\.90%\.\.\.\.\.\.\.\.\.\.\.100%
+Welcome to Gradle .*
 Here are the highlights of this release:
-\- Faster Kotlin DSL script compilation
-\- Vendor selection for Java toolchains
-\- Convenient execution of tasks in composite builds
-\- Consistent dependency resolution
-For more details see https\:\/\/docs\.gradle\.org\/[0-9]+\.[0-9]+\.[0-9]+\/release\-notes\.html
+\- File system watching enabled by default
+\- Support for running with and building Java 16 projects
+\- Native support for Apple Silicon processors
+\- Dependency catalog feature preview
+For more details see .*
 To honour the JVM settings for this build a single\-use Daemon process will be forked\. See https://docs\.gradle\.org/[0-9]+\.[0-9]+\.[0-9]+/userguide/gradle_daemon\.html\#sec:disabling_the_daemon\.
 Daemon will be stopped at the end of the build
 # > Task :buildSrc:build
 # > Configure project :appsearch:appsearch\-local\-backend
 Configuration on demand is an incubating feature\.
+Type\-safe dependency accessors is an incubating feature\.
 # > Configure project :
 updated local\.properties
 # > Configure project :compose:test\-utils
@@ -246,6 +162,9 @@
 Wrote \$DIST_DIR/task_outputs\.txt
 Deprecated Gradle features were used in this build, making it incompatible with Gradle [0-9]+\.[0-9]+\.
 Use '\-\-warning\-mode all' to show the individual deprecation warnings\.
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/command_line_interface\.html\#sec:command_line_warnings
+Execution optimizations have been disabled for [0-9]+ invalid unit\(s\) of work during this build to ensure correctness\.
+Please consult deprecation warnings for more details\.
 See https\:\/\/docs\.gradle\.org\/[0-9]+\.[0-9]+\.[0-9]+\/userguide\/command_line_interface\.html\#sec\:command_line_warnings
 BUILD SUCCESSFUL in .*
 [0-9]+ actionable task: [0-9]+ executed
@@ -286,6 +205,9 @@
 w: \$SUPPORT/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet\.kt: \([0-9]+, [0-9]+\): The corresponding parameter in the supertype 'Comparator' is named 'b'\. This may cause problems when calling this function with named arguments\.
 # > Task :benchmark:benchmark-common:runErrorProne
 \^
+symbol\:   static FLAG_MUTABLE
+location\: class PendingIntent
+\$OUT_DIR\/androidx\/docs\-public\/build\/unzippedDocsSources\/androidx\/work\/impl\/utils\/ForceStopRunnable\.java\:[0-9]+\: error\: cannot find symbol
 symbol:   class ExtensionDeviceState
 location: package androidx\.window\.extensions
 DeviceState translate\(ExtensionDeviceState deviceState\) \{
@@ -462,7 +384,7 @@
 Html results of .* zipped into.*\.zip
 # > Task :annotation:annotation-experimental-lint:test
 WARNING: An illegal reflective access operation has occurred
-WARNING: Illegal reflective access by com\.intellij\.util\.ReflectionUtil \(file:\$CHECKOUT/prebuilts/androidx/external/com/google/devsite/dackka/[0-9]+\.[0-9]+\.[0-9]+\-alpha[0-9]+/dackka\-[0-9]+\.[0-9]+\.[0-9]+\-alpha[0-9]+\.jar\) to method java\.util\.ResourceBundle\.setParent\(java\.util\.ResourceBundle\)
+WARNING: Illegal reflective access by com\.intellij\.util\.ReflectionUtil \(file:\$CHECKOUT/prebuilts/androidx/external/com/google/devsite/dackka/[0-9]+\.[0-9]+\.[0-9]+/dackka\-[0-9]+\.[0-9]+\.[0-9]+\.jar\) to method java\.util\.ResourceBundle\.setParent\(java\.util\.ResourceBundle\)
 WARNING: Illegal reflective access by com\.intellij\.util\.ReflectionUtil \(file:\$OUT_DIR/androidx/compose/compiler/compiler\-hosted/integration\-tests/kotlin\-compiler\-repackaged/build/repackaged/kotlin\-compiler\-repackaged\.jar\) to method java\.util\.ResourceBundle\.setParent\(java\.util\.ResourceBundle\)
 WARNING\: Illegal reflective access using Lookup on org\.gradle\.internal\.classloader\.ClassLoaderUtils\$AbstractClassLoaderLookuper \(file\:\$GRADLE_USER_HOME\/caches\/[0-9]+\.[0-9]+\.[0-9]+\/generated\-gradle\-jars\/gradle\-api\-[0-9]+\.[0-9]+\.[0-9]+\.jar\) to class java\.lang\.ClassLoader
 WARNING\: Please consider reporting this to the maintainers of org\.gradle\.internal\.classloader\.ClassLoaderUtils\$AbstractClassLoaderLookuper
@@ -584,29 +506,14 @@
 w\: \$SUPPORT\/viewpager[0-9]+\/viewpager[0-9]+\/src\/androidTest\/java\/androidx\/viewpager[0-9]+\/widget\/OnApplyWindowInsetsListenerTest\.kt\: \([0-9]+\, [0-9]+\)\: \'consumeStableInsets\(\)\: WindowInsetsCompat\' is deprecated\. Deprecated in Java
 w\: \$SUPPORT\/viewpager[0-9]+\/viewpager[0-9]+\/src\/androidTest\/java\/androidx\/viewpager[0-9]+\/widget\/OnApplyWindowInsetsListenerTest\.kt\: \([0-9]+\, [0-9]+\)\: \'consumeDisplayCutout\(\)\: WindowInsetsCompat\' is deprecated\. Deprecated in Java
 # > Task :contentpager:contentpager:compileDebugAndroidTestJavaWithJavac
-# > Task :annotation:annotation-experimental-lint-integration-tests:lintDebug
-Error processing \$CHECKOUT/prebuilts/androidx/external/org/jetbrains/kotlin/kotlin\-stdlib/[0-9]+\.[0-9]+\.[0-9]+/kotlin\-stdlib\-[0-9]+\.[0-9]+\.[0-9]+\.jar:META\-INF/versions/[0-9]+/module\-info\.class: broken class file\? \(This feature requires ASM[0-9]+\)
 # > Task :docs-public:dokkaKotlinDocs
 No documentation for .*
 # See b/180023439 for hiltNavGraphViewModel warning.
 Found an unresolved type in androidx\.hilt\.navigation\.compose\$hiltNavGraphViewModel\(androidx\.navigation\.NavController, kotlin\.String\) \(NavHostController\.kt:[0-9]+\)
 Unresolved link to .*
 Unresolved function .*
-at java.base.*
 # > Task :compose:ui:ui-inspection:externalNativeBuildDebug
 Build compose_inspection_jni_.*
-# > Task :security:security-identity-credential:lintDebug
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyFactorySpi\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyFactorySpi\$Ed[0-9]+\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyFactorySpi\$EdDSA\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyFactorySpi\$X[0-9]+\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyFactorySpi\$XDH\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyPairGeneratorSpi\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyPairGeneratorSpi\$Ed[0-9]+\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyPairGeneratorSpi\$EdDSA\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyPairGeneratorSpi\$X[0-9]+\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/org\/bouncycastle\/jcajce\/provider\/asymmetric\/edec\/KeyPairGeneratorSpi\$XDH\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
-Error processing \$CHECKOUT\/prebuilts\/androidx\/external\/org\/bouncycastle\/bcprov\-jdk[0-9]+on\/[0-9]+\.[0-9]+\/bcprov\-jdk[0-9]+on\-[0-9]+\.[0-9]+\.jar\:META\-INF\/versions\/[0-9]+\/module\-info\.class\: broken class file\? \(This feature requires ASM[0-9]+\)
 # > Task :compose:foundation:foundation-benchmark:processReleaseAndroidTestManifest
 \$OUT_DIR\/androidx\/compose\/foundation\/foundation\-benchmark\/build\/intermediates\/tmp\/manifest\/androidTest\/release\/manifestMerger[0-9]+\.xml\:[0-9]+\:[0-9]+\-[0-9]+\:[0-9]+ Warning\:
 # > Task :compose:material:material-benchmark:processReleaseAndroidTestManifest
@@ -624,6 +531,8 @@
 # > Task :compose:ui:ui-graphics:ui-graphics-benchmark:processReleaseAndroidTestManifest
 \$OUT_DIR\/androidx\/compose\/ui\/ui\-graphics\/ui\-graphics\-benchmark\/build\/intermediates\/tmp\/manifest\/androidTest\/release\/manifestMerger[0-9]+\.xml\:[0-9]+\:[0-9]+\-[0-9]+\:[0-9]+ Warning\:
 # > Task :docs-public:doclavaDocs
+\$OUT_DIR\/androidx\/docs\-public\/build\/unzippedDocsSources\/androidx\/work\/impl\/WorkManagerImpl\.java\:[0-9]+\: error\: cannot find symbol
+import static android\.app\.PendingIntent\.FLAG_MUTABLE\;
 \$OUT_DIR/androidx/docs\-public/build/unzippedDocsSources/androidx/window/ExtensionAdapter\.java:[0-9]+: error: cannot find symbol
 import androidx\.window\.extensions\.ExtensionDeviceState;
 # > Task :docs-public:dackkaDocs
@@ -682,6 +591,7 @@
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/actualTypealiasAdder,
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/kotlinSignatureProvider,
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/modulesAndPackagesDocumentation,
+Extension: org\.jetbrains\.dokka\.base\.DokkaBase/inheritedEntriesVisbilityFilter,
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/obviousFunctionsVisbilityFilter,
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/documentableVisibilityFilter,
 Extension: org\.jetbrains\.dokka\.base\.DokkaBase/suppressedBySuppressTagDocumentableFilter,
@@ -700,6 +610,8 @@
 PROGRESS: Dokka is performing: documentation for
 PROGRESS: Validity check
 PROGRESS: Creating documentation models
+ERROR: An attempt to write .*
+Generation completed with.*
 # > Task :docs-tip-of-tree:dackkaDocs
 Conflicting documentation for .*
 PROGRESS: Transforming documentation model before merging
@@ -711,20 +623,349 @@
 generation completed successfully
 PROGRESS:
 === TIME MEASUREMENT ===
-Initializing plugins\:   [0-9]+
-Validity check\:     [0-9]+
-Initializing plugins:  [0-9]+
-Validity check:    [0-9]+
-Creating documentation models: [0-9]+
-Transforming documentation model before merging\:    [0-9]+
-Merging documentation models\:     [0-9]+
-Transforming documentation model before merging:   [0-9]+
-Merging documentation models:    [0-9]+
-Transforming documentation model after merging\:    [0-9]+
-Creating pages\:     [0-9]+
-Transforming pages\:    [0-9]+
-Rendering\:  [0-9]+
-Transforming documentation model after merging:   [0-9]+
-Creating pages:    [0-9]+
-Transforming pages:   [0-9]+
-Rendering: [0-9]+
\ No newline at end of file
+Initializing plugins\: *[0-9]+
+Validity check\: *[0-9]+
+Creating documentation models: *[0-9]+
+Transforming documentation model before merging\: *[0-9]+
+Merging documentation models\: *[0-9]+
+Transforming documentation model after merging\: *[0-9]+
+Creating pages\: *[0-9]+
+Transforming pages\: *[0-9]+
+Rendering\: *[0-9]+
+WARNING\: unable to find what is referred to by
+@param maxSlotsToRetainForReuse
+in DClass SubcomposeLayoutState
+@param initVal
+in DClass AnimationVector[0-9]+D
+@param a,
+@param b,
+@param c,
+@param d
+in DClass CubicBezierEasing
+@param v[0-9]+,
+@param v[0-9]+
+@param frictionMultiplier,
+@param absVelocityThreshold
+in DClass FloatExponentialDecaySpec
+@param duration,
+@param delay,
+@param easing
+in DClass FloatTweenSpec
+@param dampingRatio,
+@param stiffness,
+@param visibilityThreshold
+in DClass SpringSpec
+@param durationMillis,
+in DClass TweenSpec
+in DClass FloatSpringSpec
+@param iterations,
+@param animation,
+@param repeatMode
+in DClass RepeatableSpec
+in DClass VectorizedInfiniteRepeatableSpec
+@param keyframes,
+@param delayMillis
+in DClass VectorizedKeyframesSpec
+@param delayMillis,
+in DClass VectorizedTweenSpec
+@param animationSpec,
+@param initialValue,
+@param targetValue,
+@param typeConverter,
+@param initialVelocityVector
+in DClass TargetBasedAnimation
+@param delay
+in DClass SnapSpec
+in DClass InfiniteRepeatableSpec
+in DClass VectorizedRepeatableSpec
+@param initialVelocityVector,
+@param lastFrameTimeNanos,
+@param finishedTimeNanos,
+@param isRunning
+in DClass AnimationState
+in DClass VectorizedSnapSpec
+in DClass Animatable
+@param width,
+@param brush
+in DClass BorderStroke
+@param initial
+in DClass ScrollState
+@param firstVisibleItemIndex,
+@param firstVisibleItemScrollOffset
+in DClass LazyListState
+@param builder
+in DClass GenericShape
+@param topLeft,
+@param topRight,
+@param bottomRight,
+@param bottomLeft
+in DClass AbsoluteCutCornerShape
+@param topStart,
+@param topEnd,
+@param bottomEnd,
+@param bottomStart
+in DClass RoundedCornerShape
+in DClass CutCornerShape
+in DClass AbsoluteRoundedCornerShape
+in DClass CornerBasedShape
+@param capitalization,
+@param autoCorrect,
+@param keyboardType,
+@param imeAction
+in DClass KeyboardOptions
+@param drawerState,
+@param bottomSheetState,
+@param snackbarHostState
+in DClass BottomSheetScaffoldState
+@param confirmStateChange,
+in DClass BackdropScaffoldState
+@param confirmStateChange
+in DClass DismissState
+in DClass BottomDrawerState
+in DClass ScaffoldState
+@param basis,
+@param factorAtMin,
+@param factorAtMax
+in DClass ResistanceConfig
+in DClass BottomSheetState
+in DClass DrawerState
+@param offset
+in DClass FixedThreshold
+@param fraction
+in DClass FractionalThreshold
+in DClass ModalBottomSheetState
+@param from,
+@param to,
+in DClass SwipeProgress
+in DClass SwipeableState
+@param file
+in DAnnotation LiveLiteralFileInfo
+@param name,
+@param id
+in DAnnotation DecoyImplementation
+@param key,
+in DAnnotation LiveLiteralInfo
+@param parameters
+in DAnnotation StabilityInferred
+@param targetName,
+@param signature
+in DAnnotation Decoy
+@param left,
+@param top,
+@param right,
+@param bottom
+in DClass MutableRect
+@param buffer,
+@param bufferOffset,
+@param height,
+@param stride
+in DClass PixelMap
+@param image,
+@param srcOffset,
+@param srcSize
+in DClass BitmapPainter
+@param imageVector
+in DClass AnimatedImageVector
+@param keyCode
+in DClass Key
+@param value
+in DClass PointerId
+@param positionChange,
+@param downChange
+in DClass ConsumedData
+@param id,
+@param uptimeMillis,
+@param position,
+@param pressed,
+@param previousUptimeMillis,
+@param previousPosition,
+@param previousPressed,
+@param consumed,
+@param type
+in DClass PointerInputChange
+@param merger
+in DClass VerticalAlignmentLine
+in DClass HorizontalAlignmentLine
+@param value,
+@param maxValue,
+@param reverseScrolling
+in DClass ScrollAxisRange
+@param current,
+@param range,
+@param steps
+in DClass ProgressBarRangeInfo
+@param label,
+@param action
+in DClass AccessibilityAction
+in DClass CustomAccessibilityAction
+@param selectedNodes,
+@param customErrorOnNoMatch
+in DClass SelectionResult
+@param description,
+@param requiresExactlyOneNode,
+@param chainedInputSelector,
+@param selector
+in DClass SemanticsSelector
+@param activityRule,
+@param activityProvider
+in DClass AndroidComposeTestRule
+@param placeholderVerticalAlign
+in DClass Placeholder
+@param item,
+@param start,
+@param end,
+@param tag
+in DClass Range
+@param verbatim
+in DClass VerbatimTtsAnnotation
+@param annotatedString,
+@param style,
+@param placeholders,
+@param density,
+@param resourceLoader
+in DClass MultiParagraphIntrinsics
+@param textAlign,
+@param textDirection,
+@param textIndent,
+@param lineHeight
+in DClass ParagraphStyle
+@param color,
+@param fontSize,
+@param fontWeight,
+@param fontStyle,
+@param fontSynthesis,
+@param fontFamily,
+@param fontFeatureSettings,
+@param letterSpacing,
+@param baselineShift,
+@param textGeometricTransform,
+@param localeList,
+@param background,
+@param textDecoration,
+@param shadow
+in DClass SpanStyle
+@param shadow,
+in DClass TextStyle
+@param intrinsics,
+@param maxLines,
+@param ellipsis,
+@param width
+in DClass MultiParagraph
+@param capacity
+in DClass Builder
+@param typeface
+in DClass LoadedFontFamily
+@param resId,
+@param weight,
+@param style
+in DClass ResourceFont
+@param name
+in DClass GenericFontFamily
+@param weight
+in DClass FontWeight
+@param singleLine,
+in DClass ImeOptions
+@param selection,
+@param composition
+in DClass TextFieldValue
+@param mask
+in DClass PasswordVisualTransformation
+@param multiplier
+in DClass BaselineShift
+@param firstLine,
+@param restLine
+in DClass TextIndent
+@param scaleX,
+@param skewX
+in DClass TextGeometricTransform
+@param provider,
+@param limit
+in DAnnotation PreviewParameter
+@param group,
+@param apiLevel,
+@param widthDp,
+@param heightDp,
+@param locale,
+@param fontScale,
+@param showSystemUi,
+@param showBackground,
+@param backgroundColor,
+@param uiMode,
+@param device
+in DAnnotation Preview
+@param words
+in DClass LoremIpsum
+@param securePolicy
+in DClass PopupProperties
+@param rowCount,
+@param columnCount
+in DClass CollectionInfo
+@param rowIndex,
+@param rowSpan,
+@param columnIndex,
+@param columnSpan
+in DClass CollectionItemInfo
+@param endOfPaginationReached
+in DClass LoadState
+in DClass NotLoading
+@param error
+in DClass Error
+@param pagingSourceFactory
+in DClass InvalidatingPagingSourceFactory
+@param flow
+in DClass LazyPagingItems
+@param density
+in DClass SplineBasedFloatDecayAnimationSpec
+Did you make a typo\? Are you trying to refer to something not visible to users\?
+# Wire proto generation, task :generateDebugProtos
+Writing .* to \$OUT_DIR/.*/build/generated/source/wire
+# > Task :docs-tip-of-tree:doclavaDocs
+javadoc\: warning \- Multiple sources of package comments found for package \"javax\.annotation\"
+[0-9]+ warning
+# > Task :room:room-compiler-processing-testing:sourceJar
+Execution optimizations have been disabled for task ':room:room\-compiler\-processing\-testing:sourceJar' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$OUT_DIR/androidx/room/room\-compiler\-processing\-testing/build/test\-config'\. Reason: Task ':room:room\-compiler\-processing\-testing:sourceJar' uses this output of task ':room:room\-compiler\-processing\-testing:prepareTestConfiguration' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :wear:tiles:tiles-proto:sourceJar
+Execution optimizations have been disabled for task ':wear:tiles:tiles\-proto:sourceJar' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$OUT_DIR/androidx/wear/tiles/tiles\-proto/build/generated/source/proto'\. Reason: Task ':wear:tiles:tiles\-proto:sourceJar' uses this output of task ':wear:tiles:tiles\-proto:generateProto' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :appsearch:appsearch-local-storage:desugarDebugAndroidTestFileDependencies
+Execution optimizations have been disabled for task ':appsearch:appsearch\-local\-storage:desugarDebugAndroidTestFileDependencies' to ensure correctness due to the following reasons:
+# > Task :appsearch:appsearch:desugarDebugAndroidTestFileDependencies
+Execution optimizations have been disabled for task ':appsearch:appsearch:desugarDebugAndroidTestFileDependencies' to ensure correctness due to the following reasons:
+# > Task :appsearch:appsearch-debug-view:desugarDebugAndroidTestFileDependencies
+Execution optimizations have been disabled for task ':appsearch:appsearch-debug-view:desugar.*AndroidTestFileDependencies' to ensure correctness due to the following reasons:
+# > Task :appsearch:appsearch-debug-view:samples:desugarDebugFileDependencies
+Execution optimizations have been disabled for task ':appsearch:appsearch-debug-view:samples:desugar.*FileDependencies' to ensure correctness due to the following reasons:
+# > Task :stripArchiveForPartialDejetification
+Execution optimizations have been disabled for task ':stripArchiveForPartialDejetification' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$DIST_DIR/top\-of\-tree\-m2repository\-all\-.*.zip'\. Reason: Task ':stripArchiveForPartialDejetification' uses this output of task ':benchmark:benchmark\-gradle\-plugin:buildOnServer' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :icing:lintDebug
+Wrote HTML report to file://\$OUT_DIR/androidx/icing/build/reports/lint\-results\-debug\.html
+Wrote XML report to file://\$OUT_DIR/androidx/icing/build/reports/lint\-results\-debug\.xml
+# > Task :zipConstrainedTestConfigsWithApks
+Execution optimizations have been disabled for task ':zipConstrainedTestConfigsWithApks' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$DIST_DIR/constrained\-test\-xml\-configs'\. Reason: Task ':zipConstrainedTestConfigsWithApks' uses this output of task ':benchmark:benchmark\-gradle\-plugin:buildOnServer' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :zipTestConfigsWithApks
+Execution optimizations have been disabled for task ':zipTestConfigsWithApks' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$DIST_DIR/test\-xml\-configs'\. Reason: Task ':zipTestConfigsWithApks' uses this output of task ':benchmark:benchmark\-gradle\-plugin:buildOnServer' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :room:room-compiler:checkArtifactTask
+Execution optimizations have been disabled for task ':room:room\-compiler:checkArtifactTask' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$OUT_DIR/androidx/room/room\-compiler/build/libs/room\-compiler\-[0-9]+\.[0-9]+\.[0-9]+\-alpha[0-9]+\.jar'\. Reason: Task ':room:room\-compiler:checkArtifactTask' uses this output of task ':room:room\-compiler:shadowJar' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+\- Gradle detected a problem with the following location: '\$OUT_DIR/androidx/room/room\-compiler/build/publications/maven/pom\-default\.xml'\. Reason: Task ':room:room\-compiler:checkArtifactTask' uses this output of task ':room:room\-compiler:generatePomFileForMavenPublication' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+\- Gradle detected a problem with the following location: '\$OUT_DIR'\. Reason: Task ':zipEcFiles' uses this output of task.*
+Execution optimizations have been disabled for task ':zipEcFiles' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$OUT_DIR/.*/build/repackaged/repackaged\-Debug\.jar'\. Reason:.*
+\- Gradle detected a problem with the following location: '\$OUT_DIR/.*/build/repackaged/repackaged\-Release\.jar'\. Reason:.*
+Execution optimizations have been disabled for task ':emoji.*
+Execution optimizations have been disabled for task ':support-emoji-demos:.*
+# https://issues.apache.org/jira/browse/GROOVY-8843
+WARNING: Illegal reflective access by org\.codehaus\.groovy\.vmplugin\.v7\.Java7\$1 .* to constructor java\.lang\.invoke\.MethodHandles\$Lookup\(java\.lang\.Class,int\)
+WARNING: Please consider reporting this to the maintainers of org\.codehaus\.groovy\.vmplugin\.v7\.Java7\$1
+# https://youtrack.jetbrains.com/issue/KT-30589
+WARNING: Illegal reflective access by org\.jetbrains\.kotlin\.kapt3\.base\.javac\.KaptJavaFileManager .* to method com\.sun\.tools\.javac\.file\.BaseFileManager\.handleOption\(com\.sun\.tools\.javac\.main\.Option,java\.lang\.String\)
+WARNING: Please consider reporting this to the maintainers of org\.jetbrains\.kotlin\.kapt3\.base\.javac\.KaptJavaFileManager
+# > Task :benchmark:benchmark-macro:compileReleaseKotlin
+Execution optimizations have been disabled for task ':benchmark:benchmark\-macro:.*' to ensure correctness due to the following reasons:
+\- Gradle detected a problem with the following location: '\$OUT_DIR/androidx/benchmark/benchmark\-macro/build/generated/source/wire'\. Reason: Task ':benchmark:benchmark\-macro:.*' uses this output of task ':benchmark:benchmark\-macro:.*' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
+# > Task :support-emoji-demos:lintDebug
+Error processing .* broken class file\? \(This feature requires ASM[0-9]+\)
\ No newline at end of file
diff --git a/development/checkInvalidSuppress.py b/development/checkInvalidSuppress.py
index e015483..b4484fa7 100755
--- a/development/checkInvalidSuppress.py
+++ b/development/checkInvalidSuppress.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 
 #
 # Copyright 2019, The Android Open Source Project
@@ -35,7 +35,7 @@
 
 ## Check a line for any invalid suppressions, and return it if found
 def getReportForLine(filename, i, line, lines):
-  for bad, good in MATCHERS.iteritems():
+  for bad, good in MATCHERS.items():
     if bad in line:
       context = "".join(lines[i:i+3])
       return "\n{}:{}:\nError: unsupported comment suppression\n{}Instead, use: {}\n".format(
diff --git a/development/check_os_prebuilts.py b/development/check_os_prebuilts.py
index 04977565..9b21fa0 100755
--- a/development/check_os_prebuilts.py
+++ b/development/check_os_prebuilts.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 
 #
 # Copyright 2019, The Android Open Source Project
@@ -41,14 +41,14 @@
   if not os_specific_files:
     sys.exit(0)
 
-  print "The following operating system specific files were found in your commit:\n\033[91m"
+  print("The following operating system specific files were found in your commit:\n\033[91m")
   for filename in os_specific_files.values():
-    print filename
-  print """\033[0m\nPlease make sure to import the corresponding prebuilts for missing platforms.
+    print(filename)
+  print ("""\033[0m\nPlease make sure to import the corresponding prebuilts for missing platforms.
 If you imported a prebuilt similar to foo:bar:linux, try foo:bar:osx and vice versa.
 If there is no corresponding prebuilt, or only adding a prebuilt for one platform is intended, run:
 \033[92mrepo upload --no-verify\033[0m
-to skip this warning."""
+to skip this warning.""")
   sys.exit(1)
 
 
diff --git a/development/diagnose-build-failure/diagnose-build-failure.sh b/development/diagnose-build-failure/diagnose-build-failure.sh
index 5a1624b..44b0cea 100755
--- a/development/diagnose-build-failure/diagnose-build-failure.sh
+++ b/development/diagnose-build-failure/diagnose-build-failure.sh
@@ -19,7 +19,7 @@
   echo "  Replaces the requirement for "'`'"./gradlew <tasks>"'`'" to fail with the requirement that it produces the given message"
   echo
   echo "SAMPLE USAGE"
-  echo "  $0 assembleDebug # or any other arguments you would normally give to ./gradlew"
+  echo "  $0 assembleRelease # or any other arguments you would normally give to ./gradlew"
   echo
   echo "OUTPUT"
   echo "  diagnose-build-failure will conclude one of the following:"
@@ -122,7 +122,7 @@
 function backupState() {
   cd "$scriptPath"
   backupDir="$1"
-  ./impl/backup-state.sh "$backupDir" "$workingDir"
+  ./impl/backup-state.sh "$backupDir" "$workingDir" "$2"
 }
 
 function restoreState() {
@@ -171,7 +171,9 @@
   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
-  backupState "$tempDir/prev"
+  # 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
@@ -231,8 +233,8 @@
 echo "Binary-searching the contents of the two output directories until the relevant differences are identified."
 echo "This may take a while."
 echo
-filtererCommand="$(getBuildCommand "$scriptPath/impl/restore-state.sh . $workingDir && cd $workingDir && ./gradlew --no-daemon $gradleArgs")"
-if $supportRoot/development/file-utils/diff-filterer.py --assume-no-side-effects --assume-input-states-are-correct --work-path $tempDir $successState $tempDir/prev "$filtererCommand"; then
+filtererCommand="$(getBuildCommand "$scriptPath/impl/restore-state.sh . $workingDir --move && cd $workingDir && ./gradlew --no-daemon $gradleArgs")"
+if $supportRoot/development/file-utils/diff-filterer.py --assume-input-states-are-correct --work-path $tempDir $successState $tempDir/prev "$filtererCommand"; 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"
diff --git a/development/diagnose-build-failure/impl/backup-state.sh b/development/diagnose-build-failure/impl/backup-state.sh
index d1d01a0..df7ffa5 100755
--- a/development/diagnose-build-failure/impl/backup-state.sh
+++ b/development/diagnose-build-failure/impl/backup-state.sh
@@ -3,6 +3,7 @@
 
 stateDir="$1"
 gradlewDir="$2"
+moveArg="$3"
 
 scriptPath="$(cd $(dirname $0) && pwd)"
 supportRoot="$(cd $scriptPath/../../.. && pwd)"
@@ -22,6 +23,17 @@
   usage
 fi
 
+move=false
+if [ "$moveArg" == "--move" ]; then
+  move=true
+  shift
+fi
+
+if [ "$3" != "" ]; then
+  echo "Unrecognized argument $3"
+  usage
+fi
+
 rm -rf "$stateDir"
 mkdir -p "$stateDir"
 stateDir="$(cd $stateDir && pwd)"
@@ -37,8 +49,13 @@
   rm "$to" -rf
   if [ -e "$from" ]; then
     mkdir -p "$(dirname $to)"
-    cp --preserve=all -rT "$from" "$to"
+    if [ "$move" == "true" ]; then
+      mv "$from" "$to"
+    else
+      cp --preserve=all -rT "$from" "$to"
+    fi
   fi
+
 }
 
 function backupState() {
diff --git a/development/diagnose-build-failure/impl/restore-state.sh b/development/diagnose-build-failure/impl/restore-state.sh
index b0e47bf..4ed9170 100755
--- a/development/diagnose-build-failure/impl/restore-state.sh
+++ b/development/diagnose-build-failure/impl/restore-state.sh
@@ -3,6 +3,7 @@
 
 stateDir="$1"
 gradlewDir="$2"
+moveArg="$3"
 
 scriptPath="$(cd $(dirname $0) && pwd)"
 supportRoot="$(cd $scriptPath/../../.. && pwd)"
@@ -22,6 +23,11 @@
   usage
 fi
 
+move=false
+if [ "$moveArg" == "--move" ]; then
+  move=true
+fi
+
 if [ "$stateDir" != "/dev/null" ]; then
   stateDir="$(cd $stateDir && pwd)"
 fi
@@ -36,7 +42,11 @@
   rm "$to" -rf
   if [ -e "$from" ]; then
     mkdir -p "$(dirname $to)"
-    cp --preserve=all -rT "$from" "$to"
+    if [ "$move" == "true" ]; then
+      mv "$from" "$to"
+    else
+      cp --preserve=all -rT "$from" "$to"
+    fi
   fi
 }
 
diff --git a/development/file-utils/diff-filterer.py b/development/file-utils/diff-filterer.py
index dd575a8..512158d 100755
--- a/development/file-utils/diff-filterer.py
+++ b/development/file-utils/diff-filterer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 #
 #  Copyright (C) 2018 The Android Open Source Project
 #
@@ -65,6 +65,11 @@
     else:
       shutil.copy2(fromPath, toPath)
 
+  def hardLink(self, oldPath, newPath):
+    self.ensureDirExists(os.path.dirname(newPath))
+    self.removePath(newPath)
+    os.link(oldPath, newPath)
+
   def writeFile(self, path, text):
     f = open(path, "w+")
     f.write(text)
@@ -72,7 +77,7 @@
 
   def writeScript(self, path, text):
     self.writeFile(path, text)
-    os.chmod(path, 0755)
+    os.chmod(path, stat.S_IRWXU)
 
   def removePath(self, filePath):
     if len(os.path.split(filePath)) < 2:
@@ -108,16 +113,59 @@
   def commonPrefix(self, paths):
     if len(paths) < 1:
       return None
-    result = paths[0]
+    result = None
     for path in paths:
-      prev = result
-      result = self.commonPrefixOf2(result, path)
       if result is None:
-        return result
+        # first iteration
+        result = path
+      else:
+        prev = result
+        result = self.commonPrefixOf2(result, path)
+        if result is None:
+          # the common prefix of two paths was nothing
+          return result
     return result
 
 fileIo = FileIo()
 
+# Fast file copying
+class FileCopyCache(object):
+  def __init__(self):
+    self.modificationTimes = {}
+
+  # Puts a copy of <sourcePath> at <destPath>
+  # If we already have an unmodified copy, we just hardlink our existing unmodified copy
+  # If we don't have an unmodified copy, we first make a copy
+  def copyFile(self, sourcePath, destPath, cachePath):
+    if cachePath is None:
+      fileIo.copyFile(sourcePath, destPath)
+    else:
+      shareable = self.getShareableFile(sourcePath, cachePath)
+      fileIo.hardLink(shareable, destPath)
+
+  # gets a shareable copy of <sourcePath> in <cachePath> and returns its path
+  def getShareableFile(self, sourcePath, cachePath):
+    # note that absolute sourcePath is supported
+    path = os.path.abspath(cachePath + "/" + sourcePath)
+    if path in self.modificationTimes:
+      # we've already shared this file before; let's check whether it has been modified since then
+      if self.modificationTimes[path] == self.getModificationTime(path):
+        # this file hasn't been modified since we last shared it; we can just reuse it
+        return path
+    # we don't have an existing file that we can reuse, so we have to make one
+    fileIo.copyFile(sourcePath, path)
+    self.modificationTimes[path] = self.getModificationTime(path)
+    return path
+
+  # returns the time at which <path> was last modified
+  def getModificationTime(self, path):
+    if os.path.exists(path):
+      return os.path.getmtime(path)
+    return None
+
+
+fileCopyCache = FileCopyCache()
+
 # Runs a shell command
 class ShellScript(object):
   def __init__(self, commandText, cwd):
@@ -135,7 +183,7 @@
 
 # Base class that can hold the state of a file
 class FileContent(object):
-  def apply(self, filePath):
+  def apply(self, filePath, cachePath=None):
     pass
 
   def equals(self, other, checkWithFileSystem=False):
@@ -148,8 +196,8 @@
     self.referencePath = referencePath
     self.isLink = os.path.islink(self.referencePath)
 
-  def apply(self, filePath):
-    fileIo.copyFile(self.referencePath, filePath)
+  def apply(self, filePath, cachePath=None):
+    fileCopyCache.copyFile(self.referencePath, filePath, cachePath)
 
   def equals(self, other, checkWithFileSystem=False):
     if not isinstance(other, FileBacked_FileContent):
@@ -172,7 +220,7 @@
   def __init__(self):
     super(MissingFile_FileContent, self).__init__()
 
-  def apply(self, filePath):
+  def apply(self, filePath, cachePath=None):
     fileIo.removePath(filePath)
 
   def equals(self, other, checkWithFileSystem=False):
@@ -186,7 +234,7 @@
   def __init__(self):
     super(Directory_FileContent, self).__init__()
 
-  def apply(self, filePath):
+  def apply(self, filePath, cachePath=None):
     fileIo.ensureDirExists(filePath)
 
   def equals(self, other, checkWithFileSystem=False):
@@ -200,9 +248,9 @@
   def __init__(self):
     self.fileStates = OrderedDict()
 
-  def apply(self, filePath):
-    for relPath, state in self.fileStates.iteritems():
-      state.apply(fileIo.join(filePath, relPath))
+  def apply(self, filePath, cachePath=None):
+    for relPath, state in self.fileStates.items():
+      state.apply(fileIo.join(filePath, relPath), cachePath)
 
   def add(self, filePath, fileContent):
     self.fileStates[filePath] = fileContent
@@ -219,7 +267,7 @@
   # returns a FilesState resembling <self> but without the keys for which other[key] == self[key]
   def withoutDuplicatesFrom(self, other, checkWithFileSystem=False):
     result = FilesState()
-    for filePath, fileState in self.fileStates.iteritems():
+    for filePath, fileState in self.fileStates.items():
       otherContent = other.getContent(filePath)
       if not fileState.equals(otherContent, checkWithFileSystem):
         result.add(filePath, fileState)
@@ -228,13 +276,13 @@
   # returns self[fromIndex:toIndex]
   def slice(self, fromIndex, toIndex):
     result = FilesState()
-    for filePath in self.fileStates.keys()[fromIndex:toIndex]:
+    for filePath in list(self.fileStates.keys())[fromIndex:toIndex]:
       result.fileStates[filePath] = self.fileStates[filePath]
     return result
 
   def restrictedToKeysIn(self, other):
     result = FilesState()
-    for filePath, fileState in self.fileStates.iteritems():
+    for filePath, fileState in self.fileStates.items():
       if filePath in other.fileStates:
         result.add(filePath, fileState)
     return result
@@ -242,7 +290,7 @@
   # returns a FilesState having the same keys as this FilesState, but with values taken from <other> when it has them, and <self> otherwise
   def withConflictsFrom(self, other, listEmptyDirs = False):
     result = FilesState()
-    for filePath, fileContent in self.fileStates.iteritems():
+    for filePath, fileContent in self.fileStates.items():
       if filePath in other.fileStates:
         result.add(filePath, other.fileStates[filePath])
       else:
@@ -278,7 +326,7 @@
   def listImpliedDirs(self):
     dirs = set()
     empty = MissingFile_FileContent()
-    keys = [key for (key, value) in self.fileStates.iteritems() if not empty.equals(value)]
+    keys = [key for (key, value) in self.fileStates.items() if not empty.equals(value)]
     i = 0
     while i < len(keys):
       path = keys[i]
@@ -303,14 +351,14 @@
 
   def clone(self):
     result = FilesState()
-    for path, content in self.fileStates.iteritems():
+    for path, content in self.fileStates.items():
       result.add(path, content)
     return result
 
   def withoutEmptyEntries(self):
     result = FilesState()
     empty = MissingFile_FileContent()
-    for path, state in self.fileStates.iteritems():
+    for path, state in self.fileStates.items():
       if not empty.equals(state):
         result.add(path, state)
     return result
@@ -334,7 +382,7 @@
       prefixLength = len(commonDir) + 1 # skip the following '/'
     groupsByDir = {}
 
-    for filePath, fileContent in self.fileStates.iteritems():
+    for filePath, fileContent in self.fileStates.items():
       subPath = filePath[prefixLength:]
       slashIndex = subPath.find("/")
       if slashIndex < 0:
@@ -362,7 +410,7 @@
       minIndex = 0
       mergedChildren = []
       for i in range(maxNumChildren):
-        maxIndex = len(children) * (i + 1) / maxNumChildren
+        maxIndex = len(children) * (i + 1) // maxNumChildren
         merge = FilesState()
         for child in children[minIndex:maxIndex]:
           merge.addAllFrom(child)
@@ -387,7 +435,7 @@
     if len(self.fileStates) == 0:
       return "[empty fileState]"
     entries = []
-    for filePath, state in self.fileStates.iteritems():
+    for filePath, state in self.fileStates.items():
       entries.append(filePath + " -> " + str(state))
     if len(self.fileStates) > 1:
       prefix = str(len(entries)) + " entries:\n"
@@ -609,15 +657,15 @@
   return tree
 
 # runs a Job in this process
-def runJobInSameProcess(shellCommand, workPath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe):
-  job = Job(shellCommand, workPath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe)
+def runJobInSameProcess(shellCommand, workPath, cachePath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe):
+  job = Job(shellCommand, workPath, cachePath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe)
   job.runAndReport()
 
 # starts a Job in a new process
-def runJobInOtherProcess(shellCommand, workPath, full_resetTo_state, assumeNoSideEffects, candidateBox, queue, identifier):
+def runJobInOtherProcess(shellCommand, workPath, cachePath, full_resetTo_state, assumeNoSideEffects, candidateBox, queue, identifier):
   parentWriter, childReader = multiprocessing.Pipe()
   childInfo = TwoWayPipe(childReader, queue, identifier)
-  process = multiprocessing.Process(target=runJobInSameProcess, args=(shellCommand, workPath, full_resetTo_state, assumeNoSideEffects, candidateBox, childInfo,))
+  process = multiprocessing.Process(target=runJobInSameProcess, args=(shellCommand, workPath, cachePath, full_resetTo_state, assumeNoSideEffects, candidateBox, childInfo,))
   process.start()
   return parentWriter
 
@@ -629,7 +677,7 @@
 
 # Stores a subprocess for running tests and some information about which tests to run
 class Job(object):
-  def __init__(self, shellCommand, workPath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe):
+  def __init__(self, shellCommand, workPath, cachePath, full_resetTo_state, assumeNoSideEffects, candidateBox, twoWayPipe):
     self.shellCommand = shellCommand
     self.workPath = workPath
     self.full_resetTo_state = full_resetTo_state
@@ -643,6 +691,7 @@
     self.busy = False
     self.complete = False
     self.pipe = twoWayPipe
+    self.cachePath = cachePath
 
   def runAndReport(self):
     succeeded = False
@@ -661,7 +710,7 @@
     # If the user told us that we don't have to worry about the possibility of the shell command generating files whose state matters,
     # then we don't reset any unrecognized files (they might even be caches that improve speed)
     testState = self.candidateBox
-    self.full_resetTo_state.expandedWithEmptyEntriesFor(testState).withConflictsFrom(testState, True).apply(self.workPath)
+    self.full_resetTo_state.expandedWithEmptyEntriesFor(testState).withConflictsFrom(testState, True).apply(self.workPath, self.cachePath)
 
     # run test
     start = datetime.datetime.now()
@@ -726,6 +775,7 @@
             except IOError as e:
               if attempt >= numAttempts - 1:
                 raise Exception("Failed to remove " + path, e)
+    fileIo.removePath(os.path.join(self.workPath, "caches"))
 
   def runnerTest(self, testState, timeout = None):
     workPath = self.getWorkPath(0)
@@ -764,6 +814,9 @@
   def getWorkPath(self, jobId):
     return os.path.join(self.workPath, "job-" + str(jobId))
 
+  def getFilesCachePath(self, jobId):
+    return os.path.join(self.workPath, "caches", "job-" + str(jobId))
+
   def run(self):
     start = datetime.datetime.now()
     numIterationsCompleted = 0
@@ -813,7 +866,7 @@
       # display status message
       now = datetime.datetime.now()
       elapsedDuration = now - start
-      minNumTestsRemaining = sum([math.log(box.size(), 2) + 1 for box in availableTestStates + activeTestStatesById.values()]) - numFailuresSinceLastSplitOrSuccess
+      minNumTestsRemaining = sum([math.log(box.size(), 2) + 1 for box in availableTestStates + list(activeTestStatesById.values())]) - numFailuresSinceLastSplitOrSuccess
       estimatedNumTestsRemaining = max(minNumTestsRemaining, 1)
       if numConsecutiveFailures >= 4 and numFailuresSinceLastSplitOrSuccess < 1:
         # If we are splitting often and failing often, then we probably haven't yet
@@ -969,7 +1022,8 @@
             jobId += 1
           # start job
           workingDir = self.getWorkPath(jobId)
-          runJobInOtherProcess(self.testScript_path, workingDir, self.full_resetTo_state, self.assumeNoSideEffects, box, queue, jobId)
+          cacheDir = self.getFilesCachePath(jobId)
+          runJobInOtherProcess(self.testScript_path, workingDir, cacheDir, self.full_resetTo_state, self.assumeNoSideEffects, box, queue, jobId)
           activeTestStatesById[jobId] = box
           availableTestStates = availableTestStates[1:]
 
diff --git a/development/referenceDocs/OWNERS b/development/referenceDocs/OWNERS
new file mode 100644
index 0000000..680d614
--- /dev/null
+++ b/development/referenceDocs/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
new file mode 100755
index 0000000..293214d
--- /dev/null
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -0,0 +1,238 @@
+#!/bin/bash
+#
+# Script to fetch generated API references docs from the Android build server and stage them.
+
+source gbash.sh || exit
+
+readonly defaultDb=""
+DEFINE_string buildId --required "" "The build ID from the Android build server"
+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."
+
+gbash::init_google "$@"
+
+# Allowlist for including specific directories being generated by Dackka.
+#
+# There are separate lists for Java and Kotlin refdocs as some libraries (such
+# as Compose) only publish refdocs for a single language.
+#
+# Each directory's spelling must match the library's directory in
+# frameworks/support.
+#
+# This list should match, or be a subset of, the list of libraries defined in
+# https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:buildSrc/src/main/kotlin/androidx/build/docs/AndroidXDocsPlugin.kt;l=568
+readonly javaLibraryDirs=(
+#  "benchmark"
+#  "collection"
+  "paging"
+)
+readonly kotlinLibraryDirs=(
+#  "benchmark"
+  "compose"
+#  "collection"
+#  "paging"
+)
+
+
+# Change directory to this script's location and store the directory
+cd "$(dirname $0)"
+scriptDirectory=$(pwd)
+
+# Working directories for the refdocs
+outDir="$scriptDirectory/out"
+readonly newDir="reference-docs"
+readonly dackkaNewDir="reference-docs-dackka"
+
+# Remove and recreate the existing out directory to avoid conflicts from previous runs
+rm -rf $outDir
+mkdir -p $outDir/$newDir
+mkdir -p $outDir/$dackkaNewDir
+cd $outDir
+
+printf "=================================================================== \n"
+printf "== Download the doc zip files from the build server \n"
+printf "=================================================================== \n"
+
+androidxPublicJavaDocsZip="doclava-public-docs-${FLAGS_buildId}.zip"
+androidxPublicKotlinDocsZip="dokka-public-docs-${FLAGS_buildId}.zip"
+androidxPublicDackkaDocsZip="dackka-public-docs-${FLAGS_buildId}.zip"
+
+/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxPublicJavaDocsZip
+/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxPublicKotlinDocsZip
+/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxPublicDackkaDocsZip
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Unzip the doc zip files \n"
+printf "=================================================================== \n"
+
+unzip $androidxPublicJavaDocsZip -d $newDir
+unzip $androidxPublicKotlinDocsZip -d $newDir
+unzip $androidxPublicDackkaDocsZip -d $dackkaNewDir
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Format the doc zip files \n"
+printf "=================================================================== \n"
+
+cd $newDir
+
+# Remove directories we never publish
+rm en -rf
+rm reference/android -rf
+rm reference/java -rf
+rm reference/org -rf
+rm reference/hierarchy.html
+rm reference/kotlin/org -rf
+rm reference/kotlin/android -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
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Generate the language switcher \n"
+printf "=================================================================== \n"
+
+# The switcher script still requires python2 to run correctly
+cd reference
+python2 ./../../../switcher.py --work androidx
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Copy over Dackka generated refdocs \n"
+printf "=================================================================== \n"
+
+# Dackka adds the language switcher during generation, so the Dackka directories
+# should be copied over after the switcher.py runs - otherwise the contents in
+# the Dackka directories will contain a duplicate language switcher.
+
+cd $outDir
+for dir in "${javaLibraryDirs[@]}"
+do
+  printf "Copying Java refdocs for $dir\n"
+  cp -r $dackkaNewDir/reference/androidx/$dir $newDir/reference/androidx/
+done
+
+for dir in "${kotlinLibraryDirs[@]}"
+do
+  printf "Copying Kotlin refdocs for $dir\n"
+  cp -r $dackkaNewDir/reference/kotlin/androidx/$dir $newDir/reference/kotlin/androidx/
+done
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Create (if needed) and sync g4 workspace \n"
+printf "=================================================================== \n"
+
+client="$(p4 g4d -f androidx-ref-docs-stage)"
+cd "$client"
+
+# Revert all local changes to prevent merge conflicts when syncing.
+# This is OK since we always want to start with a fresh CitC client
+g4 revert ...
+g4 sync
+
+# Temporarily skipping due to o/128063951. b/186655027 tracks adding this back.
+# TODO: check this logic when uncommenting
+#
+# Provision database if the target DB is not the default staging DB.
+# if [ "${FLAGS_db}" != "$defaultDb" ]; then
+#   printf "\n"
+#   printf "=================================================================== \n"
+#   printf "== Provision staging database ${FLAGS_db} \n"
+#   printf "=================================================================== \n"
+#
+#   /google/data/ro/projects/devsite/devsite2 provision --db="${FLAGS_db}"
+# fi
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Prep directories and copy refdocs to CitC client \n"
+printf "=================================================================== \n"
+
+cd third_party/devsite/android/en/reference
+
+cd kotlin/androidx
+ls | grep -v "package\|class\|book\|toc\|constraint\|test\|index" | xargs -I {} rm -rf {}
+cd ../../androidx
+ls | grep -v "package\|class\|book\|toc\|constraint\|test\|index" | xargs -I {} rm -rf {}
+cd ..
+
+cp -r $outDir/$newDir/reference/* .
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Create a changelist of pending refdoc changes \n"
+printf "=================================================================== \n"
+
+stagingLinkJava="go/dac-stage/reference/androidx/packages"
+stagingLinkKotlin="go/dac-stage/reference/kotlin/androidx/packages"
+
+# Add the db param to links if the target database is not the default staging DB.
+if [ "$FLAGS_db" != "$defaultdb" ]; then
+  stagingLinkJava+="?db=$FLAGS_db"
+  stagingLinkKotlin+="?db=$FLAGS_db"
+fi
+
+# Construct CL description
+clDesc="Androidx $FLAGS_dateStr Ref Docs
+
+DO NOT SUBMIT
+
+GO LIVE TIME: $FLAGS_dateStr @ 10:00 AM PST
+
+Staged:
+* Java: $stagingLinkJava
+* Kotlin: $stagingLinkKotlin
+
+All docs build id: $FLAGS_buildId
+
+The following scripts were used to create these docs:
+
+https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/referenceDocs/
+"
+
+# Grab the CL number generated from running `g4 change`.
+clNum=$(g4 change --desc "$clDesc" | tail -1 | awk '{print $2}')
+printf "View pending changes at http://cl/${clNum} \n"
+
+printf "\n"
+printf "=================================================================== \n"
+printf "== Stage changes \n"
+printf "=================================================================== \n"
+
+# 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"
+
+# Add the --db flag if the target database is not the default staging DB.
+if [ "$FLAGS_db" != "$defaultDb" ]; then
+  devsiteCmd+=" --db=$FLAGS_db"
+fi
+
+# Directories to stage
+devsiteCmd+=" androidx"
+devsiteCmd+=" kotlin/androidx"
+
+printf "Running devsite command:\n"
+printf "$devsiteCmd\n"
+
+$devsiteCmd
+
+# Print devsite command and CL link again in case they scrolled off the screen or
+# scrollback buffer
+printf "\n"
+printf "Ran devsite command:\n"
+printf "$devsiteCmd\n"
+printf "\n"
+printf "View pending changes at http://cl/${clNum} \n"
diff --git a/development/simplify-build-failure/impl/explode.py b/development/simplify-build-failure/impl/explode.py
index a21e9c2..55916c2 100755
--- a/development/simplify-build-failure/impl/explode.py
+++ b/development/simplify-build-failure/impl/explode.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 #
 #  Copyright (C) 2020 The Android Open Source Project
 #
@@ -46,10 +46,6 @@
     f.write(text)
     f.close()
 
-  def writeScript(self, path, text):
-    self.writeFile(path, text)
-    os.chmod(path, 0755)
-
 fileIo = FileIo()
 
 def countStartingSpaces(text):
diff --git a/development/update_compose_syntax.py b/development/update_compose_syntax.py
deleted file mode 100755
index 06f222f..0000000
--- a/development/update_compose_syntax.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env python3
-
-import os, fnmatch, re, sys
-
-#### ####
-# WIP script to automagically update compose syntax.
-#### ####
-
-UI_DIRECTORY = os.path.normpath(os.path.join(os.path.dirname(__file__), "../ui"))
-
-NO_CHILDREN_REGEX = re.compile(r"<(?P<function>[^\/\s>]+) ?(?P<parameters>[^\/>]+?)?[\s]?[\/]>", re.MULTILINE)
-# Ensure no character at start to avoid matching generics like List<String>
-WITH_CHILDREN_START_REGEX = re.compile(r"(?<!\w)<(?P<function>[^\/\s>]+) ?(?P<parameters>[^\/>]+?)?[\s]?(?P<end>>|(?=<))", re.MULTILINE)
-WITH_CHILDREN_END_REGEX = re.compile(r"<\/[^\/\s>]+ ?>", re.MULTILINE)
-
-# Match separate parameters separated by whitespace, unless the whitespace is between
-# quotes or lambdas so we can group foo=" bar  " or foo={ bar() } - use DOTALL so we can match
-# multi-line lambdas like foo= {
-#                                 bar()
-#                              }
-PARAMETER_REGEX = re.compile(r'[^\s]+?["{].*?[}"]|[^\s]+', re.MULTILINE | re.DOTALL)
-
-# Match any spaces around named parameters or lambdas for removal later to aid
-# processing and ensure consistent spacing - we don't want to match whitespace
-# here as that will collapse lines.
-PARAMETER_SYMBOL_REGEX = re.compile(r"[ ]*([{}=])[ ]*", re.MULTILINE)
-
-def parameter_replace(match, replacement):
-  total_match = match.group(0)
-  return total_match.replace(match.group("parameter"), replacement)
-
-def no_child_replace(match):
-  function = match.group("function")
-  parameters = match.group("parameters")
-  converted_function = function + "("
-  if parameters:
-    # Replace " { " with "{" etc
-    parameters = re.sub(PARAMETER_SYMBOL_REGEX, r"\1", parameters)
-    split_parameters = re.findall(PARAMETER_REGEX, parameters)
-    # Add a comma to every parameter except for the last
-    for i in range(len(split_parameters)):
-      # This character breaks python regex, so if we match it in a comment just ignore it
-      if split_parameters[i] == "*":
-        continue
-      replacement = split_parameters[i]
-      # Needs to be a named parameter for now
-      if "=" not in replacement:
-        replacement += "=" + replacement
-      if i != len(split_parameters) - 1:
-        replacement += ","
-      # Now lets clean up spacing around braces and equals
-      replacement = replacement.replace("{", "{ ")
-      replacement = replacement.replace("}", " }")
-      replacement = replacement.replace("=", " = ")
-      # Find anything without characters on either side (we want to match 'text', and not 'textStyle')
-      # Then replace only the part without the spaces inside the overall match and return
-      parameters = re.sub(r"(^|\s)(?P<parameter>" + re.escape(split_parameters[i]) + r")($|\s)", lambda m: parameter_replace(m, replacement), parameters)
-    converted_function = converted_function + parameters
-  converted_function = converted_function + ")"
-  return converted_function
-
-def with_child_replace(match):
-  # Hack to ignore generic parameters: 'fun <T>'
-  if match.group(0) == "<T>":
-    return match.group(0)
-  # If we haven't eaten a '>', it means we matched another '<' on the way, so return without
-  # converting the inside
-  if not match.group("end"):
-    # Return with the inside unconverted
-    return match.group("function") + "(" + match.group("parameters")
-  converted_function = no_child_replace(match)
-  # Remove brackets if there are no parameters
-  if converted_function.endswith("()"):
-    converted_function = converted_function[:-2]
-  converted_function += " {"
-  return converted_function
-
-def main(args):
-  if len(args) != 2:
-    print("Usage: ./development/update_compose_syntax.py <relative/path/to/dir>")
-    print("Note: the path starts from the ui folder, i.e dir should look like 'material/integration-tests/material-demos'")
-    sys.exit(1)
-  directory = args[1]
-  directory = os.path.join(UI_DIRECTORY, directory)
-  for path, dirs, files in os.walk(directory):
-    for filename in fnmatch.filter(files, "*.kt"):
-      filepath = os.path.join(path, filename)
-      with open(filepath) as f:
-        content = f.read()
-        # Replace lambdas arrows for now as they mess with tag finding
-        content = content.replace("->", "~~~~")
-        content = re.sub(NO_CHILDREN_REGEX, no_child_replace, content)
-        content = re.sub(WITH_CHILDREN_START_REGEX, with_child_replace, content)
-        content = re.sub(WITH_CHILDREN_END_REGEX, "}", content)
-        # Hack because if we have nested tags and lambdas inside the parameter we can't fix the closing tag nicely
-        content = content.replace("}>", "}) {")
-        # Revert change to lambda arrows
-        content = content.replace("~~~~", "->")
-        with open(filepath, "w") as f:
-          f.write(content)
-
-main(sys.argv)
diff --git a/development/validateRefactor.sh b/development/validateRefactor.sh
index 76d4f002..677be5a 100755
--- a/development/validateRefactor.sh
+++ b/development/validateRefactor.sh
@@ -106,11 +106,6 @@
   done
 }
 function doBuild() {
-  # build compose
-  echoAndDo ./ui/gradlew -p ui createArchive generateDocs --no-daemon --rerun-tasks --offline
-  archiveName="top-of-tree-m2repository-all-0.zip"
-  echoAndDo unzip -q "${tempOutPath}/dist/ui/${archiveName}" -d "${tempOutPath}/dist/ui/${archiveName}.unzipped"
-
   # build androidx
   echoAndDo ./gradlew createArchive generateDocs --no-daemon --rerun-tasks --offline
   archiveName="top-of-tree-m2repository-all-0.zip"
diff --git a/development/versionCatalogMigrate.sh b/development/versionCatalogMigrate.sh
new file mode 100755
index 0000000..f7079fd
--- /dev/null
+++ b/development/versionCatalogMigrate.sh
@@ -0,0 +1,107 @@
+#!/bin/bash
+
+find -iname build.gradle | xargs sed -i "s/AGP_LATEST/libs.androidGradlePlugin/"
+find -iname build.gradle | xargs sed -i "s/LINT_CORE/libs.androidLint/"
+find -iname build.gradle | xargs sed -i "s/LINT_API_LATEST/libs.androidLintApi/"
+find -iname build.gradle | xargs sed -i "s/LINT_TESTS/libs.androidLintTests/"
+find -iname build.gradle | xargs sed -i "s/AUTO_COMMON/libs.autoCommon/"
+find -iname build.gradle | xargs sed -i "s/AUTO_SERVICE_ANNOTATIONS/libs.autoServiceAnnotations/"
+find -iname build.gradle | xargs sed -i "s/AUTO_SERVICE_PROCESSOR/libs.autoService/"
+find -iname build.gradle | xargs sed -i "s/AUTO_VALUE_ANNOTATIONS/libs.autoValueAnnotations/"
+find -iname build.gradle | xargs sed -i "s/AUTO_VALUE_PARCEL/libs.autoValueParcel/"
+find -iname build.gradle | xargs sed -i "s/AUTO_VALUE/libs.autoValue/"
+find -iname build.gradle | xargs sed -i "s/ANTLR/libs.antlr4/"
+find -iname build.gradle | xargs sed -i "s/APACHE_COMMONS_CODEC/libs.apacheCommonsCodec/"
+find -iname build.gradle | xargs sed -i "s/ASSERTJ/libs.assertj/"
+find -iname build.gradle | xargs sed -i "s/CHECKER_FRAMEWORK/libs.checkerframework/"
+find -iname build.gradle | xargs sed -i "s/DAGGER/libs.dagger/"
+find -iname build.gradle | xargs sed -i "s/DEXMAKER_MOCKITO/libs.dexmakerMockito/"
+find -iname build.gradle | xargs sed -i "s/DEXMAKER_MOCKITO_INLINE/libs.dexmakerMockitoInline/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_CONTRIB/libs.espressoContrib/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_CORE/libs.espressoCore/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_IDLING_NET/libs.espressoIdlingNet/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_IDLING_RESOURCE/libs.espressoIdlingResource/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_INTENTS/libs.espressoIntents/"
+find -iname build.gradle | xargs sed -i "s/ESPRESSO_WEB/libs.espressoWeb/"
+find -iname build.gradle | xargs sed -i "s/FINDBUGS/libs.findbugs/"
+find -iname build.gradle | xargs sed -i "s/FIREBASE_APPINDEXING/libs.firebaseAppindexing/"
+find -iname build.gradle | xargs sed -i "s/HILT_ANDROID/libs.hiltAndroid/"
+find -iname build.gradle | xargs sed -i "s/HILT_ANDROID_TESTING/libs.hiltAndroidTesting/"
+find -iname build.gradle | xargs sed -i "s/HILT_ANDROID_GRADLE_PLUGIN/libs.hiltAndroidGradlePlugin/"
+find -iname build.gradle | xargs sed -i "s/HILT_COMPILER/libs.hiltCompiler/"
+find -iname build.gradle | xargs sed -i "s/HILT_CORE/libs.hiltCore/"
+find -iname build.gradle | xargs sed -i "s/INTELLIJ_ANNOTATIONS/libs.intellijAnnotations/"
+find -iname build.gradle | xargs sed -i "s/JAVAPOET/libs.javapoet/"
+find -iname build.gradle | xargs sed -i "s/JSQLPARSER/libs.jsqlparser/"
+find -iname build.gradle | xargs sed -i "s/JSR250/libs.jsr250/"
+find -iname build.gradle | xargs sed -i "s/GCM_NETWORK_MANAGER/libs.gcmNetworkManager/"
+find -iname build.gradle | xargs sed -i "s/GOOGLE_COMPILE_TESTING/libs.googleCompileTesting/"
+find -iname build.gradle | xargs sed -i "s/GSON/libs.gson/"
+find -iname build.gradle | xargs sed -i "s/GUAVA_ANDROID/libs.guavaAndroid/"
+find -iname build.gradle | xargs sed -i "s/GUAVA_LISTENABLE_FUTURE/libs.guavaListenableFuture/"
+find -iname build.gradle | xargs sed -i "s/GRADLE_INCAP_HELPER_PROCESSOR/libs.gradleIncapHelperProcessor/"
+find -iname build.gradle | xargs sed -i "s/GRADLE_INCAP_HELPER/libs.gradleIncapHelper/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_ANNOTATION_PROCESSING_EMBEDDABLE/libs.kotlinAnnotationProcessingEmbeddable/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COMPILER_EMBEDDABLE/libs.kotlinCompilerEmbeddable/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COMPILE_TESTING_KSP/libs.kotlinCompileTestingKsp/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COMPILE_TESTING/libs.kotlinCompileTesting/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_ANDROID/libs.kotlinCoroutinesAndroid/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_SWING/libs.kotlinCoroutinesSwing/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_CORE/libs.kotlinCoroutinesCore/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_GUAVA/libs.kotlinCoroutinesGuava/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_TEST/libs.kotlinCoroutinesTest/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_RX2/libs.kotlinCoroutinesRx2/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COROUTINES_RX3/libs.kotlinCoroutinesRx3/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_COMPILER_DAEMON_EMBEDDABLE/libs.kotlinDaemonEmbeddable/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_METADATA_JVM/libs.kotlinMetadataJvm/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_STDLIB_COMMON/libs.kotlinStdlibCommon/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_STDLIB_JDK8/libs.kotlinStdlibJdk8/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_STDLIB_JS/libs.kotlinStdlibJs/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_STDLIB/libs.kotlinStdlib/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST_ANNOTATIONS_COMMON/libs.kotlinTestAnnotationsCommon/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST_COMMON/libs.kotlinTestCommon/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST_JUNIT/libs.kotlinTestJunit/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST_JS/libs.kotlinTestJs/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_TEST/libs.kotlinTest/"
+find -iname build.gradle | xargs sed -i "s/KOTLIN_REFLECT/libs.kotlinReflect/"
+find -iname build.gradle | xargs sed -i "s/KOTLINPOET_METADATA/libs.kotlinPoetMetadata/"
+find -iname build.gradle | xargs sed -i "s/KOTLINPOET_METADATA_SPECS/libs.kotlinPoetMetadataSpecs/"
+find -iname build.gradle | xargs sed -i "s/KOTLINPOET_CLASSINSPECTOR_ELEMENTS/libs.kotlinPoetClassinspector/"
+find -iname build.gradle | xargs sed -i "s/KOTLINPOET/libs.kotlinPoet/"
+find -iname build.gradle | xargs sed -i "s/LEAKCANARY_INSTRUMENTATION/libs.leakcanaryInstrumentation/"
+find -iname build.gradle | xargs sed -i "s/LEAKCANARY/libs.leakcanary/"
+find -iname build.gradle | xargs sed -i "s/MATERIAL/libs.material/"
+find -iname build.gradle | xargs sed -i "s/MOCKITO_CORE/libs.mockitoCore/"
+find -iname build.gradle | xargs sed -i "s/MOCKITO_ANDROID/libs.mockitoAndroid/"
+find -iname build.gradle | xargs sed -i "s/MOCKITO_KOTLIN/libs.mockitoKotlin/"
+find -iname build.gradle | xargs sed -i "s/MULTIDEX/libs.multidex/"
+find -iname build.gradle | xargs sed -i "s/NULLAWAY/libs.nullaway/"
+find -iname build.gradle | xargs sed -i "s/OKHTTP_MOCKWEBSERVER/libs.okhttpMockwebserver/"
+find -iname build.gradle | xargs sed -i "s/PLAY_CORE/libs.playCore/"
+find -iname build.gradle | xargs sed -i "s/PLAY_SERVICES_BASE/libs.playServicesBase/"
+find -iname build.gradle | xargs sed -i "s/PROTOBUF_COMPILER/libs.protobufCompiler/"
+find -iname build.gradle | xargs sed -i "s/PROTOBUF_LITE/libs.protobufLite/"
+find -iname build.gradle | xargs sed -i "s/PROTOBUF/libs.protobuf/"
+find -iname build.gradle | xargs sed -i "s/REACTIVE_STREAMS/libs.reactiveStreams/"
+find -iname build.gradle | xargs sed -i "s/RETROFIT/libs.retrofit/"
+find -iname build.gradle | xargs sed -i "s/ROBOLECTRIC/libs.robolectric/"
+find -iname build.gradle | xargs sed -i "s/RX_JAVA3/libs.rxjava3/"
+find -iname build.gradle | xargs sed -i "s/RX_JAVA/libs.rxjava2/"
+find -iname build.gradle | xargs sed -i "s/SQLDELIGHT_ANDROID/libs.sqldelightAndroid/"
+find -iname build.gradle | xargs sed -i "s/SQLDELIGHT_COROUTINES_EXT/libs.sqldelightCoroutinesExt/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_CORE/libs.testCore/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_EXT_JUNIT/libs.testExtJunit/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_EXT_KTX/libs.testExtJunitKtx/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_EXT_TRUTH/libs.testExtTruth/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_MONITOR/libs.testMonitor/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_RULES/libs.testRules/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_RUNNER/libs.testRunner/"
+find -iname build.gradle | xargs sed -i "s/ANDROIDX_TEST_UIAUTOMATOR/libs.testUiautomator/"
+find -iname build.gradle | xargs sed -i "s/TRUTH/libs.truth/"
+find -iname build.gradle | xargs sed -i "s/VIEW_BINDING/libs.viewBinding/"
+find -iname build.gradle | xargs sed -i "s/WIRE_RUNTIME/libs.wireRuntime/"
+find -iname build.gradle | xargs sed -i "s/XERIAL/libs.xerial/"
+find -iname build.gradle | xargs sed -i "s/XPP3/libs.xpp3/"
+find -iname build.gradle | xargs sed -i "s/XMLPULL/libs.xmlpull/"
+find -iname build.gradle | xargs sed -i "s/JUNIT/libs.junit/"
+find -iname build.gradle | xargs sed -i "s/GUAVA/libs.guava/"
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index fe9d8cb..b09e0a3 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -4,16 +4,18 @@
 }
 
 dependencies {
-    docs("androidx.activity:activity:1.3.0-alpha06")
-    docs("androidx.activity:activity-compose:1.3.0-alpha06")
-    samples("androidx.activity:activity-compose-samples:1.3.0-alpha06")
-    docs("androidx.activity:activity-ktx:1.3.0-alpha06")
+    docs("androidx.activity:activity:1.3.0-alpha07")
+    docs("androidx.activity:activity-compose:1.3.0-alpha07")
+    samples("androidx.activity:activity-compose-samples:1.3.0-alpha07")
+    docs("androidx.activity:activity-ktx:1.3.0-alpha07")
     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-alpha01")
     docs("androidx.annotation:annotation-experimental:1.1.0")
     docs("androidx.appcompat:appcompat:1.3.0-rc02")
     docs("androidx.appcompat:appcompat-resources:1.3.0-rc02")
+    docs("androidx.appsearch:appsearch:1.0.0-alpha01")
+    docs("androidx.appsearch:appsearch-local-storage:1.0.0-alpha01")
     docs("androidx.arch.core:core-common:2.1.0")
     docs("androidx.arch.core:core-runtime:2.1.0")
     docs("androidx.arch.core:core-testing:2.1.0")
@@ -25,76 +27,77 @@
     docs("androidx.biometric:biometric-ktx:1.2.0-alpha03")
     samples("androidx.biometric:biometric-ktx-samples:1.2.0-alpha03")
     docs("androidx.browser:browser:1.3.0")
-    docs("androidx.camera:camera-camera2:1.1.0-alpha03")
-    docs("androidx.camera:camera-core:1.1.0-alpha03")
-    docs("androidx.camera:camera-extensions:1.0.0-alpha23")
+    docs("androidx.camera:camera-camera2:1.1.0-alpha04")
+    docs("androidx.camera:camera-core:1.1.0-alpha04")
+    docs("androidx.camera:camera-extensions:1.0.0-alpha24")
     stubs(fileTree(dir: "../camera/camera-extensions-stub", include: ["camera-extensions-stub.jar"]))
-    docs("androidx.camera:camera-lifecycle:1.1.0-alpha03")
-    docs("androidx.camera:camera-view:1.0.0-alpha23")
-    docs("androidx.car.app:app:1.0.0-rc01")
+    docs("androidx.camera:camera-lifecycle:1.1.0-alpha04")
+    docs("androidx.camera:camera-view:1.0.0-alpha24")
+    docs("androidx.car.app:app:1.0.0")
     docs("androidx.car.app:app-testing:1.0.0-alpha01")
     docs("androidx.cardview:cardview:1.0.0")
     docs("androidx.collection:collection:1.2.0-alpha01")
     docs("androidx.collection:collection-ktx:1.2.0-alpha01")
-    docs("androidx.compose.animation:animation:1.0.0-beta04")
-    docs("androidx.compose.animation:animation-core:1.0.0-beta04")
-    samples("androidx.compose.animation:animation-samples:1.0.0-beta04")
-    samples("androidx.compose.animation:animation-core-samples:1.0.0-beta04")
-    docs("androidx.compose.foundation:foundation:1.0.0-beta04")
-    docs("androidx.compose.foundation:foundation-layout:1.0.0-beta04")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.0.0-beta04")
-    samples("androidx.compose.foundation:foundation-samples:1.0.0-beta04")
-    docs("androidx.compose.material:material:1.0.0-beta04")
-    docs("androidx.compose.material:material-icons-core:1.0.0-beta04")
-    samples("androidx.compose.material:material-icons-core-samples:1.0.0-beta04")
-    docs("androidx.compose.material:material-icons-extended:1.0.0-beta04")
-    docs("androidx.compose.material:material-ripple:1.0.0-beta04")
-    samples("androidx.compose.material:material-samples:1.0.0-beta04")
-    docs("androidx.compose.runtime:runtime:1.0.0-beta04")
-    docs("androidx.compose.runtime:runtime-livedata:1.0.0-beta04")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.0.0-beta04")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.0.0-beta04")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.0.0-beta04")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.0.0-beta04")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.0.0-beta04")
-    docs("androidx.compose.runtime:runtime-saveable:1.0.0-beta04")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.0.0-beta04")
-    samples("androidx.compose.runtime:runtime-samples:1.0.0-beta04")
-    docs("androidx.compose.ui:ui:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-geometry:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-graphics:1.0.0-beta04")
-    samples("androidx.compose.ui:ui-graphics-samples:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-test:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-test-junit4:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-text:1.0.0-beta04")
-    samples("androidx.compose.ui:ui-text-samples:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-tooling:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-tooling-data:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-unit:1.0.0-beta04")
-    samples("androidx.compose.ui:ui-unit-samples:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-util:1.0.0-beta04")
-    docs("androidx.compose.ui:ui-viewbinding:1.0.0-beta04")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.0.0-beta04")
-    samples("androidx.compose.ui:ui-samples:1.0.0-beta04")
+    docs("androidx.compose.animation:animation:1.0.0-beta06")
+    docs("androidx.compose.animation:animation-core:1.0.0-beta06")
+    samples("androidx.compose.animation:animation-samples:1.0.0-beta06")
+    samples("androidx.compose.animation:animation-core-samples:1.0.0-beta06")
+    docs("androidx.compose.foundation:foundation:1.0.0-beta06")
+    docs("androidx.compose.foundation:foundation-layout:1.0.0-beta06")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.0.0-beta06")
+    samples("androidx.compose.foundation:foundation-samples:1.0.0-beta06")
+    docs("androidx.compose.material:material:1.0.0-beta06")
+    docs("androidx.compose.material:material-icons-core:1.0.0-beta06")
+    samples("androidx.compose.material:material-icons-core-samples:1.0.0-beta06")
+    docs("androidx.compose.material:material-icons-extended:1.0.0-beta06")
+    docs("androidx.compose.material:material-ripple:1.0.0-beta06")
+    samples("androidx.compose.material:material-samples:1.0.0-beta06")
+    docs("androidx.compose.runtime:runtime:1.0.0-beta06")
+    docs("androidx.compose.runtime:runtime-livedata:1.0.0-beta06")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.0.0-beta06")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.0.0-beta06")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.0.0-beta06")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.0.0-beta06")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.0.0-beta06")
+    docs("androidx.compose.runtime:runtime-saveable:1.0.0-beta06")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.0.0-beta06")
+    samples("androidx.compose.runtime:runtime-samples:1.0.0-beta06")
+    docs("androidx.compose.ui:ui:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-geometry:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-graphics:1.0.0-beta06")
+    samples("androidx.compose.ui:ui-graphics-samples:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-test:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-test-junit4:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-text:1.0.0-beta06")
+    samples("androidx.compose.ui:ui-text-samples:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-tooling:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-tooling-data:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-unit:1.0.0-beta06")
+    samples("androidx.compose.ui:ui-unit-samples:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-util:1.0.0-beta06")
+    docs("androidx.compose.ui:ui-viewbinding:1.0.0-beta06")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.0.0-beta06")
+    samples("androidx.compose.ui:ui-samples:1.0.0-beta06")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     docs("androidx.contentpager:contentpager:1.0.0")
     docs("androidx.coordinatorlayout:coordinatorlayout:1.1.0")
+    docs("androidx.core:core-google-shortcuts:1.0.0-alpha02")
     docs("androidx.core:core-role:1.1.0-alpha02")
     docs("androidx.core:core-animation:1.0.0-alpha02")
     docs("androidx.core:core-animation-testing:1.0.0-alpha02")
-    docs("androidx.core:core:1.6.0-alpha01")
-    docs("androidx.core:core-ktx:1.6.0-alpha01")
+    docs("androidx.core:core:1.6.0-alpha02")
+    docs("androidx.core:core-ktx:1.6.0-alpha02")
     docs("androidx.cursoradapter:cursoradapter:1.0.0")
     docs("androidx.customview:customview:1.1.0")
-    docs("androidx.datastore:datastore:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-core:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-preferences:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-preferences-core:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-preferences-rxjava2:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-preferences-rxjava3:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-rxjava2:1.0.0-alpha08")
-    docs("androidx.datastore:datastore-rxjava3:1.0.0-alpha08")
+    docs("androidx.datastore:datastore:1.0.0-beta01")
+    docs("androidx.datastore:datastore-core:1.0.0-beta01")
+    docs("androidx.datastore:datastore-preferences:1.0.0-beta01")
+    docs("androidx.datastore:datastore-preferences-core:1.0.0-beta01")
+    docs("androidx.datastore:datastore-preferences-rxjava2:1.0.0-beta01")
+    docs("androidx.datastore:datastore-preferences-rxjava3:1.0.0-beta01")
+    docs("androidx.datastore:datastore-rxjava2:1.0.0-beta01")
+    docs("androidx.datastore:datastore-rxjava3:1.0.0-beta01")
     docs("androidx.documentfile:documentfile:1.0.0")
     docs("androidx.drawerlayout:drawerlayout:1.1.1")
     docs("androidx.dynamicanimation:dynamicanimation:1.1.0-alpha02")
@@ -105,9 +108,9 @@
     docs("androidx.enterprise:enterprise-feedback:1.1.0")
     docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
     docs("androidx.exifinterface:exifinterface:1.3.2")
-    docs("androidx.fragment:fragment:1.3.2")
-    docs("androidx.fragment:fragment-ktx:1.3.2")
-    docs("androidx.fragment:fragment-testing:1.3.2")
+    docs("androidx.fragment:fragment:1.3.4")
+    docs("androidx.fragment:fragment-ktx:1.3.4")
+    docs("androidx.fragment:fragment-testing:1.3.4")
     docs("androidx.gridlayout:gridlayout:1.0.0")
     docs("androidx.heifwriter:heifwriter:1.1.0-alpha01")
     docs("androidx.hilt:hilt-common:1.0.0-beta01")
@@ -140,10 +143,10 @@
     docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0-alpha01")
     docs("androidx.loader:loader:1.1.0")
     docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0-alpha01")
-    docs("androidx.media2:media2-common:1.1.2")
-    docs("androidx.media2:media2-player:1.1.2")
-    docs("androidx.media2:media2-session:1.1.2")
-    docs("androidx.media2:media2-widget:1.1.2")
+    docs("androidx.media2:media2-common:1.2.0-alpha01")
+    docs("androidx.media2:media2-player:1.2.0-alpha01")
+    docs("androidx.media2:media2-session:1.2.0-alpha01")
+    docs("androidx.media2:media2-widget:1.2.0-alpha01")
     docs("androidx.media:media:1.3.0")
     docs("androidx.mediarouter:mediarouter:1.2.2")
     docs("androidx.navigation:navigation-common:2.3.5")
@@ -159,17 +162,17 @@
     docs("androidx.navigation:navigation-testing:2.3.5")
     docs("androidx.navigation:navigation-ui:2.3.5")
     docs("androidx.navigation:navigation-ui-ktx:2.3.5")
-    docs("androidx.paging:paging-common:3.0.0-beta03")
-    docs("androidx.paging:paging-common-ktx:3.0.0-beta03")
+    docs("androidx.paging:paging-common:3.0.0")
+    docs("androidx.paging:paging-common-ktx:3.0.0")
     docs("androidx.paging:paging-compose:1.0.0-alpha08")
     samples("androidx.paging:paging-compose-samples:3.0.0-alpha08")
-    docs("androidx.paging:paging-guava:3.0.0-beta03")
-    docs("androidx.paging:paging-runtime:3.0.0-beta03")
-    docs("androidx.paging:paging-runtime-ktx:3.0.0-beta03")
-    docs("androidx.paging:paging-rxjava2:3.0.0-beta03")
-    docs("androidx.paging:paging-rxjava2-ktx:3.0.0-beta03")
-    docs("androidx.paging:paging-rxjava3:3.0.0-beta03")
-    samples("androidx.paging:paging-samples:3.0.0-beta01")
+    docs("androidx.paging:paging-guava:3.0.0")
+    docs("androidx.paging:paging-runtime:3.0.0")
+    docs("androidx.paging:paging-runtime-ktx:3.0.0")
+    docs("androidx.paging:paging-rxjava2:3.0.0")
+    docs("androidx.paging:paging-rxjava2-ktx:3.0.0")
+    docs("androidx.paging:paging-rxjava3:3.0.0")
+    samples("androidx.paging:paging-samples:3.0.0")
     docs("androidx.palette:palette:1.0.0")
     docs("androidx.palette:palette-ktx:1.0.0")
     docs("androidx.percentlayout:percentlayout:1.0.1")
@@ -181,14 +184,14 @@
     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-alpha01")
-    docs("androidx.room:room-common:2.3.0-rc01")
-    docs("androidx.room:room-guava:2.3.0-rc01")
-    docs("androidx.room:room-ktx:2.3.0-rc01")
-    docs("androidx.room:room-migration:2.3.0-rc01")
-    docs("androidx.room:room-runtime:2.3.0-rc01")
-    docs("androidx.room:room-rxjava2:2.3.0-rc01")
-    docs("androidx.room:room-rxjava3:2.3.0-rc01")
-    docs("androidx.room:room-testing:2.3.0-rc01")
+    docs("androidx.room:room-common:2.4.0-alpha02")
+    docs("androidx.room:room-guava:2.4.0-alpha02")
+    docs("androidx.room:room-ktx:2.4.0-alpha02")
+    docs("androidx.room:room-migration:2.4.0-alpha02")
+    docs("androidx.room:room-runtime:2.4.0-alpha02")
+    docs("androidx.room:room-rxjava2:2.4.0-alpha02")
+    docs("androidx.room:room-rxjava3:2.4.0-alpha02")
+    docs("androidx.room:room-testing:2.4.0-alpha02")
     docs("androidx.savedstate:savedstate:1.1.0")
     docs("androidx.savedstate:savedstate-ktx:1.1.0")
     docs("androidx.security:security-crypto:1.1.0-alpha03")
@@ -199,18 +202,18 @@
     docs("androidx.slice:slice-builders-ktx:1.0.0-alpha08")
     docs("androidx.slice:slice-core:1.1.0-alpha02")
     docs("androidx.slice:slice-view:1.1.0-alpha02")
-    docs("androidx.slidingpanelayout:slidingpanelayout:1.2.0-alpha01")
+    docs("androidx.slidingpanelayout:slidingpanelayout:1.2.0-alpha02")
     docs("androidx.sqlite:sqlite:2.1.0")
     docs("androidx.sqlite:sqlite-framework:2.1.0")
     docs("androidx.sqlite:sqlite-ktx:2.1.0")
-    docs("androidx.startup:startup-runtime:1.1.0-alpha01")
+    docs("androidx.startup:startup-runtime:1.1.0-alpha02")
     docs("androidx.legacy:legacy-support-core-utils:1.0.0")
     docs("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01")
     docs("androidx.textclassifier:textclassifier:1.0.0-alpha03")
     docs("androidx.tracing:tracing:1.0.0")
     docs("androidx.tracing:tracing-ktx:1.0.0")
-    docs("androidx.transition:transition:1.4.0")
-    docs("androidx.transition:transition-ktx:1.4.0")
+    docs("androidx.transition:transition:1.4.1")
+    docs("androidx.transition:transition-ktx:1.4.1")
     docs("androidx.tvprovider:tvprovider:1.1.0-alpha01")
     docs("androidx.vectordrawable:vectordrawable:1.2.0-alpha02")
     docs("androidx.vectordrawable:vectordrawable-animated:1.2.0-alpha01")
@@ -218,36 +221,36 @@
     docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
     docs("androidx.viewpager2:viewpager2:1.1.0-alpha01")
     docs("androidx.viewpager:viewpager:1.0.0")
-    docs("androidx.wear.tiles:tiles:1.0.0-alpha02")
-    docs("androidx.wear.tiles:tiles-renderer:1.0.0-alpha02")
+    docs("androidx.wear.tiles:tiles:1.0.0-alpha04")
+    docs("androidx.wear.tiles:tiles-renderer:1.0.0-alpha04")
     docs("androidx.wear:wear:1.2.0-alpha07")
     stubs(fileTree(dir: "../wear/wear_stubs/", include: ["com.google.android.wearable-stubs.jar"]))
-    docs("androidx.wear:wear-complications-data:1.0.0-alpha11")
-    docs("androidx.wear:wear-complications-provider:1.0.0-alpha11")
+    docs("androidx.wear:wear-complications-data:1.0.0-alpha12")
+    docs("androidx.wear:wear-complications-provider:1.0.0-alpha12")
     docs("androidx.wear:wear-ongoing:1.0.0-alpha03")
     docs("androidx.wear:wear-phone-interactions:1.0.0-alpha04")
     docs("androidx.wear:wear-remote-interactions:1.0.0-alpha03")
-    docs("androidx.wear:wear-watchface:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-client:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-client-guava:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-complications-rendering:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-data:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-editor:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-editor-guava:1.0.0-alpha11")
-    docs("androidx.wear:wear-watchface-guava:1.0.0-alpha11")
+    docs("androidx.wear:wear-watchface:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-client:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-client-guava:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-complications-rendering:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-data:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-editor:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-editor-guava:1.0.0-alpha12")
+    docs("androidx.wear:wear-watchface-guava:1.0.0-alpha12")
     samples("androidx.wear:wear-watchface-samples:1.0.0-alpha02")
-    docs("androidx.wear:wear-watchface-style:1.0.0-alpha11")
+    docs("androidx.wear:wear-watchface-style:1.0.0-alpha12")
     docs("androidx.wear:wear-input:1.1.0-alpha01")
     docs("androidx.wear:wear-input-testing:1.1.0-alpha01")
     docs("androidx.webkit:webkit:1.4.0")
     docs("androidx.window:window:1.0.0-alpha05")
     stubs(fileTree(dir: "../window/stubs/", include: ["window-sidecar-release-0.1.0-alpha01.aar"]))
     stubs(project(":window:window-extensions"))
-    docs("androidx.work:work-gcm:2.7.0-alpha01")
-    docs("androidx.work:work-multiprocess:2.7.0-alpha01")
-    docs("androidx.work:work-runtime:2.7.0-alpha01")
-    docs("androidx.work:work-runtime-ktx:2.7.0-alpha01")
-    docs("androidx.work:work-rxjava2:2.7.0-alpha01")
-    docs("androidx.work:work-rxjava3:2.7.0-alpha01")
-    docs("androidx.work:work-testing:2.7.0-alpha01")
+    docs("androidx.work:work-gcm:2.7.0-alpha03")
+    docs("androidx.work:work-multiprocess:2.7.0-alpha03")
+    docs("androidx.work:work-runtime:2.7.0-alpha03")
+    docs("androidx.work:work-runtime-ktx:2.7.0-alpha03")
+    docs("androidx.work:work-rxjava2:2.7.0-alpha03")
+    docs("androidx.work:work-rxjava3:2.7.0-alpha03")
+    docs("androidx.work:work-testing:2.7.0-alpha03")
 }
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index b6bc1b2..21ac59b 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -41,6 +41,7 @@
     docs(project(":camera:camera-view"))
     docs(project(":car:app:app"))
     docs(project(":car:app:app-activity"))
+    docs(project(":car:app:app-property"))
     docs(project(":car:app:app-testing"))
     docs(project(":cardview:cardview"))
     docs(project(":collection:collection"))
@@ -117,6 +118,10 @@
     docs(project(":emoji"))
     docs(project(":emoji-appcompat"))
     docs(project(":emoji-bundled"))
+    docs(project(":emoji2:emoji2"))
+    docs(project(":emoji2:emoji2-bundled"))
+    docs(project(":emoji2:emoji2-views"))
+    docs(project(":emoji2:emoji2-views-helper"))
     docs(project(":enterprise-feedback"))
     docs(project(":enterprise-feedback-testing"))
     docs(project(":exifinterface:exifinterface"))
@@ -124,6 +129,7 @@
     docs(project(":fragment:fragment-ktx"))
     docs(project(":fragment:fragment-testing"))
     docs(project(":gridlayout:gridlayout"))
+    docs(project(":health:health-services-client"))
     docs(project(":heifwriter:heifwriter"))
     docs(project(":hilt:hilt-common"))
     docs(project(":hilt:hilt-navigation"))
@@ -193,6 +199,7 @@
     docs(project(":preference:preference"))
     docs(project(":preference:preference-ktx"))
     docs(project(":print:print"))
+    docs(project(":profileinstaller:profileinstaller"))
     docs(project(":recommendation:recommendation"))
     docs(project(":recyclerview:recyclerview"))
     docs(project(":recyclerview:recyclerview-selection"))
@@ -242,6 +249,8 @@
     docs(project(":wear:wear-complications-data"))
     docs(project(":wear:wear-complications-provider"))
     samples(project(":wear:wear-complications-provider-samples"))
+    docs(project(":wear:compose:compose-foundation"))
+    docs(project(":wear:compose:compose-material"))
     docs(project(":wear:wear-input"))
     docs(project(":wear:wear-input-testing"))
     docs(project(":wear:wear-ongoing"))
diff --git a/docs/api_guidelines.md b/docs/api_guidelines.md
index f04be61..e2662a5 100644
--- a/docs/api_guidelines.md
+++ b/docs/api_guidelines.md
@@ -41,9 +41,8 @@
 *   `-core` for a low-level artifact that *may* contain public APIs but is
     primarily intended for use by other libraries in the group
 *   `-ktx` for an Kotlin artifact that exposes idiomatic Kotlin APIs as an
-    extension to a Java-only library
-*   `-java8` for a Java 8 artifact that exposes idiomatic Java 8 APIs as an
-    extension to a Java 7 library
+    extension to a Java-only library (see
+    [additional -ktx guidance](#module-ktx))
 *   `-<third-party>` for an artifact that integrates an optional third-party API
     surface, e.g. `-proto` or `-rxjava2`. Note that a major version is included
     in the sub-feature name for third-party API surfaces where the major version
@@ -177,6 +176,25 @@
 external developers and should be considered a last-resort when backporting
 behavior is not feasible.
 
+### Kotlin extension `-ktx` libraries {#module-ktx}
+
+New libraries should prefer Kotlin sources with built-in Java compatibility via
+`@JvmName` and other affordances of the Kotlin language; however, existing Java
+sourced libraries may benefit from extending their API surface with
+Kotlin-friendly APIs in a `-ktx` library.
+
+A Kotlin extension library **may only** provide extensions for a single base
+library's API surface and its name **must** match the base library exactly. For
+example, `work:work-ktx` may only provide extensions for APIs exposed by
+`work:work`.
+
+Additionally, an extension library **must** specify an `api`-type dependency on
+the base library and **must** be versioned and released identically to the base
+library.
+
+Kotlin extension libraries _should not_ expose new functionality; they should
+only provide Kotlin-friendly versions of existing Java-facing functionality.
+
 ## Platform compatibility API patterns {#platform-compatibility-apis}
 
 NOTE For all library APIs that wrap or provide parity with platform APIs,
@@ -1767,7 +1785,7 @@
 
 For library groups with strongly related samples that want to share code.
 
-Gradle project name: `:foo-library:samples`
+Gradle project name: `:foo-library:foo-library-samples`
 
 ```
 foo-library/
@@ -1780,10 +1798,18 @@
 
 For library groups with complex, relatively independent sub-libraries
 
-Gradle project name: `:foo-library:foo-module:samples`
+Gradle project name: `:foo-library:foo-module:foo-module-samples`
 
 ```
 foo-library/
   foo-module/
     samples/
 ```
+
+**Samples module configuration**
+
+Samples modules are published to GMaven so that they are available to Android
+Studio, which displays code in @Sample annotations as hover-over pop-ups.
+
+To achieve this, samples modules must declare the same MavenGroup and `publish`
+as the library(s) they are samples for.
diff --git a/docs/benchmarking.md b/docs/benchmarking.md
index 5fc0276..a4fabb1 100644
--- a/docs/benchmarking.md
+++ b/docs/benchmarking.md
@@ -133,11 +133,11 @@
 
 #### Device
 
-Get an API 28+ device (Or a rooted API 27 device). The rest of this section is
-about *why* those constraints exist, skip if not interested.
+Get an API 29+ device. The rest of this section is about *why* those constraints
+exist, skip if not interested.
 
 Simpleperf has restrictions about where it can be used - Jetpack Benchmark will
-only support API 28+ for now, due to
+only support API 29+ for now, due to
 [platform/simpleperf constraints](https://android.googlesource.com/platform/system/extras/+/master/simpleperf/doc/android_application_profiling.md#prepare-an-android-application)
 (see last subsection titled "If you want to profile Java code"). Summary is:
 
@@ -148,9 +148,13 @@
 -   26 (O): Requires compiled Java code, and wrapper script. We haven't
     investigated support.
 
--   27 (P): Can profile all Java code, but requires `userdebug`/rooted device
+-   27 (O.1): Can profile all Java code, but requires `userdebug`/rooted device
 
--   \>=28 (Q): Can profile all Java code, requires profileable (or
+-   28 (P): Can profile all Java code, requires debuggable (or
+    `userdebug`/rooted device, but this appears to not be supported by scripts
+    currently)
+
+-   \>=29 (Q): Can profile all Java code, requires profileable or debuggable (or
     `userdebug`/rooted device)
 
 We aren't planning to support profiling debuggable APK builds, since they're
diff --git a/docs/branching.md b/docs/branching.md
index 074a54c..dd23ec5 100644
--- a/docs/branching.md
+++ b/docs/branching.md
@@ -1,15 +1,20 @@
-# AndroidX Branch Workflow
+# Branch workflow
 
 [TOC]
 
-## Single Development Branch [androidx-main]
+## Single Development Branch [`aosp/androidx-main`]
 
-All feature development occurs in the public AndroidX master dev branch of the
+All feature development occurs in the public main development branch of the
 Android Open Source Project: `androidx-main`. This branch serves as the central
-location and source of truth for all AndroidX library source code. All alpha and
-beta version development, builds, and releases will be done ONLY in this branch.
+location and source of truth for all AndroidX library source code. All `alpha`
+and `beta` version work -- development, builds, and releases -- will be done
+ONLY in this branch.
 
-## Release Branches [androidx-\<feature\>-release]
+## Release Branches [`aosp/androidx-\<feature\>-release`]
+
+Release branches are used for stabilitization of a library and support of a
+previous stable release. With one development branch, this is how AndroidX
+provides support for the previous `rc` or stable version.
 
 When a library updates to rc (release-candidate) or stable, that library version
 will be snapped over to that library’s release branch. If that release branch
@@ -19,21 +24,13 @@
 
 Release branches have the following properties:
 
-*   A release branch will contain rc or stable versions of libraries.
-*   Release branches are internal branches.
-*   Release branches can **ONLY** be changed through
-    cherry-picks
-*   Bug-fixes and updates to that rc or stable version will need to be
-    individually cherry-picked
-*   No alpha or beta versions will exist in a release branch.
-*   Toolchain and other library wide changes to androidx-main will be synced to
-    each release branch.
+*   A release branch will contain `rc` or `stable` versions of libraries
+*   Release branches can **ONLY** be changed through cherry-picks
+*   Bug fixes and updates to `rc` or stable versions must be cherry-picked
+*   No `alpha` or `beta` versions will exist in a release branch.
+*   Toolchain and other library wide changes to `androidx-main` will be synced
+    to each release branch.
 *   Release branches will have the naming format
     `androidx-<feature-name>-release`
 *   Release branches will be re-snapped from `androidx-main` for each new minor
-    version release (for example, releasing 2.2.0-rc01 after 2.1.0)
-
-## Platform Developement and AndroidX [androidx-platform-dev]
-
-Platform specific development is done using our INTERNAL platform development
-branch `androidx-platform-dev`.
+    version release (for example, releasing `2.2.0-rc01` after `2.1.0`)
diff --git a/docs/kdoc_guidelines.md b/docs/kdoc_guidelines.md
index ef33b04..72f91eb 100644
--- a/docs/kdoc_guidelines.md
+++ b/docs/kdoc_guidelines.md
@@ -179,6 +179,27 @@
  */
 ```
 
+### Don't use angle brackets for `@param`
+
+Instead of:
+
+```kotlin {.bad}
+/**
+ * @param <T> my cool param
+ */
+```
+
+Do this:
+
+```kotlin {.good}
+/**
+ * * @param T my cool param
+ */
+```
+
+This syntax is correct is Javadoc, but angle brackets aren't used in KDoc
+([@param reference guide](https://kotlinlang.org/docs/kotlin-doc.html#param-name)).
+
 ## Javadoc - KDoc differences
 
 Some tags are shared between Javadoc and KDoc, such as `@param`, but there are
diff --git a/docs/onboarding.md b/docs/onboarding.md
index 5715972..f8dcafa 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -13,9 +13,10 @@
 
 ## Workstation setup {#setup}
 
-You will need to install the `repo` tool, which is used for Git branch and
-commit management. If you want to learn more about `repo`, see the
-[Repo Command Reference](https://source.android.com/setup/develop/repo).
+You will need to install the
+[`repo`](https://source.android.com/setup/develop#repo) tool, which is used for
+Git branch and commit management. If you want to learn more about `repo`, see
+the [Repo Command Reference](https://source.android.com/setup/develop/repo).
 
 ### Linux and MacOS {#setup-linux-mac}
 
@@ -210,7 +211,10 @@
 ```
 
 The `--cbr` switch automatically picks the current repo branch for upload. The
-`-t` switch sets the Gerrit topic to the branch name, e.g. `my-branch-name`.
+`-t` switch sets the Gerrit topic to the branch name, e.g. `my-branch-name`. You
+can refer to the
+[Android documentation](https://source.android.com/setup/create/coding-tasks#workflow)
+for a high level overview of this basic workflow.
 
 NOTE If you encounter issues with `repo upload`, consider running upload with
 trace enabled, e.g. `GIT_DAPPER_TRACE=1 repo --trace upload . --cbr -y`. These
diff --git a/docs/policies.md b/docs/policies.md
index 35b7aaa..ffe656f 100644
--- a/docs/policies.md
+++ b/docs/policies.md
@@ -15,7 +15,7 @@
 Libraries developed in AndroidX follow a consistent project naming and directory
 structure.
 
-Library groups should organize their modules into directories and module names
+Library groups should organize their projects into directories and project names
 (in brackets) as:
 
 ```
@@ -39,6 +39,27 @@
     testapp/ [navigation:integration-tests:testapp]
 ```
 
+### Project creator script {#project-creator}
+
+Note: The terms _project_, _module_, and _library_ are often used
+interchangeably within AndroidX, with project being the technical term used by
+Gradle to describe a build target, e.g. a library that maps to a single AAR.
+
+New projects can be created using our
+[project creation script](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/project-creator/?q=project-creator&ss=androidx%2Fplatform%2Fframeworks%2Fsupport)
+available in our repo.
+
+It will create a new project with the proper structure and configuration based
+on your project needs!
+
+To use it:
+
+```sh
+cd ~/androidx-main/framework/support && \
+cd development/project-creator && \
+./create_project.py androidx.foo foo-bar
+```
+
 ## Terminology {#terminology}
 
 **Artifact**
@@ -91,24 +112,6 @@
 }
 ```
 
-#### Finalizing for release {#finalizing-for-release}
-
-When the artifact is ready for release, its versioned API file should be
-finalized to ensure that the subsequent versioned release conforms to the
-versioning policies.
-
-```
-./gradlew <module>:finalizeApi
-```
-
-This will prevent any subsequent changes to the API surface until the artifact
-version is updated. To update the artifact version and allow changes within the
-semantic versioning contract, simply update the version string in the artifact's
-`build.gradle` (see [Workflow](#workflow) introduction).
-
-To avoid breaking the development workflow, we recommend that API finalization
-and version string updates be submitted as a single CL.
-
 ## Dependencies {#dependencies}
 
 Artifacts may depend on other artifacts within AndroidX as well as sanctioned
@@ -130,6 +133,9 @@
 only have implementation-type dependencies, your artifact may carry either the
 `alpha` or `beta` suffix.
 
+Note: This does not apply to test dependencies: suffixes of test dependencies do
+_not_ carry over to your artifact.
+
 #### Pinned versions {#pinned-versions}
 
 To avoid issues with dependency versioning, consider pinning your artifact's
diff --git a/docs/versioning.md b/docs/versioning.md
index 27efde7..3c1424a 100644
--- a/docs/versioning.md
+++ b/docs/versioning.md
@@ -239,13 +239,16 @@
 granted for new features, non-trivial API changes, significant refactorings, or
 any changes likely to introduce additional functional instability. Requests for
 exceptions **must** be accompanied by a justification explaining why the change
-cannot be made in a future minor version.
+cannot be made in a future minor version. This policy does not apply to
+additions of `@Experimental` APIs or changes to `@Experimental` APIs.
 
 #### Checklist for moving to `beta01` {#beta-checklist}
 
 *   API surface
     *   Entire API surface has been reviewed by API Council
     *   All APIs from alpha undergoing deprecate/remove cycle must be removed
+        *   The final removal of a `@Deprecated` API must occur in alpha, not in
+            Beta.
 *   Testing
     *   All public APIs are tested
     *   All pre-submit and post-submit tests are enabled (e.g. all suppressions
@@ -264,10 +267,13 @@
 *   API surface
     *   May not add, remove, or change APIs unless granted an exception by API
         Council following the beta API change exception request process
-    *   Must go through the full `@Deprecate` and hard-removal cycle in separate
-        `beta` releases for any exception-approved API removals or changes
-    *   May not remove `@Experimental` from experimental APIs, see previous item
-        regarding new APIs
+        *   Must go through the full `@Deprecate` and hard-removal cycle in
+            separate `beta` releases for any exception-approved API removals or
+            changes
+    *   May not remove `@Experimental` from experimental APIs, as this would
+        amount to an API addition
+    *   **May** add new `@Experimental` APIs and change existing `@Experimental`
+        APIs
 
 ### RC {#rc}
 
diff --git a/documentfile/documentfile/lint-baseline.xml b/documentfile/documentfile/lint-baseline.xml
index 3b93b3f..9e66853 100644
--- a/documentfile/documentfile/lint-baseline.xml
+++ b/documentfile/documentfile/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.documentfile.provider.DocumentFile is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.documentfile.provider.DocumentFile is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            String documentId = DocumentsContract.getTreeDocumentId(treeUri);"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.documentfile.provider.DocumentFile is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.documentfile.provider.DocumentFile is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (DocumentsContract.isDocumentUri(context, treeUri)) {"
         errorLine2="                                  ~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.documentfile.provider.DocumentFile is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.documentfile.provider.DocumentFile is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                documentId = DocumentsContract.getDocumentId(treeUri);"
         errorLine2="                                               ~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.documentfile.provider.DocumentFile is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.documentfile.provider.DocumentFile is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    DocumentsContract.buildDocumentUriUsingTree(treeUri,"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.documentfile.provider.DocumentFile is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.documentfile.provider.DocumentFile is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return DocumentsContract.isDocumentUri(context, uri);"
         errorLine2="                                     ~~~~~~~~~~~~~">
         <location
diff --git a/drawerlayout/drawerlayout/lint-baseline.xml b/drawerlayout/drawerlayout/lint-baseline.xml
index c7543a5..f0017c4 100644
--- a/drawerlayout/drawerlayout/lint-baseline.xml
+++ b/drawerlayout/drawerlayout/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.drawerlayout.widget.DrawerLayout is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.drawerlayout.widget.DrawerLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            WindowInsets rootInsets = getRootWindowInsets();"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/dynamic-animation/dynamic-animation-ktx/build.gradle b/dynamic-animation/dynamic-animation-ktx/build.gradle
index 9533a73..e3ec3f0 100644
--- a/dynamic-animation/dynamic-animation-ktx/build.gradle
+++ b/dynamic-animation/dynamic-animation-ktx/build.gradle
@@ -35,9 +35,9 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
 
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/dynamic-animation/dynamic-animation-ktx/lint-baseline.xml b/dynamic-animation/dynamic-animation-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/dynamic-animation/dynamic-animation-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/dynamic-animation/dynamic-animation/build.gradle b/dynamic-animation/dynamic-animation/build.gradle
index 6ad3e31..13e952f 100644
--- a/dynamic-animation/dynamic-animation/build.gradle
+++ b/dynamic-animation/dynamic-animation/build.gradle
@@ -16,9 +16,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/dynamic-animation/dynamic-animation/lint-baseline.xml b/dynamic-animation/dynamic-animation/lint-baseline.xml
index f08ff22..d329927 100644
--- a/dynamic-animation/dynamic-animation/lint-baseline.xml
+++ b/dynamic-animation/dynamic-animation/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                property.setValue(object, value);"
         errorLine2="                         ~~~~~~~~">
         <location
diff --git a/emoji/appcompat/lint-baseline.xml b/emoji/appcompat/lint-baseline.xml
index 2aa1902..2384ba1 100644
--- a/emoji/appcompat/lint-baseline.xml
+++ b/emoji/appcompat/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/emoji/bundled/lint-baseline.xml b/emoji/bundled/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/emoji/bundled/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 2c54100..94334a7 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -31,9 +31,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
 }
 
diff --git a/emoji/core/lint-baseline.xml b/emoji/core/lint-baseline.xml
index 436a88b..efa2cfb 100644
--- a/emoji/core/lint-baseline.xml
+++ b/emoji/core/lint-baseline.xml
@@ -1,5 +1,115 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.EmojiButton is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiButton.java"
+            line="58"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.EmojiEditText is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiEditText.java"
+            line="65"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.EmojiExtractEditText is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiExtractEditText.java"
+            line="74"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.EmojiExtractTextLayout is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiExtractTextLayout.java"
+            line="99"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.emoji.widget.EmojiInputFilter.InitCallbackImpl is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (textView != null &amp;&amp; textView.isAttachedToWindow()) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiInputFilter.java"
+            line="110"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.emoji.text.EmojiProcessor.CodepointIndexFinder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!Character.isSurrogate(c)) {"
+        errorLine2="                               ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiProcessor.java"
+            line="702"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.emoji.text.EmojiProcessor.CodepointIndexFinder is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                if (!Character.isSurrogate(c)) {"
+        errorLine2="                               ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/text/EmojiProcessor.java"
+            line="759"
+            column="32"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.EmojiTextView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTextView.java"
+            line="58"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.emoji.widget.EmojiTextWatcher.InitCallbackImpl is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (editText != null &amp;&amp; editText.isAttachedToWindow()) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/EmojiTextWatcher.java"
+            line="121"
+            column="46"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.emoji.widget.ExtractButtonCompat is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
+        errorLine2="        ~~~~~">
+        <location
+            file="src/main/java/androidx/emoji/widget/ExtractButtonCompat.java"
+            line="53"
+            column="9"/>
+    </issue>
 
     <issue
         id="PrivateConstructorForUtilityClass"
@@ -13,116 +123,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.EmojiButton is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiButton.java"
-            line="58"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.EmojiEditText is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiEditText.java"
-            line="65"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.EmojiExtractEditText is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiExtractEditText.java"
-            line="74"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.EmojiExtractTextLayout is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiExtractTextLayout.java"
-            line="99"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji.widget.EmojiInputFilter.InitCallbackImpl is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            if (textView != null &amp;&amp; textView.isAttachedToWindow()) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiInputFilter.java"
-            line="110"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji.text.EmojiProcessor.CodepointIndexFinder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                if (!Character.isSurrogate(c)) {"
-        errorLine2="                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/text/EmojiProcessor.java"
-            line="702"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji.text.EmojiProcessor.CodepointIndexFinder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                if (!Character.isSurrogate(c)) {"
-        errorLine2="                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/text/EmojiProcessor.java"
-            line="759"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.EmojiTextView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiTextView.java"
-            line="58"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji.widget.EmojiTextWatcher.InitCallbackImpl is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            if (editText != null &amp;&amp; editText.isAttachedToWindow()) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/EmojiTextWatcher.java"
-            line="121"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji.widget.ExtractButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji/widget/ExtractButtonCompat.java"
-            line="53"
-            column="9"/>
-    </issue>
-
-    <issue
         id="KotlinPropertyAccess"
         message="The getter return type (`int`) and setter parameter type (`boolean`) getter and setter methods for property `hasGlyph` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public int getHasGlyph() {"
diff --git a/emoji2/emoji2-benchmark/build.gradle b/emoji2/emoji2-benchmark/build.gradle
index c3dd0be..a4709c1 100644
--- a/emoji2/emoji2-benchmark/build.gradle
+++ b/emoji2/emoji2-benchmark/build.gradle
@@ -34,8 +34,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils-runtime')
     androidTestImplementation(KOTLIN_STDLIB)
 }
@@ -43,7 +43,7 @@
 androidx {
     name = "Emoji2 Benchmarks"
     publish = Publish.NONE
-    mavenGroup = LibraryGroups.NAVIGATION
-    inceptionYear = "2018"
-    description = "Navigation Benchmarks"
+    mavenGroup = LibraryGroups.EMOJI2
+    inceptionYear = "2021"
+    description = "Emoji2 Benchmarks"
 }
diff --git a/emoji2/emoji2-benchmark/lint-baseline.xml b/emoji2/emoji2-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/emoji2/emoji2-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/emoji2/emoji2-bundled/api/current.txt b/emoji2/emoji2-bundled/api/current.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/public_plus_experimental_current.txt b/emoji2/emoji2-bundled/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/public_plus_experimental_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/res-current.txt b/emoji2/emoji2-bundled/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/res-current.txt
diff --git a/emoji2/emoji2-bundled/api/restricted_current.txt b/emoji2/emoji2-bundled/api/restricted_current.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/restricted_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/build.gradle b/emoji2/emoji2-bundled/build.gradle
index 0978cbf..7d6c347 100644
--- a/emoji2/emoji2-bundled/build.gradle
+++ b/emoji2/emoji2-bundled/build.gradle
@@ -39,9 +39,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils-runtime')
 
     // view tests that use font are in this module as well; for licensing reasons
@@ -50,11 +50,12 @@
 
 androidx {
     name = "Android Emoji2 Compat"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.EMOJI2
     mavenGroup = LibraryGroups.EMOJI2
     inceptionYear = "2017"
-    description = "Library bundled with assets to enable emoji compatibility in Kitkat and newer devices to avoid the empty emoji characters."
+    description = "Library bundled with assets to enable emoji compatibility in Kitkat and newer " +
+            "devices to avoid the empty emoji characters."
 
     license {
         name = "SIL Open Font License, Version 1.1"
diff --git a/emoji2/emoji2-views-helper/AndroidManifest.xml b/emoji2/emoji2-views-helper/AndroidManifest.xml
index 2f4b90a5..0b6d86b 100644
--- a/emoji2/emoji2-views-helper/AndroidManifest.xml
+++ b/emoji2/emoji2-views-helper/AndroidManifest.xml
@@ -13,4 +13,4 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<manifest package="androidx.emoji2.helpers"/>
+<manifest package="androidx.emoji2.viewshelper"/>
diff --git a/emoji2/emoji2-views-helper/api/current.txt b/emoji2/emoji2-views-helper/api/current.txt
new file mode 100644
index 0000000..5d6333f
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/current.txt
@@ -0,0 +1,24 @@
+// Signature format: 4.0
+package androidx.emoji2.viewshelper {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/public_plus_experimental_current.txt b/emoji2/emoji2-views-helper/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..5d6333f
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/public_plus_experimental_current.txt
@@ -0,0 +1,24 @@
+// Signature format: 4.0
+package androidx.emoji2.viewshelper {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/res-current.txt b/emoji2/emoji2-views-helper/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/res-current.txt
diff --git a/emoji2/emoji2-views-helper/api/restricted_current.txt b/emoji2/emoji2-views-helper/api/restricted_current.txt
new file mode 100644
index 0000000..5d6333f
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/restricted_current.txt
@@ -0,0 +1,24 @@
+// Signature format: 4.0
+package androidx.emoji2.viewshelper {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    method public android.text.method.KeyListener getKeyListener(android.text.method.KeyListener);
+    method public int getMaxEmojiCount();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/build.gradle b/emoji2/emoji2-views-helper/build.gradle
index 9f5aef9..038f23c 100644
--- a/emoji2/emoji2-views-helper/build.gradle
+++ b/emoji2/emoji2-views-helper/build.gradle
@@ -20,9 +20,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils-runtime')
 }
 
@@ -37,7 +37,7 @@
 
 androidx {
     name = "Android Emoji2 Compat view helpers"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.EMOJI2
     mavenGroup = LibraryGroups.EMOJI2
     inceptionYear = "2017"
diff --git a/emoji2/emoji2-views-helper/src/androidTest/AndroidManifest.xml b/emoji2/emoji2-views-helper/src/androidTest/AndroidManifest.xml
index 6c30771..f28fe19 100644
--- a/emoji2/emoji2-views-helper/src/androidTest/AndroidManifest.xml
+++ b/emoji2/emoji2-views-helper/src/androidTest/AndroidManifest.xml
@@ -13,7 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<manifest package="androidx.emoji2.helpers">
+<manifest package="androidx.emoji2.viewshelper">
 
     <application>
     </application>
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperPre19Test.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperPre19Test.java
deleted file mode 100644
index c431518..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperPre19Test.java
+++ /dev/null
@@ -1,99 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.text.TextWatcher;
-import android.text.method.KeyListener;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.widget.EditText;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(maxSdkVersion = 18)
-public class EmojiEditTextHelperPre19Test {
-    EmojiEditTextHelper mEmojiEditTextHelper;
-
-    @Before
-    public void setup() {
-        final EditText editText = mock(EditText.class);
-        mEmojiEditTextHelper = new EmojiEditTextHelper(editText);
-        verifyNoMoreInteractions(editText);
-    }
-
-    @Test
-    public void testGetKeyListener_returnsSameKeyListener() {
-        final KeyListener param = mock(KeyListener.class);
-        final KeyListener keyListener = mEmojiEditTextHelper.getKeyListener(
-                param);
-
-        assertSame(param, keyListener);
-    }
-
-    @LargeTest
-    @Test
-    public void testGetOnCreateInputConnection_returnsSameInputConnection() {
-        final InputConnection param = mock(InputConnection.class);
-        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
-                new EditorInfo());
-
-        assertSame(param, inputConnection);
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_withNullAttrs_returnsSameInputConnection() {
-        final InputConnection param = mock(InputConnection.class);
-        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
-                null);
-
-        assertSame(param, inputConnection);
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
-        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
-                new EditorInfo());
-        assertNull(inputConnection);
-    }
-
-    @Test
-    public void testDoesNotAttachTextWatcher() {
-        final EditText editText = mock(EditText.class);
-
-        mEmojiEditTextHelper = new EmojiEditTextHelper(editText);
-
-        verify(editText, times(0)).addTextChangedListener(any(TextWatcher.class));
-    }
-
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperTest.java
deleted file mode 100644
index c054c74..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditTextHelperTest.java
+++ /dev/null
@@ -1,166 +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.emoji2.helpers;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.text.TextWatcher;
-import android.text.method.KeyListener;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.widget.EditText;
-
-import androidx.emoji2.text.EmojiCompat;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 19)
-public class EmojiEditTextHelperTest {
-    EmojiEditTextHelper mEmojiEditTextHelper;
-    EditText mEditText;
-
-    @Before
-    public void setup() {
-        EmojiCompat.reset(mock(EmojiCompat.class));
-        mEditText = new EditText(ApplicationProvider.getApplicationContext());
-        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testGetKeyListener_withNull_throwsException() {
-        mEmojiEditTextHelper.getKeyListener(null);
-    }
-
-    @Test
-    public void testGetKeyListener_returnsEmojiKeyListener() {
-        final KeyListener keyListener = mEmojiEditTextHelper.getKeyListener(
-                mock(KeyListener.class));
-
-        assertThat(keyListener, instanceOf(EmojiKeyListener.class));
-    }
-
-    @Test
-    public void testGetKeyListener_doesNotCreateNewInstance() {
-        KeyListener mockKeyListener = mock(KeyListener.class);
-        final KeyListener keyListener1 = mEmojiEditTextHelper.getKeyListener(mockKeyListener);
-        final KeyListener keyListener2 = mEmojiEditTextHelper.getKeyListener(keyListener1);
-        assertSame(keyListener1, keyListener2);
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_withNullAttrs_returnsInputConnection() {
-        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
-                mock(InputConnection.class), null);
-        assertNotNull(inputConnection);
-        assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
-        InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
-                new EditorInfo());
-        assertNull(inputConnection);
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_returnsEmojiInputConnection() {
-        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
-                mock(InputConnection.class), null);
-        assertNotNull(inputConnection);
-        assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
-    }
-
-    @Test
-    public void testGetOnCreateInputConnection_doesNotCreateNewInstance() {
-        final InputConnection ic1 = mEmojiEditTextHelper.onCreateInputConnection(
-                mock(InputConnection.class), null);
-        final InputConnection ic2 = mEmojiEditTextHelper.onCreateInputConnection(ic1, null);
-
-        assertSame(ic1, ic2);
-    }
-
-    @Test
-    public void testAttachesTextWatcher() {
-        mEditText = mock(EditText.class);
-        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
-
-        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
-                TextWatcher.class);
-
-        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
-        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
-    }
-
-    @Test
-    public void testSetMaxCount() {
-        mEditText = mock(EditText.class);
-        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
-        // capture TextWatcher
-        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
-                TextWatcher.class);
-        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
-        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
-        final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue();
-
-        mEmojiEditTextHelper.setMaxEmojiCount(1);
-
-        assertEquals(1, emojiTextWatcher.getMaxEmojiCount());
-    }
-
-    @Test
-    public void testSetEmojiReplaceStrategy() {
-        mEditText = mock(EditText.class);
-        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
-
-        //assert the default value
-        assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT,
-                mEmojiEditTextHelper.getEmojiReplaceStrategy());
-
-        // capture TextWatcher
-        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
-                TextWatcher.class);
-        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
-        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
-        final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue();
-
-        mEmojiEditTextHelper.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT);
-
-        assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
-                mEmojiEditTextHelper.getEmojiReplaceStrategy());
-
-        assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
-                emojiTextWatcher.getEmojiReplaceStrategy());
-    }
-
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditableFactoryTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditableFactoryTest.java
deleted file mode 100644
index 36200b0..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiEditableFactoryTest.java
+++ /dev/null
@@ -1,96 +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.emoji2.helpers;
-
-import static org.hamcrest.Matchers.arrayWithSize;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
-
-import android.annotation.SuppressLint;
-import android.text.Editable;
-import android.text.SpannableString;
-import android.text.Spanned;
-
-import androidx.emoji2.text.EmojiMetadata;
-import androidx.emoji2.text.EmojiSpan;
-import androidx.emoji2.text.SpannableBuilder;
-import androidx.emoji2.text.TypefaceEmojiSpan;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.MediumTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class EmojiEditableFactoryTest {
-
-    @Test
-    public void testGetInstance() {
-        final Editable.Factory instance = EmojiEditableFactory.getInstance();
-        assertNotNull(instance);
-
-        final Editable.Factory instance2 = EmojiEditableFactory.getInstance();
-        assertSame(instance, instance2);
-    }
-
-    @Test
-    public void testNewEditable_returnsEditable() {
-        final Editable editable = EmojiEditableFactory.getInstance().newEditable("abc");
-        assertNotNull(editable);
-        assertThat(editable, instanceOf(Editable.class));
-    }
-
-    @Test
-    public void testNewEditable_preservesCharSequenceData() {
-        final String string = "abc";
-        final SpannableString str = new SpannableString(string);
-        final EmojiMetadata metadata = mock(EmojiMetadata.class);
-        final EmojiSpan span = new TypefaceEmojiSpan(metadata);
-        str.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
-
-        final Editable editable = EmojiEditableFactory.getInstance().newEditable(str);
-        assertNotNull(editable);
-        assertEquals(string, editable.toString());
-        final EmojiSpan[] spans = editable.getSpans(0, 1, EmojiSpan.class);
-        assertThat(spans, arrayWithSize(1));
-        assertSame(spans[0], span);
-    }
-
-    @SuppressLint("PrivateApi")
-    @Test
-    public void testNewEditable_returnsEmojiSpannableIfWatcherClassExists() {
-        Class<?> clazz = null;
-        try {
-            String className = "android.text.DynamicLayout$ChangeWatcher";
-            clazz = Class.forName(className, false, getClass().getClassLoader());
-        } catch (Throwable t) {
-            // ignore
-        }
-
-        if (clazz == null) {
-            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
-            assertThat(editable, instanceOf(Editable.class));
-        } else {
-            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
-            assertThat(editable, instanceOf(SpannableBuilder.class));
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputConnectionTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputConnectionTest.java
deleted file mode 100644
index 9516a10..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputConnectionTest.java
+++ /dev/null
@@ -1,97 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.Build;
-import android.text.Editable;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.widget.TextView;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.platform.app.InstrumentationRegistry;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 19)
-public class EmojiInputConnectionTest {
-
-    private InputConnection mInputConnection;
-    private Editable mEditable;
-    private EmojiInputConnection mEmojiEmojiInputConnection;
-    private EmojiInputConnection.EmojiCompatDeleteHelper mEmojiCompatDeleteHelper;
-
-    @Before
-    public void setup() {
-        mEditable = mock(Editable.class);
-        mInputConnection = mock(InputConnection.class);
-        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        final TextView textView = spy(new TextView(context));
-        mEmojiCompatDeleteHelper = mock(EmojiInputConnection.EmojiCompatDeleteHelper.class);
-        doNothing().when(mEmojiCompatDeleteHelper).updateEditorInfoAttrs(any());
-
-        doReturn(mEditable).when(textView).getEditableText();
-        when(mInputConnection.deleteSurroundingText(anyInt(), anyInt())).thenReturn(false);
-        setupDeleteSurroundingText();
-
-        mEmojiEmojiInputConnection = new EmojiInputConnection(textView, mInputConnection,
-                new EditorInfo(), mEmojiCompatDeleteHelper);
-    }
-
-    private void setupDeleteSurroundingText() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            when(mInputConnection.deleteSurroundingTextInCodePoints(anyInt(), anyInt())).thenReturn(
-                    false);
-        }
-    }
-
-    @Test
-    public void whenEmojiCompatDelete_doesntDelete_inputConnectionIsCalled() {
-        when(mEmojiCompatDeleteHelper.handleDeleteSurroundingText(any(), any(), anyInt(),
-                anyInt(), anyBoolean())).thenReturn(false);
-        assertFalse(mEmojiEmojiInputConnection.deleteSurroundingText(1, 0));
-        verify(mInputConnection, times(1)).deleteSurroundingText(1, 0);
-    }
-
-    @Test
-    public void whenEmojiCompatDelete_doesDelete_inputConnectionIsNotCalled() {
-        when(mEmojiCompatDeleteHelper.handleDeleteSurroundingText(any(), any(), anyInt(),
-                anyInt(), anyBoolean())).thenReturn(true);
-        assertTrue(mEmojiEmojiInputConnection.deleteSurroundingText(1, 0));
-        verify(mInputConnection, never()).deleteSurroundingText(anyInt(), anyInt());
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputFilterTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputFilterTest.java
deleted file mode 100644
index 1b75ce9..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiInputFilterTest.java
+++ /dev/null
@@ -1,130 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.widget.TextView;
-
-import androidx.emoji2.text.EmojiCompat;
-import androidx.emoji2.util.EmojiMatcher;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class EmojiInputFilterTest {
-
-    private EmojiInputFilter mInputFilter;
-    private EmojiCompat mEmojiCompat;
-
-    @Before
-    public void setup() {
-        final TextView textView = mock(TextView.class);
-        mEmojiCompat = mock(EmojiCompat.class);
-        EmojiCompat.reset(mEmojiCompat);
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
-        mInputFilter = new EmojiInputFilter(textView);
-    }
-
-    @Test
-    public void testFilter_withNullSource() {
-        assertNull(mInputFilter.filter(null, 0, 1, null, 0, 1));
-        verify(mEmojiCompat, never()).process(any(CharSequence.class));
-        verify(mEmojiCompat, never()).process(any(CharSequence.class), anyInt(), anyInt());
-    }
-
-    @Test
-    public void testFilter_withString() {
-        final String testString = "abc";
-        when(mEmojiCompat.process(any(CharSequence.class), anyInt(), anyInt()))
-                .thenReturn(new SpannableString(testString));
-        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
-
-        assertNotNull(result);
-        assertTrue(result instanceof Spannable);
-        verify(mEmojiCompat, times(1)).process(
-                EmojiMatcher.sameCharSequence("a"), eq(0), eq(1));
-    }
-
-    @Test
-    public void testFilter_withSpannable() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.process(any(Spannable.class), anyInt(), anyInt())).thenReturn(testString);
-
-        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
-
-        assertNotNull(result);
-        assertSame(result, testString);
-        verify(mEmojiCompat, times(1)).process(
-                EmojiMatcher.sameCharSequence(testString.subSequence(0, 1)),
-                eq(0), eq(1));
-    }
-
-    @Test
-    public void testFilter_whenEmojiCompatLoading() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
-
-        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
-
-        assertNotNull(result);
-        assertSame(result, testString);
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
-        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testFilter_whenEmojiCompatLoadFailed() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
-
-        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
-
-        assertNotNull(result);
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
-        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testFilter_withManualLoadStrategy() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
-
-        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
-
-        assertNotNull(result);
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
-        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiKeyListenerTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiKeyListenerTest.java
deleted file mode 100644
index d1eea0e..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiKeyListenerTest.java
+++ /dev/null
@@ -1,82 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.same;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.text.Editable;
-import android.text.Selection;
-import android.text.method.KeyListener;
-import android.view.KeyEvent;
-import android.view.View;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 19)
-public class EmojiKeyListenerTest {
-
-    private KeyListener mKeyListener;
-    private Editable mEditable;
-    private EmojiKeyListener mEmojiKeyListener;
-    private EmojiKeyListener.EmojiCompatHandleKeyDownHelper mEmojiCompatKeydownHelper;
-    private KeyEvent mKeyEvent;
-
-    @Before
-    public void setup() {
-        mKeyListener = mock(KeyListener.class);
-        mEditable = mock(Editable.class);
-        mEmojiCompatKeydownHelper = mock(EmojiKeyListener.EmojiCompatHandleKeyDownHelper.class);
-        mEmojiKeyListener = new EmojiKeyListener(mKeyListener, mEmojiCompatKeydownHelper);
-        mKeyEvent = mock(KeyEvent.class);
-        when(mKeyListener.onKeyDown(any(View.class), any(Editable.class), anyInt(),
-                any(KeyEvent.class))).thenReturn(false);
-    }
-
-    @Test
-    public void whenEmojiCompat_handlesKeyDown_doesntCallKeyListener() {
-        Selection.setSelection(mEditable, 0);
-        when(mEmojiCompatKeydownHelper.handleKeyDown(any(), anyInt(), any())).thenReturn(true);
-        assertTrue(mEmojiKeyListener.onKeyDown(null, mEditable, KeyEvent.KEYCODE_0, mKeyEvent));
-        verifyNoMoreInteractions(mKeyListener);
-    }
-
-    @Test
-    public void whenEmojiCompatDoesnt_handleKeyDown_callsListener() {
-        Selection.setSelection(mEditable, 0);
-        when(mEmojiCompatKeydownHelper.handleKeyDown(any(), anyInt(), any())).thenReturn(false);
-        assertFalse(mEmojiKeyListener.onKeyDown(null, mEditable, KeyEvent.KEYCODE_0, mKeyEvent));
-        verify(mKeyListener, times(1)).onKeyDown(eq(null), same(mEditable),
-                eq(KeyEvent.KEYCODE_0), same(mKeyEvent));
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperPre19Test.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperPre19Test.java
deleted file mode 100644
index 6a9932a..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperPre19Test.java
+++ /dev/null
@@ -1,87 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.mockito.Mockito.mock;
-
-import android.text.InputFilter;
-import android.text.method.TransformationMethod;
-import android.widget.TextView;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(maxSdkVersion = 18)
-public class EmojiTextViewHelperPre19Test {
-    EmojiTextViewHelper mTextViewHelper;
-    TextView mTextView;
-
-    @Before
-    public void setup() {
-        mTextView = new TextView(ApplicationProvider.getApplicationContext());
-        mTextViewHelper = new EmojiTextViewHelper(mTextView);
-    }
-
-    @Test
-    public void testUpdateTransformationMethod_doesNotUpdateTransformationMethod() {
-        final TransformationMethod tm = mock(TransformationMethod.class);
-        mTextView.setTransformationMethod(tm);
-
-        mTextViewHelper.updateTransformationMethod();
-
-        assertSame(tm, mTextView.getTransformationMethod());
-    }
-
-    @Test
-    public void testGetFilters_returnsSameFilters() {
-        final InputFilter existingFilter = mock(InputFilter.class);
-        final InputFilter[] filters = new InputFilter[]{existingFilter};
-
-        final InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
-
-        assertSame(filters, newFilters);
-    }
-
-    @Test
-    public void testGetTransformationMethod_returnSameTransformationMethod() {
-        assertNull(mTextViewHelper.wrapTransformationMethod(null));
-
-        final TransformationMethod tm = mock(TransformationMethod.class);
-        assertSame(tm, mTextViewHelper.wrapTransformationMethod(tm));
-    }
-
-    @Test
-    public void testSetAllCaps_doesNotUpdateTransformationMethod() {
-        final TransformationMethod tm = mock(TransformationMethod.class);
-        mTextView.setTransformationMethod(tm);
-        mTextViewHelper.setAllCaps(true);
-        assertSame(tm, mTextView.getTransformationMethod());
-
-        mTextViewHelper.setAllCaps(false);
-        assertSame(tm, mTextView.getTransformationMethod());
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperTest.java
deleted file mode 100644
index 51b71cf..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextViewHelperTest.java
+++ /dev/null
@@ -1,166 +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.emoji2.helpers;
-
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
-
-import android.text.InputFilter;
-import android.text.method.PasswordTransformationMethod;
-import android.text.method.TransformationMethod;
-import android.widget.TextView;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SdkSuppress;
-import androidx.test.filters.SmallTest;
-
-import org.hamcrest.CoreMatchers;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Arrays;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 19)
-public class EmojiTextViewHelperTest {
-    EmojiTextViewHelper mTextViewHelper;
-    TextView mTextView;
-
-    @Before
-    public void setup() {
-        mTextView = new TextView(ApplicationProvider.getApplicationContext());
-        mTextViewHelper = new EmojiTextViewHelper(mTextView);
-    }
-
-    @Test
-    public void testUpdateTransformationMethod() {
-        mTextView.setTransformationMethod(mock(TransformationMethod.class));
-
-        mTextViewHelper.updateTransformationMethod();
-
-        assertThat(mTextView.getTransformationMethod(),
-                instanceOf(EmojiTransformationMethod.class));
-    }
-
-    @Test
-    public void testUpdateTransformationMethod_doesNotUpdateForPasswordTransformation() {
-        final PasswordTransformationMethod transformationMethod =
-                new PasswordTransformationMethod();
-        mTextView.setTransformationMethod(transformationMethod);
-
-        mTextViewHelper.updateTransformationMethod();
-
-        assertEquals(transformationMethod, mTextView.getTransformationMethod());
-    }
-
-    @Test
-    public void testUpdateTransformationMethod_doesNotCreateNewInstance() {
-        mTextView.setTransformationMethod(mock(TransformationMethod.class));
-
-        mTextViewHelper.updateTransformationMethod();
-        final TransformationMethod tm = mTextView.getTransformationMethod();
-        assertThat(tm, instanceOf(EmojiTransformationMethod.class));
-
-        // call the function again
-        mTextViewHelper.updateTransformationMethod();
-        assertSame(tm, mTextView.getTransformationMethod());
-    }
-
-    @Test
-    public void testGetFilters() {
-        final InputFilter existingFilter = mock(InputFilter.class);
-        final InputFilter[] filters = new InputFilter[]{existingFilter};
-
-        final InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
-
-        assertEquals(2, newFilters.length);
-        assertThat(Arrays.asList(newFilters), hasItem(existingFilter));
-        assertNotNull(findEmojiInputFilter(newFilters));
-    }
-
-    @Test
-    public void testGetFilters_doesNotAddSecondInstance() {
-        final InputFilter existingFilter = mock(InputFilter.class);
-        final InputFilter[] filters = new InputFilter[]{existingFilter};
-
-        InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
-        EmojiInputFilter emojiInputFilter = findEmojiInputFilter(newFilters);
-        assertNotNull(emojiInputFilter);
-
-        // run it again with the updated filters and see that it does not add new filter
-        newFilters = mTextViewHelper.getFilters(newFilters);
-
-        assertEquals(2, newFilters.length);
-        assertThat(Arrays.asList(newFilters), hasItem(existingFilter));
-        assertThat(Arrays.asList(newFilters), CoreMatchers.hasItem(emojiInputFilter));
-    }
-
-    private EmojiInputFilter findEmojiInputFilter(final InputFilter[] filters) {
-        for (int i = 0; i < filters.length; i++) {
-            if (filters[i] instanceof EmojiInputFilter) {
-                return (EmojiInputFilter) filters[i];
-            }
-        }
-        return null;
-    }
-
-    @Test
-    public void testWrapTransformationMethod() {
-        assertThat(mTextViewHelper.wrapTransformationMethod(null),
-                instanceOf(EmojiTransformationMethod.class));
-    }
-
-    @Test
-    public void testWrapTransformationMethod_doesNotCreateNewInstance() {
-        final TransformationMethod tm1 = mTextViewHelper.wrapTransformationMethod(null);
-        final TransformationMethod tm2 = mTextViewHelper.wrapTransformationMethod(tm1);
-        assertSame(tm1, tm2);
-    }
-
-    @Test
-    public void testSetAllCaps_withTrueSetsTransformationMethod() {
-        mTextView.setTransformationMethod(mock(TransformationMethod.class));
-        mTextViewHelper.setAllCaps(true);
-        assertThat(mTextView.getTransformationMethod(),
-                instanceOf(EmojiTransformationMethod.class));
-    }
-
-    @Test
-    public void testSetAllCaps_withFalseDoesNotSetTransformationMethod() {
-        mTextView.setTransformationMethod(null);
-        mTextViewHelper.setAllCaps(false);
-        assertNull(mTextView.getTransformationMethod());
-    }
-
-    @Test
-    public void testSetAllCaps_withPasswordTransformationDoesNotSetTransformationMethod() {
-        final PasswordTransformationMethod transformationMethod =
-                new PasswordTransformationMethod();
-        mTextView.setTransformationMethod(transformationMethod);
-        mTextViewHelper.setAllCaps(true);
-        assertSame(transformationMethod, mTextView.getTransformationMethod());
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextWatcherTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextWatcherTest.java
deleted file mode 100644
index e1cf65e..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTextWatcherTest.java
+++ /dev/null
@@ -1,126 +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.emoji2.helpers;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.widget.EditText;
-
-import androidx.emoji2.text.EmojiCompat;
-import androidx.emoji2.util.EmojiMatcher;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class EmojiTextWatcherTest {
-
-    private EmojiTextWatcher mTextWatcher;
-    private EmojiCompat mEmojiCompat;
-
-    @Before
-    public void setup() {
-        final EditText editText = mock(EditText.class);
-        mEmojiCompat = mock(EmojiCompat.class);
-        EmojiCompat.reset(mEmojiCompat);
-        mTextWatcher = new EmojiTextWatcher(editText);
-    }
-
-    @Test
-    public void testOnTextChanged_callsProcess() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(1)).process(
-                EmojiMatcher.sameCharSequence(testString),
-                eq(0),
-                eq(1),
-                eq(Integer.MAX_VALUE),
-                anyInt());
-        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testOnTextChanged_whenEmojiCompatLoading() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
-                anyInt());
-        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testOnTextChanged_whenEmojiCompatLoadFailed() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
-                anyInt());
-        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testSetEmojiReplaceStrategy() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
-
-        assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT, mTextWatcher.getEmojiReplaceStrategy());
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
-                eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT));
-
-        mTextWatcher.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_ALL);
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
-                eq(EmojiCompat.REPLACE_STRATEGY_ALL));
-    }
-
-    @Test
-    public void testFilter_withManualLoadStrategy() {
-        final Spannable testString = new SpannableString("abc");
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
-
-        mTextWatcher.onTextChanged(testString, 0, 0, 1);
-
-        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
-        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTransformationMethodTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTransformationMethodTest.java
deleted file mode 100644
index 6b0c88b..0000000
--- a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/helpers/EmojiTransformationMethodTest.java
+++ /dev/null
@@ -1,159 +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.emoji2.helpers;
-
-import static androidx.emoji2.util.EmojiMatcher.sameCharSequence;
-
-import static junit.framework.TestCase.assertSame;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.same;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.TextUtils;
-import android.text.method.TransformationMethod;
-import android.view.View;
-
-import androidx.emoji2.text.EmojiCompat;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class EmojiTransformationMethodTest {
-
-    private EmojiTransformationMethod mTransformationMethod;
-    private TransformationMethod mWrappedTransformationMethod;
-    private View mView;
-    private EmojiCompat mEmojiCompat;
-    private final String mTestString = "abc";
-
-    @Before
-    public void setup() {
-        mEmojiCompat = mock(EmojiCompat.class);
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
-        when(mEmojiCompat.process(any(CharSequence.class))).thenAnswer(new Answer<CharSequence>() {
-            @Override
-            public CharSequence answer(InvocationOnMock invocation) {
-                Object[] args = invocation.getArguments();
-                return new SpannableString((String) args[0]);
-            }
-        });
-        EmojiCompat.reset(mEmojiCompat);
-
-        mView = mock(View.class);
-        when(mView.isInEditMode()).thenReturn(false);
-
-        mWrappedTransformationMethod = mock(TransformationMethod.class);
-        when(mWrappedTransformationMethod.getTransformation(any(CharSequence.class),
-                any(View.class))).thenAnswer(new Answer<CharSequence>() {
-                    @Override
-                    public CharSequence answer(InvocationOnMock invocation) {
-                        Object[] args = invocation.getArguments();
-                        return (String) args[0];
-                    }
-                });
-
-        mTransformationMethod = new EmojiTransformationMethod(mWrappedTransformationMethod);
-    }
-
-    @Test
-    public void testFilter_withNullSource() {
-        assertNull(mTransformationMethod.getTransformation(null, mView));
-        verify(mEmojiCompat, never()).process(any(CharSequence.class));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testFilter_withNullView() {
-        mTransformationMethod.getTransformation("", null);
-    }
-
-    @Test
-    public void testFilter_withNullTransformationMethod() {
-        mTransformationMethod = new EmojiTransformationMethod(null);
-
-        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
-
-        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
-        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
-    }
-
-    @Test
-    public void testFilter() {
-        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
-
-        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
-        assertTrue(result instanceof Spannable);
-        verify(mWrappedTransformationMethod, times(1)).getTransformation(
-                eq(mTestString), same(mView));
-        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
-        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testFilter_whenEmojiCompatLoading() {
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
-
-        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
-
-        assertSame(mTestString, result);
-        verify(mWrappedTransformationMethod, times(1)).getTransformation(
-                eq(mTestString), same(mView));
-        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
-        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testFilter_whenEmojiCompatLoadFailed() {
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
-
-        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
-
-        assertSame(mTestString, result);
-        verify(mWrappedTransformationMethod, times(1)).getTransformation(
-                eq(mTestString), same(mView));
-        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
-        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-
-    @Test
-    public void testFilter_withManualLoadStrategy() {
-        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
-
-        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
-
-        assertSame(mTestString, result);
-        verify(mWrappedTransformationMethod, times(1)).getTransformation(
-                eq(mTestString), same(mView));
-        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
-        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperPre19Test.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperPre19Test.java
new file mode 100644
index 0000000..829fae8
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperPre19Test.java
@@ -0,0 +1,99 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.text.TextWatcher;
+import android.text.method.KeyListener;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.widget.EditText;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(maxSdkVersion = 18)
+public class EmojiEditTextHelperPre19Test {
+    EmojiEditTextHelper mEmojiEditTextHelper;
+
+    @Before
+    public void setup() {
+        final EditText editText = mock(EditText.class);
+        mEmojiEditTextHelper = new EmojiEditTextHelper(editText);
+        verifyNoMoreInteractions(editText);
+    }
+
+    @Test
+    public void testGetKeyListener_returnsSameKeyListener() {
+        final KeyListener param = mock(KeyListener.class);
+        final KeyListener keyListener = mEmojiEditTextHelper.getKeyListener(
+                param);
+
+        assertSame(param, keyListener);
+    }
+
+    @LargeTest
+    @Test
+    public void testGetOnCreateInputConnection_returnsSameInputConnection() {
+        final InputConnection param = mock(InputConnection.class);
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
+                new EditorInfo());
+
+        assertSame(param, inputConnection);
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullAttrs_returnsSameInputConnection() {
+        final InputConnection param = mock(InputConnection.class);
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(param,
+                null);
+
+        assertSame(param, inputConnection);
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
+                new EditorInfo());
+        assertNull(inputConnection);
+    }
+
+    @Test
+    public void testDoesNotAttachTextWatcher() {
+        final EditText editText = mock(EditText.class);
+
+        mEmojiEditTextHelper = new EmojiEditTextHelper(editText);
+
+        verify(editText, times(0)).addTextChangedListener(any(TextWatcher.class));
+    }
+
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperTest.java
new file mode 100644
index 0000000..6cad221
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditTextHelperTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.text.TextWatcher;
+import android.text.method.KeyListener;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.widget.EditText;
+
+import androidx.emoji2.text.EmojiCompat;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 19)
+public class EmojiEditTextHelperTest {
+    EmojiEditTextHelper mEmojiEditTextHelper;
+    EditText mEditText;
+
+    @Before
+    public void setup() {
+        EmojiCompat.reset(mock(EmojiCompat.class));
+        mEditText = new EditText(ApplicationProvider.getApplicationContext());
+        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testGetKeyListener_withNull_throwsException() {
+        mEmojiEditTextHelper.getKeyListener(null);
+    }
+
+    @Test
+    public void testGetKeyListener_returnsEmojiKeyListener() {
+        final KeyListener keyListener = mEmojiEditTextHelper.getKeyListener(
+                mock(KeyListener.class));
+
+        assertThat(keyListener, instanceOf(EmojiKeyListener.class));
+    }
+
+    @Test
+    public void testGetKeyListener_doesNotCreateNewInstance() {
+        KeyListener mockKeyListener = mock(KeyListener.class);
+        final KeyListener keyListener1 = mEmojiEditTextHelper.getKeyListener(mockKeyListener);
+        final KeyListener keyListener2 = mEmojiEditTextHelper.getKeyListener(keyListener1);
+        assertSame(keyListener1, keyListener2);
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullAttrs_returnsInputConnection() {
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
+                mock(InputConnection.class), null);
+        assertNotNull(inputConnection);
+        assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_withNullInputConnection_returnsNull() {
+        InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(null,
+                new EditorInfo());
+        assertNull(inputConnection);
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_returnsEmojiInputConnection() {
+        final InputConnection inputConnection = mEmojiEditTextHelper.onCreateInputConnection(
+                mock(InputConnection.class), null);
+        assertNotNull(inputConnection);
+        assertThat(inputConnection, instanceOf(EmojiInputConnection.class));
+    }
+
+    @Test
+    public void testGetOnCreateInputConnection_doesNotCreateNewInstance() {
+        final InputConnection ic1 = mEmojiEditTextHelper.onCreateInputConnection(
+                mock(InputConnection.class), null);
+        final InputConnection ic2 = mEmojiEditTextHelper.onCreateInputConnection(ic1, null);
+
+        assertSame(ic1, ic2);
+    }
+
+    @Test
+    public void testAttachesTextWatcher() {
+        mEditText = mock(EditText.class);
+        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
+
+        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
+                TextWatcher.class);
+
+        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
+        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
+    }
+
+    @Test
+    public void testSetMaxCount() {
+        mEditText = mock(EditText.class);
+        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
+        // capture TextWatcher
+        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
+                TextWatcher.class);
+        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
+        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
+        final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue();
+
+        mEmojiEditTextHelper.setMaxEmojiCount(1);
+
+        assertEquals(1, emojiTextWatcher.getMaxEmojiCount());
+    }
+
+    @Test
+    public void testSetEmojiReplaceStrategy() {
+        mEditText = mock(EditText.class);
+        mEmojiEditTextHelper = new EmojiEditTextHelper(mEditText);
+
+        //assert the default value
+        assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT,
+                mEmojiEditTextHelper.getEmojiReplaceStrategy());
+
+        // capture TextWatcher
+        final ArgumentCaptor<TextWatcher> argumentCaptor = ArgumentCaptor.forClass(
+                TextWatcher.class);
+        verify(mEditText, times(1)).addTextChangedListener(argumentCaptor.capture());
+        assertThat(argumentCaptor.getValue(), instanceOf(EmojiTextWatcher.class));
+        final EmojiTextWatcher emojiTextWatcher = (EmojiTextWatcher) argumentCaptor.getValue();
+
+        mEmojiEditTextHelper.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT);
+
+        assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
+                mEmojiEditTextHelper.getEmojiReplaceStrategy());
+
+        assertEquals(EmojiCompat.REPLACE_STRATEGY_NON_EXISTENT,
+                emojiTextWatcher.getEmojiReplaceStrategy());
+    }
+
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditableFactoryTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditableFactoryTest.java
new file mode 100644
index 0000000..d85e40c
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiEditableFactoryTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.hamcrest.Matchers.arrayWithSize;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import android.annotation.SuppressLint;
+import android.text.Editable;
+import android.text.SpannableString;
+import android.text.Spanned;
+
+import androidx.emoji2.text.EmojiMetadata;
+import androidx.emoji2.text.EmojiSpan;
+import androidx.emoji2.text.SpannableBuilder;
+import androidx.emoji2.text.TypefaceEmojiSpan;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class EmojiEditableFactoryTest {
+
+    @Test
+    public void testGetInstance() {
+        final Editable.Factory instance = EmojiEditableFactory.getInstance();
+        assertNotNull(instance);
+
+        final Editable.Factory instance2 = EmojiEditableFactory.getInstance();
+        assertSame(instance, instance2);
+    }
+
+    @Test
+    public void testNewEditable_returnsEditable() {
+        final Editable editable = EmojiEditableFactory.getInstance().newEditable("abc");
+        assertNotNull(editable);
+        assertThat(editable, instanceOf(Editable.class));
+    }
+
+    @Test
+    public void testNewEditable_preservesCharSequenceData() {
+        final String string = "abc";
+        final SpannableString str = new SpannableString(string);
+        final EmojiMetadata metadata = mock(EmojiMetadata.class);
+        final EmojiSpan span = new TypefaceEmojiSpan(metadata);
+        str.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        final Editable editable = EmojiEditableFactory.getInstance().newEditable(str);
+        assertNotNull(editable);
+        assertEquals(string, editable.toString());
+        final EmojiSpan[] spans = editable.getSpans(0, 1, EmojiSpan.class);
+        assertThat(spans, arrayWithSize(1));
+        assertSame(spans[0], span);
+    }
+
+    @SuppressLint("PrivateApi")
+    @Test
+    public void testNewEditable_returnsEmojiSpannableIfWatcherClassExists() {
+        Class<?> clazz = null;
+        try {
+            String className = "android.text.DynamicLayout$ChangeWatcher";
+            clazz = Class.forName(className, false, getClass().getClassLoader());
+        } catch (Throwable t) {
+            // ignore
+        }
+
+        if (clazz == null) {
+            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
+            assertThat(editable, instanceOf(Editable.class));
+        } else {
+            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
+            assertThat(editable, instanceOf(SpannableBuilder.class));
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputConnectionTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputConnectionTest.java
new file mode 100644
index 0000000..843a803
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputConnectionTest.java
@@ -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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Build;
+import android.text.Editable;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.widget.TextView;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 19)
+public class EmojiInputConnectionTest {
+
+    private InputConnection mInputConnection;
+    private Editable mEditable;
+    private EmojiInputConnection mEmojiEmojiInputConnection;
+    private EmojiInputConnection.EmojiCompatDeleteHelper mEmojiCompatDeleteHelper;
+
+    @Before
+    public void setup() {
+        mEditable = mock(Editable.class);
+        mInputConnection = mock(InputConnection.class);
+        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        final TextView textView = spy(new TextView(context));
+        mEmojiCompatDeleteHelper = mock(EmojiInputConnection.EmojiCompatDeleteHelper.class);
+        doNothing().when(mEmojiCompatDeleteHelper).updateEditorInfoAttrs(any());
+
+        doReturn(mEditable).when(textView).getEditableText();
+        when(mInputConnection.deleteSurroundingText(anyInt(), anyInt())).thenReturn(false);
+        setupDeleteSurroundingText();
+
+        mEmojiEmojiInputConnection = new EmojiInputConnection(textView, mInputConnection,
+                new EditorInfo(), mEmojiCompatDeleteHelper);
+    }
+
+    private void setupDeleteSurroundingText() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            when(mInputConnection.deleteSurroundingTextInCodePoints(anyInt(), anyInt())).thenReturn(
+                    false);
+        }
+    }
+
+    @Test
+    public void whenEmojiCompatDelete_doesntDelete_inputConnectionIsCalled() {
+        when(mEmojiCompatDeleteHelper.handleDeleteSurroundingText(any(), any(), anyInt(),
+                anyInt(), anyBoolean())).thenReturn(false);
+        assertFalse(mEmojiEmojiInputConnection.deleteSurroundingText(1, 0));
+        verify(mInputConnection, times(1)).deleteSurroundingText(1, 0);
+    }
+
+    @Test
+    public void whenEmojiCompatDelete_doesDelete_inputConnectionIsNotCalled() {
+        when(mEmojiCompatDeleteHelper.handleDeleteSurroundingText(any(), any(), anyInt(),
+                anyInt(), anyBoolean())).thenReturn(true);
+        assertTrue(mEmojiEmojiInputConnection.deleteSurroundingText(1, 0));
+        verify(mInputConnection, never()).deleteSurroundingText(anyInt(), anyInt());
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputFilterTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputFilterTest.java
new file mode 100644
index 0000000..4dd7387
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiInputFilterTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.widget.TextView;
+
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.util.EmojiMatcher;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class EmojiInputFilterTest {
+
+    private EmojiInputFilter mInputFilter;
+    private EmojiCompat mEmojiCompat;
+
+    @Before
+    public void setup() {
+        final TextView textView = mock(TextView.class);
+        mEmojiCompat = mock(EmojiCompat.class);
+        EmojiCompat.reset(mEmojiCompat);
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+        mInputFilter = new EmojiInputFilter(textView);
+    }
+
+    @Test
+    public void testFilter_withNullSource() {
+        assertNull(mInputFilter.filter(null, 0, 1, null, 0, 1));
+        verify(mEmojiCompat, never()).process(any(CharSequence.class));
+        verify(mEmojiCompat, never()).process(any(CharSequence.class), anyInt(), anyInt());
+    }
+
+    @Test
+    public void testFilter_withString() {
+        final String testString = "abc";
+        when(mEmojiCompat.process(any(CharSequence.class), anyInt(), anyInt()))
+                .thenReturn(new SpannableString(testString));
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        assertTrue(result instanceof Spannable);
+        verify(mEmojiCompat, times(1)).process(
+                EmojiMatcher.sameCharSequence("a"), eq(0), eq(1));
+    }
+
+    @Test
+    public void testFilter_withSpannable() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.process(any(Spannable.class), anyInt(), anyInt())).thenReturn(testString);
+
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        assertSame(result, testString);
+        verify(mEmojiCompat, times(1)).process(
+                EmojiMatcher.sameCharSequence(testString.subSequence(0, 1)),
+                eq(0), eq(1));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoading() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        assertSame(result, testString);
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoadFailed() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
+
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        final CharSequence result = mInputFilter.filter(testString, 0, 1, null, 0, 1);
+
+        assertNotNull(result);
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiKeyListenerTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiKeyListenerTest.java
new file mode 100644
index 0000000..d944658
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiKeyListenerTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.text.Editable;
+import android.text.Selection;
+import android.text.method.KeyListener;
+import android.view.KeyEvent;
+import android.view.View;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 19)
+public class EmojiKeyListenerTest {
+
+    private KeyListener mKeyListener;
+    private Editable mEditable;
+    private EmojiKeyListener mEmojiKeyListener;
+    private EmojiKeyListener.EmojiCompatHandleKeyDownHelper mEmojiCompatKeydownHelper;
+    private KeyEvent mKeyEvent;
+
+    @Before
+    public void setup() {
+        mKeyListener = mock(KeyListener.class);
+        mEditable = mock(Editable.class);
+        mEmojiCompatKeydownHelper = mock(EmojiKeyListener.EmojiCompatHandleKeyDownHelper.class);
+        mEmojiKeyListener = new EmojiKeyListener(mKeyListener, mEmojiCompatKeydownHelper);
+        mKeyEvent = mock(KeyEvent.class);
+        when(mKeyListener.onKeyDown(any(View.class), any(Editable.class), anyInt(),
+                any(KeyEvent.class))).thenReturn(false);
+    }
+
+    @Test
+    public void whenEmojiCompat_handlesKeyDown_doesntCallKeyListener() {
+        Selection.setSelection(mEditable, 0);
+        when(mEmojiCompatKeydownHelper.handleKeyDown(any(), anyInt(), any())).thenReturn(true);
+        assertTrue(mEmojiKeyListener.onKeyDown(null, mEditable, KeyEvent.KEYCODE_0, mKeyEvent));
+        verifyNoMoreInteractions(mKeyListener);
+    }
+
+    @Test
+    public void whenEmojiCompatDoesnt_handleKeyDown_callsListener() {
+        Selection.setSelection(mEditable, 0);
+        when(mEmojiCompatKeydownHelper.handleKeyDown(any(), anyInt(), any())).thenReturn(false);
+        assertFalse(mEmojiKeyListener.onKeyDown(null, mEditable, KeyEvent.KEYCODE_0, mKeyEvent));
+        verify(mKeyListener, times(1)).onKeyDown(eq(null), same(mEditable),
+                eq(KeyEvent.KEYCODE_0), same(mKeyEvent));
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperPre19Test.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperPre19Test.java
new file mode 100644
index 0000000..308dcfd
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperPre19Test.java
@@ -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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+
+import android.text.InputFilter;
+import android.text.method.TransformationMethod;
+import android.widget.TextView;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(maxSdkVersion = 18)
+public class EmojiTextViewHelperPre19Test {
+    EmojiTextViewHelper mTextViewHelper;
+    TextView mTextView;
+
+    @Before
+    public void setup() {
+        mTextView = new TextView(ApplicationProvider.getApplicationContext());
+        mTextViewHelper = new EmojiTextViewHelper(mTextView);
+    }
+
+    @Test
+    public void testUpdateTransformationMethod_doesNotUpdateTransformationMethod() {
+        final TransformationMethod tm = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(tm);
+
+        mTextViewHelper.updateTransformationMethod();
+
+        assertSame(tm, mTextView.getTransformationMethod());
+    }
+
+    @Test
+    public void testGetFilters_returnsSameFilters() {
+        final InputFilter existingFilter = mock(InputFilter.class);
+        final InputFilter[] filters = new InputFilter[]{existingFilter};
+
+        final InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
+
+        assertSame(filters, newFilters);
+    }
+
+    @Test
+    public void testGetTransformationMethod_returnSameTransformationMethod() {
+        assertNull(mTextViewHelper.wrapTransformationMethod(null));
+
+        final TransformationMethod tm = mock(TransformationMethod.class);
+        assertSame(tm, mTextViewHelper.wrapTransformationMethod(tm));
+    }
+
+    @Test
+    public void testSetAllCaps_doesNotUpdateTransformationMethod() {
+        final TransformationMethod tm = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(tm);
+        mTextViewHelper.setAllCaps(true);
+        assertSame(tm, mTextView.getTransformationMethod());
+
+        mTextViewHelper.setAllCaps(false);
+        assertSame(tm, mTextView.getTransformationMethod());
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperTest.java
new file mode 100644
index 0000000..909ca57
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextViewHelperTest.java
@@ -0,0 +1,381 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import android.text.InputFilter;
+import android.text.method.PasswordTransformationMethod;
+import android.text.method.TransformationMethod;
+import android.widget.TextView;
+
+import androidx.emoji2.text.EmojiCompat;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 19)
+public class EmojiTextViewHelperTest {
+    EmojiTextViewHelper mTextViewHelper;
+    TextView mTextView;
+
+    @Before
+    public void setup() {
+        mTextView = new TextView(ApplicationProvider.getApplicationContext());
+        mTextViewHelper = new EmojiTextViewHelper(mTextView);
+        EmojiCompat.reset(mock(EmojiCompat.class));
+    }
+
+    @Test
+    public void testUpdateTransformationMethod() {
+        mTextView.setTransformationMethod(mock(TransformationMethod.class));
+
+        mTextViewHelper.updateTransformationMethod();
+
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+    }
+
+    @Test
+    public void testUpdateTransformationMethod_whenDisabled_doesntWrap() {
+        TransformationMethod mockTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(mockTransform);
+
+        mTextViewHelper.setEnabled(false);
+        mTextViewHelper.updateTransformationMethod();
+
+        assertThat(mTextView.getTransformationMethod(), is(mockTransform));
+    }
+
+    @Test
+    public void testUpdateTransformation_whenNotConfigured_NoEffectWhenSkipConfig() {
+        EmojiCompat.reset((EmojiCompat) null);
+        mTextViewHelper = new EmojiTextViewHelper(mTextView, false);
+        TransformationMethod mockTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(mockTransform);
+        mTextViewHelper.updateTransformationMethod();
+        assertThat(mTextView.getTransformationMethod(), is(mockTransform));
+    }
+
+    @Test
+    public void testUpdateTransformationMethod_doesNotUpdateForPasswordTransformation() {
+        final PasswordTransformationMethod transformationMethod =
+                new PasswordTransformationMethod();
+        mTextView.setTransformationMethod(transformationMethod);
+
+        mTextViewHelper.updateTransformationMethod();
+
+        assertEquals(transformationMethod, mTextView.getTransformationMethod());
+    }
+
+    @Test
+    public void testUpdateTransformationMethod_doesNotCreateNewInstance() {
+        mTextView.setTransformationMethod(mock(TransformationMethod.class));
+
+        mTextViewHelper.updateTransformationMethod();
+        final TransformationMethod tm = mTextView.getTransformationMethod();
+        assertThat(tm, instanceOf(EmojiTransformationMethod.class));
+
+        // call the function again
+        mTextViewHelper.updateTransformationMethod();
+        assertSame(tm, mTextView.getTransformationMethod());
+    }
+
+    @Test
+    public void testGetFilters() {
+        final InputFilter existingFilter = mock(InputFilter.class);
+        final InputFilter[] filters = new InputFilter[]{existingFilter};
+
+        final InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
+
+        assertEquals(2, newFilters.length);
+        assertThat(Arrays.asList(newFilters), hasItem(existingFilter));
+        assertNotNull(findEmojiInputFilter(newFilters));
+    }
+
+    @Test
+    public void testGetFilters_doesNotAddSecondInstance() {
+        final InputFilter existingFilter = mock(InputFilter.class);
+        final InputFilter[] filters = new InputFilter[]{existingFilter};
+
+        InputFilter[] newFilters = mTextViewHelper.getFilters(filters);
+        EmojiInputFilter emojiInputFilter = findEmojiInputFilter(newFilters);
+        assertNotNull(emojiInputFilter);
+
+        // run it again with the updated filters and see that it does not add new filter
+        newFilters = mTextViewHelper.getFilters(newFilters);
+
+        assertEquals(2, newFilters.length);
+        assertThat(Arrays.asList(newFilters), hasItem(existingFilter));
+        assertThat(Arrays.asList(newFilters), CoreMatchers.hasItem(emojiInputFilter));
+    }
+
+    @Test
+    public void getFilter_addsFilter_whenEmptyArray() {
+        InputFilter[] actual = mTextViewHelper.getFilters(new InputFilter[0]);
+        EmojiInputFilter emojiInputFilter = findEmojiInputFilter(actual);
+        assertNotNull(emojiInputFilter);
+    }
+
+    @Test
+    public void getFilter_doesntAddFilter_whenDisabled() {
+        mTextViewHelper.setEnabled(false);
+        InputFilter[] expected = new InputFilter[0];
+        InputFilter[] actual = mTextViewHelper.getFilters(expected);
+        assertThat(expected, is(actual));
+    }
+
+    @Test
+    public void setFilter_doesntAddFilter_whenNotConfiguredAndSkipping() {
+        EmojiCompat.reset((EmojiCompat) null);
+        mTextViewHelper = new EmojiTextViewHelper(mTextView, false);
+        InputFilter[] expected = new InputFilter[0];
+        InputFilter[] actual = mTextViewHelper.getFilters(expected);
+        assertThat(expected, is(actual));
+    }
+
+    @Test
+    public void getFilter_removesFilter_whenDisabled() {
+        mTextViewHelper.setEnabled(false);
+        InputFilter[] input = new InputFilter[1];
+        input[0] = new EmojiInputFilter(mTextView);
+        InputFilter[] actual = mTextViewHelper.getFilters(input);
+        assertThat(actual, equalTo(new InputFilter[0]));
+    }
+
+    @Test
+    public void getFilter_removesAllFilters_whenDisabled() {
+        mTextViewHelper.setEnabled(false);
+        InputFilter[] input = new InputFilter[3];
+        input[0] = new EmojiInputFilter(mTextView);
+        input[1] = mock(InputFilter.class);
+        input[2] = new EmojiInputFilter(mTextView);
+        InputFilter[] actual = mTextViewHelper.getFilters(input);
+        InputFilter[] expected = new InputFilter[1];
+        expected[0] = input[1];
+        assertThat(actual, equalTo(expected));
+    }
+
+    private EmojiInputFilter findEmojiInputFilter(final InputFilter[] filters) {
+        for (int i = 0; i < filters.length; i++) {
+            if (filters[i] instanceof EmojiInputFilter) {
+                return (EmojiInputFilter) filters[i];
+            }
+        }
+        return null;
+    }
+
+    @Test
+    public void testWrapTransformationMethod_doesNotCreateNewInstance() {
+        final TransformationMethod tm1 = mTextViewHelper.wrapTransformationMethod(null);
+        final TransformationMethod tm2 = mTextViewHelper.wrapTransformationMethod(tm1);
+        assertSame(tm1, tm2);
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenEnabled_andPassword_returnsOriginal() {
+        TransformationMethod expected = new PasswordTransformationMethod();
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(expected);
+        assertThat(actual, is(expected));
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenDisabled_andPassword_returnsOriginal() {
+        mTextViewHelper.setEnabled(false);
+        TransformationMethod expected = new PasswordTransformationMethod();
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(expected);
+        assertThat(actual, is(expected));
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenEnabled_andEmoji_returnsOriginal() {
+        TransformationMethod expected = new EmojiTransformationMethod(null);
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(expected);
+        assertThat(actual, is(expected));
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenDisabled_andEmoji_returnsUnwrapped() {
+        TransformationMethod expected = mock(TransformationMethod.class);
+        TransformationMethod input = new EmojiTransformationMethod(expected);
+        mTextViewHelper.setEnabled(false);
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(input);
+        assertThat(actual, is(expected));
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenNull_andEnabled_returnsEmojiTransformationMethod() {
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(null);
+        assertThat(actual, instanceOf(EmojiTransformationMethod.class));
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenNull_andDisabled_returnsNull() {
+        mTextViewHelper.setEnabled(false);
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(null);
+        assertNull(actual);
+    }
+
+    @Test
+    public void wrapTransformationMethod_whenNotEmoji_andDisabled_returnsOriginal() {
+        mTextViewHelper.setEnabled(false);
+        TransformationMethod expected = mock(TransformationMethod.class);
+        TransformationMethod actual = mTextViewHelper.wrapTransformationMethod(expected);
+        assertThat(actual, is(expected));
+    }
+
+    @Test
+    public void testSetAllCaps_withTrueSetsTransformationMethod() {
+        mTextView.setTransformationMethod(mock(TransformationMethod.class));
+        mTextViewHelper.setAllCaps(true);
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+    }
+
+    @Test
+    public void testSetAllCaps_withFalseDoesNotSetTransformationMethod() {
+        mTextView.setTransformationMethod(null);
+        mTextViewHelper.setAllCaps(false);
+        assertNull(mTextView.getTransformationMethod());
+    }
+
+    @Test
+    public void testSetAllCaps_withPasswordTransformationDoesNotSetTransformationMethod() {
+        final PasswordTransformationMethod transformationMethod =
+                new PasswordTransformationMethod();
+        mTextView.setTransformationMethod(transformationMethod);
+        mTextViewHelper.setAllCaps(true);
+        assertSame(transformationMethod, mTextView.getTransformationMethod());
+    }
+
+    @Test
+    public void setEnabled_fromEnabled_leavesTransformationMethod() {
+        TransformationMethod mockTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(mockTransform);
+        mTextViewHelper.updateTransformationMethod();
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+        mTextViewHelper.setEnabled(true);
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+    }
+
+    @Test
+    public void setEnabled_fromEnabled_leavesFilter() {
+        InputFilter[] expected = mTextViewHelper.getFilters(new InputFilter[0]);
+        mTextView.setFilters(expected);
+        mTextViewHelper.setEnabled(true);
+        assertThat(mTextView.getFilters(), is(expected));
+    }
+
+    @Test
+    public void setDisabled_fromEnabled_unWrapsTransformationMethod() {
+        TransformationMethod mockTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(mockTransform);
+        mTextViewHelper.updateTransformationMethod();
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+
+        mTextViewHelper.setEnabled(false);
+        assertThat(mTextView.getTransformationMethod(), is(mockTransform));
+    }
+
+    @Test
+    public void setDisabled_fromEnabled_removesFilter() {
+        InputFilter[] expected = new InputFilter[0];
+        mTextView.setFilters(mTextViewHelper.getFilters(expected));
+        mTextViewHelper.setEnabled(false);
+        assertThat(mTextView.getFilters(), equalTo(expected));
+    }
+
+    @Test
+    public void setEnabled_whenEnabling_reWrapsTransformationMethod() {
+        TransformationMethod mockTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(mockTransform);
+        mTextViewHelper.updateTransformationMethod();
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+
+        mTextViewHelper.setEnabled(false);
+        assertThat(mTextView.getTransformationMethod(), is(mockTransform));
+
+        mTextViewHelper.setEnabled(true);
+        assertThat(mTextView.getTransformationMethod(),
+                instanceOf(EmojiTransformationMethod.class));
+    }
+
+    @Test
+    public void setEnabled_whenEnabling_reAddsFilter() {
+        InputFilter[] expected = mTextViewHelper.getFilters(new InputFilter[0]);
+        mTextView.setFilters(expected);
+        mTextViewHelper.setEnabled(false);
+        assertThat(mTextView.getFilters(), equalTo(new InputFilter[0]));
+        mTextViewHelper.setEnabled(true);
+        assertThat(mTextView.getFilters(), equalTo(expected));
+    }
+
+    @Test
+    public void setEnabled_whenNotConfigured_andSkipConfig_doesNothing() {
+        EmojiCompat.reset((EmojiCompat) null);
+        mTextViewHelper = new EmojiTextViewHelper(mTextView, false);
+
+        InputFilter[] expectedInput = new InputFilter[1];
+        expectedInput[0] = mock(InputFilter.class);
+        mTextView.setFilters(expectedInput);
+        TransformationMethod expectedTransform = mock(TransformationMethod.class);
+        mTextView.setTransformationMethod(expectedTransform);
+
+        mTextViewHelper.setEnabled(true);
+        InputFilter[] actualInput1 = mTextView.getFilters();
+        TransformationMethod actualTransform1 = mTextView.getTransformationMethod();
+        mTextViewHelper.setEnabled(false);
+        InputFilter[] actualInput2 = mTextView.getFilters();
+        TransformationMethod actualTransform2 = mTextView.getTransformationMethod();
+        mTextViewHelper.setEnabled(true);
+        InputFilter[] actualInput3 = mTextView.getFilters();
+        TransformationMethod actualTransform3 = mTextView.getTransformationMethod();
+
+        // use transitive reference equality to do a bunch of assertions
+        assertSame(expectedInput, actualInput1);
+        assertSame(actualInput1, actualInput2);
+        assertSame(actualInput2, actualInput3);
+
+        assertSame(expectedTransform, actualTransform1);
+        assertSame(actualTransform1, actualTransform2);
+        assertSame(actualTransform2, actualTransform3);
+    }
+
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextWatcherTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextWatcherTest.java
new file mode 100644
index 0000000..df1f2de
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTextWatcherTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.widget.EditText;
+
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.util.EmojiMatcher;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class EmojiTextWatcherTest {
+
+    private EmojiTextWatcher mTextWatcher;
+    private EmojiCompat mEmojiCompat;
+
+    @Before
+    public void setup() {
+        final EditText editText = mock(EditText.class);
+        mEmojiCompat = mock(EmojiCompat.class);
+        EmojiCompat.reset(mEmojiCompat);
+        mTextWatcher = new EmojiTextWatcher(editText);
+    }
+
+    @Test
+    public void testOnTextChanged_callsProcess() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(1)).process(
+                EmojiMatcher.sameCharSequence(testString),
+                eq(0),
+                eq(1),
+                eq(Integer.MAX_VALUE),
+                anyInt());
+        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testOnTextChanged_whenEmojiCompatLoading() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+                anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testOnTextChanged_whenEmojiCompatLoadFailed() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+                anyInt());
+        verify(mEmojiCompat, times(0)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testSetEmojiReplaceStrategy() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+
+        assertEquals(EmojiCompat.REPLACE_STRATEGY_DEFAULT, mTextWatcher.getEmojiReplaceStrategy());
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+                eq(EmojiCompat.REPLACE_STRATEGY_DEFAULT));
+
+        mTextWatcher.setEmojiReplaceStrategy(EmojiCompat.REPLACE_STRATEGY_ALL);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(1)).process(any(Spannable.class), anyInt(), anyInt(), anyInt(),
+                eq(EmojiCompat.REPLACE_STRATEGY_ALL));
+    }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        final Spannable testString = new SpannableString("abc");
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        mTextWatcher.onTextChanged(testString, 0, 0, 1);
+
+        verify(mEmojiCompat, times(0)).process(any(Spannable.class), anyInt(), anyInt());
+        verify(mEmojiCompat, times(1)).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTransformationMethodTest.java b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTransformationMethodTest.java
new file mode 100644
index 0000000..e0c6792
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/androidTest/java/androidx/emoji2/viewshelper/EmojiTransformationMethodTest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import static androidx.emoji2.util.EmojiMatcher.sameCharSequence;
+
+import static junit.framework.TestCase.assertSame;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.method.TransformationMethod;
+import android.view.View;
+
+import androidx.emoji2.text.EmojiCompat;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class EmojiTransformationMethodTest {
+
+    private EmojiTransformationMethod mTransformationMethod;
+    private TransformationMethod mWrappedTransformationMethod;
+    private View mView;
+    private EmojiCompat mEmojiCompat;
+    private final String mTestString = "abc";
+
+    @Before
+    public void setup() {
+        mEmojiCompat = mock(EmojiCompat.class);
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_SUCCEEDED);
+        when(mEmojiCompat.process(any(CharSequence.class))).thenAnswer(new Answer<CharSequence>() {
+            @Override
+            public CharSequence answer(InvocationOnMock invocation) {
+                Object[] args = invocation.getArguments();
+                return new SpannableString((String) args[0]);
+            }
+        });
+        EmojiCompat.reset(mEmojiCompat);
+
+        mView = mock(View.class);
+        when(mView.isInEditMode()).thenReturn(false);
+
+        mWrappedTransformationMethod = mock(TransformationMethod.class);
+        when(mWrappedTransformationMethod.getTransformation(any(CharSequence.class),
+                any(View.class))).thenAnswer(new Answer<CharSequence>() {
+                    @Override
+                    public CharSequence answer(InvocationOnMock invocation) {
+                        Object[] args = invocation.getArguments();
+                        return (String) args[0];
+                    }
+                });
+
+        mTransformationMethod = new EmojiTransformationMethod(mWrappedTransformationMethod);
+    }
+
+    @Test
+    public void testFilter_withNullSource() {
+        assertNull(mTransformationMethod.getTransformation(null, mView));
+        verify(mEmojiCompat, never()).process(any(CharSequence.class));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testFilter_withNullView() {
+        mTransformationMethod.getTransformation("", null);
+    }
+
+    @Test
+    public void testFilter_withNullTransformationMethod() {
+        mTransformationMethod = new EmojiTransformationMethod(null);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
+        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
+    }
+
+    @Test
+    public void testFilter() {
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertTrue(TextUtils.equals(new SpannableString(mTestString), result));
+        assertTrue(result instanceof Spannable);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                eq(mTestString), same(mView));
+        verify(mEmojiCompat, times(1)).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoading() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_LOADING);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                eq(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_whenEmojiCompatLoadFailed() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_FAILED);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                eq(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+
+    @Test
+    public void testFilter_withManualLoadStrategy() {
+        when(mEmojiCompat.getLoadState()).thenReturn(EmojiCompat.LOAD_STATE_DEFAULT);
+
+        final CharSequence result = mTransformationMethod.getTransformation(mTestString, mView);
+
+        assertSame(mTestString, result);
+        verify(mWrappedTransformationMethod, times(1)).getTransformation(
+                eq(mTestString), same(mView));
+        verify(mEmojiCompat, never()).process(sameCharSequence(mTestString));
+        verify(mEmojiCompat, never()).registerInitCallback(any(EmojiCompat.InitCallback.class));
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditTextHelper.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditTextHelper.java
deleted file mode 100644
index 54216ea..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditTextHelper.java
+++ /dev/null
@@ -1,240 +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.emoji2.helpers;
-
-import android.os.Build;
-import android.text.method.KeyListener;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.core.util.Preconditions;
-import androidx.emoji2.text.EmojiCompat;
-import androidx.emoji2.text.EmojiDefaults;
-import androidx.emoji2.text.EmojiSpan;
-
-/**
- * Utility class to enhance custom EditText widgets with {@link EmojiCompat}.
- * <p/>
- * <pre>
- * public class MyEmojiEditText extends EditText {
- *      public MyEmojiEditText(Context context) {
- *          super(context);
- *          init();
- *      }
- *      // ...
- *      private void init() {
- *          super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
- *      }
- *
- *      {@literal @}Override
- *      public void setKeyListener(android.text.method.KeyListener keyListener) {
- *          super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
- *      }
- *
- *      {@literal @}Override
- *      public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- *          InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
- *          return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
- *      }
- *
- *      private EmojiEditTextHelper getEmojiEditTextHelper() {
- *          if (mEmojiEditTextHelper == null) {
- *              mEmojiEditTextHelper = new EmojiEditTextHelper(this);
- *          }
- *          return mEmojiEditTextHelper;
- *      }
- * }
- * </pre>
- *
- */
-public final class EmojiEditTextHelper {
-    private final HelperInternal mHelper;
-    private int mMaxEmojiCount = EmojiDefaults.MAX_EMOJI_COUNT;
-    @EmojiCompat.ReplaceStrategy
-    private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
-
-    /**
-     * Default constructor.
-     *
-     * @param editText EditText instance
-     */
-    public EmojiEditTextHelper(@NonNull final EditText editText) {
-        Preconditions.checkNotNull(editText, "editText cannot be null");
-        mHelper = Build.VERSION.SDK_INT >= 19 ? new HelperInternal19(editText)
-                : new HelperInternal();
-    }
-
-    /**
-     * Set the maximum number of EmojiSpans to be added to a CharSequence. The number of spans in a
-     * CharSequence affects the performance of the EditText insert/delete operations. Insert/delete
-     * operations slow down as the number of spans increases.
-     * <p/>
-     *
-     * @param maxEmojiCount maximum number of EmojiSpans to be added to a single CharSequence,
-     *                      should be equal or greater than 0
-     *
-     * @see EmojiCompat#process(CharSequence, int, int, int)
-     */
-    public void setMaxEmojiCount(@IntRange(from = 0) int maxEmojiCount) {
-        Preconditions.checkArgumentNonnegative(maxEmojiCount,
-                "maxEmojiCount should be greater than 0");
-        mMaxEmojiCount = maxEmojiCount;
-        mHelper.setMaxEmojiCount(maxEmojiCount);
-    }
-
-    /**
-     * Returns the maximum number of EmojiSpans to be added to a CharSequence.
-     *
-     * @see #setMaxEmojiCount(int)
-     * @see EmojiCompat#process(CharSequence, int, int, int)
-     */
-    public int getMaxEmojiCount() {
-        return mMaxEmojiCount;
-    }
-
-    /**
-     * Attaches EmojiCompat KeyListener to the widget. Should be called from {@link
-     * TextView#setKeyListener(KeyListener)}. Existing keyListener is wrapped into EmojiCompat
-     * KeyListener. When used on devices running API 18 or below, this method returns
-     * {@code keyListener} that is given as a parameter.
-     *
-     * @param keyListener KeyListener passed into {@link TextView#setKeyListener(KeyListener)}
-     *
-     * @return a new KeyListener instance that wraps {@code keyListener}.
-     */
-    @NonNull
-    public KeyListener getKeyListener(@NonNull final KeyListener keyListener) {
-        Preconditions.checkNotNull(keyListener, "keyListener cannot be null");
-        return mHelper.getKeyListener(keyListener);
-    }
-
-    /**
-     * Updates the InputConnection with emoji support. Should be called from {@link
-     * TextView#onCreateInputConnection(EditorInfo)}. When used on devices running API 18 or below,
-     * this method returns {@code inputConnection} that is given as a parameter. If
-     * {@code inputConnection} is {@code null}, returns {@code null}.
-     *
-     * @param inputConnection InputConnection instance created by TextView
-     * @param outAttrs        EditorInfo passed into
-     *                        {@link TextView#onCreateInputConnection(EditorInfo)}
-     *
-     * @return a new InputConnection instance that wraps {@code inputConnection}
-     */
-    @Nullable
-    public InputConnection onCreateInputConnection(@Nullable final InputConnection inputConnection,
-            @NonNull final EditorInfo outAttrs) {
-        if (inputConnection == null) return null;
-        return mHelper.onCreateInputConnection(inputConnection, outAttrs);
-    }
-
-    /**
-     * Sets whether to replace all emoji with {@link EmojiSpan}s. Default value is
-     * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
-     *
-     * @param replaceStrategy should be one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
-     *                        {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
-     *                        {@link EmojiCompat#REPLACE_STRATEGY_ALL}
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
-        mEmojiReplaceStrategy = replaceStrategy;
-        mHelper.setEmojiReplaceStrategy(replaceStrategy);
-    }
-
-    /**
-     * Returns whether to replace all emoji with {@link EmojiSpan}s. Default value is
-     * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
-     *
-     * @return one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
-     *                        {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
-     *                        {@link EmojiCompat#REPLACE_STRATEGY_ALL}
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public int getEmojiReplaceStrategy() {
-        return mEmojiReplaceStrategy;
-    }
-
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static class HelperInternal {
-
-        KeyListener getKeyListener(@NonNull KeyListener keyListener) {
-            return keyListener;
-        }
-
-        InputConnection onCreateInputConnection(@NonNull InputConnection inputConnection,
-                @NonNull EditorInfo outAttrs) {
-            return inputConnection;
-        }
-
-        void setMaxEmojiCount(int maxEmojiCount) {
-            // do nothing
-        }
-
-        void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
-            // do nothing
-        }
-    }
-
-    @RequiresApi(19)
-    private static class HelperInternal19 extends HelperInternal {
-        private final EditText mEditText;
-        private final EmojiTextWatcher mTextWatcher;
-
-        HelperInternal19(@NonNull EditText editText) {
-            mEditText = editText;
-            mTextWatcher = new EmojiTextWatcher(mEditText);
-            mEditText.addTextChangedListener(mTextWatcher);
-            mEditText.setEditableFactory(EmojiEditableFactory.getInstance());
-        }
-
-        @Override
-        void setMaxEmojiCount(int maxEmojiCount) {
-            mTextWatcher.setMaxEmojiCount(maxEmojiCount);
-        }
-
-        @Override
-        void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
-            mTextWatcher.setEmojiReplaceStrategy(replaceStrategy);
-        }
-
-        @Override
-        KeyListener getKeyListener(@NonNull final KeyListener keyListener) {
-            if (keyListener instanceof EmojiKeyListener) {
-                return keyListener;
-            }
-            return new EmojiKeyListener(keyListener);
-        }
-
-        @Override
-        InputConnection onCreateInputConnection(@NonNull final InputConnection inputConnection,
-                @NonNull final EditorInfo outAttrs) {
-            if (inputConnection instanceof EmojiInputConnection) {
-                return inputConnection;
-            }
-            return new EmojiInputConnection(mEditText, inputConnection, outAttrs);
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditableFactory.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditableFactory.java
deleted file mode 100644
index bb6a713f..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiEditableFactory.java
+++ /dev/null
@@ -1,79 +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.emoji2.helpers;
-
-import android.annotation.SuppressLint;
-import android.text.Editable;
-
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.emoji2.text.SpannableBuilder;
-
-/**
- * EditableFactory used to improve editing operations on an EditText.
- * <p>
- * EditText uses DynamicLayout, which attaches to the Spannable instance that is being edited using
- * ChangeWatcher. ChangeWatcher implements SpanWatcher and Textwatcher. Currently every delete/add
- * operation is reported to DynamicLayout, for every span that has changed. For each change,
- * DynamicLayout performs some expensive computations. i.e. if there is 100 EmojiSpans and the first
- * span is deleted, DynamicLayout gets 99 calls about the change of position occurred in the
- * remaining spans. This causes a huge delay in response time.
- * <p>
- * Since "android.text.DynamicLayout$ChangeWatcher" class is not a public class,
- * EmojiEditableFactory checks if the watcher is in the classpath, and if so uses the modified
- * Spannable which reduces the total number of calls to DynamicLayout for operations that affect
- * EmojiSpans.
- *
- * @see SpannableBuilder
- */
-final class EmojiEditableFactory extends Editable.Factory {
-    private static final Object INSTANCE_LOCK = new Object();
-    @GuardedBy("INSTANCE_LOCK")
-    private static volatile Editable.Factory sInstance;
-
-    @Nullable private static Class<?> sWatcherClass;
-
-    @SuppressLint("PrivateApi")
-    private EmojiEditableFactory() {
-        try {
-            String className = "android.text.DynamicLayout$ChangeWatcher";
-            sWatcherClass = Class.forName(className, false, getClass().getClassLoader());
-        } catch (Throwable t) {
-            // ignore
-        }
-    }
-
-    @SuppressWarnings("GuardedBy")
-    public static Editable.Factory getInstance() {
-        if (sInstance == null) {
-            synchronized (INSTANCE_LOCK) {
-                if (sInstance == null) {
-                    sInstance = new EmojiEditableFactory();
-                }
-            }
-        }
-        return sInstance;
-    }
-
-    @Override
-    public Editable newEditable(@NonNull final CharSequence source) {
-        if (sWatcherClass != null) {
-            return SpannableBuilder.create(sWatcherClass, source);
-        }
-        return super.newEditable(source);
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputConnection.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputConnection.java
deleted file mode 100644
index 03f41ce..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputConnection.java
+++ /dev/null
@@ -1,98 +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.emoji2.helpers;
-
-import android.text.Editable;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.view.inputmethod.InputConnectionWrapper;
-import android.widget.TextView;
-
-import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.emoji2.text.EmojiCompat;
-
-/**
- * InputConnectionWrapper for EditText delete operations. Keyboard does not have knowledge about
- * emojis and therefore might send commands to delete a part of the emoji sequence which creates
- * invalid codeunits/getCodepointAt in the text.
- * <p/>
- * This class tries to correctly delete an emoji checking if there is an emoji span.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(19)
-final class EmojiInputConnection extends InputConnectionWrapper {
-    private final TextView mTextView;
-    private final EmojiCompatDeleteHelper mEmojiCompatDeleteHelper;
-
-    EmojiInputConnection(
-            @NonNull final TextView textView,
-            @NonNull final InputConnection inputConnection,
-            @NonNull final EditorInfo outAttrs) {
-        this(textView, inputConnection, outAttrs, new EmojiCompatDeleteHelper());
-    }
-
-    EmojiInputConnection(
-            @NonNull final TextView textView,
-            @NonNull final InputConnection inputConnection,
-            @NonNull final EditorInfo outAttrs,
-            @NonNull final EmojiCompatDeleteHelper emojiCompatDeleteHelper
-    ) {
-        super(inputConnection, false);
-        mTextView = textView;
-        mEmojiCompatDeleteHelper = emojiCompatDeleteHelper;
-        mEmojiCompatDeleteHelper.updateEditorInfoAttrs(outAttrs);
-    }
-
-    @Override
-    public boolean deleteSurroundingText(final int beforeLength, final int afterLength) {
-        final boolean result = mEmojiCompatDeleteHelper.handleDeleteSurroundingText(
-                this, getEditable(), beforeLength, afterLength, false /*inCodePoints*/);
-        return result || super.deleteSurroundingText(beforeLength, afterLength);
-    }
-
-    @Override
-    public boolean deleteSurroundingTextInCodePoints(final int beforeLength,
-            final int afterLength) {
-        final boolean result = mEmojiCompatDeleteHelper.handleDeleteSurroundingText(
-                this, getEditable(), beforeLength, afterLength, true /*inCodePoints*/);
-        return result || super.deleteSurroundingTextInCodePoints(beforeLength, afterLength);
-    }
-
-    private Editable getEditable() {
-        return mTextView.getEditableText();
-    }
-
-    public static class EmojiCompatDeleteHelper {
-        public boolean handleDeleteSurroundingText(
-                @NonNull final InputConnection inputConnection,
-                @NonNull final Editable editable,
-                @IntRange(from = 0) final int beforeLength,
-                @IntRange(from = 0) final int afterLength,
-                final boolean inCodePoints) {
-            return EmojiCompat.handleDeleteSurroundingText(inputConnection, editable,
-                    beforeLength, afterLength, inCodePoints);
-        }
-
-        public void updateEditorInfoAttrs(@NonNull final EditorInfo outAttrs) {
-            EmojiCompat.get().updateEditorInfoAttrs(outAttrs);
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java
deleted file mode 100644
index 6560a80..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java
+++ /dev/null
@@ -1,133 +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.emoji2.helpers;
-
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.Spanned;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.emoji2.text.EmojiCompat;
-import androidx.emoji2.text.EmojiCompat.InitCallback;
-
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-
-/**
- * InputFilter to add EmojiSpans to the CharSequence set in a TextView. Unlike EditText where a
- * TextWatcher is used to enhance the CharSequence, InputFilter is used on TextView. The reason is
- * that if you add a TextWatcher to a TextView, its internal layout mechanism change, and therefore
- * depending on the CharSequence provided, adding a TextWatcher might have performance side
- * effects.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(19)
-final class EmojiInputFilter implements android.text.InputFilter {
-    private final TextView mTextView;
-    private InitCallback mInitCallback;
-
-    EmojiInputFilter(@NonNull final TextView textView) {
-        mTextView = textView;
-    }
-
-    @Override
-    public CharSequence filter(final CharSequence source, final int sourceStart,
-            final int sourceEnd, final Spanned dest, final int destStart, final int destEnd) {
-        if (mTextView.isInEditMode()) {
-            return source;
-        }
-
-        switch (EmojiCompat.get().getLoadState()){
-            case EmojiCompat.LOAD_STATE_SUCCEEDED:
-                boolean process = true;
-                if (destEnd == 0 && destStart == 0 && dest.length() == 0) {
-                    final CharSequence oldText = mTextView.getText();
-                    if (source == oldText) {
-                        process = false;
-                    }
-                }
-
-                if (process && source != null) {
-                    final CharSequence text;
-                    if (sourceStart == 0 && sourceEnd == source.length()) {
-                        text = source;
-                    } else {
-                        text = source.subSequence(sourceStart, sourceEnd);
-                    }
-                    return EmojiCompat.get().process(text, 0, text.length());
-                }
-
-                return source;
-            case EmojiCompat.LOAD_STATE_LOADING:
-            case EmojiCompat.LOAD_STATE_DEFAULT:
-                EmojiCompat.get().registerInitCallback(getInitCallback());
-                return source;
-
-            case EmojiCompat.LOAD_STATE_FAILED:
-            default:
-                return source;
-        }
-    }
-
-    private InitCallback getInitCallback() {
-        if (mInitCallback == null) {
-            mInitCallback = new InitCallbackImpl(mTextView);
-        }
-        return mInitCallback;
-    }
-
-    @RequiresApi(19)
-    private static class InitCallbackImpl extends InitCallback {
-        private final Reference<TextView> mViewRef;
-
-        InitCallbackImpl(TextView textView) {
-            mViewRef = new WeakReference<>(textView);
-        }
-
-        @Override
-        public void onInitialized() {
-            super.onInitialized();
-            final TextView textView = mViewRef.get();
-            if (textView != null && textView.isAttachedToWindow()) {
-                final CharSequence result = EmojiCompat.get().process(textView.getText());
-
-                final int selectionStart = Selection.getSelectionStart(result);
-                final int selectionEnd = Selection.getSelectionEnd(result);
-
-                textView.setText(result);
-
-                if (result instanceof Spannable) {
-                    updateSelection((Spannable) result, selectionStart, selectionEnd);
-                }
-            }
-        }
-    }
-
-    static void updateSelection(Spannable spannable, final int start, final int end) {
-        if (start >= 0 && end >= 0) {
-            Selection.setSelection(spannable, start, end);
-        } else if (start >= 0) {
-            Selection.setSelection(spannable, start);
-        } else if (end >= 0) {
-            Selection.setSelection(spannable, end);
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java
deleted file mode 100644
index e3d0a72..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java
+++ /dev/null
@@ -1,83 +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.emoji2.helpers;
-
-import android.text.Editable;
-import android.text.method.KeyListener;
-import android.view.KeyEvent;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.emoji2.text.EmojiCompat;
-
-/**
- * KeyListener class to handle delete operations correctly.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(19)
-final class EmojiKeyListener implements android.text.method.KeyListener {
-    private final android.text.method.KeyListener mKeyListener;
-    private final EmojiCompatHandleKeyDownHelper mEmojiCompatHandleKeyDownHelper;
-
-    EmojiKeyListener(android.text.method.KeyListener keyListener) {
-        this(keyListener, new EmojiCompatHandleKeyDownHelper());
-    }
-
-    EmojiKeyListener(KeyListener keyListener,
-            EmojiCompatHandleKeyDownHelper emojiCompatKeydownHelper) {
-        mKeyListener = keyListener;
-        mEmojiCompatHandleKeyDownHelper = emojiCompatKeydownHelper;
-    }
-
-    @Override
-    public int getInputType() {
-        return mKeyListener.getInputType();
-    }
-
-    @Override
-    public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
-        final boolean result = mEmojiCompatHandleKeyDownHelper
-                .handleKeyDown(content, keyCode, event);
-        return result || mKeyListener.onKeyDown(view, content, keyCode, event);
-    }
-
-    @Override
-    public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
-        return mKeyListener.onKeyUp(view, text, keyCode, event);
-    }
-
-    @Override
-    public boolean onKeyOther(View view, Editable text, KeyEvent event) {
-        return mKeyListener.onKeyOther(view, text, event);
-    }
-
-    @Override
-    public void clearMetaKeyState(View view, Editable content, int states) {
-        mKeyListener.clearMetaKeyState(view, content, states);
-    }
-
-    public static class EmojiCompatHandleKeyDownHelper {
-        public boolean handleKeyDown(@NonNull final Editable editable, final int keyCode,
-                @NonNull final KeyEvent event) {
-            return EmojiCompat.handleOnKeyDown(editable, keyCode, event);
-        }
-    }
-
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextViewHelper.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextViewHelper.java
deleted file mode 100644
index ee45e85..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextViewHelper.java
+++ /dev/null
@@ -1,197 +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.emoji2.helpers;
-
-import android.os.Build;
-import android.text.InputFilter;
-import android.text.method.PasswordTransformationMethod;
-import android.text.method.TransformationMethod;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.core.util.Preconditions;
-import androidx.emoji2.text.EmojiCompat;
-
-/**
- * Utility class to enhance custom TextView widgets with {@link EmojiCompat}.
- * <pre>
- * public class MyEmojiTextView extends TextView {
- *     public MyEmojiTextView(Context context) {
- *         super(context);
- *         init();
- *     }
- *     // ..
- *     private void init() {
- *         getEmojiTextViewHelper().updateTransformationMethod();
- *     }
- *
- *     {@literal @}Override
- *     public void setFilters(InputFilter[] filters) {
- *         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
- *     }
- *
- *     {@literal @}Override
- *     public void setAllCaps(boolean allCaps) {
- *         super.setAllCaps(allCaps);
- *         getEmojiTextViewHelper().setAllCaps(allCaps);
- *     }
- *
- *     private EmojiTextViewHelper getEmojiTextViewHelper() {
- *         if (mEmojiTextViewHelper == null) {
- *             mEmojiTextViewHelper = new EmojiTextViewHelper(this);
- *         }
- *         return mEmojiTextViewHelper;
- *     }
- * }
- * </pre>
- */
-public final class EmojiTextViewHelper {
-
-    private final HelperInternal mHelper;
-
-    /**
-     * Default constructor.
-     *
-     * @param textView TextView instance
-     */
-    public EmojiTextViewHelper(@NonNull TextView textView) {
-        Preconditions.checkNotNull(textView, "textView cannot be null");
-        mHelper = Build.VERSION.SDK_INT >= 19 ? new HelperInternal19(textView)
-                : new HelperInternal();
-    }
-
-    /**
-     * Updates widget's TransformationMethod so that the transformed text can be processed.
-     * Should be called in the widget constructor. When used on devices running API 18 or below,
-     * this method does nothing.
-     *
-     * @see #wrapTransformationMethod(TransformationMethod)
-     */
-    public void updateTransformationMethod() {
-        mHelper.updateTransformationMethod();
-    }
-
-    /**
-     * Appends EmojiCompat InputFilters to the widget InputFilters. Should be called by {@link
-     * TextView#setFilters(InputFilter[])} to update the InputFilters. When used on devices running
-     * API 18 or below, this method returns {@code filters} that is given as a parameter.
-     *
-     * @param filters InputFilter array passed to {@link TextView#setFilters(InputFilter[])}
-     *
-     * @return same copy if the array already contains EmojiCompat InputFilter. A new array copy if
-     * not.
-     */
-    @NonNull
-    public InputFilter[] getFilters(@NonNull final InputFilter[] filters) {
-        return mHelper.getFilters(filters);
-    }
-
-    /**
-     * Returns transformation method that can update the transformed text to display emojis. When
-     * used on devices running API 18 or below, this method returns {@code transformationMethod}
-     * that is given as a parameter.
-     *
-     * @param transformationMethod instance to be wrapped
-     */
-    @Nullable
-    public TransformationMethod wrapTransformationMethod(
-            @Nullable TransformationMethod transformationMethod) {
-        return mHelper.wrapTransformationMethod(transformationMethod);
-    }
-
-    /**
-     * Call when allCaps is set on TextView. When used on devices running API 18 or below, this
-     * method does nothing.
-     *
-     * @param allCaps allCaps parameter passed to {@link TextView#setAllCaps(boolean)}
-     */
-    public void setAllCaps(boolean allCaps) {
-        mHelper.setAllCaps(allCaps);
-    }
-
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static class HelperInternal {
-
-        void updateTransformationMethod() {
-            // do nothing
-        }
-
-        InputFilter[] getFilters(@NonNull final InputFilter[] filters) {
-            return filters;
-        }
-
-        TransformationMethod wrapTransformationMethod(TransformationMethod transformationMethod) {
-            return transformationMethod;
-        }
-
-        void setAllCaps(boolean allCaps) {
-            // do nothing
-        }
-    }
-
-    @RequiresApi(19)
-    private static class HelperInternal19 extends HelperInternal {
-        private final TextView mTextView;
-        private final EmojiInputFilter mEmojiInputFilter;
-
-        HelperInternal19(TextView textView) {
-            mTextView = textView;
-            mEmojiInputFilter = new EmojiInputFilter(textView);
-        }
-
-        @Override
-        void updateTransformationMethod() {
-            final TransformationMethod tm = mTextView.getTransformationMethod();
-            if (tm != null && !(tm instanceof PasswordTransformationMethod)) {
-                mTextView.setTransformationMethod(wrapTransformationMethod(tm));
-            }
-        }
-
-        @Override
-        InputFilter[] getFilters(@NonNull final InputFilter[] filters) {
-            final int count = filters.length;
-            for (int i = 0; i < count; i++) {
-                if (filters[i] instanceof EmojiInputFilter) {
-                    return filters;
-                }
-            }
-            final InputFilter[] newFilters = new InputFilter[filters.length + 1];
-            System.arraycopy(filters, 0, newFilters, 0, count);
-            newFilters[count] = mEmojiInputFilter;
-            return newFilters;
-        }
-
-        @Override
-        TransformationMethod wrapTransformationMethod(TransformationMethod transformationMethod) {
-            if (transformationMethod instanceof EmojiTransformationMethod) {
-                return transformationMethod;
-            }
-            return new EmojiTransformationMethod(transformationMethod);
-        }
-
-        @Override
-        void setAllCaps(boolean allCaps) {
-            // When allCaps is set to false TextView sets the transformation method to be null. We
-            // are only interested when allCaps is set to true in order to wrap the original method.
-            if (allCaps) {
-                updateTransformationMethod();
-            }
-        }
-
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java
deleted file mode 100644
index c86f3e2..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java
+++ /dev/null
@@ -1,133 +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.emoji2.helpers;
-
-import android.text.Editable;
-import android.text.Selection;
-import android.text.Spannable;
-import android.widget.EditText;
-
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.emoji2.text.EmojiCompat;
-import androidx.emoji2.text.EmojiCompat.InitCallback;
-import androidx.emoji2.text.EmojiDefaults;
-
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-
-/**
- * TextWatcher used for an EditText.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(19)
-final class EmojiTextWatcher implements android.text.TextWatcher {
-    private final EditText mEditText;
-    private InitCallback mInitCallback;
-    private int mMaxEmojiCount = EmojiDefaults.MAX_EMOJI_COUNT;
-    @EmojiCompat.ReplaceStrategy
-    private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
-
-    EmojiTextWatcher(EditText editText) {
-        mEditText = editText;
-    }
-
-    void setMaxEmojiCount(int maxEmojiCount) {
-        this.mMaxEmojiCount = maxEmojiCount;
-    }
-
-    int getMaxEmojiCount() {
-        return mMaxEmojiCount;
-    }
-
-    @EmojiCompat.ReplaceStrategy int getEmojiReplaceStrategy() {
-        return mEmojiReplaceStrategy;
-    }
-
-    void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
-        mEmojiReplaceStrategy = replaceStrategy;
-    }
-
-    @Override
-    public void onTextChanged(CharSequence charSequence, final int start, final int before,
-            final int after) {
-        if (mEditText.isInEditMode()) {
-            return;
-        }
-
-        //before > after --> a deletion occurred
-        if (before <= after && charSequence instanceof Spannable) {
-            switch (EmojiCompat.get().getLoadState()){
-                case EmojiCompat.LOAD_STATE_SUCCEEDED:
-                    final Spannable s = (Spannable) charSequence;
-                    EmojiCompat.get().process(s, start, start + after, mMaxEmojiCount,
-                            mEmojiReplaceStrategy);
-                    break;
-                case EmojiCompat.LOAD_STATE_LOADING:
-                case EmojiCompat.LOAD_STATE_DEFAULT:
-                    EmojiCompat.get().registerInitCallback(getInitCallback());
-                    break;
-                case EmojiCompat.LOAD_STATE_FAILED:
-                default:
-                    break;
-            }
-        }
-    }
-
-    @Override
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-        // do nothing
-    }
-
-    @Override
-    public void afterTextChanged(Editable s) {
-        // do nothing
-    }
-
-    private InitCallback getInitCallback() {
-        if (mInitCallback == null) {
-            mInitCallback = new InitCallbackImpl(mEditText);
-        }
-        return mInitCallback;
-    }
-
-    @RequiresApi(19)
-    private static class InitCallbackImpl extends InitCallback {
-        private final Reference<EditText> mViewRef;
-
-        InitCallbackImpl(EditText editText) {
-            mViewRef = new WeakReference<>(editText);
-        }
-
-        @Override
-        public void onInitialized() {
-            super.onInitialized();
-            final EditText editText = mViewRef.get();
-            if (editText != null && editText.isAttachedToWindow()) {
-                final Editable text = editText.getEditableText();
-
-                final int selectionStart = Selection.getSelectionStart(text);
-                final int selectionEnd = Selection.getSelectionEnd(text);
-
-                EmojiCompat.get().process(text);
-
-                EmojiInputFilter.updateSelection(text, selectionStart, selectionEnd);
-            }
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTransformationMethod.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTransformationMethod.java
deleted file mode 100644
index 47484e5..0000000
--- a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/helpers/EmojiTransformationMethod.java
+++ /dev/null
@@ -1,74 +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.emoji2.helpers;
-
-import android.graphics.Rect;
-import android.text.method.TransformationMethod;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.emoji2.text.EmojiCompat;
-
-/**
- * TransformationMethod wrapper in order to update transformed text with emojis.
- *
- * @hide
- */
-@RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(19)
-class EmojiTransformationMethod implements TransformationMethod {
-    private final TransformationMethod mTransformationMethod;
-
-    EmojiTransformationMethod(TransformationMethod transformationMethod) {
-        mTransformationMethod = transformationMethod;
-    }
-
-    @Override
-    public CharSequence getTransformation(@Nullable CharSequence source, @NonNull final View view) {
-        if (view.isInEditMode()) {
-            return source;
-        }
-
-        if (mTransformationMethod != null) {
-            source = mTransformationMethod.getTransformation(source, view);
-        }
-
-        if (source != null) {
-            switch (EmojiCompat.get().getLoadState()){
-                case EmojiCompat.LOAD_STATE_SUCCEEDED:
-                    return EmojiCompat.get().process(source);
-                case EmojiCompat.LOAD_STATE_LOADING:
-                case EmojiCompat.LOAD_STATE_FAILED:
-                case EmojiCompat.LOAD_STATE_DEFAULT:
-                default:
-                    break;
-            }
-        }
-        return source;
-    }
-
-    @Override
-    public void onFocusChanged(final View view, final CharSequence sourceText,
-            final boolean focused, final int direction, final Rect previouslyFocusedRect) {
-        if (mTransformationMethod != null) {
-            mTransformationMethod.onFocusChanged(view, sourceText, focused, direction,
-                    previouslyFocusedRect);
-        }
-    }
-}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditTextHelper.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditTextHelper.java
new file mode 100644
index 0000000..90c9f82
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditTextHelper.java
@@ -0,0 +1,241 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import android.os.Build;
+import android.text.method.KeyListener;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.core.util.Preconditions;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.text.EmojiDefaults;
+import androidx.emoji2.text.EmojiSpan;
+
+/**
+ * Utility class to enhance custom EditText widgets with {@link EmojiCompat}.
+ * <p/>
+ * <pre>
+ * public class MyEmojiEditText extends EditText {
+ *      public MyEmojiEditText(Context context) {
+ *          super(context);
+ *          init();
+ *      }
+ *      // ...
+ *      private void init() {
+ *          super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
+ *      }
+ *
+ *      {@literal @}Override
+ *      public void setKeyListener(android.text.method.KeyListener keyListener) {
+ *          super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
+ *      }
+ *
+ *      {@literal @}Override
+ *      public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+ *          InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
+ *          return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
+ *      }
+ *
+ *      private EmojiEditTextHelper getEmojiEditTextHelper() {
+ *          if (mEmojiEditTextHelper == null) {
+ *              mEmojiEditTextHelper = new EmojiEditTextHelper(this);
+ *          }
+ *          return mEmojiEditTextHelper;
+ *      }
+ * }
+ * </pre>
+ *
+ */
+public final class EmojiEditTextHelper {
+    private final HelperInternal mHelper;
+    private int mMaxEmojiCount = EmojiDefaults.MAX_EMOJI_COUNT;
+    @EmojiCompat.ReplaceStrategy
+    private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
+
+    /**
+     * Default constructor.
+     *
+     * @param editText EditText instance
+     */
+    public EmojiEditTextHelper(@NonNull final EditText editText) {
+        Preconditions.checkNotNull(editText, "editText cannot be null");
+        mHelper = Build.VERSION.SDK_INT >= 19 ? new HelperInternal19(editText)
+                : new HelperInternal();
+    }
+
+    /**
+     * Set the maximum number of EmojiSpans to be added to a CharSequence. The number of spans in a
+     * CharSequence affects the performance of the EditText insert/delete operations. Insert/delete
+     * operations slow down as the number of spans increases.
+     * <p/>
+     *
+     * @param maxEmojiCount maximum number of EmojiSpans to be added to a single CharSequence,
+     *                      should be equal or greater than 0
+     *
+     * @see EmojiCompat#process(CharSequence, int, int, int)
+     */
+    public void setMaxEmojiCount(@IntRange(from = 0) int maxEmojiCount) {
+        Preconditions.checkArgumentNonnegative(maxEmojiCount,
+                "maxEmojiCount should be greater than 0");
+        mMaxEmojiCount = maxEmojiCount;
+        mHelper.setMaxEmojiCount(maxEmojiCount);
+    }
+
+    /**
+     * Returns the maximum number of EmojiSpans to be added to a CharSequence.
+     *
+     * @see #setMaxEmojiCount(int)
+     * @see EmojiCompat#process(CharSequence, int, int, int)
+     */
+    public int getMaxEmojiCount() {
+        return mMaxEmojiCount;
+    }
+
+    /**
+     * Attaches EmojiCompat KeyListener to the widget. Should be called from {@link
+     * TextView#setKeyListener(KeyListener)}. Existing keyListener is wrapped into EmojiCompat
+     * KeyListener. When used on devices running API 18 or below, this method returns
+     * {@code keyListener} that is given as a parameter.
+     *
+     * @param keyListener KeyListener passed into {@link TextView#setKeyListener(KeyListener)}
+     *
+     * @return a new KeyListener instance that wraps {@code keyListener}.
+     */
+    @SuppressWarnings("ExecutorRegistration")
+    @NonNull
+    public KeyListener getKeyListener(@NonNull final KeyListener keyListener) {
+        Preconditions.checkNotNull(keyListener, "keyListener cannot be null");
+        return mHelper.getKeyListener(keyListener);
+    }
+
+    /**
+     * Updates the InputConnection with emoji support. Should be called from {@link
+     * TextView#onCreateInputConnection(EditorInfo)}. When used on devices running API 18 or below,
+     * this method returns {@code inputConnection} that is given as a parameter. If
+     * {@code inputConnection} is {@code null}, returns {@code null}.
+     *
+     * @param inputConnection InputConnection instance created by TextView
+     * @param outAttrs        EditorInfo passed into
+     *                        {@link TextView#onCreateInputConnection(EditorInfo)}
+     *
+     * @return a new InputConnection instance that wraps {@code inputConnection}
+     */
+    @Nullable
+    public InputConnection onCreateInputConnection(@Nullable final InputConnection inputConnection,
+            @NonNull final EditorInfo outAttrs) {
+        if (inputConnection == null) return null;
+        return mHelper.onCreateInputConnection(inputConnection, outAttrs);
+    }
+
+    /**
+     * Sets whether to replace all emoji with {@link EmojiSpan}s. Default value is
+     * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+     *
+     * @param replaceStrategy should be one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+     *                        {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+     *                        {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+        mEmojiReplaceStrategy = replaceStrategy;
+        mHelper.setEmojiReplaceStrategy(replaceStrategy);
+    }
+
+    /**
+     * Returns whether to replace all emoji with {@link EmojiSpan}s. Default value is
+     * {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT}.
+     *
+     * @return one of {@link EmojiCompat#REPLACE_STRATEGY_DEFAULT},
+     *                        {@link EmojiCompat#REPLACE_STRATEGY_NON_EXISTENT},
+     *                        {@link EmojiCompat#REPLACE_STRATEGY_ALL}
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public int getEmojiReplaceStrategy() {
+        return mEmojiReplaceStrategy;
+    }
+
+    @SuppressWarnings("WeakerAccess") /* synthetic access */
+    static class HelperInternal {
+
+        KeyListener getKeyListener(@NonNull KeyListener keyListener) {
+            return keyListener;
+        }
+
+        InputConnection onCreateInputConnection(@NonNull InputConnection inputConnection,
+                @NonNull EditorInfo outAttrs) {
+            return inputConnection;
+        }
+
+        void setMaxEmojiCount(int maxEmojiCount) {
+            // do nothing
+        }
+
+        void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+            // do nothing
+        }
+    }
+
+    @RequiresApi(19)
+    private static class HelperInternal19 extends HelperInternal {
+        private final EditText mEditText;
+        private final EmojiTextWatcher mTextWatcher;
+
+        HelperInternal19(@NonNull EditText editText) {
+            mEditText = editText;
+            mTextWatcher = new EmojiTextWatcher(mEditText);
+            mEditText.addTextChangedListener(mTextWatcher);
+            mEditText.setEditableFactory(EmojiEditableFactory.getInstance());
+        }
+
+        @Override
+        void setMaxEmojiCount(int maxEmojiCount) {
+            mTextWatcher.setMaxEmojiCount(maxEmojiCount);
+        }
+
+        @Override
+        void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+            mTextWatcher.setEmojiReplaceStrategy(replaceStrategy);
+        }
+
+        @Override
+        KeyListener getKeyListener(@NonNull final KeyListener keyListener) {
+            if (keyListener instanceof EmojiKeyListener) {
+                return keyListener;
+            }
+            return new EmojiKeyListener(keyListener);
+        }
+
+        @Override
+        InputConnection onCreateInputConnection(@NonNull final InputConnection inputConnection,
+                @NonNull final EditorInfo outAttrs) {
+            if (inputConnection instanceof EmojiInputConnection) {
+                return inputConnection;
+            }
+            return new EmojiInputConnection(mEditText, inputConnection, outAttrs);
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditableFactory.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditableFactory.java
new file mode 100644
index 0000000..7e9c5a4
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiEditableFactory.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.emoji2.viewshelper;
+
+import android.annotation.SuppressLint;
+import android.text.Editable;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.emoji2.text.SpannableBuilder;
+
+/**
+ * EditableFactory used to improve editing operations on an EditText.
+ * <p>
+ * EditText uses DynamicLayout, which attaches to the Spannable instance that is being edited using
+ * ChangeWatcher. ChangeWatcher implements SpanWatcher and Textwatcher. Currently every delete/add
+ * operation is reported to DynamicLayout, for every span that has changed. For each change,
+ * DynamicLayout performs some expensive computations. i.e. if there is 100 EmojiSpans and the first
+ * span is deleted, DynamicLayout gets 99 calls about the change of position occurred in the
+ * remaining spans. This causes a huge delay in response time.
+ * <p>
+ * Since "android.text.DynamicLayout$ChangeWatcher" class is not a public class,
+ * EmojiEditableFactory checks if the watcher is in the classpath, and if so uses the modified
+ * Spannable which reduces the total number of calls to DynamicLayout for operations that affect
+ * EmojiSpans.
+ *
+ * @see SpannableBuilder
+ */
+final class EmojiEditableFactory extends Editable.Factory {
+    private static final Object INSTANCE_LOCK = new Object();
+    @GuardedBy("INSTANCE_LOCK")
+    private static volatile Editable.Factory sInstance;
+
+    @Nullable private static Class<?> sWatcherClass;
+
+    @SuppressLint("PrivateApi")
+    private EmojiEditableFactory() {
+        try {
+            String className = "android.text.DynamicLayout$ChangeWatcher";
+            sWatcherClass = Class.forName(className, false, getClass().getClassLoader());
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    @SuppressWarnings("GuardedBy")
+    public static Editable.Factory getInstance() {
+        if (sInstance == null) {
+            synchronized (INSTANCE_LOCK) {
+                if (sInstance == null) {
+                    sInstance = new EmojiEditableFactory();
+                }
+            }
+        }
+        return sInstance;
+    }
+
+    @Override
+    public Editable newEditable(@NonNull final CharSequence source) {
+        if (sWatcherClass != null) {
+            return SpannableBuilder.create(sWatcherClass, source);
+        }
+        return super.newEditable(source);
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputConnection.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputConnection.java
new file mode 100644
index 0000000..6513aba
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputConnection.java
@@ -0,0 +1,98 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import android.text.Editable;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputConnectionWrapper;
+import android.widget.TextView;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.emoji2.text.EmojiCompat;
+
+/**
+ * InputConnectionWrapper for EditText delete operations. Keyboard does not have knowledge about
+ * emojis and therefore might send commands to delete a part of the emoji sequence which creates
+ * invalid codeunits/getCodepointAt in the text.
+ * <p/>
+ * This class tries to correctly delete an emoji checking if there is an emoji span.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(19)
+final class EmojiInputConnection extends InputConnectionWrapper {
+    private final TextView mTextView;
+    private final EmojiCompatDeleteHelper mEmojiCompatDeleteHelper;
+
+    EmojiInputConnection(
+            @NonNull final TextView textView,
+            @NonNull final InputConnection inputConnection,
+            @NonNull final EditorInfo outAttrs) {
+        this(textView, inputConnection, outAttrs, new EmojiCompatDeleteHelper());
+    }
+
+    EmojiInputConnection(
+            @NonNull final TextView textView,
+            @NonNull final InputConnection inputConnection,
+            @NonNull final EditorInfo outAttrs,
+            @NonNull final EmojiCompatDeleteHelper emojiCompatDeleteHelper
+    ) {
+        super(inputConnection, false);
+        mTextView = textView;
+        mEmojiCompatDeleteHelper = emojiCompatDeleteHelper;
+        mEmojiCompatDeleteHelper.updateEditorInfoAttrs(outAttrs);
+    }
+
+    @Override
+    public boolean deleteSurroundingText(final int beforeLength, final int afterLength) {
+        final boolean result = mEmojiCompatDeleteHelper.handleDeleteSurroundingText(
+                this, getEditable(), beforeLength, afterLength, false /*inCodePoints*/);
+        return result || super.deleteSurroundingText(beforeLength, afterLength);
+    }
+
+    @Override
+    public boolean deleteSurroundingTextInCodePoints(final int beforeLength,
+            final int afterLength) {
+        final boolean result = mEmojiCompatDeleteHelper.handleDeleteSurroundingText(
+                this, getEditable(), beforeLength, afterLength, true /*inCodePoints*/);
+        return result || super.deleteSurroundingTextInCodePoints(beforeLength, afterLength);
+    }
+
+    private Editable getEditable() {
+        return mTextView.getEditableText();
+    }
+
+    public static class EmojiCompatDeleteHelper {
+        public boolean handleDeleteSurroundingText(
+                @NonNull final InputConnection inputConnection,
+                @NonNull final Editable editable,
+                @IntRange(from = 0) final int beforeLength,
+                @IntRange(from = 0) final int afterLength,
+                final boolean inCodePoints) {
+            return EmojiCompat.handleDeleteSurroundingText(inputConnection, editable,
+                    beforeLength, afterLength, inCodePoints);
+        }
+
+        public void updateEditorInfoAttrs(@NonNull final EditorInfo outAttrs) {
+            EmojiCompat.get().updateEditorInfoAttrs(outAttrs);
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputFilter.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputFilter.java
new file mode 100644
index 0000000..f3746de
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiInputFilter.java
@@ -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.emoji2.viewshelper;
+
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.Spanned;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.text.EmojiCompat.InitCallback;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+
+/**
+ * InputFilter to add EmojiSpans to the CharSequence set in a TextView. Unlike EditText where a
+ * TextWatcher is used to enhance the CharSequence, InputFilter is used on TextView. The reason is
+ * that if you add a TextWatcher to a TextView, its internal layout mechanism change, and therefore
+ * depending on the CharSequence provided, adding a TextWatcher might have performance side
+ * effects.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(19)
+final class EmojiInputFilter implements android.text.InputFilter {
+    private final TextView mTextView;
+    private InitCallback mInitCallback;
+
+    EmojiInputFilter(@NonNull final TextView textView) {
+        mTextView = textView;
+    }
+
+    @Override
+    public CharSequence filter(final CharSequence source, final int sourceStart,
+            final int sourceEnd, final Spanned dest, final int destStart, final int destEnd) {
+        if (mTextView.isInEditMode()) {
+            return source;
+        }
+
+        switch (EmojiCompat.get().getLoadState()){
+            case EmojiCompat.LOAD_STATE_SUCCEEDED:
+                boolean process = true;
+                if (destEnd == 0 && destStart == 0 && dest.length() == 0) {
+                    final CharSequence oldText = mTextView.getText();
+                    if (source == oldText) {
+                        process = false;
+                    }
+                }
+
+                if (process && source != null) {
+                    final CharSequence text;
+                    if (sourceStart == 0 && sourceEnd == source.length()) {
+                        text = source;
+                    } else {
+                        text = source.subSequence(sourceStart, sourceEnd);
+                    }
+                    return EmojiCompat.get().process(text, 0, text.length());
+                }
+
+                return source;
+            case EmojiCompat.LOAD_STATE_LOADING:
+            case EmojiCompat.LOAD_STATE_DEFAULT:
+                EmojiCompat.get().registerInitCallback(getInitCallback());
+                return source;
+
+            case EmojiCompat.LOAD_STATE_FAILED:
+            default:
+                return source;
+        }
+    }
+
+    private InitCallback getInitCallback() {
+        if (mInitCallback == null) {
+            mInitCallback = new InitCallbackImpl(mTextView);
+        }
+        return mInitCallback;
+    }
+
+    @RequiresApi(19)
+    private static class InitCallbackImpl extends InitCallback {
+        private final Reference<TextView> mViewRef;
+
+        InitCallbackImpl(TextView textView) {
+            mViewRef = new WeakReference<>(textView);
+        }
+
+        @Override
+        public void onInitialized() {
+            super.onInitialized();
+            final TextView textView = mViewRef.get();
+            if (textView != null && textView.isAttachedToWindow()) {
+                final CharSequence result = EmojiCompat.get().process(textView.getText());
+
+                final int selectionStart = Selection.getSelectionStart(result);
+                final int selectionEnd = Selection.getSelectionEnd(result);
+
+                textView.setText(result);
+
+                if (result instanceof Spannable) {
+                    updateSelection((Spannable) result, selectionStart, selectionEnd);
+                }
+            }
+        }
+    }
+
+    static void updateSelection(Spannable spannable, final int start, final int end) {
+        if (start >= 0 && end >= 0) {
+            Selection.setSelection(spannable, start, end);
+        } else if (start >= 0) {
+            Selection.setSelection(spannable, start);
+        } else if (end >= 0) {
+            Selection.setSelection(spannable, end);
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiKeyListener.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiKeyListener.java
new file mode 100644
index 0000000..67ddc72
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiKeyListener.java
@@ -0,0 +1,83 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import android.text.Editable;
+import android.text.method.KeyListener;
+import android.view.KeyEvent;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.emoji2.text.EmojiCompat;
+
+/**
+ * KeyListener class to handle delete operations correctly.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(19)
+final class EmojiKeyListener implements android.text.method.KeyListener {
+    private final android.text.method.KeyListener mKeyListener;
+    private final EmojiCompatHandleKeyDownHelper mEmojiCompatHandleKeyDownHelper;
+
+    EmojiKeyListener(android.text.method.KeyListener keyListener) {
+        this(keyListener, new EmojiCompatHandleKeyDownHelper());
+    }
+
+    EmojiKeyListener(KeyListener keyListener,
+            EmojiCompatHandleKeyDownHelper emojiCompatKeydownHelper) {
+        mKeyListener = keyListener;
+        mEmojiCompatHandleKeyDownHelper = emojiCompatKeydownHelper;
+    }
+
+    @Override
+    public int getInputType() {
+        return mKeyListener.getInputType();
+    }
+
+    @Override
+    public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
+        final boolean result = mEmojiCompatHandleKeyDownHelper
+                .handleKeyDown(content, keyCode, event);
+        return result || mKeyListener.onKeyDown(view, content, keyCode, event);
+    }
+
+    @Override
+    public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
+        return mKeyListener.onKeyUp(view, text, keyCode, event);
+    }
+
+    @Override
+    public boolean onKeyOther(View view, Editable text, KeyEvent event) {
+        return mKeyListener.onKeyOther(view, text, event);
+    }
+
+    @Override
+    public void clearMetaKeyState(View view, Editable content, int states) {
+        mKeyListener.clearMetaKeyState(view, content, states);
+    }
+
+    public static class EmojiCompatHandleKeyDownHelper {
+        public boolean handleKeyDown(@NonNull final Editable editable, final int keyCode,
+                @NonNull final KeyEvent event) {
+            return EmojiCompat.handleOnKeyDown(editable, keyCode, event);
+        }
+    }
+
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextViewHelper.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextViewHelper.java
new file mode 100644
index 0000000..2280f0c
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextViewHelper.java
@@ -0,0 +1,495 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import android.os.Build;
+import android.text.InputFilter;
+import android.text.method.PasswordTransformationMethod;
+import android.text.method.TransformationMethod;
+import android.util.SparseArray;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.core.util.Preconditions;
+import androidx.emoji2.text.EmojiCompat;
+
+/**
+ * Utility class to enhance custom TextView widgets with {@link EmojiCompat}.
+ * <pre>
+ * public class MyEmojiTextView extends TextView {
+ *     public MyEmojiTextView(Context context) {
+ *         super(context);
+ *         init();
+ *     }
+ *     // ..
+ *     private void init() {
+ *         getEmojiTextViewHelper().updateTransformationMethod();
+ *     }
+ *
+ *     {@literal @}Override
+ *     public void setFilters(InputFilter[] filters) {
+ *         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
+ *     }
+ *
+ *     {@literal @}Override
+ *     public void setAllCaps(boolean allCaps) {
+ *         super.setAllCaps(allCaps);
+ *         getEmojiTextViewHelper().setAllCaps(allCaps);
+ *     }
+ *
+ *     private EmojiTextViewHelper getEmojiTextViewHelper() {
+ *         if (mEmojiTextViewHelper == null) {
+ *             mEmojiTextViewHelper = new EmojiTextViewHelper(this);
+ *         }
+ *         return mEmojiTextViewHelper;
+ *     }
+ * }
+ * </pre>
+ */
+public final class EmojiTextViewHelper {
+
+    private final HelperInternal mHelper;
+
+    /**
+     * Default constructor.
+     *
+     * @param textView TextView instance
+     */
+    public EmojiTextViewHelper(@NonNull TextView textView) {
+        this(textView, true);
+    }
+
+    /**
+     * Allows skipping of all processing until EmojiCompat.init is called.
+     *
+     * This is useful when integrating EmojiTextViewHelper into libraries that subclass TextView
+     * that do not have control over EmojiCompat initialization by the app that uses the TextView
+     * subclass.
+     *
+     * If this helper is initialized prior to EmojiCompat.init, the TextView it's configuring
+     * will not display emoji using EmojiCompat after init is called until the transformation
+     * method and filter are updated. The easiest way to do that is call
+     * {@link EmojiTextViewHelper#setEnabled(boolean)}.
+     *
+     * @param textView TextView instance
+     * @param expectInitializedEmojiCompat if true, this helper will assume init has been called
+     *                                     and throw if it has not. If false, the methods on this
+     *                                     helper will have no effect until EmojiCompat.init is
+     *                                     called.
+     */
+    public EmojiTextViewHelper(@NonNull TextView textView, boolean expectInitializedEmojiCompat) {
+        Preconditions.checkNotNull(textView, "textView cannot be null");
+        if (Build.VERSION.SDK_INT < 19) {
+            mHelper = new HelperInternal();
+        } else if (!expectInitializedEmojiCompat) {
+            mHelper = new SkippingHelper19(textView);
+        } else {
+            mHelper = new HelperInternal19(textView);
+        }
+    }
+
+    /**
+     * Updates widget's TransformationMethod so that the transformed text can be processed.
+     * Should be called in the widget constructor. When used on devices running API 18 or below,
+     * this method does nothing.
+     *
+     * @see #wrapTransformationMethod(TransformationMethod)
+     */
+    public void updateTransformationMethod() {
+        mHelper.updateTransformationMethod();
+    }
+
+    /**
+     * Appends EmojiCompat InputFilters to the widget InputFilters. Should be called by {@link
+     * TextView#setFilters(InputFilter[])} to update the InputFilters. When used on devices running
+     * API 18 or below, this method returns {@code filters} that is given as a parameter.
+     *
+     * @param filters InputFilter array passed to {@link TextView#setFilters(InputFilter[])}
+     *
+     * @return same copy if the array already contains EmojiCompat InputFilter. A new array copy if
+     * not.
+     */
+    @SuppressWarnings("ArrayReturn")
+    @NonNull
+    public InputFilter[] getFilters(
+            @SuppressWarnings("ArrayReturn") @NonNull final InputFilter[] filters) {
+        return mHelper.getFilters(filters);
+    }
+
+    /**
+     * Returns transformation method that can update the transformed text to display emojis. When
+     * used on devices running API 18 or below, this method returns {@code transformationMethod}
+     * that is given as a parameter.
+     *
+     * @param transformationMethod instance to be wrapped
+     */
+    @Nullable
+    public TransformationMethod wrapTransformationMethod(
+            @Nullable TransformationMethod transformationMethod) {
+        return mHelper.wrapTransformationMethod(transformationMethod);
+    }
+
+    /**
+     * When enabled, methods will have their documented behavior.
+     *
+     * When disabled, all methods will have no effect and emoji will not be processed.
+     *
+     * Setting this to disable will also have the side effect of setting both the transformation
+     * method and filter if enabled has changed since the last call. By default
+     * EmojiTextViewHelper is enabled.
+     *
+     * You do not need to call {@link EmojiTextViewHelper#updateTransformationMethod()} again after
+     * calling setEnabled.
+     *
+     * @param enabled if this helper should process emoji.
+     */
+    public void setEnabled(boolean enabled) {
+        mHelper.setEnabled(enabled);
+    }
+
+    /**
+     * Call when allCaps is set on TextView. When used on devices running API 18 or below, this
+     * method does nothing.
+     *
+     * @param allCaps allCaps parameter passed to {@link TextView#setAllCaps(boolean)}
+     */
+    public void setAllCaps(boolean allCaps) {
+        mHelper.setAllCaps(allCaps);
+    }
+
+    /**
+     * @return current enabled state for this helper
+     */
+    public boolean isEnabled() {
+        return mHelper.isEnabled();
+    }
+
+    @SuppressWarnings("WeakerAccess") /* synthetic access */
+    static class HelperInternal {
+
+        void updateTransformationMethod() {
+            // do nothing
+        }
+
+        @NonNull
+        InputFilter[] getFilters(@NonNull final InputFilter[] filters) {
+            return filters;
+        }
+
+        @Nullable
+        TransformationMethod wrapTransformationMethod(
+                @Nullable TransformationMethod transformationMethod) {
+            return transformationMethod;
+        }
+
+        void setAllCaps(boolean allCaps) {
+            // do nothing
+        }
+
+        void setEnabled(boolean processEmoji) {
+            // do nothing
+        }
+
+        public boolean isEnabled() {
+            return false;
+        }
+    }
+
+    /**
+     * This helper allows EmojiTextViewHelper to skip all calls to EmojiCompat until
+     * {@link EmojiCompat#isConfigured()} returns true on devices that are 19+.
+     *
+     * When isConfigured returns true, this delegates to {@link HelperInternal19} to provide
+     * EmojiCompat behavior. This has the effect of making EmojiCompat calls a "no-op" when
+     * EmojiCompat is not configured on a device.
+     *
+     * There is no mechanism to be informed when isConfigured becomes true as it will lead to
+     * likely memory leaks in situations where isConfigured never becomes true, and it is the
+     * responsibility of the caller to call
+     * {@link EmojiTextViewHelper#updateTransformationMethod()} after configuring EmojiCompat if
+     * TextView's using EmojiTextViewHelper are already displayed to the user.
+     */
+    @RequiresApi(19)
+    private static class SkippingHelper19 extends HelperInternal {
+        private final HelperInternal19 mHelperDelegate;
+
+        SkippingHelper19(TextView textView) {
+            mHelperDelegate = new HelperInternal19(textView);
+        }
+
+
+        private boolean skipBecauseEmojiCompatNotInitialized() {
+            return !EmojiCompat.isConfigured();
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * This method will have no effect if !{@link EmojiCompat#isConfigured()}
+         */
+        @Override
+        void updateTransformationMethod() {
+            if (skipBecauseEmojiCompatNotInitialized()) {
+                return;
+            }
+            mHelperDelegate.updateTransformationMethod();
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * This method will have no effect if !{@link EmojiCompat#isConfigured()}
+         */
+        @NonNull
+        @Override
+        InputFilter[] getFilters(@NonNull InputFilter[] filters) {
+            if (skipBecauseEmojiCompatNotInitialized()) {
+                return filters;
+            }
+            return mHelperDelegate.getFilters(filters);
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * This method will have no effect if !{@link EmojiCompat#isConfigured()}
+         */
+        @Nullable
+        @Override
+        TransformationMethod wrapTransformationMethod(
+                @Nullable TransformationMethod transformationMethod) {
+            if (skipBecauseEmojiCompatNotInitialized()) {
+                return transformationMethod;
+            }
+            return mHelperDelegate.wrapTransformationMethod(transformationMethod);
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * This method will have no effect if !{@link EmojiCompat#isConfigured()}
+         */
+        @Override
+        void setAllCaps(boolean allCaps) {
+            if (skipBecauseEmojiCompatNotInitialized()) {
+                return;
+            }
+            mHelperDelegate.setAllCaps(allCaps);
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * This method will track enabled, but have no other effect if
+         * !{@link EmojiCompat#isConfigured()}
+         */
+        @Override
+        void setEnabled(boolean processEmoji) {
+            if (skipBecauseEmojiCompatNotInitialized()) {
+                mHelperDelegate.setEnabledUnsafe(processEmoji);
+            } else {
+                mHelperDelegate.setEnabled(processEmoji);
+            }
+        }
+
+        @Override
+        public boolean isEnabled() {
+            return mHelperDelegate.isEnabled();
+        }
+    }
+
+    @RequiresApi(19)
+    private static class HelperInternal19 extends HelperInternal {
+        private final TextView mTextView;
+        private final EmojiInputFilter mEmojiInputFilter;
+        private boolean mEnabled;
+
+        HelperInternal19(TextView textView) {
+            mTextView = textView;
+            mEnabled = true;
+            mEmojiInputFilter = new EmojiInputFilter(textView);
+        }
+
+
+        @Override
+        void updateTransformationMethod() {
+            // since this is not a pure function, we need to have a side effect for both enabled
+            // and disabled
+            final TransformationMethod tm =
+                    wrapTransformationMethod(mTextView.getTransformationMethod());
+            mTextView.setTransformationMethod(tm);
+        }
+
+        /**
+         * Call whenever mEnabled changes
+         */
+        private void updateFilters() {
+            InputFilter[] oldFilters = mTextView.getFilters();
+            mTextView.setFilters(getFilters(oldFilters));
+        }
+
+        @NonNull
+        @Override
+        InputFilter[] getFilters(@NonNull final InputFilter[] filters) {
+            if (!mEnabled) {
+                // remove any EmojiInputFilter when disabled
+                return removeEmojiInputFilterIfPresent(filters);
+            } else {
+                return addEmojiInputFilterIfMissing(filters);
+            }
+        }
+
+        /**
+         * Make sure that EmojiInputFilter is present in filters, or add it.
+         *
+         * @param filters to check
+         * @return filters with mEmojiInputFilter added, if not previously present
+         */
+        @NonNull
+        private InputFilter[] addEmojiInputFilterIfMissing(@NonNull InputFilter[] filters) {
+            final int count = filters.length;
+            for (int i = 0; i < count; i++) {
+                if (filters[i] == mEmojiInputFilter) {
+                    return filters;
+                }
+            }
+            final InputFilter[] newFilters = new InputFilter[filters.length + 1];
+            System.arraycopy(filters, 0, newFilters, 0, count);
+            newFilters[count] = mEmojiInputFilter;
+            return newFilters;
+        }
+
+        /**
+         * Remove all EmojiInputFilter from filters
+         *
+         * @return filters.filter { it !== mEmojiInputFilter }
+         */
+        @NonNull
+        private InputFilter[] removeEmojiInputFilterIfPresent(@NonNull InputFilter[] filters) {
+            // find out the new size after removing (all) EmojiInputFilter
+            SparseArray<InputFilter> filterSet = getEmojiInputFilterPositionArray(filters);
+            if (filterSet.size() == 0) {
+                return filters;
+            }
+
+
+            final int inCount = filters.length;
+            int outCount = filters.length - filterSet.size();
+            InputFilter[] result = new InputFilter[outCount];
+            int destPosition = 0;
+            for (int srcPosition = 0; srcPosition < inCount; srcPosition++) {
+                if (filterSet.indexOfKey(srcPosition) < 0) {
+                    result[destPosition] = filters[srcPosition];
+                    destPosition++;
+                }
+            }
+            return result;
+        }
+
+        /**
+         * Populate a sparse array with true for all indexes that contain an EmojiInputFilter.
+         */
+        private SparseArray<InputFilter> getEmojiInputFilterPositionArray(
+                @NonNull InputFilter[] filters) {
+            SparseArray<InputFilter> result = new SparseArray<>(1);
+            for (int pos = 0; pos < filters.length; pos++) {
+                if (filters[pos] instanceof EmojiInputFilter) {
+                    result.put(pos, filters[pos]);
+                }
+            }
+            return result;
+        }
+
+        @Nullable
+        @Override
+        TransformationMethod wrapTransformationMethod(
+                @Nullable TransformationMethod transformationMethod) {
+            if (mEnabled) {
+                return wrapForEnabled(transformationMethod);
+            } else {
+                return unwrapForDisabled(transformationMethod);
+            }
+        }
+
+        /**
+         * Unwrap EmojiTransformationMethods safely.
+         */
+        @Nullable
+        private TransformationMethod unwrapForDisabled(
+                @Nullable TransformationMethod transformationMethod) {
+            if (transformationMethod instanceof EmojiTransformationMethod) {
+                EmojiTransformationMethod etm =
+                        (EmojiTransformationMethod) transformationMethod;
+                return etm.getOriginalTransformationMethod();
+            } else {
+                return transformationMethod;
+            }
+        }
+
+        /**
+         * Wrap in EmojiTransformationMethod, but don't double wrap.
+         *
+         * This will not wrap {@link PasswordTransformationMethod}.
+         */
+        @NonNull
+        private TransformationMethod wrapForEnabled(
+                @Nullable TransformationMethod transformationMethod) {
+            if (transformationMethod instanceof EmojiTransformationMethod) {
+                return transformationMethod;
+            } else if (transformationMethod instanceof PasswordTransformationMethod) {
+                return transformationMethod;
+            } else {
+                return new EmojiTransformationMethod(transformationMethod);
+            }
+        }
+
+        @Override
+        void setAllCaps(boolean allCaps) {
+            // When allCaps is set to false TextView sets the transformation method to be null. We
+            // are only interested when allCaps is set to true in order to wrap the original method.
+            if (allCaps) {
+                updateTransformationMethod();
+            }
+        }
+
+        @Override
+        void setEnabled(boolean enabled) {
+            mEnabled = enabled;
+            updateTransformationMethod();
+            updateFilters();
+        }
+
+        @Override
+        public boolean isEnabled() {
+            return mEnabled;
+        }
+
+        /**
+         * Call to set enabled without side effects. Should only be used when EmojiCompat is not
+         * initialized.
+         *
+         * @param processEmoji when true, this helper will process emoji
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        void setEnabledUnsafe(boolean processEmoji) {
+            mEnabled = processEmoji;
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextWatcher.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextWatcher.java
new file mode 100644
index 0000000..73d5653
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTextWatcher.java
@@ -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.emoji2.viewshelper;
+
+import android.text.Editable;
+import android.text.Selection;
+import android.text.Spannable;
+import android.widget.EditText;
+
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.text.EmojiCompat.InitCallback;
+import androidx.emoji2.text.EmojiDefaults;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+
+/**
+ * TextWatcher used for an EditText.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(19)
+final class EmojiTextWatcher implements android.text.TextWatcher {
+    private final EditText mEditText;
+    private InitCallback mInitCallback;
+    private int mMaxEmojiCount = EmojiDefaults.MAX_EMOJI_COUNT;
+    @EmojiCompat.ReplaceStrategy
+    private int mEmojiReplaceStrategy = EmojiCompat.REPLACE_STRATEGY_DEFAULT;
+
+    EmojiTextWatcher(EditText editText) {
+        mEditText = editText;
+    }
+
+    void setMaxEmojiCount(int maxEmojiCount) {
+        this.mMaxEmojiCount = maxEmojiCount;
+    }
+
+    int getMaxEmojiCount() {
+        return mMaxEmojiCount;
+    }
+
+    @EmojiCompat.ReplaceStrategy int getEmojiReplaceStrategy() {
+        return mEmojiReplaceStrategy;
+    }
+
+    void setEmojiReplaceStrategy(@EmojiCompat.ReplaceStrategy int replaceStrategy) {
+        mEmojiReplaceStrategy = replaceStrategy;
+    }
+
+    @Override
+    public void onTextChanged(CharSequence charSequence, final int start, final int before,
+            final int after) {
+        if (mEditText.isInEditMode()) {
+            return;
+        }
+
+        //before > after --> a deletion occurred
+        if (before <= after && charSequence instanceof Spannable) {
+            switch (EmojiCompat.get().getLoadState()){
+                case EmojiCompat.LOAD_STATE_SUCCEEDED:
+                    final Spannable s = (Spannable) charSequence;
+                    EmojiCompat.get().process(s, start, start + after, mMaxEmojiCount,
+                            mEmojiReplaceStrategy);
+                    break;
+                case EmojiCompat.LOAD_STATE_LOADING:
+                case EmojiCompat.LOAD_STATE_DEFAULT:
+                    EmojiCompat.get().registerInitCallback(getInitCallback());
+                    break;
+                case EmojiCompat.LOAD_STATE_FAILED:
+                default:
+                    break;
+            }
+        }
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        // do nothing
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        // do nothing
+    }
+
+    private InitCallback getInitCallback() {
+        if (mInitCallback == null) {
+            mInitCallback = new InitCallbackImpl(mEditText);
+        }
+        return mInitCallback;
+    }
+
+    @RequiresApi(19)
+    private static class InitCallbackImpl extends InitCallback {
+        private final Reference<EditText> mViewRef;
+
+        InitCallbackImpl(EditText editText) {
+            mViewRef = new WeakReference<>(editText);
+        }
+
+        @Override
+        public void onInitialized() {
+            super.onInitialized();
+            final EditText editText = mViewRef.get();
+            if (editText != null && editText.isAttachedToWindow()) {
+                final Editable text = editText.getEditableText();
+
+                final int selectionStart = Selection.getSelectionStart(text);
+                final int selectionEnd = Selection.getSelectionEnd(text);
+
+                EmojiCompat.get().process(text);
+
+                EmojiInputFilter.updateSelection(text, selectionStart, selectionEnd);
+            }
+        }
+    }
+}
diff --git a/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTransformationMethod.java b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTransformationMethod.java
new file mode 100644
index 0000000..bd3561f
--- /dev/null
+++ b/emoji2/emoji2-views-helper/src/main/java/androidx/emoji2/viewshelper/EmojiTransformationMethod.java
@@ -0,0 +1,83 @@
+/*
+ * 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.emoji2.viewshelper;
+
+import android.graphics.Rect;
+import android.text.method.TransformationMethod;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.emoji2.text.EmojiCompat;
+
+/**
+ * TransformationMethod wrapper in order to update transformed text with emojis.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@RequiresApi(19)
+class EmojiTransformationMethod implements TransformationMethod {
+    @Nullable
+    private final TransformationMethod mTransformationMethod;
+
+    EmojiTransformationMethod(@Nullable TransformationMethod transformationMethod) {
+        mTransformationMethod = transformationMethod;
+    }
+
+    @Override
+    public CharSequence getTransformation(@Nullable CharSequence source, @NonNull final View view) {
+        if (view.isInEditMode()) {
+            return source;
+        }
+
+        if (mTransformationMethod != null) {
+            source = mTransformationMethod.getTransformation(source, view);
+        }
+
+        if (source != null) {
+            switch (EmojiCompat.get().getLoadState()){
+                case EmojiCompat.LOAD_STATE_SUCCEEDED:
+                    return EmojiCompat.get().process(source);
+                case EmojiCompat.LOAD_STATE_LOADING:
+                case EmojiCompat.LOAD_STATE_FAILED:
+                case EmojiCompat.LOAD_STATE_DEFAULT:
+                default:
+                    break;
+            }
+        }
+        return source;
+    }
+
+    @Override
+    public void onFocusChanged(final View view, final CharSequence sourceText,
+            final boolean focused, final int direction, final Rect previouslyFocusedRect) {
+        if (mTransformationMethod != null) {
+            mTransformationMethod.onFocusChanged(view, sourceText, focused, direction,
+                    previouslyFocusedRect);
+        }
+    }
+
+    /**
+     * Get the original transformation method that this is wrapping
+     * @return any transformation methods this emoji transformation method was wrapping
+     */
+    public TransformationMethod getOriginalTransformationMethod() {
+        return mTransformationMethod;
+    }
+}
diff --git a/emoji2/emoji2-views/api/current.txt b/emoji2/emoji2-views/api/current.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/current.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/public_plus_experimental_current.txt b/emoji2/emoji2-views/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..b77930a
--- /dev/null
+++ b/emoji2/emoji2-views/api/public_plus_experimental_current.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(@androidx.emoji2.text.EmojiCompat.ReplaceStrategy int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/res-current.txt b/emoji2/emoji2-views/api/res-current.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji2/emoji2-views/api/res-current.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji2/emoji2-views/api/restricted_current.txt b/emoji2/emoji2-views/api/restricted_current.txt
new file mode 100644
index 0000000..b77930a
--- /dev/null
+++ b/emoji2/emoji2-views/api/restricted_current.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(@androidx.emoji2.text.EmojiCompat.ReplaceStrategy int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/build.gradle b/emoji2/emoji2-views/build.gradle
index 5a66a08..a7b3177 100644
--- a/emoji2/emoji2-views/build.gradle
+++ b/emoji2/emoji2-views/build.gradle
@@ -21,9 +21,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils-runtime')
 }
 
@@ -37,7 +37,7 @@
 
 androidx {
     name = "Android Emoji2 Compat Views"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.EMOJI2
     mavenGroup = LibraryGroups.EMOJI2
     inceptionYear = "2017"
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
index 08d5465..373e03e 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
@@ -24,7 +24,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.widget.TextViewCompat;
-import androidx.emoji2.helpers.EmojiTextViewHelper;
+import androidx.emoji2.viewshelper.EmojiTextViewHelper;
 
 /**
  * Button widget enhanced with emoji capability by using {@link EmojiTextViewHelper}. When used
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public void setFilters(@NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
index b0925a6..b7dbdc3 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
@@ -27,8 +27,8 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.widget.TextViewCompat;
-import androidx.emoji2.helpers.EmojiEditTextHelper;
 import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.viewshelper.EmojiEditTextHelper;
 
 /**
  * EditText widget enhanced with emoji capability by using {@link EmojiEditTextHelper}. When used
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
index fb7443c..6f625f8 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
@@ -30,9 +30,9 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.widget.TextViewCompat;
-import androidx.emoji2.helpers.EmojiEditTextHelper;
 import androidx.emoji2.text.EmojiCompat;
 import androidx.emoji2.text.EmojiSpan;
+import androidx.emoji2.viewshelper.EmojiEditTextHelper;
 
 /**
  * ExtractEditText widget enhanced with emoji capability by using {@link EmojiEditTextHelper}.
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
index 137deb2..d32dcf3 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
@@ -24,7 +24,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.widget.TextViewCompat;
-import androidx.emoji2.helpers.EmojiTextViewHelper;
+import androidx.emoji2.viewshelper.EmojiTextViewHelper;
 
 /**
  * TextView widget enhanced with emoji capability by using {@link EmojiTextViewHelper}. When used
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public void setFilters(@NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
diff --git a/emoji2/emoji2/api/current.txt b/emoji2/emoji2/api/current.txt
new file mode 100644
index 0000000..f69bb70
--- /dev/null
+++ b/emoji2/emoji2/api/current.txt
@@ -0,0 +1,106 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.EmojiCompat.Config? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/public_plus_experimental_current.txt b/emoji2/emoji2/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..f69bb70
--- /dev/null
+++ b/emoji2/emoji2/api/public_plus_experimental_current.txt
@@ -0,0 +1,106 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.EmojiCompat.Config? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/res-current.txt b/emoji2/emoji2/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/emoji2/emoji2/api/res-current.txt
diff --git a/emoji2/emoji2/api/restricted_current.txt b/emoji2/emoji2/api/restricted_current.txt
new file mode 100644
index 0000000..f69bb70
--- /dev/null
+++ b/emoji2/emoji2/api/restricted_current.txt
@@ -0,0 +1,106 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.EmojiCompat.Config? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method public boolean hasEmojiGlyph(CharSequence);
+    method public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/build.gradle b/emoji2/emoji2/build.gradle
index fd53536..ef1872e 100644
--- a/emoji2/emoji2/build.gradle
+++ b/emoji2/emoji2/build.gradle
@@ -13,8 +13,12 @@
 
 BundleInsideHelper.forInsideAar(
     project,
-    /* from = */ "com.google.flatbuffers",
-    /* to =   */ "androidx.text.emoji.flatbuffer"
+    [
+            new BundleInsideHelper.Relocation("com.google.flatbuffers",
+                    "androidx.emoji2.text.flatbuffer"),
+            new BundleInsideHelper.Relocation("androidx.text.emoji.flatbuffer",
+                    "androidx.emoji2.text.flatbuffer")
+    ]
 )
 
 dependencies {
@@ -28,15 +32,15 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation project(':internal-testutils-runtime')
 }
 
 androidx {
     name = "Android Emoji2 Compat"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.EMOJI2
     mavenGroup = LibraryGroups.EMOJI2
     inceptionYear = "2017"
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java
index 91c85b6..a03db5a 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/DefaultEmojiCompatConfig.java
@@ -322,14 +322,20 @@
     @RequiresApi(28)
     public static class DefaultEmojiCompatConfigHelper_API28
             extends DefaultEmojiCompatConfigHelper_API19 {
+        @SuppressWarnings("deprecation") // using deprecated API to match exact behavior in core
         @Override
         @NonNull
         public Signature[] getSigningSignatures(@NonNull PackageManager packageManager,
                 @NonNull String providerPackage)
                 throws PackageManager.NameNotFoundException {
+            // This uses the deprecated GET_SIGNATURES currently to match the behavior in Core.
+            // When that behavior changes, we will need to update this method.
+
+            // Alternatively, you may at that time introduce a new config option that allows
+            // skipping signature validations to avoid this code sync.
             PackageInfo packageInfoForSignatures = packageManager.getPackageInfo(providerPackage,
-                    PackageManager.GET_SIGNING_CERTIFICATES);
-            return packageInfoForSignatures.signingInfo.getSigningCertificateHistory();
+                    PackageManager.GET_SIGNATURES);
+            return packageInfoForSignatures.signatures;
         }
     }
 }
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
index 94ecef2..e45f2d6 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
@@ -379,12 +379,46 @@
     }
 
     /**
+     * Return true if EmojiCompat has been configured by a successful call to
+     * {@link EmojiCompat#init}.
+     *
+     * You can use this to check if {@link EmojiCompat#get()} will return a valid EmojiCompat
+     * instance.
+     *
+     * This function does not check the {@link #getLoadState()} and will return true even if the
+     * font is still loading, or has failed to load.
+     *
+     * @return true if EmojiCompat has been successfully initialized.
+     */
+    @SuppressWarnings("GuardedBy") // same rationale as double-check lock
+    public static boolean isConfigured() {
+        // Note: this is true immediately after calling .init(Config).
+        //
+        // These are three situations this may return false
+        //   1) An app has disabled EmojiCompatInitializer and does not intend to call .init.
+        //   2) EmojiCompatInitializer did not find a configuration
+        //   3) EmojiCompatInitializer was disable or failed, and the app will call .init. In the
+        //   future it will return true.
+        //
+        // In case one and two, this method will always return false for the duration of the
+        // application lifecycle.
+        //
+        // In case three, this will return true at some future point. There is no callback
+        // mechanism to learn about the init call due to the high potential for leaked references
+        // in a static context if it's actually case 2 (when using manual callback registration).
+        //
+        // It is recommended that applications call init prior to creating any screens that
+        // may show emoji or user generated content.
+        return sInstance != null;
+    }
+
+
+    /**
      * Used by the tests to reset EmojiCompat with a new configuration. Every time it is called a
      * new instance is created with the new configuration.
      *
      * @hide
      */
-    @RestrictTo(TESTS)
     @NonNull
     public static EmojiCompat reset(@NonNull final Config config) {
         synchronized (INSTANCE_LOCK) {
@@ -527,6 +561,7 @@
      *
      * @see #unregisterInitCallback(InitCallback)
      */
+    @SuppressWarnings("ExecutorRegistration")
     public void registerInitCallback(@NonNull InitCallback initCallback) {
         Preconditions.checkNotNull(initCallback, "initCallback cannot be null");
 
@@ -946,6 +981,7 @@
          *
          * @param loaderCallback callback to signal the loading state
          */
+        @SuppressWarnings("ExecutorRegistration")
         void load(@NonNull MetadataRepoLoaderCallback loaderCallback);
     }
 
@@ -1067,6 +1103,7 @@
          *
          * @return EmojiCompat.Config instance
          */
+        @SuppressWarnings("ExecutorRegistration")
         @NonNull
         public Config registerInitCallback(@NonNull InitCallback initCallback) {
             Preconditions.checkNotNull(initCallback, "initCallback cannot be null");
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
index 2be308f..b5714595 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompatInitializer.java
@@ -49,8 +49,6 @@
  *     </provider>
  * </pre>
  *
- * For more information see {@link https://developer.android.com/topic/libraries/app-startup#manual}
- *
  * @see androidx.emoji2.text.DefaultEmojiCompatConfig
  */
 public class EmojiCompatInitializer implements Initializer<Boolean> {
@@ -65,7 +63,8 @@
     @Override
     public Boolean create(@NonNull Context context) {
         // note: super create requires this be non-null, share if the configuration was successful
-        return EmojiCompat.init(context) != null;
+        // TODO(b/187328685): re-enable this after investigating startup performance
+        return false;
     }
 
     /**
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
index 8f15f52..7244296 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
@@ -28,8 +28,8 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
-import androidx.text.emoji.flatbuffer.MetadataItem;
-import androidx.text.emoji.flatbuffer.MetadataList;
+import androidx.emoji2.text.flatbuffer.MetadataItem;
+import androidx.emoji2.text.flatbuffer.MetadataList;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
index 28f39ef..145af0d 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
@@ -79,7 +79,8 @@
 
     @Override
     public int getSize(@NonNull final Paint paint,
-            @SuppressLint("UnknownNullness") final CharSequence text,
+            @SuppressLint("UnknownNullness") @SuppressWarnings("MissingNullability")
+            final CharSequence text,
             final int start,
             final int end,
             @Nullable final Paint.FontMetricsInt fm) {
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
index 674202d..2ed42e0 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
@@ -22,7 +22,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
-import androidx.text.emoji.flatbuffer.MetadataList;
+import androidx.emoji2.text.flatbuffer.MetadataList;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
index 27afc5d..bc31e26 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
@@ -25,7 +25,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.util.Preconditions;
-import androidx.text.emoji.flatbuffer.MetadataList;
+import androidx.emoji2.text.flatbuffer.MetadataList;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/enterprise/feedback/lint-baseline.xml b/enterprise/feedback/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/enterprise/feedback/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/enterprise/feedback/testing/lint-baseline.xml b/enterprise/feedback/testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/enterprise/feedback/testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/exifinterface/exifinterface/build.gradle b/exifinterface/exifinterface/build.gradle
index ce8edbe..5aed262 100644
--- a/exifinterface/exifinterface/build.gradle
+++ b/exifinterface/exifinterface/build.gradle
@@ -8,13 +8,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
diff --git a/exifinterface/exifinterface/lint-baseline.xml b/exifinterface/exifinterface/lint-baseline.xml
index 1cd9c9f..9542238 100644
--- a/exifinterface/exifinterface/lint-baseline.xml
+++ b/exifinterface/exifinterface/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                fileDescriptor = Os.dup(fileDescriptor);"
         errorLine2="                                    ~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                Os.lseek(fd, 0, OsConstants.SEEK_CUR);"
         errorLine2="                   ~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET);"
         errorLine2="                       ~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET);"
         errorLine2="                       ~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET);"
         errorLine2="                           ~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    newFileDescriptor = Os.dup(mSeekableFileDescriptor);"
         errorLine2="                                           ~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    Os.lseek(newFileDescriptor, 0, OsConstants.SEEK_SET);"
         errorLine2="                       ~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.exifinterface.media.ExifInterface is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.exifinterface.media.ExifInterface is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                retriever.setDataSource(new MediaDataSource() {"
         errorLine2="                          ~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.exifinterface.media.ExifInterfaceUtils is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.exifinterface.media.ExifInterfaceUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                Os.close(fd);"
         errorLine2="                   ~~~~~">
         <location
diff --git a/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java b/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
index a2c919f..3b2ab30 100644
--- a/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
+++ b/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterface.java
@@ -5961,6 +5961,9 @@
                 if (DEBUG) {
                     Log.d(TAG, "Heif meta: " + width + "x" + height + ", rotation " + rotation);
                 }
+            } catch (RuntimeException e) {
+                throw new UnsupportedOperationException("Failed to read EXIF from HEIF file. "
+                        + "Given stream is either malformed or unsupported.");
             } finally {
                 retriever.release();
             }
diff --git a/fragment/fragment-ktx/lint-baseline.xml b/fragment/fragment-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/fragment/fragment-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/fragment/fragment-lint/lint-baseline.xml b/fragment/fragment-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/fragment/fragment-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
index 4848927..c0dc727 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
@@ -30,6 +30,8 @@
         FragmentTagDetector.ISSUE,
         UnsafeFragmentLifecycleObserverDetector.BACK_PRESSED_ISSUE,
         UnsafeFragmentLifecycleObserverDetector.LIVEDATA_ISSUE,
-        UseRequireInsteadOfGet.ISSUE
+        UseRequireInsteadOfGet.ISSUE,
+        UseGetLayoutInflater.ISSUE,
+        OnCreateDialogIncorrectCallbackDetector.ISSUE
     )
 }
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt
new file mode 100644
index 0000000..b462e88
--- /dev/null
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt
@@ -0,0 +1,156 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.fragment.lint
+
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.isKotlin
+import com.intellij.psi.impl.source.PsiClassReferenceType
+import org.jetbrains.kotlin.psi.psiUtil.getSuperNames
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.kotlin.KotlinUClass
+import org.jetbrains.uast.visitor.AbstractUastVisitor
+
+/**
+ * When using a `DialogFragment`, the `setOnCancelListener` and `setOnDismissListener` callback
+ * functions within the `onCreateDialog` function __must not be used__
+ * because the `DialogFragment` owns these callbacks. Instead the respective `onCancel` and
+ * `onDismiss` functions can be used to achieve the desired effect.
+ */
+class OnCreateDialogIncorrectCallbackDetector : Detector(), SourceCodeScanner {
+
+    companion object Issues {
+        val ISSUE = Issue.create(
+            id = "DialogFragmentCallbacksDetector",
+            briefDescription = "Use onCancel() and onDismiss() instead of calling " +
+                "setOnCancelListener() and setOnDismissListener() from onCreateDialog()",
+            explanation = """When using a `DialogFragment`, the `setOnCancelListener` and \
+                `setOnDismissListener` callback functions within the `onCreateDialog` function \
+                 __must not be used__ because the `DialogFragment` owns these callbacks. \
+                 Instead the respective `onCancel` and `onDismiss` functions can be used to \
+                 achieve the desired effect.""",
+            category = Category.CORRECTNESS,
+            severity = Severity.WARNING,
+            implementation = Implementation(
+                OnCreateDialogIncorrectCallbackDetector::class.java,
+                Scope.JAVA_FILE_SCOPE
+            ),
+            androidSpecific = true
+        )
+    }
+
+    override fun getApplicableUastTypes(): List<Class<out UElement>>? {
+        return listOf(UClass::class.java)
+    }
+
+    override fun createUastHandler(context: JavaContext): UElementHandler? {
+        return UastHandler(context)
+    }
+
+    private inner class UastHandler(val context: JavaContext) : UElementHandler() {
+        override fun visitClass(node: UClass) {
+            if (isKotlin(context.psiFile) && (node as KotlinUClass).ktClass!!.getSuperNames()[0] !=
+                DIALOG_FRAGMENT_CLASS
+            ) {
+                return
+            }
+
+            if (!isKotlin(context.psiFile) &&
+                (node.uastSuperTypes[0].type as PsiClassReferenceType)
+                    .className != DIALOG_FRAGMENT_CLASS
+            ) {
+                return
+            }
+
+            node.methods.forEach {
+                if (it.name == ENTRY_METHOD) {
+                    val visitor = UastMethodsVisitor(context, it.name)
+                    it.uastBody?.accept(visitor)
+                }
+            }
+        }
+    }
+
+    /**
+     * A UAST Visitor that explores all method calls within a
+     * [androidx.fragment.app.DialogFragment] callback to check for an incorrect method call.
+     *
+     * @param context The context of the lint request.
+     * @param containingMethodName The name of the originating Fragment lifecycle method.
+     */
+    private class UastMethodsVisitor(
+        private val context: JavaContext,
+        private val containingMethodName: String
+    ) : AbstractUastVisitor() {
+        private val visitedMethods = mutableSetOf<UCallExpression>()
+
+        override fun visitCallExpression(node: UCallExpression): Boolean {
+            if (visitedMethods.contains(node)) {
+                return super.visitCallExpression(node)
+            }
+
+            val methodName = node.methodIdentifier?.name ?: return super.visitCallExpression(node)
+
+            when (methodName) {
+                SET_ON_CANCEL_LISTENER -> {
+                    report(
+                        context = context,
+                        node = node,
+                        message = "Use onCancel() instead of calling setOnCancelListener() " +
+                            "from onCreateDialog()"
+                    )
+                    visitedMethods.add(node)
+                }
+                SET_ON_DISMISS_LISTENER -> {
+                    report(
+                        context = context,
+                        node = node,
+                        message = "Use onDismiss() instead of calling setOnDismissListener() " +
+                            "from onCreateDialog()"
+                    )
+                    visitedMethods.add(node)
+                }
+            }
+            return super.visitCallExpression(node)
+        }
+
+        private fun report(context: JavaContext, node: UCallExpression, message: String) {
+            context.report(
+                issue = ISSUE,
+                location = context.getLocation(node),
+                message = message,
+                quickfixData = null
+            )
+        }
+    }
+}
+
+private const val ENTRY_METHOD = "onCreateDialog"
+private const val DIALOG_FRAGMENT_CLASS = "DialogFragment"
+private const val SET_ON_CANCEL_LISTENER = "setOnCancelListener"
+private const val SET_ON_DISMISS_LISTENER = "setOnDismissListener"
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt
new file mode 100644
index 0000000..1710a1f
--- /dev/null
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt
@@ -0,0 +1,129 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.fragment.lint
+
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.LintFix
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.isKotlin
+import com.intellij.psi.PsiMethod
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.getContainingUClass
+
+/**
+ * Lint check for detecting calls to [android.view.LayoutInflater.from]
+ * while being invoked from DialogFragment
+ */
+class UseGetLayoutInflater : Detector(), SourceCodeScanner {
+
+    companion object Issues {
+        val ISSUE = Issue.create(
+            id = "UseGetLayoutInflater",
+            briefDescription = "Use getLayoutInflater() to get the LayoutInflater instead of " +
+                "calling LayoutInflater.from(Context).",
+            explanation = """Using LayoutInflater.from(Context) can return a LayoutInflater  \
+                that does not have the correct theme.""",
+            category = Category.CORRECTNESS,
+            priority = 9,
+            severity = Severity.WARNING,
+            implementation = Implementation(
+                UseGetLayoutInflater::class.java,
+                Scope.JAVA_FILE_SCOPE
+            ),
+            androidSpecific = true
+        )
+    }
+
+    override fun getApplicableMethodNames(): List<String>? {
+        return listOf(UNWANTED_METHOD)
+    }
+
+    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+        val containingClass = method.containingClass ?: return
+        val evaluator = context.evaluator
+        if (evaluator.getQualifiedName(containingClass) == UNWANTED_CLASS &&
+            evaluator.getParameterCount(method) == 1
+        ) {
+            if (!isKotlin(context.psiFile)) {
+                startLintForJava(context, node)
+            } else {
+                startLintForKotlin(context, node)
+            }
+        }
+    }
+
+    private fun startLintForJava(context: JavaContext, node: UCallExpression) {
+        if (node.getContainingUClass()?.superClassType?.name != DIALOG_FRAGMENT_CLASS) {
+            return
+        }
+        val methodParameter = node.valueArguments[0].toString()
+
+        context.report(
+            issue = ISSUE,
+            location = context.getLocation(node),
+            message = "Use of LayoutInflater.from($methodParameter) detected. Consider using " +
+                "${correctMethod(context)} instead",
+            quickfixData = createFix(correctMethod(context), methodParameter)
+        )
+    }
+
+    private fun startLintForKotlin(context: JavaContext, node: UCallExpression) {
+        if (node.getContainingUClass()?.javaPsi?.text?.contains
+            ("$DIALOG_FRAGMENT_CLASS()") == false
+        ) {
+            return
+        }
+
+        context.report(
+            issue = ISSUE,
+            location = context.getLocation(node),
+            message = "Use of LayoutInflater.from(Context) detected. Consider using " +
+                "${correctMethod(context)} instead",
+            quickfixData = null
+        )
+    }
+
+    private fun correctMethod(context: JavaContext): String {
+        return if (isKotlin(context.psiFile)) {
+            "layoutInflater"
+        } else {
+            "getLayoutInflater()"
+        }
+    }
+
+    private fun createFix(correctMethod: String, parameter: String?): LintFix {
+        return fix()
+            .replace()
+            .text("LayoutInflater.from($parameter)")
+            .name("Replace with $correctMethod")
+            .with(correctMethod)
+            .autoFix()
+            .build()
+    }
+}
+
+private const val UNWANTED_CLASS = "android.view.LayoutInflater"
+private const val UNWANTED_METHOD = "from"
+private const val DIALOG_FRAGMENT_CLASS = "DialogFragment"
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetectorTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetectorTest.kt
new file mode 100644
index 0000000..c67cd41
--- /dev/null
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetectorTest.kt
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.fragment.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/* ktlint-disable max-line-length */
+@RunWith(JUnit4::class)
+class OnCreateDialogIncorrectCallbackDetectorTest : LintDetectorTest() {
+
+    override fun getDetector(): Detector = OnCreateDialogIncorrectCallbackDetector()
+
+    override fun getIssues(): MutableList<Issue> {
+        return mutableListOf(OnCreateDialogIncorrectCallbackDetector.ISSUE)
+    }
+
+    private val dialogFragmentCorrectImplementationStubJava = java(
+        """
+            package foo;
+            import android.app.Dialog;
+            import android.content.DialogInterface;
+            import android.os.Bundle;
+            import androidx.appcompat.app.AlertDialog;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends DialogFragment {
+                @NonNull
+                @Override
+                public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+                    Dialog dialog = AlertDialog.Builder(requireActivity());
+                    return dialog.create();
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentCorrectImplementationStubKotlin = kotlin(
+        """
+            package foo
+            import android.app.Dialog
+            import android.content.DialogInterface
+            import android.os.Bundle
+            import androidx.appcompat.app.AlertDialog
+            import androidx.fragment.app.DialogFragment
+            class TestDialog : DialogFragment() {
+                override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+                    val dialog = AlertDialog.Builder(requireActivity())
+                    return dialog.create()
+                }
+                override fun onCancel(dialog: DialogInterface) {
+                    super.onCancel(dialog)
+                }
+
+                override fun onDismiss(dialog: DialogInterface) {
+                    super.onDismiss(dialog)
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubJavaWithCancelListener = java(
+        """
+            package foo;
+            import android.app.Dialog;
+            import android.content.DialogInterface;
+            import android.os.Bundle;
+            import androidx.appcompat.app.AlertDialog;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends DialogFragment {
+                @Override
+                public Dialog onCreateDialog(Bundle savedInstanceState) {
+                    Dialog dialog = AlertDialog.Builder(requireActivity());
+                    dialog.setOnCancelListener({ });
+                    return dialog.create();
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubJavaWithDismissListener = java(
+        """
+            package foo;
+            import android.app.Dialog;
+            import android.content.DialogInterface;
+            import android.os.Bundle;
+            import androidx.appcompat.app.AlertDialog;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends DialogFragment {
+                @Override
+                public Dialog onCreateDialog(Bundle savedInstanceState) {
+                    Dialog dialog = AlertDialog.Builder(requireActivity());
+                    dialog.setOnDismissListener({ });
+                    return dialog.create();
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubKotlinWithCancelListener = kotlin(
+        """
+            package foo
+            import android.app.Dialog
+            import android.content.DialogInterface
+            import android.os.Bundle
+            import androidx.appcompat.app.AlertDialog
+            import androidx.fragment.app.DialogFragment
+            class TestDialog : DialogFragment() {
+                override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+                    val dialog = AlertDialog.Builder(requireActivity())
+                    dialog.setOnCancelListener { }
+                    return dialog.create()
+                }
+
+                override fun onDismiss(dialog: DialogInterface) {
+                    super.onDismiss(dialog)
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubKotlinWithDismissListener = kotlin(
+        """
+            package foo
+            import android.app.Dialog
+            import android.content.DialogInterface
+            import android.os.Bundle
+            import androidx.appcompat.app.AlertDialog
+            import androidx.fragment.app.DialogFragment
+            class TestDialog : DialogFragment() {
+                override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+                    val dialog = AlertDialog.Builder(requireActivity())
+                    dialog.setOnDismissListener { }
+                    return dialog.create()
+                }
+
+                override fun onCancel(dialog: DialogInterface) {
+                    super.onCancel(dialog)
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubKotlinWithDismissAndCancelListeners = kotlin(
+        """
+            package foo
+            import android.app.Dialog
+            import android.content.DialogInterface
+            import android.os.Bundle
+            import androidx.appcompat.app.AlertDialog
+            import androidx.fragment.app.DialogFragment
+            class TestDialog : DialogFragment() {
+                override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+                    val dialog = AlertDialog.Builder(requireActivity())
+                    dialog.setOnDismissListener { }
+                    dialog.setOnCancelListener { }
+                    return dialog.create()
+                }
+            }
+            """
+    ).indented()
+
+    @Test
+    fun `java expect fail dialog fragment with cancel listener`() {
+        lint().files(dialogFragmentStubJavaWithCancelListener)
+            .run()
+            .expect(
+                """
+src/foo/TestFragment.java:11: Warning: Use onCancel() instead of calling setOnCancelListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnCancelListener({ });
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+    }
+
+    @Test
+    fun `java expect fail dialog fragment with dismiss listener`() {
+        lint().files(dialogFragmentStubJavaWithDismissListener)
+            .run()
+            .expect(
+                """
+src/foo/TestFragment.java:11: Warning: Use onDismiss() instead of calling setOnDismissListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnDismissListener({ });
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+    }
+
+    @Test
+    fun `java expect clean dialog fragment`() {
+        lint().files(dialogFragmentCorrectImplementationStubJava)
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun `kotlin expect fail dialog fragment with cancel listener`() {
+        lint().files(dialogFragmentStubKotlinWithCancelListener)
+            .run()
+            .expect(
+                """
+src/foo/TestDialog.kt:10: Warning: Use onCancel() instead of calling setOnCancelListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnCancelListener { }
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+    }
+
+    @Test
+    fun `kotlin expect fail dialog fragment with dismiss listener`() {
+        lint().files(dialogFragmentStubKotlinWithDismissListener)
+            .run()
+            .expect(
+                """
+src/foo/TestDialog.kt:10: Warning: Use onDismiss() instead of calling setOnDismissListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnDismissListener { }
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+    }
+
+    @Test
+    fun `kotlin expect fail dialog fragment with dismiss and cancel listeners`() {
+        lint().files(dialogFragmentStubKotlinWithDismissAndCancelListeners)
+            .run()
+            .expect(
+                """
+src/foo/TestDialog.kt:10: Warning: Use onDismiss() instead of calling setOnDismissListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnDismissListener { }
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/foo/TestDialog.kt:11: Warning: Use onCancel() instead of calling setOnCancelListener() from onCreateDialog() [DialogFragmentCallbacksDetector]
+        dialog.setOnCancelListener { }
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+            .expectWarningCount(2)
+    }
+
+    @Test
+    fun `kotlin expect clean dialog fragment`() {
+        lint().files(dialogFragmentCorrectImplementationStubKotlin)
+            .run()
+            .expectClean()
+    }
+}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UseGetLayoutInflaterTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UseGetLayoutInflaterTest.kt
new file mode 100644
index 0000000..6da2e21
--- /dev/null
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/UseGetLayoutInflaterTest.kt
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.fragment.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/* ktlint-enable max-line-length */
+/* ktlint-disable max-line-length */
+@RunWith(JUnit4::class)
+class UseGetLayoutInflaterTest : LintDetectorTest() {
+
+    override fun getDetector(): Detector = UseGetLayoutInflater()
+
+    override fun getIssues(): MutableList<Issue> = mutableListOf(UseGetLayoutInflater.ISSUE)
+
+    private val dialogFragmentCorrectImplementationStubJava = java(
+        """
+            package foo;
+            import android.os.Bundle;
+            import android.view.View;
+            import android.view.ViewGroup;
+            import androidx.annotation.NonNull;
+            import androidx.annotation.Nullable;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends DialogFragment {
+                @NonNull
+                @Override
+                public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+                    getLayoutInflater().inflate(R.layout.some_layout, null);
+                    return super.onCreateDialog(savedInstanceState);
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentCorrectImplementationStubKotlin = kotlin(
+        """
+            package foo
+            import android.app.Dialog
+            import android.os.Bundle
+            import androidx.fragment.app.DialogFragment
+            class Test : DialogFragment() {
+                override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+                    layoutInflater.inflate(R.layout.some_layout, null)
+                    return super.onCreateDialog(savedInstanceState)
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubJava = java(
+        """
+            package foo;
+            import android.os.Bundle;
+            import android.view.LayoutInflater;
+            import android.view.LayoutInflater123;
+            import android.view.View;
+            import android.view.ViewGroup;
+            import androidx.annotation.NonNull;
+            import androidx.annotation.Nullable;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends DialogFragment {
+                @Nullable
+                @Override
+                public View onCreateView(@NonNull LayoutInflater inflater,
+                                            @Nullable ViewGroup container,
+                                            @Nullable Bundle savedInstanceState) {
+                    LayoutInflater li = LayoutInflater.from(requireContext());
+                    // this  will not be triggered
+                    LayoutInflater123 li123 = LayoutInflater123.from(requireContext());
+                    return super.onCreateView(inflater, container, savedInstanceState);
+                }
+            }
+            """
+    ).indented()
+
+    private val fragmentStubJava = java(
+        """
+            package foo;
+            import android.os.Bundle;
+            import android.view.LayoutInflater;
+            import android.view.View;
+            import android.view.ViewGroup;
+            import androidx.annotation.NonNull;
+            import androidx.annotation.Nullable;
+            import androidx.fragment.app.DialogFragment;
+            public class TestFragment extends Fragment {
+                @Nullable
+                @Override
+                public View onCreateView(@NonNull LayoutInflater inflater,
+                                            @Nullable ViewGroup container,
+                                            @Nullable Bundle savedInstanceState) {
+                    LayoutInflater li = LayoutInflater.from(requireContext());
+                    return super.onCreateView(inflater, container, savedInstanceState);
+                }
+            }
+            """
+    ).indented()
+
+    private val dialogFragmentStubKotlin = kotlin(
+        """
+            package foo
+            import android.os.Bundle
+            import android.view.LayoutInflater
+            import android.view.View
+            import android.view.ViewGroup
+            import androidx.annotation.NonNull
+            import androidx.annotation.Nullable
+            import androidx.fragment.app.DialogFragment
+            class TestFragment : DialogFragment() {
+                override fun onCreateView(inflater: LayoutInflater,
+                                            container: ViewGroup?,
+                                            savedInstanceState: Bundle?): View? {
+                    val li = LayoutInflater.from(requireContext())
+                    return super.onCreateView(inflater, container, savedInstanceState)
+                }
+            }
+            """
+    ).indented()
+
+    private val fragmentStubKotlin = kotlin(
+        """
+            package foo
+            import android.os.Bundle
+            import android.view.LayoutInflater
+            import android.view.View
+            import android.view.ViewGroup
+            import androidx.annotation.NonNull
+            import androidx.annotation.Nullable
+            import androidx.fragment.app.DialogFragment
+            class TestFragment : Fragment() {
+                fun someFunction() {
+                    val li = LayoutInflater.from(requireContext())
+                }
+            }
+            """
+    ).indented()
+
+    @Test
+    fun `java expect fail dialog fragment with fix`() {
+        lint().files(dialogFragmentStubJava)
+            .run()
+            .expect(
+                """
+src/foo/TestFragment.java:16: Warning: Use of LayoutInflater.from(requireContext()) detected. Consider using getLayoutInflater() instead [UseGetLayoutInflater]
+        LayoutInflater li = LayoutInflater.from(requireContext());
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+            .expectFixDiffs(
+                """
+                    Fix for src/foo/TestFragment.java line 16: Replace with getLayoutInflater():
+                    @@ -16 +16
+                    -         LayoutInflater li = LayoutInflater.from(requireContext());
+                    +         LayoutInflater li = getLayoutInflater();
+                """.trimIndent()
+            )
+    }
+
+    @Test
+    fun `java expect clean non dialog fragment`() {
+        lint().files(fragmentStubJava)
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun `java expect clean dialog fragment`() {
+        lint().files(dialogFragmentCorrectImplementationStubJava)
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun `kotlin expect fail dialog fragment`() {
+        lint().files(dialogFragmentStubKotlin)
+            .run()
+            .expect(
+                """
+src/foo/TestFragment.kt:13: Warning: Use of LayoutInflater.from(Context) detected. Consider using layoutInflater instead [UseGetLayoutInflater]
+        val li = LayoutInflater.from(requireContext())
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+            """
+            )
+            .expectWarningCount(1)
+    }
+
+    @Test
+    fun `kotlin expect clean non dialog fragment`() {
+        lint().files(fragmentStubKotlin)
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun `kotlin expect clean dialog fragment`() {
+        lint().files(dialogFragmentCorrectImplementationStubKotlin)
+            .run()
+            .expectClean()
+    }
+}
diff --git a/fragment/fragment-testing-lint/lint-baseline.xml b/fragment/fragment-testing-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/fragment/fragment-testing-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/fragment/fragment-testing/build.gradle b/fragment/fragment-testing/build.gradle
index 716c481..6c9828d 100644
--- a/fragment/fragment-testing/build.gradle
+++ b/fragment/fragment-testing/build.gradle
@@ -36,8 +36,8 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 
     lintPublish(project(":fragment:fragment-testing-lint"))
 }
diff --git a/fragment/fragment-testing/lint-baseline.xml b/fragment/fragment-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/fragment/fragment-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/fragment/fragment-truth/lint-baseline.xml b/fragment/fragment-truth/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/fragment/fragment-truth/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index 8939d1c..83ddaab 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -196,6 +196,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
   public class FragmentController {
@@ -286,6 +287,7 @@
     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();
@@ -304,6 +306,7 @@
     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
   }
@@ -452,3 +455,62 @@
 
 }
 
+package androidx.fragment.app.strictmode {
+
+  public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public FragmentReuseViolation();
+  }
+
+  public final class FragmentStrictMode {
+    method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
+    method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
+  }
+
+  public static interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.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 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);
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
+  }
+
+  public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public FragmentTagUsageViolation();
+  }
+
+  public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public RetainInstanceUsageViolation();
+  }
+
+  public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public SetUserVisibleHintViolation();
+  }
+
+  public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public TargetFragmentUsageViolation();
+  }
+
+  public abstract class Violation extends java.lang.RuntimeException {
+    ctor public Violation();
+  }
+
+  public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
+    ctor public WrongFragmentContainerViolation();
+  }
+
+}
+
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index 860326d..6cb05d1 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -196,6 +196,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
   public class FragmentController {
@@ -276,7 +277,6 @@
     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 @androidx.fragment.app.FragmentStateManagerControl public static void enableNewStateManager(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);
@@ -287,7 +287,7 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
     method public boolean isDestroyed();
     method public boolean isStateSaved();
     method public void popBackStack();
@@ -306,7 +306,7 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public void setStrictModePolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy?);
+    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
   }
@@ -370,9 +370,6 @@
     method public void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
   }
 
-  @experimental.Experimental(level=androidx.annotation.experimental.Experimental.Level.WARNING) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface FragmentStateManagerControl {
-  }
-
   @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);
@@ -460,11 +457,11 @@
 
 package androidx.fragment.app.strictmode {
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public FragmentReuseViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentStrictMode {
+  public final class FragmentStrictMode {
     method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentReuse(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentTagUsage(androidx.fragment.app.Fragment);
@@ -475,15 +472,15 @@
     method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static interface FragmentStrictMode.OnViolationListener {
+  public static interface FragmentStrictMode.OnViolationListener {
     method public void onViolation(androidx.fragment.app.strictmode.Violation);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static final class FragmentStrictMode.Policy {
+  public static final class FragmentStrictMode.Policy {
     field public static final androidx.fragment.app.strictmode.FragmentStrictMode.Policy LAX;
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static final class FragmentStrictMode.Policy.Builder {
+  public static final class FragmentStrictMode.Policy.Builder {
     ctor public FragmentStrictMode.Policy.Builder();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy build();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentReuse();
@@ -497,27 +494,27 @@
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public FragmentTagUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public RetainInstanceUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public SetUserVisibleHintViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public TargetFragmentUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public abstract class Violation extends java.lang.RuntimeException {
+  public abstract class Violation extends java.lang.RuntimeException {
     ctor public Violation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public WrongFragmentContainerViolation();
   }
 
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 4131205..680d7b8 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -201,6 +201,7 @@
     ctor public FragmentContainerView(android.content.Context);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?);
     ctor public FragmentContainerView(android.content.Context, android.util.AttributeSet?, int);
+    method public <F extends androidx.fragment.app.Fragment> F? getFragment();
   }
 
   public class FragmentController {
@@ -291,7 +292,7 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
+    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();
@@ -311,7 +312,7 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public void setStrictModePolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy?);
+    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
   }
@@ -486,11 +487,11 @@
 
 package androidx.fragment.app.strictmode {
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class FragmentReuseViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public FragmentReuseViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentStrictMode {
+  public final class FragmentStrictMode {
     method public static androidx.fragment.app.strictmode.FragmentStrictMode.Policy getDefaultPolicy();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentReuse(androidx.fragment.app.Fragment);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static void onFragmentTagUsage(androidx.fragment.app.Fragment);
@@ -501,15 +502,15 @@
     method public static void setDefaultPolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static interface FragmentStrictMode.OnViolationListener {
+  public static interface FragmentStrictMode.OnViolationListener {
     method public void onViolation(androidx.fragment.app.strictmode.Violation);
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static final class FragmentStrictMode.Policy {
+  public static final class FragmentStrictMode.Policy {
     field public static final androidx.fragment.app.strictmode.FragmentStrictMode.Policy LAX;
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public static final class FragmentStrictMode.Policy.Builder {
+  public static final class FragmentStrictMode.Policy.Builder {
     ctor public FragmentStrictMode.Policy.Builder();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy build();
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectFragmentReuse();
@@ -523,27 +524,27 @@
     method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder penaltyLog();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class FragmentTagUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public FragmentTagUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public RetainInstanceUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class SetUserVisibleHintViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public SetUserVisibleHintViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class TargetFragmentUsageViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public TargetFragmentUsageViolation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public abstract class Violation extends java.lang.RuntimeException {
+  public abstract class Violation extends java.lang.RuntimeException {
     ctor public Violation();
   }
 
-  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
+  public final class WrongFragmentContainerViolation extends androidx.fragment.app.strictmode.Violation {
     ctor public WrongFragmentContainerViolation();
   }
 
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 57dd500..7a33127 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -10,11 +10,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-
     testOptions {
         unitTests {
             includeAndroidResources = true
@@ -58,9 +53,9 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(MULTIDEX)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
diff --git a/fragment/fragment/lint-baseline.xml b/fragment/fragment/lint-baseline.xml
index fbef9dd..6dd6d46 100644
--- a/fragment/fragment/lint-baseline.xml
+++ b/fragment/fragment/lint-baseline.xml
@@ -1,42 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mView.cancelPendingInputEvents();"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/fragment/app/Fragment.java"
-            line="2929"
+            line="2922"
             column="35"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.fragment.app.FragmentContainerView is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            child.dispatchApplyWindowInsets(new WindowInsets(insets));"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.fragment.app.FragmentContainerView is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        mApplyWindowInsetsListener.onApplyWindowInsets(this, insets)"
+        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/fragment/app/FragmentContainerView.java"
-            line="221"
-            column="19"/>
+            line="231"
+            column="52"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.fragment.app.FragmentContainerView is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
-        errorLine1="            child.dispatchApplyWindowInsets(new WindowInsets(insets));"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/fragment/app/FragmentContainerView.java"
-            line="221"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                transition.removeListener(this);"
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
@@ -46,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                transition.addListener(this);"
         errorLine2="                           ~~~~~~~~~~~">
         <location
@@ -57,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                transition.removeListener(this);"
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
@@ -68,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                transition.removeListener(this);"
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
index f674bbd..e6509f1 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentTest.kt
@@ -25,6 +25,7 @@
 import android.view.View
 import android.view.ViewGroup
 import android.widget.EditText
+import android.widget.FrameLayout
 import android.widget.TextView
 import androidx.fragment.app.test.EmptyFragmentTestActivity
 import androidx.fragment.test.R
@@ -34,6 +35,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.testutils.withActivity
+import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Rule
 import org.junit.Test
@@ -87,6 +89,21 @@
 
     @UiThreadTest
     @Test
+    fun testDialogFragmentCreateFragmentContainer() {
+        val parentDialogfragment = ContainerDialogFragment()
+        parentDialogfragment.showNow(activityTestRule.activity.supportFragmentManager, null)
+
+        val fragment = StrictViewFragment(R.layout.fragment_a)
+
+        parentDialogfragment.childFragmentManager.beginTransaction()
+            .add(R.id.fragmentContainer, fragment)
+            .commitNow()
+
+        assertThat(fragment.requireView().parent).isEqualTo(parentDialogfragment.requireView())
+    }
+
+    @UiThreadTest
+    @Test
     fun testDialogFragmentSetShowDialog() {
         val fragment = TestDialogFragment(true)
         fragment.showNow(activityTestRule.activity.supportFragmentManager, null)
@@ -470,4 +487,21 @@
                 .create()
         }
     }
+
+    class WrappedDialog(innerContext: Context) : Dialog(innerContext) {
+        override fun setContentView(view: View) {
+            super.setContentView(
+                FrameLayout(context).apply {
+                    id = R.id.fragmentContainer
+                    addView(view)
+                }
+            )
+        }
+    }
+
+    class ContainerDialogFragment : DialogFragment(R.layout.simple_container) {
+        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+            return WrappedDialog(requireContext())
+        }
+    }
 }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
index 818e033..5bc6cdf 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentContainerViewTest.kt
@@ -27,6 +27,8 @@
 import android.view.ViewGroup
 import android.view.WindowInsets
 import android.view.animation.Animation
+import androidx.core.app.ActivityCompat
+import androidx.core.view.ViewCompat
 import androidx.fragment.app.test.FragmentTestActivity
 import androidx.fragment.test.R
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -211,6 +213,28 @@
         assertThat(dispatchedToChild2).isEqualTo(1)
     }
 
+    @Suppress("DEPRECATION") /* systemWindowInsets */
+    @SdkSuppress(minSdkVersion = 29) // WindowInsets.Builder requires API 29
+    @Test
+    fun onApplyWindowInsets() {
+        val fragmentContainerView = FragmentContainerView(context)
+        var calledListener = false
+        fragmentContainerView.fitsSystemWindows = true
+
+        val sentInsets = WindowInsets.Builder()
+            .setSystemWindowInsets(Insets.of(4, 3, 2, 1))
+            .build()
+
+        ViewCompat.setOnApplyWindowInsetsListener(fragmentContainerView) { _, insets ->
+            calledListener = true
+            insets
+        }
+
+        fragmentContainerView.onApplyWindowInsets(sentInsets)
+
+        assertThat(calledListener).isFalse()
+    }
+
     @Test
     fun addView() {
         val view = View(context)
@@ -673,6 +697,66 @@
         assertThat(drawnFirst!!).isEqualTo(frag2View)
     }
 
+    @Test
+    fun getFragmentNoneAdded() {
+        val fragmentContainerView = ActivityCompat.requireViewById<FragmentContainerView>(
+            activityRule.activity,
+            R.id.fragment_container_view
+        )
+
+        assertThat(fragmentContainerView.getFragment<StrictViewFragment>()).isNull()
+    }
+
+    @Test
+    fun getFragmentTwoAdds() {
+        val fragmentContainerView = ActivityCompat.requireViewById<FragmentContainerView>(
+            activityRule.activity,
+            R.id.fragment_container_view
+        )
+        val fm = activityRule.activity.supportFragmentManager
+
+        val fragment1 = StrictViewFragment()
+        val fragment2 = StrictViewFragment()
+
+        fm.beginTransaction()
+            .add(R.id.fragment_container_view, fragment1)
+            .commit()
+        activityRule.waitForExecution()
+
+        fm.beginTransaction()
+            .add(R.id.fragment_container_view, fragment2)
+            .commit()
+        activityRule.waitForExecution()
+
+        val topFragment = fragmentContainerView.getFragment<StrictViewFragment>()
+        assertThat(topFragment).isSameInstanceAs(fragment2)
+    }
+
+    @Test
+    fun getFragmentAddAndReplace() {
+        val fragmentContainerView = ActivityCompat.requireViewById<FragmentContainerView>(
+            activityRule.activity,
+            R.id.fragment_container_view
+        )
+        val fm = activityRule.activity.supportFragmentManager
+
+        val fragment1 = StrictViewFragment(R.layout.fragment_container_view)
+        val fragment2 = StrictViewFragment(R.layout.fragment_container_view)
+
+        fm.beginTransaction()
+            .add(R.id.fragment_container_view, fragment1)
+            .commit()
+        activityRule.waitForExecution()
+
+        fm.beginTransaction()
+            .replace(R.id.fragment_container_view, fragment2)
+            .commit()
+        activityRule.waitForExecution()
+
+        val topFragment = fragmentContainerView.getFragment<StrictViewFragment>()
+        assertThat(topFragment).isSameInstanceAs(fragment2)
+    }
+
     class ChildViewFragment(val viewTag: String? = null) : StrictViewFragment() {
         override fun onCreateView(
             inflater: LayoutInflater,
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
index 85860a6..fde5c4d 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
@@ -23,26 +23,19 @@
 import androidx.fragment.test.R
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
+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 com.google.common.truth.Truth.assertWithMessage
-import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
 
 @SmallTest
-@RunWith(Parameterized::class)
-class FragmentReorderingTest(private val stateManager: StateManager) {
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "stateManager={0}")
-        fun data() = arrayOf(NewStateManager, OldStateManager)
-    }
+@RunWith(AndroidJUnit4::class)
+class FragmentReorderingTest() {
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -54,25 +47,16 @@
 
     @Before
     fun setup() {
-        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         container = activityRule.activity.findViewById<View>(R.id.fragmentContainer) as ViewGroup
         fm = activityRule.activity.supportFragmentManager
         instrumentation = InstrumentationRegistry.getInstrumentation()
     }
 
-    @After
-    fun teardown() {
-        stateManager.teardown()
-    }
-
     // Ensure that a replaced fragment is stopped before its replacement is started
     // and vice versa when popped
     @Test
     fun stopBeforeStart() {
-        if (stateManager is OldStateManager) {
-            return
-        }
         val fragment1 = StrictViewFragment()
         fm.beginTransaction()
             .add(R.id.fragmentContainer, fragment1)
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentSharedElementTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentSharedElementTransitionTest.kt
index 820b9762..b3491c7 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentSharedElementTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentSharedElementTransitionTest.kt
@@ -62,4 +62,47 @@
             assertThat(ViewCompat.getTransitionName(blueSquare)).isEqualTo("blueSquare")
         }
     }
+
+    @Test
+    fun testNestedSharedElementViewNonMatching() {
+        with(ActivityScenario.launch(FragmentTestActivity::class.java)) {
+            val fragment = TransitionFragment(R.layout.scene5)
+            withActivity {
+                supportFragmentManager
+                    .beginTransaction()
+                    .setReorderingAllowed(true)
+                    .replace(R.id.content, fragment)
+                    .commit()
+            }
+
+            val containerBlueSquare = withActivity { findViewById(R.id.containerBlueSquare) }
+            val greenSquare = withActivity { findViewById(R.id.greenSquare) }
+            val redSquare = withActivity { findViewById(R.id.redSquare) }
+            val startBlueBounds = containerBlueSquare.boundsOnScreen
+
+            val fragment2 = TransitionFragment(R.layout.scene4)
+
+            withActivity {
+                supportFragmentManager
+                    .beginTransaction()
+                    .setReorderingAllowed(true)
+                    .addSharedElement(containerBlueSquare, "blueSquare")
+                    .replace(R.id.content, fragment2)
+                    .commit()
+            }
+
+            val blueSquare = withActivity { findViewById(R.id.blueSquare) }
+
+            fragment.enterTransition.verifyAndClearTransition {
+                enteringViews += listOf(containerBlueSquare, greenSquare, redSquare)
+            }
+            fragment2.sharedElementEnter.verifyAndClearTransition {
+                enteringViews += listOf(blueSquare)
+                exitingViews += listOf(containerBlueSquare, greenSquare)
+                epicenter = startBlueBounds
+            }
+            verifyNoOtherTransitions(fragment)
+            verifyNoOtherTransitions(fragment2)
+        }
+    }
 }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
index 790569f..800e19e 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
@@ -40,27 +40,6 @@
 object Reordered : ReorderingAllowed()
 object Ordered : ReorderingAllowed()
 
-sealed class StateManager {
-    abstract fun setup()
-
-    override fun toString(): String = this.javaClass.simpleName
-
-    fun teardown() {
-        // Reset it back to the default
-        FragmentManager.enableNewStateManager(true)
-    }
-}
-object NewStateManager : StateManager() {
-    override fun setup() {
-        FragmentManager.enableNewStateManager(true)
-    }
-}
-object OldStateManager : StateManager() {
-    override fun setup() {
-        FragmentManager.enableNewStateManager(false)
-    }
-}
-
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<out FragmentActivity>.executePendingTransactions(
     fm: FragmentManager = activity.supportFragmentManager
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
index ab7bdd1..1ad1ba5 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
@@ -31,7 +31,6 @@
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
-import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -44,21 +43,14 @@
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 class FragmentTransitionAnimTest(
     private val reorderingAllowed: ReorderingAllowed,
-    private val stateManager: StateManager
 ) {
     private var onBackStackChangedTimes: Int = 0
 
     @Before
     fun setup() {
-        stateManager.setup()
         onBackStackChangedTimes = 0
     }
 
-    @After
-    fun teardown() {
-        stateManager.teardown()
-    }
-
     // Ensure when transition duration is shorter than animation duration, we will get both end
     // callbacks
     @Test
@@ -109,13 +101,13 @@
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(startAnimationRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(startAnimationRan).isFalse()
             fragment.waitForTransition()
             val exitAnimationRan = fragment.exitAnimationLatch.await(
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(exitAnimationRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(exitAnimationRan).isFalse()
             assertThat(onBackStackChangedTimes).isEqualTo(2)
         }
     }
@@ -170,13 +162,13 @@
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(startAnimationRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(startAnimationRan).isFalse()
             fragment.waitForTransition()
             val exitAnimationRan = fragment.exitAnimationLatch.await(
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(exitAnimationRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(exitAnimationRan).isFalse()
             assertThat(onBackStackChangedTimes).isEqualTo(2)
         }
     }
@@ -232,7 +224,7 @@
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(exitAnimatorRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(exitAnimatorRan).isFalse()
             assertThat(onBackStackChangedTimes).isEqualTo(2)
         }
     }
@@ -288,7 +280,7 @@
                 TIMEOUT,
                 TimeUnit.MILLISECONDS
             )
-            assertThat(exitAnimatorRan).isEqualTo(stateManager == OldStateManager)
+            assertThat(exitAnimatorRan).isFalse()
             assertThat(onBackStackChangedTimes).isEqualTo(2)
         }
     }
@@ -342,17 +334,12 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
+        @Parameterized.Parameters(name = "ordering={0}")
         fun data() = mutableListOf<Array<Any>>().apply {
             arrayOf(
                 Ordered,
                 Reordered
-            ).forEach { ordering ->
-                // Run the test with the new state manager
-                add(arrayOf(ordering, NewStateManager))
-                // Run the test with the old state manager
-                add(arrayOf(ordering, OldStateManager))
-            }
+            )
         }
 
         @AnimRes
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
index 2422e8f..d92c9bf 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
@@ -15,7 +15,6 @@
  */
 package androidx.fragment.app
 
-import android.graphics.Rect
 import android.os.Build
 import android.os.Bundle
 import android.transition.Transition
@@ -55,8 +54,7 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 class FragmentTransitionTest(
-    private val reorderingAllowed: ReorderingAllowed,
-    private val stateManager: StateManager
+    private val reorderingAllowed: ReorderingAllowed
 ) {
 
     @Suppress("DEPRECATION")
@@ -71,7 +69,6 @@
 
     @Before
     fun setup() {
-        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         onBackStackChangedTimes = 0
         fragmentManager = activityRule.activity.supportFragmentManager
@@ -81,7 +78,6 @@
     @After
     fun teardown() {
         fragmentManager.removeOnBackStackChangedListener(onBackStackChangedListener)
-        stateManager.teardown()
     }
 
     // Test that normal view transitions (enter, exit, reenter, return) run with
@@ -183,8 +179,6 @@
     fun removeThenAddBeforeTransitionFinishes() {
         // enter transition
         val fragment = setupInitialFragment()
-        val blue = activityRule.findBlue()
-        val green = activityRule.findGreen()
 
         val view1 = fragment.view
 
@@ -208,23 +202,10 @@
         // back stack
         if (reorderingAllowed is Reordered) {
             assertThat(onBackStackChangedTimes).isEqualTo(2)
-            assertThat(fragment.requireView()).isEqualTo(view1)
         } else {
             assertThat(onBackStackChangedTimes).isEqualTo(3)
-            if (stateManager is NewStateManager) {
-                // When using FragmentStateManager, the transition gets cancelled and the
-                // Fragment  does not go all the way through to destroying the view before
-                // coming back up, so the view instances will still match
-                assertThat(fragment.requireView()).isEqualTo(view1)
-            } else {
-                // If reorder is not allowed we will get the exit Transition
-                fragment.waitForTransition()
-                fragment.exitTransition.verifyAndClearTransition {
-                    exitingViews += listOf(green, blue)
-                }
-                assertThat(fragment.requireView()).isNotEqualTo(view1)
-            }
         }
+        assertThat(fragment.requireView()).isEqualTo(view1)
         verifyNoOtherTransitions(fragment)
     }
 
@@ -784,6 +765,7 @@
         fragment1.waitForTransition()
         fragment2.waitForTransition()
         fragment1.exitTransition.endAnimatorCountDownLatch.await(1000, TimeUnit.MILLISECONDS)
+        assertThat(listener.isGoneAtTransitionStart).isFalse()
 
         val endGreen = findViewById(fragment2, R.id.greenSquare)
         val endBlue = findViewById(fragment2, R.id.blueSquare)
@@ -943,7 +925,6 @@
 
         val startBlue = activityRule.findBlue()
         val startGreen = activityRule.findGreen()
-        val startBlueBounds = startBlue.boundsOnScreen
 
         fragmentManager.beginTransaction()
             .addSharedElement(startBlue, "fooSquare")
@@ -959,22 +940,10 @@
         val endBlue = activityRule.findBlue()
         val endGreen = activityRule.findGreen()
 
-        // FragmentStateManager is able to build the correct transition
-        // whether you use reordering or not
-        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
-            fragment1.exitTransition.verifyAndClearTransition {
-                exitingViews += listOf(startGreen, startBlue)
-            }
-        } else {
-            fragment1.exitTransition.verifyAndClearTransition {
-                epicenter = startBlueBounds
-                exitingViews += startGreen
-            }
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startBlueBounds
-                exitingViews += startBlue
-            }
+        fragment1.exitTransition.verifyAndClearTransition {
+            exitingViews += listOf(startGreen, startBlue)
         }
+
         verifyNoOtherTransitions(fragment1)
 
         fragment2.enterTransition.verifyAndClearTransition {
@@ -1113,16 +1082,10 @@
         if (reorderingAllowed is Reordered) {
             // reordering allowed fragment3 to get a transition so we should wait for it to finish
             fragment3.waitForTransition()
-            if (stateManager is NewStateManager) {
-                // When using the NewStateManager, the last operation sets the direction.
-                // In this case, the forward direction since we did a replace() after the pop
-                fragment2.exitTransition.verifyAndClearTransition {
-                    exitingViews += listOf(midGreen, midBlue)
-                }
-            } else {
-                fragment2.returnTransition.verifyAndClearTransition {
-                    exitingViews += listOf(midGreen, midBlue)
-                }
+            // The last operation (in this case a replace()) sets the direction of
+            // the transition, so the popped fragment runs its exit transition
+            fragment2.exitTransition.verifyAndClearTransition {
+                exitingViews += listOf(midGreen, midBlue)
             }
             val endGreen = activityRule.findGreen()
             val endBlue = activityRule.findBlue()
@@ -1178,29 +1141,18 @@
             val endBlue = activityRule.findBlue()
             val endGreenBounds = endGreen.boundsOnScreen
 
-            if (stateManager is NewStateManager) {
-                // When using the NewStateManager, the last operation sets the direction.
-                // In this case, the forward direction since we did a replace() after the pop
-                fragment1.exitTransition.verifyAndClearTransition {
-                    epicenter = endGreenBounds
-                    exitingViews += startGreen
-                }
-            } else {
-                fragment1.returnTransition.verifyAndClearTransition {
-                    exitingViews += startGreen
-                }
+            // The last operation (in this case a replace()) sets the direction of
+            // the transition, so the popped fragment runs its exit transition
+            fragment1.exitTransition.verifyAndClearTransition {
+                epicenter = endGreenBounds
+                exitingViews += startGreen
             }
             fragment2.enterTransition.verifyAndClearTransition {
                 epicenter = startGreenBounds
                 enteringViews += endGreen
             }
             fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = if (stateManager is NewStateManager) {
-                    endGreenBounds
-                } else {
-                    // In this case, we can't find an epicenter
-                    Rect()
-                }
+                epicenter = endGreenBounds
                 exitingViews += startBlue
                 enteringViews += endBlue
             }
@@ -1239,20 +1191,10 @@
         val midRed = activityRule.findRed()
         val midGreenBounds = midGreen.boundsOnScreen
 
-        // FragmentStateManager is able to build the correct transition
-        // whether you use reordering or not
-        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startGreenBounds
-                exitingViews += startGreen
-                enteringViews += midGreen
-            }
-        } else {
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startGreenBounds
-                exitingViews += listOf(startGreen, startBlue)
-                enteringViews += midGreen
-            }
+        fragment2.sharedElementEnter.verifyAndClearTransition {
+            epicenter = startGreenBounds
+            exitingViews += startGreen
+            enteringViews += midGreen
         }
         fragment2.enterTransition.verifyAndClearTransition {
             epicenter = midGreenBounds
@@ -1648,12 +1590,14 @@
     ) : TestTransitionFragmentListener(
         fragment
     ) {
+        var isGoneAtTransitionStart = false
         override fun onTransitionEnd(transition: Transition) {
             fragment.endTransitionCountDownLatch.countDown()
             fragment.startTransitionCountDownLatch = CountDownLatch(1)
         }
 
         override fun onTransitionStart(transition: Transition) {
+            isGoneAtTransitionStart = fragment.requireView().visibility == View.GONE
             fragment.startTransitionCountDownLatch.countDown()
             transition.removeListener(this)
             transition.addListener(this)
@@ -1680,18 +1624,8 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
-        fun data() = mutableListOf<Array<Any>>().apply {
-            arrayOf(
-                Ordered,
-                Reordered
-            ).forEach { ordering ->
-                // Run the test with the new state manager
-                add(arrayOf(ordering, NewStateManager))
-                // Run the test with the old state manager
-                add(arrayOf(ordering, OldStateManager))
-            }
-        }
+        @Parameterized.Parameters(name = "ordering={0}")
+        fun data() = arrayOf(Ordered, Reordered)
     }
 }
 
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
index 0948f8e..157c6c7 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
@@ -25,6 +25,7 @@
 import androidx.fragment.test.R
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.ViewModelStore
+import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
@@ -32,26 +33,17 @@
 import androidx.testutils.waitForExecution
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import org.junit.After
-import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
 @LargeTest
-@RunWith(Parameterized::class)
+@RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
-class PostponedTransitionTest(private val stateManager: StateManager) {
-
-    companion object {
-        @JvmStatic
-        @Parameterized.Parameters(name = "stateManager={0}")
-        fun data() = arrayOf(NewStateManager, OldStateManager)
-    }
+class PostponedTransitionTest() {
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -62,7 +54,6 @@
 
     @Before
     fun setupContainer() {
-        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         val fm = activityRule.activity.supportFragmentManager
 
@@ -94,11 +85,6 @@
         verifyNoOtherTransitions(beginningFragment)
     }
 
-    @After
-    fun teardown() {
-        stateManager.teardown()
-    }
-
     // Ensure that replacing with a fragment that has a postponed transition
     // will properly postpone it, both adding and popping.
     @Test
@@ -151,9 +137,6 @@
 
     @Test
     fun changePostponedFragmentVisibility() {
-        if (stateManager == OldStateManager) {
-            return
-        }
         val fm = activityRule.activity.supportFragmentManager
         val startBlue = activityRule.findBlue()
 
@@ -290,44 +273,20 @@
         }
         activityRule.waitForExecution()
 
-        if (stateManager is NewStateManager) {
-            // fragment2 should have been put on the back stack without any transitions
-            verifyNoOtherTransitions(fragment2)
+        // fragment2 should have been put on the back stack without any transitions
+        verifyNoOtherTransitions(fragment2)
 
-            // fragment3 should be postponed
-            assertPostponedTransition(beginningFragment, fragment3)
+        // fragment3 should be postponed
+        assertPostponedTransition(beginningFragment, fragment3)
 
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
+        // start the postponed transition
+        fragment3.startPostponedEnterTransition()
 
-            // make sure it ran
-            assertForwardTransition(
-                startBlue, startBlueBounds, startGreen,
-                beginningFragment, fragment3
-            )
-        } else {
-            // transition to fragment2 should be started
-            assertForwardTransition(
-                startBlue, startBlueBounds, startGreen,
-                beginningFragment, fragment2
-            )
-
-            // fragment3 should be postponed, but fragment2 should be executed with no transition.
-            assertPostponedTransition(fragment2, fragment3, beginningFragment)
-
-            val startBlue2 = fragment2.requireView().findViewById<View>(R.id.blueSquare)
-            val startGreen2 = fragment2.requireView().findViewById<View>(R.id.greenSquare)
-            val startBlueBounds2 = startBlue2.boundsOnScreen
-
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
-
-            // make sure it ran
-            assertForwardTransition(
-                startBlue2, startBlueBounds2, startGreen2,
-                fragment2, fragment3
-            )
-        }
+        // make sure it ran
+        assertForwardTransition(
+            startBlue, startBlueBounds, startGreen,
+            beginningFragment, fragment3
+        )
 
         val startBlue3 = fragment3.requireView().findViewById<View>(R.id.blueSquare)
         val startGreen3 = fragment3.requireView().findViewById<View>(R.id.greenSquare)
@@ -335,37 +294,18 @@
 
         activityRule.popBackStackImmediate(commit, FragmentManager.POP_BACK_STACK_INCLUSIVE)
 
-        if (stateManager is NewStateManager) {
-            // The transition back to beginningFragment should be postponed
-            // and fragment2 should be removed without any transitions
-            assertPostponedTransition(fragment3, beginningFragment, fragment2)
+        // The transition back to beginningFragment should be postponed
+        // and fragment2 should be removed without any transitions
+        assertPostponedTransition(fragment3, beginningFragment, fragment2)
 
-            // start the postponed transition
-            beginningFragment.startPostponedEnterTransition()
+        // start the postponed transition
+        beginningFragment.startPostponedEnterTransition()
 
-            // make sure it ran
-            assertBackTransition(
-                startBlue3, startBlueBounds3, startGreen3,
-                fragment3, beginningFragment
-            )
-        } else {
-            assertBackTransition(startBlue3, startBlueBounds3, startGreen3, fragment3, fragment2)
-
-            assertPostponedTransition(fragment2, beginningFragment, fragment3)
-
-            val endBlue2 = fragment2.requireView().findViewById<View>(R.id.blueSquare)
-            val endGreen2 = fragment2.requireView().findViewById<View>(R.id.greenSquare)
-            val endBlueBounds2 = endBlue2.boundsOnScreen
-
-            // start the postponed transition
-            beginningFragment.startPostponedEnterTransition()
-
-            // make sure it ran
-            assertBackTransition(
-                endBlue2, endBlueBounds2, endGreen2,
-                fragment2, beginningFragment
-            )
-        }
+        // make sure it ran
+        assertBackTransition(
+            startBlue3, startBlueBounds3, startGreen3,
+            fragment3, beginningFragment
+        )
     }
 
     // Ensure that postponed transition is forced after another has been committed.
@@ -402,35 +342,20 @@
         // and start fragment2 -> fragment3 transition postponed
         activityRule.waitForExecution()
 
-        if (stateManager is NewStateManager) {
-            // fragment2 should have been put on the back stack without any transitions
-            verifyNoOtherTransitions(fragment2)
+        // fragment2 should have been put on the back stack without any transitions
+        verifyNoOtherTransitions(fragment2)
 
-            // fragment3 should be postponed
-            assertPostponedTransition(beginningFragment, fragment3)
+        // fragment3 should be postponed
+        assertPostponedTransition(beginningFragment, fragment3)
 
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
+        // start the postponed transition
+        fragment3.startPostponedEnterTransition()
 
-            // make sure it ran
-            assertForwardTransition(
-                startBlue, startBlueBounds, startGreen,
-                beginningFragment, fragment3
-            )
-        } else {
-            // fragment3 should be postponed, but fragment2 should be executed with no transition.
-            assertPostponedTransition(fragment2, fragment3, beginningFragment)
-
-            val startBlue2 = activityRule.findBlue()
-            val startGreen2 = activityRule.findGreen()
-            val startBlueBounds2 = startBlue2.boundsOnScreen
-
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
-
-            // make sure it ran
-            assertForwardTransition(startBlue2, startBlueBounds2, startGreen2, fragment2, fragment3)
-        }
+        // make sure it ran
+        assertForwardTransition(
+            startBlue, startBlueBounds, startGreen,
+            beginningFragment, fragment3
+        )
 
         val startBlue3 = fragment3.requireView().findViewById<View>(R.id.blueSquare)
         val startGreen3 = fragment3.requireView().findViewById<View>(R.id.greenSquare)
@@ -445,37 +370,20 @@
         // start the beginningFragment transaction postponed
         activityRule.popBackStackImmediate()
 
-        if (stateManager is NewStateManager) {
-            // The transition back to beginningFragment should be postponed
-            // and no transitions should be done on fragment2
-            assertPostponedTransition(fragment3, beginningFragment)
-            verifyNoOtherTransitions(fragment2)
+        // The transition back to beginningFragment should be postponed
+        // and no transitions should be done on fragment2
+        assertPostponedTransition(fragment3, beginningFragment)
+        verifyNoOtherTransitions(fragment2)
 
-            // start the postponed transition
-            beginningFragment.startPostponedEnterTransition()
+        // start the postponed transition
+        beginningFragment.startPostponedEnterTransition()
 
-            // make sure it ran
-            assertBackTransition(
-                startBlue3, startBlueBounds3, startGreen3,
-                fragment3, beginningFragment
-            )
-            verifyNoOtherTransitions(fragment2)
-        } else {
-            assertPostponedTransition(fragment2, beginningFragment, fragment3)
-
-            val endBlue2 = fragment2.requireView().findViewById<View>(R.id.blueSquare)
-            val endGreen2 = fragment2.requireView().findViewById<View>(R.id.greenSquare)
-            val endBlueBounds2 = endBlue2.boundsOnScreen
-
-            // start the postponed transition
-            beginningFragment.startPostponedEnterTransition()
-
-            // make sure it ran
-            assertBackTransition(
-                endBlue2, endBlueBounds2, endGreen2,
-                fragment2, beginningFragment
-            )
-        }
+        // make sure it ran
+        assertBackTransition(
+            startBlue3, startBlueBounds3, startGreen3,
+            fragment3, beginningFragment
+        )
+        verifyNoOtherTransitions(fragment2)
     }
 
     // Do a bunch of things to one fragment in a transaction and see if it can screw things up.
@@ -852,8 +760,6 @@
         activityRule.waitForExecution()
 
         val startBlue2 = fragment2.requireView().findViewById<View>(R.id.blueSquare)
-        val startGreen2 = fragment2.requireView().findViewById<View>(R.id.greenSquare)
-        val startBlueBounds2 = startBlue2.boundsOnScreen
 
         instrumentation.runOnMainSync {
             fm.beginTransaction()
@@ -863,31 +769,19 @@
                 .commitNow()
         }
 
-        if (stateManager is NewStateManager) {
-            // fragment2 should have been put on the back stack without any transitions
-            verifyNoOtherTransitions(fragment2)
+        // fragment2 should have been put on the back stack without any transitions
+        verifyNoOtherTransitions(fragment2)
 
-            // fragment3 should be postponed
-            assertPostponedTransition(beginningFragment, fragment3)
+        // fragment3 should be postponed
+        assertPostponedTransition(beginningFragment, fragment3)
 
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
+        // start the postponed transition
+        fragment3.startPostponedEnterTransition()
 
-            assertForwardTransition(
-                startBlue, startBlueBounds, startGreen,
-                beginningFragment, fragment3
-            )
-        } else {
-            assertPostponedTransition(fragment2, fragment3, beginningFragment)
-
-            // start the postponed transition
-            fragment3.startPostponedEnterTransition()
-
-            assertForwardTransition(
-                startBlue2, startBlueBounds2, startGreen2,
-                fragment2, fragment3
-            )
-        }
+        assertForwardTransition(
+            startBlue, startBlueBounds, startGreen,
+            beginningFragment, fragment3
+        )
     }
 
     // Make sure that when a transaction that removes a view is postponed that
@@ -1034,25 +928,9 @@
         activityRule.runOnUiThread {
             // start the postponed transition
             fragment.startPostponedEnterTransition()
-
-            if (stateManager is NewStateManager) {
-                // This should succeed since onResume() is called outside of the
-                // transaction completing
-                fm.executePendingTransactions()
-            } else {
-                try {
-                    // This should trigger an IllegalStateException
-                    fm.executePendingTransactions()
-                    fail(
-                        "commitNow() while executing a transaction should cause an" +
-                            " IllegalStateException"
-                    )
-                } catch (e: IllegalStateException) {
-                    assertThat(e)
-                        .hasMessageThat()
-                        .contains("FragmentManager is already executing transactions")
-                }
-            }
+            // This should succeed since onResume() is called outside of the
+            // transaction completing
+            fm.executePendingTransactions()
         }
     }
 
@@ -1241,13 +1119,8 @@
 
         verifyNoOtherTransitions(fromFragment)
         verifyNoOtherTransitions(toFragment)
-        if (stateManager is NewStateManager) {
-            assertThat(fromFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
-            assertThat(toFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
-        } else {
-            assertThat(fromFragment.isResumed).isTrue()
-            assertThat(toFragment.isResumed).isFalse()
-        }
+        assertThat(fromFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
+        assertThat(toFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
     }
 
     private fun clearTargets(fragment: TransitionFragment) {
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PrimaryNavFragmentTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PrimaryNavFragmentTest.kt
index 8bd7499..4255529 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PrimaryNavFragmentTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PrimaryNavFragmentTest.kt
@@ -300,29 +300,11 @@
         activityRule.waitForExecution()
 
         assertThat(navigations.drain()).isEqualTo(
-            if (FragmentManager.USE_STATE_MANAGER) {
-                listOf(
-                    trackingFragment to false,
-                    postponedFragment to true
-                )
-            } else {
-                listOf(
-                    trackingFragment to false,
-                    postponedFragment to true,
-                    postponedFragment to false,
-                    trackingFragment to true
-                )
-            }
+            listOf(trackingFragment to false, postponedFragment to true)
         )
         assertWithMessage("primary nav fragment not set correctly after replace")
             .that(fm.primaryNavigationFragment)
-            .isSameInstanceAs(
-                if (FragmentManager.USE_STATE_MANAGER) {
-                    postponedFragment
-                } else {
-                    trackingFragment
-                }
-            )
+            .isSameInstanceAs(postponedFragment)
 
         // Now pop the back stack and also add a replacement Fragment
         fm.popBackStack()
@@ -335,23 +317,12 @@
         activityRule.waitForExecution()
 
         assertThat(navigations.drain()).isEqualTo(
-            if (FragmentManager.USE_STATE_MANAGER) {
-                listOf(
-                    postponedFragment to false,
-                    trackingFragment to true,
-                    trackingFragment to false,
-                    replacementFragment to true
-                )
-            } else {
-                listOf(
-                    trackingFragment to false,
-                    postponedFragment to true,
-                    postponedFragment to false,
-                    trackingFragment to true,
-                    trackingFragment to false,
-                    replacementFragment to true
-                )
-            }
+            listOf(
+                postponedFragment to false,
+                trackingFragment to true,
+                trackingFragment to false,
+                replacementFragment to true
+            )
         )
 
         assertWithMessage("primary nav fragment not set correctly after replace")
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
index 6fa9e48..bdda9ab 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.fragment.app
 
-import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
 import androidx.fragment.app.test.EmptyFragmentTestActivity
@@ -417,11 +416,6 @@
                 // This moves the Fragment up to STARTED,
                 // calling enqueueAdd() under the hood
                 fragmentStateManager.moveToExpectedState()
-                // Normally this would be done for us in the USE_STATE_MANAGER world
-                // but we need to do it manually if that isn't the case yet.
-                if (!FragmentManager.USE_STATE_MANAGER) {
-                    fragment.mView.visibility = View.INVISIBLE
-                }
             }
             assertThat(controller.operationsToExecute)
                 .isEmpty()
@@ -442,17 +436,8 @@
             onActivity {
                 fragment.startPostponedEnterTransition()
             }
-            onActivity {
-                // When USE_STATE_MANAGER is true, this second onActivity is enough
-                // to handle the post() that startPostponedEnterTransition() does.
-                // Otherwise, we need to do a little more work at this point
-                if (!FragmentManager.USE_STATE_MANAGER) {
-                    // These are called automatically when USE_STATE_MANAGER is true
-                    // but we need to call them manually if it is false
-                    controller.markPostponedState()
-                    controller.executePendingOperations()
-                }
-            }
+            // Wait for idle thread to handle the post() that startPostponedEnterTransition() does.
+            InstrumentationRegistry.getInstrumentation().waitForIdleSync()
 
             // Verify that the operation was sent for execution
             assertThat(controller.operationsToExecute)
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
index 21201eb..00b0c2e 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
@@ -73,10 +73,7 @@
         assertWithMessage("getView returned null in onDestroyView")
             .that(view)
             .isNotNull()
-        if (requireView().parent != null &&
-            requireView().animation != null &&
-            FragmentManager.USE_STATE_MANAGER
-        ) {
+        if (requireView().parent != null && requireView().animation != null) {
             assertWithMessage("View should be removed from parent if there is no animation")
                 .that((requireView().parent as ViewGroup).layoutTransition)
                 .isNotNull()
diff --git a/fragment/fragment/src/androidTest/res/layout/scene4.xml b/fragment/fragment/src/androidTest/res/layout/scene4.xml
new file mode 100644
index 0000000..5eedff9
--- /dev/null
+++ b/fragment/fragment/src/androidTest/res/layout/scene4.xml
@@ -0,0 +1,27 @@
+<?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.
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/squareContainer"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <View android:id="@+id/blueSquare"
+        android:transitionName="blueSquare"
+        android:layout_width="100dp"
+        android:layout_height="100dp"
+        android:background="#008"/>
+</FrameLayout>
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/res/layout/scene5.xml b/fragment/fragment/src/androidTest/res/layout/scene5.xml
new file mode 100644
index 0000000..9a50cd6
--- /dev/null
+++ b/fragment/fragment/src/androidTest/res/layout/scene5.xml
@@ -0,0 +1,39 @@
+<?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.
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/sharedElementContainer"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <FrameLayout android:id="@+id/containerBlueSquare"
+        android:transitionName="blueSquare"
+        android:transitionGroup="false"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#008">
+        <View android:id="@+id/greenSquare"
+            android:transitionName="greenSquare"
+            android:layout_width="100dp"
+            android:layout_height="100dp"
+            android:background="#080"/>
+        <View android:id="@+id/redSquare"
+            android:layout_width="100dp"
+            android:layout_height="100dp"
+            android:background="#800"
+            android:layout_gravity="end"/>
+    </FrameLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/res/values/strings.xml b/fragment/fragment/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from fragment/fragment/src/androidTest/res/values/strings.xml
rename to fragment/fragment/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java b/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
index c67ee5a..e691044 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
@@ -364,49 +364,8 @@
         return true;
     }
 
-    boolean interactsWith(int containerId) {
-        final int numOps = mOps.size();
-        for (int opNum = 0; opNum < numOps; opNum++) {
-            final Op op = mOps.get(opNum);
-            final int fragContainer = op.mFragment != null ? op.mFragment.mContainerId : 0;
-            if (fragContainer != 0 && fragContainer == containerId) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    boolean interactsWith(ArrayList<BackStackRecord> records, int startIndex, int endIndex) {
-        if (endIndex == startIndex) {
-            return false;
-        }
-        final int numOps = mOps.size();
-        int lastContainer = -1;
-        for (int opNum = 0; opNum < numOps; opNum++) {
-            final Op op = mOps.get(opNum);
-            final int container = op.mFragment != null ? op.mFragment.mContainerId : 0;
-            if (container != 0 && container != lastContainer) {
-                lastContainer = container;
-                for (int i = startIndex; i < endIndex; i++) {
-                    BackStackRecord record = records.get(i);
-                    final int numThoseOps = record.mOps.size();
-                    for (int thoseOpIndex = 0; thoseOpIndex < numThoseOps; thoseOpIndex++) {
-                        final Op thatOp = record.mOps.get(thoseOpIndex);
-                        final int thatContainer = thatOp.mFragment != null
-                                ? thatOp.mFragment.mContainerId : 0;
-                        if (thatContainer == container) {
-                            return true;
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
     /**
-     * Executes the operations contained within this transaction. The Fragment states will only
-     * be modified if optimizations are not allowed.
+     * Executes the operations contained within this transaction.
      */
     void executeOps() {
         final int numOps = mOps.size();
@@ -459,26 +418,13 @@
                 default:
                     throw new IllegalArgumentException("Unknown cmd: " + op.mCmd);
             }
-            if (!mReorderingAllowed && op.mCmd != OP_ADD && f != null) {
-                if (!FragmentManager.USE_STATE_MANAGER) {
-                    mManager.moveFragmentToExpectedState(f);
-                }
-            }
-        }
-        if (!mReorderingAllowed && !FragmentManager.USE_STATE_MANAGER) {
-            // Added fragments are added at the end to comply with prior behavior.
-            mManager.moveToState(mManager.mCurState, true);
         }
     }
 
     /**
-     * Reverses the execution of the operations within this transaction. The Fragment states will
-     * only be modified if reordering is not allowed.
-     *
-     * @param moveToState {@code true} if added fragments should be moved to their final state
-     *                    in ordered transactions
+     * Reverses the execution of the operations within this transaction.
      */
-    void executePopOps(boolean moveToState) {
+    void executePopOps() {
         for (int opNum = mOps.size() - 1; opNum >= 0; opNum--) {
             final Op op = mOps.get(opNum);
             Fragment f = op.mFragment;
@@ -529,14 +475,6 @@
                 default:
                     throw new IllegalArgumentException("Unknown cmd: " + op.mCmd);
             }
-            if (!mReorderingAllowed && op.mCmd != OP_REMOVE && f != null) {
-                if (!FragmentManager.USE_STATE_MANAGER) {
-                    mManager.moveFragmentToExpectedState(f);
-                }
-            }
-        }
-        if (!mReorderingAllowed && moveToState && !FragmentManager.USE_STATE_MANAGER) {
-            mManager.moveToState(mManager.mCurState, true);
         }
     }
 
@@ -708,31 +646,6 @@
         }
     }
 
-    boolean isPostponed() {
-        for (int opNum = 0; opNum < mOps.size(); opNum++) {
-            final Op op = mOps.get(opNum);
-            if (isFragmentPostponed(op)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    void setOnStartPostponedListener(Fragment.OnStartEnterTransitionListener listener) {
-        for (int opNum = 0; opNum < mOps.size(); opNum++) {
-            final Op op = mOps.get(opNum);
-            if (isFragmentPostponed(op)) {
-                op.mFragment.setOnStartEnterTransitionListener(listener);
-            }
-        }
-    }
-
-    private static boolean isFragmentPostponed(Op op) {
-        final Fragment fragment = op.mFragment;
-        return fragment != null && fragment.mAdded && fragment.mView != null && !fragment.mDetached
-                && !fragment.mHidden && fragment.isPostponed();
-    }
-
     @Override
     @Nullable
     public String getName() {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
index 88f0e80..5b2884d 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
@@ -33,7 +33,6 @@
 import androidx.core.util.Preconditions;
 import androidx.core.view.OneShotPreDrawListener;
 import androidx.core.view.ViewCompat;
-import androidx.core.view.ViewGroupCompat;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -112,8 +111,8 @@
         }
 
         // Start transition special effects
-        Map<Operation, Boolean> startedTransitions = startTransitions(transitions, isPop,
-                firstOut, lastIn);
+        Map<Operation, Boolean> startedTransitions = startTransitions(transitions,
+                awaitingContainerChanges, isPop, firstOut, lastIn);
         boolean startedAnyTransition = startedTransitions.containsValue(true);
 
         // Start animation special effects
@@ -282,6 +281,7 @@
 
     @NonNull
     private Map<Operation, Boolean> startTransitions(@NonNull List<TransitionInfo> transitionInfos,
+            @NonNull List<Operation> awaitingContainerChanges,
             final boolean isPop, @Nullable final Operation firstOut,
             @Nullable final Operation lastIn) {
         Map<Operation, Boolean> startedTransitions = new HashMap<>();
@@ -565,6 +565,11 @@
                             null, null, null, null);
                     if (operation.getFinalState() == Operation.State.GONE) {
                         // We're hiding the Fragment. This requires a bit of extra work
+                        // First, we need to avoid immediately applying the container change as
+                        // that will stop the Transition from occurring.
+                        awaitingContainerChanges.remove(operation);
+                        // Then schedule the actual hide of the fragment's view,
+                        // essentially doing what applyState() would do for us
                         transitionImpl.scheduleHideFragmentView(transition,
                                 operation.getFragment().mView,
                                 transitioningViews);
@@ -688,23 +693,23 @@
     /**
      * Gets the Views in the hierarchy affected by entering and exiting transitions.
      *
-     * @param transitioningViews This View will be added to transitioningViews if it is VISIBLE and
-     *                           a normal View or a ViewGroup with
+     * @param transitioningViews This View will be added to transitioningViews if it has a
+     *                           transition name, is VISIBLE and a normal View, or a ViewGroup with
      *                           {@link android.view.ViewGroup#isTransitionGroup()} true.
      * @param view               The base of the view hierarchy to look in.
      */
     void captureTransitioningViews(ArrayList<View> transitioningViews, View view) {
         if (view instanceof ViewGroup) {
+            if (!transitioningViews.contains(view)
+                    && ViewCompat.getTransitionName(view) != null) {
+                transitioningViews.add(view);
+            }
             ViewGroup viewGroup = (ViewGroup) view;
-            if (ViewGroupCompat.isTransitionGroup(viewGroup)) {
-                transitioningViews.add(viewGroup);
-            } else {
-                int count = viewGroup.getChildCount();
-                for (int i = 0; i < count; i++) {
-                    View child = viewGroup.getChildAt(i);
-                    if (child.getVisibility() == View.VISIBLE) {
-                        captureTransitioningViews(transitioningViews, child);
-                    }
+            int count = viewGroup.getChildCount();
+            for (int i = 0; i < count; i++) {
+                View child = viewGroup.getChildAt(i);
+                if (child.getVisibility() == View.VISIBLE) {
+                    captureTransitioningViews(transitioningViews, child);
                 }
             }
         } else {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
index 98a3abcf..0701d86 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
@@ -507,19 +507,15 @@
             @Nullable
             @Override
             public View onFindViewById(int id) {
-                View dialogView = DialogFragment.this.onFindViewById(id);
-                if (dialogView != null) {
-                    return dialogView;
-                }
                 if (fragmentContainer.onHasView()) {
                     return fragmentContainer.onFindViewById(id);
                 }
-                return null;
+                return DialogFragment.this.onFindViewById(id);
             }
 
             @Override
             public boolean onHasView() {
-                return DialogFragment.this.onHasView() || fragmentContainer.onHasView();
+                return  fragmentContainer.onHasView() || DialogFragment.this.onHasView();
             }
         };
     }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index 6a65314..c33fffe 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -263,19 +263,9 @@
         }
     };
 
-    // True if the View was added, and its animation has yet to be run. This could
-    // also indicate that the fragment view hasn't been made visible, even if there is no
-    // animation for this fragment.
-    boolean mIsNewlyAdded;
-
     // True if mHidden has been changed and the animation should be scheduled.
     boolean mHiddenChanged;
 
-    // The alpha of the view when the view was added and then postponed. If the value is less
-    // than zero, this means that the view's add was canceled and should not participate in
-    // removal animations.
-    float mPostponedAlpha;
-
     // The cached value from onGetLayoutInflater(Bundle) that will be returned from
     // getLayoutInflater()
     LayoutInflater mLayoutInflater;
@@ -1145,16 +1135,6 @@
     }
 
     /**
-     * Return <code>true</code> if this fragment or any of its ancestors are currently being removed
-     * from its activity.  This is <em>not</em> whether its activity is finishing, but rather
-     * whether it, or its ancestors are in the process of being removed from its activity.
-     */
-    final boolean isRemovingParent() {
-        Fragment parent = getParentFragment();
-        return parent != null && (parent.isRemoving() || parent.isRemovingParent());
-    }
-
-    /**
      * Return true if the layout is included as part of an activity view
      * hierarchy via the &lt;fragment&gt; tag.  This will always be true when
      * fragments are created through the &lt;fragment&gt; tag, <em>except</em>
@@ -2676,10 +2656,7 @@
      * independent containers will not interfere with each other's postponement.
      * <p>
      * Calling postponeEnterTransition on Fragments with a null View will not postpone the
-     * transition. Likewise, postponement only works if
-     * {@link FragmentTransaction#setReorderingAllowed(boolean) FragmentTransaction reordering} is
-     * enabled if you have called {@link FragmentManager#enableNewStateManager(boolean)} with
-     * <code>false</code>.
+     * transition.
      *
      * @see Activity#postponeEnterTransition()
      * @see FragmentTransaction#setReorderingAllowed(boolean)
@@ -2709,10 +2686,7 @@
      * independent containers will not interfere with each other's postponement.
      * <p>
      * Calling postponeEnterTransition on Fragments with a null View will not postpone the
-     * transition. Likewise, postponement only works if
-     * {@link FragmentTransaction#setReorderingAllowed(boolean) FragmentTransaction reordering} is
-     * enabled if you have called {@link FragmentManager#enableNewStateManager(boolean)} with
-     * <code>false</code>.
+     * transition.
      *
      * @param duration The length of the delay in {@code timeUnit} units
      * @param timeUnit The units of time for {@code duration}
@@ -2768,18 +2742,10 @@
      */
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     void callStartTransitionListener(boolean calledDirectly) {
-        final OnStartEnterTransitionListener listener;
-        if (mAnimationInfo == null) {
-            listener = null;
-        } else {
+        if (mAnimationInfo != null) {
             mAnimationInfo.mEnterTransitionPostponed = false;
-            listener = mAnimationInfo.mStartEnterTransitionListener;
-            mAnimationInfo.mStartEnterTransitionListener = null;
         }
-        if (listener != null) {
-            listener.onStartEnterTransition();
-        } else if (FragmentManager.USE_STATE_MANAGER && mView != null
-                && mContainer != null && mFragmentManager != null) {
+        if (mView != null && mContainer != null && mFragmentManager != null) {
             // Mark the updated postponed state with the SpecialEffectsController immediately
             final SpecialEffectsController controller = SpecialEffectsController
                     .getOrCreateController(mContainer, mFragmentManager);
@@ -3256,23 +3222,6 @@
         }
     }
 
-    void setOnStartEnterTransitionListener(OnStartEnterTransitionListener listener) {
-        ensureAnimationInfo();
-        if (listener == mAnimationInfo.mStartEnterTransitionListener) {
-            return;
-        }
-        if (listener != null && mAnimationInfo.mStartEnterTransitionListener != null) {
-            throw new IllegalStateException("Trying to set a replacement "
-                    + "startPostponedEnterTransition on " + this);
-        }
-        if (mAnimationInfo.mEnterTransitionPostponed) {
-            mAnimationInfo.mStartEnterTransitionListener = listener;
-        }
-        if (listener != null) {
-            listener.startListening();
-        }
-    }
-
     private AnimationInfo ensureAnimationInfo() {
         if (mAnimationInfo == null) {
             mAnimationInfo = new AnimationInfo();
@@ -3391,21 +3340,6 @@
         return mAnimationInfo.mAnimatingAway;
     }
 
-    void setAnimatingAway(View view) {
-        ensureAnimationInfo().mAnimatingAway = view;
-    }
-
-    void setAnimator(Animator animator) {
-        ensureAnimationInfo().mAnimator = animator;
-    }
-
-    Animator getAnimator() {
-        if (mAnimationInfo == null) {
-            return null;
-        }
-        return mAnimationInfo.mAnimator;
-    }
-
     void setPostOnViewCreatedAlpha(float alpha) {
         ensureAnimationInfo().mPostOnViewCreatedAlpha = alpha;
     }
@@ -3435,17 +3369,6 @@
         return mAnimationInfo.mEnterTransitionPostponed;
     }
 
-    boolean isHideReplaced() {
-        if (mAnimationInfo == null) {
-            return false;
-        }
-        return mAnimationInfo.mIsHideReplaced;
-    }
-
-    void setHideReplaced(boolean replaced) {
-        ensureAnimationInfo().mIsHideReplaced = replaced;
-    }
-
     /**
      * {@inheritDoc}
      *
@@ -3556,16 +3479,6 @@
     }
 
     /**
-     * Used internally to be notified when {@link #startPostponedEnterTransition()} has
-     * been called. This listener will only be called once and then be removed from the
-     * listeners.
-     */
-    interface OnStartEnterTransitionListener {
-        void onStartEnterTransition();
-        void startListening();
-    }
-
-    /**
      * Contains all the animation and transition information for a fragment. This will only
      * be instantiated for Fragments that have Views.
      */
@@ -3575,10 +3488,6 @@
         // view that is animating.
         View mAnimatingAway;
 
-        // Non-null if the fragment's view hierarchy is currently animating away with an
-        // animator instead of an animation.
-        Animator mAnimator;
-
         // If app requests the animation direction, this is what to use
         boolean mIsPop;
 
@@ -3613,12 +3522,5 @@
         // True when postponeEnterTransition has been called and startPostponeEnterTransition
         // hasn't been called yet.
         boolean mEnterTransitionPostponed;
-
-        // Listener to wait for startPostponeEnterTransition. After being called, it will
-        // be set to null
-        OnStartEnterTransitionListener mStartEnterTransitionListener;
-
-        // True if the View was hidden, but the transition is handling the hide
-        boolean mIsHideReplaced;
     }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentAnim.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentAnim.java
index 28116cf..aa6272c 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentAnim.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentAnim.java
@@ -18,7 +18,6 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
@@ -31,7 +30,6 @@
 
 import androidx.annotation.AnimRes;
 import androidx.annotation.NonNull;
-import androidx.core.os.CancellationSignal;
 import androidx.core.view.OneShotPreDrawListener;
 import androidx.fragment.R;
 
@@ -134,83 +132,6 @@
         }
     }
 
-    /**
-     * Animates the removal of a fragment with the given animator or animation. After animating,
-     * the fragment's view will be removed from the hierarchy.
-     *
-     * @param fragment The fragment to animate out
-     * @param anim The animator or animation to run on the fragment's view
-     */
-    static void animateRemoveFragment(@NonNull final Fragment fragment,
-            @NonNull AnimationOrAnimator anim,
-            @NonNull final FragmentTransition.Callback callback) {
-        final View viewToAnimate = fragment.mView;
-        final ViewGroup container = fragment.mContainer;
-        container.startViewTransition(viewToAnimate);
-        final CancellationSignal signal = new CancellationSignal();
-        signal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
-            @Override
-            public void onCancel() {
-                if (fragment.getAnimatingAway() != null) {
-                    View v = fragment.getAnimatingAway();
-                    fragment.setAnimatingAway(null);
-                    v.clearAnimation();
-                }
-                fragment.setAnimator(null);
-            }
-        });
-        callback.onStart(fragment, signal);
-        if (anim.animation != null) {
-            Animation animation =
-                    new EndViewTransitionAnimation(anim.animation, container, viewToAnimate);
-            fragment.setAnimatingAway(fragment.mView);
-            animation.setAnimationListener(new Animation.AnimationListener() {
-                @Override
-                public void onAnimationStart(Animation animation) {
-                }
-
-                @Override
-                public void onAnimationEnd(Animation animation) {
-                    // onAnimationEnd() comes during draw(), so there can still be some
-                    // draw events happening after this call. We don't want to detach
-                    // the view until after the onAnimationEnd()
-                    container.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (fragment.getAnimatingAway() != null) {
-                                fragment.setAnimatingAway(null);
-                                callback.onComplete(fragment, signal);
-                            }
-                        }
-                    });
-                }
-
-                @Override
-                public void onAnimationRepeat(Animation animation) {
-                }
-            });
-            fragment.mView.startAnimation(animation);
-        } else {
-            Animator animator = anim.animator;
-            fragment.setAnimator(anim.animator);
-            animator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator anim) {
-                    container.endViewTransition(viewToAnimate);
-                    // If an animator ends immediately, we can just pretend there is no animation.
-                    // When that happens the the fragment's view won't have been removed yet.
-                    Animator animator = fragment.getAnimator();
-                    fragment.setAnimator(null);
-                    if (animator != null && container.indexOfChild(viewToAnimate) < 0) {
-                        callback.onComplete(fragment, signal);
-                    }
-                }
-            });
-            animator.setTarget(fragment.mView);
-            animator.start();
-        }
-    }
-
     @AnimRes
     private static int transitToAnimResourceId(@NonNull Context context, int transit,
             boolean enter) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
index dcb3a5e..071cad3 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentContainerView.java
@@ -216,6 +216,13 @@
         mApplyWindowInsetsListener = listener;
     }
 
+    @NonNull
+    @RequiresApi(20)
+    @Override
+    public WindowInsets onApplyWindowInsets(@NonNull WindowInsets insets) {
+        return insets;
+    }
+
     /**
      * {@inheritDoc}
      *
@@ -392,4 +399,19 @@
             mDisappearingFragmentChildren.add(v);
         }
     }
+
+    /**
+     * This method grabs the {@link Fragment} whose view was most recently
+     * added to the container. This may used as an alternative to calling
+     * {@link FragmentManager#findFragmentById(int)} and passing in the
+     * {@link FragmentContainerView}'s id.
+     *
+     * @return The fragment if any exist, null otherwise.
+     */
+    @Nullable
+    @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"}) // a ClassCastException is
+    // automatically thrown if the given type of F is wrong
+    public <F extends Fragment> F getFragment() {
+        return (F) FragmentManager.findFragmentManager(this).findFragmentById(this.getId());
+    }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 6aa9b95..85a3a37 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -21,8 +21,6 @@
 import static androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.EXTRA_INTENT_SENDER_REQUEST;
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
@@ -61,8 +59,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringRes;
-import androidx.collection.ArraySet;
-import androidx.core.os.CancellationSignal;
 import androidx.fragment.R;
 import androidx.fragment.app.strictmode.FragmentStrictMode;
 import androidx.lifecycle.Lifecycle;
@@ -98,33 +94,6 @@
 public abstract class FragmentManager implements FragmentResultOwner {
     private static boolean DEBUG = false;
     static final String TAG = "FragmentManager";
-    static boolean USE_STATE_MANAGER = true;
-
-    /**
-     * Control whether FragmentManager uses the new state manager that is responsible for:
-     * <ul>
-     *     <li>Moving Fragments through their lifecycle methods</li>
-     *     <li>Running animations and transitions</li>
-     *     <li>Handling postponed transactions</li>
-     * </ul>
-     *
-     * This must only be changed <strong>before</strong> any fragment transactions are done
-     * (i.e., in your <code>Application</code> class or prior to <code>super.onCreate()</code>
-     * in every activity with the same value for all activities). Changing it after that point
-     * is <strong>not</strong> supported and can result in fragments not moving to their
-     * expected state.
-     * <p>
-     * This is <strong>enabled</strong> by default. Disabling it should only be used in
-     * cases where you are debugging a potential regression and as part of
-     * <a href="https://issuetracker.google.com/issues/new?component=460964">filing
-     * an issue</a> to verify and fix the regression.
-     *
-     * @param enabled Whether the new state manager should be enabled.
-     */
-    @FragmentStateManagerControl
-    public static void enableNewStateManager(boolean enabled) {
-        FragmentManager.USE_STATE_MANAGER = enabled;
-    }
 
     /**
      * Control whether the framework's internal fragment manager debugging
@@ -450,23 +419,6 @@
             Collections.synchronizedMap(new HashMap<String, LifecycleAwareResultListener>());
 
     private ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
-    private Map<Fragment, HashSet<CancellationSignal>> mExitAnimationCancellationSignals =
-            Collections.synchronizedMap(new HashMap<Fragment, HashSet<CancellationSignal>>());
-    private final FragmentTransition.Callback mFragmentTransitionCallback =
-            new FragmentTransition.Callback() {
-                @Override
-                public void onStart(@NonNull Fragment fragment,
-                        @NonNull CancellationSignal signal) {
-                    addCancellationSignal(fragment, signal);
-                }
-
-                @Override
-                public void onComplete(@NonNull Fragment f, @NonNull CancellationSignal signal) {
-                    if (!signal.isCanceled()) {
-                        removeCancellationSignal(f, signal);
-                    }
-                }
-            };
     private final FragmentLifecycleCallbacksDispatcher mLifecycleCallbacksDispatcher =
             new FragmentLifecycleCallbacksDispatcher(this);
     private final CopyOnWriteArrayList<FragmentOnAttachListener> mOnAttachListeners =
@@ -518,9 +470,6 @@
     private ArrayList<Boolean> mTmpIsPop;
     private ArrayList<Fragment> mTmpAddedFragments;
 
-    // Postponed transactions.
-    private ArrayList<StartEnterTransitionListener> mPostponedTransactions;
-
     private FragmentManagerViewModel mNonConfig;
 
     private FragmentStrictMode.Policy mStrictModePolicy;
@@ -684,7 +633,8 @@
      * Restores the back stack previously saved via {@link #saveBackStack(String)}. This
      * will result in all of the transactions that made up that back stack to be re-executed,
      * thus re-adding any fragments that were added through those transactions. All state of
-     * those fragments will be restored as part of this process.
+     * those fragments will be restored as part of this process. If no state was previously
+     * saved with the given name, this operation does nothing.
      * <p>
      * This function is asynchronous -- it enqueues the
      * request to restore, but the action will not be performed until the application
@@ -866,36 +816,6 @@
         }
     }
 
-    /**
-     * Add new {@link CancellationSignal} for exit animation cancel callbacks
-     */
-    void addCancellationSignal(@NonNull Fragment f, @NonNull CancellationSignal signal) {
-        if (mExitAnimationCancellationSignals.get(f) == null) {
-            mExitAnimationCancellationSignals.put(f, new HashSet<CancellationSignal>());
-        }
-        mExitAnimationCancellationSignals.get(f).add(signal);
-    }
-
-    /**
-     * Remove a {@link CancellationSignal} that was previously added with
-     * {@link #addCancellationSignal(Fragment, CancellationSignal)}.
-     *
-     * Destroy the view of the Fragment associated with that listener and move it to the proper
-     * state.
-     */
-    void removeCancellationSignal(@NonNull Fragment f, @NonNull CancellationSignal signal) {
-        HashSet<CancellationSignal> signals = mExitAnimationCancellationSignals.get(f);
-        if (signals != null && signals.remove(signal) && signals.isEmpty()) {
-            mExitAnimationCancellationSignals.remove(f);
-            // The Fragment state must be below STARTED before destroying the view to ensure we
-            // support hide/show
-            if (f.mState < Fragment.STARTED) {
-                destroyFragmentView(f);
-                moveToState(f);
-            }
-        }
-    }
-
     @Override
     public final void setFragmentResult(@NonNull String requestKey, @NonNull Bundle result) {
         // Check if there is a listener waiting for a result with this key
@@ -1356,11 +1276,7 @@
                 return;
             }
             f.mDeferStart = false;
-            if (USE_STATE_MANAGER) {
-                fragmentStateManager.moveToExpectedState();
-            } else {
-                moveToState(f);
-            }
+            fragmentStateManager.moveToExpectedState();
         }
     }
 
@@ -1368,190 +1284,6 @@
         return mCurState >= state;
     }
 
-    @SuppressWarnings("deprecation")
-    void moveToState(@NonNull Fragment f, int newState) {
-        FragmentStateManager fragmentStateManager = mFragmentStore.getFragmentStateManager(f.mWho);
-        if (fragmentStateManager == null) {
-            // Ideally, we only call moveToState() on active Fragments. However,
-            // in restoreSaveState() we can call moveToState() on retained Fragments
-            // just to clean them up without them ever being added to mActive.
-            // For these cases, a brand new FragmentStateManager is enough.
-            fragmentStateManager = new FragmentStateManager(mLifecycleCallbacksDispatcher,
-                    mFragmentStore, f);
-            // Only allow this FragmentStateManager to go up to CREATED at the most
-            fragmentStateManager.setFragmentManagerState(Fragment.CREATED);
-        }
-        // When inflating an Activity view with a resource instead of using setContentView(), and
-        // that resource adds a fragment using the <fragment> tag (i.e. from layout and in layout),
-        // the fragment will move to the VIEW_CREATED state before the fragment manager
-        // moves to CREATED. So when moving the fragment manager moves to CREATED and the
-        // inflated fragment is already in VIEW_CREATED we need to move new state up from CREATED
-        // to VIEW_CREATED. This avoids accidentally moving the fragment back down to CREATED
-        // which would immediately destroy the Fragment's view. We rely on computeExpectedState()
-        // to pull the state back down if needed.
-        if (f.mFromLayout && f.mInLayout && f.mState == Fragment.VIEW_CREATED) {
-            newState = Math.max(newState, Fragment.VIEW_CREATED);
-        }
-        newState = Math.min(newState, fragmentStateManager.computeExpectedState());
-        if (f.mState <= newState) {
-            // If we are moving to the same state, we do not need to give up on the animation.
-            if (f.mState < newState && !mExitAnimationCancellationSignals.isEmpty()) {
-                // The fragment is currently being animated...  but!  Now we
-                // want to move our state back up.  Give up on waiting for the
-                // animation and proceed from where we are.
-                cancelExitAnimation(f);
-            }
-            switch (f.mState) {
-                case Fragment.INITIALIZING:
-                    if (newState > Fragment.INITIALIZING) {
-                        fragmentStateManager.attach();
-                    }
-                    // fall through
-                case Fragment.ATTACHED:
-                    if (newState > Fragment.ATTACHED) {
-                        fragmentStateManager.create();
-                    }
-                    // fall through
-                case Fragment.CREATED:
-                    // We want to unconditionally run this anytime we do a moveToState that
-                    // moves the Fragment above INITIALIZING, including cases such as when
-                    // we move from CREATED => CREATED as part of the case fall through above.
-                    if (newState > Fragment.INITIALIZING) {
-                        fragmentStateManager.ensureInflatedView();
-                    }
-
-                    if (newState > Fragment.CREATED) {
-                        fragmentStateManager.createView();
-                    }
-                    // fall through
-                case Fragment.VIEW_CREATED:
-                    if (newState > Fragment.VIEW_CREATED) {
-                        fragmentStateManager.activityCreated();
-                    }
-                    // fall through
-                case Fragment.ACTIVITY_CREATED:
-                    if (newState > Fragment.ACTIVITY_CREATED) {
-                        fragmentStateManager.start();
-                    }
-                    // fall through
-                case Fragment.STARTED:
-                    if (newState > Fragment.STARTED) {
-                        fragmentStateManager.resume();
-                    }
-            }
-        } else if (f.mState > newState) {
-            switch (f.mState) {
-                case Fragment.RESUMED:
-                    if (newState < Fragment.RESUMED) {
-                        fragmentStateManager.pause();
-                    }
-                    // fall through
-                case Fragment.STARTED:
-                    if (newState < Fragment.STARTED) {
-                        fragmentStateManager.stop();
-                    }
-                    // fall through
-                case Fragment.ACTIVITY_CREATED:
-                    if (newState < Fragment.ACTIVITY_CREATED) {
-                        if (isLoggingEnabled(Log.DEBUG)) {
-                            Log.d(TAG, "movefrom ACTIVITY_CREATED: " + f);
-                        }
-                        if (f.mView != null) {
-                            // Need to save the current view state if not
-                            // done already.
-                            if (mHost.onShouldSaveFragmentState(f) && f.mSavedViewState == null) {
-                                fragmentStateManager.saveViewState();
-                            }
-                        }
-                    }
-                    // fall through
-                case Fragment.VIEW_CREATED:
-                    if (newState < Fragment.VIEW_CREATED) {
-                        FragmentAnim.AnimationOrAnimator anim = null;
-                        if (f.mView != null && f.mContainer != null) {
-                            // Stop any current animations:
-                            f.mContainer.endViewTransition(f.mView);
-                            f.mView.clearAnimation();
-                            // If parent is being removed, no need to handle child animations.
-                            if (!f.isRemovingParent()) {
-                                if (mCurState > Fragment.INITIALIZING && !mDestroyed
-                                        && f.mView.getVisibility() == View.VISIBLE
-                                        && f.mPostponedAlpha >= 0) {
-                                    anim = FragmentAnim.loadAnimation(mHost.getContext(),
-                                            f, false, f.getPopDirection());
-                                }
-                                f.mPostponedAlpha = 0;
-                                // Robolectric tests do not post the animation like a real device
-                                // so we should keep up with the container and view in case the
-                                // fragment view is destroyed before we can remove it.
-                                ViewGroup container = f.mContainer;
-                                View view = f.mView;
-                                if (anim != null) {
-                                    FragmentAnim.animateRemoveFragment(f, anim,
-                                            mFragmentTransitionCallback);
-                                }
-                                container.removeView(view);
-                                if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                                    Log.v(FragmentManager.TAG, "Removing view " + view + " for "
-                                            + "fragment " + f + " from container " + container);
-                                }
-                                // If the local container is different from the fragment
-                                // container, that means onAnimationEnd was called, onDestroyView
-                                // was dispatched and the fragment was already moved to state, so
-                                // we should early return here instead of attempting to move to
-                                // state again.
-                                if (container != f.mContainer) {
-                                    return;
-                                }
-                            }
-                        }
-                        // If a fragment has an exit animation (or transition), do not destroy
-                        // its view immediately and set the state after animating
-                        if (mExitAnimationCancellationSignals.get(f) == null) {
-                            fragmentStateManager.destroyFragmentView();
-                        }
-                    }
-                    // fall through
-                case Fragment.CREATED:
-                    if (newState < Fragment.CREATED) {
-                        if (mExitAnimationCancellationSignals.get(f) != null) {
-                            // We are waiting for the fragment's view to finish animating away.
-                            newState = Fragment.CREATED;
-                        } else {
-                            fragmentStateManager.destroy();
-                        }
-                    }
-                    // fall through
-                case Fragment.ATTACHED:
-                    if (newState < Fragment.ATTACHED) {
-                        fragmentStateManager.detach();
-                    }
-            }
-        }
-
-        if (f.mState != newState) {
-            if (isLoggingEnabled(Log.DEBUG)) {
-                Log.d(TAG, "moveToState: Fragment state for " + f + " not updated inline; "
-                        + "expected state " + newState + " found " + f.mState);
-            }
-            f.mState = newState;
-        }
-    }
-
-    // If there is a listener associated with the given fragment, remove that listener and
-    // destroy the fragment's view.
-    private void cancelExitAnimation(@NonNull Fragment f) {
-        HashSet<CancellationSignal> signals = mExitAnimationCancellationSignals.get(f);
-        if (signals != null) {
-            for (CancellationSignal signal: signals) {
-                signal.cancel();
-            }
-            signals.clear();
-            destroyFragmentView(f);
-            mExitAnimationCancellationSignals.remove(f);
-        }
-    }
-
     /**
      * Allows for changing the draw order on a container, if the container is a
      * FragmentContainerView.
@@ -1565,123 +1297,6 @@
         }
     }
 
-    private void destroyFragmentView(@NonNull Fragment fragment) {
-        fragment.performDestroyView();
-        mLifecycleCallbacksDispatcher.dispatchOnFragmentViewDestroyed(fragment, false);
-        fragment.mContainer = null;
-        fragment.mView = null;
-        // Set here to ensure that Observers are called after
-        // the Fragment's view is set to null
-        fragment.mViewLifecycleOwner = null;
-        fragment.mViewLifecycleOwnerLiveData.setValue(null);
-        fragment.mInLayout = false;
-    }
-
-    void moveToState(@NonNull Fragment f) {
-        moveToState(f, mCurState);
-    }
-
-    /**
-     * Fragments that have been shown or hidden don't have their visibility changed or
-     * animations run during the {@link #showFragment(Fragment)} or {@link #hideFragment(Fragment)}
-     * calls. After fragments are brought to their final state in
-     * {@link #moveFragmentToExpectedState(Fragment)} the fragments that have been shown or
-     * hidden must have their visibility changed and their animations started here.
-     *
-     * @param fragment The fragment with mHiddenChanged = true that should change its View's
-     *                 visibility and start the show or hide animation.
-     */
-    private void completeShowHideFragment(@NonNull final Fragment fragment) {
-        if (fragment.mView != null) {
-            FragmentAnim.AnimationOrAnimator anim = FragmentAnim.loadAnimation(
-                    mHost.getContext(), fragment, !fragment.mHidden, fragment.getPopDirection());
-            if (anim != null && anim.animator != null) {
-                anim.animator.setTarget(fragment.mView);
-                if (fragment.mHidden) {
-                    if (fragment.isHideReplaced()) {
-                        fragment.setHideReplaced(false);
-                    } else {
-                        final ViewGroup container = fragment.mContainer;
-                        final View animatingView = fragment.mView;
-                        container.startViewTransition(animatingView);
-                        // Delay the actual hide operation until the animation finishes,
-                        // otherwise the fragment will just immediately disappear
-                        anim.animator.addListener(new AnimatorListenerAdapter() {
-                            @Override
-                            public void onAnimationEnd(Animator animation) {
-                                container.endViewTransition(animatingView);
-                                animation.removeListener(this);
-                                if (fragment.mView != null && fragment.mHidden) {
-                                    fragment.mView.setVisibility(View.GONE);
-                                }
-                            }
-                        });
-                    }
-                } else {
-                    fragment.mView.setVisibility(View.VISIBLE);
-                }
-                anim.animator.start();
-            } else {
-                if (anim != null) {
-                    fragment.mView.startAnimation(anim.animation);
-                    anim.animation.start();
-                }
-                final int visibility = fragment.mHidden && !fragment.isHideReplaced()
-                        ? View.GONE
-                        : View.VISIBLE;
-                fragment.mView.setVisibility(visibility);
-                if (fragment.isHideReplaced()) {
-                    fragment.setHideReplaced(false);
-                }
-            }
-        }
-        invalidateMenuForFragment(fragment);
-        fragment.mHiddenChanged = false;
-        fragment.onHiddenChanged(fragment.mHidden);
-    }
-
-    /**
-     * Moves a fragment to its expected final state or the fragment manager's state, depending
-     * on whether the fragment manager's state is raised properly.
-     *
-     * @param f The fragment to change.
-     */
-    void moveFragmentToExpectedState(@NonNull Fragment f) {
-        if (!mFragmentStore.containsActiveFragment(f.mWho)) {
-            if (isLoggingEnabled(Log.DEBUG)) {
-                Log.d(TAG, "Ignoring moving " + f + " to state " + mCurState
-                        + "since it is not added to " + this);
-            }
-            return;
-        }
-        moveToState(f);
-
-        if (f.mView != null) {
-            if (f.mIsNewlyAdded && f.mContainer != null) {
-                // Make it visible and run the animations
-                if (f.mPostponedAlpha > 0f) {
-                    f.mView.setAlpha(f.mPostponedAlpha);
-                }
-                f.mPostponedAlpha = 0f;
-                f.mIsNewlyAdded = false;
-                // run animations:
-                FragmentAnim.AnimationOrAnimator anim = FragmentAnim.loadAnimation(
-                        mHost.getContext(), f, true, f.getPopDirection());
-                if (anim != null) {
-                    if (anim.animation != null) {
-                        f.mView.startAnimation(anim.animation);
-                    } else {
-                        anim.animator.setTarget(f.mView);
-                        anim.animator.start();
-                    }
-                }
-            }
-        }
-        if (f.mHiddenChanged) {
-            completeShowHideFragment(f);
-        }
-    }
-
     /**
      * Changes the state of the fragment manager to {@code newState}. If the fragment manager
      * changes state or {@code always} is {@code true}, any fragments within it have their
@@ -1701,30 +1316,7 @@
         }
 
         mCurState = newState;
-
-        if (USE_STATE_MANAGER) {
-            mFragmentStore.moveToExpectedState();
-        } else {
-            // Must add them in the proper order. mActive fragments may be out of order
-            for (Fragment f : mFragmentStore.getFragments()) {
-                moveFragmentToExpectedState(f);
-            }
-
-            // Now iterate through all active fragments. These will include those that are removed
-            // and detached.
-            for (FragmentStateManager fragmentStateManager :
-                    mFragmentStore.getActiveFragmentStateManagers()) {
-                Fragment f = fragmentStateManager.getFragment();
-                if (!f.mIsNewlyAdded) {
-                    moveFragmentToExpectedState(f);
-                }
-                boolean beingRemoved = f.mRemoving && !f.isInBackStack();
-                if (beingRemoved) {
-                    mFragmentStore.makeInactive(fragmentStateManager);
-                }
-            }
-        }
-
+        mFragmentStore.moveToExpectedState();
         startPendingDeferredFragments();
 
         if (mNeedMenuInvalidate && mHost != null && mCurState == Fragment.RESUMED) {
@@ -1800,8 +1392,7 @@
     }
 
     /**
-     * Marks a fragment as hidden to be later animated in with
-     * {@link #completeShowHideFragment(Fragment)}.
+     * Marks a fragment as hidden to be later animated.
      *
      * @param fragment The fragment to be shown.
      */
@@ -1817,8 +1408,7 @@
     }
 
     /**
-     * Marks a fragment as shown to be later animated in with
-     * {@link #completeShowHideFragment(Fragment)}.
+     * Marks a fragment as shown to be later animated.
      *
      * @param fragment The fragment to be shown.
      */
@@ -1967,10 +1557,8 @@
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     void scheduleCommit() {
         synchronized (mPendingActions) {
-            boolean postponeReady =
-                    mPostponedTransactions != null && !mPostponedTransactions.isEmpty();
             boolean pendingReady = mPendingActions.size() == 1;
-            if (postponeReady || pendingReady) {
+            if (pendingReady) {
                 mHost.getHandler().removeCallbacks(mExecCommit);
                 mHost.getHandler().post(mExecCommit);
                 updateOnBackPressedCallbackEnabled();
@@ -2013,12 +1601,6 @@
             mTmpRecords = new ArrayList<>();
             mTmpIsPop = new ArrayList<>();
         }
-        mExecutingActions = true;
-        try {
-            executePostponedTransaction(null, null);
-        } finally {
-            mExecutingActions = false;
-        }
     }
 
     void execSingleAction(@NonNull OpGenerator action, boolean allowStateLoss) {
@@ -2076,44 +1658,6 @@
     }
 
     /**
-     * Complete the execution of transactions that have previously been postponed, but are
-     * now ready.
-     */
-    private void executePostponedTransaction(@Nullable ArrayList<BackStackRecord> records,
-            @Nullable ArrayList<Boolean> isRecordPop) {
-        int numPostponed = mPostponedTransactions == null ? 0 : mPostponedTransactions.size();
-        for (int i = 0; i < numPostponed; i++) {
-            StartEnterTransitionListener listener = mPostponedTransactions.get(i);
-            if (records != null && !listener.mIsBack) {
-                int index = records.indexOf(listener.mRecord);
-                if (index != -1 && isRecordPop != null && isRecordPop.get(index)) {
-                    mPostponedTransactions.remove(i);
-                    i--;
-                    numPostponed--;
-                    listener.cancelTransaction();
-                    continue;
-                }
-            }
-            if (listener.isReady() || (records != null
-                    && listener.mRecord.interactsWith(records, 0, records.size()))) {
-                mPostponedTransactions.remove(i);
-                i--;
-                numPostponed--;
-                int index;
-                if (records != null && !listener.mIsBack
-                        && (index = records.indexOf(listener.mRecord)) != -1
-                        && isRecordPop != null
-                        && isRecordPop.get(index)) {
-                    // This is popping a postponed transaction
-                    listener.cancelTransaction();
-                } else {
-                    listener.completeTransaction();
-                }
-            }
-        }
-    }
-
-    /**
      * Remove redundant BackStackRecord operations and executes them. This method merges operations
      * of proximate records that allow reordering. See
      * {@link FragmentTransaction#setReorderingAllowed(boolean)}.
@@ -2137,9 +1681,6 @@
             throw new IllegalStateException("Internal error with the back stack records");
         }
 
-        // Force start of any postponed transactions that interact with scheduled transactions:
-        executePostponedTransaction(records, isRecordPop);
-
         final int numRecords = records.size();
         int startIndex = 0;
         for (int recordNum = 0; recordNum < numRecords; recordNum++) {
@@ -2201,24 +1742,18 @@
         mTmpAddedFragments.clear();
 
         if (!allowReordering && mCurState >= Fragment.CREATED) {
-            if (USE_STATE_MANAGER) {
-                // When reordering isn't allowed, we may be operating on Fragments that haven't
-                // been made active
-                for (int index = startIndex; index < endIndex; index++) {
-                    BackStackRecord record = records.get(index);
-                    for (FragmentTransaction.Op op : record.mOps) {
-                        Fragment fragment = op.mFragment;
-                        if (fragment != null && fragment.mFragmentManager != null) {
-                            FragmentStateManager fragmentStateManager =
-                                    createOrGetFragmentStateManager(fragment);
-                            mFragmentStore.makeActive(fragmentStateManager);
-                        }
+            // When reordering isn't allowed, we may be operating on Fragments that haven't
+            // been made active
+            for (int index = startIndex; index < endIndex; index++) {
+                BackStackRecord record = records.get(index);
+                for (FragmentTransaction.Op op : record.mOps) {
+                    Fragment fragment = op.mFragment;
+                    if (fragment != null && fragment.mFragmentManager != null) {
+                        FragmentStateManager fragmentStateManager =
+                                createOrGetFragmentStateManager(fragment);
+                        mFragmentStore.makeActive(fragmentStateManager);
                     }
                 }
-            } else {
-                FragmentTransition.startTransitions(mHost.getContext(), mContainer,
-                        records, isRecordPop, startIndex, endIndex,
-                        false, mFragmentTransitionCallback);
             }
         }
         executeOps(records, isRecordPop, startIndex, endIndex);
@@ -2228,70 +1763,49 @@
             record.runOnExecuteRunnables();
         }
 
-        if (USE_STATE_MANAGER) {
-            // The last operation determines the overall direction, this ensures that operations
-            // such as push, push, pop, push are correctly considered a push
-            boolean isPop = isRecordPop.get(endIndex - 1);
-            // Ensure that Fragments directly affected by operations
-            // are moved to their expected state in operation order
-            for (int index = startIndex; index < endIndex; index++) {
-                BackStackRecord record = records.get(index);
-                if (isPop) {
-                    // Pop operations get applied in reverse order
-                    for (int opIndex = record.mOps.size() - 1; opIndex >= 0; opIndex--) {
-                        FragmentTransaction.Op op = record.mOps.get(opIndex);
-                        Fragment fragment = op.mFragment;
-                        if (fragment != null) {
-                            FragmentStateManager fragmentStateManager =
-                                    createOrGetFragmentStateManager(fragment);
-                            fragmentStateManager.moveToExpectedState();
-                        }
-                    }
-                } else {
-                    for (FragmentTransaction.Op op : record.mOps) {
-                        Fragment fragment = op.mFragment;
-                        if (fragment != null) {
-                            FragmentStateManager fragmentStateManager =
-                                    createOrGetFragmentStateManager(fragment);
-                            fragmentStateManager.moveToExpectedState();
-                        }
+        // The last operation determines the overall direction, this ensures that operations
+        // such as push, push, pop, push are correctly considered a push
+        boolean isPop = isRecordPop.get(endIndex - 1);
+        // Ensure that Fragments directly affected by operations
+        // are moved to their expected state in operation order
+        for (int index = startIndex; index < endIndex; index++) {
+            BackStackRecord record = records.get(index);
+            if (isPop) {
+                // Pop operations get applied in reverse order
+                for (int opIndex = record.mOps.size() - 1; opIndex >= 0; opIndex--) {
+                    FragmentTransaction.Op op = record.mOps.get(opIndex);
+                    Fragment fragment = op.mFragment;
+                    if (fragment != null) {
+                        FragmentStateManager fragmentStateManager =
+                                createOrGetFragmentStateManager(fragment);
+                        fragmentStateManager.moveToExpectedState();
                     }
                 }
-
-            }
-            // And only then do we move all other fragments to the current state
-            moveToState(mCurState, true);
-            Set<SpecialEffectsController> changedControllers = collectChangedControllers(
-                    records, startIndex, endIndex);
-            for (SpecialEffectsController controller : changedControllers) {
-                controller.updateOperationDirection(isPop);
-                controller.markPostponedState();
-                controller.executePendingOperations();
-            }
-        } else {
-            int postponeIndex = endIndex;
-            if (allowReordering) {
-                ArraySet<Fragment> addedFragments = new ArraySet<>();
-                addAddedFragments(addedFragments);
-                postponeIndex = postponePostponableTransactions(records, isRecordPop,
-                        startIndex, endIndex, addedFragments);
-                makeRemovedFragmentsInvisible(addedFragments);
-            }
-
-            if (postponeIndex != startIndex && allowReordering) {
-                // need to run something now
-                if (mCurState >= Fragment.CREATED) {
-                    FragmentTransition.startTransitions(mHost.getContext(), mContainer,
-                            records, isRecordPop, startIndex,
-                            postponeIndex, true, mFragmentTransitionCallback);
+            } else {
+                for (FragmentTransaction.Op op : record.mOps) {
+                    Fragment fragment = op.mFragment;
+                    if (fragment != null) {
+                        FragmentStateManager fragmentStateManager =
+                                createOrGetFragmentStateManager(fragment);
+                        fragmentStateManager.moveToExpectedState();
+                    }
                 }
-                moveToState(mCurState, true);
             }
+
+        }
+        // And only then do we move all other fragments to the current state
+        moveToState(mCurState, true);
+        Set<SpecialEffectsController> changedControllers = collectChangedControllers(
+                records, startIndex, endIndex);
+        for (SpecialEffectsController controller : changedControllers) {
+            controller.updateOperationDirection(isPop);
+            controller.markPostponedState();
+            controller.executePendingOperations();
         }
 
         for (int recordNum = startIndex; recordNum < endIndex; recordNum++) {
             final BackStackRecord record = records.get(recordNum);
-            final boolean isPop = isRecordPop.get(recordNum);
+            isPop = isRecordPop.get(recordNum);
             if (isPop && record.mIndex >= 0) {
                 record.mIndex = -1;
             }
@@ -2322,132 +1836,6 @@
     }
 
     /**
-     * Any fragments that were removed because they have been postponed should have their views
-     * made invisible by setting their alpha to 0.
-     *
-     * @param fragments The fragments that were added during operation execution. Only the ones
-     *                  that are no longer added will have their alpha changed.
-     */
-    private void makeRemovedFragmentsInvisible(@NonNull ArraySet<Fragment> fragments) {
-        final int numAdded = fragments.size();
-        for (int i = 0; i < numAdded; i++) {
-            final Fragment fragment = fragments.valueAt(i);
-            if (!fragment.mAdded) {
-                final View view = fragment.requireView();
-                fragment.mPostponedAlpha = view.getAlpha();
-                view.setAlpha(0f);
-            }
-        }
-    }
-
-    /**
-     * Examine all transactions and determine which ones are marked as postponed. Those will
-     * have their operations rolled back and moved to the end of the record list (up to endIndex).
-     * It will also add the postponed transaction to the queue.
-     *
-     * @param records A list of BackStackRecords that should be checked.
-     * @param isRecordPop The direction that these records are being run.
-     * @param startIndex The index of the first record in <code>records</code> to be checked
-     * @param endIndex One more than the final record index in <code>records</code> to be checked.
-     * @return The index of the first postponed transaction or endIndex if no transaction was
-     * postponed.
-     */
-    private int postponePostponableTransactions(@NonNull ArrayList<BackStackRecord> records,
-            @NonNull ArrayList<Boolean> isRecordPop, int startIndex, int endIndex,
-            @NonNull ArraySet<Fragment> added) {
-        int postponeIndex = endIndex;
-        for (int i = endIndex - 1; i >= startIndex; i--) {
-            final BackStackRecord record = records.get(i);
-            final boolean isPop = isRecordPop.get(i);
-            boolean isPostponed = record.isPostponed()
-                    && !record.interactsWith(records, i + 1, endIndex);
-            if (isPostponed) {
-                if (mPostponedTransactions == null) {
-                    mPostponedTransactions = new ArrayList<>();
-                }
-                StartEnterTransitionListener listener =
-                        new StartEnterTransitionListener(record, isPop);
-                mPostponedTransactions.add(listener);
-                record.setOnStartPostponedListener(listener);
-
-                // roll back the transaction
-                if (isPop) {
-                    record.executeOps();
-                } else {
-                    record.executePopOps(false);
-                }
-
-                // move to the end
-                postponeIndex--;
-                if (i != postponeIndex) {
-                    records.remove(i);
-                    records.add(postponeIndex, record);
-                }
-
-                // different views may be visible now
-                addAddedFragments(added);
-            }
-        }
-        return postponeIndex;
-    }
-
-    /**
-     * When a postponed transaction is ready to be started, this completes the transaction,
-     * removing, hiding, or showing views as well as starting the animations and transitions.
-     * <p>
-     * {@code runtransitions} is set to false when the transaction postponement was interrupted
-     * abnormally -- normally by a new transaction being started that affects the postponed
-     * transaction.
-     *
-     * @param record The transaction to run
-     * @param isPop true if record is popping or false if it is adding
-     * @param runTransitions true if the fragment transition should be run or false otherwise.
-     * @param moveToState true if the state should be changed after executing the operations.
-     *                    This is false when the transaction is canceled when a postponed
-     *                    transaction is popped.
-     */
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    void completeExecute(@NonNull BackStackRecord record, boolean isPop, boolean runTransitions,
-            boolean moveToState) {
-        if (isPop) {
-            record.executePopOps(moveToState);
-        } else {
-            record.executeOps();
-        }
-        ArrayList<BackStackRecord> records = new ArrayList<>(1);
-        ArrayList<Boolean> isRecordPop = new ArrayList<>(1);
-        records.add(record);
-        isRecordPop.add(isPop);
-        if (runTransitions && mCurState >= Fragment.CREATED) {
-            FragmentTransition.startTransitions(mHost.getContext(), mContainer,
-                    records, isRecordPop, 0, 1, true,
-                    mFragmentTransitionCallback);
-        }
-        if (moveToState) {
-            moveToState(mCurState, true);
-        }
-
-        for (Fragment fragment : mFragmentStore.getActiveFragments()) {
-            // Allow added fragments to be removed during the pop since we aren't going
-            // to move them to the final state with moveToState(mCurState).
-            if (fragment != null) {
-                if (fragment.mView != null && fragment.mIsNewlyAdded
-                        && record.interactsWith(fragment.mContainerId)) {
-                    if (fragment.mPostponedAlpha > 0) {
-                        fragment.mView.setAlpha(fragment.mPostponedAlpha);
-                    }
-                    if (moveToState) {
-                        fragment.mPostponedAlpha = 0;
-                    } else {
-                        fragment.mPostponedAlpha = -1;
-                        fragment.mIsNewlyAdded = false;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
      * Run the operations in the BackStackRecords, either to push or pop.
      *
      * @param records The list of records whose operations should be run.
@@ -2462,10 +1850,7 @@
             final boolean isPop = isRecordPop.get(i);
             if (isPop) {
                 record.bumpBackStackNesting(-1);
-                // Only execute the add operations at the end of
-                // all transactions.
-                boolean moveToState = i == (endIndex - 1);
-                record.executePopOps(moveToState);
+                record.executePopOps();
             } else {
                 record.bumpBackStackNesting(1);
                 record.executeOps();
@@ -2516,42 +1901,12 @@
     }
 
     /**
-     * Ensure that fragments that are added are moved to at least the CREATED state.
-     * Any newly-added Views are inserted into {@code added} so that the Transaction can be
-     * postponed with {@link Fragment#postponeEnterTransition()}. They will later be made
-     * invisible (by setting their alpha to 0) if they have been removed when postponed.
-     */
-    private void addAddedFragments(@NonNull ArraySet<Fragment> added) {
-        if (mCurState < Fragment.CREATED) {
-            return;
-        }
-        // We want to leave the fragment in the started state
-        final int state = Math.min(mCurState, Fragment.STARTED);
-        for (Fragment fragment : mFragmentStore.getFragments()) {
-            if (fragment.mState < state) {
-                moveToState(fragment, state);
-                if (fragment.mView != null && !fragment.mHidden && fragment.mIsNewlyAdded) {
-                    added.add(fragment);
-                }
-            }
-        }
-    }
-
-    /**
      * Starts all postponed transactions regardless of whether they are ready or not.
      */
     private void forcePostponedTransactions() {
-        if (USE_STATE_MANAGER) {
-            Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
-            for (SpecialEffectsController controller : controllers) {
-                controller.forcePostponedExecutePendingOperations();
-            }
-        } else {
-            if (mPostponedTransactions != null) {
-                while (!mPostponedTransactions.isEmpty()) {
-                    mPostponedTransactions.remove(0).completeTransaction();
-                }
-            }
+        Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
+        for (SpecialEffectsController controller : controllers) {
+            controller.forcePostponedExecutePendingOperations();
         }
     }
 
@@ -2560,18 +1915,9 @@
      * This is used prior to saving the state so that the correct state is saved.
      */
     private void endAnimatingAwayFragments() {
-        if (USE_STATE_MANAGER) {
-            Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
-            for (SpecialEffectsController controller : controllers) {
-                controller.forceCompleteAllOperations();
-            }
-        } else {
-            if (!mExitAnimationCancellationSignals.isEmpty()) {
-                for (Fragment fragment: mExitAnimationCancellationSignals.keySet()) {
-                    cancelExitAnimation(fragment);
-                    moveToState(fragment);
-                }
-            }
+        Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
+        for (SpecialEffectsController controller : controllers) {
+            controller.forceCompleteAllOperations();
         }
     }
 
@@ -3368,11 +2714,9 @@
             mExecutingActions = true;
             mFragmentStore.dispatchStateChange(nextState);
             moveToState(nextState, false);
-            if (USE_STATE_MANAGER) {
-                Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
-                for (SpecialEffectsController controller : controllers) {
-                    controller.forceCompleteAllOperations();
-                }
+            Set<SpecialEffectsController> controllers = collectAllSpecialEffectsController();
+            for (SpecialEffectsController controller : controllers) {
+                controller.forceCompleteAllOperations();
             }
         } finally {
             mExecutingActions = false;
@@ -3737,7 +3081,6 @@
 
     /** Returns the current policy for this FragmentManager. If no policy is set, returns null. */
     @Nullable
-    @RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
     public FragmentStrictMode.Policy getStrictModePolicy() {
         return mStrictModePolicy;
     }
@@ -3750,7 +3093,6 @@
      *
      * @param policy the policy to put into place
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
     public void setStrictModePolicy(@Nullable FragmentStrictMode.Policy policy) {
         mStrictModePolicy = policy;
     }
@@ -3837,80 +3179,6 @@
         }
     }
 
-    /**
-     * A listener for a postponed transaction. This waits until
-     * {@link Fragment#startPostponedEnterTransition()} is called or a transaction is started
-     * that interacts with this one, based on interactions with the fragment container.
-     */
-    static class StartEnterTransitionListener
-            implements Fragment.OnStartEnterTransitionListener {
-        final boolean mIsBack;
-        final BackStackRecord mRecord;
-        private int mNumPostponed;
-
-        StartEnterTransitionListener(@NonNull BackStackRecord record, boolean isBack) {
-            mIsBack = isBack;
-            mRecord = record;
-        }
-
-        /**
-         * Called from {@link Fragment#startPostponedEnterTransition()}, this decreases the
-         * number of Fragments that are postponed. This may cause the transaction to schedule
-         * to finish running and run transitions and animations.
-         */
-        @Override
-        public void onStartEnterTransition() {
-            mNumPostponed--;
-            if (mNumPostponed != 0) {
-                return;
-            }
-            mRecord.mManager.scheduleCommit();
-        }
-
-        /**
-         * Called from {@link Fragment#
-         * setOnStartEnterTransitionListener(Fragment.OnStartEnterTransitionListener)}, this
-         * increases the number of fragments that are postponed as part of this transaction.
-         */
-        @Override
-        public void startListening() {
-            mNumPostponed++;
-        }
-
-        /**
-         * @return true if there are no more postponed fragments as part of the transaction.
-         */
-        public boolean isReady() {
-            return mNumPostponed == 0;
-        }
-
-        /**
-         * Completes the transaction and start the animations and transitions. This may skip
-         * the transitions if this is called before all fragments have called
-         * {@link Fragment#startPostponedEnterTransition()}.
-         */
-        void completeTransaction() {
-            final boolean canceled;
-            canceled = mNumPostponed > 0;
-            FragmentManager manager = mRecord.mManager;
-            for (Fragment fragment : manager.getFragments()) {
-                fragment.setOnStartEnterTransitionListener(null);
-                if (canceled && fragment.isPostponed()) {
-                    fragment.startPostponedEnterTransition();
-                }
-            }
-            mRecord.mManager.completeExecute(mRecord, mIsBack, !canceled, true);
-        }
-
-        /**
-         * Cancels this transaction instead of completing it. That means that the state isn't
-         * changed, so the pop results in no change to the state.
-         */
-        void cancelTransaction() {
-            mRecord.mManager.completeExecute(mRecord, mIsBack, false, false);
-        }
-    }
-
     @SuppressLint("BanParcelableUsage")
     static class LaunchedFragmentInfo implements Parcelable {
         String mWho;
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
index 7d24a8c..5ebc691 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -199,7 +199,7 @@
             maxState = Math.min(maxState, Fragment.CREATED);
         }
         SpecialEffectsController.Operation.LifecycleImpact awaitingEffect = null;
-        if (FragmentManager.USE_STATE_MANAGER && mFragment.mContainer != null) {
+        if (mFragment.mContainer != null) {
             SpecialEffectsController controller = SpecialEffectsController.getOrCreateController(
                     mFragment.mContainer, mFragment.getParentFragmentManager());
             awaitingEffect = controller.getAwaitingCompletionLifecycleImpact(this);
@@ -338,7 +338,7 @@
                     }
                 }
             }
-            if (FragmentManager.USE_STATE_MANAGER && mFragment.mHiddenChanged) {
+            if (mFragment.mHiddenChanged) {
                 if (mFragment.mView != null && mFragment.mContainer != null) {
                     // Get the controller and enqueue the show/hide
                     SpecialEffectsController controller = SpecialEffectsController
@@ -436,10 +436,7 @@
             targetFragmentStateManager = null;
         }
         if (targetFragmentStateManager != null) {
-            if (FragmentManager.USE_STATE_MANAGER
-                    || targetFragmentStateManager.getFragment().mState < Fragment.CREATED) {
-                targetFragmentStateManager.moveToExpectedState();
-            }
+            targetFragmentStateManager.moveToExpectedState();
         }
         mFragment.mHost = mFragment.mFragmentManager.getHost();
         mFragment.mParentFragment = mFragment.mFragmentManager.getParent();
@@ -534,26 +531,19 @@
                     mFragment, mFragment.mView, mFragment.mSavedFragmentState, false);
             int postOnViewCreatedVisibility = mFragment.mView.getVisibility();
             float postOnViewCreatedAlpha = mFragment.mView.getAlpha();
-            if (FragmentManager.USE_STATE_MANAGER) {
-                mFragment.setPostOnViewCreatedAlpha(postOnViewCreatedAlpha);
-                if (mFragment.mContainer != null && postOnViewCreatedVisibility == View.VISIBLE) {
-                    // Save the focused view if one was set via requestFocus()
-                    View focusedView = mFragment.mView.findFocus();
-                    if (focusedView != null) {
-                        mFragment.setFocusedView(focusedView);
-                        if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
-                            Log.v(TAG, "requestFocus: Saved focused view " + focusedView
-                                    + " for Fragment " + mFragment);
-                        }
+            mFragment.setPostOnViewCreatedAlpha(postOnViewCreatedAlpha);
+            if (mFragment.mContainer != null && postOnViewCreatedVisibility == View.VISIBLE) {
+                // Save the focused view if one was set via requestFocus()
+                View focusedView = mFragment.mView.findFocus();
+                if (focusedView != null) {
+                    mFragment.setFocusedView(focusedView);
+                    if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
+                        Log.v(TAG, "requestFocus: Saved focused view " + focusedView
+                                + " for Fragment " + mFragment);
                     }
-                    // Set the view alpha to 0
-                    mFragment.mView.setAlpha(0f);
                 }
-            } else {
-                // Only animate the view if it is visible. This is done after
-                // dispatchOnFragmentViewCreated in case visibility is changed
-                mFragment.mIsNewlyAdded = (postOnViewCreatedVisibility == View.VISIBLE)
-                        && mFragment.mContainer != null;
+                // Set the view alpha to 0
+                mFragment.mView.setAlpha(0f);
             }
         }
         mFragment.mState = Fragment.VIEW_CREATED;
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManagerControl.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManagerControl.java
deleted file mode 100644
index de8bdbe..0000000
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManagerControl.java
+++ /dev/null
@@ -1,33 +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.fragment.app;
-
-import androidx.annotation.experimental.Experimental;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @see FragmentManager#enableNewStateManager(boolean)
- */
-@Retention(RetentionPolicy.CLASS)
-@Target({ElementType.METHOD})
-@Experimental(level = Experimental.Level.WARNING)
-public @interface FragmentStateManagerControl {
-}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStore.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStore.java
index c7bfb2a..19f4e05 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStore.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStore.java
@@ -403,7 +403,7 @@
 
         if (!mActive.isEmpty()) {
             writer.print(prefix);
-            writer.print("Active Fragments:");
+            writer.println("Active Fragments:");
             for (FragmentStateManager fragmentStateManager : mActive.values()) {
                 writer.print(prefix);
                 if (fragmentStateManager != null) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
index 7e79244..1ed008c 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
@@ -552,7 +552,7 @@
      * set different animations by calling this method prior to each operation, e.g:
      *
      * <pre class="prettyprint">
-     *  fragmentManager.beingTransaction()
+     *  fragmentManager.beginTransaction()
      *      .setCustomAnimations(enter1, exit1)
      *      .add(MyFragmentClass, args, tag1) // this fragment gets the first animations
      *      .setCustomAnimations(enter2, exit2)
@@ -582,7 +582,7 @@
      * set different animations by calling this method prior to each operation, e.g:
      *
      * <pre class="prettyprint">
-     *  fragmentManager.beingTransaction()
+     *  fragmentManager.beginTransaction()
      *      .setCustomAnimations(enter1, exit1, popEnter1, popExit1)
      *      .add(MyFragmentClass, args, tag1) // this fragment gets the first animations
      *      .setCustomAnimations(enter2, exit2, popEnter2, popExit2)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java
index c4729ca..6ee0e076 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransition.java
@@ -15,65 +15,21 @@
  */
 package androidx.fragment.app;
 
-import android.content.Context;
-import android.graphics.Rect;
 import android.os.Build;
-import android.util.SparseArray;
 import android.view.View;
-import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.collection.ArrayMap;
 import androidx.core.app.SharedElementCallback;
-import androidx.core.os.CancellationSignal;
-import androidx.core.view.OneShotPreDrawListener;
-import androidx.core.view.ViewCompat;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 /**
- * Contains the Fragment Transition functionality for both ordered and reordered
- * Fragment Transactions. With reordered fragment transactions, all Views have been
- * added to the View hierarchy prior to calling startTransitions. With ordered
- * fragment transactions, Views will be removed and added after calling startTransitions.
+ * Contains the Fragment Transition functionality.
  */
 class FragmentTransition {
-    /**
-     * The inverse of all BackStackRecord operation commands. This assumes that
-     * REPLACE operations have already been replaced by add/remove operations.
-     */
-    private static final int[] INVERSE_OPS = {
-            BackStackRecord.OP_NULL,                // inverse of OP_NULL (error)
-            BackStackRecord.OP_REMOVE,              // inverse of OP_ADD
-            BackStackRecord.OP_NULL,                // inverse of OP_REPLACE (error)
-            BackStackRecord.OP_ADD,                 // inverse of OP_REMOVE
-            BackStackRecord.OP_SHOW,                // inverse of OP_HIDE
-            BackStackRecord.OP_HIDE,                // inverse of OP_SHOW
-            BackStackRecord.OP_ATTACH,              // inverse of OP_DETACH
-            BackStackRecord.OP_DETACH,              // inverse of OP_ATTACH
-            BackStackRecord.OP_UNSET_PRIMARY_NAV,   // inverse of OP_SET_PRIMARY_NAV
-            BackStackRecord.OP_SET_PRIMARY_NAV,     // inverse of OP_UNSET_PRIMARY_NAV
-            BackStackRecord.OP_SET_MAX_LIFECYCLE
-    };
-
-    /**
-     * Interface to watch Fragment Transitions
-     */
-    interface Callback {
-        /**
-         * Called whenever an transition started
-         */
-        void onStart(@NonNull Fragment fragment, @NonNull CancellationSignal signal);
-
-        /**
-         * Called whenever an transition is complete
-         */
-        void onComplete(@NonNull Fragment fragment, @NonNull CancellationSignal signal);
-    }
-
     static final FragmentTransitionImpl PLATFORM_IMPL = Build.VERSION.SDK_INT >= 21
             ? new FragmentTransitionCompat21()
             : null;
@@ -93,847 +49,6 @@
     }
 
     /**
-     * The main entry point for Fragment Transitions, this starts the transitions
-     * set on the leaving Fragment's {@link Fragment#getExitTransition()}, the
-     * entering Fragment's {@link Fragment#getEnterTransition()} and
-     * {@link Fragment#getSharedElementEnterTransition()}. When popping,
-     * the leaving Fragment's {@link Fragment#getReturnTransition()} and
-     * {@link Fragment#getSharedElementReturnTransition()} and the entering
-     * {@link Fragment#getReenterTransition()} will be run.
-     * <p>
-     * With reordered Fragment Transitions, all Views have been added to the
-     * View hierarchy prior to calling this method. The incoming Fragment's Views
-     * will be INVISIBLE. With ordered Fragment Transitions, this method
-     * is called before any change has been made to the hierarchy. That means
-     * that the added Fragments have not created their Views yet and the hierarchy
-     * is unknown.
-     *
-     * @param context The hosting context
-     * @param fragmentContainer the FragmentContainer for finding the container for each Fragment
-     * @param records The list of transactions being executed.
-     * @param isRecordPop For each transaction, whether it is a pop transaction or not.
-     * @param startIndex The first index into records and isRecordPop to execute as
-     *                   part of this transition.
-     * @param endIndex One past the last index into records and isRecordPop to execute
-     *                 as part of this transition.
-     * @param isReordered true if this is a reordered transaction, meaning that the
-     *                    Views of incoming fragments have been added. false if the
-     *                    transaction has yet to be run and Views haven't been created.
-     */
-    static void startTransitions(@NonNull Context context,
-            @NonNull FragmentContainer fragmentContainer,
-            ArrayList<BackStackRecord> records, ArrayList<Boolean> isRecordPop,
-            int startIndex, int endIndex, boolean isReordered, Callback callback) {
-        SparseArray<FragmentContainerTransition> transitioningFragments =
-                new SparseArray<>();
-        for (int i = startIndex; i < endIndex; i++) {
-            final BackStackRecord record = records.get(i);
-            final boolean isPop = isRecordPop.get(i);
-            if (isPop) {
-                calculatePopFragments(record, transitioningFragments, isReordered);
-            } else {
-                calculateFragments(record, transitioningFragments, isReordered);
-            }
-        }
-
-        if (transitioningFragments.size() != 0) {
-            final View nonExistentView = new View(context);
-            final int numContainers = transitioningFragments.size();
-            for (int i = 0; i < numContainers; i++) {
-                int containerId = transitioningFragments.keyAt(i);
-                ArrayMap<String, String> nameOverrides = calculateNameOverrides(containerId,
-                        records, isRecordPop, startIndex, endIndex);
-
-                FragmentContainerTransition containerTransition =
-                        transitioningFragments.valueAt(i);
-
-                if (fragmentContainer.onHasView()) {
-                    ViewGroup container = (ViewGroup) fragmentContainer.onFindViewById(
-                            containerId);
-                    if (container == null) {
-                        // No container means no transitions
-                        continue;
-                    }
-                    if (isReordered) {
-                        configureTransitionsReordered(container,
-                                containerTransition, nonExistentView, nameOverrides, callback);
-                    } else {
-                        configureTransitionsOrdered(container,
-                                containerTransition, nonExistentView, nameOverrides, callback);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Iterates through the transactions that affect a given fragment container
-     * and tracks the shared element names across transactions. This is most useful
-     * in pop transactions where the names of shared elements are known.
-     *
-     * @param containerId The container ID that is executing the transition.
-     * @param records The list of transactions being executed.
-     * @param isRecordPop For each transaction, whether it is a pop transaction or not.
-     * @param startIndex The first index into records and isRecordPop to execute as
-     *                   part of this transition.
-     * @param endIndex One past the last index into records and isRecordPop to execute
-     *                 as part of this transition.
-     * @return A map from the initial shared element name to the final shared element name
-     * before any onMapSharedElements is run.
-     */
-    private static ArrayMap<String, String> calculateNameOverrides(int containerId,
-            ArrayList<BackStackRecord> records, ArrayList<Boolean> isRecordPop,
-            int startIndex, int endIndex) {
-        ArrayMap<String, String> nameOverrides = new ArrayMap<>();
-        for (int recordNum = endIndex - 1; recordNum >= startIndex; recordNum--) {
-            final BackStackRecord record = records.get(recordNum);
-            if (!record.interactsWith(containerId)) {
-                continue;
-            }
-            final boolean isPop = isRecordPop.get(recordNum);
-            if (record.mSharedElementSourceNames != null) {
-                final int numSharedElements = record.mSharedElementSourceNames.size();
-                final ArrayList<String> sources;
-                final ArrayList<String> targets;
-                if (isPop) {
-                    targets = record.mSharedElementSourceNames;
-                    sources = record.mSharedElementTargetNames;
-                } else {
-                    sources = record.mSharedElementSourceNames;
-                    targets = record.mSharedElementTargetNames;
-                }
-                for (int i = 0; i < numSharedElements; i++) {
-                    String sourceName = sources.get(i);
-                    String targetName = targets.get(i);
-                    String previousTarget = nameOverrides.remove(targetName);
-                    if (previousTarget != null) {
-                        nameOverrides.put(sourceName, previousTarget);
-                    } else {
-                        nameOverrides.put(sourceName, targetName);
-                    }
-                }
-            }
-        }
-        return nameOverrides;
-    }
-
-    /**
-     * Configures a transition for a single fragment container for which the transaction was
-     * reordered. That means that all Fragment Views have been added and incoming fragment
-     * Views are marked invisible.
-     *
-     * @param container the container that the transitioning fragments are within
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @param nonExistentView A View that does not exist in the hierarchy. This is used to
-     *                        prevent transitions from acting on other Views when there is no
-     *                        other target.
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     */
-    private static void configureTransitionsReordered(@NonNull ViewGroup container,
-            FragmentContainerTransition fragments,
-            View nonExistentView, ArrayMap<String, String> nameOverrides, final Callback callback) {
-        final Fragment inFragment = fragments.lastIn;
-        final Fragment outFragment = fragments.firstOut;
-        final FragmentTransitionImpl impl = chooseImpl(outFragment, inFragment);
-        if (impl == null) {
-            return;
-        }
-        final boolean inIsPop = fragments.lastInIsPop;
-        final boolean outIsPop = fragments.firstOutIsPop;
-
-        ArrayList<View> sharedElementsIn = new ArrayList<>();
-        ArrayList<View> sharedElementsOut = new ArrayList<>();
-        Object enterTransition = getEnterTransition(impl, inFragment, inIsPop);
-        Object exitTransition = getExitTransition(impl, outFragment, outIsPop);
-
-        Object sharedElementTransition = configureSharedElementsReordered(impl, container,
-                nonExistentView, nameOverrides, fragments, sharedElementsOut, sharedElementsIn,
-                enterTransition, exitTransition);
-
-        if (enterTransition == null && sharedElementTransition == null
-                && exitTransition == null) {
-            return; // no transitions!
-        }
-
-        ArrayList<View> exitingViews = configureEnteringExitingViews(impl, exitTransition,
-                outFragment, sharedElementsOut, nonExistentView);
-
-        ArrayList<View> enteringViews = configureEnteringExitingViews(impl, enterTransition,
-                inFragment, sharedElementsIn, nonExistentView);
-
-        setViewVisibility(enteringViews, View.INVISIBLE);
-
-        Object transition = mergeTransitions(impl, enterTransition, exitTransition,
-                sharedElementTransition, inFragment, inIsPop);
-
-        if (outFragment != null && exitingViews != null
-                && (exitingViews.size() > 0 || sharedElementsOut.size() > 0)) {
-            final CancellationSignal signal = new CancellationSignal();
-            callback.onStart(outFragment, signal);
-            impl.setListenerForTransitionEnd(outFragment, transition, signal, new Runnable() {
-                @Override
-                public void run() {
-                    callback.onComplete(outFragment, signal);
-                }
-            });
-        }
-
-        if (transition != null) {
-            replaceHide(impl, exitTransition, outFragment, exitingViews);
-            ArrayList<String> inNames =
-                    impl.prepareSetNameOverridesReordered(sharedElementsIn);
-            impl.scheduleRemoveTargets(transition,
-                    enterTransition, enteringViews, exitTransition, exitingViews,
-                    sharedElementTransition, sharedElementsIn);
-            impl.beginDelayedTransition(container, transition);
-            impl.setNameOverridesReordered(container, sharedElementsOut,
-                    sharedElementsIn, inNames, nameOverrides);
-            setViewVisibility(enteringViews, View.VISIBLE);
-            impl.swapSharedElementTargets(sharedElementTransition,
-                    sharedElementsOut, sharedElementsIn);
-        }
-    }
-
-    /**
-     * Replace hide operations with visibility changes on the exiting views. Instead of making
-     * the entire fragment's view GONE, make each exiting view INVISIBLE. At the end of the
-     * transition, make the fragment's view GONE.
-     */
-    private static void replaceHide(FragmentTransitionImpl impl,
-            Object exitTransition, Fragment exitingFragment,
-            final ArrayList<View> exitingViews) {
-        if (exitingFragment != null && exitTransition != null && exitingFragment.mAdded
-                && exitingFragment.mHidden && exitingFragment.mHiddenChanged) {
-            exitingFragment.setHideReplaced(true);
-            impl.scheduleHideFragmentView(exitTransition,
-                    exitingFragment.getView(), exitingViews);
-            /* This is required to indicate to the TransitionManager the desired end state of the
-             scene when a hide is used. In the replace case, the exiting Fragment's view is
-             removed from the sceneRoot during the delay, and the TransitionManager is able to
-             calculate the difference between the two switching views. Because we can have
-             exiting child views with transitions, we cannot just mark the entire exiting
-             Fragment view as INVISIBLE or the TransitionManager will not consider the views
-             individually.
-
-            This OneShotPreDrawListener gets fired before the delayed start of the Transition and
-             changes the visibility of any exiting child views that *ARE NOT* shared element
-             transitions. The TransitionManager then properly considers exiting views and marks
-             them as disappearing, applying a transition and a listener to take proper actions
-             once the transition is complete.
-            */
-
-            final ViewGroup container = exitingFragment.mContainer;
-            OneShotPreDrawListener.add(container, new Runnable() {
-                @Override
-                public void run() {
-                    setViewVisibility(exitingViews, View.INVISIBLE);
-                }
-            });
-        }
-    }
-
-    /**
-     * Configures a transition for a single fragment container for which the transaction was
-     * ordered. That means that the transaction has not been executed yet, so incoming
-     * Views are not yet known.
-     *
-     * @param container the container that the transitioning fragments are within
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @param nonExistentView A View that does not exist in the hierarchy. This is used to
-     *                        prevent transitions from acting on other Views when there is no
-     *                        other target.
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     */
-    private static void configureTransitionsOrdered(@NonNull ViewGroup container,
-            FragmentContainerTransition fragments,
-            View nonExistentView, ArrayMap<String, String> nameOverrides, final Callback callback) {
-        final Fragment inFragment = fragments.lastIn;
-        final Fragment outFragment = fragments.firstOut;
-        final FragmentTransitionImpl impl = chooseImpl(outFragment, inFragment);
-        if (impl == null) {
-            return;
-        }
-        final boolean inIsPop = fragments.lastInIsPop;
-        final boolean outIsPop = fragments.firstOutIsPop;
-
-        Object enterTransition = getEnterTransition(impl, inFragment, inIsPop);
-        Object exitTransition = getExitTransition(impl, outFragment, outIsPop);
-
-        ArrayList<View> sharedElementsOut = new ArrayList<>();
-        ArrayList<View> sharedElementsIn = new ArrayList<>();
-
-        Object sharedElementTransition = configureSharedElementsOrdered(impl, container,
-                nonExistentView, nameOverrides, fragments, sharedElementsOut, sharedElementsIn,
-                enterTransition, exitTransition);
-
-        if (enterTransition == null && sharedElementTransition == null
-                && exitTransition == null) {
-            return; // no transitions!
-        }
-
-        ArrayList<View> exitingViews = configureEnteringExitingViews(impl, exitTransition,
-                outFragment, sharedElementsOut, nonExistentView);
-
-        if (exitingViews == null || exitingViews.isEmpty()) {
-            exitTransition = null;
-        }
-
-        // Ensure the entering transition doesn't target anything until the views are made
-        // visible
-        impl.addTarget(enterTransition, nonExistentView);
-
-        Object transition = mergeTransitions(impl, enterTransition, exitTransition,
-                sharedElementTransition, inFragment, fragments.lastInIsPop);
-
-        if (outFragment != null && exitingViews != null
-                && (exitingViews.size() > 0 || sharedElementsOut.size() > 0)) {
-            final CancellationSignal signal = new CancellationSignal();
-            callback.onStart(outFragment, signal);
-            impl.setListenerForTransitionEnd(outFragment, transition, signal, new Runnable() {
-                @Override
-                public void run() {
-                    callback.onComplete(outFragment, signal);
-                }
-            });
-        }
-
-        if (transition != null) {
-            final ArrayList<View> enteringViews = new ArrayList<>();
-            impl.scheduleRemoveTargets(transition,
-                    enterTransition, enteringViews, exitTransition, exitingViews,
-                    sharedElementTransition, sharedElementsIn);
-            scheduleTargetChange(impl, container, inFragment, nonExistentView, sharedElementsIn,
-                    enterTransition, enteringViews, exitTransition, exitingViews);
-            impl.setNameOverridesOrdered(container, sharedElementsIn, nameOverrides);
-
-            impl.beginDelayedTransition(container, transition);
-            impl.scheduleNameReset(container, sharedElementsIn, nameOverrides);
-        }
-    }
-
-    /**
-     * This method is used for fragment transitions for ordrered transactions to change the
-     * enter and exit transition targets after the call to
-     * {@link FragmentTransitionCompat21#beginDelayedTransition(ViewGroup, Object)}. The exit
-     * transition must ensure that it does not target any Views and the enter transition must start
-     * targeting the Views of the incoming Fragment.
-     *
-     * @param sceneRoot The fragment container View
-     * @param inFragment The last fragment that is entering
-     * @param nonExistentView A view that does not exist in the hierarchy that is used as a
-     *                        transition target to ensure no View is targeted.
-     * @param sharedElementsIn The shared element Views of the incoming fragment
-     * @param enterTransition The enter transition of the incoming fragment
-     * @param enteringViews The entering Views of the incoming fragment
-     * @param exitTransition The exit transition of the outgoing fragment
-     * @param exitingViews The exiting views of the outgoing fragment
-     */
-    private static void scheduleTargetChange(final FragmentTransitionImpl impl,
-            final ViewGroup sceneRoot,
-            final Fragment inFragment, final View nonExistentView,
-            final ArrayList<View> sharedElementsIn,
-            final Object enterTransition, final ArrayList<View> enteringViews,
-            final Object exitTransition, final ArrayList<View> exitingViews) {
-        OneShotPreDrawListener.add(sceneRoot, new Runnable() {
-            @Override
-            public void run() {
-                if (enterTransition != null) {
-                    impl.removeTarget(enterTransition,
-                            nonExistentView);
-                    ArrayList<View> views = configureEnteringExitingViews(impl,
-                            enterTransition, inFragment, sharedElementsIn, nonExistentView);
-                    enteringViews.addAll(views);
-                }
-
-                if (exitingViews != null) {
-                    if (exitTransition != null) {
-                        ArrayList<View> tempExiting = new ArrayList<>();
-                        tempExiting.add(nonExistentView);
-                        impl.replaceTargets(exitTransition, exitingViews,
-                                tempExiting);
-                    }
-                    exitingViews.clear();
-                    exitingViews.add(nonExistentView);
-                }
-            }
-        });
-    }
-
-    /**
-     * Chooses the appropriate implementation depending on the Transition instances hold by the
-     * Fragments.
-     */
-    private static FragmentTransitionImpl chooseImpl(Fragment outFragment, Fragment inFragment) {
-        // Collect all transition instances
-        final ArrayList<Object> transitions = new ArrayList<>();
-        if (outFragment != null) {
-            final Object exitTransition = outFragment.getExitTransition();
-            if (exitTransition != null) {
-                transitions.add(exitTransition);
-            }
-            final Object returnTransition = outFragment.getReturnTransition();
-            if (returnTransition != null) {
-                transitions.add(returnTransition);
-            }
-            final Object sharedReturnTransition = outFragment.getSharedElementReturnTransition();
-            if (sharedReturnTransition != null) {
-                transitions.add(sharedReturnTransition);
-            }
-        }
-        if (inFragment != null) {
-            final Object enterTransition = inFragment.getEnterTransition();
-            if (enterTransition != null) {
-                transitions.add(enterTransition);
-            }
-            final Object reenterTransition = inFragment.getReenterTransition();
-            if (reenterTransition != null) {
-                transitions.add(reenterTransition);
-            }
-            final Object sharedEnterTransition = inFragment.getSharedElementEnterTransition();
-            if (sharedEnterTransition != null) {
-                transitions.add(sharedEnterTransition);
-            }
-        }
-        if (transitions.isEmpty()) {
-            return null; // No transition to run
-        }
-        // Pick the implementation that can handle all the transitions
-        if (PLATFORM_IMPL != null && canHandleAll(PLATFORM_IMPL, transitions)) {
-            return PLATFORM_IMPL;
-        }
-        if (SUPPORT_IMPL != null && canHandleAll(SUPPORT_IMPL, transitions)) {
-            return SUPPORT_IMPL;
-        }
-        if (PLATFORM_IMPL != null || SUPPORT_IMPL != null) {
-            throw new IllegalArgumentException("Invalid Transition types");
-        }
-        return null;
-    }
-
-    private static boolean canHandleAll(FragmentTransitionImpl impl, List<Object> transitions) {
-        for (int i = 0, size = transitions.size(); i < size; i++) {
-            if (!impl.canHandle(transitions.get(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Returns a TransitionSet containing the shared element transition. The wrapping TransitionSet
-     * targets all shared elements to ensure that no other Views are targeted. The shared element
-     * transition can then target any or all shared elements without worrying about accidentally
-     * targeting entering or exiting Views.
-     *
-     * @param inFragment The incoming fragment
-     * @param outFragment the outgoing fragment
-     * @param isPop True if this is a pop transaction or false if it is a normal (add) transaction.
-     * @return A TransitionSet wrapping the shared element transition or null if no such transition
-     * exists.
-     */
-    private static Object getSharedElementTransition(FragmentTransitionImpl impl,
-            Fragment inFragment, Fragment outFragment, boolean isPop) {
-        if (inFragment == null || outFragment == null) {
-            return null;
-        }
-        Object transition = impl.cloneTransition(isPop
-                ? outFragment.getSharedElementReturnTransition()
-                : inFragment.getSharedElementEnterTransition());
-        return impl.wrapTransitionInSet(transition);
-    }
-
-    /**
-     * Returns a clone of the enter transition or null if no such transition exists.
-     */
-    private static Object getEnterTransition(FragmentTransitionImpl impl,
-            Fragment inFragment, boolean isPop) {
-        if (inFragment == null) {
-            return null;
-        }
-        return impl.cloneTransition(isPop
-                ? inFragment.getReenterTransition()
-                : inFragment.getEnterTransition());
-    }
-
-    /**
-     * Returns a clone of the exit transition or null if no such transition exists.
-     */
-    private static Object getExitTransition(FragmentTransitionImpl impl,
-            Fragment outFragment, boolean isPop) {
-        if (outFragment == null) {
-            return null;
-        }
-        return impl.cloneTransition(isPop
-                ? outFragment.getReturnTransition()
-                : outFragment.getExitTransition());
-    }
-
-    /**
-     * Configures the shared elements of a reordered fragment transaction's transition.
-     * This retrieves the shared elements of the outgoing and incoming fragments, maps the
-     * views, and sets up the epicenter on the transitions.
-     * <p>
-     * The epicenter of exit and shared element transitions is the first shared element
-     * in the outgoing fragment. The epicenter of the entering transition is the first shared
-     * element in the incoming fragment.
-     *
-     * @param sceneRoot The fragment container View
-     * @param nonExistentView A View that does not exist in the hierarchy. This is used to
-     *                        prevent transitions from acting on other Views when there is no
-     *                        other target.
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @param sharedElementsOut A list modified to contain the shared elements in the outgoing
-     *                          fragment
-     * @param sharedElementsIn A list modified to contain the shared elements in the incoming
-     *                         fragment
-     * @param enterTransition The transition used for entering Views, modified by applying the
-     *                        epicenter
-     * @param exitTransition The transition used for exiting Views, modified by applying the
-     *                       epicenter
-     * @return The shared element transition or null if no shared elements exist
-     */
-    private static Object configureSharedElementsReordered(final FragmentTransitionImpl impl,
-            final ViewGroup sceneRoot,
-            final View nonExistentView, final ArrayMap<String, String> nameOverrides,
-            final FragmentContainerTransition fragments,
-            final ArrayList<View> sharedElementsOut,
-            final ArrayList<View> sharedElementsIn,
-            final Object enterTransition, final Object exitTransition) {
-        final Fragment inFragment = fragments.lastIn;
-        final Fragment outFragment = fragments.firstOut;
-        if (inFragment != null) {
-            inFragment.requireView().setVisibility(View.VISIBLE);
-        }
-        if (inFragment == null || outFragment == null) {
-            return null; // no shared element without a fragment
-        }
-
-        final boolean inIsPop = fragments.lastInIsPop;
-        Object sharedElementTransition = nameOverrides.isEmpty() ? null
-                : getSharedElementTransition(impl, inFragment, outFragment, inIsPop);
-
-        final ArrayMap<String, View> outSharedElements = captureOutSharedElements(impl,
-                nameOverrides, sharedElementTransition, fragments);
-
-        final ArrayMap<String, View> inSharedElements = captureInSharedElements(impl,
-                nameOverrides, sharedElementTransition, fragments);
-
-        if (nameOverrides.isEmpty()) {
-            sharedElementTransition = null;
-            if (outSharedElements != null) {
-                outSharedElements.clear();
-            }
-            if (inSharedElements != null) {
-                inSharedElements.clear();
-            }
-        } else {
-            addSharedElementsWithMatchingNames(sharedElementsOut, outSharedElements,
-                    nameOverrides.keySet());
-            addSharedElementsWithMatchingNames(sharedElementsIn, inSharedElements,
-                    nameOverrides.values());
-        }
-
-        if (enterTransition == null && exitTransition == null && sharedElementTransition == null) {
-            // don't call onSharedElementStart/End since there is no transition
-            return null;
-        }
-
-        callSharedElementStartEnd(inFragment, outFragment, inIsPop, outSharedElements, true);
-
-        final Rect epicenter;
-        final View epicenterView;
-        if (sharedElementTransition != null) {
-            sharedElementsIn.add(nonExistentView);
-            impl.setSharedElementTargets(sharedElementTransition,
-                    nonExistentView, sharedElementsOut);
-            final boolean outIsPop = fragments.firstOutIsPop;
-            final BackStackRecord outTransaction = fragments.firstOutTransaction;
-            setOutEpicenter(impl, sharedElementTransition, exitTransition, outSharedElements,
-                    outIsPop, outTransaction);
-            epicenter = new Rect();
-            epicenterView = getInEpicenterView(inSharedElements, fragments,
-                    enterTransition, inIsPop);
-            if (epicenterView != null) {
-                impl.setEpicenter(enterTransition, epicenter);
-            }
-        } else {
-            epicenter = null;
-            epicenterView = null;
-        }
-
-        OneShotPreDrawListener.add(sceneRoot, new Runnable() {
-            @Override
-            public void run() {
-                callSharedElementStartEnd(inFragment, outFragment, inIsPop,
-                        inSharedElements, false);
-                if (epicenterView != null) {
-                    impl.getBoundsOnScreen(epicenterView, epicenter);
-                }
-            }
-        });
-        return sharedElementTransition;
-    }
-
-    /**
-     * Add Views from sharedElements into views that have the transitionName in the
-     * nameOverridesSet.
-     *
-     * @param views               Views list to add shared elements to
-     * @param sharedElements      List of shared elements
-     * @param nameOverridesSet    The transition names for all views to be copied from
-     *                            sharedElements to views.
-     */
-    private static void addSharedElementsWithMatchingNames(ArrayList<View> views,
-            ArrayMap<String, View> sharedElements, Collection<String> nameOverridesSet) {
-        for (int i = sharedElements.size() - 1; i >= 0; i--) {
-            View view = sharedElements.valueAt(i);
-            if (nameOverridesSet.contains(ViewCompat.getTransitionName(view))) {
-                views.add(view);
-            }
-        }
-    }
-
-    /**
-     * Configures the shared elements of an ordered fragment transaction's transition.
-     * This retrieves the shared elements of the incoming fragments, and schedules capturing
-     * the incoming fragment's shared elements. It also maps the views, and sets up the epicenter
-     * on the transitions.
-     * <p>
-     * The epicenter of exit and shared element transitions is the first shared element
-     * in the outgoing fragment. The epicenter of the entering transition is the first shared
-     * element in the incoming fragment.
-     *
-     * @param sceneRoot The fragment container View
-     * @param nonExistentView A View that does not exist in the hierarchy. This is used to
-     *                        prevent transitions from acting on other Views when there is no
-     *                        other target.
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @param sharedElementsOut A list modified to contain the shared elements in the outgoing
-     *                          fragment
-     * @param sharedElementsIn A list modified to contain the shared elements in the incoming
-     *                         fragment
-     * @param enterTransition The transition used for entering Views, modified by applying the
-     *                        epicenter
-     * @param exitTransition The transition used for exiting Views, modified by applying the
-     *                       epicenter
-     * @return The shared element transition or null if no shared elements exist
-     */
-    private static Object configureSharedElementsOrdered(final FragmentTransitionImpl impl,
-            final ViewGroup sceneRoot,
-            final View nonExistentView, final ArrayMap<String, String> nameOverrides,
-            final FragmentContainerTransition fragments,
-            final ArrayList<View> sharedElementsOut,
-            final ArrayList<View> sharedElementsIn,
-            final Object enterTransition, final Object exitTransition) {
-        final Fragment inFragment = fragments.lastIn;
-        final Fragment outFragment = fragments.firstOut;
-
-        if (inFragment == null || outFragment == null) {
-            return null; // no transition
-        }
-
-        final boolean inIsPop = fragments.lastInIsPop;
-        Object sharedElementTransition = nameOverrides.isEmpty() ? null
-                : getSharedElementTransition(impl, inFragment, outFragment, inIsPop);
-
-        ArrayMap<String, View> outSharedElements = captureOutSharedElements(impl, nameOverrides,
-                sharedElementTransition, fragments);
-
-        if (nameOverrides.isEmpty()) {
-            sharedElementTransition = null;
-        } else {
-            sharedElementsOut.addAll(outSharedElements.values());
-        }
-
-        if (enterTransition == null && exitTransition == null && sharedElementTransition == null) {
-            // don't call onSharedElementStart/End since there is no transition
-            return null;
-        }
-
-        callSharedElementStartEnd(inFragment, outFragment, inIsPop, outSharedElements, true);
-
-        final Rect inEpicenter;
-        if (sharedElementTransition != null) {
-            inEpicenter = new Rect();
-            impl.setSharedElementTargets(sharedElementTransition,
-                    nonExistentView, sharedElementsOut);
-            final boolean outIsPop = fragments.firstOutIsPop;
-            final BackStackRecord outTransaction = fragments.firstOutTransaction;
-            setOutEpicenter(impl, sharedElementTransition, exitTransition, outSharedElements,
-                    outIsPop, outTransaction);
-            if (enterTransition != null) {
-                impl.setEpicenter(enterTransition, inEpicenter);
-            }
-        } else {
-            inEpicenter = null;
-        }
-
-
-        final Object finalSharedElementTransition = sharedElementTransition;
-        OneShotPreDrawListener.add(sceneRoot, new Runnable() {
-            @Override
-            public void run() {
-                ArrayMap<String, View> inSharedElements = captureInSharedElements(impl,
-                        nameOverrides, finalSharedElementTransition, fragments);
-
-                if (inSharedElements != null) {
-                    sharedElementsIn.addAll(inSharedElements.values());
-                    sharedElementsIn.add(nonExistentView);
-                }
-
-                callSharedElementStartEnd(inFragment, outFragment, inIsPop,
-                        inSharedElements, false);
-                if (finalSharedElementTransition != null) {
-                    impl.swapSharedElementTargets(
-                            finalSharedElementTransition, sharedElementsOut,
-                            sharedElementsIn);
-
-                    final View inEpicenterView = getInEpicenterView(inSharedElements,
-                            fragments, enterTransition, inIsPop);
-                    if (inEpicenterView != null) {
-                        impl.getBoundsOnScreen(inEpicenterView,
-                                inEpicenter);
-                    }
-                }
-            }
-        });
-
-        return sharedElementTransition;
-    }
-
-    /**
-     * Finds the shared elements in the outgoing fragment. It also calls
-     * {@link SharedElementCallback#onMapSharedElements(List, Map)} to allow more control
-     * of the shared element mapping. {@code nameOverrides} is updated to match the
-     * actual transition name of the mapped shared elements.
-     *
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     * @param sharedElementTransition The shared element transition
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @return The mapping of shared element names to the Views in the hierarchy or null
-     * if there is no shared element transition.
-     */
-    private static ArrayMap<String, View> captureOutSharedElements(FragmentTransitionImpl impl,
-            ArrayMap<String, String> nameOverrides, Object sharedElementTransition,
-            FragmentContainerTransition fragments) {
-        if (nameOverrides.isEmpty() || sharedElementTransition == null) {
-            nameOverrides.clear();
-            return null;
-        }
-        final Fragment outFragment = fragments.firstOut;
-        final ArrayMap<String, View> outSharedElements = new ArrayMap<>();
-        impl.findNamedViews(outSharedElements, outFragment.requireView());
-
-        final SharedElementCallback sharedElementCallback;
-        final ArrayList<String> names;
-        final BackStackRecord outTransaction = fragments.firstOutTransaction;
-        if (fragments.firstOutIsPop) {
-            sharedElementCallback = outFragment.getEnterTransitionCallback();
-            names = outTransaction.mSharedElementTargetNames;
-        } else {
-            sharedElementCallback = outFragment.getExitTransitionCallback();
-            names = outTransaction.mSharedElementSourceNames;
-        }
-
-        if (names != null) {
-            outSharedElements.retainAll(names);
-        }
-        if (sharedElementCallback != null) {
-            sharedElementCallback.onMapSharedElements(names, outSharedElements);
-            for (int i = names.size() - 1; i >= 0; i--) {
-                String name = names.get(i);
-                View view = outSharedElements.get(name);
-                if (view == null) {
-                    nameOverrides.remove(name);
-                } else if (!name.equals(ViewCompat.getTransitionName(view))) {
-                    String targetValue = nameOverrides.remove(name);
-                    nameOverrides.put(ViewCompat.getTransitionName(view), targetValue);
-                }
-            }
-        } else {
-            nameOverrides.retainAll(outSharedElements.keySet());
-        }
-        return outSharedElements;
-    }
-
-    /**
-     * Finds the shared elements in the incoming fragment. It also calls
-     * {@link SharedElementCallback#onMapSharedElements(List, Map)} to allow more control
-     * of the shared element mapping. {@code nameOverrides} is updated to match the
-     * actual transition name of the mapped shared elements.
-     *
-     * @param nameOverrides A map of the shared element names from the starting fragment to
-     *                      the final fragment's Views as given in
-     *                      {@link FragmentTransaction#addSharedElement(View, String)}.
-     * @param sharedElementTransition The shared element transition
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @return The mapping of shared element names to the Views in the hierarchy or null
-     * if there is no shared element transition.
-     */
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static ArrayMap<String, View> captureInSharedElements(FragmentTransitionImpl impl,
-            ArrayMap<String, String> nameOverrides, Object sharedElementTransition,
-            FragmentContainerTransition fragments) {
-        Fragment inFragment = fragments.lastIn;
-        final View fragmentView = inFragment.getView();
-        if (nameOverrides.isEmpty() || sharedElementTransition == null || fragmentView == null) {
-            nameOverrides.clear();
-            return null;
-        }
-        final ArrayMap<String, View> inSharedElements = new ArrayMap<>();
-        impl.findNamedViews(inSharedElements, fragmentView);
-
-        final SharedElementCallback sharedElementCallback;
-        final ArrayList<String> names;
-        final BackStackRecord inTransaction = fragments.lastInTransaction;
-        if (fragments.lastInIsPop) {
-            sharedElementCallback = inFragment.getExitTransitionCallback();
-            names = inTransaction.mSharedElementSourceNames;
-        } else {
-            sharedElementCallback = inFragment.getEnterTransitionCallback();
-            names = inTransaction.mSharedElementTargetNames;
-        }
-
-        if (names != null) {
-            inSharedElements.retainAll(names);
-            inSharedElements.retainAll(nameOverrides.values());
-        }
-        if (sharedElementCallback != null) {
-            sharedElementCallback.onMapSharedElements(names, inSharedElements);
-            for (int i = names.size() - 1; i >= 0; i--) {
-                String name = names.get(i);
-                View view = inSharedElements.get(name);
-                if (view == null) {
-                    String key = findKeyForValue(nameOverrides, name);
-                    if (key != null) {
-                        nameOverrides.remove(key);
-                    }
-                } else if (!name.equals(ViewCompat.getTransitionName(view))) {
-                    String key = findKeyForValue(nameOverrides, name);
-                    if (key != null) {
-                        nameOverrides.put(key, ViewCompat.getTransitionName(view));
-                    }
-                }
-            }
-        } else {
-            retainValues(nameOverrides, inSharedElements);
-        }
-        return inSharedElements;
-    }
-
-    /**
      * Utility to find the String key in {@code map} that maps to {@code value}.
      */
     static String findKeyForValue(ArrayMap<String, String> map, String value) {
@@ -947,57 +62,6 @@
     }
 
     /**
-     * Returns the View in the incoming Fragment that should be used as the epicenter.
-     *
-     * @param inSharedElements The mapping of shared element names to Views in the
-     *                         incoming fragment.
-     * @param fragments A structure holding the transitioning fragments in this container.
-     * @param enterTransition The transition used for the incoming Fragment's views
-     * @param inIsPop Is the incoming fragment being added as a pop transaction?
-     */
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static View getInEpicenterView(ArrayMap<String, View> inSharedElements,
-            FragmentContainerTransition fragments,
-            Object enterTransition, boolean inIsPop) {
-        BackStackRecord inTransaction = fragments.lastInTransaction;
-        if (enterTransition != null && inSharedElements != null
-                && inTransaction.mSharedElementSourceNames != null
-                && !inTransaction.mSharedElementSourceNames.isEmpty()) {
-            final String targetName = inIsPop
-                    ? inTransaction.mSharedElementSourceNames.get(0)
-                    : inTransaction.mSharedElementTargetNames.get(0);
-            return inSharedElements.get(targetName);
-        }
-        return null;
-    }
-
-    /**
-     * Sets the epicenter for the exit transition.
-     *
-     * @param sharedElementTransition The shared element transition
-     * @param exitTransition The transition for the outgoing fragment's views
-     * @param outSharedElements Shared elements in the outgoing fragment
-     * @param outIsPop Is the outgoing fragment being removed as a pop transaction?
-     * @param outTransaction The transaction that caused the fragment to be removed.
-     */
-    private static void setOutEpicenter(FragmentTransitionImpl impl, Object sharedElementTransition,
-            Object exitTransition, ArrayMap<String, View> outSharedElements, boolean outIsPop,
-            BackStackRecord outTransaction) {
-        if (outTransaction.mSharedElementSourceNames != null
-                && !outTransaction.mSharedElementSourceNames.isEmpty()) {
-            final String sourceName = outIsPop
-                    ? outTransaction.mSharedElementTargetNames.get(0)
-                    : outTransaction.mSharedElementSourceNames.get(0);
-            final View outEpicenterView = outSharedElements.get(sourceName);
-            impl.setEpicenter(sharedElementTransition, outEpicenterView);
-
-            if (exitTransition != null) {
-                impl.setEpicenter(exitTransition, outEpicenterView);
-            }
-        }
-    }
-
-    /**
      * A utility to retain only the mappings in {@code nameOverrides} that have a value
      * that has a key in {@code namedViews}. This is a useful equivalent to
      * {@link ArrayMap#retainAll(Collection)} for values.
@@ -1045,28 +109,6 @@
         }
     }
 
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    static ArrayList<View> configureEnteringExitingViews(FragmentTransitionImpl impl,
-            Object transition,
-            Fragment fragment, ArrayList<View> sharedElements, View nonExistentView) {
-        ArrayList<View> viewList = null;
-        if (transition != null) {
-            viewList = new ArrayList<>();
-            View root = fragment.getView();
-            if (root != null) {
-                impl.captureTransitioningViews(viewList, root);
-            }
-            if (sharedElements != null) {
-                viewList.removeAll(sharedElements);
-            }
-            if (!viewList.isEmpty()) {
-                viewList.add(nonExistentView);
-                impl.addTargets(transition, viewList);
-            }
-        }
-        return viewList;
-    }
-
     /**
      * Sets the visibility of all Views in {@code views} to {@code visibility}.
      */
@@ -1080,237 +122,10 @@
         }
     }
 
-    /**
-     * Merges exit, shared element, and enter transitions so that they act together or
-     * sequentially as defined in the fragments.
-     */
-    private static Object mergeTransitions(FragmentTransitionImpl impl, Object enterTransition,
-            Object exitTransition, Object sharedElementTransition, Fragment inFragment,
-            boolean isPop) {
-        boolean overlap = true;
-        if (enterTransition != null && exitTransition != null && inFragment != null) {
-            overlap = isPop ? inFragment.getAllowReturnTransitionOverlap() :
-                    inFragment.getAllowEnterTransitionOverlap();
-        }
-
-        // Wrap the transitions. Explicit targets like in enter and exit will cause the
-        // views to be targeted regardless of excluded views. If that happens, then the
-        // excluded fragments views (hidden fragments) will still be in the transition.
-
-        Object transition;
-        if (overlap) {
-            // Regular transition -- do it all together
-            transition = impl.mergeTransitionsTogether(exitTransition,
-                    enterTransition, sharedElementTransition);
-        } else {
-            // First do exit, then enter, but allow shared element transition to happen
-            // during both.
-            transition = impl.mergeTransitionsInSequence(exitTransition,
-                    enterTransition, sharedElementTransition);
-        }
-        return transition;
-    }
-
-    /**
-     * Finds the first removed fragment and last added fragments when going forward.
-     * If none of the fragments have transitions, then both lists will be empty.
-     *
-     * @param transitioningFragments Keyed on the container ID, the first fragments to be removed,
-     *                               and last fragments to be added. This will be modified by
-     *                               this method.
-     */
-    public static void calculateFragments(BackStackRecord transaction,
-            SparseArray<FragmentContainerTransition> transitioningFragments,
-            boolean isReordered) {
-        final int numOps = transaction.mOps.size();
-        for (int opNum = 0; opNum < numOps; opNum++) {
-            final BackStackRecord.Op op = transaction.mOps.get(opNum);
-            addToFirstInLastOut(transaction, op, transitioningFragments, false, isReordered);
-        }
-    }
-
-    /**
-     * Finds the first removed fragment and last added fragments when popping the back stack.
-     * If none of the fragments have transitions, then both lists will be empty.
-     *
-     * @param transitioningFragments Keyed on the container ID, the first fragments to be removed,
-     *                               and last fragments to be added. This will be modified by
-     *                               this method.
-     */
-    public static void calculatePopFragments(BackStackRecord transaction,
-            SparseArray<FragmentContainerTransition> transitioningFragments, boolean isReordered) {
-        if (!transaction.mManager.getContainer().onHasView()) {
-            return; // nothing to see, so no transitions
-        }
-        final int numOps = transaction.mOps.size();
-        for (int opNum = numOps - 1; opNum >= 0; opNum--) {
-            final BackStackRecord.Op op = transaction.mOps.get(opNum);
-            addToFirstInLastOut(transaction, op, transitioningFragments, true, isReordered);
-        }
-    }
-
     static boolean supportsTransition() {
         return PLATFORM_IMPL != null || SUPPORT_IMPL != null;
     }
 
-    /**
-     * Examines the {@code command} and may set the first out or last in fragment for the fragment's
-     * container.
-     *
-     * @param transaction The executing transaction
-     * @param op The operation being run.
-     * @param transitioningFragments A structure holding the first in and last out fragments
-     *                               for each fragment container.
-     * @param isPop Is the operation a pop?
-     * @param isReorderedTransaction True if the operations have been partially executed and the
-     *                               added fragments have Views in the hierarchy or false if the
-     *                               operations haven't been executed yet.
-     */
-    @SuppressWarnings("ReferenceEquality")
-    private static void addToFirstInLastOut(BackStackRecord transaction, BackStackRecord.Op op,
-            SparseArray<FragmentContainerTransition> transitioningFragments, boolean isPop,
-            boolean isReorderedTransaction) {
-        final Fragment fragment = op.mFragment;
-        if (fragment == null) {
-            return; // no fragment, no transition
-        }
-        final int containerId = fragment.mContainerId;
-        if (containerId == 0) {
-            return; // no container, no transition
-        }
-        final int command = isPop ? INVERSE_OPS[op.mCmd] : op.mCmd;
-        boolean setLastIn = false;
-        boolean wasRemoved = false;
-        boolean setFirstOut = false;
-        boolean wasAdded = false;
-        switch (command) {
-            case BackStackRecord.OP_SHOW:
-                if (isReorderedTransaction) {
-                    setLastIn = fragment.mHiddenChanged && !fragment.mHidden && fragment.mAdded;
-                } else {
-                    setLastIn = fragment.mHidden;
-                }
-                wasAdded = true;
-                break;
-            case BackStackRecord.OP_ADD:
-            case BackStackRecord.OP_ATTACH:
-                if (isReorderedTransaction) {
-                    setLastIn = fragment.mIsNewlyAdded;
-                } else {
-                    setLastIn = !fragment.mAdded && !fragment.mHidden;
-                }
-                wasAdded = true;
-                break;
-            case BackStackRecord.OP_HIDE:
-                if (isReorderedTransaction) {
-                    setFirstOut = fragment.mHiddenChanged && fragment.mAdded && fragment.mHidden;
-                } else {
-                    setFirstOut = fragment.mAdded && !fragment.mHidden;
-                }
-                wasRemoved = true;
-                break;
-            case BackStackRecord.OP_REMOVE:
-            case BackStackRecord.OP_DETACH:
-                if (isReorderedTransaction) {
-                    setFirstOut = !fragment.mAdded && fragment.mView != null
-                            && fragment.mView.getVisibility() == View.VISIBLE
-                            && fragment.mPostponedAlpha >= 0;
-                } else {
-                    setFirstOut = fragment.mAdded && !fragment.mHidden;
-                }
-                wasRemoved = true;
-                break;
-        }
-        FragmentContainerTransition containerTransition = transitioningFragments.get(containerId);
-        if (setLastIn) {
-            containerTransition =
-                    ensureContainer(containerTransition, transitioningFragments, containerId);
-            containerTransition.lastIn = fragment;
-            containerTransition.lastInIsPop = isPop;
-            containerTransition.lastInTransaction = transaction;
-        }
-        if (!isReorderedTransaction && wasAdded) {
-            if (containerTransition != null && containerTransition.firstOut == fragment) {
-                containerTransition.firstOut = null;
-            }
-
-            if (!transaction.mReorderingAllowed) {
-                // When reordering isn't allowed, we may be starting Transitions before
-                // the Fragment operation is actually executed so we move any new Fragments
-                // to created here first so that they have a Context, etc. when they
-                // are asked to load their Transitions
-                FragmentManager manager = transaction.mManager;
-                FragmentStateManager fragmentStateManager =
-                        manager.createOrGetFragmentStateManager(fragment);
-                manager.getFragmentStore().makeActive(fragmentStateManager);
-                manager.moveToState(fragment);
-            }
-        }
-        if (setFirstOut && (containerTransition == null || containerTransition.firstOut == null)) {
-            containerTransition =
-                    ensureContainer(containerTransition, transitioningFragments, containerId);
-            containerTransition.firstOut = fragment;
-            containerTransition.firstOutIsPop = isPop;
-            containerTransition.firstOutTransaction = transaction;
-        }
-
-        if (!isReorderedTransaction && wasRemoved
-                && (containerTransition != null && containerTransition.lastIn == fragment)) {
-            containerTransition.lastIn = null;
-        }
-    }
-
-    /**
-     * Ensures that a FragmentContainerTransition has been added to the SparseArray. If so,
-     * it returns the existing one. If not, one is created and added to the SparseArray and
-     * returned.
-     */
-    private static FragmentContainerTransition ensureContainer(
-            FragmentContainerTransition containerTransition,
-            SparseArray<FragmentContainerTransition> transitioningFragments, int containerId) {
-        if (containerTransition == null) {
-            containerTransition = new FragmentContainerTransition();
-            transitioningFragments.put(containerId, containerTransition);
-        }
-        return containerTransition;
-    }
-
-    /**
-     * Tracks the last fragment added and first fragment removed for fragment transitions.
-     * This also tracks which fragments are changed by push or pop transactions.
-     */
-    static class FragmentContainerTransition {
-        /**
-         * The last fragment added/attached/shown in its container
-         */
-        public Fragment lastIn;
-
-        /**
-         * true when lastIn was added during a pop transaction or false if added with a push
-         */
-        public boolean lastInIsPop;
-
-        /**
-         * The transaction that included the last in fragment
-         */
-        public BackStackRecord lastInTransaction;
-
-        /**
-         * The first fragment with a View that was removed/detached/hidden in its container.
-         */
-        public Fragment firstOut;
-
-        /**
-         * true when firstOut was removed during a pop transaction or false otherwise
-         */
-        public boolean firstOutIsPop;
-
-        /**
-         * The transaction that included the first out fragment
-         */
-        public BackStackRecord firstOutTransaction;
-    }
-
     private FragmentTransition() {
     }
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
index 4e4a7f7..9e3846a 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
@@ -30,7 +30,6 @@
 import androidx.core.os.CancellationSignal;
 import androidx.core.view.OneShotPreDrawListener;
 import androidx.core.view.ViewCompat;
-import androidx.core.view.ViewGroupCompat;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -208,75 +207,6 @@
     }
 
     /**
-     * Gets the Views in the hierarchy affected by entering and exiting Activity Scene transitions.
-     *
-     * @param transitioningViews This View will be added to transitioningViews if it is VISIBLE and
-     *                           a normal View or a ViewGroup with
-     *                           {@link android.view.ViewGroup#isTransitionGroup()} true.
-     * @param view               The base of the view hierarchy to look in.
-     */
-    void captureTransitioningViews(ArrayList<View> transitioningViews, View view) {
-        if (view.getVisibility() == View.VISIBLE) {
-            if (view instanceof ViewGroup) {
-                ViewGroup viewGroup = (ViewGroup) view;
-                if (ViewGroupCompat.isTransitionGroup(viewGroup)) {
-                    transitioningViews.add(viewGroup);
-                } else {
-                    int count = viewGroup.getChildCount();
-                    for (int i = 0; i < count; i++) {
-                        View child = viewGroup.getChildAt(i);
-                        captureTransitioningViews(transitioningViews, child);
-                    }
-                }
-            } else {
-                transitioningViews.add(view);
-            }
-        }
-    }
-
-    /**
-     * Finds all views that have transition names in the hierarchy under the given view and
-     * stores them in {@code namedViews} map with the name as the key.
-     */
-    void findNamedViews(Map<String, View> namedViews, @NonNull View view) {
-        if (view.getVisibility() == View.VISIBLE) {
-            String transitionName = ViewCompat.getTransitionName(view);
-            if (transitionName != null) {
-                namedViews.put(transitionName, view);
-            }
-            if (view instanceof ViewGroup) {
-                ViewGroup viewGroup = (ViewGroup) view;
-                int count = viewGroup.getChildCount();
-                for (int i = 0; i < count; i++) {
-                    View child = viewGroup.getChildAt(i);
-                    findNamedViews(namedViews, child);
-                }
-            }
-        }
-    }
-
-    /**
-     *Applies the prepared {@code nameOverrides} to the view hierarchy.
-     */
-    void setNameOverridesOrdered(final View sceneRoot,
-            final ArrayList<View> sharedElementsIn, final Map<String, String> nameOverrides) {
-        OneShotPreDrawListener.add(sceneRoot, new Runnable() {
-            @Override
-            public void run() {
-                final int numSharedElements = sharedElementsIn.size();
-                for (int i = 0; i < numSharedElements; i++) {
-                    View view = sharedElementsIn.get(i);
-                    String name = ViewCompat.getTransitionName(view);
-                    if (name != null) {
-                        String inName = findKeyForValue(nameOverrides, name);
-                        ViewCompat.setTransitionName(view, inName);
-                    }
-                }
-            }
-        });
-    }
-
-    /**
      * After the transition has started, remove all targets that we added to the transitions
      * so that the transitions are left in a clean state.
      */
@@ -334,32 +264,18 @@
      */
     public abstract void setEpicenter(Object transitionObj, Rect epicenter);
 
-    void scheduleNameReset(final ViewGroup sceneRoot,
-            final ArrayList<View> sharedElementsIn, final Map<String, String> nameOverrides) {
-        OneShotPreDrawListener.add(sceneRoot, new Runnable() {
-            @Override
-            public void run() {
-                final int numSharedElements = sharedElementsIn.size();
-                for (int i = 0; i < numSharedElements; i++) {
-                    final View view = sharedElementsIn.get(i);
-                    final String name = ViewCompat.getTransitionName(view);
-                    final String inName = nameOverrides.get(name);
-                    ViewCompat.setTransitionName(view, inName);
-                }
-            }
-        });
-    }
-
     /**
      * Uses a breadth-first scheme to add startView and all of its children to views.
-     * It won't add a child if it is already in views.
+     * It won't add a child if it is already in views or if it has a transition name.
      */
     protected static void bfsAddViewChildren(final List<View> views, final View startView) {
         final int startIndex = views.size();
         if (containedBeforeIndex(views, startView, startIndex)) {
             return; // This child is already in the list, so all its children are also.
         }
-        views.add(startView);
+        if (ViewCompat.getTransitionName(startView) != null) {
+            views.add(startView);
+        }
         for (int index = startIndex; index < views.size(); index++) {
             final View view = views.get(index);
             if (view instanceof ViewGroup) {
@@ -367,7 +283,8 @@
                 final int childCount =  viewGroup.getChildCount();
                 for (int childIndex = 0; childIndex < childCount; childIndex++) {
                     final View child = viewGroup.getChildAt(childIndex);
-                    if (!containedBeforeIndex(views, child, startIndex)) {
+                    if (!containedBeforeIndex(views, child, startIndex)
+                            && ViewCompat.getTransitionName(child) != null) {
                         views.add(child);
                     }
                 }
@@ -395,17 +312,4 @@
         return list == null || list.isEmpty();
     }
 
-    /**
-     * Utility to find the String key in {@code map} that maps to {@code value}.
-     */
-    @SuppressWarnings("WeakerAccess")
-    static String findKeyForValue(Map<String, String> map, String value) {
-        for (Map.Entry<String, String> entry : map.entrySet()) {
-            if (value.equals(entry.getValue())) {
-                return entry.getKey();
-            }
-        }
-        return null;
-    }
-
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
index f209c61..360ae01 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentReuseViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentReuse()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class FragmentReuseViolation extends Violation {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
index 1fee97b..65ad631 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentStrictMode.java
@@ -43,7 +43,6 @@
  * use your application to see the violations as they happen.
  */
 @SuppressLint("SyntheticAccessor")
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class FragmentStrictMode {
     private static final String TAG = "FragmentStrictMode";
     private static Policy defaultPolicy = Policy.LAX;
@@ -66,10 +65,9 @@
      * When #{@link Policy.Builder#penaltyListener} is enabled, the listener is called when a
      * violation occurs.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
     public interface OnViolationListener {
 
-        /** Called on a VM policy violation. */
+        /** Called on a policy violation. */
         void onViolation(@NonNull Violation violation);
     }
 
@@ -85,7 +83,6 @@
      * severe (logging before process death, for example). There's currently no mechanism to choose
      * different penalties for different detected actions.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
     public static final class Policy {
         private final Set<Flag> flags;
         private final OnViolationListener listener;
@@ -107,7 +104,6 @@
          * <p>You can call as many {@code detect} and {@code penalty} methods as you like. Currently
          * order is insignificant: all penalties apply to all detected problems.
          */
-        @RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
         public static final class Builder {
             private final Set<Flag> flags;
             private OnViolationListener listener;
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
index 0084e18..c55ffea 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/FragmentTagUsageViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectFragmentTagUsage()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class FragmentTagUsageViolation extends Violation {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
index 973bbfb..e989174 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/RetainInstanceUsageViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectRetainInstanceUsage()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class RetainInstanceUsageViolation extends Violation {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
index d356887..c9545bb 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/SetUserVisibleHintViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectSetUserVisibleHint()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class SetUserVisibleHintViolation extends Violation {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
index 768093e..9953393 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/TargetFragmentUsageViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectTargetFragmentUsage()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class TargetFragmentUsageViolation extends Violation {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
index 9027b87..cf3594f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/Violation.java
@@ -16,10 +16,7 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** Root class for all FragmentStrictMode violations. */
 @SuppressWarnings("ExceptionName")
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public abstract class Violation extends RuntimeException {
 }
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
index 17ebd11..1bd046f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/strictmode/WrongFragmentContainerViolation.java
@@ -16,9 +16,6 @@
 
 package androidx.fragment.app.strictmode;
 
-import androidx.annotation.RestrictTo;
-
 /** See #{@link FragmentStrictMode.Policy.Builder#detectWrongFragmentContainer()}. */
-@RestrictTo(RestrictTo.Scope.LIBRARY) // TODO: Make API public as soon as we have a few checks
 public final class WrongFragmentContainerViolation extends Violation {
 }
diff --git a/fragment/integration-tests/testapp/lint-baseline.xml b/fragment/integration-tests/testapp/lint-baseline.xml
index 3dd7df2..69b50de 100644
--- a/fragment/integration-tests/testapp/lint-baseline.xml
+++ b/fragment/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
diff --git a/fragment/integration-tests/testapp/src/main/res/layouts/kittenFragmentTransitions/values/strings.xml b/fragment/integration-tests/testapp/src/main/res/layouts/kittenFragmentTransitions/values/donottranslate-strings.xml
similarity index 100%
rename from fragment/integration-tests/testapp/src/main/res/layouts/kittenFragmentTransitions/values/strings.xml
rename to fragment/integration-tests/testapp/src/main/res/layouts/kittenFragmentTransitions/values/donottranslate-strings.xml
diff --git a/fragment/integration-tests/testapp/src/main/res/values/strings.xml b/fragment/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from fragment/integration-tests/testapp/src/main/res/values/strings.xml
rename to fragment/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 0000000..4d9b6bc
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,153 @@
+[versions]
+# -----------------------------------------------------------------------------
+# All of the following should be updated in sync.
+# -----------------------------------------------------------------------------
+androidGradlePlugin = "4.2.0-beta06"
+# NOTE: When updating the lint version we also need to update the `api` version
+# supported by `IssueRegistry`'s.' For e.g. r.android.com/1331903
+androidLint = "27.2.0-beta06"
+# Once you have a chosen version of AGP to upgrade to, go to
+# https://developer.android.com/studio/archive and find the matching version of Studio.
+# For example, if you are upgrading to AGP 3.6 alpha 05, look for the Studio 3.6 canary 5 build.
+# (alpha maps to canary, beta to beta, rc to rc, and no suffix for stable in both cases)
+#
+# The download url should contain: ...ide-zips/3.6.0.5/android-studio-ide-191.5721125-linux...
+# From this, the first number (3.6.0.5) is [androidStudio], the first number in the filename (192)
+# is the [androidStudioIdea] and the last number (5721125) is the [androidStudioBuildId].
+androidStudio = "4.2.0.22"
+androidStudioIdea = "202"
+androidStudioBuildId = "7188722"
+# -----------------------------------------------------------------------------
+
+androidxTest = "1.3.0"
+androidxTestExt = "1.1.2"
+autoService = "1.0-rc6"
+autoValue = "1.6.3"
+dexmaker = "2.25.0"
+espresso = "3.3.0"
+hilt = "2.35"
+incap = "0.2"
+kotlin = "1.4.32"
+kotlinCompileTesting = "1.3.6"
+kotlinCoroutines = "1.4.3"
+kotlinPoet = "1.4.0"
+ksp = "1.4.32-1.0.0-alpha08"
+leakcanary = "2.2"
+mockito = "2.25.0"
+sqldelight = "1.3.0"
+wire = "3.6.0"
+
+[libraries]
+androidGradlePlugin = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
+androidLint = { module = "com.android.tools.lint:lint", version.ref = "androidLint" }
+androidLintApi = { module = "com.android.tools.lint:lint-api", version.ref = "androidLint" }
+androidLintTests = { module = "com.android.tools.lint:lint-tests", version.ref = "androidLint" }
+autoCommon = { module = "com.google.auto:auto-common", version = "0.11" }
+autoServiceAnnotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoService" }
+autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoService" }
+autoValue = { module = "com.google.auto.value:auto-value", version.ref = "autoValue" }
+autoValueAnnotations = { module = "com.google.auto.value:auto-value-annotations", version.ref = "autoValue" }
+autoValueParcel = { module = "com.ryanharter.auto.value:auto-value-parcel", version = "0.2.6" }
+antlr4 = { module = "org.antlr:antlr4", version = "4.7.1" }
+apacheCommonsCodec = { module = "commons-codec:commons-codec", version = "1.10" }
+assertj = { module = "org.assertj:assertj-core", version = "3.11.1" }
+checkerframework = { module = "org.checkerframework:checker-qual", version = "2.5.3" }
+dagger = { module = "com.google.dagger:dagger-compiler", version = "2.35" }
+dexmakerMockito = { module = "com.linkedin.dexmaker:dexmaker-mockito", version.ref = "dexmaker" }
+dexmakerMockitoInline = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "dexmaker" }
+dexMemberList = { module = "com.jakewharton.dex:dex-member-list", version = "4.1.1" }
+dokkaGradlePlugin = { module = "org.jetbrains.dokka:dokka-android-gradle-plugin", version = "0.9.17-g014" }
+espressoContrib = { module = "androidx.test.espresso:espresso-contrib", version.ref = "espresso" }
+espressoCore = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" }
+espressoIdlingNet = { module = "androidx.test.espresso:espresso-idling-net", version.ref = "espresso" }
+espressoIdlingResource = { module = "androidx.test.espresso:espresso-idling-resource", version.ref = "espresso" }
+espressoIntents = { module = "androidx.test.espresso:espresso-intents", version.ref = "espresso" }
+espressoWeb = { module = "androidx.test.espresso:espresso-web", version.ref = "espresso" }
+findbugs = { module = "com.google.code.findbugs:jsr305", version = "3.0.2" }
+firebaseAppindexing = { module = "com.google.firebase:firebase-appindexing", version = "19.2.0" }
+hiltAndroid = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
+hiltAndroidTesting = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }
+hiltAndroidGradlePlugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" }
+hiltCompiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
+hiltCore = { module = "com.google.dagger:hilt-core", version.ref = "hilt" }
+intellijAnnotations = { module = "com.intellij:annotations", version = "12.0" }
+javapoet = { module = "com.squareup:javapoet", version = "1.13.0" }
+jsqlparser = { module = "com.github.jsqlparser:jsqlparser", version = "3.1" }
+jsr250 = { module = "javax.annotation:javax.annotation-api", version = "1.2" }
+junit = { module = "junit:junit", version = "4.12" }
+gcmNetworkManager = { module = "com.google.android.gms:play-services-gcm", version = "17.0.0" }
+googleCompileTesting = { module = "com.google.testing.compile:compile-testing", version = "0.18" }
+gson = { module = "com.google.code.gson:gson", version = "2.8.0" }
+guava = { module = "com.google.guava:guava", version = "29.0-jre" }
+guavaAndroid = { module = "com.google.guava:guava", version = "29.0-android" }
+guavaListenableFuture = { module = "com.google.guava:listenablefuture", version = "1.0" }
+gradleIncapHelper = { module = "net.ltgt.gradle.incap:incap", version.ref = "incap" }
+gradleIncapHelperProcessor = { module = "net.ltgt.gradle.incap:incap-processor", version.ref = "incap" }
+kotlinAnnotationProcessingEmbeddable = { module = "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable", version.ref = "kotlin" }
+kotlinCompilerEmbeddable = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlin" }
+kotlinCompileTesting = { module = "com.github.tschuchortdev:kotlin-compile-testing", version.ref = "kotlinCompileTesting" }
+kotlinCompileTestingKsp = { module = "com.github.tschuchortdev:kotlin-compile-testing-ksp", version.ref = "kotlinCompileTesting" }
+kotlinCoroutinesAndroid = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesCore = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesGuava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesRx2 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx2", version.ref = "kotlinCoroutines" }
+kotlinCoroutinesRx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "kotlinCoroutines" }
+kotlinDaemonEmbeddable = { module = "org.jetbrains.kotlin:kotlin-daemon-embeddable", version.ref = "kotlin" }
+kotlinMetadataJvm = { module = "org.jetbrains.kotlinx:kotlinx-metadata-jvm", version = "0.2.0" }
+kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
+kotlinStdlibCommon = { module = "org.jetbrains.kotlin:kotlin-stdlib-common", version.ref = "kotlin" }
+kotlinStdlibJdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
+kotlinStdlibJs = { module = "org.jetbrains.kotlin:kotlin-stdlib-js", version.ref = "kotlin" }
+kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
+kotlinTest = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
+kotlinTestAnnotationsCommon = { module = "org.jetbrains.kotlin:kotlin-test-annotations-common", version.ref = "kotlin" }
+kotlinTestCommon = { module = "org.jetbrains.kotlin:kotlin-test-common", version.ref = "kotlin" }
+kotlinTestJunit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
+kotlinTestJs = { module = "org.jetbrains.kotlin:kotlin-test-js", version.ref = "kotlin" }
+kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
+kotlinPoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinPoet" }
+kotlinPoetMetadata = { module = "com.squareup:kotlinpoet-metadata", version.ref = "kotlinPoet" }
+kotlinPoetMetadataSpecs = { module = "com.squareup:kotlinpoet-metadata-specs", version.ref = "kotlinPoet" }
+kotlinPoetClassinspector = { module = "com.squareup:kotlinpoet-classinspector-elements", version.ref = "kotlinPoet" }
+ksp = { module = "com.google.devtools.ksp:symbol-processing", version.ref = "ksp" }
+kspApi = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "ksp" }
+kspGradlePlugin = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "ksp" }
+leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" }
+leakcanaryInstrumentation = { module = "com.squareup.leakcanary:leakcanary-android-instrumentation", version.ref = "leakcanary" }
+material = { module = "com.google.android.material:material", version = "1.2.1" }
+mockitoCore = { module = "org.mockito:mockito-core", version.ref = "mockito" }
+mockitoAndroid = { module = "org.mockito:mockito-android", version.ref = "mockito" }
+mockitoKotlin = { module = "com.nhaarman.mockitokotlin2:mockito-kotlin", version = "2.1.0" }
+multidex = { module = "androidx.multidex:multidex", version = "2.0.1" }
+nullaway = { module = "com.uber.nullaway:nullaway", version = "0.3.7" }
+okhttpMockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version = "3.14.7" }
+playCore = { module = "com.google.android.play:core", version = "1.9.1" }
+playServicesBase = { module = "com.google.android.gms:play-services-base", version = "17.0.0" }
+protobuf = { module = "com.google.protobuf:protobuf-java", version = "3.4.0" }
+protobufCompiler = { module = "com.google.protobuf:protoc", version = "3.10.0" }
+protobufLite = { module = "com.google.protobuf:protobuf-javalite", version = "3.4.0" }
+reactiveStreams = { module = "org.reactivestreams:reactive-streams", version = "1.0.0" }
+retrofit = { module = "com.squareup.retrofit2:retrofit", version = "2.7.2" }
+robolectric = { module = "org.robolectric:robolectric", version = "4.4-alpha-2" }
+rxjava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.9" }
+rxjava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.0.0" }
+shadow = { module = "com.github.jengelman.gradle.plugins:shadow", version = "6.1.0" }
+sqldelightAndroid = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
+sqldelightCoroutinesExt = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
+testCore = { module = "androidx.test:core", version.ref = "androidxTest" }
+testExtJunit = { module = "androidx.test.ext:junit", version.ref = "androidxTestExt" }
+testExtJunitKtx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidxTestExt" }
+testExtTruth = { module = "androidx.test.ext:truth", version.ref = "androidxTest" }
+testMonitor = { module = "androidx.test:monitor", version.ref = "androidxTest" }
+testRules = { module = "androidx.test:rules", version.ref = "androidxTest" }
+testRunner = { module = "androidx.test:runner", version.ref = "androidxTest" }
+testUiautomator = { module = "androidx.test.uiautomator:uiautomator", version = "2.2.0" }
+truth = { module = "com.google.truth:truth", version = "1.0.1" }
+viewBinding = { module = "androidx.databinding:viewbinding", version = "4.1.2" }
+wireGradlePlugin = { module = "com.squareup.wire:wire-gradle-plugin", version.ref = "wire" }
+wireRuntime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" }
+xerial = { module = "org.xerial:sqlite-jdbc", version = "3.25.2" }
+xpp3 = { module = "xpp3:xpp3", version = "1.1.4c" }
+xmlpull = { module = "xmlpull:xmlpull", version = "1.1.3.1" }
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index ec5db3b..bddfbb1 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-6.8.1-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-7.0-bin.zip
diff --git a/gradlew b/gradlew
index 4feb997..4067d06 100755
--- a/gradlew
+++ b/gradlew
@@ -29,7 +29,7 @@
 
     #Set the initial heap size to match the max heap size,
     #by replacing a string like "-Xmx1g" with one like "-Xms1g -Xmx1g"
-    MAX_MEM=16g
+    MAX_MEM=24g
     ORG_GRADLE_JVMARGS="$(echo $ORG_GRADLE_JVMARGS | sed "s/-Xmx\([^ ]*\)/-Xms$MAX_MEM -Xmx$MAX_MEM/")"
 
     # tell Gradle where to put a heap dump on failure
@@ -222,8 +222,14 @@
   TMPDIR_ARG="-Djava.io.tmpdir=$TMPDIR"
 fi
 
+if [[ " ${@} " =~ " --clean " ]]; then
+  cleanCaches=true
+else
+  cleanCaches=false
+fi
+
 # Expand some arguments
-for compact in "--ci" "--strict"; do
+for compact in "--ci" "--strict" "--clean"; do
   if [ "$compact" == "--ci" ]; then
     expanded="--strict\
      --stacktrace\
@@ -235,35 +241,43 @@
   if [ "$compact" == "--strict" ]; then
     expanded="-Pandroidx.allWarningsAsErrors\
      -Pandroidx.validateNoUnrecognizedMessages\
-     -PverifyUpToDate\
+     -Pandroidx.verifyUpToDate\
      --no-watch-fs\
      --no-daemon\
      --offline"
   fi
+  if [ "$compact" == "--clean" ]; then
+    expanded="" # we parsed the argument above but we still have to remove it to avoid confusing Gradle
+  fi
 
-  # Expand an individual argument
-  # Start by making a copy of our list of arguments and iterating through the copy
-  for arg in "$@"; do
-    # Remove this argument from our list of arguments.
-    # By the time we've completed this loop, we will have removed the original copy of
-    # each argument, and potentially re-added a new copy or an expansion of each.
-    shift
-    # Determine whether to expand this argument
-    if [ "$arg" == "$compact" ]; then
-      # Add the expansion to our arguments
-      set -- "$@" $expanded
-      echo "gradlew expanded '$compact' into '$expanded'"
-      echo
-      # We avoid re-adding this argument itself back into the list for two reasons:
-      # 1. This argument might not be directly understood by Gradle
-      # 2. We want to enforce that all behaviors enabled by this flag can be toggled independently,
-      # so we don't want it to be easy to inadvertently check for the presence of this flag
-      # specifically
-    else
-      # Add this argument back into our arguments
-      set -- "$@" "$arg"
-    fi
-  done
+  # check whether this particular compat argument was passed (and therefore needs expansion)
+  if [[ " ${@} " =~ " $compact " ]]; then
+    # Expand an individual argument
+    # Start by making a copy of our list of arguments and iterating through the copy
+    for arg in "$@"; do
+      # Remove this argument from our list of arguments.
+      # By the time we've completed this loop, we will have removed the original copy of
+      # each argument, and potentially re-added a new copy or an expansion of each.
+      shift
+      # Determine whether to expand this argument
+      if [ "$arg" == "$compact" ]; then
+        # Add the expansion to our arguments
+        set -- "$@" $expanded
+        if [ "$expanded" != "" ]; then
+          echo "gradlew expanded '$compact' into '$expanded'"
+          echo
+        fi
+        # We avoid re-adding this argument itself back into the list for two reasons:
+        # 1. This argument might not be directly understood by Gradle
+        # 2. We want to enforce that all behaviors enabled by this flag can be toggled independently,
+        # so we don't want it to be easy to inadvertently check for the presence of this flag
+        # specifically
+      else
+        # Add this argument back into our arguments
+        set -- "$@" "$arg"
+      fi
+    done
+  fi
 done
 
 function tryToDiagnosePossibleDaemonFailure() {
@@ -276,6 +290,41 @@
   fi
 }
 
+function removeCaches() {
+  rm -rf $SCRIPT_PATH/.gradle
+  rm -rf $SCRIPT_PATH/buildSrc/.gradle
+  rm -f  $SCRIPT_PATH/local.properties
+  if [ "$GRADLE_USER_HOME" != "" ]; then
+    rm -rf "$GRADLE_USER_HOME"
+  else
+    rm -rf ~/.gradle
+  fi
+  # AGP should (also) do this automatically (b/170640263)
+  rm -rf $SCRIPT_PATH/appsearch/appsearch/.cxx
+  rm -rf $SCRIPT_PATH/appsearch/local-backend/.cxx
+  rm -rf $SCRIPT_PATH/appsearch/local-storage/.cxx
+  rm -rf $OUT_DIR
+}
+
+if [ "$cleanCaches" == true ]; then
+  echo "IF ./gradlew --clean FIXES YOUR BUILD; OPEN A BUG."
+  echo "In nearly all cases, it should not be necessary to run a clean build."
+  echo
+  echo "You may be more interested in running:"
+  echo
+  echo "  ./development/diagnose-build-failure/diagnose-build-failure.sh $*"
+  echo
+  echo "which attempts to diagnose more details about build failures."
+  echo
+  echo "Removing caches"
+  # one case where it is convenient to have a clean build is for double-checking that a build failure isn't due to an incremental build failure
+  # another case where it is convenient to have a clean build is for performance testing
+  # another case where it is convenient to have a clean build is when you're modifying the build and may have introduced some errors but haven't shared your changes yet (at which point you should have fixed the errors)
+  echo
+
+  removeCaches
+fi
+
 function runGradle() {
   processOutput=false
   if [[ " ${@} " =~ " -Pandroidx.validateNoUnrecognizedMessages " ]]; then
@@ -306,14 +355,19 @@
 }
 
 if [[ " ${@} " =~ " -PdisallowExecution " ]]; then
-  echo "Passing '-PdisallowExecution' directly is forbidden. Did you mean -PverifyUpToDate ?"
+  echo "Passing '-PdisallowExecution' directly is forbidden. Did you mean -Pandroidx.verifyUpToDate ?"
   echo "See TaskUpToDateValidator.java for more information"
   exit 1
 fi
 
-runGradle "$@"
-# Check whether we were given the "-PverifyUpToDate" argument
 if [[ " ${@} " =~ " -PverifyUpToDate " ]]; then
+  echo "-PverifyUpToDate has been renamed to -Pandroidx.verifyUpToDate"
+  exit 1
+fi
+
+runGradle "$@"
+# Check whether we were given the "-Pandroidx.verifyUpToDate" argument
+if [[ " ${@} " =~ " -Pandroidx.verifyUpToDate " ]]; then
   # Re-run Gradle, and find all tasks that are unexpectly out of date
   if ! runGradle "$@" -PdisallowExecution --continue; then
     echo >&2
diff --git a/gridlayout/gridlayout/build.gradle b/gridlayout/gridlayout/build.gradle
index 613a911..b5c5616 100644
--- a/gridlayout/gridlayout/build.gradle
+++ b/gridlayout/gridlayout/build.gradle
@@ -16,7 +16,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
 }
 
 androidx {
diff --git a/gridlayout/gridlayout/lint-baseline.xml b/gridlayout/gridlayout/lint-baseline.xml
index 637b301..15cf064 100644
--- a/gridlayout/gridlayout/lint-baseline.xml
+++ b/gridlayout/gridlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/health/health-services-client/OWNERS b/health/health-services-client/OWNERS
new file mode 100644
index 0000000..99e9acf
--- /dev/null
+++ b/health/health-services-client/OWNERS
@@ -0,0 +1,3 @@
[email protected]
[email protected]
[email protected]
diff --git a/health/health-services-client/api/current.txt b/health/health-services-client/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/health/health-services-client/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-services-client/api/public_plus_experimental_current.txt b/health/health-services-client/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/health/health-services-client/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-services-client/api/res-current.txt b/health/health-services-client/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/health/health-services-client/api/res-current.txt
diff --git a/health/health-services-client/api/restricted_current.txt b/health/health-services-client/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/health/health-services-client/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/health/health-services-client/build.gradle b/health/health-services-client/build.gradle
new file mode 100644
index 0000000..cd0be24
--- /dev/null
+++ b/health/health-services-client/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(KOTLIN_STDLIB)
+    // Add dependencies here
+}
+
+androidx {
+    name = "AndroidX Health Services Client Library"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.HEALTH_SERVICES_CLIENT
+    mavenGroup = LibraryGroups.HEALTH
+    inceptionYear = "2021"
+    description = "This library helps developers create performant health applications in a platform agnostic way"
+}
diff --git a/health/health-services-client/src/androidTest/AndroidManifest.xml b/health/health-services-client/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..d6673ca
--- /dev/null
+++ b/health/health-services-client/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.health.services.client.test">
+</manifest>
+
diff --git a/health/health-services-client/src/main/AndroidManifest.xml b/health/health-services-client/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..75a5742
--- /dev/null
+++ b/health/health-services-client/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+       http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.health.services.client">
+</manifest>
+
diff --git a/health/health-services-client/src/main/androidx/health/package-info.java b/health/health-services-client/src/main/androidx/health/package-info.java
new file mode 100644
index 0000000..2aa2c9c
--- /dev/null
+++ b/health/health-services-client/src/main/androidx/health/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/**
+ * Insert package level documentation here
+ */
+package androidx.health.services.client;
+
diff --git a/heifwriter/heifwriter/build.gradle b/heifwriter/heifwriter/build.gradle
index b31fef5..2df6655 100644
--- a/heifwriter/heifwriter/build.gradle
+++ b/heifwriter/heifwriter/build.gradle
@@ -21,7 +21,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
 }
 
 androidx {
diff --git a/heifwriter/heifwriter/lint-baseline.xml b/heifwriter/heifwriter/lint-baseline.xml
index 811dc40..4dbe59b 100644
--- a/heifwriter/heifwriter/lint-baseline.xml
+++ b/heifwriter/heifwriter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/hilt/hilt-common/lint-baseline.xml b/hilt/hilt-common/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/hilt/hilt-common/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/hilt/hilt-compiler/build.gradle b/hilt/hilt-compiler/build.gradle
index 2151577..d14a347 100644
--- a/hilt/hilt-compiler/build.gradle
+++ b/hilt/hilt-compiler/build.gradle
@@ -51,7 +51,7 @@
 }
 
 tasks.named("compileKotlin").configure {
-    dependsOn(":hilt:hilt-work:jarDebug")
+    dependsOn(":hilt:hilt-work:jarRelease")
 }
 
 androidx {
diff --git a/hilt/hilt-compiler/lint-baseline.xml b/hilt/hilt-compiler/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/hilt/hilt-compiler/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/hilt/hilt-navigation-compose/api/current.txt b/hilt/hilt-navigation-compose/api/current.txt
index 31a768e..447d5c6 100644
--- a/hilt/hilt-navigation-compose/api/current.txt
+++ b/hilt/hilt-navigation-compose/api/current.txt
@@ -1,10 +1,12 @@
 // Signature format: 4.0
 package androidx.hilt.navigation.compose {
 
-  public final class NavHostControllerKt {
+  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 @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel();
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
   }
 
 }
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 31a768e..447d5c6 100644
--- a/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt
+++ b/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt
@@ -1,10 +1,12 @@
 // Signature format: 4.0
 package androidx.hilt.navigation.compose {
 
-  public final class NavHostControllerKt {
+  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 @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel();
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
   }
 
 }
diff --git a/hilt/hilt-navigation-compose/api/restricted_current.txt b/hilt/hilt-navigation-compose/api/restricted_current.txt
index 31a768e..0b008ea 100644
--- a/hilt/hilt-navigation-compose/api/restricted_current.txt
+++ b/hilt/hilt-navigation-compose/api/restricted_current.txt
@@ -1,10 +1,13 @@
 // Signature format: 4.0
 package androidx.hilt.navigation.compose {
 
-  public final class NavHostControllerKt {
+  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 @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static <VM extends androidx.lifecycle.ViewModel> VM hiltViewModel(kotlin.reflect.KClass<VM> kClass, androidx.navigation.NavBackStackEntry backStackEntry);
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel();
+    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
   }
 
 }
diff --git a/hilt/hilt-navigation-compose/build.gradle b/hilt/hilt-navigation-compose/build.gradle
index afc8ac0..b41c57c 100644
--- a/hilt/hilt-navigation-compose/build.gradle
+++ b/hilt/hilt-navigation-compose/build.gradle
@@ -41,7 +41,7 @@
     kotlinPlugin projectOrArtifact(":compose:compiler:compiler")
 
     implementation(KOTLIN_STDLIB)
-    api(project(":hilt:hilt-navigation"))
+    api("androidx.hilt:hilt-navigation:1.0.0")
     api(projectOrArtifact(":compose:runtime:runtime"))
     api(projectOrArtifact(":compose:ui:ui"))
     api(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose"))
@@ -60,12 +60,12 @@
 }
 
 androidx {
-    name = "Navigation Compose Hilt Extension"
+    name = "Navigation Compose Hilt Integration"
     publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.HILT_NAVIGATION_COMPOSE
     mavenGroup = LibraryGroups.HILT
     inceptionYear = "2021"
-    description = "Navigation Compose Hilt Extension"
+    description = "Navigation Compose Hilt Integration"
     runApiTasks = new RunApiTasks.Yes()
     legacyDisableKotlinStrictApiMode = true
 }
diff --git a/hilt/hilt-navigation-compose/samples/build.gradle b/hilt/hilt-navigation-compose/samples/build.gradle
new file mode 100644
index 0000000..cda9b05
--- /dev/null
+++ b/hilt/hilt-navigation-compose/samples/build.gradle
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.LibraryType
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
+    implementation(KOTLIN_STDLIB)
+
+    compileOnly(projectOrArtifact(":annotation:annotation-sampled"))
+    implementation(projectOrArtifact(":hilt:hilt-navigation-compose"))
+}
+
+androidx {
+    name = "Navigation Compose Hilt Extension Samples"
+    type = LibraryType.SAMPLES
+    mavenGroup = LibraryGroups.HILT
+    mavenVersion = LibraryVersions.HILT_NAVIGATION_COMPOSE
+    inceptionYear = "2021"
+    description = "Samples for the Navigation Compose Hilt Integration"
+}
diff --git a/hilt/hilt-navigation-compose/samples/src/main/AndroidManifest.xml b/hilt/hilt-navigation-compose/samples/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0a1e1b5
--- /dev/null
+++ b/hilt/hilt-navigation-compose/samples/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest package="androidx.hilt.navigation.compose.samples" />
diff --git a/hilt/hilt-navigation-compose/samples/src/main/java/androidx/hilt/navigation/compose/samples/HiltViewModelSamples.kt b/hilt/hilt-navigation-compose/samples/src/main/java/androidx/hilt/navigation/compose/samples/HiltViewModelSamples.kt
new file mode 100644
index 0000000..e52fb79
--- /dev/null
+++ b/hilt/hilt-navigation-compose/samples/src/main/java/androidx/hilt/navigation/compose/samples/HiltViewModelSamples.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("UNUSED_VARIABLE") // These are sample files.
+
+package androidx.hilt.navigation.compose.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.runtime.Composable
+import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.lifecycle.ViewModel
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navigation
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@Sampled
+@Composable
+fun NavComposable() {
+    val navController = rememberNavController()
+    NavHost(navController, startDestination = "ExampleRoute") {
+        composable("ExampleRoute") {
+            val viewModel = hiltViewModel<ExampleViewModel>()
+        }
+    }
+}
+
+@Sampled
+@Composable
+fun NestedNavComposable() {
+    val navController = rememberNavController()
+    NavHost(navController, startDestination = "Parent") {
+        navigation(startDestination = "InnerRouteA", route = "Parent") {
+            composable("InnerRouteA") {
+                val viewModel = hiltViewModel<ParentViewModel>(
+                    navController.getBackStackEntry("Parent")
+                )
+            }
+            composable("InnerRouteB") {
+                val viewModel = hiltViewModel<ParentViewModel>(
+                    navController.getBackStackEntry("Parent")
+                )
+            }
+        }
+    }
+}
+
+@HiltViewModel
+class ExampleViewModel @Inject constructor() : ViewModel()
+
+@HiltViewModel
+class ParentViewModel @Inject constructor() : ViewModel()
diff --git a/hilt/hilt-navigation-compose/src/androidTest/AndroidManifest.xml b/hilt/hilt-navigation-compose/src/androidTest/AndroidManifest.xml
index e104685..764ae11 100644
--- a/hilt/hilt-navigation-compose/src/androidTest/AndroidManifest.xml
+++ b/hilt/hilt-navigation-compose/src/androidTest/AndroidManifest.xml
@@ -19,6 +19,6 @@
           package="androidx.hilt.navigation.compose">
     <application>
         <activity
-            android:name="androidx.hilt.navigation.compose.HiltNavGraphViewModelComposeTest$TestActivity" />
+            android:name="androidx.hilt.navigation.compose.HiltViewModelComposeTest$TestActivity" />
     </application>
 </manifest>
diff --git a/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltNavGraphViewModelComposeTest.kt b/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltNavGraphViewModelComposeTest.kt
deleted file mode 100644
index 68ad986..0000000
--- a/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltNavGraphViewModelComposeTest.kt
+++ /dev/null
@@ -1,154 +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.hilt.navigation.compose
-
-import androidx.activity.ComponentActivity
-import androidx.compose.material.Button
-import androidx.compose.material.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.test.ExperimentalTestApi
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.compose.ui.test.onNodeWithText
-import androidx.compose.ui.test.performClick
-import androidx.compose.testutils.runBlockingWithManualClock
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.ViewModel
-import androidx.navigation.compose.NavHost
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigate
-import androidx.navigation.compose.navigation
-import androidx.navigation.compose.rememberNavController
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
-import com.google.common.truth.Truth.assertThat
-import dagger.hilt.android.AndroidEntryPoint
-import dagger.hilt.android.lifecycle.HiltViewModel
-import dagger.hilt.android.testing.HiltAndroidRule
-import dagger.hilt.android.testing.HiltAndroidTest
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import javax.inject.Inject
-
-@LargeTest
-@HiltAndroidTest
-@ExperimentalTestApi
-@RunWith(AndroidJUnit4::class)
-class HiltNavGraphViewModelComposeTest {
-
-    @get:Rule
-    val testRule = HiltAndroidRule(this)
-
-    @get:Rule
-    val composeTestRule = createAndroidComposeRule<TestActivity>()
-
-    @Test
-    fun verifyCurrentNavGraphViewModel() = runBlockingWithManualClock { _ ->
-        lateinit var firstViewModel: SimpleViewModel
-        lateinit var secondViewModel: SimpleViewModel
-        composeTestRule.setContent {
-            val navController = rememberNavController()
-            NavHost(navController, startDestination = "One") {
-                composable("One") {
-                    firstViewModel = hiltNavGraphViewModel()
-                }
-            }
-            secondViewModel = hiltNavGraphViewModel()
-        }
-        composeTestRule.awaitIdle()
-        assertThat(firstViewModel).isNotNull()
-        assertThat(firstViewModel.handle).isNotNull()
-        assertThat(secondViewModel).isNotNull()
-        assertThat(secondViewModel.handle).isNotNull()
-
-        assertThat(firstViewModel).isNotSameInstanceAs(secondViewModel)
-    }
-
-    @Test
-    fun differentViewModelAcrossRoutes() = runBlockingWithManualClock { _ ->
-        lateinit var firstViewModel: SimpleViewModel
-        lateinit var secondViewModel: SimpleViewModel
-        composeTestRule.setContent {
-            val navController = rememberNavController()
-            NavHost(navController, startDestination = "One") {
-                composable("One") { backStackEntry ->
-                    firstViewModel = hiltNavGraphViewModel(backStackEntry)
-                    NavigateButton("Two") { navController.navigate("Two") }
-                }
-                composable("Two") { backStackEntry ->
-                    secondViewModel = hiltNavGraphViewModel(backStackEntry)
-                    NavigateButton("One") { navController.navigate("One") }
-                }
-            }
-        }
-        composeTestRule.awaitIdle()
-        assertThat(firstViewModel).isNotNull()
-        assertThat(firstViewModel.handle).isNotNull()
-
-        composeTestRule.onNodeWithText("Navigate to Two").performClick()
-        composeTestRule.awaitIdle()
-
-        assertThat(firstViewModel).isNotSameInstanceAs(secondViewModel)
-    }
-
-    @Test
-    fun sameParentViewModelAcrossRoutes() = runBlockingWithManualClock { _ ->
-        lateinit var firstViewModel: SimpleViewModel
-        lateinit var secondViewModel: SimpleViewModel
-        composeTestRule.setContent {
-            val navController = rememberNavController()
-            NavHost(navController, startDestination = "Main") {
-                navigation(startDestination = "One", route = "Main") {
-                    composable("One") {
-                        firstViewModel = navController.hiltNavGraphViewModel("Main")
-                        NavigateButton("Two") { navController.navigate("Two") }
-                    }
-                    composable("Two") {
-                        secondViewModel = navController.hiltNavGraphViewModel("Main")
-                        NavigateButton("One") { navController.navigate("One") }
-                    }
-                }
-            }
-        }
-        composeTestRule.awaitIdle()
-        assertThat(firstViewModel).isNotNull()
-        assertThat(firstViewModel.handle).isNotNull()
-
-        composeTestRule.onNodeWithText("Navigate to Two").performClick()
-        composeTestRule.awaitIdle()
-
-        assertThat(firstViewModel).isSameInstanceAs(secondViewModel)
-    }
-
-    @Composable
-    private fun NavigateButton(text: String, listener: () -> Unit = { }) {
-        Button(onClick = listener) {
-            Text(text = "Navigate to $text")
-        }
-    }
-
-    @AndroidEntryPoint
-    class TestActivity : ComponentActivity()
-
-    @HiltViewModel
-    class SimpleViewModel @Inject constructor(
-        val handle: SavedStateHandle,
-        val logger: MyLogger
-    ) : ViewModel()
-
-    class MyLogger @Inject constructor()
-}
\ No newline at end of file
diff --git a/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltViewModelComposeTest.kt b/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltViewModelComposeTest.kt
new file mode 100644
index 0000000..8c51e0e
--- /dev/null
+++ b/hilt/hilt-navigation-compose/src/androidTest/java/androidx/hilt/navigation/compose/HiltViewModelComposeTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.hilt.navigation.compose
+
+import androidx.activity.ComponentActivity
+import androidx.compose.material.Button
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.runBlockingWithManualClock
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.ViewModel
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navigation
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
+import dagger.hilt.android.AndroidEntryPoint
+import dagger.hilt.android.lifecycle.HiltViewModel
+import dagger.hilt.android.testing.HiltAndroidRule
+import dagger.hilt.android.testing.HiltAndroidTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import javax.inject.Inject
+
+@LargeTest
+@HiltAndroidTest
+@ExperimentalTestApi
+@RunWith(AndroidJUnit4::class)
+class HiltViewModelComposeTest {
+
+    @get:Rule
+    val testRule = HiltAndroidRule(this)
+
+    @get:Rule
+    val composeTestRule = createAndroidComposeRule<TestActivity>()
+
+    @Test
+    fun verifyCurrentNavGraphViewModel() = runBlockingWithManualClock { _ ->
+        lateinit var firstViewModel: SimpleViewModel
+        lateinit var secondViewModel: SimpleViewModel
+        composeTestRule.setContent {
+            val navController = rememberNavController()
+            NavHost(navController, startDestination = "One") {
+                composable("One") {
+                    firstViewModel = hiltViewModel()
+                }
+            }
+            secondViewModel = hiltViewModel()
+        }
+        composeTestRule.awaitIdle()
+        assertThat(firstViewModel).isNotNull()
+        assertThat(firstViewModel.handle).isNotNull()
+        assertThat(secondViewModel).isNotNull()
+        assertThat(secondViewModel.handle).isNotNull()
+
+        assertThat(firstViewModel).isNotSameInstanceAs(secondViewModel)
+    }
+
+    @Test
+    fun differentViewModelAcrossRoutes() = runBlockingWithManualClock { _ ->
+        lateinit var firstViewModel: SimpleViewModel
+        lateinit var secondViewModel: SimpleViewModel
+        composeTestRule.setContent {
+            val navController = rememberNavController()
+            NavHost(navController, startDestination = "One") {
+                composable("One") {
+                    firstViewModel = hiltViewModel()
+                    NavigateButton("Two") { navController.navigate("Two") }
+                }
+                composable("Two") {
+                    secondViewModel = hiltViewModel()
+                    NavigateButton("One") { navController.navigate("One") }
+                }
+            }
+        }
+        composeTestRule.awaitIdle()
+        assertThat(firstViewModel).isNotNull()
+        assertThat(firstViewModel.handle).isNotNull()
+
+        composeTestRule.onNodeWithText("Navigate to Two").performClick()
+        composeTestRule.awaitIdle()
+
+        assertThat(firstViewModel).isNotSameInstanceAs(secondViewModel)
+    }
+
+    @Test
+    fun sameParentViewModelAcrossRoutes() = runBlockingWithManualClock { _ ->
+        lateinit var firstViewModel: SimpleViewModel
+        lateinit var secondViewModel: SimpleViewModel
+        composeTestRule.setContent {
+            val navController = rememberNavController()
+            NavHost(navController, startDestination = "Main") {
+                navigation(startDestination = "One", route = "Main") {
+                    composable("One") {
+                        firstViewModel = hiltViewModel(
+                            navController.getBackStackEntry("Main")
+                        )
+                        NavigateButton("Two") { navController.navigate("Two") }
+                    }
+                    composable("Two") {
+                        secondViewModel = hiltViewModel(
+                            navController.getBackStackEntry("Main")
+                        )
+                        NavigateButton("One") { navController.navigate("One") }
+                    }
+                }
+            }
+        }
+        composeTestRule.awaitIdle()
+        assertThat(firstViewModel).isNotNull()
+        assertThat(firstViewModel.handle).isNotNull()
+
+        composeTestRule.onNodeWithText("Navigate to Two").performClick()
+        composeTestRule.awaitIdle()
+
+        assertThat(firstViewModel).isSameInstanceAs(secondViewModel)
+    }
+
+    @Composable
+    private fun NavigateButton(text: String, listener: () -> Unit = { }) {
+        Button(onClick = listener) {
+            Text(text = "Navigate to $text")
+        }
+    }
+
+    @AndroidEntryPoint
+    class TestActivity : ComponentActivity()
+
+    @HiltViewModel
+    class SimpleViewModel @Inject constructor(
+        val handle: SavedStateHandle,
+        val logger: MyLogger
+    ) : ViewModel()
+
+    class MyLogger @Inject constructor()
+}
\ No newline at end of file
diff --git a/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/HiltViewModel.kt b/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/HiltViewModel.kt
new file mode 100644
index 0000000..7a1210c
--- /dev/null
+++ b/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/HiltViewModel.kt
@@ -0,0 +1,126 @@
+/*
+ * 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.hilt.navigation.compose
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.hilt.navigation.HiltViewModelFactory
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
+import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavBackStackEntry
+import androidx.navigation.NavController
+import kotlin.reflect.KClass
+
+/**
+ * Returns an existing
+ * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
+ * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
+ * the {@link NavController} back stack.
+ *
+ * If no navigation graph is currently present then the current scope will be used, usually, a
+ * fragment or an activity.
+ *
+ * @sample androidx.hilt.navigation.compose.samples.NavComposable
+ */
+@Composable
+inline fun <reified VM : ViewModel> hiltViewModel(): VM {
+    val owner = LocalViewModelStoreOwner.current
+    return if (owner is NavBackStackEntry) {
+        hiltViewModel(VM::class, owner)
+    } else {
+        viewModel()
+    }
+}
+
+/**
+ * Returns an existing
+ * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
+ * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
+ * the {@link NavController} back stack.
+ *
+ * If no navigation graph is currently present then the current scope will be used, usually, a
+ * fragment or an activity.
+ */
+@Deprecated(
+    message = "Use hiltViewModel() instead.",
+    replaceWith = ReplaceWith("hiltViewModel()"),
+)
+@Composable
+inline fun <reified VM : ViewModel> hiltNavGraphViewModel() = hiltViewModel<VM>()
+
+/**
+ * Returns an existing
+ * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
+ * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
+ * the [NavController] back stack.
+ *
+ * @param backStackEntry The entry of a [NavController] back stack.
+ *
+ * @sample androidx.hilt.navigation.compose.samples.NestedNavComposable
+ */
+@Composable
+inline fun <reified VM : ViewModel> hiltViewModel(backStackEntry: NavBackStackEntry) =
+    hiltViewModel(VM::class, backStackEntry)
+
+/**
+ * Returns an existing
+ * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
+ * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
+ * the [NavController] back stack.
+ *
+ * @param backStackEntry The entry of a [NavController] back stack.
+ */
+@Deprecated(
+    message = "Use hiltViewModel(NavBackStackEntry) instead.",
+    replaceWith = ReplaceWith("hiltViewModel(backStackEntry)"),
+)
+@Composable
+inline fun <reified VM : ViewModel> hiltNavGraphViewModel(backStackEntry: NavBackStackEntry) =
+    hiltViewModel<VM>(backStackEntry)
+
+/**
+ * Returns an existing
+ * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
+ * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
+ * the [NavController] back stack.
+ *
+ * @param route route of a destination that exists on the [NavController] back stack.
+ */
+@Deprecated(
+    message = "Use hiltViewModel(NavBackStackEntry) in combination with " +
+        "NavController#getBackStackEntry(String). This API will be removed in a future version.",
+    replaceWith = ReplaceWith("hiltViewModel(this.getBackStackEntry(route))"),
+    level = DeprecationLevel.ERROR
+)
+@Composable
+inline fun <reified VM : ViewModel> NavController.hiltNavGraphViewModel(route: String) =
+    hiltViewModel<VM>(this.getBackStackEntry(route))
+
+@Composable
+@PublishedApi
+internal fun <VM : ViewModel> hiltViewModel(
+    kClass: KClass<VM>,
+    backStackEntry: NavBackStackEntry
+): VM {
+    val viewModelFactory = HiltViewModelFactory(
+        context = LocalContext.current,
+        navBackStackEntry = backStackEntry
+    )
+    return ViewModelProvider(backStackEntry, viewModelFactory).get(kClass.java)
+}
\ No newline at end of file
diff --git a/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/NavHostController.kt b/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/NavHostController.kt
deleted file mode 100644
index b7854dc..0000000
--- a/hilt/hilt-navigation-compose/src/main/java/androidx/hilt/navigation/compose/NavHostController.kt
+++ /dev/null
@@ -1,106 +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.hilt.navigation.compose
-
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.platform.LocalContext
-import androidx.hilt.navigation.HiltViewModelFactory
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
-import androidx.lifecycle.viewmodel.compose.viewModel
-import androidx.navigation.NavBackStackEntry
-import androidx.navigation.NavController
-import androidx.navigation.compose.getBackStackEntry
-
-/**
- * Returns an existing
- * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
- * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
- * the {@link NavController} back stack:
- * ```
- * @Composable
- * fun ExampleScreen() {
- *     val viewmodel = hiltNavGraphViewModel<ExampleViewModel>()
- * }
- * ```
- *
- * If no navigation graph is currently present then the current scope will be used, usually, a
- * fragment or an activity.
- */
-@Composable
-inline fun <reified VM : ViewModel> hiltNavGraphViewModel(): VM {
-    val owner = LocalViewModelStoreOwner.current
-    return if (owner is NavBackStackEntry) {
-        hiltNavGraphViewModel(owner)
-    } else {
-        viewModel()
-    }
-}
-
-/**
- * Returns an existing
- * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
- * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
- * the [NavController] back stack:
- * ```
- * @Composable
- * fun MyApp() {
- *     // ...
- *     NavHost(navController, startDestination = startRoute) {
- *         composable("example") { backStackEntry ->
- *             val viewmodel = hiltNavGraphViewModel<ExampleViewModel>(backStackEntry)
- *         }
- *     }
- * }
- * ```
- *
- * @param backStackEntry The entry of a [NavController] back stack.
- */
-@Composable
-inline fun <reified VM : ViewModel> hiltNavGraphViewModel(backStackEntry: NavBackStackEntry): VM {
-    val viewModelFactory = HiltViewModelFactory(
-        context = LocalContext.current,
-        navBackStackEntry = backStackEntry
-    )
-    return ViewModelProvider(backStackEntry, viewModelFactory).get(VM::class.java)
-}
-
-/**
- * Returns an existing
- * [HiltViewModel](https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel)
- * -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
- * the [NavController] back stack:
- * ```
- * @Composable
- * fun MyApp() {
- *     // ...
- *     NavHost(navController, startDestination = startRoute) {
- *         navigation(startDestination = innerStartRoute, route = "Parent") {
- *             // ...
- *             composable("example") { backStackEntry ->
- *                 val parentViewModel = hiltNavGraphViewModel<ParentViewModel>("Parent")
- *             }
- *         }
- *     }
- * }
- * ```
- * @param route route of a destination that exists on the [NavController] back stack.
- */
-@Composable
-inline fun <reified VM : ViewModel> NavController.hiltNavGraphViewModel(route: String) =
-    hiltNavGraphViewModel<VM>(this.getBackStackEntry(route))
diff --git a/hilt/hilt-navigation-fragment/build.gradle b/hilt/hilt-navigation-fragment/build.gradle
index 20a9198..39fd6ef 100644
--- a/hilt/hilt-navigation-fragment/build.gradle
+++ b/hilt/hilt-navigation-fragment/build.gradle
@@ -51,7 +51,7 @@
     kaptAndroidTest(HILT_COMPILER)
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-navigation"), {
-        exclude group: 'androidx.navigation', module: 'navigation-common-ktx'
+        exclude group: 'androidx.navigation', module: 'navigation-common'
     })
 }
 
diff --git a/hilt/hilt-navigation-fragment/lint-baseline.xml b/hilt/hilt-navigation-fragment/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/hilt/hilt-navigation-fragment/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/hilt/hilt-work/build.gradle b/hilt/hilt-work/build.gradle
index 8186e90..55e6621 100644
--- a/hilt/hilt-work/build.gradle
+++ b/hilt/hilt-work/build.gradle
@@ -48,7 +48,7 @@
     project.tasks.register("jar${suffix}", Jar).configure {
         dependsOn(variant.javaCompileProvider)
         from(variant.javaCompileProvider.map { task -> task.destinationDir})
-        destinationDir(new File(project.buildDir, "libJar"))
+        destinationDirectory.fileValue(new File(project.buildDir, "libJar"))
     }
 }
 
diff --git a/hilt/hilt-work/lint-baseline.xml b/hilt/hilt-work/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/hilt/hilt-work/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/hilt/integration-tests/viewmodelapp/lint-baseline.xml b/hilt/integration-tests/viewmodelapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/hilt/integration-tests/viewmodelapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/hilt/integration-tests/workerapp/lint-baseline.xml b/hilt/integration-tests/workerapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/hilt/integration-tests/workerapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/inspection/inspection-gradle-plugin/build.gradle b/inspection/inspection-gradle-plugin/build.gradle
index 20e9873..11c4c81 100644
--- a/inspection/inspection-gradle-plugin/build.gradle
+++ b/inspection/inspection-gradle-plugin/build.gradle
@@ -33,10 +33,10 @@
 dependencies {
     implementation(findGradleKotlinDsl())
     implementation(gradleApi())
-    implementation(AGP_STABLE)
+    implementation(AGP_LATEST)
     implementation(KOTLIN_STDLIB)
     implementation("gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.13")
-    implementation("com.github.jengelman.gradle.plugins:shadow:5.2.0")
+    implementation(libs.shadow)
 
     testImplementation(project(":internal-testutils-gradle-plugin"))
     testImplementation(gradleTestKit())
diff --git a/inspection/inspection-gradle-plugin/lint-baseline.xml b/inspection/inspection-gradle-plugin/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/inspection/inspection-gradle-plugin/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/DexInspectorTask.kt b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/DexInspectorTask.kt
index 4fa04be..df48977 100644
--- a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/DexInspectorTask.kt
+++ b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/DexInspectorTask.kt
@@ -20,41 +20,94 @@
 import com.android.build.gradle.api.BaseVariant
 import com.android.build.gradle.api.LibraryVariant
 import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
 import org.gradle.api.Project
+import org.gradle.api.attributes.Attribute
 import org.gradle.api.file.ConfigurableFileCollection
 import org.gradle.api.file.RegularFileProperty
 import org.gradle.api.tasks.Copy
+import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputFile
 import org.gradle.api.tasks.InputFiles
 import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.bundling.Jar
+import org.gradle.api.tasks.bundling.Zip
+import java.io.ByteArrayOutputStream
 import java.io.File
+import java.nio.charset.Charset
 
 abstract class DexInspectorTask : DefaultTask() {
+    @get:PathSensitive(PathSensitivity.NONE)
     @get:InputFile
-    abstract val dxExecutable: RegularFileProperty
+    abstract val d8Executable: RegularFileProperty
 
+    @get:PathSensitive(PathSensitivity.NONE)
+    @get:InputFile
+    abstract val androidJar: RegularFileProperty
+
+    @get:PathSensitive(PathSensitivity.NONE)
+    @get:InputFiles
+    abstract val compileClasspath: ConfigurableFileCollection
+
+    @get:PathSensitive(PathSensitivity.NONE)
     @get:InputFiles
     abstract val jars: ConfigurableFileCollection
 
     @get:OutputFile
     abstract val outputFile: RegularFileProperty
 
+    @get:Input
+    abstract var minSdkVersion: Int
+
     @TaskAction
     fun exec() {
         val output = outputFile.get().asFile
         output.parentFile.mkdirs()
-        project.exec {
-            it.executable = dxExecutable.get().asFile.absolutePath
-            val flatten = jars.map { file -> file.absolutePath }
-            it.args = listOf("--dex", "--output", output.absolutePath) + flatten
+        val errorStream = ByteArrayOutputStream()
+        val executionResult = project.exec {
+            it.executable = d8Executable.get().asFile.absolutePath
+            val filesToDex = jars.map { file -> file.absolutePath }
+
+            // All runtime dependencies of the inspector are already jarjar-ed and packed in
+            // the single jar by previous steps. However, inspectors have compileOnly
+            // dependencies as well that are required by d8 for clean dexing.
+            // Those compileOnly libraries are inspected libraries, that are provided by an
+            // inspected app in the runtime. But it's hard to access compileOnly Configuration
+            // and easy to access the compileConfiguration and it's ok to pass extra libraries to
+            // d8, so we pass the entire compileConfiguration here.
+            // More on compileConfiguratioh, see here:
+            // https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management
+            val libArgs = compileClasspath.map {
+                listOf("--lib", it.absolutePath)
+            }.flatten()
+            val libSdk = listOf("--lib", androidJar.get().asFile.absolutePath)
+            val minApiArg = listOf("--min-api", "$minSdkVersion")
+            it.args = listOf("--output", output.absolutePath) + libArgs + libSdk + minApiArg +
+                filesToDex
+            it.errorOutput = errorStream
+            it.isIgnoreExitValue = true
+        }
+        val errors = errorStream.toByteArray()
+        val exitCode = executionResult.exitValue
+        if (errors.isNotEmpty() || exitCode != 0) {
+            logger.error("D8 errors: ${errors.toString(Charset.defaultCharset())}")
+            throw GradleException(
+                "Dexing didn't finish cleanly (exitCode = $exitCode), " +
+                    "see logs for warnings and errors"
+            )
         }
     }
 
-    fun setDx(sdkDir: File, toolsVersion: String) {
-        dxExecutable.set(File(sdkDir, "build-tools/$toolsVersion/dx"))
+    fun setD8(sdkDir: File, toolsVersion: String) {
+        d8Executable.set(File(sdkDir, "build-tools/$toolsVersion/d8"))
+    }
+
+    fun setAndroidJar(sdkDir: File, version: Int) {
+        androidJar.set(File(sdkDir, "platforms/android-$version/android.jar"))
     }
 }
 
@@ -70,18 +123,41 @@
 
 // variant.taskName relies on @ExperimentalStdlibApi api
 @ExperimentalStdlibApi
-fun Project.registerDexInspectorTask(
+fun Project.registerBundleInspectorTask(
     variant: BaseVariant,
     extension: BaseExtension,
     jarName: String?,
     jar: TaskProvider<out Jar>
-): TaskProvider<DexInspectorTask> {
-    return tasks.register(variant.taskName("dexInspector"), DexInspectorTask::class.java) {
-        it.setDx(extension.sdkDirectory, extension.buildToolsVersion)
-        it.jars.from(jar.get().destinationDirectory)
-        val name = jarName ?: "${project.name}.jar"
-        val out = File(taskWorkingDir(variant, "dexedInspector"), name)
+): TaskProvider<Zip> {
+    val name = jarName ?: "${project.name}.jar"
+    val out = File(taskWorkingDir(variant, "dexedInspector"), name)
+
+    val dex = tasks.register(variant.taskName("dexInspector"), DexInspectorTask::class.java) {
+        it.minSdkVersion = extension.defaultConfig.minSdk!!
+        it.setD8(extension.sdkDirectory, extension.buildToolsVersion)
+        it.setAndroidJar(extension.sdkDirectory, extension.defaultConfig.targetSdk!!)
+        it.jars.from(jar.get().archiveFile)
         it.outputFile.set(out)
+        it.compileClasspath.from(
+            variant.compileConfiguration.incoming.artifactView {
+                it.attributes {
+                    it.attribute(
+                        Attribute.of("artifactType", String::class.java),
+                        "android-classes"
+                    )
+                }
+            }.artifacts.artifactFiles
+        )
         it.dependsOn(jar)
     }
+
+    return tasks.register(variant.taskName("assembleInspectorJar"), Zip::class.java) {
+        it.from(zipTree(jar.get().archiveFile))
+        it.from(zipTree(out))
+        it.exclude("**/*.class")
+        it.archiveFileName.set(name)
+        it.destinationDirectory.set(taskWorkingDir(variant, "assembleInspectorJar"))
+        it.dependsOn(dex)
+        it.includeEmptyDirs = false
+    }
 }
diff --git a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/GenerateInspectionPlatformVersionTask.kt b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/GenerateInspectionPlatformVersionTask.kt
index 3b0c043..feea3b0 100644
--- a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/GenerateInspectionPlatformVersionTask.kt
+++ b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/GenerateInspectionPlatformVersionTask.kt
@@ -20,14 +20,18 @@
 import org.gradle.api.DefaultTask
 import org.gradle.api.GradleException
 import org.gradle.api.Project
-import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.ArtifactCollection
 import org.gradle.api.artifacts.component.ModuleComponentIdentifier
 import org.gradle.api.artifacts.component.ProjectComponentIdentifier
 import org.gradle.api.attributes.Attribute
 import org.gradle.api.file.DirectoryProperty
-import org.gradle.api.tasks.Classpath
+import org.gradle.api.file.FileCollection
 import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Internal
 import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.TaskProvider
 import java.io.File
@@ -38,15 +42,21 @@
  * by inspector.
  */
 abstract class GenerateInspectionPlatformVersionTask : DefaultTask() {
-    @get:Classpath
-    abstract var compileConfiguration: Configuration
+    // ArtCollection can't be exposed as input as it is, so below there is "getCompileInputs"
+    // that adds it properly as input.
+    @get:Internal
+    abstract var compileClasspath: ArtifactCollection
+
+    @PathSensitive(PathSensitivity.NONE)
+    @InputFiles
+    fun getCompileInputs(): FileCollection = compileClasspath.artifactFiles
 
     @get:OutputDirectory
     abstract val outputDir: DirectoryProperty
 
     @Input
     fun getVersion(): String {
-        val artifacts = compileConfiguration.incoming.artifacts.artifacts
+        val artifacts = compileClasspath.artifacts
         val projectDep = artifacts.any {
             (it.id.componentIdentifier as? ProjectComponentIdentifier)?.projectPath ==
                 ":inspection:inspection"
@@ -79,9 +89,11 @@
 ): TaskProvider<GenerateInspectionPlatformVersionTask> {
     val name = variant.taskName("generateInspectionPlatformVersion")
     return tasks.register(name, GenerateInspectionPlatformVersionTask::class.java) {
-        it.compileConfiguration = variant.compileConfiguration.attributes {
-            it.attribute(Attribute.of("artifactType", String::class.java), "android-classes")
-        }
+        it.compileClasspath = variant.compileConfiguration.incoming.artifactView {
+            it.attributes {
+                it.attribute(Attribute.of("artifactType", String::class.java), "android-classes")
+            }
+        }.artifacts
         it.outputDir.set(taskWorkingDir(variant, "inspectionVersion"))
     }
 }
diff --git a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/InspectionPlugin.kt b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/InspectionPlugin.kt
index ce12c30e..13a107d 100644
--- a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/InspectionPlugin.kt
+++ b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/InspectionPlugin.kt
@@ -62,13 +62,13 @@
                     foundReleaseVariant = true
                     val unzip = project.registerUnzipTask(variant)
                     val shadowJar = project.registerShadowDependenciesTask(variant, unzip)
-                    val dexTask = project.registerDexInspectorTask(
+                    val bundleTask = project.registerBundleInspectorTask(
                         variant, libExtension, extension.name, shadowJar
                     )
 
                     publishInspector.outgoing.variants {
                         val configVariant = it.create("inspectorJar")
-                        configVariant.artifact(dexTask)
+                        configVariant.artifact(bundleTask)
                     }
                 }
             }
@@ -136,9 +136,7 @@
  */
 @ExperimentalStdlibApi
 fun packageInspector(libraryProject: Project, inspectorProject: Project) {
-    val consumeInspector = libraryProject.configurations.create("consumeInspector") {
-        it.setupInspectorAttribute()
-    }
+    val consumeInspector = libraryProject.createConsumeInspectionConfiguration()
 
     libraryProject.dependencies {
         add(consumeInspector.name, inspectorProject)
@@ -158,6 +156,11 @@
     }
 }
 
+fun Project.createConsumeInspectionConfiguration(): Configuration =
+    configurations.create("consumeInspector") {
+        it.setupInspectorAttribute()
+    }
+
 private fun Configuration.setupInspectorAttribute() {
     attributes {
         it.attribute(Attribute.of("inspector", String::class.java), "inspectorJar")
diff --git a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/ShadowDependenciesTask.kt b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/ShadowDependenciesTask.kt
index 11ad65f..5474cbf 100644
--- a/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/ShadowDependenciesTask.kt
+++ b/inspection/inspection-gradle-plugin/src/main/kotlin/androidx/inspection/gradle/ShadowDependenciesTask.kt
@@ -109,7 +109,7 @@
  * live in meta-inf directory and their contents respecting the rules supplied into shadowJar.
  */
 class RenameServicesTransformer : Transformer {
-    val renamed = mutableMapOf<String, String>()
+    private val renamed = mutableMapOf<String, String>()
 
     override fun canTransformResource(element: FileTreeElement?): Boolean {
         return element?.relativePath?.startsWith("META-INF/services") ?: false
@@ -140,6 +140,8 @@
 
 private fun TransformerContext.relocateOrSelf(className: String): String {
     val relocateContext = RelocateClassContext(className, stats)
-    val relocator = relocators.find { it.canRelocateClass(relocateContext) }
+    val relocator = relocators.find {
+        it.canRelocateClass(className)
+    }
     return relocator?.relocateClass(relocateContext) ?: className
 }
diff --git a/inspection/inspection-gradle-plugin/src/test/kotlin/androidx/inspection/gradle/InspectionPluginTest.kt b/inspection/inspection-gradle-plugin/src/test/kotlin/androidx/inspection/gradle/InspectionPluginTest.kt
index 4a0ebfe..fd21c72 100644
--- a/inspection/inspection-gradle-plugin/src/test/kotlin/androidx/inspection/gradle/InspectionPluginTest.kt
+++ b/inspection/inspection-gradle-plugin/src/test/kotlin/androidx/inspection/gradle/InspectionPluginTest.kt
@@ -70,10 +70,14 @@
                 dependencies {
                     implementation("androidx.inspection:inspection:1.0.0")
                 }
+                android {
+                    defaultConfig {
+                        targetSdkVersion 30
+                    }
+                }
             """
         )
-
-        val output = gradleRunner.withArguments("dexInspectorRelease").build()
+        val output = gradleRunner.withArguments("dexInspectorRelease", "--stacktrace").build()
         assertEquals(output.task(":dexInspectorRelease")!!.outcome, TaskOutcome.SUCCESS)
         val artifact = File(
             projectSetup.rootDir,
diff --git a/inspection/inspection/lint-baseline.xml b/inspection/inspection/lint-baseline.xml
index 367e8df..b82825b 100644
--- a/inspection/inspection/lint-baseline.xml
+++ b/inspection/inspection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/interpolator/interpolator/lint-baseline.xml b/interpolator/interpolator/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/interpolator/interpolator/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/jetifier/jetifier/core/build.gradle b/jetifier/jetifier/core/build.gradle
index 717304d..b94dae3 100644
--- a/jetifier/jetifier/core/build.gradle
+++ b/jetifier/jetifier/core/build.gradle
@@ -26,9 +26,6 @@
 
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 dependencies {
     api("com.google.code.gson:gson:2.8.0")
     api(KOTLIN_STDLIB)
diff --git a/jetifier/jetifier/core/lint-baseline.xml b/jetifier/jetifier/core/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/jetifier/jetifier/core/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index de39296..05a6a18 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -681,6 +681,10 @@
       "to": "ignore"
     },
     {
+       "from": "androidx/emoji2/(.*)",
+       "to": "ignore"
+    },
+    {
       "from": "androidx/biometric/(.*)",
       "to": "ignore"
     },
@@ -1311,6 +1315,22 @@
       "to": "androidx/text/emoji/bundled"
     },
     {
+       "from": "androidx/emoji2/text",
+       "to": "androidx/emoji2/text"
+    },
+    {
+       "from": "androidx/emoji2/bundled",
+       "to": "androidx/emoji2/bundled"
+    },
+    {
+       "from": "androidx/emoji2/widget",
+       "to": "androidx/emoji2/widget"
+    },
+    {
+       "from": "androidx/emoji2/viewshelper",
+       "to": "androidx/emoji2/viewshelper"
+    },
+    {
      "from": "androidx/lifecycle/process",
       "to": "androidx/lifecycle/process"
     },
@@ -2174,6 +2194,54 @@
     },
     {
       "from": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2",
+        "version": "{newSlVersion}"
+      },
+      "to": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2",
+        "version": "{newSlVersion}"
+      }
+    },
+    {
+      "from": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-bundled",
+        "version": "{newSlVersion}"
+      },
+      "to": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-bundled",
+        "version": "{newSlVersion}"
+      }
+    },
+    {
+      "from": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-views",
+        "version": "{newSlVersion}"
+      },
+      "to": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-views",
+        "version": "{newSlVersion}"
+      }
+    },
+    {
+      "from": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-views-helper",
+        "version": "{newSlVersion}"
+      },
+      "to": {
+        "groupId": "androidx.emoji2",
+        "artifactId": "emoji2-views-helper",
+        "version": "{newSlVersion}"
+      }
+    },
+    {
+      "from": {
         "groupId": "com.android.support",
         "artifactId": "support-fragment",
         "version": "{oldSlVersion}"
diff --git a/jetifier/jetifier/preprocessor/build.gradle b/jetifier/jetifier/preprocessor/build.gradle
index f478c95..2a764dc 100644
--- a/jetifier/jetifier/preprocessor/build.gradle
+++ b/jetifier/jetifier/preprocessor/build.gradle
@@ -20,9 +20,6 @@
     id("application")
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 mainClassName = "com.android.tools.build.jetifier.preprocessor.MainKt"
 
 dependencies {
diff --git a/jetifier/jetifier/preprocessor/lint-baseline.xml b/jetifier/jetifier/preprocessor/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/jetifier/jetifier/preprocessor/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/jetifier/jetifier/processor/build.gradle b/jetifier/jetifier/processor/build.gradle
index 286b525..39eeeaa 100644
--- a/jetifier/jetifier/processor/build.gradle
+++ b/jetifier/jetifier/processor/build.gradle
@@ -25,9 +25,6 @@
     id("kotlin")
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 dependencies {
     api(project(":jetifier-core"))
     api("org.ow2.asm:asm:8.0.1")
diff --git a/jetifier/jetifier/processor/lint-baseline.xml b/jetifier/jetifier/processor/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/jetifier/jetifier/processor/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/jetifier/jetifier/standalone/lint-baseline.xml b/jetifier/jetifier/standalone/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/jetifier/jetifier/standalone/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/leanback/leanback-paging/build.gradle b/leanback/leanback-paging/build.gradle
index 32e4434..415101b 100644
--- a/leanback/leanback-paging/build.gradle
+++ b/leanback/leanback-paging/build.gradle
@@ -19,9 +19,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-espresso"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-common"))
diff --git a/leanback/leanback-paging/lint-baseline.xml b/leanback/leanback-paging/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/leanback/leanback-paging/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/leanback/leanback-preference/lint-baseline.xml b/leanback/leanback-preference/lint-baseline.xml
index c692f79..9ec7ae2 100644
--- a/leanback/leanback-preference/lint-baseline.xml
+++ b/leanback/leanback-preference/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/leanback/leanback-tab/build.gradle b/leanback/leanback-tab/build.gradle
index 8bad67a..587ee18 100644
--- a/leanback/leanback-tab/build.gradle
+++ b/leanback/leanback-tab/build.gradle
@@ -25,9 +25,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-espresso"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-common"))
diff --git a/leanback/leanback-tab/lint-baseline.xml b/leanback/leanback-tab/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/leanback/leanback-tab/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/leanback/leanback/build.gradle b/leanback/leanback/build.gradle
index e0f38fa..cbc1960 100644
--- a/leanback/leanback/build.gradle
+++ b/leanback/leanback/build.gradle
@@ -23,9 +23,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-espresso"))
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-common"))
diff --git a/leanback/leanback/lint-baseline.xml b/leanback/leanback/lint-baseline.xml
index 3c24db3..33c805d 100644
--- a/leanback/leanback/lint-baseline.xml
+++ b/leanback/leanback/lint-baseline.xml
@@ -1,5 +1,896 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.widget.BackgroundHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                drawable.setAlpha(view.getBackground().getAlpha());"
+        errorLine2="                                                       ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/BackgroundHelper.java"
+            line="35"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.picker.DatePicker is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            yearPattern = android.text.format.DateFormat.getBestDateTimePattern(mConstant.locale,"
+        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/picker/DatePicker.java"
+            line="144"
+            column="58"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Rect center = t.getEpicenter();"
+        errorLine2="                            ~~~~~~~~~~~~">
+        <location
+            file="api21/androidx/leanback/transition/FadeAndShortSlide.java"
+            line="114"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Rect center = getEpicenter();"
+        errorLine2="                          ~~~~~~~~~~~~">
+        <location
+            file="api21/androidx/leanback/transition/FadeAndShortSlide.java"
+            line="144"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.leanback.widget.ForegroundHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return view.getForeground();"
+        errorLine2="                        ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/ForegroundHelper.java"
+            line="17"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.leanback.widget.ForegroundHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            view.setForeground(drawable);"
+        errorLine2="                 ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/ForegroundHelper.java"
+            line="25"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.leanback.app.FragmentUtil is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return fragment.getContext();"
+        errorLine2="                            ~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/FragmentUtil.java"
+            line="25"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    vh.mTitleView.setAutofillHints(action.getAutofillHints());"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="690"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    vh.mTitleView.setAutofillHints((String[]) null);"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="692"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                vh.mTitleView.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="696"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    vh.mDescriptionView.setAutofillHints(action.getAutofillHints());"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="711"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    vh.mDescriptionView.setAutofillHints((String[]) null);"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="713"
+            column="41"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.leanback.widget.GuidedActionsStylist is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                vh.mTitleView.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
+            line="717"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                ft.addSharedElement(subView, transitionName);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="562"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                setEnterTransition((android.transition.Transition) enterTransition);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="903"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                setSharedElementEnterTransition((android.transition.Transition) sharedElementTransition);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="912"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    setEnterTransition((android.transition.Transition) enterTransition);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="925"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    setEnterTransition((android.transition.Transition) enterTransition);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="932"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                setSharedElementEnterTransition(null);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="935"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                setEnterTransition(null);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="938"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                setSharedElementEnterTransition(null);"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="940"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.app.GuidedStepFragment is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            setExitTransition((android.transition.Transition) exitTransition);"
+        errorLine2="            ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
+            line="947"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
+        errorLine2="              ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
+            line="40"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        slide.addTarget(R.id.browse_title_group);"
+        errorLine2="              ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
+            line="42"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
+        errorLine2="              ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
+            line="53"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.LeanbackTransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        slide.addTarget(R.id.browse_title_group);"
+        errorLine2="              ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
+            line="55"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.leanback.app.PermissionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            fragment.requestPermissions(permissions, requestCode);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/app/PermissionHelper.java"
+            line="33"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                                        ? !mProgressBar.isAccessibilityFocused() : true);"
+        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/PlaybackTransportRowPresenter.java"
+            line="320"
+            column="57"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.widget.RoundedRectHelperApi21.RoundedRectOutlineProvider is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), mRadius);"
+        errorLine2="                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/RoundedRectHelperApi21.java"
+            line="39"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.widget.RoundedRectHelperApi21.RoundedRectOutlineProvider is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            outline.setAlpha(1f);"
+        errorLine2="                    ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/RoundedRectHelperApi21.java"
+            line="40"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.system.Settings is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mOutlineClippingDisabled = activityManager.isLowRamDevice();"
+        errorLine2="                                                       ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/system/Settings.java"
+            line="132"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            outline.setRect(0, 0, view.getWidth(), view.getHeight());"
+        errorLine2="                    ~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/ShadowHelperApi21.java"
+            line="34"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            outline.setAlpha(1.0f);"
+        errorLine2="                    ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/ShadowHelperApi21.java"
+            line="35"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.StaticShadowHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            parent.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
+        errorLine2="                   ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"
+            line="38"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.StaticShadowHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            shadowContainer.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
+        errorLine2="                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"
+            line="44"
+            column="29"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.leanback.widget.picker.TimePicker is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            hourPattern = DateFormat.getBestDateTimePattern(mConstant.locale, mIs24hFormat ? &quot;Hma&quot;"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/widget/picker/TimePicker.java"
+            line="159"
+            column="38"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getSharedElementEnterTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="66"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            window.setSharedElementEnterTransition((Transition) transition);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="73"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getSharedElementReturnTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="79"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            window.setSharedElementReturnTransition((Transition) transition);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="86"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getSharedElementExitTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="92"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getSharedElementReenterTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="99"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getEnterTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="106"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            window.setEnterTransition((Transition) transition);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="113"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getReturnTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="119"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            window.setReturnTransition((Transition) transition);"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="126"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getExitTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="132"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return window.getReenterTransition();"
+        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="139"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Scene scene = new Scene(sceneRoot);"
+        errorLine2="                          ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="146"
+            column="27"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            scene.setEnterAction(r);"
+        errorLine2="                  ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="147"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            changeBounds.setReparent(reparent);"
+        errorLine2="                         ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="156"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ChangeTransform();"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="164"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TransitionSet set = new TransitionSet();"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="196"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL"
+        errorLine2="                ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="197"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new ChangeTransform();"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="215"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((TransitionSet) transitionSet).addTransition((Transition) transition);"
+        errorLine2="                                            ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="225"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).excludeTarget(targetId, exclude);"
+        errorLine2="                                      ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="231"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).excludeTarget(targetView, exclude);"
+        errorLine2="                                      ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="237"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).excludeChildren(targetId, exclude);"
+        errorLine2="                                      ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="243"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).excludeChildren(targetView, exclude);"
+        errorLine2="                                      ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="249"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).addTarget(targetId);"
+        errorLine2="                                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="255"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).addTarget(targetView);"
+        errorLine2="                                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="261"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).setStartDelay(startDelay);"
+        errorLine2="                                      ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="267"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).setDuration(duration);"
+        errorLine2="                                      ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="273"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new AutoTransition();"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="279"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new Fade(fadeMode);"
+        errorLine2="                   ~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="286"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            t.addListener((Transition.TransitionListener) listener.mImpl);"
+        errorLine2="              ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="323"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            t.removeListener((Transition.TransitionListener) listener.mImpl);"
+        errorLine2="              ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="339"
+            column="15"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TransitionManager.go((Scene) scene, (Transition) transition);"
+        errorLine2="                              ~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="351"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator);"
+        errorLine2="                                      ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="373"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ((Transition) transition).addTarget(view);"
+        errorLine2="                                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="379"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return TransitionInflater.from(context).inflateTransition(resId);"
+        errorLine2="                                      ~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="393"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return TransitionInflater.from(context).inflateTransition(resId);"
+        errorLine2="                                                    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="393"
+            column="53"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            fragment.setEnterTransition((Transition) transition);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="401"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            fragment.setExitTransition((Transition) transition);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="408"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            fragment.setSharedElementEnterTransition((Transition) transition);"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="416"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            ft.addSharedElement(view, transitionName);"
+        errorLine2="               ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="424"
+            column="16"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            TransitionManager.beginDelayedTransition(sceneRoot, transition);"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="447"
+            column="31"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            viewGroup.setTransitionGroup(transitionGroup);"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="453"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                ((Transition) transition).setEpicenterCallback(null);"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="461"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.leanback.transition.TransitionHelper is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                ((Transition) transition).setEpicenterCallback(new Transition.EpicenterCallback() {"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
+            line="463"
+            column="43"/>
+    </issue>
 
     <issue
         id="PrivateConstructorForUtilityClass"
@@ -13,897 +904,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.widget.BackgroundHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                drawable.setAlpha(view.getBackground().getAlpha());"
-        errorLine2="                                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/BackgroundHelper.java"
-            line="35"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.leanback.widget.picker.DatePicker is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            yearPattern = android.text.format.DateFormat.getBestDateTimePattern(mConstant.locale,"
-        errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/picker/DatePicker.java"
-            line="144"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            Rect center = t.getEpicenter();"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="api21/androidx/leanback/transition/FadeAndShortSlide.java"
-            line="114"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            Rect center = getEpicenter();"
-        errorLine2="                          ~~~~~~~~~~~~">
-        <location
-            file="api21/androidx/leanback/transition/FadeAndShortSlide.java"
-            line="144"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.leanback.widget.ForegroundHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return view.getForeground();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/ForegroundHelper.java"
-            line="17"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.leanback.widget.ForegroundHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            view.setForeground(drawable);"
-        errorLine2="                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/ForegroundHelper.java"
-            line="25"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.leanback.app.FragmentUtil is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            return fragment.getContext();"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/FragmentUtil.java"
-            line="25"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    vh.mTitleView.setAutofillHints(action.getAutofillHints());"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="690"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    vh.mTitleView.setAutofillHints((String[]) null);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="692"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                vh.mTitleView.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="696"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    vh.mDescriptionView.setAutofillHints(action.getAutofillHints());"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="711"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                    vh.mDescriptionView.setAutofillHints((String[]) null);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="713"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.leanback.widget.GuidedActionsStylist is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                vh.mTitleView.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/GuidedActionsStylist.java"
-            line="717"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                ft.addSharedElement(subView, transitionName);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="562"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                setEnterTransition((android.transition.Transition) enterTransition);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="903"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                setSharedElementEnterTransition((android.transition.Transition) sharedElementTransition);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="912"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    setEnterTransition((android.transition.Transition) enterTransition);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="925"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                    setEnterTransition((android.transition.Transition) enterTransition);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="932"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                setSharedElementEnterTransition(null);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="935"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                setEnterTransition(null);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="938"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                setSharedElementEnterTransition(null);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="940"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.app.GuidedStepFragment is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            setExitTransition((android.transition.Transition) exitTransition);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/GuidedStepFragment.java"
-            line="947"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.LeanbackTransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
-        errorLine2="              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
-            line="40"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.LeanbackTransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        slide.addTarget(R.id.browse_title_group);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
-            line="42"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.LeanbackTransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        slide.setInterpolator(AnimationUtils.loadInterpolator(context,"
-        errorLine2="              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
-            line="53"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.LeanbackTransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="        slide.addTarget(R.id.browse_title_group);"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/LeanbackTransitionHelper.java"
-            line="55"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.leanback.app.PermissionHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            fragment.requestPermissions(permissions, requestCode);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/app/PermissionHelper.java"
-            line="33"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                                        ? !mProgressBar.isAccessibilityFocused() : true);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/PlaybackTransportRowPresenter.java"
-            line="320"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.widget.RoundedRectHelperApi21.RoundedRectOutlineProvider is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), mRadius);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/RoundedRectHelperApi21.java"
-            line="39"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.widget.RoundedRectHelperApi21.RoundedRectOutlineProvider is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            outline.setAlpha(1f);"
-        errorLine2="                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/RoundedRectHelperApi21.java"
-            line="40"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.system.Settings is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            mOutlineClippingDisabled = activityManager.isLowRamDevice();"
-        errorLine2="                                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/system/Settings.java"
-            line="132"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            outline.setRect(0, 0, view.getWidth(), view.getHeight());"
-        errorLine2="                    ~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/ShadowHelperApi21.java"
-            line="34"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            outline.setAlpha(1.0f);"
-        errorLine2="                    ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/ShadowHelperApi21.java"
-            line="35"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.leanback.widget.StaticShadowHelper is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            parent.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"
-            line="38"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.leanback.widget.StaticShadowHelper is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            shadowContainer.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);"
-        errorLine2="                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/StaticShadowHelper.java"
-            line="44"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.leanback.widget.picker.TimePicker is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
-        errorLine1="            hourPattern = DateFormat.getBestDateTimePattern(mConstant.locale, mIs24hFormat ? &quot;Hma&quot;"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/widget/picker/TimePicker.java"
-            line="159"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getSharedElementEnterTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="66"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            window.setSharedElementEnterTransition((Transition) transition);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="73"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getSharedElementReturnTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="79"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            window.setSharedElementReturnTransition((Transition) transition);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="86"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getSharedElementExitTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="92"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getSharedElementReenterTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="99"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getEnterTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="106"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            window.setEnterTransition((Transition) transition);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="113"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getReturnTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="119"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            window.setReturnTransition((Transition) transition);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="126"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getExitTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="132"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return window.getReenterTransition();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="139"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            Scene scene = new Scene(sceneRoot);"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="146"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            scene.setEnterAction(r);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="147"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            changeBounds.setReparent(reparent);"
-        errorLine2="                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="156"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new ChangeTransform();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="164"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            TransitionSet set = new TransitionSet();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="196"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="197"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            return new ChangeTransform();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="215"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((TransitionSet) transitionSet).addTransition((Transition) transition);"
-        errorLine2="                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="225"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).excludeTarget(targetId, exclude);"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="231"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).excludeTarget(targetView, exclude);"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="237"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).excludeChildren(targetId, exclude);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="243"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).excludeChildren(targetView, exclude);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="249"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).addTarget(targetId);"
-        errorLine2="                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="255"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).addTarget(targetView);"
-        errorLine2="                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="261"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).setStartDelay(startDelay);"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="267"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).setDuration(duration);"
-        errorLine2="                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="273"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return new AutoTransition();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="279"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return new Fade(fadeMode);"
-        errorLine2="                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="286"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            t.addListener((Transition.TransitionListener) listener.mImpl);"
-        errorLine2="              ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="323"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            t.removeListener((Transition.TransitionListener) listener.mImpl);"
-        errorLine2="              ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="339"
-            column="15"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            TransitionManager.go((Scene) scene, (Transition) transition);"
-        errorLine2="                              ~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="351"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="373"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            ((Transition) transition).addTarget(view);"
-        errorLine2="                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="379"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return TransitionInflater.from(context).inflateTransition(resId);"
-        errorLine2="                                      ~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="393"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            return TransitionInflater.from(context).inflateTransition(resId);"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="393"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            fragment.setEnterTransition((Transition) transition);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="401"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            fragment.setExitTransition((Transition) transition);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="408"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            fragment.setSharedElementEnterTransition((Transition) transition);"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="416"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            ft.addSharedElement(view, transitionName);"
-        errorLine2="               ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="424"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            TransitionManager.beginDelayedTransition(sceneRoot, transition);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="447"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            viewGroup.setTransitionGroup(transitionGroup);"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="453"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                ((Transition) transition).setEpicenterCallback(null);"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="461"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.leanback.transition.TransitionHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="                ((Transition) transition).setEpicenterCallback(new Transition.EpicenterCallback() {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/leanback/transition/TransitionHelper.java"
-            line="463"
-            column="43"/>
-    </issue>
-
-    <issue
         id="KotlinPropertyAccess"
         message="This method should be called `getHasMediaRowSeparator` such that `hasMediaRowSeparator` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
         errorLine1="    public boolean hasMediaRowSeparator() {"
@@ -1831,7 +1831,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="546"
+            line="548"
             column="19"/>
     </issue>
 
@@ -1842,7 +1842,7 @@
         errorLine2="                                                ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="546"
+            line="548"
             column="49"/>
     </issue>
 
@@ -1853,7 +1853,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="649"
+            line="651"
             column="24"/>
     </issue>
 
@@ -1864,7 +1864,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="665"
+            line="667"
             column="30"/>
     </issue>
 
@@ -1875,7 +1875,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="736"
+            line="738"
             column="29"/>
     </issue>
 
@@ -1886,7 +1886,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="744"
+            line="746"
             column="12"/>
     </issue>
 
@@ -1897,7 +1897,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="753"
+            line="755"
             column="12"/>
     </issue>
 
@@ -1908,7 +1908,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="833"
+            line="835"
             column="29"/>
     </issue>
 
@@ -1919,7 +1919,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="887"
+            line="889"
             column="27"/>
     </issue>
 
@@ -1930,7 +1930,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/app/BackgroundManager.java"
-            line="962"
+            line="964"
             column="12"/>
     </issue>
 
@@ -2282,7 +2282,7 @@
         errorLine2="                                                              ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="900"
+            line="916"
             column="63"/>
     </issue>
 
@@ -2293,7 +2293,7 @@
         errorLine2="                                       ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="916"
+            line="932"
             column="40"/>
     </issue>
 
@@ -2304,7 +2304,7 @@
         errorLine2="                                                  ~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="916"
+            line="932"
             column="51"/>
     </issue>
 
@@ -2315,7 +2315,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="930"
+            line="946"
             column="12"/>
     </issue>
 
@@ -2326,7 +2326,7 @@
         errorLine2="                                                                    ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="944"
+            line="960"
             column="69"/>
     </issue>
 
@@ -2337,7 +2337,7 @@
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1040"
+            line="1056"
             column="45"/>
     </issue>
 
@@ -2348,7 +2348,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1048"
+            line="1064"
             column="46"/>
     </issue>
 
@@ -2359,7 +2359,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1056"
+            line="1072"
             column="43"/>
     </issue>
 
@@ -2370,7 +2370,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1064"
+            line="1080"
             column="43"/>
     </issue>
 
@@ -2381,7 +2381,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1072"
+            line="1088"
             column="12"/>
     </issue>
 
@@ -2392,7 +2392,7 @@
         errorLine2="                                    ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1077"
+            line="1093"
             column="37"/>
     </issue>
 
@@ -2403,7 +2403,7 @@
         errorLine2="                                      ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1088"
+            line="1104"
             column="39"/>
     </issue>
 
@@ -2414,7 +2414,7 @@
         errorLine2="                                                  ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1098"
+            line="1114"
             column="51"/>
     </issue>
 
@@ -2425,7 +2425,7 @@
         errorLine2="                           ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/BaseGridView.java"
-            line="1348"
+            line="1366"
             column="28"/>
     </issue>
 
@@ -13161,7 +13161,7 @@
         errorLine2="                               ~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="70"
+            line="71"
             column="32"/>
     </issue>
 
@@ -13172,7 +13172,7 @@
         errorLine2="                               ~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="71"
+            line="72"
             column="32"/>
     </issue>
 
@@ -13183,7 +13183,7 @@
         errorLine2="                               ~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="72"
+            line="73"
             column="32"/>
     </issue>
 
@@ -13194,7 +13194,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="79"
+            line="80"
             column="41"/>
     </issue>
 
@@ -13205,7 +13205,7 @@
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="106"
+            line="107"
             column="18"/>
     </issue>
 
@@ -13216,7 +13216,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="147"
+            line="148"
             column="12"/>
     </issue>
 
@@ -13227,7 +13227,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="152"
+            line="153"
             column="12"/>
     </issue>
 
@@ -13238,7 +13238,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/media/MediaControllerGlue.java"
-            line="168"
+            line="169"
             column="12"/>
     </issue>
 
@@ -20586,7 +20586,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="156"
+            line="148"
             column="26"/>
     </issue>
 
@@ -20597,7 +20597,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="160"
+            line="152"
             column="26"/>
     </issue>
 
@@ -20608,7 +20608,7 @@
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="160"
+            line="152"
             column="43"/>
     </issue>
 
@@ -20619,7 +20619,7 @@
         errorLine2="                         ~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="165"
+            line="157"
             column="26"/>
     </issue>
 
@@ -20630,7 +20630,7 @@
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="165"
+            line="157"
             column="43"/>
     </issue>
 
@@ -20641,7 +20641,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="230"
+            line="223"
             column="25"/>
     </issue>
 
@@ -20652,7 +20652,7 @@
         errorLine2="                                                                    ~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="250"
+            line="243"
             column="69"/>
     </issue>
 
@@ -20663,7 +20663,7 @@
         errorLine2="                           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="266"
+            line="260"
             column="28"/>
     </issue>
 
@@ -20674,7 +20674,7 @@
         errorLine2="           ~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="275"
+            line="270"
             column="12"/>
     </issue>
 
@@ -20685,7 +20685,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="283"
+            line="279"
             column="41"/>
     </issue>
 
@@ -20696,7 +20696,7 @@
         errorLine2="                             ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="319"
+            line="317"
             column="30"/>
     </issue>
 
@@ -20707,7 +20707,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/leanback/widget/SearchOrbView.java"
-            line="333"
+            line="331"
             column="12"/>
     </issue>
 
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 b6bae78..ce23b2f 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
@@ -4567,7 +4567,7 @@
         assertEquals(0, mGridView.getSelectedPosition());
     }
 
-    @FlakyTest
+    @FlakyTest(bugId = 187191618)
     @Test
     public void testExtraLayoutSpace() throws Throwable {
         Intent intent = new Intent();
diff --git a/leanback/leanback/src/androidTest/res/values/strings.xml b/leanback/leanback/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from leanback/leanback/src/androidTest/res/values/strings.xml
rename to leanback/leanback/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/SearchOrbView.java b/leanback/leanback/src/main/java/androidx/leanback/widget/SearchOrbView.java
index b54540f..5870c24 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/SearchOrbView.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/widget/SearchOrbView.java
@@ -43,9 +43,9 @@
  */
 public class SearchOrbView extends FrameLayout implements View.OnClickListener {
     private OnClickListener mListener;
-    private View mRootView;
-    private View mSearchOrbView;
-    private ImageView mIcon;
+    private final View mRootView;
+    private final View mSearchOrbView;
+    private final ImageView mIcon;
     private Drawable mIconDrawable;
     private Colors mColors;
     private final float mFocusedZoom;
@@ -77,7 +77,7 @@
          * Constructs a color set using the given colors for the search orb.
          * Other colors are provided by the framework.
          *
-         * @param color The main search orb color.
+         * @param color       The main search orb color.
          * @param brightColor A brighter version of the search orb used for animation.
          */
         public Colors(@ColorInt int color, @ColorInt int brightColor) {
@@ -87,9 +87,9 @@
         /**
          * Constructs a color set using the given colors.
          *
-         * @param color The main search orb color.
+         * @param color       The main search orb color.
          * @param brightColor A brighter version of the search orb used for animation.
-         * @param iconColor A color used to tint the search orb icon.
+         * @param iconColor   A color used to tint the search orb icon.
          */
         public Colors(@ColorInt int color, @ColorInt int brightColor, @ColorInt int iconColor) {
             this.color = color;
@@ -120,10 +120,10 @@
          */
         public static int getBrightColor(int color) {
             final float brightnessValue = 0xff * BRIGHTNESS_ALPHA;
-            int red = (int)(Color.red(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
-            int green = (int)(Color.green(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
-            int blue = (int)(Color.blue(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
-            int alpha = (int)(Color.alpha(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
+            int red = (int) (Color.red(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
+            int green = (int) (Color.green(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
+            int blue = (int) (Color.blue(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
+            int alpha = (int) (Color.alpha(color) * (1 - BRIGHTNESS_ALPHA) + brightnessValue);
             return Color.argb(alpha, red, green, blue);
         }
     }
@@ -131,23 +131,15 @@
     private final ArgbEvaluator mColorEvaluator = new ArgbEvaluator();
 
     private final ValueAnimator.AnimatorUpdateListener mUpdateListener =
-            new ValueAnimator.AnimatorUpdateListener() {
-        @Override
-        public void onAnimationUpdate(ValueAnimator animator) {
-            Integer color = (Integer) animator.getAnimatedValue();
-            setOrbViewColor(color.intValue());
-        }
-    };
+            animator -> {
+                Integer color = (Integer) animator.getAnimatedValue();
+                setOrbViewColor(color);
+            };
 
     private ValueAnimator mShadowFocusAnimator;
 
     private final ValueAnimator.AnimatorUpdateListener mFocusUpdateListener =
-            new ValueAnimator.AnimatorUpdateListener() {
-        @Override
-        public void onAnimationUpdate(ValueAnimator animation) {
-            setSearchOrbZ(animation.getAnimatedFraction());
-        }
-    };
+            animation -> setSearchOrbZ(animation.getAnimatedFraction());
 
     void setSearchOrbZ(float fraction) {
         ViewCompat.setZ(mSearchOrbView, mUnfocusedZ + fraction * (mFocusedZ - mUnfocusedZ));
@@ -199,7 +191,8 @@
         int color = a.getColor(R.styleable.lbSearchOrbView_searchOrbColor, defColor);
         int brightColor = a.getColor(
                 R.styleable.lbSearchOrbView_searchOrbBrightColor, color);
-        int iconColor = a.getColor(R.styleable.lbSearchOrbView_searchOrbIconColor, Color.TRANSPARENT);
+        int iconColor = a.getColor(R.styleable.lbSearchOrbView_searchOrbIconColor,
+                Color.TRANSPARENT);
         setOrbColors(new Colors(color, brightColor, iconColor));
         a.recycle();
 
@@ -261,6 +254,7 @@
 
     /**
      * Sets the orb icon.
+     *
      * @param icon the drawable to be used as the icon
      */
     public void setOrbIcon(Drawable icon) {
@@ -270,6 +264,7 @@
 
     /**
      * Returns the orb icon
+     *
      * @return the drawable used as the icon
      */
     public Drawable getOrbIcon() {
@@ -278,6 +273,7 @@
 
     /**
      * Sets the on click listener for the orb.
+     *
      * @param listener The listener.
      */
     public void setOnOrbClickedListener(OnClickListener listener) {
@@ -297,6 +293,7 @@
     /**
      * Sets the search orb colors.
      * Other colors are provided by the framework.
+     *
      * @deprecated Use {@link #setOrbColors(Colors)} instead.
      */
     @Deprecated
@@ -306,6 +303,7 @@
 
     /**
      * Returns the orb color
+     *
      * @return the RGBA color
      */
     @ColorInt
diff --git a/leanback/leanback/src/main/res/values-hy/strings.xml b/leanback/leanback/src/main/res/values-hy/strings.xml
index 84bcfdd..b8b1267 100644
--- a/leanback/leanback/src/main/res/values-hy/strings.xml
+++ b/leanback/leanback/src/main/res/values-hy/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"Նավարկման ընտրացանկ"</string>
+    <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"Նավիգացիայի ընտրացանկ"</string>
     <string name="orb_search_action" msgid="1301877238242752863">"Որոնում"</string>
     <string name="lb_search_bar_hint" msgid="5700349211583074131">"Որոնում"</string>
     <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"Խոսեք՝ որոնելու համար"</string>
@@ -53,7 +53,7 @@
     <string name="lb_playback_controls_hidden" msgid="5859666950961624736">"Մեդիայի կառավարման տարրերը թաքցված են։ Ցուցադրելու համար սեղմեք D-pad-ը:"</string>
     <string name="lb_guidedaction_finish_title" msgid="3330958750346333890">"Ավարտել"</string>
     <string name="lb_guidedaction_continue_title" msgid="893619591225519922">"Շարունակել"</string>
-    <string name="lb_media_player_error" msgid="3228326776757666747">"Մեդիա նվագարկիչի սխալի կոդ` %1$d (լրացուցիչ %2$d)"</string>
+    <string name="lb_media_player_error" msgid="3228326776757666747">"Մեդիա նվագարկչի սխալի կոդ` %1$d (լրացուցիչ %2$d)"</string>
     <string name="lb_onboarding_get_started" msgid="5549711907371161292">"ՍԿՍԵL"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2394451791544864917">"Հաջորդը"</string>
 </resources>
diff --git a/leanback/leanback/src/main/res/values-iw/strings.xml b/leanback/leanback/src/main/res/values-iw/strings.xml
index 42c39e7..2fd1128 100644
--- a/leanback/leanback/src/main/res/values-iw/strings.xml
+++ b/leanback/leanback/src/main/res/values-iw/strings.xml
@@ -20,7 +20,7 @@
     <string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"תפריט ניווט"</string>
     <string name="orb_search_action" msgid="1301877238242752863">"פעולת חיפוש"</string>
     <string name="lb_search_bar_hint" msgid="5700349211583074131">"חיפוש"</string>
-    <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"יש לדבר בקול כדי לחפש"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"צריך לדבר בקול כדי לבצע חיפוש"</string>
     <string name="lb_search_bar_hint_with_title" msgid="4826526877249029043">"חיפוש של <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_search_bar_hint_with_title_speech" msgid="6032250334706920550">"יש לדבר כדי לחפש <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4657191930956702614">"‎%1$dX‎‎"</string>
@@ -34,14 +34,14 @@
     <string name="lb_playback_controls_skip_next" msgid="8117512422682146745">"דילוג אל הפריט הבא"</string>
     <string name="lb_playback_controls_skip_previous" msgid="3481218248309447059">"דילוג אל הפריט הקודם"</string>
     <string name="lb_playback_controls_more_actions" msgid="8730341244454469032">"פעולות נוספות"</string>
-    <string name="lb_playback_controls_thumb_up" msgid="3458671378107738666">"ביטול בחירה בסימון \'אהבתי\'"</string>
-    <string name="lb_playback_controls_thumb_up_outline" msgid="1385865732502550659">"בחירה בסימון \'אהבתי\'"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="3458671378107738666">"ביטול הבחירה בסימון \'לייק\'"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1385865732502550659">"בחירה בסימון \'לייק\'"</string>
     <string name="lb_playback_controls_thumb_down" msgid="3544533410444618518">"ביטול הבחירה בסימון \'לא אהבתי\'"</string>
     <string name="lb_playback_controls_thumb_down_outline" msgid="8475278766138652105">"בחירה בסימון \'לא אהבתי\'"</string>
-    <string name="lb_playback_controls_repeat_none" msgid="1614290959784265209">"אל תחזור על כלום"</string>
-    <string name="lb_playback_controls_repeat_all" msgid="8429099206716245199">"חזרה על הכל"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="1614290959784265209">"לא לחזור על כלום"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="8429099206716245199">"חזרה על הכול"</string>
     <string name="lb_playback_controls_repeat_one" msgid="676658705837320560">"חזרה על פריט אחד"</string>
-    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"הפעלת ערבוב"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"הפעלה באקראי"</string>
     <string name="lb_playback_controls_shuffle_disable" msgid="6793109999253893369">"השבתת ערבוב"</string>
     <string name="lb_playback_controls_high_quality_enable" msgid="3057698527166674705">"הפעלת איכות גבוהה"</string>
     <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"השבתת איכות גבוהה"</string>
diff --git a/leanback/leanback/src/main/res/values-nl/strings.xml b/leanback/leanback/src/main/res/values-nl/strings.xml
index 1a49464..01c603b 100644
--- a/leanback/leanback/src/main/res/values-nl/strings.xml
+++ b/leanback/leanback/src/main/res/values-nl/strings.xml
@@ -41,12 +41,12 @@
     <string name="lb_playback_controls_repeat_none" msgid="1614290959784265209">"Niet herhalen"</string>
     <string name="lb_playback_controls_repeat_all" msgid="8429099206716245199">"Alles herhalen"</string>
     <string name="lb_playback_controls_repeat_one" msgid="676658705837320560">"Eén herhalen"</string>
-    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"Shuffle inschakelen"</string>
-    <string name="lb_playback_controls_shuffle_disable" msgid="6793109999253893369">"Shuffle uitschakelen"</string>
-    <string name="lb_playback_controls_high_quality_enable" msgid="3057698527166674705">"Hoge kwaliteit inschakelen"</string>
-    <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"Hoge kwaliteit uitschakelen"</string>
-    <string name="lb_playback_controls_closed_captioning_enable" msgid="2346334170216706076">"Ondertiteling inschakelen"</string>
-    <string name="lb_playback_controls_closed_captioning_disable" msgid="8691966842977635128">"Ondertiteling uitschakelen"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"Shuffle aanzetten"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="6793109999253893369">"Shuffle uitzetten"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="3057698527166674705">"Hoge kwaliteit aanzetten"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"Hoge kwaliteit uitzetten"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2346334170216706076">"Ondertiteling aanzetten"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="8691966842977635128">"Ondertiteling uitzetten"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="5770668162543767702">"Scherm-in-scherm-modus openen"</string>
     <string name="lb_playback_time_separator" msgid="1471121602610716654">"/"</string>
     <string name="lb_playback_controls_shown" msgid="8690223891515602822">"Opties voor mediabediening worden getoond"</string>
diff --git a/legacy/core-utils/lint-baseline.xml b/legacy/core-utils/lint-baseline.xml
index ee208f1b..e51fb50 100644
--- a/legacy/core-utils/lint-baseline.xml
+++ b/legacy/core-utils/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/lifecycle/integration-tests/incrementality/lint-baseline.xml b/lifecycle/integration-tests/incrementality/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lifecycle/integration-tests/incrementality/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/integration-tests/kotlintestapp/lint-baseline.xml b/lifecycle/integration-tests/kotlintestapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/integration-tests/kotlintestapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/integration-tests/testapp/lint-baseline.xml b/lifecycle/integration-tests/testapp/lint-baseline.xml
index 2a95858..76a3a35 100644
--- a/lifecycle/integration-tests/testapp/lint-baseline.xml
+++ b/lifecycle/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnusedResources"
diff --git a/lifecycle/lifecycle-common-java8/lint-baseline.xml b/lifecycle/lifecycle-common-java8/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lifecycle/lifecycle-common-java8/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-common/build.gradle b/lifecycle/lifecycle-common/build.gradle
index 1d28292..1beb36e 100644
--- a/lifecycle/lifecycle-common/build.gradle
+++ b/lifecycle/lifecycle-common/build.gradle
@@ -26,9 +26,6 @@
     id("java-library")
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_7
-targetCompatibility = JavaVersion.VERSION_1_7
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
diff --git a/lifecycle/lifecycle-common/lint-baseline.xml b/lifecycle/lifecycle-common/lint-baseline.xml
index a967115..c4b7d4c 100644
--- a/lifecycle/lifecycle-common/lint-baseline.xml
+++ b/lifecycle/lifecycle-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/lifecycle/lifecycle-compiler/lint-baseline.xml b/lifecycle/lifecycle-compiler/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lifecycle/lifecycle-compiler/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-extensions/lint-baseline.xml b/lifecycle/lifecycle-extensions/lint-baseline.xml
index 99a5199..1105055 100644
--- a/lifecycle/lifecycle-extensions/lint-baseline.xml
+++ b/lifecycle/lifecycle-extensions/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/lint-baseline.xml b/lifecycle/lifecycle-livedata-core-ktx-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt b/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
index 098de7c..9b801e1 100644
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
+++ b/lifecycle/lifecycle-livedata-core-ktx-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
@@ -30,6 +30,8 @@
 import com.android.tools.lint.detector.api.isKotlin
 import com.intellij.psi.PsiClassType
 import com.intellij.psi.PsiVariable
+import com.intellij.psi.impl.source.PsiImmediateClassType
+import org.jetbrains.kotlin.asJava.elements.KtLightTypeParameter
 import org.jetbrains.kotlin.psi.KtCallExpression
 import org.jetbrains.kotlin.psi.KtNullableType
 import org.jetbrains.kotlin.psi.KtTypeReference
@@ -94,15 +96,26 @@
             }
 
             private fun getFieldTypeReference(element: KotlinUField): KtTypeReference? {
-                // We need to extract type from the expression
+                // If field has type reference, we need to use type reference
+                // Given the field `val liveDataField: MutableLiveData<Boolean> = MutableLiveData()`
+                // reference: `MutableLiveData<Boolean>`
+                // argument: `Boolean`
+                val typeReference = element.sourcePsi
+                    ?.children
+                    ?.firstOrNull { it is KtTypeReference } as? KtTypeReference
+                val typeArgument = typeReference?.typeElement?.typeArgumentsAsTypes?.singleOrNull()
+                if (typeArgument != null) {
+                    return typeArgument
+                }
+
+                // We need to extract type from the call expression
                 // Given the field `val liveDataField = MutableLiveData<Boolean>()`
                 // expression: `MutableLiveData<Boolean>()`
                 // argument: `Boolean`
                 val expression = element.sourcePsi
                     ?.children
                     ?.firstOrNull { it is KtCallExpression } as? KtCallExpression
-                val argument = expression?.typeArguments?.singleOrNull()
-                return argument?.typeReference
+                return expression?.typeArguments?.singleOrNull()?.typeReference
             }
 
             override fun visitCallExpression(node: UCallExpression) {
@@ -170,6 +183,9 @@
         context: JavaContext,
         node: UCallExpression
     ) {
+        // ignore generic types
+        if (node.isGenericTypeDefinition()) return
+
         if (liveDataType.typeElement !is KtNullableType) {
             val fixes = mutableListOf<LintFix>()
             if (context.getLocation(liveDataType).file == context.file) {
@@ -198,6 +214,12 @@
         }
     }
 
+    private fun UCallExpression.isGenericTypeDefinition(): Boolean {
+        val classType = typeArguments.singleOrNull() as? PsiImmediateClassType
+        val resolveGenerics = classType?.resolveGenerics()
+        return resolveGenerics?.element is KtLightTypeParameter
+    }
+
     /**
      * Reports a lint error at [element]'s location with message and quick fixes.
      *
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt b/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..0cdb8ac
--- /dev/null
+++ b/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.lifecycle.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = LiveDataCoreIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetectorTest.kt b/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetectorTest.kt
index 095d9f6..591e6a9 100644
--- a/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetectorTest.kt
+++ b/lifecycle/lifecycle-livedata-core-ktx-lint/src/test/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetectorTest.kt
@@ -199,23 +199,28 @@
                 import androidx.lifecycle.MutableLiveData
 
                 val liveDataField = MutableLiveData<Boolean>()
-                val secondLiveDataField = MutableLiveData<String>()
+                val secondLiveDataField: MutableLiveData<String> = MutableLiveData()
+                val thirdLiveDataField: MutableLiveData<String> = MutableLiveData<String>("Value")
 
                 fun foo() {
                     liveDataField.value = null
                     secondLiveDataField.value = null
+                    thirdLiveDataField.value = null
                 }
             """
             ).indented()
         ).expect(
             """
-src/com/example/test.kt:9: Error: Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]
+src/com/example/test.kt:10: Error: Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]
     liveDataField.value = null
                           ~~~~
-src/com/example/test.kt:10: Error: Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]
+src/com/example/test.kt:11: Error: Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]
     secondLiveDataField.value = null
                                 ~~~~
-2 errors, 0 warnings
+src/com/example/test.kt:12: Error: Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]
+    thirdLiveDataField.value = null
+                               ~~~~
+3 errors, 0 warnings
         """
         )
     }
@@ -760,4 +765,39 @@
             ).indented()
         ).expectClean()
     }
+
+    @Test
+    fun justKotlinObject() {
+        check(
+            kotlin(
+                """
+                package com.example
+
+                object Foo
+            """
+            ).indented()
+        ).expectClean()
+    }
+
+    @Test
+    fun genericParameterDefinition() {
+        check(
+            kotlin(
+                """
+                package com.example
+
+                import androidx.lifecycle.MutableLiveData
+
+                class Foo<T>(
+                    var target: MutableLiveData<T>
+                ) {
+
+                    fun foo(value: T) {
+                        target.value = null
+                    }
+                }
+            """
+            ).indented()
+        ).expectClean()
+    }
 }
diff --git a/lifecycle/lifecycle-livedata-core-ktx/lint-baseline.xml b/lifecycle/lifecycle-livedata-core-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-livedata-core-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-livedata-core-truth/lint-baseline.xml b/lifecycle/lifecycle-livedata-core-truth/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-livedata-core-truth/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
index c600181..e61b4ac 100644
--- a/lifecycle/lifecycle-livedata-core/build.gradle
+++ b/lifecycle/lifecycle-livedata-core/build.gradle
@@ -25,13 +25,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     implementation("androidx.arch.core:core-common:2.1.0")
     implementation("androidx.arch.core:core-runtime:2.1.0")
diff --git a/lifecycle/lifecycle-livedata-core/lint-baseline.xml b/lifecycle/lifecycle-livedata-core/lint-baseline.xml
index ec327ee..bb15a72 100644
--- a/lifecycle/lifecycle-livedata-core/lint-baseline.xml
+++ b/lifecycle/lifecycle-livedata-core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/lifecycle/lifecycle-livedata-ktx/lint-baseline.xml b/lifecycle/lifecycle-livedata-ktx/lint-baseline.xml
index 5d56a7d..272a7ee 100644
--- a/lifecycle/lifecycle-livedata-ktx/lint-baseline.xml
+++ b/lifecycle/lifecycle-livedata-ktx/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.lifecycle.CoroutineLiveDataKt is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.lifecycle.CoroutineLiveDataKt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="): LiveData&lt;T> = CoroutineLiveData(context, timeout.toMillis(), block)"
         errorLine2="                                                    ~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.lifecycle.FlowLiveDataConversions is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.lifecycle.FlowLiveDataConversions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="): LiveData&lt;T> = asLiveData(context, timeout.toMillis())"
         errorLine2="                                             ~~~~~~~~">
         <location
diff --git a/lifecycle/lifecycle-livedata/lint-baseline.xml b/lifecycle/lifecycle-livedata/lint-baseline.xml
index bebba2a..fcdbfa4 100644
--- a/lifecycle/lifecycle-livedata/lint-baseline.xml
+++ b/lifecycle/lifecycle-livedata/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/lifecycle/lifecycle-process/lint-baseline.xml b/lifecycle/lifecycle-process/lint-baseline.xml
index da96649..aedb5b1 100644
--- a/lifecycle/lifecycle-process/lint-baseline.xml
+++ b/lifecycle/lifecycle-process/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class null is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                activity.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/lint-baseline.xml b/lifecycle/lifecycle-reactivestreams-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-reactivestreams-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-reactivestreams/lint-baseline.xml b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
index ad89376..42a29d7 100644
--- a/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
+++ b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/lifecycle/lifecycle-runtime-ktx-lint/lint-baseline.xml b/lifecycle/lifecycle-runtime-ktx-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lifecycle/lifecycle-runtime-ktx-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-runtime-ktx/lint-baseline.xml b/lifecycle/lifecycle-runtime-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-runtime-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-runtime-testing/lint-baseline.xml b/lifecycle/lifecycle-runtime-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-runtime-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index 3ee8d69..a053e6d 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -10,10 +10,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
diff --git a/lifecycle/lifecycle-runtime/lint-baseline.xml b/lifecycle/lifecycle-runtime/lint-baseline.xml
index 703c323..da31c8e 100644
--- a/lifecycle/lifecycle-runtime/lint-baseline.xml
+++ b/lifecycle/lifecycle-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/lifecycle/lifecycle-service/lint-baseline.xml b/lifecycle/lifecycle-service/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-viewmodel-ktx/lint-baseline.xml b/lifecycle/lifecycle-viewmodel-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-viewmodel-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
index d82c192d..caf0f82 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
+++ b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="LambdaLast"
diff --git a/lifecycle/lifecycle-viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
index d91105d..fb1af37 100644
--- a/lifecycle/lifecycle-viewmodel/build.gradle
+++ b/lifecycle/lifecycle-viewmodel/build.gradle
@@ -27,10 +27,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
diff --git a/lifecycle/lifecycle-viewmodel/lint-baseline.xml b/lifecycle/lifecycle-viewmodel/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/lifecycle/lifecycle-viewmodel/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/lifecycle/settings.gradle b/lifecycle/settings.gradle
index 4ae5e5a..16a755f 100644
--- a/lifecycle/settings.gradle
+++ b/lifecycle/settings.gradle
@@ -20,7 +20,6 @@
 setupPlayground(this, "..")
 selectProjectsFromAndroidX({ name ->
     if (name.startsWith(":lifecycle")) return true
-    if (name == ":activity:activity-compose") return true
     if (name == ":annotation:annotation") return true
     if (name == ":internal-testutils-runtime") return true
     if (name == ":internal-testutils-truth") return true
diff --git a/lint-checks/integration-tests/build.gradle b/lint-checks/integration-tests/build.gradle
index a01e2e6..c7f4c61 100644
--- a/lint-checks/integration-tests/build.gradle
+++ b/lint-checks/integration-tests/build.gradle
@@ -14,9 +14,6 @@
  * limitations under the License.
  */
 
-import androidx.build.BuildOnServerKt
-import androidx.build.dependencyTracker.AffectedModuleDetector
-import androidx.build.uptodatedness.EnableCachingKt
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 import static androidx.build.dependencies.DependenciesKt.KOTLIN_STDLIB
@@ -82,28 +79,3 @@
         }
     }
 }
-
-def lintOutputFile = project.file("${buildDir}/reports/lint-results-debug.xml")
-def lintOutputFileNormalized = project.file("${buildDir}/lint-results-normalized/lint-results-debug.xml.normalized")
-
-def normalizeLintOutput = tasks.register("normalizeLintOutput", Copy) {
-    def supportRootFolder = project.rootProject.ext.supportRootFolder
-    from(lintOutputFile) {
-        filter { line ->
-            return line.replace(supportRootFolder.getAbsolutePath(), "\$SUPPORT")
-        }
-    }
-    into(lintOutputFileNormalized.parentFile)
-    rename(".*", lintOutputFileNormalized.name)
-    dependsOn("lintDebug")
-}
-
-def validateLint = tasks.register("validateLint", CompareFilesTask) { task ->
-    task.actualFile = lintOutputFileNormalized
-    task.expectedFile = project.file("expected-lint-results.xml")
-    EnableCachingKt.cacheEvenIfNoOutputs(task)
-    dependsOn(normalizeLintOutput)
-    AffectedModuleDetector.configureTaskGuard(task)
-}
-
-BuildOnServerKt.addToBuildOnServer(project, validateLint)
diff --git a/lint-checks/integration-tests/expected-lint-results.xml b/lint-checks/integration-tests/expected-lint-results.xml
index 8333531..698b8cd 100644
--- a/lint-checks/integration-tests/expected-lint-results.xml
+++ b/lint-checks/integration-tests/expected-lint-results.xml
@@ -18,6 +18,166 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 30; however, the containing class androidx.AutofixUnsafeConstructorReferenceJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            AccessibilityNodeInfo node = new AccessibilityNodeInfo(new View(context), 1);"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeConstructorReferenceJava.java"
+            line="35"
+            column="42"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 23; however, the containing class androidx.AutofixUnsafeGenericMethodReferenceJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            return context.getSystemService(serviceClass);"
+        errorLine2="                           ~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeGenericMethodReferenceJava.java"
+            line="34"
+            column="28"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 21; however, the containing class androidx.AutofixUnsafeReferenceWithExistingClassJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            view.setBackgroundTintList(new ColorStateList(null, null));"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeReferenceWithExistingClassJava.java"
+            line="36"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 17; however, the containing class androidx.AutofixUnsafeStaticMethodReferenceJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            return View.generateViewId();"
+        errorLine2="                        ~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java"
+            line="33"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 21; however, the containing class androidx.AutofixUnsafeVoidMethodReferenceJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            view.setBackgroundTintList(new ColorStateList(null, null));"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeVoidMethodReferenceJava.java"
+            line="34"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 21; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            view.setBackgroundTintList(tint);"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java"
+            line="38"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 17; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            return View.generateViewId();"
+        errorLine2="                        ~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java"
+            line="47"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 23; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="        return view.getAccessibilityClassName();"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java"
+            line="58"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            listView.scrollListBy(y);"
+        errorLine2="                     ~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/core/widget/ListViewCompat.java"
+            line="39"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        severity="Error"
+        message="This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification."
+        category="Correctness"
+        priority="5"
+        summary="Even in cases where references to new APIs are gated on SDK_INT checks, run-time class verification will still fail on references to APIs that may not be available at run time, including platform APIs introduced after a library&apos;s minSdkVersion."
+        explanation="The Java language requires a virtual machine to verify the class files it&#xA;loads and executes. A class may fail verification for a wide variety of&#xA;reasons, but in practice it‘s usually because the class’s code refers to&#xA;unknown classes or methods.&#xA;&#xA;References to APIs added after a library&apos;s minSdkVersion -- regardless of&#xA;any surrounding version checks -- will fail run-time class verification if&#xA;the API does not exist on the device, leading to reduced run-time&#xA;performance.&#xA;&#xA;Gating references on SDK checks alone DOES NOT address class verification&#xA;failures.&#xA;&#xA;To prevent class verification failures, references to new APIs must be&#xA;moved to inner classes that are only initialized inside of an appropriate&#xA;SDK check.&#xA;&#xA;For example, if our minimum SDK is 14 and platform method a.x(params...)&#xA;was added in SDK 16, the method call must be moved to an inner class like:&#xA;&#xA;@RequiresApi(16)&#xA;private static class Api16Impl{&#xA;  @DoNotInline&#xA;  static void callX(params...) {&#xA;    a.x(params...);&#xA;  }&#xA;}&#xA;&#xA;The call site is changed from a.x(params...) to Api16Impl.callX(params).&#xA;&#xA;Since ART will only try to optimize Api16Impl when it&apos;s on the execution&#xA;path, we are guaranteed to have a.x(...) available.&#xA;&#xA;In addition, optimizers like R8 or Proguard may inline the method in the&#xA;separate class and replace the wrapper call with the actual call, so you&#xA;must disable inlining using the @DoNotInline annotation.&#xA;&#xA;Failure to do the above may result in overall performance degradation."
+        errorLine1="            return listView.canScrollList(direction);"
+        errorLine2="                            ~~~~~~~~~~~~~">
+        <location
+            file="$SUPPORT/lint-checks/integration-tests/src/main/java/androidx/core/widget/ListViewCompat.java"
+            line="69"
+            column="29"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         severity="Fatal"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeConstructorReferenceJava.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeConstructorReferenceJava.java
new file mode 100644
index 0000000..6aac186
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeConstructorReferenceJava.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;
+
+import android.content.Context;
+import android.os.Build;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Test class containing unsafe method references.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeConstructorReferenceJava {
+
+    /**
+     * Unsafe reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    void unsafeReferenceWithSdkCheck(Context context) {
+        if (Build.VERSION.SDK_INT >= 30) {
+            AccessibilityNodeInfo node = new AccessibilityNodeInfo(new View(context), 1);
+        }
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeGenericMethodReferenceJava.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeGenericMethodReferenceJava.java
new file mode 100644
index 0000000..5628007
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeGenericMethodReferenceJava.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;
+
+import android.content.Context;
+import android.os.Build;
+
+/**
+ * Test class containing unsafe method references.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeGenericMethodReferenceJava {
+
+    /**
+     * Unsafe reference to a generically-typed method with an SDK_INT check that satisfies the
+     * NewApi lint.
+     */
+    <T> T getSystemService(Context context, Class<T> serviceClass) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return context.getSystemService(serviceClass);
+        }
+        return null;
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeReferenceWithExistingClassJava.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeReferenceWithExistingClassJava.java
new file mode 100644
index 0000000..eca9596
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeReferenceWithExistingClassJava.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx;
+
+import android.content.res.ColorStateList;
+import android.os.Build;
+import android.view.View;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Test class containing unsafe method references.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeReferenceWithExistingClassJava {
+
+    /**
+     * Unsafe reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    void unsafeReferenceWithSdkCheck(View view) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            view.setBackgroundTintList(new ColorStateList(null, null));
+        }
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java
new file mode 100644
index 0000000..4aec0ab
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeStaticMethodReferenceJava.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx;
+
+import android.os.Build;
+import android.view.View;
+
+/**
+ * Test class containing unsafe method references.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeStaticMethodReferenceJava {
+
+    /**
+     * Unsafe reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    int unsafeReferenceWithSdkCheck() {
+        if (Build.VERSION.SDK_INT >= 17) {
+            return View.generateViewId();
+        }
+        return -1;
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeVoidMethodReferenceJava.java b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeVoidMethodReferenceJava.java
new file mode 100644
index 0000000..ec43f28
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/AutofixUnsafeVoidMethodReferenceJava.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx;
+
+import android.content.res.ColorStateList;
+import android.os.Build;
+import android.view.View;
+
+/**
+ * Test class containing unsafe method references.
+ */
+@SuppressWarnings("unused")
+public class AutofixUnsafeVoidMethodReferenceJava {
+
+    /**
+     * Unsafe reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    void unsafeReferenceWithSdkCheck(View view) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            view.setBackgroundTintList(new ColorStateList(null, null));
+        }
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java b/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java
new file mode 100644
index 0000000..e0cea96
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/ClassVerificationFailureFromJava.java
@@ -0,0 +1,83 @@
+/*
+ * 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 android.annotation.SuppressLint;
+import android.content.res.ColorStateList;
+import android.os.Build;
+import android.view.View;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Test class containing class verification failure scenarios.
+ */
+@SuppressWarnings("unused")
+public class ClassVerificationFailureFromJava {
+
+    /**
+     * Unsafe reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    void unsafeReferenceWithSdkCheck(View view) {
+        if (Build.VERSION.SDK_INT > 23) {
+            ColorStateList tint = new ColorStateList(null, null);
+            view.setBackgroundTintList(tint);
+        }
+    }
+
+    /**
+     * Unsafe static reference to a new API with an SDK_INT check that satisfies the NewApi lint.
+     */
+    int unsafeStaticReferenceWithSdkCheck() {
+        if (Build.VERSION.SDK_INT >= 17) {
+            return View.generateViewId();
+        } else {
+            return -1;
+        }
+    }
+
+    /**
+     * Unsafe reference to a new API whose auto-fix collides with the existing Api28Impl class.
+     */
+    @SuppressLint("NewApi")
+    CharSequence unsafeReferenceWithAutoFixCollision(View view) {
+        return view.getAccessibilityClassName();
+    }
+
+    /**
+     * Safe reference to a new API on a static inner class.
+     */
+    CharSequence safeGetAccessibilityPaneTitle(View view) {
+        if (Build.VERSION.SDK_INT >= 28) {
+            return Api28Impl.getAccessibilityPaneTitle(view);
+        } else {
+            return null;
+        }
+    }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+
+        private Api28Impl() {
+            // Not instantiable.
+        }
+
+        public static CharSequence getAccessibilityPaneTitle(View view) {
+            return view.getAccessibilityPaneTitle();
+        }
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/core/widget/ListViewCompat.java b/lint-checks/integration-tests/src/main/java/androidx/core/widget/ListViewCompat.java
new file mode 100644
index 0000000..1d51e41
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/core/widget/ListViewCompat.java
@@ -0,0 +1,91 @@
+/*
+ * 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.core.widget;
+
+import android.os.Build;
+import android.view.View;
+import android.widget.ListView;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Helper for accessing features in {@link ListView}
+ */
+public class ListViewCompat {
+
+    /**
+     * Scrolls the list items within the view by a specified number of pixels.
+     *
+     * @param listView the list to scroll
+     * @param y the amount of pixels to scroll by vertically
+     */
+    public static void scrollListBy(@NonNull ListView listView, int y) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            // Call the framework version directly
+            listView.scrollListBy(y);
+        } else {
+            // provide backport on earlier versions
+            final int firstPosition = listView.getFirstVisiblePosition();
+            if (firstPosition == ListView.INVALID_POSITION) {
+                return;
+            }
+
+            final View firstView = listView.getChildAt(0);
+            if (firstView == null) {
+                return;
+            }
+
+            final int newTop = firstView.getTop() - y;
+            listView.setSelectionFromTop(firstPosition, newTop);
+        }
+    }
+
+    /**
+     * Check if the items in the list can be scrolled in a certain direction.
+     *
+     * @param direction Negative to check scrolling up, positive to check
+     *            scrolling down.
+     * @return true if the list can be scrolled in the specified direction,
+     *         false otherwise.
+     * @see #scrollListBy(ListView, int)
+     */
+    public static boolean canScrollList(@NonNull ListView listView, int direction) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            // Call the framework version directly
+            return listView.canScrollList(direction);
+        } else {
+            // provide backport on earlier versions
+            final int childCount = listView.getChildCount();
+            if (childCount == 0) {
+                return false;
+            }
+
+            final int firstPosition = listView.getFirstVisiblePosition();
+            if (direction > 0) {
+                final int lastBottom = listView.getChildAt(childCount - 1).getBottom();
+                final int lastPosition = firstPosition + childCount;
+                return lastPosition < listView.getCount()
+                        || (lastBottom > listView.getHeight() - listView.getListPaddingBottom());
+            } else {
+                final int firstTop = listView.getChildAt(0).getTop();
+                return firstPosition > 0 || firstTop < listView.getListPaddingTop();
+            }
+        }
+    }
+
+    private ListViewCompat() {}
+}
diff --git a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
index e14a4da..b1d652f 100644
--- a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.IssueRegistry
@@ -49,7 +51,7 @@
                 BanSynchronizedMethods.ISSUE,
                 MetadataTagInsideApplicationTagDetector.ISSUE,
                 PrivateConstructorForUtilityClass.ISSUE,
-                UnsafeNewApiCallsDetector.ISSUE
+                ClassVerificationFailureDetector.ISSUE
             )
         }
     }
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanConcurrentHashMap.kt b/lint-checks/src/main/java/androidx/build/lint/BanConcurrentHashMap.kt
index 43be736..7aa81c8 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanConcurrentHashMap.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanConcurrentHashMap.kt
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.UElementHandler
@@ -33,7 +35,7 @@
 
 class BanConcurrentHashMap : Detector(), Detector.UastScanner {
 
-    override fun getApplicableUastTypes(): List<Class<out UElement>>? = listOf(
+    override fun getApplicableUastTypes(): List<Class<out UElement>> = listOf(
         UImportStatement::class.java,
         UQualifiedReferenceExpression::class.java
     )
@@ -45,7 +47,7 @@
         override fun visitQualifiedReferenceExpression(node: UQualifiedReferenceExpression) {
             if (node.selector is USimpleNameReferenceExpression) {
                 val name = node.selector as USimpleNameReferenceExpression
-                if (CONCURRENT_HASHMAP.equals(name.identifier)) {
+                if (CONCURRENT_HASHMAP == name.identifier) {
                     context.report(
                         ISSUE, node, context.getLocation(node),
                         "Detected " +
@@ -64,8 +66,8 @@
                 } else if (resolved is PsiMethod) {
                     resolved = resolved.containingClass
                 }
-                if (resolved is PsiClass && CONCURRENT_HASHMAP_QUALIFIED_NAME
-                    .equals(resolved.qualifiedName)
+                if (resolved is PsiClass &&
+                    CONCURRENT_HASHMAP_QUALIFIED_NAME == resolved.qualifiedName
                 ) {
                     context.report(
                         ISSUE, node, context.getLocation(node),
@@ -89,7 +91,7 @@
                 Scope.JAVA_FILE_SCOPE
             )
         )
-        val CONCURRENT_HASHMAP_QUALIFIED_NAME = "java.util.concurrent.ConcurrentHashMap"
-        val CONCURRENT_HASHMAP = "ConcurrentHashMap"
+        const val CONCURRENT_HASHMAP_QUALIFIED_NAME = "java.util.concurrent.ConcurrentHashMap"
+        const val CONCURRENT_HASHMAP = "ConcurrentHashMap"
     }
 }
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanKeepAnnotation.kt b/lint-checks/src/main/java/androidx/build/lint/BanKeepAnnotation.kt
index 942c565..c2e6106 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanKeepAnnotation.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanKeepAnnotation.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.UElementHandler
@@ -31,7 +33,7 @@
 
     override fun getApplicableUastTypes() = listOf(UAnnotation::class.java)
 
-    override fun createUastHandler(context: JavaContext): UElementHandler? {
+    override fun createUastHandler(context: JavaContext): UElementHandler {
         return AnnotationChecker(context)
     }
 
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanParcelableUsage.kt b/lint-checks/src/main/java/androidx/build/lint/BanParcelableUsage.kt
index 9a465a0..08586eb 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanParcelableUsage.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanParcelableUsage.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.detector.api.Category
@@ -28,12 +30,12 @@
 import org.jetbrains.uast.UClass
 import java.util.Collections
 
-const val PARCELABLE_INTERFACE_CANNONICAL_NAME = "android.os.Parcelable"
+const val PARCELABLE_INTERFACE_CANONICAL_NAME = "android.os.Parcelable"
 
 class BanParcelableUsage : Detector(), Detector.UastScanner {
 
     override fun applicableSuperClasses(): List<String>? {
-        return Collections.singletonList(PARCELABLE_INTERFACE_CANNONICAL_NAME)
+        return Collections.singletonList(PARCELABLE_INTERFACE_CANONICAL_NAME)
     }
 
     override fun visitClass(context: JavaContext, declaration: UClass) {
@@ -46,7 +48,7 @@
         // For now only find classes that directly implement Parcelable, because
         // lint will also examine the entire inheritance and implementation chain.
         for (superclass in declaration.uastSuperTypes) {
-            if (superclass.type.canonicalText == PARCELABLE_INTERFACE_CANNONICAL_NAME) {
+            if (superclass.type.canonicalText == PARCELABLE_INTERFACE_CANONICAL_NAME) {
                 context.report(
                     ISSUE, declaration, context.getNameLocation(declaration),
                     "Class implements android.os.Parcelable"
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanSynchronizedMethods.kt b/lint-checks/src/main/java/androidx/build/lint/BanSynchronizedMethods.kt
index eb9e0e7..e1755ef1 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanSynchronizedMethods.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanSynchronizedMethods.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.UElementHandler
@@ -35,7 +37,7 @@
         override fun visitMethod(node: UMethod) {
             if (node.hasModifier(JvmModifier.SYNCHRONIZED)) {
                 context.report(
-                    BanSynchronizedMethods.ISSUE, node,
+                    ISSUE, node,
                     context.getLocation(node),
                     "Use of synchronized methods is not recommended",
                     null
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanTargetApiAnnotation.kt b/lint-checks/src/main/java/androidx/build/lint/BanTargetApiAnnotation.kt
index adc9efd..b6e8e0b 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanTargetApiAnnotation.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanTargetApiAnnotation.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.UElementHandler
@@ -31,7 +33,7 @@
 
     override fun getApplicableUastTypes() = listOf(UAnnotation::class.java)
 
-    override fun createUastHandler(context: JavaContext): UElementHandler? {
+    override fun createUastHandler(context: JavaContext): UElementHandler {
         return AnnotationChecker(context)
     }
 
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt b/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt
index 33c2ea5..fe42226 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanUncheckedReflection.kt
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 import com.android.tools.lint.detector.api.Category
 import com.android.tools.lint.detector.api.Detector
diff --git a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
new file mode 100644
index 0000000..305e3af
--- /dev/null
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -0,0 +1,776 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.build.lint
+
+import com.android.SdkConstants.ATTR_VALUE
+import com.android.SdkConstants.DOT_JAVA
+import com.android.tools.lint.checks.ApiDetector.Companion.REQUIRES_API_ANNOTATION
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.checks.ApiLookup
+import com.android.tools.lint.checks.ApiLookup.equivalentName
+import com.android.tools.lint.checks.ApiLookup.startsWithEquivalentPrefix
+import com.android.tools.lint.checks.VersionChecks.Companion.codeNameToApi
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Context
+import com.android.tools.lint.detector.api.Desugaring
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.LintFix
+import com.android.tools.lint.detector.api.Location
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.UastLintUtils.Companion.getLongAttribute
+import com.android.tools.lint.detector.api.getInternalMethodName
+import com.android.tools.lint.detector.api.isKotlin
+import com.intellij.psi.PsiAnonymousClass
+import com.intellij.psi.PsiClass
+import com.intellij.psi.PsiClassType
+import com.intellij.psi.PsiCompiledElement
+import com.intellij.psi.PsiMethod
+import com.intellij.psi.PsiModifierListOwner
+import com.intellij.psi.PsiSuperExpression
+import com.intellij.psi.PsiType
+import com.intellij.psi.util.PsiTreeUtil
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UExpression
+import org.jetbrains.uast.UInstanceExpression
+import org.jetbrains.uast.USuperExpression
+import org.jetbrains.uast.UThisExpression
+import org.jetbrains.uast.getContainingUClass
+import org.jetbrains.uast.getContainingUMethod
+import org.jetbrains.uast.java.JavaUAnnotation
+import org.jetbrains.uast.java.JavaUSimpleNameReferenceExpression
+import org.jetbrains.uast.util.isConstructorCall
+import org.jetbrains.uast.util.isMethodCall
+
+/**
+ * This check detects references to platform APIs that are likely to cause class verification
+ * failures.
+ * <p>
+ * Specifically, this check looks for references to APIs that were added prior to the library's
+ * minSdkVersion and therefore may not exist on the run-time classpath. If the class verifier
+ * detects such a reference, e.g. while verifying a class containing the reference, it will abort
+ * verification. This will prevent the class from being optimized, resulting in potentially severe
+ * performance losses.
+ * <p>
+ * See Chromium's excellent guide to Class Verification Failures for more information:
+ * https://chromium.googlesource.com/chromium/src/+/HEAD/build/android/docs/class_verification_failures.md
+ */
+class ClassVerificationFailureDetector : Detector(), SourceCodeScanner {
+    private var apiDatabase: ApiLookup? = null
+
+    override fun beforeCheckEachProject(context: Context) {
+        apiDatabase = ApiLookup.get(context.client, context.project.buildTarget)
+    }
+
+    override fun afterCheckEachProject(context: Context) {
+        apiDatabase = null
+    }
+
+    override fun createUastHandler(context: JavaContext): UElementHandler? {
+        if (apiDatabase == null) {
+            return null
+        }
+        return ApiVisitor(context)
+    }
+
+    override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
+
+    // Consider making this a top class and pass in apiDatabase explicitly.
+    private inner class ApiVisitor(private val context: JavaContext) : UElementHandler() {
+        override fun visitCallExpression(node: UCallExpression) {
+            val method = node.resolve()
+            if (method != null) {
+                visitCall(method, node, node)
+            }
+        }
+
+        private fun visitCall(
+            method: PsiMethod,
+            call: UCallExpression?,
+            reference: UElement
+        ) {
+            if (call == null) {
+                return
+            }
+            val apiDatabase = apiDatabase ?: return
+            val containingClass = method.containingClass ?: return
+            val evaluator = context.evaluator
+            val owner = evaluator.getQualifiedName(containingClass)
+                ?: return // Couldn't resolve type
+            if (!apiDatabase.containsClass(owner)) {
+                return
+            }
+            val name = getInternalMethodName(method)
+            val desc = evaluator.getMethodDescription(
+                method,
+                false,
+                false
+            ) // Couldn't compute description of method for some reason; probably
+                // failure to resolve parameter types
+                ?: return
+            var api = apiDatabase.getMethodVersion(owner, name, desc)
+            if (api == NO_API_REQUIREMENT) {
+                return
+            }
+            if (api <= context.project.minSdk) {
+                return
+            }
+            if (call.isMethodCall()) {
+                val qualifier = call.receiver
+                if (qualifier != null &&
+                    qualifier !is UThisExpression &&
+                    qualifier !is PsiSuperExpression
+                ) {
+                    val receiverType = qualifier.getExpressionType()
+                    if (receiverType is PsiClassType) {
+                        val containingType = context.evaluator.getClassType(containingClass)
+                        val inheritanceChain =
+                            getInheritanceChain(receiverType, containingType)
+                        if (inheritanceChain != null) {
+                            for (type in inheritanceChain) {
+                                val expressionOwner = evaluator.getQualifiedName(type)
+                                if (expressionOwner != null && expressionOwner != owner) {
+                                    val specificApi = apiDatabase.getMethodVersion(
+                                        expressionOwner, name, desc
+                                    )
+                                    if (specificApi == NO_API_REQUIREMENT) {
+                                        if (apiDatabase.isRelevantOwner(expressionOwner)) {
+                                            return
+                                        }
+                                    } else if (specificApi <= context.project.minSdk) {
+                                        return
+                                    } else {
+                                        // For example, for Bundle#getString(String,String) the
+                                        // API level is 12, whereas for BaseBundle#getString
+                                        // (String,String) the API level is 21. If the code
+                                        // specified a Bundle instead of a BaseBundle, reported
+                                        // the Bundle level in the error message instead.
+                                        if (specificApi < api) {
+                                            api = specificApi
+                                        }
+                                        api = Math.min(specificApi, api)
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    // Unqualified call; need to search in our super hierarchy
+                    // Unfortunately, expression.getReceiverType() does not work correctly
+                    // in Java; it returns the type of the static binding of the call
+                    // instead of giving the virtual dispatch type, as described in
+                    // https://issuetracker.google.com/64528052 (and covered by
+                    // for example ApiDetectorTest#testListView). Therefore, we continue
+                    // to use the workaround method for Java (which isn't correct, and is
+                    // particularly broken in Kotlin where the dispatch needs to take into
+                    // account top level functions and extension methods), and then we use
+                    // the correct receiver type in Kotlin.
+                    var cls: PsiClass? = null
+                    if (context.file.path.endsWith(DOT_JAVA)) {
+                        cls = call.getContainingUClass()?.javaPsi
+                    } else {
+                        val receiverType = call.receiverType
+                        if (receiverType is PsiClassType) {
+                            cls = receiverType.resolve()
+                        }
+                    }
+                    if (qualifier is UThisExpression || qualifier is USuperExpression) {
+                        val pte = qualifier as UInstanceExpression
+                        val resolved = pte.resolve()
+                        if (resolved is PsiClass) {
+                            cls = resolved
+                        }
+                    }
+                    while (cls != null) {
+                        if (cls is PsiAnonymousClass) {
+                            // If it's an unqualified call in an anonymous class, we need to
+                            // rely on the resolve method to find out whether the method is
+                            // picked up from the anonymous class chain or any outer classes
+                            var found = false
+                            val anonymousBaseType = cls.baseClassType
+                            val anonymousBase = anonymousBaseType.resolve()
+                            if (anonymousBase != null && anonymousBase.isInheritor(
+                                    containingClass,
+                                    true
+                                )
+                            ) {
+                                cls = anonymousBase
+                                found = true
+                            } else {
+                                val surroundingBaseType =
+                                    PsiTreeUtil.getParentOfType(cls, PsiClass::class.java, true)
+                                if (surroundingBaseType != null && surroundingBaseType.isInheritor(
+                                        containingClass,
+                                        true
+                                    )
+                                ) {
+                                    cls = surroundingBaseType
+                                    found = true
+                                }
+                            }
+                            if (!found) {
+                                break
+                            }
+                        }
+                        val expressionOwner = evaluator.getQualifiedName(cls)
+                        if (expressionOwner == null || equivalentName(
+                                expressionOwner,
+                                "java/lang/Object"
+                            )
+                        ) {
+                            break
+                        }
+                        val specificApi =
+                            apiDatabase.getMethodVersion(expressionOwner, name, desc)
+                        if (specificApi == NO_API_REQUIREMENT) {
+                            if (apiDatabase.isRelevantOwner(expressionOwner)) {
+                                break
+                            }
+                        } else if (specificApi <= context.project.minSdk) {
+                            return
+                        } else {
+                            if (specificApi < api) {
+                                api = specificApi
+                            }
+                            api = Math.min(specificApi, api)
+                            break
+                        }
+                        cls = cls.superClass
+                    }
+                }
+            }
+            if (call.isMethodCall()) {
+                val receiver = call.receiver
+                var target: PsiClass? = null
+                if (!method.isConstructor) {
+                    if (receiver != null) {
+                        val type = receiver.getExpressionType()
+                        if (type is PsiClassType) {
+                            target = type.resolve()
+                        }
+                    } else {
+                        target = call.getContainingUClass()?.javaPsi
+                    }
+                }
+                // Look to see if there's a possible local receiver
+                if (target != null) {
+                    val methods = target.findMethodsBySignature(method, true)
+                    if (methods.size > 1) {
+                        for (m in methods) {
+                            if (!method.isEquivalentTo(m)) {
+                                val provider = m.containingClass
+                                if (provider != null) {
+                                    val methodOwner = evaluator.getQualifiedName(provider)
+                                    if (methodOwner != null) {
+                                        val methodApi = apiDatabase.getMethodVersion(
+                                            methodOwner, name, desc
+                                        )
+                                        if (methodApi == NO_API_REQUIREMENT ||
+                                            methodApi <= context.project.minSdk
+                                        ) {
+                                            // Yes, we found another call that doesn't have an
+                                            // API requirement
+                                            return
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                // If you're simply calling super.X from method X, even if method X is in a higher
+                // API level than the minSdk, we're generally safe; that method should only be
+                // called by the framework on the right API levels. (There is a danger of somebody
+                // calling that method locally in other contexts, but this is hopefully unlikely.)
+                if (receiver is USuperExpression) {
+                    val containingMethod = call.getContainingUMethod()?.javaPsi
+                    if (containingMethod != null &&
+                        name == containingMethod.name &&
+                        evaluator.areSignaturesEqual(method, containingMethod) &&
+                        // We specifically exclude constructors from this check, because we
+                        // do want to flag constructors requiring the new API level; it's
+                        // highly likely that the constructor is called by local code so
+                        // you should specifically investigate this as a developer
+                        !method.isConstructor
+                    ) {
+                        return
+                    }
+                }
+                // If it's a method we have source for, obviously it shouldn't be a
+                // violation, happens in androidx (appcompat?)
+                if (method !is PsiCompiledElement) {
+                    return
+                }
+            }
+            // Desugar rewrites compare calls (see b/36390874)
+            if (name == "compare" &&
+                api == 19 &&
+                startsWithEquivalentPrefix(owner, "java/lang/") &&
+                desc.length == 4 &&
+                context.project.isDesugaring(Desugaring.LONG_COMPARE) &&
+                (
+                    desc == "(JJ)" ||
+                        desc == "(ZZ)" ||
+                        desc == "(BB)" ||
+                        desc == "(CC)" ||
+                        desc == "(II)" ||
+                        desc == "(SS)"
+                    )
+            ) {
+                return
+            }
+            // Desugar rewrites Objects.requireNonNull calls (see b/32446315)
+            if (name == "requireNonNull" &&
+                api == 19 &&
+                owner == "java.util.Objects" &&
+                desc == "(Ljava.lang.Object;)" &&
+                context.project.isDesugaring(Desugaring.OBJECTS_REQUIRE_NON_NULL)
+            ) {
+                return
+            }
+            if (name == "addSuppressed" &&
+                api == 19 &&
+                owner == "java.lang.Throwable" &&
+                desc == "(Ljava.lang.Throwable;)" &&
+                context.project.isDesugaring(Desugaring.TRY_WITH_RESOURCES)
+            ) {
+                return
+            }
+            val nameIdentifier = call.methodIdentifier
+            val location = if (call.isConstructorCall() &&
+                call.classReference != null
+            ) {
+                context.getRangeLocation(call, 0, call.classReference!!, 0)
+            } else if (nameIdentifier != null) {
+                context.getLocation(nameIdentifier)
+            } else {
+                context.getLocation(reference)
+            }
+            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,
+                )
+            }
+        }
+
+        /**
+         * Attempts to create a [LintFix] for the call to specified method.
+         *
+         * @return a lint fix, or `null` if no fix could be created
+         */
+        private fun createLintFix(
+            method: PsiMethod,
+            call: UCallExpression,
+            api: Int
+        ): LintFix? {
+            if (isKotlin(call.sourcePsi)) {
+                // We only support Java right now.
+                return null
+            }
+
+            // The host class should never be null if we're looking at Java code.
+            val callContainingClass = call.getContainingUClass() ?: return null
+
+            val (wrapperMethodName, methodForInsertion) = generateWrapperMethod(
+                method
+            ) ?: return null
+
+            val (wrapperClassName, insertionPoint, insertionSource) = generateInsertionSource(
+                api,
+                callContainingClass,
+                methodForInsertion
+            )
+
+            val replacementCall = generateWrapperCall(
+                method,
+                call.receiver,
+                call.valueArguments,
+                wrapperClassName,
+                wrapperMethodName
+            ) ?: return null
+
+            return fix().name("Extract to static inner class")
+                .composite(
+                    fix()
+                        .replace()
+                        .range(insertionPoint)
+                        .beginning()
+                        .with(insertionSource)
+                        .reformat(true)
+                        .shortenNames()
+                        .build(),
+                    fix()
+                        .replace()
+                        .range(context.getLocation(call))
+                        .with(replacementCall)
+                        .reformat(true)
+                        .shortenNames()
+                        .build(),
+                )
+        }
+
+        /**
+         * Generates source code for a wrapper method and class (where applicable) and calculates
+         * the insertion point. If the wrapper class already exists, returns source code for the
+         * method body only with an insertion point at the end of the existing wrapper class body.
+         *
+         * Source code follows the general format:
+         *
+         * ```java
+         * @RequiresApi(21)
+         * static class Api21Impl {
+         *   private Api21Impl() {}
+         *   // Method body here.
+         * }
+         * ```
+         *
+         * @param api API level at which the platform method can be safely called
+         * @param callContainingClass Class containing the call to the platform method
+         * @param wrapperMethodBody Source code for the wrapper method
+         * @return Triple containing (1) the name of the static wrapper class, (2) the insertion
+         * point for the generated source code, and (3) generated source code for a static wrapper
+         * method, including a static wrapper class if necessary
+         */
+        private fun generateInsertionSource(
+            api: Int,
+            callContainingClass: UClass,
+            wrapperMethodBody: String,
+        ): Triple<String, Location, String> {
+            val wrapperClassName = "Api${api}Impl"
+            val implInsertionPoint: Location
+            val implForInsertion: String
+
+            val existingWrapperClass = callContainingClass.innerClasses.find { innerClass ->
+                innerClass.name == wrapperClassName
+            }
+
+            if (existingWrapperClass == null) {
+                implInsertionPoint = context.getLocation(callContainingClass.lastChild)
+                implForInsertion = """
+                @androidx.annotation.RequiresApi($api)
+                static class $wrapperClassName {
+                    private $wrapperClassName() {
+                        // This class is not instantiable.
+                    }
+                    $wrapperMethodBody
+                }
+                """.trimIndent()
+            } else {
+                implInsertionPoint = context.getLocation(existingWrapperClass.lastChild)
+                implForInsertion = wrapperMethodBody.trimIndent()
+            }
+
+            return Triple(
+                wrapperClassName,
+                implInsertionPoint,
+                implForInsertion
+            )
+        }
+
+        /**
+         * Generates source code for a call to the generated wrapper method, or `null` if we don't
+         * know how to do that. Currently, this method is capable of handling static calls --
+         * including constructor calls -- and simple reference expressions from Java source code.
+         *
+         * Source code follows the general format:
+         *
+         * ```
+         * WrapperClassName.wrapperMethodName(receiverVar, argumentVar)
+         * ```
+         *
+         * @param method Platform method which is being called
+         * @param callReceiver Receiver of the call to the platform method
+         * @param callValueArguments Arguments of the call to the platform method
+         * @param wrapperClassName Name of the generated wrapper class
+         * @param wrapperMethodName Name of the generated wrapper method
+         * @return Source code for a call to the static wrapper method
+         */
+        private fun generateWrapperCall(
+            method: PsiMethod,
+            callReceiver: UExpression?,
+            callValueArguments: List<UExpression>,
+            wrapperClassName: String,
+            wrapperMethodName: String,
+        ): String? {
+            val isStatic = context.evaluator.isStatic(method)
+            val isConstructor = method.isConstructor
+            val isSimpleReference = callReceiver is JavaUSimpleNameReferenceExpression
+
+            val callReceiverStr = when {
+                isStatic -> null
+                isConstructor -> null
+                isSimpleReference ->
+                    (callReceiver as JavaUSimpleNameReferenceExpression).identifier
+                else -> {
+                    // We don't know how to handle this type of receiver. This should never happen.
+                    return null
+                }
+            }
+
+            val callValues = if (callValueArguments.isNotEmpty()) {
+                callValueArguments.joinToString(separator = ", ") { argument ->
+                    argument.asSourceString()
+                }
+            } else {
+                null
+            }
+
+            val replacementArgs = listOfNotNull(callReceiverStr, callValues).joinToString(", ")
+
+            return "$wrapperClassName.$wrapperMethodName($replacementArgs)"
+        }
+
+        /**
+         * Generates source code for a wrapper method, or `null` if we don't know how to do that.
+         * Currently, this method is capable of handling method and constructor calls from Java
+         * source code.
+         *
+         * Source code follows the general format:
+         *
+         * ```
+         * @DoNotInline
+         * static ReturnType methodName(HostType hostType, ParamType paramType) {
+         *   return hostType.methodName(paramType);
+         * }
+         * ```
+         *
+         * @param method Platform method which is being called
+         * @return Pair containing (1) the name of the static wrapper method and (2) generated
+         * source code for a static wrapper around the platform method
+         */
+        private fun generateWrapperMethod(method: PsiMethod): Pair<String, String>? {
+            val methodName = method.name
+            val evaluator = context.evaluator
+            val isStatic = evaluator.isStatic(method)
+            val isConstructor = method.isConstructor
+
+            // Neither of these should be null if we're looking at Java code.
+            val containingClass = method.containingClass ?: return null
+            val hostType = containingClass.name ?: return null
+            val hostVar = hostType[0].toLowerCase() + hostType.substring(1)
+
+            val hostParam = if (isStatic || isConstructor) { null } else { "$hostType $hostVar" }
+
+            val typeParamsStr = if (method.typeParameters.isNotEmpty()) {
+                "<${method.typeParameters.joinToString(", ") { param -> "${param.name}" }}> "
+            } else {
+                ""
+            }
+
+            val typedParams = method.parameters.map { param ->
+                "${(param.type as? PsiType)?.presentableText} ${param.name}"
+            }
+            val typedParamsStr = (listOfNotNull(hostParam) + typedParams).joinToString(", ")
+
+            val namedParamsStr = method.parameters.joinToString(separator = ", ") { param ->
+                "${param.name}"
+            }
+
+            val wrapperMethodName: String
+            val returnTypeStr: String
+            val returnStmtStr: String
+            val receiverStr: String
+
+            if (isConstructor) {
+                wrapperMethodName = "create$methodName"
+                returnTypeStr = hostType
+                returnStmtStr = "return "
+                receiverStr = "new "
+            } else {
+                wrapperMethodName = methodName
+                returnTypeStr = method.returnType?.presentableText ?: "void"
+                returnStmtStr = if ("void" == returnTypeStr) "" else "return "
+                receiverStr = if (isStatic) "$hostType." else "$hostVar."
+            }
+
+            return Pair(
+                wrapperMethodName,
+                """
+                    @androidx.annotation.DoNotInline
+                    static $typeParamsStr$returnTypeStr $wrapperMethodName($typedParamsStr) {
+                        $returnStmtStr$receiverStr$methodName($namedParamsStr);
+                    }
+                """
+            )
+        }
+
+        private fun getInheritanceChain(
+            derivedClass: PsiClassType,
+            baseClass: PsiClassType?
+        ): List<PsiClassType>? {
+            if (derivedClass == baseClass) {
+                return emptyList()
+            }
+            val chain = getInheritanceChain(derivedClass, baseClass, HashSet(), 0)
+            chain?.reverse()
+            return chain
+        }
+
+        private fun getInheritanceChain(
+            derivedClass: PsiClassType,
+            baseClass: PsiClassType?,
+            visited: HashSet<PsiType>,
+            depth: Int
+        ): MutableList<PsiClassType>? {
+            if (derivedClass == baseClass) {
+                return ArrayList(depth)
+            }
+            for (type in derivedClass.superTypes) {
+                if (visited.add(type) && type is PsiClassType) {
+                    val chain = getInheritanceChain(type, baseClass, visited, depth + 1)
+                    if (chain != null) {
+                        chain.add(derivedClass)
+                        return chain
+                    }
+                }
+            }
+            return null
+        }
+
+        private fun getRequiresApiFromAnnotations(modifierListOwner: PsiModifierListOwner): Int {
+            for (annotation in context.evaluator.getAllAnnotations(modifierListOwner, false)) {
+                val qualifiedName = annotation.qualifiedName
+                if (REQUIRES_API_ANNOTATION.isEquals(qualifiedName)) {
+                    val wrapped = JavaUAnnotation.wrap(annotation)
+                    var api = getLongAttribute(
+                        context, wrapped,
+                        ATTR_VALUE, NO_API_REQUIREMENT.toLong()
+                    ).toInt()
+                    if (api <= 1) {
+                        // @RequiresApi has two aliasing attributes: api and value
+                        api = getLongAttribute(context, wrapped, "api", NO_API_REQUIREMENT.toLong())
+                            .toInt()
+                    }
+                    return api
+                } else if (qualifiedName == null) {
+                    // Work around UAST type resolution problems
+                    // Work around bugs in UAST type resolution for file annotations:
+                    // parse the source string instead.
+                    if (annotation is PsiCompiledElement) {
+                        continue
+                    }
+                    val text = annotation.text
+                    if (text.contains("RequiresApi(")) {
+                        val start = text.indexOf('(')
+                        val end = text.indexOf(')', start + 1)
+                        if (end != -1) {
+                            var name = text.substring(start + 1, end)
+                            // Strip off attribute name and qualifiers, e.g.
+                            //   @RequiresApi(api = Build.VERSION.O) -> O
+                            var index = name.indexOf('=')
+                            if (index != -1) {
+                                name = name.substring(index + 1).trim()
+                            }
+                            index = name.indexOf('.')
+                            if (index != -1) {
+                                name = name.substring(index + 1)
+                            }
+                            if (!name.isEmpty()) {
+                                if (name[0].isDigit()) {
+                                    val api = Integer.parseInt(name)
+                                    if (api > 0) {
+                                        return api
+                                    }
+                                } else {
+                                    return codeNameToApi(name)
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            return NO_API_REQUIREMENT
+        }
+    }
+
+    companion object {
+        const val NO_API_REQUIREMENT = -1
+        val ISSUE = Issue.create(
+            "ClassVerificationFailure",
+            "Even in cases where references to new APIs are gated on SDK_INT " +
+                "checks, run-time class verification will still fail on references to APIs that " +
+                "may not be available at run time, including platform APIs introduced after a " +
+                "library's minSdkVersion.",
+            """
+                The Java language requires a virtual machine to verify the class files it
+                loads and executes. A class may fail verification for a wide variety of
+                reasons, but in practice it‘s usually because the class’s code refers to
+                unknown classes or methods.
+                
+                References to APIs added after a library's minSdkVersion -- regardless of
+                any surrounding version checks -- will fail run-time class verification if
+                the API does not exist on the device, leading to reduced run-time
+                performance.
+
+                Gating references on SDK checks alone DOES NOT address class verification
+                failures.
+
+                To prevent class verification failures, references to new APIs must be
+                moved to inner classes that are only initialized inside of an appropriate
+                SDK check.
+
+                For example, if our minimum SDK is 14 and platform method a.x(params...)
+                was added in SDK 16, the method call must be moved to an inner class like:
+
+                @RequiresApi(16)
+                private static class Api16Impl{
+                  @DoNotInline
+                  static void callX(params...) {
+                    a.x(params...);
+                  }
+                }
+
+                The call site is changed from a.x(params...) to Api16Impl.callX(params).
+
+                Since ART will only try to optimize Api16Impl when it's on the execution
+                path, we are guaranteed to have a.x(...) available.
+
+                In addition, optimizers like R8 or Proguard may inline the method in the
+                separate class and replace the wrapper call with the actual call, so you
+                must disable inlining using the @DoNotInline annotation.
+
+                Failure to do the above may result in overall performance degradation.
+            """,
+            Category.CORRECTNESS, 5, Severity.ERROR,
+            Implementation(ClassVerificationFailureDetector::class.java, Scope.JAVA_FILE_SCOPE)
+        ).setAndroidSpecific(true)
+    }
+}
diff --git a/lint-checks/src/main/java/androidx/build/lint/MetadataTagInsideApplicationTagDetector.kt b/lint-checks/src/main/java/androidx/build/lint/MetadataTagInsideApplicationTagDetector.kt
index 9be8809..94fd2e1 100644
--- a/lint-checks/src/main/java/androidx/build/lint/MetadataTagInsideApplicationTagDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/MetadataTagInsideApplicationTagDetector.kt
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.SdkConstants.TAG_META_DATA
@@ -29,7 +31,7 @@
 
 class MetadataTagInsideApplicationTagDetector : Detector(), Detector.XmlScanner {
 
-    override fun getApplicableElements(): Collection<String>? {
+    override fun getApplicableElements(): Collection<String> {
         return listOf(TAG_META_DATA)
     }
 
diff --git a/lint-checks/src/main/java/androidx/build/lint/ObsoleteBuildCompatUsageDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ObsoleteBuildCompatUsageDetector.kt
index 855bdbc..1dd909d 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ObsoleteBuildCompatUsageDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ObsoleteBuildCompatUsageDetector.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.detector.api.Category
@@ -38,7 +40,7 @@
 
     override fun getApplicableMethodNames() = methodsToApiLevels.keys.toList()
 
-    override fun visitMethod(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
         if (!context.evaluator.isMemberInClass(method, "androidx.core.os.BuildCompat")) {
             return
         }
diff --git a/lint-checks/src/main/java/androidx/build/lint/PrivateConstructorForUtilityClass.kt b/lint-checks/src/main/java/androidx/build/lint/PrivateConstructorForUtilityClass.kt
index 69ffbe3..c34ece7 100644
--- a/lint-checks/src/main/java/androidx/build/lint/PrivateConstructorForUtilityClass.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/PrivateConstructorForUtilityClass.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import com.android.tools.lint.client.api.UElementHandler
diff --git a/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt b/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt
index 450bb5c..c12401e 100644
--- a/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+@file:Suppress("UnstableApiUsage")
+
 package androidx.build.lint
 
 import androidx.build.lint.SampledAnnotationEnforcer.Companion.SAMPLED_ANNOTATION
@@ -169,10 +171,10 @@
             return sampleFunctionCache
         }
 
-        override fun getApplicableUastTypes(): List<Class<out UElement>>? =
+        override fun getApplicableUastTypes(): List<Class<out UElement>> =
             listOf(UDeclaration::class.java)
 
-        override fun createUastHandler(context: JavaContext): UElementHandler? =
+        override fun createUastHandler(context: JavaContext): UElementHandler =
             KDocSampleLinkHandler(context)
 
         /**
@@ -300,10 +302,10 @@
             return sampleLinkCache!!
         }
 
-        override fun getApplicableUastTypes(): List<Class<out UElement>>? =
+        override fun getApplicableUastTypes(): List<Class<out UElement>> =
             listOf(UMethod::class.java)
 
-        override fun createUastHandler(context: JavaContext): UElementHandler? =
+        override fun createUastHandler(context: JavaContext): UElementHandler =
             SampledAnnotationHandler(context)
 
         /**
diff --git a/lint-checks/src/main/java/androidx/build/lint/TestSizeAnnotationEnforcer.kt b/lint-checks/src/main/java/androidx/build/lint/TestSizeAnnotationEnforcer.kt
index f919caa..73d1b76 100644
--- a/lint-checks/src/main/java/androidx/build/lint/TestSizeAnnotationEnforcer.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/TestSizeAnnotationEnforcer.kt
@@ -46,7 +46,7 @@
     override fun getApplicableUastTypes(): List<Class<out UElement>>? =
         Collections.singletonList(UClass::class.java)
 
-    override fun createUastHandler(context: JavaContext): UElementHandler? {
+    override fun createUastHandler(context: JavaContext): UElementHandler {
         return TestSizeAnnotationHandler(context)
     }
 
diff --git a/lint-checks/src/main/java/androidx/build/lint/UnsafeNewApiCallsDetector.kt b/lint-checks/src/main/java/androidx/build/lint/UnsafeNewApiCallsDetector.kt
deleted file mode 100644
index cb1311e..0000000
--- a/lint-checks/src/main/java/androidx/build/lint/UnsafeNewApiCallsDetector.kt
+++ /dev/null
@@ -1,504 +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.lint
-import com.android.SdkConstants.ATTR_VALUE
-import com.android.SdkConstants.DOT_JAVA
-import com.android.tools.lint.checks.ApiDetector.Companion.REQUIRES_API_ANNOTATION
-import com.android.tools.lint.client.api.UElementHandler
-import com.android.tools.lint.detector.api.JavaContext
-import com.android.tools.lint.detector.api.SourceCodeScanner
-import com.android.tools.lint.checks.ApiLookup
-import com.android.tools.lint.checks.ApiLookup.equivalentName
-import com.android.tools.lint.checks.ApiLookup.startsWithEquivalentPrefix
-import com.android.tools.lint.checks.VersionChecks.Companion.codeNameToApi
-import com.android.tools.lint.detector.api.Category
-import com.android.tools.lint.detector.api.Context
-import com.android.tools.lint.detector.api.Desugaring
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Implementation
-import com.android.tools.lint.detector.api.Issue
-import com.android.tools.lint.detector.api.Scope
-import com.android.tools.lint.detector.api.Severity
-import com.android.tools.lint.detector.api.UastLintUtils.Companion.getLongAttribute
-import com.android.tools.lint.detector.api.getInternalMethodName
-import com.intellij.psi.PsiAnonymousClass
-import com.intellij.psi.PsiClass
-import com.intellij.psi.PsiClassType
-import com.intellij.psi.PsiCompiledElement
-import com.intellij.psi.PsiMethod
-import com.intellij.psi.PsiModifierListOwner
-import com.intellij.psi.PsiSuperExpression
-import com.intellij.psi.PsiType
-import com.intellij.psi.util.PsiTreeUtil
-import org.jetbrains.uast.UCallExpression
-import org.jetbrains.uast.UElement
-import org.jetbrains.uast.UInstanceExpression
-import org.jetbrains.uast.USuperExpression
-import org.jetbrains.uast.UThisExpression
-import org.jetbrains.uast.getContainingUClass
-import org.jetbrains.uast.getContainingUMethod
-import org.jetbrains.uast.java.JavaUAnnotation
-import org.jetbrains.uast.util.isConstructorCall
-import org.jetbrains.uast.util.isMethodCall
-/**
- * This detects usages of a platform api that are not within a class annotated with RequiresApi(x)
- * where x is equal or higher to that api. It is to encourage developers to move calls to apis
- * higher than minSdk to be within a specialized annotated class (classes with names
- * traditionally ending with ....ApiXImpl.
- */
-class UnsafeNewApiCallsDetector : Detector(), SourceCodeScanner {
-    private var apiDatabase: ApiLookup? = null
-    override fun beforeCheckEachProject(context: Context) {
-        apiDatabase = ApiLookup.get(context.client, context.project.buildTarget)
-    }
-    override fun afterCheckEachProject(context: Context) {
-        apiDatabase = null
-    }
-    override fun createUastHandler(context: JavaContext): UElementHandler? {
-        if (apiDatabase == null) {
-            return null
-        }
-        return ApiVisitor(context)
-    }
-    override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
-    // Consider making this a top class and pass in apiDatabase explicitly.
-    private inner class ApiVisitor(private val context: JavaContext) : UElementHandler() {
-        override fun visitCallExpression(node: UCallExpression) {
-            val method = node.resolve()
-            if (method != null) {
-                visitCall(method, node, node)
-            }
-        }
-        private fun visitCall(
-            method: PsiMethod,
-            call: UCallExpression?,
-            reference: UElement
-        ) {
-            if (call == null) {
-                return
-            }
-            val apiDatabase = apiDatabase ?: return
-            val containingClass = method.containingClass ?: return
-            val evaluator = context.evaluator
-            val owner = evaluator.getQualifiedName(containingClass)
-                ?: return // Couldn't resolve type
-            if (!apiDatabase.containsClass(owner)) {
-                return
-            }
-            val name = getInternalMethodName(method)
-            val desc = evaluator.getMethodDescription(
-                method,
-                false,
-                false
-            ) // Couldn't compute description of method for some reason; probably
-                // failure to resolve parameter types
-                ?: return
-            var api = apiDatabase.getMethodVersion(owner, name, desc)
-            if (api == NO_API_REQUIREMENT) {
-                return
-            }
-            if (api <= context.project.minSdk) {
-                return
-            }
-            if (call.isMethodCall()) {
-                val qualifier = call.receiver
-                if (qualifier != null &&
-                    qualifier !is UThisExpression &&
-                    qualifier !is PsiSuperExpression
-                ) {
-                    val receiverType = qualifier.getExpressionType()
-                    if (receiverType is PsiClassType) {
-                        val containingType = context.evaluator.getClassType(containingClass)
-                        val inheritanceChain =
-                            getInheritanceChain(receiverType, containingType)
-                        if (inheritanceChain != null) {
-                            for (type in inheritanceChain) {
-                                val expressionOwner = evaluator.getQualifiedName(type)
-                                if (expressionOwner != null && expressionOwner != owner) {
-                                    val specificApi = apiDatabase.getMethodVersion(
-                                        expressionOwner, name, desc
-                                    )
-                                    if (specificApi == NO_API_REQUIREMENT) {
-                                        if (apiDatabase.isRelevantOwner(expressionOwner)) {
-                                            return
-                                        }
-                                    } else if (specificApi <= context.project.minSdk) {
-                                        return
-                                    } else {
-                                        // For example, for Bundle#getString(String,String) the
-                                        // API level is 12, whereas for BaseBundle#getString
-                                        // (String,String) the API level is 21. If the code
-                                        // specified a Bundle instead of a BaseBundle, reported
-                                        // the Bundle level in the error message instead.
-                                        if (specificApi < api) {
-                                            api = specificApi
-                                        }
-                                        api = Math.min(specificApi, api)
-                                    }
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    // Unqualified call; need to search in our super hierarchy
-                    // Unfortunately, expression.getReceiverType() does not work correctly
-                    // in Java; it returns the type of the static binding of the call
-                    // instead of giving the virtual dispatch type, as described in
-                    // https://issuetracker.google.com/64528052 (and covered by
-                    // for example ApiDetectorTest#testListView). Therefore, we continue
-                    // to use the workaround method for Java (which isn't correct, and is
-                    // particularly broken in Kotlin where the dispatch needs to take into
-                    // account top level functions and extension methods), and then we use
-                    // the correct receiver type in Kotlin.
-                    var cls: PsiClass? = null
-                    if (context.file.path.endsWith(DOT_JAVA)) {
-                        cls = call.getContainingUClass()?.javaPsi
-                    } else {
-                        val receiverType = call.receiverType
-                        if (receiverType is PsiClassType) {
-                            cls = receiverType.resolve()
-                        }
-                    }
-                    if (qualifier is UThisExpression || qualifier is USuperExpression) {
-                        val pte = qualifier as UInstanceExpression
-                        val resolved = pte.resolve()
-                        if (resolved is PsiClass) {
-                            cls = resolved
-                        }
-                    }
-                    while (cls != null) {
-                        if (cls is PsiAnonymousClass) {
-                            // If it's an unqualified call in an anonymous class, we need to
-                            // rely on the resolve method to find out whether the method is
-                            // picked up from the anonymous class chain or any outer classes
-                            var found = false
-                            val anonymousBaseType = cls.baseClassType
-                            val anonymousBase = anonymousBaseType.resolve()
-                            if (anonymousBase != null && anonymousBase.isInheritor(
-                                    containingClass,
-                                    true
-                                )
-                            ) {
-                                cls = anonymousBase
-                                found = true
-                            } else {
-                                val surroundingBaseType =
-                                    PsiTreeUtil.getParentOfType(cls, PsiClass::class.java, true)
-                                if (surroundingBaseType != null && surroundingBaseType.isInheritor(
-                                        containingClass,
-                                        true
-                                    )
-                                ) {
-                                    cls = surroundingBaseType
-                                    found = true
-                                }
-                            }
-                            if (!found) {
-                                break
-                            }
-                        }
-                        val expressionOwner = evaluator.getQualifiedName(cls)
-                        if (expressionOwner == null || equivalentName(
-                                expressionOwner,
-                                "java/lang/Object"
-                            )
-                        ) {
-                            break
-                        }
-                        val specificApi =
-                            apiDatabase.getMethodVersion(expressionOwner, name, desc)
-                        if (specificApi == NO_API_REQUIREMENT) {
-                            if (apiDatabase.isRelevantOwner(expressionOwner)) {
-                                break
-                            }
-                        } else if (specificApi <= context.project.minSdk) {
-                            return
-                        } else {
-                            if (specificApi < api) {
-                                api = specificApi
-                            }
-                            api = Math.min(specificApi, api)
-                            break
-                        }
-                        cls = cls.superClass
-                    }
-                }
-            }
-            if (call.isMethodCall()) {
-                val receiver = call.receiver
-                var target: PsiClass? = null
-                if (!method.isConstructor) {
-                    if (receiver != null) {
-                        val type = receiver.getExpressionType()
-                        if (type is PsiClassType) {
-                            target = type.resolve()
-                        }
-                    } else {
-                        target = call.getContainingUClass()?.javaPsi
-                    }
-                }
-                // Look to see if there's a possible local receiver
-                if (target != null) {
-                    val methods = target.findMethodsBySignature(method, true)
-                    if (methods.size > 1) {
-                        for (m in methods) {
-                            if (!method.isEquivalentTo(m)) {
-                                val provider = m.containingClass
-                                if (provider != null) {
-                                    val methodOwner = evaluator.getQualifiedName(provider)
-                                    if (methodOwner != null) {
-                                        val methodApi = apiDatabase.getMethodVersion(
-                                            methodOwner, name, desc
-                                        )
-                                        if (methodApi == NO_API_REQUIREMENT ||
-                                            methodApi <= context.project.minSdk
-                                        ) {
-                                            // Yes, we found another call that doesn't have an
-                                            // API requirement
-                                            return
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                // If you're simply calling super.X from method X, even if method X is in a higher
-                // API level than the minSdk, we're generally safe; that method should only be
-                // called by the framework on the right API levels. (There is a danger of somebody
-                // calling that method locally in other contexts, but this is hopefully unlikely.)
-                if (receiver is USuperExpression) {
-                    val containingMethod = call.getContainingUMethod()?.javaPsi
-                    if (containingMethod != null &&
-                        name == containingMethod.name &&
-                        evaluator.areSignaturesEqual(method, containingMethod) &&
-                        // We specifically exclude constructors from this check, because we
-                        // do want to flag constructors requiring the new API level; it's
-                        // highly likely that the constructor is called by local code so
-                        // you should specifically investigate this as a developer
-                        !method.isConstructor
-                    ) {
-                        return
-                    }
-                }
-                // If it's a method we have source for, obviously it shouldn't be a
-                // violation, happens in androidx (appcompat?)
-                if (method !is PsiCompiledElement) {
-                    return
-                }
-            }
-            // Desugar rewrites compare calls (see b/36390874)
-            if (name == "compare" &&
-                api == 19 &&
-                startsWithEquivalentPrefix(owner, "java/lang/") &&
-                desc.length == 4 &&
-                context.project.isDesugaring(Desugaring.LONG_COMPARE) &&
-                (
-                    desc == "(JJ)" ||
-                        desc == "(ZZ)" ||
-                        desc == "(BB)" ||
-                        desc == "(CC)" ||
-                        desc == "(II)" ||
-                        desc == "(SS)"
-                    )
-            ) {
-                return
-            }
-            // Desugar rewrites Objects.requireNonNull calls (see b/32446315)
-            if (name == "requireNonNull" &&
-                api == 19 &&
-                owner == "java.util.Objects" &&
-                desc == "(Ljava.lang.Object;)" &&
-                context.project.isDesugaring(Desugaring.OBJECTS_REQUIRE_NON_NULL)
-            ) {
-                return
-            }
-            if (name == "addSuppressed" &&
-                api == 19 &&
-                owner == "java.lang.Throwable" &&
-                desc == "(Ljava.lang.Throwable;)" &&
-                context.project.isDesugaring(Desugaring.TRY_WITH_RESOURCES)
-            ) {
-                return
-            }
-            val nameIdentifier = call.methodIdentifier
-            val location = if (call.isConstructorCall() &&
-                call.classReference != null
-            ) {
-                context.getRangeLocation(call, 0, call.classReference!!, 0)
-            } else if (nameIdentifier != null) {
-                context.getLocation(nameIdentifier)
-            } else {
-                context.getLocation(reference)
-            }
-            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()
-                context.report(
-                    ISSUE, reference, location,
-                    "This call is to a method from API $api, the call containing " +
-                        "class $containingClassName is not annotated with " +
-                        "@RequiresApi(x) where x is at least $api. Either annotate the " +
-                        "containing class with at least @RequiresApi($api) or move the " +
-                        "call to a static method in a wrapper class annotated with at " +
-                        "least @RequiresApi($api)."
-                )
-            }
-        }
-        private fun getInheritanceChain(
-            derivedClass: PsiClassType,
-            baseClass: PsiClassType?
-        ): List<PsiClassType>? {
-            if (derivedClass == baseClass) {
-                return emptyList()
-            }
-            val chain = getInheritanceChain(derivedClass, baseClass, HashSet(), 0)
-            chain?.reverse()
-            return chain
-        }
-        private fun getInheritanceChain(
-            derivedClass: PsiClassType,
-            baseClass: PsiClassType?,
-            visited: HashSet<PsiType>,
-            depth: Int
-        ): MutableList<PsiClassType>? {
-            if (derivedClass == baseClass) {
-                return ArrayList(depth)
-            }
-            for (type in derivedClass.superTypes) {
-                if (visited.add(type) && type is PsiClassType) {
-                    val chain = getInheritanceChain(type, baseClass, visited, depth + 1)
-                    if (chain != null) {
-                        chain.add(derivedClass)
-                        return chain
-                    }
-                }
-            }
-            return null
-        }
-        private fun getRequiresApiFromAnnotations(modifierListOwner: PsiModifierListOwner): Int {
-            for (annotation in context.evaluator.getAllAnnotations(modifierListOwner, false)) {
-                val qualifiedName = annotation.qualifiedName
-                if (REQUIRES_API_ANNOTATION.isEquals(qualifiedName)) {
-                    val wrapped = JavaUAnnotation.wrap(annotation)
-                    var api = getLongAttribute(
-                        context, wrapped,
-                        ATTR_VALUE, NO_API_REQUIREMENT.toLong()
-                    ).toInt()
-                    if (api <= 1) {
-                        // @RequiresApi has two aliasing attributes: api and value
-                        api = getLongAttribute(context, wrapped, "api", NO_API_REQUIREMENT.toLong())
-                            .toInt()
-                    }
-                    return api
-                } else if (qualifiedName == null) {
-                    // Work around UAST type resolution problems
-                    // Work around bugs in UAST type resolution for file annotations:
-                    // parse the source string instead.
-                    if (annotation is PsiCompiledElement) {
-                        continue
-                    }
-                    val text = annotation.text
-                    if (text.contains("RequiresApi(")) {
-                        val start = text.indexOf('(')
-                        val end = text.indexOf(')', start + 1)
-                        if (end != -1) {
-                            var name = text.substring(start + 1, end)
-                            // Strip off attribute name and qualifiers, e.g.
-                            //   @RequiresApi(api = Build.VERSION.O) -> O
-                            var index = name.indexOf('=')
-                            if (index != -1) {
-                                name = name.substring(index + 1).trim()
-                            }
-                            index = name.indexOf('.')
-                            if (index != -1) {
-                                name = name.substring(index + 1)
-                            }
-                            if (!name.isEmpty()) {
-                                if (name[0].isDigit()) {
-                                    val api = Integer.parseInt(name)
-                                    if (api > 0) {
-                                        return api
-                                    }
-                                } else {
-                                    return codeNameToApi(name)
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            return NO_API_REQUIREMENT
-        }
-    }
-    companion object {
-        const val NO_API_REQUIREMENT = -1
-        val ISSUE = Issue.create(
-            "UnsafeNewApiCall",
-            "Calling method with API level higher than minSdk outside a " +
-                "@RequiresApi class or with insufficient required API.",
-            """
-                Even though wrapping a call to a method from an API above minSdk
-                inside an SDK_INT check makes it runtime safe, it is not optimal. When
-                ART tries to optimize a class, it will do so regardless of the execution
-                path, and will fail if it tries to resolve a method at a higher API if
-                that method is being referenced
-                somewhere in the class, even if that method would never be called at runtime
-                due to the SDK_INT check. ART will however only try to optimize a class the
-                first time it's referenced at runtime, this means if we wrap our above
-                minSdk method calls inside classes that are only referenced at runtime at
-                the appropriate API level, then we guarantee the ablity to resolve all the
-                methods. To enforce this we require that all references to methods above
-                minSdk are made inside classes that are annotated with RequiresApi(x) where
-                x is at least the api at which the methods becomes available.
-                For example if our minSdk is 14, and framework method a.x(params...) is
-                available starting sdk 16, then creating the following example class is
-                considered good practice:
-                @RequiresApi(16)
-                private static class Api16Impl{
-                  static void callX(params...) {
-                    a.x(params...);
-                  }
-                }
-                The call site is changed from a.x(params...) to Api16Impl.callX(params).
-                Since ART will only try to optimize Api16Impl when it's on the execution
-                path, we are guaranteed to have a.x(...) available.
-                In addition, shrinkers like r8/proguard may inline the method in the separate
-                class and replace the wrapper call with the actual call, so you may have to disable
-                inlining the class by using a proguard rule. The following is an example of how to
-                disable inlining methods from Impl classes inside the WindowInsetsCompat class:
-                -keepclassmembernames,allowobfuscation,allowshrinking class 
-                    androidx.core.view.WindowInsetsCompat${'$'}*Impl* {
-                  <methods>;
-                }
-                This will still allow them to be removed, but if they are kept, they will not be
-                inlined.
-                Failure to do the above may result in overall performance degradation.
-            """,
-            Category.CORRECTNESS, 5, Severity.ERROR,
-            Implementation(UnsafeNewApiCallsDetector::class.java, Scope.JAVA_FILE_SCOPE)
-        ).setAndroidSpecific(true)
-    }
-}
diff --git a/lint-checks/src/test/java/androidx/build/lint/ApiLintVersionsTest.kt b/lint-checks/src/test/java/androidx/build/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..14da54f
--- /dev/null
+++ b/lint-checks/src/test/java/androidx/build/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.build.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = AndroidXIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Since we don't publish this lint registry, minApi can match the api version.
+        assertEquals("registry.minApi matches registry.api", registry.api, registry.minApi)
+    }
+}
diff --git a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
new file mode 100644
index 0000000..a1f460f
--- /dev/null
+++ b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
@@ -0,0 +1,312 @@
+/*
+ * 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.build.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest.manifest
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestFiles
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@Suppress("UnstableApiUsage")
+@RunWith(JUnit4::class)
+class ClassVerificationFailureDetectorTest {
+
+    private fun check(
+        vararg testFiles: TestFile,
+        minSdkVersion: Int = 14,
+    ): TestLintResult {
+        return lint()
+            .files(
+                manifest().minSdk(minSdkVersion),
+                *testFiles,
+            )
+            .issues(ClassVerificationFailureDetector.ISSUE)
+            .run()
+    }
+
+    @Test
+    fun `Detection of unsafe references in Java sources`() {
+        val input = arrayOf(
+            javaSample("androidx.ClassVerificationFailureFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/androidx/ClassVerificationFailureFromJava.java:38: Error: This call references a method added in API level 21; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            view.setBackgroundTintList(tint);
+                 ~~~~~~~~~~~~~~~~~~~~~
+src/androidx/ClassVerificationFailureFromJava.java:47: Error: This call references a method added in API level 17; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            return View.generateViewId();
+                        ~~~~~~~~~~~~~~
+src/androidx/ClassVerificationFailureFromJava.java:58: Error: This call references a method added in API level 23; however, the containing class androidx.ClassVerificationFailureFromJava is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+        return view.getAccessibilityClassName();
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~
+src/androidx/ClassVerificationFailureFromJava.java:80: Error: This call references a method added in API level 28; however, the containing class androidx.ClassVerificationFailureFromJava.Api28Impl is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            return view.getAccessibilityPaneTitle();
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~
+4 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun `Detection and auto-fix of unsafe references in real-world Java sources`() {
+        val input = arrayOf(
+            javaSample("androidx.core.widget.ListViewCompat")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/androidx/core/widget/ListViewCompat.java:39: Error: This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            listView.scrollListBy(y);
+                     ~~~~~~~~~~~~
+src/androidx/core/widget/ListViewCompat.java:69: Error: This call references a method added in API level 19; however, the containing class androidx.core.widget.ListViewCompat is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            return listView.canScrollList(direction);
+                            ~~~~~~~~~~~~~
+2 errors, 0 warnings
+        """.trimIndent()
+
+        val expectedFix = """
+Fix for src/androidx/core/widget/ListViewCompat.java line 39: Extract to static inner class:
+@@ -39 +39
+-             listView.scrollListBy(y);
++             Api19Impl.scrollListBy(listView, y);
+@@ -91 +91
+- }
+@@ -92 +91
++ @androidx.annotation.RequiresApi(19)
++ static class Api19Impl {
++     private Api19Impl() {
++         // This class is not instantiable.
++     }
++    
++     @androidx.annotation.DoNotInline
++     static void scrollListBy(AbsListView absListView, int y) {
++         absListView.scrollListBy(y);
++     }
++
++ }}
+Fix for src/androidx/core/widget/ListViewCompat.java line 69: Extract to static inner class:
+@@ -69 +69
+-             return listView.canScrollList(direction);
++             return Api19Impl.canScrollList(listView, direction);
+@@ -91 +91
+- }
+@@ -92 +91
++ @androidx.annotation.RequiresApi(19)
++ static class Api19Impl {
++     private Api19Impl() {
++         // This class is not instantiable.
++     }
++    
++     @androidx.annotation.DoNotInline
++     static boolean canScrollList(AbsListView absListView, int direction) {
++         return absListView.canScrollList(direction);
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix unsafe void-type method reference in Java source`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeVoidMethodReferenceJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeVoidMethodReferenceJava.java line 34: Extract to static inner class:
+@@ -34 +34
+-             view.setBackgroundTintList(new ColorStateList(null, null));
++             Api21Impl.setBackgroundTintList(view, new ColorStateList(null, null));
+@@ -37 +37
+- }
+@@ -38 +37
++ @annotation.RequiresApi(21)
++ static class Api21Impl {
++     private Api21Impl() {
++         // This class is not instantiable.
++     }
++    
++     @annotation.DoNotInline
++     static void setBackgroundTintList(View view, ColorStateList tint) {
++         view.setBackgroundTintList(tint);
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix unsafe constructor reference in Java source`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeConstructorReferenceJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeConstructorReferenceJava.java line 35: Extract to static inner class:
+@@ -35 +35
+-             AccessibilityNodeInfo node = new AccessibilityNodeInfo(new View(context), 1);
++             AccessibilityNodeInfo node = Api30Impl.createAccessibilityNodeInfo(new View(context), 1);
+@@ -38 +38
+- }
+@@ -39 +38
++ @annotation.RequiresApi(30)
++ static class Api30Impl {
++     private Api30Impl() {
++         // This class is not instantiable.
++     }
++    
++     @annotation.DoNotInline
++     static AccessibilityNodeInfo createAccessibilityNodeInfo(View root, int virtualDescendantId) {
++         return new AccessibilityNodeInfo(root, virtualDescendantId);
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix unsafe static method reference in Java source`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeStaticMethodReferenceJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeStaticMethodReferenceJava.java line 33: Extract to static inner class:
+@@ -33 +33
+-             return View.generateViewId();
++             return Api17Impl.generateViewId();
+@@ -37 +37
+- }
+@@ -38 +37
++ @annotation.RequiresApi(17)
++ static class Api17Impl {
++     private Api17Impl() {
++         // This class is not instantiable.
++     }
++    
++     @annotation.DoNotInline
++     static int generateViewId() {
++         return View.generateViewId();
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix unsafe generic-type method reference in Java source`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeGenericMethodReferenceJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeGenericMethodReferenceJava.java line 34: Extract to static inner class:
+@@ -34 +34
+-             return context.getSystemService(serviceClass);
++             return Api23Impl.getSystemService(context, serviceClass);
+@@ -38 +38
+- }
+@@ -39 +38
++ @annotation.RequiresApi(23)
++ static class Api23Impl {
++     private Api23Impl() {
++         // This class is not instantiable.
++     }
++    
++     @annotation.DoNotInline
++     static <T> T getSystemService(Context context, Class<T> serviceClass) {
++         return context.getSystemService(serviceClass);
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expectFixDiffs(expectedFix)
+    }
+
+    @Test
+    fun `Auto-fix unsafe reference in Java source with existing inner class`() {
+        val input = arrayOf(
+            javaSample("androidx.AutofixUnsafeReferenceWithExistingClassJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expectedFix = """
+Fix for src/androidx/AutofixUnsafeReferenceWithExistingClassJava.java line 36: Extract to static inner class:
+@@ -36 +36
+-             view.setBackgroundTintList(new ColorStateList(null, null));
++             Api21Impl.setBackgroundTintList(view, new ColorStateList(null, null));
+@@ -46 +46
+- }
+@@ -47 +46
++ @RequiresApi(21)
++ static class Api21Impl {
++     private Api21Impl() {
++         // This class is not instantiable.
++     }
++    
++     @DoNotInline
++     static void setBackgroundTintList(View view, ColorStateList tint) {
++         view.setBackgroundTintList(tint);
++     }
++
++ }}
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expectFixDiffs(expectedFix)
+    }
+
+    /**
+     * Loads a [TestFile] from Java source code included in the JAR resources.
+     */
+    private fun javaSample(className: String): TestFile = TestFiles.java(
+        javaClass.getResource("/java/${className.replace('.', '/')}.java").readText()
+    )
+
+    /**
+     * Loads a [TestFile] from Kotlin source code included in the JAR resources.
+     */
+    private fun ktSample(className: String): TestFile = TestFiles.kotlin(
+        javaClass.getResource("/java/${className.replace('.', '/')}.kt").readText()
+    )
+}
\ No newline at end of file
diff --git a/lint-checks/tests/lint-baseline.xml b/lint-checks/tests/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/lint-checks/tests/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/lint-demos/lint-demo-appcompat/lint-baseline.xml b/lint-demos/lint-demo-appcompat/lint-baseline.xml
index 02fd3ae..aed50b7 100644
--- a/lint-demos/lint-demo-appcompat/lint-baseline.xml
+++ b/lint-demos/lint-demo-appcompat/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.appcompat.AppCompatLintDemo is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.appcompat.AppCompatLintDemo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            noop.setCompoundDrawableTintList(csl);"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.appcompat.AppCompatLintDemo is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.appcompat.AppCompatLintDemo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            noop.setCompoundDrawableTintMode(PorterDuff.Mode.DST);"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.AppCompatLintDemo is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.AppCompatLintDemo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="            ~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.AppCompatLintDemo is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.AppCompatLintDemo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="                         ~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.AppCompatLintDemoExt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.AppCompatLintDemoExt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="            ~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.AppCompatLintDemoExt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.AppCompatLintDemoExt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="                         ~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.CoreActivityExt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.CoreActivityExt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="            ~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.appcompat.CoreActivityExt is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.appcompat.CoreActivityExt is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="                         ~~~~~~~~~~~">
         <location
diff --git a/lint-demos/lint-demo-appcompat/src/main/res/values/strings.xml b/lint-demos/lint-demo-appcompat/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from lint-demos/lint-demo-appcompat/src/main/res/values/strings.xml
rename to lint-demos/lint-demo-appcompat/src/main/res/values/donottranslate-strings.xml
diff --git a/loader/loader-ktx/build.gradle b/loader/loader-ktx/build.gradle
index e27fe01..12f8e80 100644
--- a/loader/loader-ktx/build.gradle
+++ b/loader/loader-ktx/build.gradle
@@ -38,9 +38,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/loader/loader-ktx/lint-baseline.xml b/loader/loader-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/loader/loader-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/loader/loader/build.gradle b/loader/loader/build.gradle
index 3b958cf..48be3ec 100644
--- a/loader/loader/build.gradle
+++ b/loader/loader/build.gradle
@@ -8,13 +8,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.0.0")
     api("androidx.lifecycle:lifecycle-viewmodel:2.0.0")
@@ -27,9 +20,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/loader/loader/lint-baseline.xml b/loader/loader/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/loader/loader/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/localbroadcastmanager/localbroadcastmanager/lint-baseline.xml b/localbroadcastmanager/localbroadcastmanager/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/localbroadcastmanager/localbroadcastmanager/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media/media/api/current.txt b/media/media/api/current.txt
index f2736b3..ab43c37 100644
--- a/media/media/api/current.txt
+++ b/media/media/api/current.txt
@@ -295,7 +295,7 @@
     method public abstract void skipToPrevious();
     method public abstract void skipToQueueItem(long);
     method public abstract void stop();
-    field public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field @Deprecated public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
   }
 
   public class MediaSessionCompat {
@@ -728,6 +728,7 @@
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
+    field public static final String METADATA_KEY_NEXT_EPISODE_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_NEXT_EPISODE_CONTENT_ID";
     field public static final long METADATA_VALUE_ATTRIBUTE_PRESENT = 1L; // 0x1L
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT = "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL = "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL";
@@ -736,6 +737,8 @@
     field public static final String SESSION_EXTRAS_KEY_ACCOUNT_TYPE = "androidx.media.MediaSessionCompat.Extras.KEY_ACCOUNT_TYPE";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_SHUFFLE = "androidx.media.MediaControllerCompat.TransportControls.extras.KEY_SHUFFLE";
   }
 
 }
diff --git a/media/media/api/public_plus_experimental_current.txt b/media/media/api/public_plus_experimental_current.txt
index 21272eb..cf5874c 100644
--- a/media/media/api/public_plus_experimental_current.txt
+++ b/media/media/api/public_plus_experimental_current.txt
@@ -295,7 +295,7 @@
     method public abstract void skipToPrevious();
     method public abstract void skipToQueueItem(long);
     method public abstract void stop();
-    field public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field @Deprecated public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
   }
 
   public class MediaSessionCompat {
@@ -728,6 +728,7 @@
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
+    field public static final String METADATA_KEY_NEXT_EPISODE_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_NEXT_EPISODE_CONTENT_ID";
     field public static final long METADATA_VALUE_ATTRIBUTE_PRESENT = 1L; // 0x1L
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT = "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL = "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL";
@@ -736,6 +737,8 @@
     field public static final String SESSION_EXTRAS_KEY_ACCOUNT_TYPE = "androidx.media.MediaSessionCompat.Extras.KEY_ACCOUNT_TYPE";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_SHUFFLE = "androidx.media.MediaControllerCompat.TransportControls.extras.KEY_SHUFFLE";
   }
 
 }
diff --git a/media/media/api/restricted_current.txt b/media/media/api/restricted_current.txt
index bdc3176..3f5c9d9 100644
--- a/media/media/api/restricted_current.txt
+++ b/media/media/api/restricted_current.txt
@@ -300,7 +300,7 @@
     method public abstract void skipToPrevious();
     method public abstract void skipToQueueItem(long);
     method public abstract void stop();
-    field public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field @Deprecated public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
   }
 
   public class MediaSessionCompat {
@@ -760,6 +760,7 @@
     field public static final String METADATA_KEY_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
     field public static final String METADATA_KEY_IS_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT";
     field public static final String METADATA_KEY_IS_EXPLICIT = "android.media.IS_EXPLICIT";
+    field public static final String METADATA_KEY_NEXT_EPISODE_CONTENT_ID = "androidx.media.MediaMetadatCompat.METADATA_KEY_NEXT_EPISODE_CONTENT_ID";
     field public static final long METADATA_VALUE_ATTRIBUTE_PRESENT = 1L; // 0x1L
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT = "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
     field public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL = "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL";
@@ -768,6 +769,8 @@
     field public static final String SESSION_EXTRAS_KEY_ACCOUNT_TYPE = "androidx.media.MediaSessionCompat.Extras.KEY_ACCOUNT_TYPE";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT";
     field public static final String SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV = "android.media.playback.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
+    field public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_SHUFFLE = "androidx.media.MediaControllerCompat.TransportControls.extras.KEY_SHUFFLE";
   }
 
 }
diff --git a/media/media/build.gradle b/media/media/build.gradle
index 49e34a9..561b834 100644
--- a/media/media/build.gradle
+++ b/media/media/build.gradle
@@ -31,7 +31,7 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":internal-testutils-runtime"))
     annotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
diff --git a/media/media/lint-baseline.xml b/media/media/lint-baseline.xml
index 9c9fd34..41b05e6 100644
--- a/media/media/lint-baseline.xml
+++ b/media/media/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder = new AudioAttributes.Builder();"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder = new AudioAttributes.Builder((AudioAttributes) aa);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new AudioAttributesImplApi21(mFwkBuilder.build());"
         errorLine2="                                                            ~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder.setUsage(usage);"
         errorLine2="                        ~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder.setContentType(contentType);"
         errorLine2="                        ~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder.setFlags(flags);"
         errorLine2="                        ~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi21.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi21.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder.setLegacyStreamType(streamType);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi26.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi26.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new AudioAttributesImplApi26(mFwkBuilder.build());"
         errorLine2="                                                            ~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.AudioAttributesImplApi26.Builder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.AudioAttributesImplApi26.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFwkBuilder.setUsage(usage);"
         errorLine2="                        ~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioFocusRequestCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioFocusRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    new AudioFocusRequest.Builder(mFocusGain)"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioFocusRequestCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioFocusRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setAudioAttributes(getAudioAttributes())"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioFocusRequestCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioFocusRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setWillPauseWhenDucked(mPauseOnDuck)"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioFocusRequestCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioFocusRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setOnAudioFocusChangeListener("
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioFocusRequestCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioFocusRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .build();"
         errorLine2="                             ~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return audioManager.requestAudioFocus(focusRequest.getAudioFocusRequest());"
         errorLine2="                                ~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.AudioManagerCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.AudioManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return audioManager.abandonAudioFocusRequest(focusRequest.getAudioFocusRequest());"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.media.AudioManagerCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.media.AudioManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return audioManager.getStreamMinVolume(streamType);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaBrowserCompat.MediaItem is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaBrowserCompat.MediaItem is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            int flags = itemFwk.getFlags();"
         errorLine2="                                ~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaBrowserCompat.MediaItem is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaBrowserCompat.MediaItem is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    MediaDescriptionCompat.fromMediaDescription(itemFwk.getDescription());"
         errorLine2="                                                                        ~~~~~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mServiceFwk.setSessionToken((MediaSession.Token) token.getToken());"
         errorLine2="                                ~~~~~~~~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.MediaBrowserServiceCompat.MediaBrowserServiceImplApi21.MediaBrowserServiceApi21 is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.MediaBrowserServiceCompat.MediaBrowserServiceImplApi21.MediaBrowserServiceApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return browserRootCompat == null ? null : new MediaBrowserService.BrowserRoot("
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -233,140 +233,140 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media.session.MediaButtonReceiver is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media.session.MediaButtonReceiver is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            context.startForegroundService(intent);"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="297"
+            line="301"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaControllerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaControllerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                controllerFwk = new MediaController(activity, (MediaSession.Token) sessionTokenObj);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="168"
+            line="169"
             column="33"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaControllerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaControllerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            activity.setMediaController(controllerFwk);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="170"
+            line="171"
             column="22"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaControllerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaControllerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            MediaController controllerFwk = activity.getMediaController();"
         errorLine2="                                                     ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="191"
+            line="192"
             column="54"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaControllerCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaControllerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            MediaSession.Token sessionTokenFwk = controllerFwk.getSessionToken();"
         errorLine2="                                                               ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="195"
+            line="196"
             column="64"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class android.support.v4.media.session.MediaControllerCompat.MediaControllerImplApi21 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class android.support.v4.media.session.MediaControllerCompat.MediaControllerImplApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mSessionInfo = mControllerFwk.getSessionInfo();"
         errorLine2="                                              ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2264"
+            line="2270"
             column="47"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.prepare();"
         errorLine2="                             ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2388"
+            line="2394"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.prepareFromMediaId(mediaId, extras);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2397"
+            line="2403"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.prepareFromSearch(query, extras);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2409"
+            line="2415"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.prepareFromUri(uri, extras);"
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2421"
+            line="2427"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.setPlaybackSpeed(speed);"
         errorLine2="                             ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2489"
+            line="2495"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class android.support.v4.media.session.MediaControllerCompat.TransportControlsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mControlsFwk.playFromUri(uri, extras);"
         errorLine2="                             ~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="2531"
+            line="2537"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        MediaDescription.Builder bob = new MediaDescription.Builder();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setMediaId(mMediaId);"
         errorLine2="            ~~~~~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setTitle(mTitle);"
         errorLine2="            ~~~~~~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setSubtitle(mSubtitle);"
         errorLine2="            ~~~~~~~~~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setDescription(mDescription);"
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setIconBitmap(mIcon);"
         errorLine2="            ~~~~~~~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setIconUri(mIconUri);"
         errorLine2="            ~~~~~~~~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bob.setExtras(extras);"
         errorLine2="            ~~~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setMediaUri(mMediaUri);"
         errorLine2="                ~~~~~~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mDescriptionFwk = bob.build();"
         errorLine2="                              ~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setMediaId(description.getMediaId());"
         errorLine2="                                       ~~~~~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setTitle(description.getTitle());"
         errorLine2="                                     ~~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setSubtitle(description.getSubtitle());"
         errorLine2="                                        ~~~~~~~~~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setDescription(description.getDescription());"
         errorLine2="                                           ~~~~~~~~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setIconBitmap(description.getIconBitmap());"
         errorLine2="                                          ~~~~~~~~~~~~~">
         <location
@@ -530,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bob.setIconUri(description.getIconUri());"
         errorLine2="                                       ~~~~~~~~~~">
         <location
@@ -541,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Bundle extras = description.getExtras();"
         errorLine2="                                        ~~~~~~~~~">
         <location
@@ -552,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class android.support.v4.media.MediaDescriptionCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class android.support.v4.media.MediaDescriptionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                bob.setMediaUri(description.getMediaUri());"
         errorLine2="                                            ~~~~~~~~~~~">
         <location
@@ -563,74 +563,74 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class android.support.v4.media.session.MediaSessionCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class android.support.v4.media.session.MediaSessionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new MediaSession(context, tag, sessionInfo);"
         errorLine2="                   ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="603"
+            line="613"
             column="20"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaSessionCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaSessionCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new MediaSession(context, tag);"
         errorLine2="                   ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="605"
+            line="615"
             column="20"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mItemFwk = new MediaSession.QueueItem("
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2220"
+            line="2231"
             column="24"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Object descriptionObj = queueItemObj.getDescription();"
         errorLine2="                                                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2241"
+            line="2252"
             column="50"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.MediaSessionCompat.QueueItem is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            long id = queueItemObj.getQueueId();"
         errorLine2="                                   ~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2244"
+            line="2255"
             column="36"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class android.support.v4.media.session.MediaSessionCompat.MediaSessionImplApi21 is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class android.support.v4.media.session.MediaSessionCompat.MediaSessionImplApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mSessionFwk.setRatingType(type);"
         errorLine2="                            ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="3963"
+            line="3974"
             column="29"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.media.app.NotificationCompat.MediaStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.media.app.NotificationCompat.MediaStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.getBuilder().setStyle("
         errorLine2="                                     ~~~~~~~~">
         <location
@@ -640,8 +640,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.app.NotificationCompat.MediaStyle is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.app.NotificationCompat.MediaStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        fillInMediaStyle(new Notification.MediaStyle()));"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -651,8 +651,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.app.NotificationCompat.MediaStyle is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.app.NotificationCompat.MediaStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                style.setShowActionsInCompactView(mActionsToShowInCompact);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -662,8 +662,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.app.NotificationCompat.MediaStyle is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.app.NotificationCompat.MediaStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                style.setMediaSession((MediaSession.Token) mToken.getToken());"
         errorLine2="                      ~~~~~~~~~~~~~~~">
         <location
@@ -673,8 +673,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 15, the call containing class androidx.media.app.NotificationCompat.MediaStyle is not annotated with @RequiresApi(x) where x is at least 15. Either annotate the containing class with at least @RequiresApi(15) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(15)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 15; however, the containing class androidx.media.app.NotificationCompat.MediaStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                button.setContentDescription(R.id.action0, action.getTitle());"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -684,8 +684,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.getBuilder().setStyle("
         errorLine2="                                     ~~~~~~~~">
         <location
@@ -695,8 +695,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        fillInMediaStyle(new Notification.DecoratedMediaCustomViewStyle()));"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -706,8 +706,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            List&lt;PlaybackState.CustomAction> customActionFwks = stateFwk.getCustomActions();"
         errorLine2="                                                                         ~~~~~~~~~~~~~~~~">
         <location
@@ -717,8 +717,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                extras = stateFwk.getExtras();"
         errorLine2="                                  ~~~~~~~~~">
         <location
@@ -728,8 +728,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getState(),"
         errorLine2="                             ~~~~~~~~">
         <location
@@ -739,8 +739,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getPosition(),"
         errorLine2="                             ~~~~~~~~~~~">
         <location
@@ -750,8 +750,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getBufferedPosition(),"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -761,8 +761,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getPlaybackSpeed(),"
         errorLine2="                             ~~~~~~~~~~~~~~~~">
         <location
@@ -772,8 +772,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getActions(),"
         errorLine2="                             ~~~~~~~~~~">
         <location
@@ -783,8 +783,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getErrorMessage(),"
         errorLine2="                             ~~~~~~~~~~~~~~~">
         <location
@@ -794,8 +794,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getLastPositionUpdateTime(),"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -805,8 +805,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    stateFwk.getActiveQueueItemId(),"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -816,8 +816,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            PlaybackState.Builder builder = new PlaybackState.Builder();"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -827,8 +827,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setState(mState, mPosition, mSpeed, mUpdateTime);"
         errorLine2="                    ~~~~~~~~">
         <location
@@ -838,8 +838,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setBufferedPosition(mBufferedPosition);"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -849,8 +849,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setActions(mActions);"
         errorLine2="                    ~~~~~~~~~~">
         <location
@@ -860,8 +860,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setErrorMessage(mErrorMessage);"
         errorLine2="                    ~~~~~~~~~~~~~~~">
         <location
@@ -871,8 +871,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.addCustomAction("
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
@@ -882,8 +882,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setActiveQueueItemId(mActiveItemId);"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -893,8 +893,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 22, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 22. Either annotate the containing class with at least @RequiresApi(22) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(22)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 22; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.setExtras(mExtras);"
         errorLine2="                        ~~~~~~~~~">
         <location
@@ -904,8 +904,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mStateFwk = builder.build();"
         errorLine2="                                ~~~~~">
         <location
@@ -915,8 +915,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Bundle extras = customActionFwk.getExtras();"
         errorLine2="                                            ~~~~~~~~~">
         <location
@@ -926,8 +926,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            customActionFwk.getAction(),"
         errorLine2="                                            ~~~~~~~~~">
         <location
@@ -937,8 +937,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            customActionFwk.getName(),"
         errorLine2="                                            ~~~~~~~">
         <location
@@ -948,8 +948,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            customActionFwk.getIcon(),"
         errorLine2="                                            ~~~~~~~">
         <location
@@ -959,8 +959,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            PlaybackState.CustomAction.Builder builder = new PlaybackState.CustomAction.Builder("
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -970,8 +970,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setExtras(mExtras);"
         errorLine2="                    ~~~~~~~~~">
         <location
@@ -981,8 +981,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class android.support.v4.media.session.PlaybackStateCompat.CustomAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return builder.build();"
         errorLine2="                           ~~~~~">
         <location
@@ -992,8 +992,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int ratingStyle = ((Rating) ratingObj).getRatingStyle();"
         errorLine2="                                                         ~~~~~~~~~~~~~~">
         <location
@@ -1003,8 +1003,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (((Rating) ratingObj).isRated()) {"
         errorLine2="                                     ~~~~~~~">
         <location
@@ -1014,8 +1014,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        rating = newHeartRating(((Rating) ratingObj).hasHeart());"
         errorLine2="                                                                     ~~~~~~~~">
         <location
@@ -1025,8 +1025,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        rating = newThumbRating(((Rating) ratingObj).isThumbUp());"
         errorLine2="                                                                     ~~~~~~~~~">
         <location
@@ -1036,8 +1036,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                ((Rating) ratingObj).getStarRating());"
         errorLine2="                                                     ~~~~~~~~~~~~~">
         <location
@@ -1047,8 +1047,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                ((Rating) ratingObj).getPercentRating());"
         errorLine2="                                                     ~~~~~~~~~~~~~~~~">
         <location
@@ -1058,8 +1058,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mRatingObj = Rating.newHeartRating(hasHeart());"
         errorLine2="                                            ~~~~~~~~~~~~~~">
         <location
@@ -1069,8 +1069,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mRatingObj = Rating.newThumbRating(isThumbUp());"
         errorLine2="                                            ~~~~~~~~~~~~~~">
         <location
@@ -1080,8 +1080,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mRatingObj = Rating.newStarRating(mRatingStyle,"
         errorLine2="                                            ~~~~~~~~~~~~~">
         <location
@@ -1091,8 +1091,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mRatingObj = Rating.newPercentageRating(getPercentRating());"
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1102,8 +1102,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class android.support.v4.media.RatingCompat is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class android.support.v4.media.RatingCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mRatingObj = Rating.newUnratedRating(mRatingStyle);"
         errorLine2="                                    ~~~~~~~~~~~~~~~~">
         <location
@@ -1113,8 +1113,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media.VolumeProviderCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media.VolumeProviderCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            volumeProviderFwk.setCurrentVolume(currentVolume);"
         errorLine2="                              ~~~~~~~~~~~~~~~~">
         <location
@@ -1533,39 +1533,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 sendResult(T result) {"
-        errorLine2="                               ~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="848"
-            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 void sendProgressUpdate(Bundle extras) {"
-        errorLine2="                                       ~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="863"
-            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 sendError(Bundle extras) {"
-        errorLine2="                              ~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="878"
-            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 attachToBaseContext(Context base) {"
         errorLine2="                                    ~~~~~~~">
         <location
@@ -1746,7 +1713,7 @@
         errorLine2="                          ~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="103"
+            line="106"
             column="27"/>
     </issue>
 
@@ -1757,7 +1724,7 @@
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="103"
+            line="106"
             column="44"/>
     </issue>
 
@@ -1768,7 +1735,7 @@
         errorLine2="                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="188"
+            line="191"
             column="19"/>
     </issue>
 
@@ -1779,7 +1746,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="188"
+            line="191"
             column="41"/>
     </issue>
 
@@ -1790,7 +1757,7 @@
         errorLine2="                                                                               ~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="188"
+            line="191"
             column="80"/>
     </issue>
 
@@ -1801,7 +1768,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="221"
+            line="224"
             column="19"/>
     </issue>
 
@@ -1812,7 +1779,7 @@
         errorLine2="                                                              ~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="221"
+            line="224"
             column="63"/>
     </issue>
 
@@ -1823,7 +1790,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="254"
+            line="258"
             column="19"/>
     </issue>
 
@@ -1834,7 +1801,7 @@
         errorLine2="                                                              ~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="254"
+            line="258"
             column="63"/>
     </issue>
 
@@ -1845,7 +1812,7 @@
         errorLine2="            ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="255"
+            line="259"
             column="13"/>
     </issue>
 
@@ -1856,7 +1823,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="279"
+            line="283"
             column="19"/>
     </issue>
 
@@ -1867,7 +1834,7 @@
         errorLine2="                                                                ~~~~~~~">
         <location
             file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="279"
+            line="283"
             column="65"/>
     </issue>
 
@@ -1878,7 +1845,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="161"
+            line="162"
             column="13"/>
     </issue>
 
@@ -1889,7 +1856,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="185"
+            line="186"
             column="19"/>
     </issue>
 
@@ -1900,7 +1867,7 @@
         errorLine2="                                 ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="234"
+            line="235"
             column="34"/>
     </issue>
 
@@ -1911,7 +1878,7 @@
         errorLine2="                                 ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="253"
+            line="254"
             column="34"/>
     </issue>
 
@@ -1922,7 +1889,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="271"
+            line="272"
             column="12"/>
     </issue>
 
@@ -1933,7 +1900,7 @@
         errorLine2="                                            ~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="282"
+            line="283"
             column="45"/>
     </issue>
 
@@ -1944,7 +1911,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="299"
+            line="300"
             column="12"/>
     </issue>
 
@@ -1955,7 +1922,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="308"
+            line="309"
             column="12"/>
     </issue>
 
@@ -1966,7 +1933,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="318"
+            line="319"
             column="12"/>
     </issue>
 
@@ -1977,7 +1944,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="334"
+            line="335"
             column="30"/>
     </issue>
 
@@ -1988,7 +1955,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="354"
+            line="355"
             column="30"/>
     </issue>
 
@@ -1999,7 +1966,7 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="371"
+            line="372"
             column="33"/>
     </issue>
 
@@ -2010,7 +1977,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="401"
+            line="402"
             column="12"/>
     </issue>
 
@@ -2021,7 +1988,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="408"
+            line="409"
             column="12"/>
     </issue>
 
@@ -2032,7 +1999,7 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="488"
+            line="489"
             column="12"/>
     </issue>
 
@@ -2043,7 +2010,7 @@
         errorLine2="           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="498"
+            line="499"
             column="12"/>
     </issue>
 
@@ -2054,7 +2021,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="507"
+            line="508"
             column="12"/>
     </issue>
 
@@ -2065,7 +2032,7 @@
         errorLine2="                                                             ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="575"
+            line="576"
             column="62"/>
     </issue>
 
@@ -2076,7 +2043,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="653"
+            line="654"
             column="12"/>
     </issue>
 
@@ -2087,7 +2054,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="683"
+            line="684"
             column="12"/>
     </issue>
 
@@ -2098,7 +2065,7 @@
         errorLine2="                                   ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="728"
+            line="729"
             column="36"/>
     </issue>
 
@@ -2109,7 +2076,7 @@
         errorLine2="                                                 ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="728"
+            line="729"
             column="50"/>
     </issue>
 
@@ -2120,7 +2087,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="736"
+            line="737"
             column="44"/>
     </issue>
 
@@ -2131,7 +2098,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="745"
+            line="746"
             column="39"/>
     </issue>
 
@@ -2142,7 +2109,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="756"
+            line="757"
             column="36"/>
     </issue>
 
@@ -2153,7 +2120,7 @@
         errorLine2="                                        ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="766"
+            line="767"
             column="41"/>
     </issue>
 
@@ -2164,7 +2131,7 @@
         errorLine2="                                    ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="775"
+            line="776"
             column="37"/>
     </issue>
 
@@ -2175,7 +2142,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="783"
+            line="784"
             column="40"/>
     </issue>
 
@@ -2186,7 +2153,7 @@
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="821"
+            line="823"
             column="16"/>
     </issue>
 
@@ -2197,7 +2164,7 @@
         errorLine2="                                                ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1168"
+            line="1174"
             column="49"/>
     </issue>
 
@@ -2208,7 +2175,7 @@
         errorLine2="                                                                ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1168"
+            line="1174"
             column="65"/>
     </issue>
 
@@ -2219,7 +2186,7 @@
         errorLine2="                                               ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1180"
+            line="1186"
             column="48"/>
     </issue>
 
@@ -2230,7 +2197,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1180"
+            line="1186"
             column="62"/>
     </issue>
 
@@ -2241,7 +2208,7 @@
         errorLine2="                                            ~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1191"
+            line="1197"
             column="45"/>
     </issue>
 
@@ -2252,7 +2219,7 @@
         errorLine2="                                                     ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1191"
+            line="1197"
             column="54"/>
     </issue>
 
@@ -2263,7 +2230,7 @@
         errorLine2="                                             ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1205"
+            line="1211"
             column="46"/>
     </issue>
 
@@ -2274,7 +2241,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1205"
+            line="1211"
             column="62"/>
     </issue>
 
@@ -2285,7 +2252,7 @@
         errorLine2="                                            ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1216"
+            line="1222"
             column="45"/>
     </issue>
 
@@ -2296,7 +2263,7 @@
         errorLine2="                                                          ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1216"
+            line="1222"
             column="59"/>
     </issue>
 
@@ -2307,7 +2274,7 @@
         errorLine2="                                         ~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1225"
+            line="1231"
             column="42"/>
     </issue>
 
@@ -2318,7 +2285,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1225"
+            line="1231"
             column="51"/>
     </issue>
 
@@ -2329,7 +2296,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1281"
+            line="1287"
             column="40"/>
     </issue>
 
@@ -2340,7 +2307,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1295"
+            line="1301"
             column="40"/>
     </issue>
 
@@ -2351,7 +2318,7 @@
         errorLine2="                                                            ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1295"
+            line="1301"
             column="61"/>
     </issue>
 
@@ -2362,7 +2329,7 @@
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1341"
+            line="1347"
             column="47"/>
     </issue>
 
@@ -2373,7 +2340,7 @@
         errorLine2="                ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1342"
+            line="1348"
             column="17"/>
     </issue>
 
@@ -2384,7 +2351,7 @@
         errorLine2="                                              ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1360"
+            line="1366"
             column="47"/>
     </issue>
 
@@ -2395,7 +2362,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1360"
+            line="1366"
             column="62"/>
     </issue>
 
@@ -2923,7 +2890,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="619"
+            line="629"
             column="29"/>
     </issue>
 
@@ -2934,7 +2901,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="635"
+            line="645"
             column="29"/>
     </issue>
 
@@ -2945,7 +2912,7 @@
         errorLine2="                                               ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="635"
+            line="645"
             column="48"/>
     </issue>
 
@@ -2956,7 +2923,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="651"
+            line="661"
             column="36"/>
     </issue>
 
@@ -2967,7 +2934,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="668"
+            line="678"
             column="40"/>
     </issue>
 
@@ -2978,7 +2945,7 @@
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="710"
+            line="720"
             column="37"/>
     </issue>
 
@@ -2989,7 +2956,7 @@
         errorLine2="                                 ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="754"
+            line="764"
             column="34"/>
     </issue>
 
@@ -3000,7 +2967,7 @@
         errorLine2="                                               ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="754"
+            line="764"
             column="48"/>
     </issue>
 
@@ -3011,7 +2978,7 @@
         errorLine2="           ~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="784"
+            line="794"
             column="12"/>
     </issue>
 
@@ -3022,7 +2989,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="794"
+            line="804"
             column="12"/>
     </issue>
 
@@ -3033,7 +3000,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="803"
+            line="813"
             column="34"/>
     </issue>
 
@@ -3044,7 +3011,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="815"
+            line="825"
             column="29"/>
     </issue>
 
@@ -3055,7 +3022,7 @@
         errorLine2="                         ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="831"
+            line="841"
             column="26"/>
     </issue>
 
@@ -3066,7 +3033,7 @@
         errorLine2="                              ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="855"
+            line="865"
             column="31"/>
     </issue>
 
@@ -3077,7 +3044,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="924"
+            line="934"
             column="27"/>
     </issue>
 
@@ -3088,7 +3055,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="938"
+            line="948"
             column="12"/>
     </issue>
 
@@ -3099,7 +3066,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="952"
+            line="962"
             column="12"/>
     </issue>
 
@@ -3110,7 +3077,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="988"
+            line="998"
             column="12"/>
     </issue>
 
@@ -3121,7 +3088,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="999"
+            line="1009"
             column="43"/>
     </issue>
 
@@ -3132,7 +3099,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1012"
+            line="1022"
             column="46"/>
     </issue>
 
@@ -3143,7 +3110,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1035"
+            line="1045"
             column="19"/>
     </issue>
 
@@ -3154,7 +3121,7 @@
         errorLine2="                                                      ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1035"
+            line="1045"
             column="55"/>
     </issue>
 
@@ -3165,7 +3132,7 @@
         errorLine2="                                                                       ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1035"
+            line="1045"
             column="72"/>
     </issue>
 
@@ -3176,7 +3143,7 @@
         errorLine2="                              ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1168"
+            line="1178"
             column="31"/>
     </issue>
 
@@ -3187,7 +3154,7 @@
         errorLine2="                                              ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1168"
+            line="1178"
             column="47"/>
     </issue>
 
@@ -3198,7 +3165,7 @@
         errorLine2="                                                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1168"
+            line="1178"
             column="62"/>
     </issue>
 
@@ -3209,7 +3176,7 @@
         errorLine2="                                          ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1182"
+            line="1192"
             column="43"/>
     </issue>
 
@@ -3220,7 +3187,7 @@
         errorLine2="                                         ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1275"
+            line="1285"
             column="42"/>
     </issue>
 
@@ -3231,7 +3198,7 @@
         errorLine2="                                                         ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1275"
+            line="1285"
             column="58"/>
     </issue>
 
@@ -3242,7 +3209,7 @@
         errorLine2="                                        ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1285"
+            line="1295"
             column="41"/>
     </issue>
 
@@ -3253,7 +3220,7 @@
         errorLine2="                                                      ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1285"
+            line="1295"
             column="55"/>
     </issue>
 
@@ -3264,7 +3231,7 @@
         errorLine2="                                     ~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1293"
+            line="1303"
             column="38"/>
     </issue>
 
@@ -3275,7 +3242,7 @@
         errorLine2="                                              ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1293"
+            line="1303"
             column="47"/>
     </issue>
 
@@ -3286,7 +3253,7 @@
         errorLine2="                                      ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1306"
+            line="1316"
             column="39"/>
     </issue>
 
@@ -3297,7 +3264,7 @@
         errorLine2="                                                      ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1306"
+            line="1316"
             column="55"/>
     </issue>
 
@@ -3308,7 +3275,7 @@
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1315"
+            line="1325"
             column="38"/>
     </issue>
 
@@ -3319,7 +3286,7 @@
         errorLine2="                                                   ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1315"
+            line="1325"
             column="52"/>
     </issue>
 
@@ -3330,7 +3297,7 @@
         errorLine2="                                  ~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1321"
+            line="1331"
             column="35"/>
     </issue>
 
@@ -3341,7 +3308,7 @@
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1321"
+            line="1331"
             column="44"/>
     </issue>
 
@@ -3352,7 +3319,7 @@
         errorLine2="                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1380"
+            line="1390"
             column="33"/>
     </issue>
 
@@ -3363,7 +3330,7 @@
         errorLine2="                                ~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1389"
+            line="1399"
             column="33"/>
     </issue>
 
@@ -3374,7 +3341,7 @@
         errorLine2="                                                     ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1389"
+            line="1399"
             column="54"/>
     </issue>
 
@@ -3385,7 +3352,7 @@
         errorLine2="                                   ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1460"
+            line="1470"
             column="36"/>
     </issue>
 
@@ -3396,7 +3363,7 @@
         errorLine2="                                                  ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1460"
+            line="1470"
             column="51"/>
     </issue>
 
@@ -3407,7 +3374,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1470"
+            line="1480"
             column="36"/>
     </issue>
 
@@ -3418,7 +3385,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1482"
+            line="1492"
             column="36"/>
     </issue>
 
@@ -3429,7 +3396,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1493"
+            line="1503"
             column="39"/>
     </issue>
 
@@ -3440,7 +3407,7 @@
         errorLine2="                      ~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1953"
+            line="1964"
             column="23"/>
     </issue>
 
@@ -3451,7 +3418,7 @@
         errorLine2="                                      ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1953"
+            line="1964"
             column="39"/>
     </issue>
 
@@ -3462,7 +3429,7 @@
         errorLine2="                      ~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1971"
+            line="1982"
             column="23"/>
     </issue>
 
@@ -3473,7 +3440,7 @@
         errorLine2="                                      ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1971"
+            line="1982"
             column="39"/>
     </issue>
 
@@ -3484,7 +3451,7 @@
         errorLine2="                                                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1971"
+            line="1982"
             column="53"/>
     </issue>
 
@@ -3495,7 +3462,7 @@
         errorLine2="                                  ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1988"
+            line="1999"
             column="35"/>
     </issue>
 
@@ -3506,7 +3473,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2032"
+            line="2043"
             column="16"/>
     </issue>
 
@@ -3517,7 +3484,7 @@
         errorLine2="               ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2040"
+            line="2051"
             column="16"/>
     </issue>
 
@@ -3528,7 +3495,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2050"
+            line="2061"
             column="36"/>
     </issue>
 
@@ -3539,7 +3506,7 @@
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2060"
+            line="2071"
             column="16"/>
     </issue>
 
@@ -3550,7 +3517,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2070"
+            line="2081"
             column="38"/>
     </issue>
 
@@ -3561,7 +3528,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2080"
+            line="2091"
             column="16"/>
     </issue>
 
@@ -3572,7 +3539,7 @@
         errorLine2="                      ~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2102"
+            line="2113"
             column="23"/>
     </issue>
 
@@ -3583,7 +3550,7 @@
         errorLine2="                                       ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2102"
+            line="2113"
             column="40"/>
     </issue>
 
@@ -3594,7 +3561,7 @@
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2157"
+            line="2168"
             column="26"/>
     </issue>
 
@@ -3605,7 +3572,7 @@
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2184"
+            line="2195"
             column="16"/>
     </issue>
 
@@ -3616,7 +3583,7 @@
         errorLine2="                                  ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2196"
+            line="2207"
             column="35"/>
     </issue>
 
@@ -3627,7 +3594,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2216"
+            line="2227"
             column="16"/>
     </issue>
 
@@ -3638,7 +3605,7 @@
         errorLine2="                      ~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2236"
+            line="2247"
             column="23"/>
     </issue>
 
@@ -3649,7 +3616,7 @@
         errorLine2="                                              ~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2236"
+            line="2247"
             column="47"/>
     </issue>
 
@@ -3660,7 +3627,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2258"
+            line="2269"
             column="23"/>
     </issue>
 
@@ -3671,7 +3638,7 @@
         errorLine2="                                                        ~~~~~~~">
         <location
             file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2258"
+            line="2269"
             column="57"/>
     </issue>
 
diff --git a/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java b/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
index 34f32cc..dfe730b 100644
--- a/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -57,6 +57,7 @@
 import androidx.media.AudioAttributesCompat;
 import androidx.media.R;
 import androidx.media.VolumeProviderCompat;
+import androidx.media.utils.MediaConstants;
 import androidx.versionedparcelable.ParcelUtils;
 import androidx.versionedparcelable.VersionedParcelable;
 
@@ -1143,9 +1144,13 @@
          * {@link #prepareFromMediaId(String, Bundle)} to indicate the stream type to be used by the
          * media player when playing or preparing the specified media id. See {@link AudioManager}
          * for a list of stream types.
+         *
+         * @deprecated Use {@link MediaConstants#TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE}
+         * instead.
          */
+        @Deprecated
         public static final String EXTRA_LEGACY_STREAM_TYPE =
-                "android.media.session.extra.LEGACY_STREAM_TYPE";
+                MediaConstants.TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE;
 
         TransportControls() {
         }
@@ -1197,9 +1202,9 @@
         public abstract void play();
 
         /**
-         * Request that the player start playback for a specific {@link Uri}.
+         * Request that the player start playback for a specific media id.
          *
-         * @param mediaId The uri of the requested media.
+         * @param mediaId The id of the requested media.
          * @param extras Optional extras that can include extra information
          *            about the media item to be played.
          */
diff --git a/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java b/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
index e255c74..5518d39 100644
--- a/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -124,6 +124,14 @@
 public class MediaSessionCompat {
     static final String TAG = "MediaSessionCompat";
 
+    // TODO(b/182513352): Use PendingIntent.FLAG_MUTABLE instead from S.
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    public static final int PENDING_INTENT_FLAG_MUTABLE =
+            Build.VERSION.CODENAME.equals("S") ? 0x02000000 : 0;
+
     private final MediaSessionImpl mImpl;
     private final MediaControllerCompat mController;
     private final ArrayList<OnActiveChangeListener> mActiveListeners = new ArrayList<>();
@@ -533,6 +541,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX) // accessed by media2-session
+    @SuppressLint("WrongConstant") // PENDING_INTENT_FLAG_MUTABLE
     public MediaSessionCompat(@NonNull Context context, @NonNull String tag,
             @Nullable ComponentName mbrComponent, @Nullable PendingIntent mbrIntent,
             @Nullable Bundle sessionInfo, @Nullable VersionedParcelable session2Token) {
@@ -557,7 +566,7 @@
             mediaButtonIntent.setComponent(mbrComponent);
             mbrIntent = PendingIntent.getBroadcast(context,
                     0/* requestCode, ignored */, mediaButtonIntent,
-                    PendingIntent.FLAG_IMMUTABLE);
+                    PENDING_INTENT_FLAG_MUTABLE);
         }
 
         if (android.os.Build.VERSION.SDK_INT >= 21) {
diff --git a/media/media/src/main/java/androidx/media/session/MediaButtonReceiver.java b/media/media/src/main/java/androidx/media/session/MediaButtonReceiver.java
index 5ef83e3..b6c2a3b 100644
--- a/media/media/src/main/java/androidx/media/session/MediaButtonReceiver.java
+++ b/media/media/src/main/java/androidx/media/session/MediaButtonReceiver.java
@@ -16,8 +16,11 @@
 
 package androidx.media.session;
 
+import static android.support.v4.media.session.MediaSessionCompat.PENDING_INTENT_FLAG_MUTABLE;
+
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
+import android.annotation.SuppressLint;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.BroadcastReceiver;
@@ -251,6 +254,7 @@
      * @return Created pending intent, or null if the given component name is null or the
      *         {@code action} is unsupported/invalid.
      */
+    @SuppressLint("WrongConstant") // PENDING_INTENT_FLAG_MUTABLE
     public static PendingIntent buildMediaButtonPendingIntent(Context context,
             ComponentName mbrComponent, @MediaKeyAction long action) {
         if (mbrComponent == null) {
@@ -269,7 +273,7 @@
         if (Build.VERSION.SDK_INT >= 16) {
             intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         }
-        return PendingIntent.getBroadcast(context, keyCode, intent, PendingIntent.FLAG_IMMUTABLE);
+        return PendingIntent.getBroadcast(context, keyCode, intent, PENDING_INTENT_FLAG_MUTABLE);
     }
 
     /**
diff --git a/media/media/src/main/java/androidx/media/utils/MediaConstants.java b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
index 5fa578f..8d81004 100644
--- a/media/media/src/main/java/androidx/media/utils/MediaConstants.java
+++ b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
@@ -125,6 +125,23 @@
             "androidx.media.MediaMetadatCompat.METADATA_KEY_CONTENT_ID";
 
     /**
+     * Bundle key used for next episode's media content ID in {@link MediaMetadataCompat metadata},
+     * following the same ID and format provided to
+     * <a href="https://developers.google.com/actions/media">Media Actions Catalog</a> in reference
+     * to the next episode of the current title episode. Google uses this information to allow users
+     * to resume watching the next episode of this title on your app once the current episode ends
+     * across the supported surfaces (e.g., Android TV's Play Next row). This can be left blank for
+     * movies.
+     *
+     * <p>TYPE: String
+     *
+     * @see MediaMetadataCompat
+     */
+    @SuppressLint("IntentName")
+    public static final String METADATA_KEY_NEXT_EPISODE_CONTENT_ID =
+            "androidx.media.MediaMetadatCompat.METADATA_KEY_NEXT_EPISODE_CONTENT_ID";
+
+    /**
      * Key sent through a key-value mapping in {@link MediaMetadataCompat#getLong(String)} or in the
      * {@link MediaDescriptionCompat#getExtras()} bundle to the hosting {@link MediaBrowserCompat}
      * to indicate that the corresponding {@link MediaMetadataCompat} or {@link
@@ -448,5 +465,53 @@
     public static final String PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT =
             "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
 
+    /**
+     * Bundle key passed through the {@code extras} of
+     * {@link MediaControllerCompat.TransportControls#prepareFromMediaId(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#prepareFromSearch(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#prepareFromUri(Uri, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#playFromMediaId(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#playFromSearch(String, Bundle)}, or
+     * {@link MediaControllerCompat.TransportControls#playFromUri(Uri, Bundle)} to indicate the
+     * stream type to be used by the session when playing or preparing the media.
+     *
+     * <p>TYPE: int
+     *
+     * @see MediaControllerCompat.TransportControls#prepareFromMediaId(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#prepareFromSearch(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#prepareFromUri(Uri, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromMediaId(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromSearch(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromUri(Uri, Bundle)
+     */
+    @SuppressLint("IntentName")
+    public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_LEGACY_STREAM_TYPE =
+            "android.media.session.extra.LEGACY_STREAM_TYPE";
+
+    /**
+     * Bundle key passed through the {@code extras} of
+     * {@link MediaControllerCompat.TransportControls#prepareFromMediaId(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#prepareFromSearch(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#prepareFromUri(Uri, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#playFromMediaId(String, Bundle)},
+     * {@link MediaControllerCompat.TransportControls#playFromSearch(String, Bundle)}, or
+     * {@link MediaControllerCompat.TransportControls#playFromUri(Uri, Bundle)} to indicate whether
+     * the session should shuffle the media to be played or not. The extra parameter is limited to
+     * the current request and doesn't affect the {@link MediaSessionCompat#setShuffleMode(int)
+     * shuffle mode}.
+     *
+     * <p>TYPE: boolean
+     *
+     * @see MediaControllerCompat.TransportControls#prepareFromMediaId(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#prepareFromSearch(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#prepareFromUri(Uri, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromMediaId(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromSearch(String, Bundle)
+     * @see MediaControllerCompat.TransportControls#playFromUri(Uri, Bundle)
+     */
+    @SuppressLint("IntentName")
+    public static final String TRANSPORT_CONTROLS_EXTRAS_KEY_SHUFFLE =
+            "androidx.media.MediaControllerCompat.TransportControls.extras.KEY_SHUFFLE";
+
     private MediaConstants() {}
 }
diff --git a/media/version-compat-tests/current/client/lint-baseline.xml b/media/version-compat-tests/current/client/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media/version-compat-tests/current/client/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media/version-compat-tests/current/service/lint-baseline.xml b/media/version-compat-tests/current/service/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media/version-compat-tests/current/service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media/version-compat-tests/lib/lint-baseline.xml b/media/version-compat-tests/lib/lint-baseline.xml
index bf2fbe4..01c5c6f 100644
--- a/media/version-compat-tests/lib/lint-baseline.xml
+++ b/media/version-compat-tests/lib/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/media/version-compat-tests/previous/client/lint-baseline.xml b/media/version-compat-tests/previous/client/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media/version-compat-tests/previous/client/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media/version-compat-tests/previous/service/lint-baseline.xml b/media/version-compat-tests/previous/service/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media/version-compat-tests/previous/service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/integration-tests/testapp/lint-baseline.xml b/media2/integration-tests/testapp/lint-baseline.xml
index e20fbbb..290fbc9 100644
--- a/media2/integration-tests/testapp/lint-baseline.xml
+++ b/media2/integration-tests/testapp/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.integration.testapp.VideoSelectorActivity is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.integration.testapp.VideoSelectorActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.integration.testapp.VideoSelectorActivity is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.integration.testapp.VideoSelectorActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},"
         errorLine2="                ~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/media2/integration-tests/testapp/src/main/res/values/strings.xml b/media2/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from media2/integration-tests/testapp/src/main/res/values/strings.xml
rename to media2/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/media2/media2-common/build.gradle b/media2/media2-common/build.gradle
index 45d8b15..e128665 100644
--- a/media2/media2-common/build.gradle
+++ b/media2/media2-common/build.gradle
@@ -38,7 +38,7 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":internal-testutils-runtime"))
     annotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
diff --git a/media2/media2-common/lint-baseline.xml b/media2/media2-common/lint-baseline.xml
index d6cc293..990d3cb 100644
--- a/media2/media2-common/lint-baseline.xml
+++ b/media2/media2-common/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.common.MediaMetadata.BitmapEntry is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.common.MediaMetadata.BitmapEntry is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return bitmap.getAllocationByteCount();"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/media2/media2-exoplayer/build.gradle b/media2/media2-exoplayer/build.gradle
index 8630348..c015b9a 100644
--- a/media2/media2-exoplayer/build.gradle
+++ b/media2/media2-exoplayer/build.gradle
@@ -26,10 +26,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
diff --git a/media2/media2-exoplayer/lint-baseline.xml b/media2/media2-exoplayer/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media2/media2-exoplayer/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/media2-player/build.gradle b/media2/media2-player/build.gradle
index 73f080a..cfd7110 100644
--- a/media2/media2-player/build.gradle
+++ b/media2/media2-player/build.gradle
@@ -39,7 +39,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":internal-testutils-runtime"))
     annotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
diff --git a/media2/media2-player/lint-baseline.xml b/media2/media2-player/lint-baseline.xml
index b03e7a8..65b02c9 100644
--- a/media2/media2-player/lint-baseline.xml
+++ b/media2/media2-player/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.ExoPlayerWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.ExoPlayerWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PersistableBundle bundle = new PersistableBundle();"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.ExoPlayerWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.ExoPlayerWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bundle.putString(MediaPlayer2.MetricsConstants.MIME_TYPE_VIDEO, primaryVideoMimeType);"
         errorLine2="                   ~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.ExoPlayerWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.ExoPlayerWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            bundle.putString(MediaPlayer2.MetricsConstants.MIME_TYPE_AUDIO, primaryAudioMimeType);"
         errorLine2="                   ~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.ExoPlayerWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.ExoPlayerWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bundle.putLong(MediaPlayer2.MetricsConstants.DURATION,"
         errorLine2="               ~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.ExoPlayerWrapper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.ExoPlayerWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        bundle.putLong(MediaPlayer2.MetricsConstants.PLAYING, playingTimeMs);"
         errorLine2="               ~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.FileDescriptorUtil is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.FileDescriptorUtil is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return Os.dup(fileDescriptor);"
         errorLine2="                      ~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.FileDescriptorUtil is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.FileDescriptorUtil is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Os.lseek(fileDescriptor, position, /* whence= */ OsConstants.SEEK_SET);"
         errorLine2="               ~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.player.FileDescriptorUtil is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.player.FileDescriptorUtil is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Os.close(fileDescriptor);"
         errorLine2="               ~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.MediaTimestamp is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.MediaTimestamp is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mMediaTimeUs = timestamp.getAnchorMediaTimeUs();"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.MediaTimestamp is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.MediaTimestamp is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mNanoTime = timestamp.getAnchorSytemNanoTime();"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.MediaTimestamp is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.MediaTimestamp is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mClockRate = timestamp.getMediaClockRate();"
         errorLine2="                               ~~~~~~~~~~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return mPlaybackParams.getAudioFallbackMode();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return mPlaybackParams.getPitch();"
         errorLine2="                                       ~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return mPlaybackParams.getSpeed();"
         errorLine2="                                       ~~~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPlaybackParams = new android.media.PlaybackParams();"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPlaybackParams.setAudioFallbackMode(audioFallbackMode);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPlaybackParams.setPitch(pitch);"
         errorLine2="                                ~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.PlaybackParams.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.PlaybackParams.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPlaybackParams.setSpeed(speed);"
         errorLine2="                                ~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.TimedMetaData is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.TimedMetaData is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mTimestampUs = timedMetaData.getTimestamp();"
         errorLine2="                                     ~~~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.player.TimedMetaData is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.player.TimedMetaData is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mMetaData = timedMetaData.getMetaData();"
         errorLine2="                                  ~~~~~~~~~~~">
         <location
diff --git a/media2/media2-player/src/androidTest/java/androidx/media2/player/MediaPlayer2Test.java b/media2/media2-player/src/androidTest/java/androidx/media2/player/MediaPlayer2Test.java
index e51f2fa..d39c2ad 100644
--- a/media2/media2-player/src/androidTest/java/androidx/media2/player/MediaPlayer2Test.java
+++ b/media2/media2-player/src/androidTest/java/androidx/media2/player/MediaPlayer2Test.java
@@ -50,6 +50,7 @@
 import androidx.media2.player.TestUtils.Monitor;
 import androidx.media2.player.test.R;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
@@ -1089,6 +1090,7 @@
     }
     */
 
+    @FlakyTest(bugId = 187340262)
     @Test
     @LargeTest
     public void playbackRate() throws Exception {
diff --git a/media2/media2-session/build.gradle b/media2/media2-session/build.gradle
index 4aa0edb..47e3b2e 100644
--- a/media2/media2-session/build.gradle
+++ b/media2/media2-session/build.gradle
@@ -37,7 +37,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":internal-testutils-runtime"))
     annotationProcessor(project(":versionedparcelable:versionedparcelable-compiler"))
 }
diff --git a/media2/media2-session/lint-baseline.xml b/media2/media2-session/lint-baseline.xml
index 55357ba..0b8f1f2 100644
--- a/media2/media2-session/lint-baseline.xml
+++ b/media2/media2-session/lint-baseline.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.media2.session.MediaControllerImplLegacy is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.media2.session.MediaControllerImplLegacy is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mHandlerThread.quitSafely();"
         errorLine2="                               ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaControllerImplLegacy.java"
-            line="199"
+            line="208"
             column="32"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media2.session.MediaNotificationHandler is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media2.session.MediaNotificationHandler is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return PendingIntent.getForegroundService("
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media2.session.MediaNotificationHandler is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media2.session.MediaNotificationHandler is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                || mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) != null) {"
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media2.session.MediaNotificationHandler is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media2.session.MediaNotificationHandler is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media2.session.MediaNotificationHandler is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media2.session.MediaNotificationHandler is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mNotificationManager.createNotificationChannel(channel);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,41 +57,41 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.media2.session.MediaSessionImplBase is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.media2.session.MediaSessionImplBase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mMediaButtonIntent = PendingIntent.getForegroundService(mContext, 0, intent, 0);"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaSessionImplBase.java"
-            line="222"
+            line="210"
             column="52"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.media2.session.MediaSessionImplBase is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.media2.session.MediaSessionImplBase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (Build.VERSION.SDK_INT >= 21 &amp;&amp; mAudioManager.isVolumeFixed()) {"
         errorLine2="                                                             ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaSessionImplBase.java"
-            line="317"
+            line="262"
             column="62"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.media2.session.MediaSessionImplBase is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.media2.session.MediaSessionImplBase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mHandlerThread.quitSafely();"
         errorLine2="                               ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaSessionImplBase.java"
-            line="386"
+            line="313"
             column="32"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.media2.session.SessionToken is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.media2.session.SessionToken is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            thread.quitSafely();"
         errorLine2="                   ~~~~~~~~~~">
         <location
@@ -107,7 +107,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaController.java"
-            line="1313"
+            line="1377"
             column="29"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="           ~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaLibraryService.java"
-            line="483"
+            line="505"
             column="12"/>
     </issue>
 
@@ -151,7 +151,7 @@
         errorLine2="                  ~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="284"
+            line="286"
             column="19"/>
     </issue>
 
@@ -162,7 +162,7 @@
         errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="284"
+            line="286"
             column="48"/>
     </issue>
 
@@ -173,7 +173,7 @@
         errorLine2="                  ~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="298"
+            line="300"
             column="19"/>
     </issue>
 
@@ -184,51 +184,7 @@
         errorLine2="                                               ~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="298"
-            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 static MediaItem convertToMediaItem(MediaMetadataCompat metadataCompat) {"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="314"
-            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 MediaItem convertToMediaItem(MediaMetadataCompat metadataCompat) {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="314"
-            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 static MediaItem convertToMediaItem(MediaDescriptionCompat descriptionCompat) {"
-        errorLine2="                  ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="349"
-            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 MediaItem convertToMediaItem(MediaDescriptionCompat descriptionCompat) {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="349"
+            line="300"
             column="48"/>
     </issue>
 
@@ -239,7 +195,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="360"
+            line="367"
             column="19"/>
     </issue>
 
@@ -250,7 +206,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="361"
+            line="368"
             column="13"/>
     </issue>
 
@@ -261,7 +217,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="375"
+            line="382"
             column="19"/>
     </issue>
 
@@ -272,7 +228,7 @@
         errorLine2="                                                                      ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="375"
+            line="382"
             column="71"/>
     </issue>
 
@@ -283,7 +239,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="392"
+            line="399"
             column="19"/>
     </issue>
 
@@ -294,7 +250,7 @@
         errorLine2="                                                                      ~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="392"
+            line="399"
             column="71"/>
     </issue>
 
@@ -305,7 +261,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="403"
+            line="410"
             column="19"/>
     </issue>
 
@@ -316,7 +272,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="403"
+            line="410"
             column="58"/>
     </issue>
 
@@ -327,7 +283,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="437"
+            line="444"
             column="19"/>
     </issue>
 
@@ -338,7 +294,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="438"
+            line="445"
             column="13"/>
     </issue>
 
@@ -349,7 +305,7 @@
         errorLine2="                                         ~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="458"
+            line="465"
             column="42"/>
     </issue>
 
@@ -360,7 +316,7 @@
         errorLine2="                                                                          ~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="458"
+            line="465"
             column="75"/>
     </issue>
 
@@ -371,7 +327,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="553"
+            line="560"
             column="19"/>
     </issue>
 
@@ -382,7 +338,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="553"
+            line="560"
             column="56"/>
     </issue>
 
@@ -393,7 +349,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="570"
+            line="577"
             column="19"/>
     </issue>
 
@@ -404,7 +360,7 @@
         errorLine2="                                                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="570"
+            line="577"
             column="68"/>
     </issue>
 
@@ -415,7 +371,7 @@
         errorLine2="                  ~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="605"
+            line="612"
             column="19"/>
     </issue>
 
@@ -426,7 +382,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="605"
+            line="612"
             column="42"/>
     </issue>
 
@@ -437,7 +393,7 @@
         errorLine2="                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="641"
+            line="648"
             column="19"/>
     </issue>
 
@@ -448,7 +404,7 @@
         errorLine2="                                                     ~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="641"
+            line="648"
             column="54"/>
     </issue>
 
@@ -459,7 +415,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="671"
+            line="678"
             column="19"/>
     </issue>
 
@@ -470,7 +426,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="672"
+            line="679"
             column="13"/>
     </issue>
 
@@ -481,7 +437,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="687"
+            line="694"
             column="19"/>
     </issue>
 
@@ -492,7 +448,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="688"
+            line="695"
             column="13"/>
     </issue>
 
@@ -503,7 +459,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="729"
+            line="736"
             column="44"/>
     </issue>
 
@@ -514,7 +470,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="773"
+            line="780"
             column="19"/>
     </issue>
 
@@ -525,7 +481,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="774"
+            line="781"
             column="13"/>
     </issue>
 
@@ -536,7 +492,7 @@
         errorLine2="                                               ~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="784"
+            line="791"
             column="48"/>
     </issue>
 
@@ -547,7 +503,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/media2/session/MediaUtils.java"
-            line="800"
+            line="807"
             column="58"/>
     </issue>
 
diff --git a/media2/media2-session/src/main/java/androidx/media2/session/MediaConstants.java b/media2/media2-session/src/main/java/androidx/media2/session/MediaConstants.java
index de98490..5310734 100644
--- a/media2/media2-session/src/main/java/androidx/media2/session/MediaConstants.java
+++ b/media2/media2-session/src/main/java/androidx/media2/session/MediaConstants.java
@@ -17,7 +17,6 @@
 package androidx.media2.session;
 
 import android.net.Uri;
-import android.os.Bundle;
 
 /**
  * Media constants for sharing constants between media provider and consumer apps
@@ -26,14 +25,16 @@
     /**
      * A {@link android.net.Uri} scheme used in a media Uri.
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_SCHEME = "androidx";
 
     /**
      * A {@link android.net.Uri} authority used in a media Uri.
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_AUTHORITY = "media2-session";
 
@@ -41,7 +42,8 @@
      * A {@link android.net.Uri} path used by {@link android.support.v4.media.session
      * .MediaControllerCompat.TransportControls#playFromMediaId}
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_PATH_PLAY_FROM_MEDIA_ID = "playFromMediaId";
 
@@ -49,7 +51,8 @@
      * A {@link android.net.Uri} path used by {@link android.support.v4.media.session
      * .MediaControllerCompat.TransportControls#playFromSearch}
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_PATH_PLAY_FROM_SEARCH = "playFromSearch";
 
@@ -57,7 +60,8 @@
      * A {@link android.net.Uri} path used by {@link android.support.v4.media.session
      * .MediaControllerCompat.TransportControls#prepareFromMediaId}
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_PATH_PREPARE_FROM_MEDIA_ID = "prepareFromMediaId";
 
@@ -65,15 +69,16 @@
      * A {@link android.net.Uri} path used by {@link android.support.v4.media.session
      * .MediaControllerCompat.TransportControls#prepareFromSearch}
      *
-     * See {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
+     * See {@link MediaController#setMediaUri} and
+     * {@link MediaSession.SessionCallback#onSetMediaUri} for more details.
      */
     public static final String MEDIA_URI_PATH_PREPARE_FROM_SEARCH = "prepareFromSearch";
 
     /**
-     * A {@link android.net.Uri} path used by {@link MediaController#setMediaUri(Uri, Bundle)} to
-     * indicate that the Uri will be specially handled for interoperability.
+     * A {@link android.net.Uri} path for encoding how the Uri will be translated when connected
+     * to {@link android.support.v4.media.session.MediaSessionCompat}.
      *
-     * @see MediaController#setMediaUri
+     * See {@link MediaController#setMediaUri} for more details.
      */
     public static final String MEDIA_URI_PATH_SET_MEDIA_URI = "setMediaUri";
 
diff --git a/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java b/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
index dbf3cbc..6019bef 100644
--- a/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
+++ b/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
@@ -884,6 +884,15 @@
      * @see #setPlaylist
      * @see ControllerCallback#onCurrentMediaItemChanged
      * @see ControllerCallback#onPlaylistChanged
+     * @see MediaConstants#MEDIA_URI_AUTHORITY
+     * @see MediaConstants#MEDIA_URI_PATH_PREPARE_FROM_MEDIA_ID
+     * @see MediaConstants#MEDIA_URI_PATH_PLAY_FROM_MEDIA_ID
+     * @see MediaConstants#MEDIA_URI_PATH_PREPARE_FROM_SEARCH
+     * @see MediaConstants#MEDIA_URI_PATH_PLAY_FROM_SEARCH
+     * @see MediaConstants#MEDIA_URI_PATH_SET_MEDIA_URI
+     * @see MediaConstants#MEDIA_URI_QUERY_ID
+     * @see MediaConstants#MEDIA_URI_QUERY_QUERY
+     * @see MediaConstants#MEDIA_URI_QUERY_URI
      */
     @NonNull
     public ListenableFuture<SessionResult> setMediaUri(@NonNull Uri uri, @Nullable Bundle extras) {
diff --git a/media2/media2-session/version-compat-tests/common/lint-baseline.xml b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
index 6e61595..c2fe66b 100644
--- a/media2/media2-session/version-compat-tests/common/lint-baseline.xml
+++ b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.test.common.TestUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.test.common.TestUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return Objects.equals(a, b);"
         errorLine2="                           ~~~~~~">
         <location
diff --git a/media2/media2-session/version-compat-tests/current/client/lint-baseline.xml b/media2/media2-session/version-compat-tests/current/client/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media2/media2-session/version-compat-tests/current/client/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/media2-session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaControllerCompatCallbackWithMediaSessionTest.java b/media2/media2-session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaControllerCompatCallbackWithMediaSessionTest.java
index b7d0f5e..e7b4a70 100644
--- a/media2/media2-session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaControllerCompatCallbackWithMediaSessionTest.java
+++ b/media2/media2-session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/tests/MediaControllerCompatCallbackWithMediaSessionTest.java
@@ -46,6 +46,7 @@
 import androidx.media2.test.common.PollingCheck;
 import androidx.media2.test.common.TestUtils;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 
 import org.junit.After;
@@ -597,6 +598,7 @@
         assertEquals(testSeekPosition, mControllerCompat.getPlaybackState().getPosition());
     }
 
+    @FlakyTest(bugId = 187338985)
     @Test
     public void currentMediaItemChange() throws Exception {
         int testItemIndex = 3;
diff --git a/media2/media2-session/version-compat-tests/current/service/lint-baseline.xml b/media2/media2-session/version-compat-tests/current/service/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media2/media2-session/version-compat-tests/current/service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/media2-session/version-compat-tests/previous/client/lint-baseline.xml b/media2/media2-session/version-compat-tests/previous/client/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media2/media2-session/version-compat-tests/previous/client/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/media2-session/version-compat-tests/previous/service/lint-baseline.xml b/media2/media2-session/version-compat-tests/previous/service/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/media2/media2-session/version-compat-tests/previous/service/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/media2/media2-widget/build.gradle b/media2/media2-widget/build.gradle
index f26fb57..e637e6c 100644
--- a/media2/media2-widget/build.gradle
+++ b/media2/media2-widget/build.gradle
@@ -33,9 +33,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":media2:media2-player"))
 }
diff --git a/media2/media2-widget/lint-baseline.xml b/media2/media2-widget/lint-baseline.xml
index 03729b2..d7399b1 100644
--- a/media2/media2-widget/lint-baseline.xml
+++ b/media2/media2-widget/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -57,19 +57,8 @@
     </issue>
 
     <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class with non private constructor"
-        errorLine1="    static class MediaFormatUtil {"
-        errorLine2="                 ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/widget/SubtitleController.java"
-            line="275"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.CaptionStyle is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.CaptionStyle is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                captionStyle.getTypeface());"
         errorLine2="                             ~~~~~~~~~~~">
         <location
@@ -79,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.Cea708CaptionRenderer.Cea708CCWidget.CCWindowLayout is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.Cea708CaptionRenderer.Cea708CCWidget.CCWindowLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mFontScale = captioningManager.getFontScale();"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
@@ -90,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.Cea708CaptionRenderer.Cea708CCWidget.CCWindowLayout is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.Cea708CaptionRenderer.Cea708CCWidget.CCWindowLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    setCaptionStyle(new CaptionStyle(captioningManager.getUserStyle()));"
         errorLine2="                                                                       ~~~~~~~~~~~~">
         <location
@@ -101,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.ClosedCaptionWidget is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.ClosedCaptionWidget is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mCaptionStyle = new CaptionStyle(mManager.getUserStyle());"
         errorLine2="                                                      ~~~~~~~~~~~~">
         <location
@@ -112,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.ClosedCaptionWidget is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.ClosedCaptionWidget is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            fontScale = mManager.getFontScale();"
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
@@ -123,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.ClosedCaptionWidget is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.ClosedCaptionWidget is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final boolean needsListener = isAttachedToWindow() &amp;&amp; getVisibility() == View.VISIBLE;"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.ClosedCaptionWidget is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.ClosedCaptionWidget is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mManager.addCaptioningChangeListener(mCaptioningListener);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -145,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.ClosedCaptionWidget is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.ClosedCaptionWidget is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mManager.removeCaptioningChangeListener(mCaptioningListener);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.widget.SelectiveLayout is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.widget.SelectiveLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final Drawable drawable = getForeground();"
         errorLine2="                                      ~~~~~~~~~~~~~">
         <location
@@ -167,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mCaptioningManager.removeCaptioningChangeListener("
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        Locale selectedLocale = VERSION.SDK_INT >= 19 ? mCaptioningManager.getLocale() : null;"
         errorLine2="                                                                           ~~~~~~~~~">
         <location
@@ -189,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        boolean selectForced = VERSION.SDK_INT >= 19 ? !mCaptioningManager.isEnabled() : true;"
         errorLine2="                                                                           ~~~~~~~~~">
         <location
@@ -200,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    VERSION.SDK_INT >= 19 ? mCaptioningManager.isEnabled() : false;"
         errorLine2="                                                               ~~~~~~~~~">
         <location
@@ -211,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mCaptioningManager.removeCaptioningChangeListener("
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -222,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.media2.widget.SubtitleController is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.media2.widget.SubtitleController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mCaptioningManager.addCaptioningChangeListener("
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -233,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.widget.SubtitleView is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.widget.SubtitleView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    StaticLayout.Builder.obtain(mText, 0, mText.length(), mTextPaint, maxWidth)"
         errorLine2="                                         ~~~~~~">
         <location
@@ -244,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.widget.SubtitleView is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.widget.SubtitleView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setAlignment(mAlignment)"
         errorLine2="                             ~~~~~~~~~~~~">
         <location
@@ -255,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.widget.SubtitleView is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.widget.SubtitleView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setLineSpacing(mSpacingAdd, mSpacingMult);"
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
@@ -266,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.media2.widget.SubtitleView is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.media2.widget.SubtitleView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.setUseLineSpacingFromFallbacks(true);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -277,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.media2.widget.SubtitleView is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.media2.widget.SubtitleView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mLayout = builder.build();"
         errorLine2="                              ~~~~~">
         <location
@@ -288,6 +277,17 @@
     </issue>
 
     <issue
+        id="PrivateConstructorForUtilityClass"
+        message="Utility class with non private constructor"
+        errorLine1="    static class MediaFormatUtil {"
+        errorLine2="                 ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/media2/widget/SubtitleController.java"
+            line="275"
+            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 CharSequence getAccessibilityClassName() {"
diff --git a/media2/media2-widget/src/androidTest/res/values/strings.xml b/media2/media2-widget/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from media2/media2-widget/src/androidTest/res/values/strings.xml
rename to media2/media2-widget/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/media2/media2-widget/src/main/res/values-gl/strings.xml b/media2/media2-widget/src/main/res/values-gl/strings.xml
index 8b8a2cd..2768ea8 100644
--- a/media2/media2-widget/src/main/res/values-gl/strings.xml
+++ b/media2/media2-widget/src/main/res/values-gl/strings.xml
@@ -17,7 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Desactivar"</string>
+    <string name="MediaControlView_subtitle_off_text" msgid="3464220590351304587">"Desactivado"</string>
     <string name="MediaControlView_audio_track_text" msgid="3309135445007366582">"Pista de audio"</string>
     <string name="MediaControlView_audio_track_none_text" msgid="2659752099246305694">"Ningunha pista de audio"</string>
     <string name="MediaControlView_playback_speed_text" msgid="1481072528142380025">"Velocidade de reprodución"</string>
diff --git a/media2/media2-widget/src/main/res/values-iw/strings.xml b/media2/media2-widget/src/main/res/values-iw/strings.xml
index 68731ca..33bf37f 100644
--- a/media2/media2-widget/src/main/res/values-iw/strings.xml
+++ b/media2/media2-widget/src/main/res/values-iw/strings.xml
@@ -36,7 +36,7 @@
     <string name="mcv2_overflow_right_button_desc" msgid="7388732945289831383">"הצגת לחצנים נוספים"</string>
     <string name="mcv2_seek_bar_desc" msgid="24915699029009384">"התקדמות ההפעלה"</string>
     <string name="mcv2_settings_button_desc" msgid="811917224044739656">"הגדרות"</string>
-    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"הכתוביות מופעלות. כדי להסתירן, יש ללחוץ."</string>
+    <string name="mcv2_cc_is_on" msgid="5427119422911561783">"הכתוביות מופעלות. צריך ללחוץ כדי להסתיר אותן."</string>
     <string name="mcv2_cc_is_off" msgid="2380791179816122456">"הכתוביות מושבתות. צריך ללחוץ כדי להציג אותן."</string>
     <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"הפעלה מחדש"</string>
     <string name="mcv2_play_button_desc" msgid="4881308324856085359">"הפעלה"</string>
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index 993ef6e..84c37b6 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -37,7 +37,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":media:version-compat-tests:lib"))
 }
 
diff --git a/mediarouter/mediarouter/lint-baseline.xml b/mediarouter/mediarouter/lint-baseline.xml
index c150d99..f7b1c26 100644
--- a/mediarouter/mediarouter/lint-baseline.xml
+++ b/mediarouter/mediarouter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -46,43 +46,32 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));"
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"
-            line="661"
+            line="662"
             column="62"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        blurScript.setRadius(radius);"
         errorLine2="                   ~~~~~~~~~">
         <location
             file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"
-            line="662"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="        blurScript.setInput(allocation);"
-        errorLine2="                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"
             line="663"
             column="20"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="        blurScript.forEach(blurAllocation);"
-        errorLine2="                   ~~~~~~~">
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        blurScript.setInput(allocation);"
+        errorLine2="                   ~~~~~~~~">
         <location
             file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"
             line="664"
@@ -90,8 +79,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.mediarouter.media.MediaRouterApi24.RouteInfo is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        blurScript.forEach(blurAllocation);"
+        errorLine2="                   ~~~~~~~">
+        <location
+            file="src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java"
+            line="665"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.mediarouter.media.MediaRouterApi24.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getDeviceType();"
         errorLine2="                                                                   ~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context);"
         errorLine2="                                                                   ~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus();"
         errorLine2="                                                                   ~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory();"
         errorLine2="                                                                   ~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume();"
         errorLine2="                                                                   ~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax();"
         errorLine2="                                                                   ~~~~~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getTag();"
         errorLine2="                                                                   ~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag);"
         errorLine2="                                                            ~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume);"
         errorLine2="                                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction);"
         errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup();"
         errorLine2="                                                                   ~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteGroup is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteGroup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int count = group.getRouteCount();"
         errorLine2="                                    ~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteGroup is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteGroup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                out.add(group.getRouteAt(i));"
         errorLine2="                              ~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name);"
         errorLine2="                                                                ~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status);"
         errorLine2="                                                                ~~~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon);"
         errorLine2="                                                                ~~~~~~~~~~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type);"
         errorLine2="                                                                ~~~~~~~~~~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream);"
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume);"
         errorLine2="                                                                ~~~~~~~~~">
         <location
@@ -354,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax);"
         errorLine2="                                                                ~~~~~~~~~~~~">
         <location
@@ -365,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling);"
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback("
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient("
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context);"
         errorLine2="                                                                          ~~~~~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out);"
         errorLine2="                                                                   ~~~~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes();"
         errorLine2="                                                                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.RouteCategory is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable();"
         errorLine2="                                                                          ~~~~~~~~~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.SelectRouteWorkaround is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.SelectRouteWorkaround is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            int routeTypes = route.getSupportedTypes();"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.SelectRouteWorkaround is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.SelectRouteWorkaround is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            router.selectRoute(types, route);"
         errorLine2="                   ~~~~~~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.mediarouter.media.MediaRouterJellybean.GetDefaultRouteWorkaround is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.mediarouter.media.MediaRouterJellybean.GetDefaultRouteWorkaround is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return router.getRouteAt(0);"
         errorLine2="                          ~~~~~~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.media.MediaRouterJellybeanMr1.RouteInfo is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.media.MediaRouterJellybeanMr1.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).isEnabled();"
         errorLine2="                                                                   ~~~~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.mediarouter.media.MediaRouterJellybeanMr1.RouteInfo is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.media.MediaRouterJellybeanMr1.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return ((android.media.MediaRouter.RouteInfo)routeObj).getPresentationDisplay();"
         errorLine2="                                                                       ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.RouteInfo is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).getDescription();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.RouteInfo is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.RouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ((android.media.MediaRouter.RouteInfo)routeObj).isConnecting();"
         errorLine2="                                                                   ~~~~~~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.UserRouteInfo is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.mediarouter.media.MediaRouterJellybeanMr2.UserRouteInfo is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((android.media.MediaRouter.UserRouteInfo)routeObj).setDescription(description);"
         errorLine2="                                                                ~~~~~~~~~~~~~~">
         <location
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index e56f791..bb450cf 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -131,6 +131,7 @@
     private static final int CONNECTION_STATE_CONNECTED =
             MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTED;
 
+    private int mLastConnectionState = CONNECTION_STATE_DISCONNECTED;
     private int mConnectionState;
 
     private ColorStateList mButtonTint;
@@ -539,8 +540,28 @@
         if (mRemoteIndicator != null) {
             int[] myDrawableState = getDrawableState();
             mRemoteIndicator.setState(myDrawableState);
+
+            // When DrawableContainer#selectDrawable is called, the selected drawable is reset.
+            // We may need to start the animation or adjust the frame.
+            if (mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
+                AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
+                if (mConnectionState == CONNECTION_STATE_CONNECTING
+                        || mLastConnectionState != mConnectionState) {
+                    if (!curDrawable.isRunning()) {
+                        curDrawable.start();
+                    }
+                } else {
+                    // Assuming the last animation of the "connected" animation drawable
+                    // shows "connected" static drawable.
+                    if (mConnectionState == CONNECTION_STATE_CONNECTED
+                            && !curDrawable.isRunning()) {
+                        curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
+                    }
+                }
+            }
             invalidate();
         }
+        mLastConnectionState = mConnectionState;
     }
 
     /**
@@ -719,20 +740,6 @@
         mRemoteIndicator = d;
 
         refreshDrawableState();
-        if (mAttachedToWindow && mRemoteIndicator != null
-                && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
-            AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
-            if (mConnectionState == CONNECTION_STATE_CONNECTING) {
-                if (!curDrawable.isRunning()) {
-                    curDrawable.start();
-                }
-            } else if (mConnectionState == CONNECTION_STATE_CONNECTED) {
-                if (curDrawable.isRunning()) {
-                    curDrawable.stop();
-                }
-                curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
-            }
-        }
     }
 
     void refreshVisibility() {
@@ -750,17 +757,12 @@
         final int connectionState = (isRemote ? route.getConnectionState()
                 : CONNECTION_STATE_DISCONNECTED);
 
-        boolean needsRefresh = false;
-
         if (mConnectionState != connectionState) {
             mConnectionState = connectionState;
-            needsRefresh = true;
-        }
-
-        if (needsRefresh) {
             updateContentDescription();
             refreshDrawableState();
         }
+
         if (connectionState == CONNECTION_STATE_CONNECTING) {
             loadRemoteIndicatorIfNeeded();
         }
@@ -769,23 +771,6 @@
             setEnabled(mAlwaysVisible || mRouter.isRouteAvailable(mSelector,
                     MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
         }
-        if (mRemoteIndicator != null
-                && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
-            AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
-            if (mAttachedToWindow) {
-                if ((needsRefresh || connectionState == CONNECTION_STATE_CONNECTING)
-                        && !curDrawable.isRunning()) {
-                    curDrawable.start();
-                }
-            } else if (connectionState == CONNECTION_STATE_CONNECTED) {
-                // When the route is already connected before the view is attached, show the last
-                // frame of the connected animation immediately.
-                if (curDrawable.isRunning()) {
-                    curDrawable.stop();
-                }
-                curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
-            }
-        }
     }
 
     private void updateContentDescription() {
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
index 2b98060..9bb1db4 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
@@ -373,7 +373,6 @@
         @Override
         public void onTransfer(@NonNull MediaRouter2.RoutingController oldController,
                 @NonNull MediaRouter2.RoutingController newController) {
-            // TODO: Call onPrepareTransfer() when the API is added.
             mControllerMap.remove(oldController);
             if (newController == mMediaRouter2.getSystemController()) {
                 mCallback.onSelectFallbackRoute(UNSELECT_REASON_ROUTE_CHANGED);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index 01d7ab2..9e98d05 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -139,9 +139,9 @@
     public static final int UNSELECT_REASON_ROUTE_CHANGED = 3;
 
     // Maintains global media router state for the process.
-    // This field is initialized in MediaRouter.getInstance() before any
-    // MediaRouter objects are instantiated so it is guaranteed to be
-    // valid whenever any instance method is invoked.
+    // This field is initialized lazily when it is necessary.
+    // Access this field directly only when you don't want to initialize it.
+    // Use {@link #getGlobalRouter()} to get a valid instance.
     static GlobalMediaRouter sGlobal;
 
     // Context-bound state of the media router.
@@ -288,25 +288,41 @@
 
         if (sGlobal == null) {
             sGlobal = new GlobalMediaRouter(context.getApplicationContext());
-            sGlobal.start();
         }
+        // Use sGlobal directly to avoid initialization.
         return sGlobal.getRouter(context);
     }
 
     /**
+     * Gets the initialized global router.
+     * Please make sure this is called in the main thread.
+     */
+    @MainThread
+    static GlobalMediaRouter getGlobalRouter() {
+        if (sGlobal == null) {
+            return null;
+        }
+        sGlobal.ensureInitialized();
+        return sGlobal;
+    }
+
+    /**
      * Gets information about the {@link MediaRouter.RouteInfo routes} currently known to
      * this media router.
      */
     @NonNull
     public List<RouteInfo> getRoutes() {
         checkCallingThread();
-        return sGlobal == null ? Collections.<RouteInfo>emptyList() : sGlobal.getRoutes();
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? Collections.<RouteInfo>emptyList() :
+                globalMediaRouter.getRoutes();
     }
 
     @Nullable
     RouteInfo getRoute(String uniqueId) {
         checkCallingThread();
-        return sGlobal == null ? null : sGlobal.getRoute(uniqueId);
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? null : globalMediaRouter.getRoute(uniqueId);
     }
 
     /**
@@ -316,7 +332,9 @@
     @NonNull
     public List<ProviderInfo> getProviders() {
         checkCallingThread();
-        return sGlobal == null ? Collections.<ProviderInfo>emptyList() : sGlobal.getProviders();
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? Collections.<ProviderInfo>emptyList() :
+                globalMediaRouter.getProviders();
     }
 
     /**
@@ -330,7 +348,7 @@
     @NonNull
     public RouteInfo getDefaultRoute() {
         checkCallingThread();
-        return sGlobal.getDefaultRoute();
+        return getGlobalRouter().getDefaultRoute();
     }
 
     /**
@@ -341,7 +359,8 @@
     @Nullable
     public RouteInfo getBluetoothRoute() {
         checkCallingThread();
-        return sGlobal == null ? null : sGlobal.getBluetoothRoute();
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? null : globalMediaRouter.getBluetoothRoute();
     }
 
     /**
@@ -392,7 +411,7 @@
     @NonNull
     public RouteInfo getSelectedRoute() {
         checkCallingThread();
-        return sGlobal.getSelectedRoute();
+        return getGlobalRouter().getSelectedRoute();
     }
 
     /**
@@ -417,10 +436,11 @@
         if (DEBUG) {
             Log.d(TAG, "updateSelectedRoute: " + selector);
         }
-        RouteInfo route = sGlobal.getSelectedRoute();
+        GlobalMediaRouter globalRouter = getGlobalRouter();
+        RouteInfo route = globalRouter.getSelectedRoute();
         if (!route.isDefaultOrBluetooth() && !route.matchesSelector(selector)) {
-            route = sGlobal.chooseFallbackRoute();
-            sGlobal.selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
+            route = globalRouter.chooseFallbackRoute();
+            globalRouter.selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
         }
         return route;
     }
@@ -439,7 +459,7 @@
         if (DEBUG) {
             Log.d(TAG, "selectRoute: " + route);
         }
-        sGlobal.selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
+        getGlobalRouter().selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
     }
 
     /**
@@ -463,9 +483,11 @@
         checkCallingThread();
 
         // Choose the fallback route if it's not already selected.
-        RouteInfo fallbackRoute = sGlobal.chooseFallbackRoute();
-        if (sGlobal.getSelectedRoute() != fallbackRoute) {
-            sGlobal.selectRoute(fallbackRoute, reason);
+        // Otherwise, select the default route.
+        GlobalMediaRouter globalRouter = getGlobalRouter();
+        RouteInfo fallbackRoute = globalRouter.chooseFallbackRoute();
+        if (globalRouter.getSelectedRoute() != fallbackRoute) {
+            globalRouter.selectRoute(fallbackRoute, reason);
         }
     }
 
@@ -479,7 +501,7 @@
             throw new NullPointerException("route must not be null");
         }
         checkCallingThread();
-        sGlobal.addMemberToDynamicGroup(route);
+        getGlobalRouter().addMemberToDynamicGroup(route);
     }
 
     /**
@@ -492,7 +514,7 @@
             throw new NullPointerException("route must not be null");
         }
         checkCallingThread();
-        sGlobal.removeMemberFromDynamicGroup(route);
+        getGlobalRouter().removeMemberFromDynamicGroup(route);
     }
 
     /**
@@ -505,7 +527,7 @@
             throw new NullPointerException("route must not be null");
         }
         checkCallingThread();
-        sGlobal.transferToRoute(route);
+        getGlobalRouter().transferToRoute(route);
     }
 
     /**
@@ -535,8 +557,7 @@
             throw new IllegalArgumentException("selector must not be null");
         }
         checkCallingThread();
-
-        return sGlobal.isRouteAvailable(selector, flags);
+        return getGlobalRouter().isRouteAvailable(selector, flags);
     }
 
     /**
@@ -708,7 +729,7 @@
             updateNeeded = true;
         }
         if (updateNeeded) {
-            sGlobal.updateDiscoveryRequest();
+            getGlobalRouter().updateDiscoveryRequest();
         }
     }
 
@@ -732,7 +753,7 @@
         int index = findCallbackRecord(callback);
         if (index >= 0) {
             mCallbackRecords.remove(index);
-            sGlobal.updateDiscoveryRequest();
+            getGlobalRouter().updateDiscoveryRequest();
         }
     }
 
@@ -752,7 +773,7 @@
     @MainThread
     public void setOnPrepareTransferListener(@Nullable OnPrepareTransferListener listener) {
         checkCallingThread();
-        sGlobal.mOnPrepareTransferListener = listener;
+        getGlobalRouter().mOnPrepareTransferListener = listener;
     }
 
     /**
@@ -776,7 +797,7 @@
         if (DEBUG) {
             Log.d(TAG, "addProvider: " + providerInstance);
         }
-        sGlobal.addProvider(providerInstance);
+        getGlobalRouter().addProvider(providerInstance);
     }
 
     /**
@@ -800,7 +821,7 @@
         if (DEBUG) {
             Log.d(TAG, "removeProvider: " + providerInstance);
         }
-        sGlobal.removeProvider(providerInstance);
+        getGlobalRouter().removeProvider(providerInstance);
     }
 
     /**
@@ -823,7 +844,7 @@
         if (DEBUG) {
             Log.d(TAG, "addRemoteControlClient: " + remoteControlClient);
         }
-        sGlobal.addRemoteControlClient(remoteControlClient);
+        getGlobalRouter().addRemoteControlClient(remoteControlClient);
     }
 
     /**
@@ -836,11 +857,12 @@
         if (remoteControlClient == null) {
             throw new IllegalArgumentException("remoteControlClient must not be null");
         }
+        checkCallingThread();
 
         if (DEBUG) {
             Log.d(TAG, "removeRemoteControlClient: " + remoteControlClient);
         }
-        sGlobal.removeRemoteControlClient(remoteControlClient);
+        getGlobalRouter().removeRemoteControlClient(remoteControlClient);
     }
 
     /**
@@ -852,10 +874,11 @@
      * @param mediaSession The {@link android.media.session.MediaSession} to use.
      */
     public void setMediaSession(@Nullable Object mediaSession) {
+        checkCallingThread();
         if (DEBUG) {
             Log.d(TAG, "setMediaSession: " + mediaSession);
         }
-        sGlobal.setMediaSession(mediaSession);
+        getGlobalRouter().setMediaSession(mediaSession);
     }
 
     /**
@@ -867,15 +890,17 @@
      * @param mediaSession The {@link MediaSessionCompat} to use.
      */
     public void setMediaSessionCompat(@Nullable MediaSessionCompat mediaSession) {
+        checkCallingThread();
         if (DEBUG) {
             Log.d(TAG, "setMediaSessionCompat: " + mediaSession);
         }
-        sGlobal.setMediaSessionCompat(mediaSession);
+        getGlobalRouter().setMediaSessionCompat(mediaSession);
     }
 
     @Nullable
     public MediaSessionCompat.Token getMediaSessionToken() {
         return sGlobal == null ? null : sGlobal.getMediaSessionToken();
+        // Use sGlobal exceptionally due to unchecked thread.
     }
 
     /**
@@ -885,7 +910,8 @@
     @Nullable
     public MediaRouterParams getRouterParams() {
         checkCallingThread();
-        return sGlobal == null ? null : sGlobal.getRouterParams();
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? null : globalMediaRouter.getRouterParams();
     }
 
     /**
@@ -896,7 +922,7 @@
      */
     public void setRouterParams(@Nullable MediaRouterParams params) {
         checkCallingThread();
-        sGlobal.setRouterParams(params);
+        getGlobalRouter().setRouterParams(params);
     }
 
     /**
@@ -920,7 +946,7 @@
         if (sGlobal == null) {
             return false;
         }
-        return sGlobal.isMediaTransferEnabled();
+        return getGlobalRouter().isMediaTransferEnabled();
     }
 
     /**
@@ -931,14 +957,15 @@
         if (sGlobal == null) {
             return 0;
         }
-        return sGlobal.getCallbackCount();
+        return getGlobalRouter().getCallbackCount();
     }
 
     /**
      * Returns whether transferring media from remote to local is enabled.
      */
     static boolean isTransferToLocalEnabled() {
-        return sGlobal == null ? false : sGlobal.isTransferToLocalEnabled();
+        GlobalMediaRouter globalMediaRouter = getGlobalRouter();
+        return globalMediaRouter == null ? false : globalMediaRouter.isTransferToLocalEnabled();
     }
 
     /**
@@ -1216,7 +1243,7 @@
         //   - If this route is a selected member route of a group, it returns false.
         public boolean isSelected() {
             checkCallingThread();
-            return sGlobal.getSelectedRoute() == this;
+            return getGlobalRouter().getSelectedRoute() == this;
         }
 
         /**
@@ -1228,7 +1255,7 @@
          */
         public boolean isDefault() {
             checkCallingThread();
-            return sGlobal.getDefaultRoute() == this;
+            return getGlobalRouter().getDefaultRoute() == this;
         }
 
         /**
@@ -1240,7 +1267,7 @@
          */
         public boolean isBluetooth() {
             checkCallingThread();
-            return sGlobal.getBluetoothRoute() == this;
+            return getGlobalRouter().getBluetoothRoute() == this;
         }
 
         /**
@@ -1380,7 +1407,7 @@
             }
             checkCallingThread();
 
-            ContentResolver contentResolver = sGlobal.getContentResolver();
+            ContentResolver contentResolver = getGlobalRouter().getContentResolver();
             int count = mControlFilters.size();
             for (int i = 0; i < count; i++) {
                 if (mControlFilters.get(i).match(contentResolver, intent, true, TAG) >= 0) {
@@ -1414,7 +1441,7 @@
             }
             checkCallingThread();
 
-            sGlobal.sendControlRequest(this, intent, callback);
+            getGlobalRouter().sendControlRequest(this, intent, callback);
         }
 
         /**
@@ -1529,7 +1556,7 @@
          */
         public void requestSetVolume(int volume) {
             checkCallingThread();
-            sGlobal.requestSetVolume(this, Math.min(mVolumeMax, Math.max(0, volume)));
+            getGlobalRouter().requestSetVolume(this, Math.min(mVolumeMax, Math.max(0, volume)));
         }
 
         /**
@@ -1544,7 +1571,7 @@
         public void requestUpdateVolume(int delta) {
             checkCallingThread();
             if (delta != 0) {
-                sGlobal.requestUpdateVolume(this, delta);
+                getGlobalRouter().requestUpdateVolume(this, delta);
             }
         }
 
@@ -1581,7 +1608,7 @@
         public Display getPresentationDisplay() {
             checkCallingThread();
             if (mPresentationDisplayId >= 0 && mPresentationDisplay == null) {
-                mPresentationDisplay = sGlobal.getDisplay(mPresentationDisplayId);
+                mPresentationDisplay = getGlobalRouter().getDisplay(mPresentationDisplayId);
             }
             return mPresentationDisplay;
         }
@@ -1618,7 +1645,7 @@
          */
         public void select() {
             checkCallingThread();
-            sGlobal.selectRoute(this, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
+            getGlobalRouter().selectRoute(this, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
         }
 
         /**
@@ -1666,8 +1693,9 @@
         @RestrictTo(LIBRARY)
         @Nullable
         public DynamicGroupRouteController getDynamicGroupController() {
+            checkCallingThread();
             //TODO: handle multiple controllers case
-            RouteController controller = sGlobal.mSelectedRouteController;
+            RouteController controller = getGlobalRouter().mSelectedRouteController;
             if (controller instanceof DynamicGroupRouteController) {
                 return (DynamicGroupRouteController) controller;
             }
@@ -1847,13 +1875,17 @@
                 if (groupMemberIds.size() != mMemberRoutes.size()) {
                     memberChanged = true;
                 }
-                for (String groupMemberId : groupMemberIds) {
-                    String uniqueId = sGlobal.getUniqueId(getProvider(), groupMemberId);
-                    RouteInfo groupMember = sGlobal.getRoute(uniqueId);
-                    if (groupMember != null) {
-                        routes.add(groupMember);
-                        if (!memberChanged && !mMemberRoutes.contains(groupMember)) {
-                            memberChanged = true;
+                //TODO: Clean this up not to reference the global router
+                if (!groupMemberIds.isEmpty()) {
+                    GlobalMediaRouter globalRouter = getGlobalRouter();
+                    for (String groupMemberId : groupMemberIds) {
+                        String uniqueId = globalRouter.getUniqueId(getProvider(), groupMemberId);
+                        RouteInfo groupMember = globalRouter.getRoute(uniqueId);
+                        if (groupMember != null) {
+                            routes.add(groupMember);
+                            if (!memberChanged && !mMemberRoutes.contains(groupMember)) {
+                                memberChanged = true;
+                            }
                         }
                     }
                 }
@@ -1896,7 +1928,7 @@
                     mMemberRoutes.add(route);
                 }
             }
-            sGlobal.mCallbackHandler.post(
+            getGlobalRouter().mCallbackHandler.post(
                     GlobalMediaRouter.CallbackHandler.MSG_ROUTE_CHANGED, this);
         }
 
@@ -1970,8 +2002,6 @@
 
         private final ProviderMetadata mMetadata;
         private MediaRouteProviderDescriptor mDescriptor;
-        private Resources mResources;
-        private boolean mResourcesNotAvailable;
 
         ProviderInfo(MediaRouteProvider provider) {
             mProviderInstance = provider;
@@ -2012,21 +2042,6 @@
             return Collections.unmodifiableList(mRoutes);
         }
 
-        Resources getResources() {
-            if (mResources == null && !mResourcesNotAvailable) {
-                String packageName = getPackageName();
-                Context context = sGlobal.getProviderContext(packageName);
-                if (context != null) {
-                    mResources = context.getResources();
-                } else {
-                    Log.w(TAG, "Unable to obtain resources for route provider package: "
-                            + packageName);
-                    mResourcesNotAvailable = true;
-                }
-            }
-            return mResources;
-        }
-
         boolean updateDescriptor(MediaRouteProviderDescriptor descriptor) {
             if (mDescriptor != descriptor) {
                 mDescriptor = descriptor;
@@ -2356,8 +2371,14 @@
             implements SystemMediaRouteProvider.SyncCallback,
             RegisteredMediaRouteProviderWatcher.Callback {
         final Context mApplicationContext;
-        final boolean mMediaTransferEnabled;
-        final MediaRoute2Provider mMr2Provider;
+        boolean mIsInitialized;
+
+        SystemMediaRouteProvider mSystemProvider;
+        @VisibleForTesting
+        RegisteredMediaRouteProviderWatcher mRegisteredProviderWatcher;
+        boolean mMediaTransferEnabled;
+        MediaRoute2Provider mMr2Provider;
+
         final ArrayList<WeakReference<MediaRouter>> mRouters = new ArrayList<>();
         private final ArrayList<RouteInfo> mRoutes = new ArrayList<>();
         private final Map<Pair<String, String>, String> mUniqueIdMap = new HashMap<>();
@@ -2368,22 +2389,12 @@
                 new RemoteControlClientCompat.PlaybackInfo();
         private final ProviderCallback mProviderCallback = new ProviderCallback();
         final CallbackHandler mCallbackHandler = new CallbackHandler();
-        private final DisplayManagerCompat mDisplayManager;
-        final SystemMediaRouteProvider mSystemProvider;
+        private DisplayManagerCompat mDisplayManager;
         private final boolean mLowRam;
-        private MediaRouterActiveScanThrottlingHelper mActiveScanThrottlingHelper =
-                new MediaRouterActiveScanThrottlingHelper(
-                        new Runnable() {
-                        @Override
-                        public void run() {
-                            updateDiscoveryRequest();
-                        }
-                });
+        private MediaRouterActiveScanThrottlingHelper mActiveScanThrottlingHelper;
 
         private MediaRouterParams mRouterParams;
-        @VisibleForTesting
-        RegisteredMediaRouteProviderWatcher mRegisteredProviderWatcher;
-        private RouteInfo mDefaultRoute;
+        RouteInfo mDefaultRoute;
         private RouteInfo mBluetoothRoute;
         RouteInfo mSelectedRoute;
         RouteController mSelectedRouteController;
@@ -2398,10 +2409,13 @@
         private int mCallbackCount;
         OnPrepareTransferListener mOnPrepareTransferListener;
         PrepareTransferNotifier mTransferNotifier;
+        RouteInfo mTransferredRoute;
+        RouteController mTransferredRouteController;
+
         private MediaSessionRecord mMediaSession;
         MediaSessionCompat mRccMediaSession;
         private MediaSessionCompat mCompatSession;
-        private MediaSessionCompat.OnActiveChangeListener mSessionActiveListener =
+        private final MediaSessionCompat.OnActiveChangeListener mSessionActiveListener =
                 new MediaSessionCompat.OnActiveChangeListener() {
             @Override
             public void onActiveChanged() {
@@ -2415,13 +2429,19 @@
             }
         };
 
-        @SuppressLint({"SyntheticAccessor", "NewApi"})
         GlobalMediaRouter(Context applicationContext) {
             mApplicationContext = applicationContext;
-            mDisplayManager = DisplayManagerCompat.getInstance(applicationContext);
             mLowRam = ActivityManagerCompat.isLowRamDevice(
                     (ActivityManager)applicationContext.getSystemService(
                             Context.ACTIVITY_SERVICE));
+        }
+
+        @SuppressLint({"NewApi", "SyntheticAccessor"})
+        void ensureInitialized() {
+            if (mIsInitialized) {
+                return;
+            }
+            mIsInitialized = true;
 
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                 mMediaTransferEnabled = MediaTransferReceiver.isDeclared(mApplicationContext);
@@ -2435,13 +2455,23 @@
             } else {
                 mMr2Provider = null;
             }
+
             // Add the system media route provider for interoperating with
             // the framework media router.  This one is special and receives
             // synchronization messages from the media router.
-            mSystemProvider = SystemMediaRouteProvider.obtain(applicationContext, this);
+            mSystemProvider = SystemMediaRouteProvider.obtain(mApplicationContext, this);
+            start();
         }
 
-        public void start() {
+        private void start() {
+            // Using lambda would break some apps.
+            mActiveScanThrottlingHelper = new MediaRouterActiveScanThrottlingHelper(
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            updateDiscoveryRequest();
+                        }
+                    });
             addProvider(mSystemProvider);
             if (mMr2Provider != null) {
                 addProvider(mMr2Provider);
@@ -2486,6 +2516,9 @@
         }
 
         public Display getDisplay(int displayId) {
+            if (mDisplayManager == null) {
+                mDisplayManager = DisplayManagerCompat.getInstance(mApplicationContext);
+            }
             return mDisplayManager.getDisplay(displayId);
         }
 
@@ -3467,7 +3500,7 @@
             }
         }
 
-        private final class Mr2ProviderCallback extends MediaRoute2Provider.Callback {
+        final class Mr2ProviderCallback extends MediaRoute2Provider.Callback {
             @Override
             public void onSelectRoute(@NonNull String routeDescriptorId,
                     @UnselectReason int reason) {
@@ -3703,7 +3736,7 @@
             }
 
             // Using Pair<RouteInfo, RouteInfo>
-            @SuppressWarnings({"unchecked", "SyntheticAccessor"})
+            @SuppressWarnings({"unchecked"})
             private void syncWithSystemProvider(int what, Object obj) {
                 switch (what) {
                     case MSG_ROUTE_ADDED:
@@ -3843,7 +3876,7 @@
             mMemberRoutes = (memberRoutes == null) ? null : new ArrayList<>(memberRoutes);
 
             // For the case it's not handled properly
-            router.mCallbackHandler.postDelayed(() -> this.finishTransfer(),
+            router.mCallbackHandler.postDelayed(this::finishTransfer,
                     TRANSFER_TIMEOUT_MS);
         }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterActiveScanThrottlingHelper.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterActiveScanThrottlingHelper.java
index 4e05ca5..e1862ae 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterActiveScanThrottlingHelper.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterActiveScanThrottlingHelper.java
@@ -25,7 +25,7 @@
  * suppressed.
  */
 class MediaRouterActiveScanThrottlingHelper {
-    // The constant is package visible for tests can set it to a shorter durationaq.
+    // The constant is package visible for tests can set it to a shorter duration.
     static final long MAX_ACTIVE_SCAN_DURATION_MS = 30000;
 
     private final Handler mHandler = new Handler(Looper.getMainLooper());
diff --git a/mediarouter/mediarouter/src/main/res/values-in/strings.xml b/mediarouter/mediarouter/src/main/res/values-in/strings.xml
index 8141489..3aa6597 100644
--- a/mediarouter/mediarouter/src/main/res/values-in/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-in/strings.xml
@@ -24,7 +24,7 @@
     <string name="mr_cast_button_connected" msgid="6073720094880410356">"Transmisikan. Terhubung"</string>
     <string name="mr_chooser_title" msgid="1419936397646839840">"Transmisikan ke"</string>
     <string name="mr_chooser_searching" msgid="6114250663023140921">"Mencari perangkat"</string>
-    <string name="mr_controller_disconnect" msgid="7812275474138309497">"Putuskan hubungan"</string>
+    <string name="mr_controller_disconnect" msgid="7812275474138309497">"Putuskan koneksi"</string>
     <string name="mr_controller_stop_casting" msgid="804210341192624074">"Hentikan transmisi"</string>
     <string name="mr_controller_close_description" msgid="5684434439232634509">"Tutup"</string>
     <string name="mr_controller_play" msgid="1253345086594430054">"Putar"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-iw/strings.xml b/mediarouter/mediarouter/src/main/res/values-iw/strings.xml
index b26824d..eda57a80 100644
--- a/mediarouter/mediarouter/src/main/res/values-iw/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-iw/strings.xml
@@ -19,7 +19,7 @@
     <string name="mr_system_route_name" msgid="7449553026175453403">"מערכת"</string>
     <string name="mr_user_route_category_name" msgid="4088331695424166162">"מכשירים"</string>
     <string name="mr_button_content_description" msgid="2939063992730535343">"‏העברה (cast)"</string>
-    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"‏העברה (cast). מנותק"</string>
+    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"‏העברה (cast). אין חיבור"</string>
     <string name="mr_cast_button_connecting" msgid="6629927151350192407">"‏העברה (cast). מתבצעת התחברות"</string>
     <string name="mr_cast_button_connected" msgid="6073720094880410356">"‏העברה (cast). מחובר"</string>
     <string name="mr_chooser_title" msgid="1419936397646839840">"העברה אל"</string>
@@ -33,7 +33,7 @@
     <string name="mr_controller_expand_group" msgid="4521419834052044261">"הרחבה"</string>
     <string name="mr_controller_collapse_group" msgid="2585048604188129749">"כיווץ"</string>
     <string name="mr_controller_album_art" msgid="3330502667672708728">"עטיפת אלבום"</string>
-    <string name="mr_controller_volume_slider" msgid="2955862765169128170">"מחוון עוצמה"</string>
+    <string name="mr_controller_volume_slider" msgid="2955862765169128170">"מחוון עוצמת קול"</string>
     <string name="mr_controller_no_media_selected" msgid="5495452265246139458">"לא נבחרה מדיה"</string>
     <string name="mr_controller_no_info_available" msgid="855271725131981086">"אין מידע זמין"</string>
     <string name="mr_controller_casting_screen" msgid="9171231064758955152">"העברת מסך מתבצעת"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-mk/strings.xml b/mediarouter/mediarouter/src/main/res/values-mk/strings.xml
index afdb035..73e2bb9 100644
--- a/mediarouter/mediarouter/src/main/res/values-mk/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-mk/strings.xml
@@ -19,12 +19,12 @@
     <string name="mr_system_route_name" msgid="7449553026175453403">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="4088331695424166162">"Уреди"</string>
     <string name="mr_button_content_description" msgid="2939063992730535343">"Емитувајте"</string>
-    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"Емитувајте. Прекината врска"</string>
+    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"Емитувајте. Не е поврзано"</string>
     <string name="mr_cast_button_connecting" msgid="6629927151350192407">"Емитувајте. Се поврзува"</string>
     <string name="mr_cast_button_connected" msgid="6073720094880410356">"Емитувајте. Поврзано"</string>
     <string name="mr_chooser_title" msgid="1419936397646839840">"Емитување на"</string>
     <string name="mr_chooser_searching" msgid="6114250663023140921">"Се бараат уреди"</string>
-    <string name="mr_controller_disconnect" msgid="7812275474138309497">"Исклучи"</string>
+    <string name="mr_controller_disconnect" msgid="7812275474138309497">"Прекини врска"</string>
     <string name="mr_controller_stop_casting" msgid="804210341192624074">"Сопри со емитување"</string>
     <string name="mr_controller_close_description" msgid="5684434439232634509">"Затвори"</string>
     <string name="mr_controller_play" msgid="1253345086594430054">"Пушти"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-ne/strings.xml b/mediarouter/mediarouter/src/main/res/values-ne/strings.xml
index be5a72a..8f025d1 100644
--- a/mediarouter/mediarouter/src/main/res/values-ne/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-ne/strings.xml
@@ -38,7 +38,7 @@
     <string name="mr_controller_no_info_available" msgid="855271725131981086">"कुनै पनि जानकारी उपलब्ध छैन"</string>
     <string name="mr_controller_casting_screen" msgid="9171231064758955152">"स्क्रिन Cast गरिँदै छ"</string>
     <string name="mr_dialog_default_group_name" msgid="4115858704575247342">"समूह"</string>
-    <string name="mr_dialog_groupable_header" msgid="4307018456678388936">"यन्त्र थप्नुहोस्"</string>
+    <string name="mr_dialog_groupable_header" msgid="4307018456678388936">"डिभाइस थप्नुहोस्"</string>
     <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"कुनै समूहमा प्ले गर्नुहोस्"</string>
     <string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"कुनै पनि जानकारी उपलब्ध छैन"</string>
 </resources>
diff --git a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
index c724aa5..1f552eb 100644
--- a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
@@ -38,7 +38,7 @@
     <string name="mr_controller_no_info_available" msgid="855271725131981086">"Brak informacji"</string>
     <string name="mr_controller_casting_screen" msgid="9171231064758955152">"Przesyłam ekran"</string>
     <string name="mr_dialog_default_group_name" msgid="4115858704575247342">"Grupa"</string>
-    <string name="mr_dialog_groupable_header" msgid="4307018456678388936">"Dodawanie urządzenia"</string>
+    <string name="mr_dialog_groupable_header" msgid="4307018456678388936">"Dodaj urządzenie"</string>
     <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"Odtwórz w grupie"</string>
     <string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"Brak informacji"</string>
 </resources>
diff --git a/navigation/benchmark/lint-baseline.xml b/navigation/benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/integration-tests/testapp/build.gradle b/navigation/integration-tests/testapp/build.gradle
index 6b61494..190bedf 100644
--- a/navigation/integration-tests/testapp/build.gradle
+++ b/navigation/integration-tests/testapp/build.gradle
@@ -35,7 +35,7 @@
     implementation(project(":navigation:navigation-fragment-ktx"))
     implementation(project(":navigation:navigation-ui-ktx"))
     implementation(project(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
 }
 
diff --git a/navigation/integration-tests/testapp/lint-baseline.xml b/navigation/integration-tests/testapp/lint-baseline.xml
index 32125ea..67b445b 100644
--- a/navigation/integration-tests/testapp/lint-baseline.xml
+++ b/navigation/integration-tests/testapp/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.navigation.testapp.AndroidFragment is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.navigation.testapp.AndroidFragment is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                notificationManager.createNotificationChannel("
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.navigation.testapp.AndroidFragment is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.navigation.testapp.AndroidFragment is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    NotificationChannel("
         errorLine2="                    ^">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.navigation.testapp.HelpActivity is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            val fade = Fade()"
         errorLine2="                       ~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.navigation.testapp.HelpActivity is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            fade.excludeTarget(android.R.id.statusBarBackground, true)"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.navigation.testapp.HelpActivity is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            fade.excludeTarget(android.R.id.navigationBarBackground, true)"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.navigation.testapp.HelpActivity is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            window.exitTransition = fade"
         errorLine2="                   ~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.navigation.testapp.HelpActivity is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.navigation.testapp.HelpActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            window.enterTransition = fade"
         errorLine2="                   ~~~~~~~~~~~~~~~">
         <location
@@ -84,7 +84,7 @@
         errorLine1="    &lt;string name=&quot;drawer_navigation&quot;>Drawer Nav&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="16"
             column="13"/>
     </issue>
@@ -95,7 +95,7 @@
         errorLine1="    &lt;string name=&quot;drawer_open&quot;>Open Navigation Drawer&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="17"
             column="13"/>
     </issue>
@@ -106,7 +106,7 @@
         errorLine1="    &lt;string name=&quot;drawer_close&quot;>Close Navigation Drawer&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="18"
             column="13"/>
     </issue>
@@ -117,7 +117,7 @@
         errorLine1="    &lt;string name=&quot;bottom_navigation&quot;>Bottom Nav&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="19"
             column="13"/>
     </issue>
diff --git a/navigation/integration-tests/testapp/src/main/res/values/strings.xml b/navigation/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from navigation/integration-tests/testapp/src/main/res/values/strings.xml
rename to navigation/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/navigation/navigation-common-ktx/lint-baseline.xml b/navigation/navigation-common-ktx/lint-baseline.xml
deleted file mode 100644
index 2914d7f..0000000
--- a/navigation/navigation-common-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="                args = method.invoke(null, arguments) as Args"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/NavArgsLazy.kt"
-            line="52"
-            column="24"/>
-    </issue>
-
-</issues>
diff --git a/navigation/navigation-common/api/api_lint.ignore b/navigation/navigation-common/api/api_lint.ignore
index 9a1c2d8..8610f6c 100644
--- a/navigation/navigation-common/api/api_lint.ignore
+++ b/navigation/navigation-common/api/api_lint.ignore
@@ -37,6 +37,8 @@
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.navigation.NavDestinationBuilder.deepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit>)
 BuilderSetStyle: androidx.navigation.NavOptionsBuilder#anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit>):
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.navigation.NavOptionsBuilder.anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit>)
+BuilderSetStyle: androidx.navigation.NavOptionsBuilder#popUpTo(String, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>):
+    Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.navigation.NavOptionsBuilder.popUpTo(String,kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>)
 BuilderSetStyle: androidx.navigation.NavOptionsBuilder#popUpTo(int, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>):
     Builder methods names should use setFoo() / addFoo() / clearFoo() style: method androidx.navigation.NavOptionsBuilder.popUpTo(int,kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit>)
 
@@ -77,10 +79,14 @@
     Getter should be on the built object, not the builder: method androidx.navigation.NavDestinationBuilder.getLabel()
 GetterOnBuilder: androidx.navigation.NavDestinationBuilder#getNavigator():
     Getter should be on the built object, not the builder: method androidx.navigation.NavDestinationBuilder.getNavigator()
+GetterOnBuilder: androidx.navigation.NavDestinationBuilder#getRoute():
+    Getter should be on the built object, not the builder: method androidx.navigation.NavDestinationBuilder.getRoute()
 GetterOnBuilder: androidx.navigation.NavOptionsBuilder#getLaunchSingleTop():
     Getter should be on the built object, not the builder: method androidx.navigation.NavOptionsBuilder.getLaunchSingleTop()
-GetterOnBuilder: androidx.navigation.NavOptionsBuilder#getPopUpTo():
-    Getter should be on the built object, not the builder: method androidx.navigation.NavOptionsBuilder.getPopUpTo()
+GetterOnBuilder: androidx.navigation.NavOptionsBuilder#getPopUpToId():
+    Getter should be on the built object, not the builder: method androidx.navigation.NavOptionsBuilder.getPopUpToId()
+GetterOnBuilder: androidx.navigation.NavOptionsBuilder#getPopUpToRoute():
+    Getter should be on the built object, not the builder: method androidx.navigation.NavOptionsBuilder.getPopUpToRoute()
 GetterOnBuilder: androidx.navigation.PopUpToBuilder#getInclusive():
     Getter should be on the built object, not the builder: method androidx.navigation.PopUpToBuilder.getInclusive()
 
@@ -113,12 +119,24 @@
     androidx.navigation.NavOptions does not declare a `isLaunchSingleTop()` method matching method androidx.navigation.NavOptions.Builder.setLaunchSingleTop(boolean)
 
 
+MissingJvmstatic: androidx.navigation.NavOptionsBuilder#popUpTo(String, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,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
+MissingJvmstatic: androidx.navigation.NavOptionsBuilder#popUpTo(int, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,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
+
+
 NullableCollection: androidx.navigation.NavAction#getDefaultArguments():
     Return type of method androidx.navigation.NavAction.getDefaultArguments() is a nullable collection (`android.os.Bundle`); must be non-null
+NullableCollection: androidx.navigation.NavBackStackEntry#getArguments():
+    Return type of method androidx.navigation.NavBackStackEntry.getArguments() is a nullable collection (`android.os.Bundle`); must be non-null
 NullableCollection: androidx.navigation.Navigator#onSaveState():
     Return type of method androidx.navigation.Navigator.onSaveState() is a nullable collection (`android.os.Bundle`); must be non-null
 
 
+OptionalBuilderConstructorArgument: androidx.navigation.NavDestinationBuilder#NavDestinationBuilder(androidx.navigation.Navigator<? extends D>, String) parameter #1:
+    Builder constructor arguments must be mandatory (i.e. not @Nullable): parameter route in androidx.navigation.NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String route)
+
+
 SetterReturnsThis: androidx.navigation.AnimBuilder#setEnter(int):
     Methods must return the builder object (return type androidx.navigation.AnimBuilder instead of void): method androidx.navigation.AnimBuilder.setEnter(int)
 SetterReturnsThis: androidx.navigation.AnimBuilder#setExit(int):
@@ -145,8 +163,6 @@
     Methods must return the builder object (return type androidx.navigation.NavDestinationBuilder<D> instead of void): method androidx.navigation.NavDestinationBuilder.setLabel(CharSequence)
 SetterReturnsThis: androidx.navigation.NavOptionsBuilder#setLaunchSingleTop(boolean):
     Methods must return the builder object (return type androidx.navigation.NavOptionsBuilder instead of void): method androidx.navigation.NavOptionsBuilder.setLaunchSingleTop(boolean)
-SetterReturnsThis: androidx.navigation.NavOptionsBuilder#setPopUpTo(int):
-    Methods must return the builder object (return type androidx.navigation.NavOptionsBuilder instead of void): method androidx.navigation.NavOptionsBuilder.setPopUpTo(int)
 SetterReturnsThis: androidx.navigation.PopUpToBuilder#setInclusive(boolean):
     Methods must return the builder object (return type androidx.navigation.PopUpToBuilder instead of void): method androidx.navigation.PopUpToBuilder.setInclusive(boolean)
 
diff --git a/navigation/navigation-common/api/current.txt b/navigation/navigation-common/api/current.txt
index 1901865..5f8904b 100644
--- a/navigation/navigation-common/api/current.txt
+++ b/navigation/navigation-common/api/current.txt
@@ -100,6 +100,21 @@
     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();
@@ -177,6 +192,7 @@
     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);
@@ -187,11 +203,13 @@
     method public final void removeArgument(String argumentName);
     method public final void setId(int id);
     method public final void setLabel(CharSequence? p);
+    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;
   }
 
@@ -206,6 +224,7 @@
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method 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();
@@ -214,10 +233,12 @@
     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? p);
     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 {
@@ -238,15 +259,21 @@
     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 @IdRes public final int getStartDestination();
+    method public final androidx.navigation.NavDestination? findNode(String? route);
+    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);
-    property @IdRes public final int startDestination;
+    method public final void setStartDestination(String startDestRoute);
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
     ctor 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);
@@ -257,12 +284,16 @@
 
   public final class NavGraphBuilderKt {
     method 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 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);
@@ -271,8 +302,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public final class NavOptions {
@@ -280,7 +309,9 @@
     method @AnimRes @AnimatorRes public int getExitAnim();
     method @AnimRes @AnimatorRes public int getPopEnterAnim();
     method @AnimRes @AnimatorRes public int getPopExitAnim();
-    method @IdRes public int getPopUpTo();
+    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();
@@ -289,7 +320,8 @@
     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 popUpTo;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
   }
 
   public static final class NavOptions.Builder {
@@ -302,6 +334,8 @@
     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);
   }
 
@@ -309,14 +343,19 @@
     ctor public NavOptionsBuilder();
     method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
     method public boolean getLaunchSingleTop();
-    method public int getPopUpTo();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
     method public boolean getRestoreState();
-    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    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 p);
-    method public void setPopUpTo(int value);
+    method @Deprecated public void setPopUpTo(int value);
     method public void setRestoreState(boolean p);
     property public final boolean launchSingleTop;
-    property public final int popUpTo;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
     property public final boolean restoreState;
   }
 
@@ -398,10 +437,18 @@
   public abstract class Navigator<D extends androidx.navigation.NavDestination> {
     ctor public Navigator();
     method public abstract D createDestination();
-    method public abstract androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    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 abstract boolean popBackStack();
+    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 {
@@ -427,6 +474,15 @@
     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 void add(androidx.navigation.NavBackStackEntry backStackEntry);
+    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 void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+  }
+
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
     ctor public PopUpToBuilder();
     method public boolean getInclusive();
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index d67af72..5159fc4 100644
--- a/navigation/navigation-common/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_current.txt
@@ -102,6 +102,29 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.lifecycle.Lifecycle.State getMaxLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void replaceArguments(android.os.Bundle? newArgs);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void saveState(android.os.Bundle outBundle);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setArguments(android.os.Bundle? p);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setMaxLifecycle(androidx.lifecycle.Lifecycle.State maxState);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void updateState();
+    property public final android.os.Bundle? arguments;
+    property public final androidx.navigation.NavDestination destination;
+    property public final String id;
+    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.lifecycle.Lifecycle.State maxLifecycle;
+    property public final androidx.lifecycle.SavedStateHandle savedStateHandle;
+  }
+
   public final class NavDeepLink {
     ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public NavDeepLink(String uri);
     method public String? getAction();
@@ -191,6 +214,7 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.navigation.NavDestination.DeepLinkMatch? matchDeepLink(androidx.navigation.NavDeepLinkRequest navDeepLinkRequest);
@@ -204,6 +228,7 @@
     method public final void setId(int id);
     method public final void setLabel(CharSequence? p);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final void setParent(androidx.navigation.NavGraph? p);
+    method public final void setRoute(String? route);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public boolean supportsActions();
     property public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> arguments;
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public String displayName;
@@ -211,6 +236,7 @@
     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;
   }
 
@@ -235,6 +261,7 @@
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method 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();
@@ -243,10 +270,12 @@
     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? p);
     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 {
@@ -267,20 +296,25 @@
     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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.navigation.NavDestination? findNode(@IdRes int resid, boolean searchParents);
+    method public final androidx.navigation.NavDestination? findNode(String? route);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.collection.SparseArrayCompat<androidx.navigation.NavDestination> getNodes();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final String getStartDestDisplayName();
-    method @IdRes public final int getStartDestination();
+    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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.collection.SparseArrayCompat<androidx.navigation.NavDestination> nodes;
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final String startDestDisplayName;
-    property @IdRes public final int startDestination;
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
     ctor 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);
@@ -291,12 +325,16 @@
 
   public final class NavGraphBuilderKt {
     method 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 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);
@@ -305,8 +343,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public final class NavOptions {
@@ -314,7 +350,9 @@
     method @AnimRes @AnimatorRes public int getExitAnim();
     method @AnimRes @AnimatorRes public int getPopEnterAnim();
     method @AnimRes @AnimatorRes public int getPopExitAnim();
-    method @IdRes public int getPopUpTo();
+    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();
@@ -323,7 +361,8 @@
     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 popUpTo;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
   }
 
   public static final class NavOptions.Builder {
@@ -336,6 +375,8 @@
     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);
   }
 
@@ -343,14 +384,19 @@
     ctor public NavOptionsBuilder();
     method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
     method public boolean getLaunchSingleTop();
-    method public int getPopUpTo();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
     method public boolean getRestoreState();
-    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    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 p);
-    method public void setPopUpTo(int value);
+    method @Deprecated public void setPopUpTo(int value);
     method public void setRestoreState(boolean p);
     property public final boolean launchSingleTop;
-    property public final int popUpTo;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
     property public final boolean restoreState;
   }
 
@@ -437,10 +483,18 @@
   public abstract class Navigator<D extends androidx.navigation.NavDestination> {
     ctor public Navigator();
     method public abstract D createDestination();
-    method public abstract androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    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 abstract boolean popBackStack();
+    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 {
@@ -468,6 +522,15 @@
     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 void add(androidx.navigation.NavBackStackEntry backStackEntry);
+    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 void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+  }
+
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
     ctor public PopUpToBuilder();
     method public boolean getInclusive();
diff --git a/navigation/navigation-common/api/restricted_current.txt b/navigation/navigation-common/api/restricted_current.txt
index 1901865..5f8904b 100644
--- a/navigation/navigation-common/api/restricted_current.txt
+++ b/navigation/navigation-common/api/restricted_current.txt
@@ -100,6 +100,21 @@
     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();
@@ -177,6 +192,7 @@
     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);
@@ -187,11 +203,13 @@
     method public final void removeArgument(String argumentName);
     method public final void setId(int id);
     method public final void setLabel(CharSequence? p);
+    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;
   }
 
@@ -206,6 +224,7 @@
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
     ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
     method 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();
@@ -214,10 +233,12 @@
     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? p);
     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 {
@@ -238,15 +259,21 @@
     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 @IdRes public final int getStartDestination();
+    method public final androidx.navigation.NavDestination? findNode(String? route);
+    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);
-    property @IdRes public final int startDestination;
+    method public final void setStartDestination(String startDestRoute);
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
     ctor 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);
@@ -257,12 +284,16 @@
 
   public final class NavGraphBuilderKt {
     method 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 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);
@@ -271,8 +302,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public final class NavOptions {
@@ -280,7 +309,9 @@
     method @AnimRes @AnimatorRes public int getExitAnim();
     method @AnimRes @AnimatorRes public int getPopEnterAnim();
     method @AnimRes @AnimatorRes public int getPopExitAnim();
-    method @IdRes public int getPopUpTo();
+    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();
@@ -289,7 +320,8 @@
     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 popUpTo;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
   }
 
   public static final class NavOptions.Builder {
@@ -302,6 +334,8 @@
     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);
   }
 
@@ -309,14 +343,19 @@
     ctor public NavOptionsBuilder();
     method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
     method public boolean getLaunchSingleTop();
-    method public int getPopUpTo();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
     method public boolean getRestoreState();
-    method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    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 p);
-    method public void setPopUpTo(int value);
+    method @Deprecated public void setPopUpTo(int value);
     method public void setRestoreState(boolean p);
     property public final boolean launchSingleTop;
-    property public final int popUpTo;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
     property public final boolean restoreState;
   }
 
@@ -398,10 +437,18 @@
   public abstract class Navigator<D extends androidx.navigation.NavDestination> {
     ctor public Navigator();
     method public abstract D createDestination();
-    method public abstract androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    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 abstract boolean popBackStack();
+    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 {
@@ -427,6 +474,15 @@
     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 void add(androidx.navigation.NavBackStackEntry backStackEntry);
+    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 void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+  }
+
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
     ctor public PopUpToBuilder();
     method public boolean getInclusive();
diff --git a/navigation/navigation-common/build.gradle b/navigation/navigation-common/build.gradle
index a38589f..fe1af8a2 100644
--- a/navigation/navigation-common/build.gradle
+++ b/navigation/navigation-common/build.gradle
@@ -28,10 +28,16 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
+    api("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1")
+    api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
+    api("androidx.savedstate:savedstate:1.0.0")
+    api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1")
     implementation("androidx.core:core-ktx:1.1.0")
     implementation("androidx.collection:collection-ktx:1.1.0")
 
     api(KOTLIN_STDLIB)
+    testImplementation(project(":navigation:navigation-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
     testImplementation(TRUTH)
@@ -42,8 +48,8 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(KOTLIN_STDLIB)
 }
 
diff --git a/navigation/navigation-common/lint-baseline.xml b/navigation/navigation-common/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-common/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
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 f609a5c..8ab7f8e 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
@@ -18,6 +18,8 @@
 
 import android.net.Uri
 import android.os.Bundle
+import androidx.core.net.toUri
+import androidx.navigation.NavDestination.Companion.createRoute
 import androidx.navigation.test.intArgument
 import androidx.navigation.test.stringArgument
 import androidx.test.filters.SmallTest
@@ -28,6 +30,61 @@
 @SmallTest
 class NavDestinationAndroidTest {
     @Test
+    fun setBlankRoute() {
+        val destination = NoOpNavigator().createDestination()
+        assertThat(destination.route).isNull()
+        assertThat(destination.id).isEqualTo(0)
+
+        try {
+            destination.route = ""
+        } catch (e: IllegalArgumentException) {
+            assertWithMessage("setting blank route should throw an error")
+                .that(e).hasMessageThat()
+                .contains("Cannot have an empty route")
+        }
+    }
+
+    @Test
+    fun setNullRoute() {
+        val destination = NoOpNavigator().createDestination()
+        assertThat(destination.route).isNull()
+        assertThat(destination.id).isEqualTo(0)
+
+        destination.route = "route"
+        destination.id = 1
+        assertThat(destination.route).isEqualTo("route")
+        assertThat(destination.id).isEqualTo(1)
+        assertThat(destination.hasDeepLink(createRoute("route").toUri())).isTrue()
+
+        destination.route = null
+        assertThat(destination.route).isNull()
+        assertThat(destination.id).isEqualTo(0)
+        assertThat(destination.hasDeepLink(createRoute("route").toUri())).isFalse()
+    }
+
+    @Test
+    fun setRouteChangesId() {
+        val destination = NoOpNavigator().createDestination()
+        destination.id = 1
+        assertThat(destination.id).isEqualTo(1)
+
+        destination.route = "test"
+        assertThat(destination.route).isEqualTo("test")
+        assertThat(destination.id).isNotEqualTo(1)
+    }
+
+    @Test
+    fun setIdKeepsRoute() {
+        val destination = NoOpNavigator().createDestination()
+        destination.route = "test"
+        assertThat(destination.route).isEqualTo("test")
+
+        destination.id = 1
+        assertThat(destination.id).isEqualTo(1)
+        assertThat(destination.route).isEqualTo("test")
+    }
+
+    @Test
     fun matchDeepLink() {
         val destination = NoOpNavigator().createDestination()
         destination.addArgument("id", intArgument())
@@ -112,6 +169,26 @@
     }
 
     @Test
+    fun matchDeepLinkBestMatchPathTail() {
+        val destination = NoOpNavigator().createDestination()
+
+        destination.addArgument("id", stringArgument())
+        destination.addDeepLink("www.example.com/users/{id}")
+        destination.addDeepLink("www.example.com/users/{id}/posts")
+
+        val match = destination.matchDeepLink(
+            Uri.parse("https://www.example.com/users/u43/posts")
+        )
+
+        assertWithMessage("Deep link should match")
+            .that(match)
+            .isNotNull()
+        assertWithMessage("Deep link should extract id argument correctly")
+            .that(match?.matchingArgs?.getString("id"))
+            .isEqualTo("u43")
+    }
+
+    @Test
     fun matchDeepLinkBestMimeType() {
         val destination = NoOpNavigator().createDestination()
 
@@ -157,6 +234,17 @@
     }
 
     @Test
+    fun testRouteCreatesValidDeepLink() {
+        val destination = NoOpNavigator().createDestination()
+        destination.route = "route"
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/route")
+        destination.addDeepLink(deepLink.toString())
+
+        assertWithMessage("Deep link should match")
+            .that(destination.hasDeepLink(deepLink)).isTrue()
+    }
+
+    @Test
     fun testIsValidDeepLinkValidLinkPattern() {
         val destination = NoOpNavigator().createDestination()
         destination.addArgument("testString", stringArgument())
@@ -179,6 +267,18 @@
     }
 
     @Test
+    fun testIsValidDeepLinkInvalidLinkPathTail() {
+        val destination = NoOpNavigator().createDestination()
+        destination.addArgument("testString", stringArgument())
+        destination.addDeepLink("android-app://androidx.navigation.test/{testString}")
+
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test/extra")
+
+        assertWithMessage("Deep link should not match")
+            .that(destination.hasDeepLink(deepLink)).isFalse()
+    }
+
+    @Test
     fun addInDefaultArgs() {
         val destination = NoOpNavigator().createDestination()
         destination.addArgument("stringArg", stringArgument("aaa"))
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
index ff74348..68fa76a 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationBuilderTest.kt
@@ -40,6 +40,14 @@
     }
 
     @Test
+    fun navDestinationRoute() {
+        val destination = provider.navDestination(DESTINATION_ROUTE) { }
+        assertWithMessage("NavDestination should have route set")
+            .that(destination.route)
+            .isEqualTo(DESTINATION_ROUTE)
+    }
+
+    @Test
     fun navDestinationLabel() {
         val destination = provider.navDestination(DESTINATION_ID) {
             label = LABEL
@@ -86,7 +94,7 @@
             action(ACTION_ID) {
                 destinationId = DESTINATION_ID
                 navOptions {
-                    popUpTo = DESTINATION_ID
+                    popUpTo(DESTINATION_ID)
                 }
                 defaultArguments[ACTION_ARGUMENT_KEY] = ACTION_ARGUMENT_VALUE
             }
@@ -96,7 +104,7 @@
             .that(action)
             .isNotNull()
         assertWithMessage("NavAction should have NavOptions set")
-            .that(action?.navOptions?.popUpTo)
+            .that(action?.navOptions?.popUpToId)
             .isEqualTo(DESTINATION_ID)
         assertWithMessage("NavAction should have its default argument set")
             .that(action?.defaultArguments?.getString(ACTION_ARGUMENT_KEY))
@@ -105,6 +113,7 @@
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "route"
 private const val LABEL = "TEST"
 private const val ACTION_ID = 1
 private const val ACTION_ARGUMENT_KEY = "KEY"
@@ -119,3 +128,14 @@
     @IdRes id: Int,
     builder: NavDestinationBuilder<NavDestination>.() -> Unit
 ): NavDestination = NavDestinationBuilder(this[NoOpNavigator::class], id).apply(builder).build()
+
+/**
+ * Instead of constructing a NavGraph from the NavigatorProvider, construct
+ * a NavDestination directly to allow for testing NavDestinationBuilder in
+ * isolation.
+ */
+fun NavigatorProvider.navDestination(
+    route: String,
+    builder: NavDestinationBuilder<NavDestination>.() -> Unit
+): NavDestination =
+    NavDestinationBuilder(this[NoOpNavigator::class], route = route).apply(builder).build()
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
index a0cdb66..d47d5f2 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphAndroidTest.kt
@@ -26,8 +26,10 @@
 class NavGraphAndroidTest {
     companion object {
         const val DESTINATION_ID = 1
+        const val DESTINATION_ROUTE = "destination_route"
         const val DESTINATION_LABEL = "test_label"
         const val GRAPH_ID = 2
+        const val GRAPH_ROUTE = "graph_route"
         const val GRAPH_LABEL = "graph_label"
     }
 
@@ -240,7 +242,7 @@
             .createDestination().apply {
                 id = GRAPH_ID
                 label = GRAPH_LABEL
-                startDestination = DESTINATION_ID
+                setStartDestination(DESTINATION_ID)
             }
         val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) label=$GRAPH_LABEL " +
             "startDestination=0x${DESTINATION_ID.toString(16)}"
@@ -248,6 +250,24 @@
     }
 
     @Test
+    fun toStringStartDestRouteOnly() {
+        val navigatorProvider = NavigatorProvider().apply {
+            addNavigator(NavGraphNavigator(this))
+            addNavigator(NoOpNavigator())
+        }
+        val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+            .createDestination().apply {
+                route = GRAPH_ROUTE
+                id = GRAPH_ID
+                label = GRAPH_LABEL
+                setStartDestination(DESTINATION_ROUTE)
+            }
+        val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) route=$GRAPH_ROUTE " +
+            "label=$GRAPH_LABEL startDestination=$DESTINATION_ROUTE"
+        assertThat(graph.toString()).isEqualTo(expected)
+    }
+
+    @Test
     fun toStringStartDestInNodes() {
         val navigatorProvider = NavigatorProvider().apply {
             addNavigator(NavGraphNavigator(this))
@@ -262,7 +282,7 @@
             .createDestination().apply {
                 id = GRAPH_ID
                 label = GRAPH_LABEL
-                startDestination = DESTINATION_ID
+                setStartDestination(DESTINATION_ID)
                 addDestination(destination)
             }
         val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) label=$GRAPH_LABEL " +
@@ -270,4 +290,82 @@
             "label=$DESTINATION_LABEL}"
         assertThat(graph.toString()).isEqualTo(expected)
     }
+
+    @Test
+    fun toStringStartDestInNodesRoute() {
+        val navigatorProvider = NavigatorProvider().apply {
+            addNavigator(NavGraphNavigator(this))
+            addNavigator(NoOpNavigator())
+        }
+        val destination = navigatorProvider.getNavigator(NoOpNavigator::class.java)
+            .createDestination().apply {
+                route = DESTINATION_ROUTE
+                id = DESTINATION_ID
+                label = DESTINATION_LABEL
+            }
+        val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+            .createDestination().apply {
+                route = GRAPH_ROUTE
+                id = GRAPH_ID
+                label = GRAPH_LABEL
+                setStartDestination(DESTINATION_ROUTE)
+                setStartDestination(DESTINATION_ID)
+                addDestination(destination)
+            }
+        val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) route=$GRAPH_ROUTE " +
+            "label=$GRAPH_LABEL " +
+            "startDestination={NavDestination(0x${DESTINATION_ID.toString(16)}) " +
+            "route=$DESTINATION_ROUTE label=$DESTINATION_LABEL}"
+        assertThat(graph.toString()).isEqualTo(expected)
+    }
+
+    @Test
+    fun toStringStartDestInNodesRouteWithStartDestID() {
+        val navigatorProvider = NavigatorProvider().apply {
+            addNavigator(NavGraphNavigator(this))
+            addNavigator(NoOpNavigator())
+        }
+        val destination = navigatorProvider.getNavigator(NoOpNavigator::class.java)
+            .createDestination().apply {
+                route = DESTINATION_ROUTE
+                label = DESTINATION_LABEL
+            }
+        val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+            .createDestination().apply {
+                route = GRAPH_ROUTE
+                id = GRAPH_ID
+                label = GRAPH_LABEL
+                setStartDestination(DESTINATION_ROUTE)
+                setStartDestination(DESTINATION_ID)
+                addDestination(destination)
+            }
+        val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) route=$GRAPH_ROUTE " +
+            "label=$GRAPH_LABEL startDestination=0x${DESTINATION_ID.toString(16)}"
+        assertThat(graph.toString()).isEqualTo(expected)
+    }
+
+    @Test
+    fun toStringStartDestInNodesRouteWithID() {
+        val navigatorProvider = NavigatorProvider().apply {
+            addNavigator(NavGraphNavigator(this))
+            addNavigator(NoOpNavigator())
+        }
+        val destination = navigatorProvider.getNavigator(NoOpNavigator::class.java)
+            .createDestination().apply {
+                route = DESTINATION_ROUTE
+                id = DESTINATION_ID
+                label = DESTINATION_LABEL
+            }
+        val graph = navigatorProvider.getNavigator(NavGraphNavigator::class.java)
+            .createDestination().apply {
+                route = GRAPH_ROUTE
+                id = GRAPH_ID
+                label = GRAPH_LABEL
+                setStartDestination(DESTINATION_ROUTE)
+                addDestination(destination)
+            }
+        val expected = "NavGraph(0x${GRAPH_ID.toString(16)}) route=$GRAPH_ROUTE " +
+            "label=$GRAPH_LABEL startDestination=$DESTINATION_ROUTE"
+        assertThat(graph.toString()).isEqualTo(expected)
+    }
 }
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
index cef5597..cb75a08 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphBuilderTest.kt
@@ -43,6 +43,18 @@
     }
 
     @Test
+    fun navigationRoute() {
+        val graph = provider.navigation(
+            startDestination = DESTINATION_ROUTE
+        ) {
+            navDestination(DESTINATION_ROUTE) {}
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+    }
+
+    @Test
     fun navigationUnaryPlus() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
             +provider[NoOpNavigator::class].createDestination().apply {
@@ -55,6 +67,20 @@
     }
 
     @Test
+    fun navigationUnaryPlusRoute() {
+        val graph = provider.navigation(
+            startDestination = DESTINATION_ROUTE
+        ) {
+            +provider[NoOpNavigator::class].createDestination().apply {
+                route = DESTINATION_ROUTE
+            }
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+    }
+
+    @Test
     fun navigationAddDestination() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
             val destination = provider[NoOpNavigator::class].createDestination().apply {
@@ -67,6 +93,21 @@
             .isTrue()
     }
 
+    @Test
+    fun navigationAddDestinationRoute() {
+        val graph = provider.navigation(
+            startDestination = DESTINATION_ROUTE
+        ) {
+            val destination = provider[NoOpNavigator::class].createDestination().apply {
+                route = DESTINATION_ROUTE
+            }
+            addDestination(destination)
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+    }
+
     @Test(expected = IllegalStateException::class)
     fun navigationMissingStartDestination() {
         provider.navigation(startDestination = 0) {
@@ -75,6 +116,14 @@
         fail("NavGraph should throw IllegalStateException if startDestination is zero")
     }
 
+    @Test(expected = IllegalArgumentException::class)
+    fun navigationMissingStartDestinationRoute() {
+        provider.navigation(startDestination = "") {
+            navDestination(DESTINATION_ROUTE) {}
+        }
+        fail("NavGraph should throw IllegalStateException if no startDestinationRoute is set")
+    }
+
     @Test
     fun navigationNested() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
@@ -86,10 +135,24 @@
             .that(DESTINATION_ID in graph)
             .isTrue()
     }
+
+    @Test
+    fun navigationNestedRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            navigation(startDestination = SECOND_DESTINATION_ROUTE, route = DESTINATION_ROUTE) {
+                navDestination(SECOND_DESTINATION_ROUTE) {}
+            }
+        }
+        assertWithMessage("Destination should be added to the graph")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+    }
 }
 
 private const val DESTINATION_ID = 1
 private const val SECOND_DESTINATION_ID = 2
+private const val DESTINATION_ROUTE = "first"
+private const val SECOND_DESTINATION_ROUTE = "second"
 
 /**
  * Create a base NavDestination. Generally, only subtypes of NavDestination should be
@@ -99,3 +162,12 @@
     @IdRes id: Int,
     builder: NavDestinationBuilder<NavDestination>.() -> Unit
 ) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], id).apply(builder))
+
+/**
+ * Create a base NavDestination. Generally, only subtypes of NavDestination should be
+ * added to a NavGraph (hence why this is not in the common-ktx library)
+ */
+fun NavGraphBuilder.navDestination(
+    route: String,
+    builder: NavDestinationBuilder<NavDestination>.() -> Unit
+) = destination(NavDestinationBuilder(provider[NoOpNavigator::class], route).apply(builder))
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt
index 6eb1a90c..c0b072a 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavGraphTest.kt
@@ -75,6 +75,28 @@
             .isFalse()
     }
 
+    @Test
+    fun plusAssignGraphRoute() {
+        val graph = NavGraph(navGraphNavigator)
+        val other = NavGraph(navGraphNavigator)
+        other += navigator.createDestination().apply { route = DESTINATION_ROUTE }
+        other += navigator.createDestination().apply { route = SECOND_DESTINATION_ROUTE }
+        graph += other
+        assertWithMessage("NavGraph should have destination1 from other")
+            .that(DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("other nav graph should not have destination1")
+            .that(DESTINATION_ROUTE in other)
+            .isFalse()
+
+        assertWithMessage("NavGraph should have destination2 from other")
+            .that(SECOND_DESTINATION_ROUTE in graph)
+            .isTrue()
+        assertWithMessage("other nav graph should not have destination2")
+            .that(SECOND_DESTINATION_ROUTE in other)
+            .isFalse()
+    }
+
     @Test(expected = IllegalArgumentException::class)
     fun getIllegalArgumentException() {
         val graph = NavGraph(navGraphNavigator)
@@ -84,3 +106,5 @@
 
 private const val DESTINATION_ID = 1
 private const val SECOND_DESTINATION_ID = 2
+private const val DESTINATION_ROUTE = "first"
+private const val SECOND_DESTINATION_ROUTE = "second"
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
index f62b37e..bf40bfd 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavOptionsBuilderTest.kt
@@ -49,10 +49,10 @@
     @Test
     fun popUpTo() {
         val navOptions = navOptions {
-            popUpTo = DESTINATION_ID
+            popUpTo(DESTINATION_ID)
         }
         assertWithMessage("NavOptions should have popUpTo destination id set")
-            .that(navOptions.popUpTo)
+            .that(navOptions.popUpToId)
             .isEqualTo(DESTINATION_ID)
         assertWithMessage("NavOptions should have isPopUpToInclusive false by default")
             .that(navOptions.isPopUpToInclusive())
@@ -63,6 +63,19 @@
     }
 
     @Test
+    fun popUpToRoute() {
+        val navOptions = navOptions {
+            popUpTo(DESTINATION_ROUTE)
+        }
+        assertWithMessage("NavOptions should have popUpTo destination route set")
+            .that(navOptions.popUpToRoute)
+            .isEqualTo(DESTINATION_ROUTE)
+        assertWithMessage("NavOptions should have isPopUpToInclusive false by default")
+            .that(navOptions.isPopUpToInclusive())
+            .isFalse()
+    }
+
+    @Test
     fun popUpToBuilder() {
         val navOptions = navOptions {
             popUpTo(DESTINATION_ID) {
@@ -71,7 +84,7 @@
             }
         }
         assertWithMessage("NavOptions should have popUpTo destination id set")
-            .that(navOptions.popUpTo)
+            .that(navOptions.popUpToId)
             .isEqualTo(DESTINATION_ID)
         assertWithMessage("NavOptions should have isPopUpToInclusive set")
             .that(navOptions.isPopUpToInclusive())
@@ -82,6 +95,21 @@
     }
 
     @Test
+    fun popUpToRouteInclusive() {
+        val navOptions = navOptions {
+            popUpTo(DESTINATION_ROUTE) {
+                inclusive = true
+            }
+        }
+        assertWithMessage("NavOptions should have popUpTo destination id set")
+            .that(navOptions.popUpToRoute)
+            .isEqualTo(DESTINATION_ROUTE)
+        assertWithMessage("NavOptions should have isPopUpToInclusive set")
+            .that(navOptions.isPopUpToInclusive())
+            .isTrue()
+    }
+
+    @Test
     fun anim() {
         val navOptions = navOptions {
             anim {
@@ -107,6 +135,7 @@
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "destination_route"
 
 private const val ENTER_ANIM_ID = 10
 private const val EXIT_ANIM_ID = 11
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt
index f01b81f..4659a2b 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavTypeTest.kt
@@ -48,6 +48,8 @@
         private val parcelable = ActivityInfo()
         private val parcelables = arrayOf(parcelable)
         private val en = Bitmap.Config.ALPHA_8
+        private val enString = "ALPHA_8"
+        private val enStringCasing = "alpha_8"
         private val serializable = Person()
         private val serializables = arrayOf(Bitmap.Config.ALPHA_8)
         private val parcelableNavType = NavType.ParcelableType(ActivityInfo::class.java)
@@ -242,4 +244,13 @@
         assertThat(NavType.ReferenceType.parseValue(referenceHex))
             .isEqualTo(reference)
     }
+
+    @Test
+    fun parseEnumValue() {
+        assertThat(enumNavType.parseValue(enString))
+            .isEqualTo(en)
+
+        assertThat(enumNavType.parseValue(enStringCasing))
+            .isEqualTo(en)
+    }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
index d1ea69e..d2adc759 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavArgument.kt
@@ -52,7 +52,7 @@
 
     /**
      * Returns the default value of this argument or `null` if it doesn't have a default value.
-     * Use [.isDefaultValuePresent] to distinguish between `null` and absence of a value.
+     * Use [isDefaultValuePresent] to distinguish between `null` and absence of a value.
      * @return The default value assigned to this argument.
      */
     public val defaultValue: Any?
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
new file mode 100644
index 0000000..59e3987
--- /dev/null
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.navigation
+
+import android.app.Application
+import android.content.Context
+import android.os.Bundle
+import androidx.annotation.RestrictTo
+import androidx.lifecycle.AbstractSavedStateViewModelFactory
+import androidx.lifecycle.HasDefaultViewModelProviderFactory
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.SavedStateViewModelFactory
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import java.util.UUID
+
+/**
+ * Representation of an entry in the back stack of a [androidx.navigation.NavController]. The
+ * [Lifecycle], [ViewModelStore], and [SavedStateRegistry] provided via
+ * this object are valid for the lifetime of this destination on the back stack: when this
+ * destination is popped off the back stack, the lifecycle will be destroyed, state
+ * will no longer be saved, and ViewModels will be cleared.
+ */
+public class NavBackStackEntry private constructor(
+    private val context: Context?,
+    /**
+     * Gets the destination associated with this entry
+     * @return The destination that is currently visible to users
+     */
+    public val destination: NavDestination,
+    /**
+     * Gets the arguments used for this entry
+     * @return The arguments used when this entry was created
+     */
+    @set:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public var arguments: Bundle? = null,
+    navControllerLifecycleOwner: LifecycleOwner? = null,
+    private val viewModelStoreProvider: NavViewModelStoreProvider? = null,
+    /**
+     * Gets the unique ID that serves as the identity of this entry
+     * @return the unique ID of this entry
+     */
+    public val id: String = UUID.randomUUID().toString(),
+    private val savedState: Bundle? = null
+) : LifecycleOwner,
+    ViewModelStoreOwner,
+    HasDefaultViewModelProviderFactory,
+    SavedStateRegistryOwner {
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public companion object {
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public fun create(
+            context: Context?,
+            destination: NavDestination,
+            arguments: Bundle? = null,
+            navControllerLifecycleOwner: LifecycleOwner? = null,
+            viewModelStoreProvider: NavViewModelStoreProvider? = null,
+            id: String = UUID.randomUUID().toString(),
+            savedState: Bundle? = null
+        ): NavBackStackEntry = NavBackStackEntry(
+            context, destination, arguments,
+            navControllerLifecycleOwner, 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)
+    }
+
+    /**
+     * Gets the [SavedStateHandle] for this entry.
+     *
+     * @return the SavedStateHandle for this entry
+     */
+    public val savedStateHandle: SavedStateHandle by lazy {
+        check(lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
+            "You cannot access the NavBackStackEntry's SavedStateHandle until it is added to " +
+                "the NavController's back stack (i.e., the Lifecycle of the NavBackStackEntry " +
+                "reaches the CREATED state)."
+        }
+        ViewModelProvider(
+            this, NavResultSavedStateFactory(this, null)
+        ).get(SavedStateViewModel::class.java).handle
+    }
+
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun replaceArguments(newArgs: Bundle?) {
+        arguments = newArgs
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * If the [androidx.navigation.NavHost] has not called
+     * [androidx.navigation.NavHostController.setLifecycleOwner], the
+     * Lifecycle will be capped at [Lifecycle.State.CREATED].
+     */
+    public override fun getLifecycle(): Lifecycle {
+        return lifecycle
+    }
+
+    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @set:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public var maxLifecycle: Lifecycle.State = Lifecycle.State.INITIALIZED
+        set(maxState) {
+            if (field == Lifecycle.State.INITIALIZED) {
+                // Perform the restore just when moving from the INITIALIZED state
+                savedStateRegistryController.performRestore(savedState)
+            }
+            field = maxState
+            updateState()
+        }
+
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun handleLifecycleEvent(event: Lifecycle.Event) {
+        hostLifecycleState = event.targetState
+        updateState()
+    }
+
+    /**
+     * Update the state to be the lower of the two constraints:
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun updateState() {
+        if (hostLifecycleState.ordinal < maxLifecycle.ordinal) {
+            lifecycle.currentState = hostLifecycleState
+        } else {
+            lifecycle.currentState = maxLifecycle
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws IllegalStateException if called before the [lifecycle] has moved to
+     * [Lifecycle.State.CREATED] or before the [androidx.navigation.NavHost] has called
+     * [androidx.navigation.NavHostController.setViewModelStore].
+     */
+    public override fun getViewModelStore(): ViewModelStore {
+        check(lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
+            "You cannot access the NavBackStackEntry's ViewModels until it is added to " +
+                "the NavController's back stack (i.e., the Lifecycle of the NavBackStackEntry " +
+                "reaches the CREATED state)."
+        }
+        checkNotNull(viewModelStoreProvider) {
+            "You must call setViewModelStore() on your NavHostController before accessing the " +
+                "ViewModelStore of a navigation graph."
+        }
+        return viewModelStoreProvider.getViewModelStore(id)
+    }
+
+    public override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory {
+        return defaultFactory
+    }
+
+    public override fun getSavedStateRegistry(): SavedStateRegistry {
+        return savedStateRegistryController.savedStateRegistry
+    }
+
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun saveState(outBundle: Bundle) {
+        savedStateRegistryController.performSave(outBundle)
+    }
+
+    /**
+     * Used to create the {SavedStateViewModel}
+     */
+    private class NavResultSavedStateFactory(
+        owner: SavedStateRegistryOwner,
+        defaultArgs: Bundle?
+    ) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
+        @Suppress("UNCHECKED_CAST")
+        override fun <T : ViewModel?> create(
+            key: String,
+            modelClass: Class<T>,
+            handle: SavedStateHandle
+        ): T {
+            return SavedStateViewModel(handle) as T
+        }
+    }
+
+    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 42d18c1..64914ca 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -79,7 +79,7 @@
             arguments.add(argName)
             // Use Pattern.quote() to treat the input string as a literal
             uriRegex.append(Pattern.quote(uri.substring(appendPos, matcher.start())))
-            uriRegex.append("(.+?)")
+            uriRegex.append("([^/]+?)")
             appendPos = matcher.end()
             exactDeepLink = false
         }
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 8cd67ef..963c1f2 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -34,12 +34,12 @@
  * Each destination is associated with a [Navigator] which knows how to navigate to this
  * particular destination.
  *
- * Destinations declare a set of [actions][.putAction] that they
+ * Destinations declare a set of [actions][putAction] that they
  * support. These actions form a navigation API for the destination; the same actions declared
  * on different destinations that fill similar roles allow application code to navigate based
  * on semantic intent.
  *
- * Each destination has a set of [arguments][.getArguments] that will
+ * Each destination has a set of [arguments][getArguments] that will
  * be applied when [navigating][NavController.navigate] to that destination.
  * Any default values for those arguments can be overridden at the time of navigation.
  */
@@ -58,7 +58,7 @@
     /**
      * This optional annotation allows tooling to offer auto-complete for the
      * `android:name` attribute. This should match the class type passed to
-     * [.parseClassFromName] when parsing the
+     * [parseClassFromName] when parsing the
      * `android:name` attribute.
      */
     @kotlin.annotation.Retention(AnnotationRetention.BINARY)
@@ -127,7 +127,7 @@
      * and nullability of the argument.
      *
      * To add and remove arguments for this NavDestination
-     * use [.addArgument] and [.removeArgument].
+     * use [addArgument] and [removeArgument].
      * @return Read-only map of argument names to arguments.
      */
     public val arguments: Map<String, NavArgument>
@@ -153,8 +153,12 @@
     @CallSuper
     public open fun onInflate(context: Context, attrs: AttributeSet) {
         context.resources.obtainAttributes(attrs, R.styleable.Navigator).use { array ->
-            id = array.getResourceId(R.styleable.Navigator_android_id, 0)
-            idName = getDisplayName(context, id)
+            route = array.getString(R.styleable.Navigator_route)
+
+            if (array.hasValue(R.styleable.Navigator_android_id)) {
+                id = array.getResourceId(R.styleable.Navigator_android_id, 0)
+                idName = getDisplayName(context, id)
+            }
             label = array.getText(R.styleable.Navigator_android_label)
         }
     }
@@ -179,6 +183,34 @@
         }
 
     /**
+     * Returns the destination's unique route.
+     *
+     * @return this destination's route, or null if no route is set
+     */
+    public var route: String? = null
+        /**
+         * Sets the destination's unique route. This will also update the [id] of the destination.
+         * Custom destination ids should only be set after setting the route.
+         *
+         * Setting the route to `null` means there is no route for this destination.
+         *
+         * @param route this destination's new route
+         * @throws IllegalArgumentException is the given route is empty
+         */
+        set(route) {
+            if (route == null) {
+                id = 0
+            } else {
+                require(route.isNotBlank()) { "Cannot have an empty route" }
+                val internalRoute = createRoute(route)
+                id = internalRoute.hashCode()
+                addDeepLink(internalRoute)
+            }
+            deepLinks.remove(deepLinks.firstOrNull { it.uriPattern == createRoute(field) })
+            field = route
+        }
+
+    /**
      * @hide
      */
     @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -187,7 +219,7 @@
 
     /**
      * Checks the given deep link [Uri], and determines whether it matches a Uri pattern added
-     * to the destination by a call to [.addDeepLink] . It returns `true`
+     * to the destination by a call to [addDeepLink] . It returns `true`
      * if the deep link is a valid match, and `false` otherwise.
      *
      * This should be called prior to [NavController.navigate] to ensure the deep link
@@ -206,7 +238,7 @@
     /**
      * Checks the given [NavDeepLinkRequest], and determines whether it matches a
      * [NavDeepLink] added to the destination by a call to
-     * [.addDeepLink]. It returns `true` if the request is a valid
+     * [addDeepLink]. It returns `true` if the request is a valid
      * match, and `false` otherwise.
      *
      * This should be called prior to [NavController.navigate] to
@@ -303,7 +335,7 @@
     /**
      * Determines if this NavDestination has a deep link matching the given Uri.
      * @param navDeepLinkRequest The request to match against all deep links added in
-     * [.addDeepLink]
+     * [addDeepLink]
      * @return The matching [NavDestination] and the appropriate [Bundle] of arguments
      * extracted from the Uri, or null if no match was found.
      */
@@ -357,7 +389,7 @@
                 hierarchy.addFirst(current)
                 break
             }
-            if (parent == null || parent.startDestination != current.id) {
+            if (parent == null || parent.startDestinationId != current.id) {
                 hierarchy.addFirst(current)
             }
             current = parent
@@ -376,7 +408,7 @@
 
     /**
      * Returns the [NavAction] for the given action ID. This will recursively check the
-     * [parent][.getParent] of this destination if the action destination is not found in
+     * [parent][getParent] of this destination if the action destination is not found in
      * this destination.
      *
      * @param id action ID to fetch
@@ -484,6 +516,10 @@
             sb.append(idName)
         }
         sb.append(")")
+        if (!route.isNullOrBlank()) {
+            sb.append(" route=")
+            sb.append(route)
+        }
         if (label != null) {
             sb.append(" label=")
             sb.append(label)
@@ -570,5 +606,12 @@
                 id.toString()
             }
         }
+
+        /**
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public fun createRoute(route: String?): String =
+            if (route != null) "android-app://androidx.navigation/$route" else ""
     }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
index faaed71..ceab39f 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestinationBuilder.kt
@@ -26,10 +26,53 @@
  * DSL for constructing a new [NavDestination]
  */
 @NavDestinationDsl
-public open class NavDestinationBuilder<out D : NavDestination>(
+public open class NavDestinationBuilder<out D : NavDestination> internal constructor(
+    /**
+     * Returns the navigator the destination was created from
+     *
+     * @return this destination's navigator
+     */
     protected val navigator: Navigator<out D>,
-    @IdRes public val id: Int
+    /**
+     * Returns the destination's unique ID.
+     *
+     * @return this destination's ID
+     */
+    @IdRes public val id: Int,
+    /**
+     * Returns the destination's unique route.
+     *
+     * @return this destination's route
+     */
+    public val route: String?
 ) {
+
+    /**
+     * DSL for constructing a new [NavDestination] with a unique id.
+     *
+     * This sets the destination's [route] to `null`.
+     *
+     * @param navigator navigator used to create the destination
+     * @param id the destination's unique id
+     *
+     * @return the newly constructed [NavDestination]
+     */
+    public constructor(navigator: Navigator<out D>, @IdRes id: Int) :
+        this(navigator, id, null)
+
+    /**
+     * DSL for constructing a new [NavDestination] with a unique route.
+     *
+     * This will also update the [id] of the destination based on route.
+     *
+     * @param navigator navigator used to create the destination
+     * @param route the destination's unique route
+     *
+     * @return the newly constructed [NavDestination]
+     */
+    public constructor(navigator: Navigator<out D>, route: String?) :
+        this(navigator, -1, route)
+
     /**
      * The descriptive label of the destination
      */
@@ -103,7 +146,12 @@
      */
     public open fun build(): D {
         return navigator.createDestination().also { destination ->
-            destination.id = id
+            if (route != null) {
+                destination.route = route
+            }
+            if (id != -1) {
+                destination.id = id
+            }
             destination.label = label
             arguments.forEach { (name, argument) ->
                 destination.addArgument(name, argument)
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
index 7ed033c..7932446 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraph.kt
@@ -29,12 +29,12 @@
  *
  * A NavGraph serves as a 'virtual' destination: while the NavGraph itself will not appear
  * on the back stack, navigating to the NavGraph will cause the
- * [starting destination][.getStartDestination] to be added to the back stack.
+ * [starting destination][getStartDestination] to be added to the back stack.
  */
 public open class NavGraph
 /**
  * Construct a new NavGraph. This NavGraph is not valid until you
- * [add a destination][.addDestination] and [set the starting destination][.setStartDestination].
+ * [add a destination][addDestination] and [set the starting destination][setStartDestination].
  *
  * @param navGraphNavigator The [NavGraphNavigator] which this destination will be associated
  *                          with. Generally retrieved via a
@@ -55,7 +55,7 @@
             attrs,
             R.styleable.NavGraphNavigator
         ).use {
-            startDestination = it.getResourceId(R.styleable.NavGraphNavigator_startDestination, 0)
+            startDestinationId = it.getResourceId(R.styleable.NavGraphNavigator_startDestination, 0)
             startDestIdName = getDisplayName(context, startDestId)
         }
     }
@@ -78,7 +78,7 @@
      *
      * The destination must not have a [parent][NavDestination.parent] set. If
      * the destination is already part of a [navigation graph][NavGraph], call
-     * [.remove] before calling this method.
+     * [remove] before calling this method.
      *
      * @param node destination to add
      * @throws IllegalArgumentException if destination does not have an id, the destination has
@@ -86,9 +86,15 @@
      */
     public fun addDestination(node: NavDestination) {
         val id = node.id
-        require(id != 0) {
-            "Destinations must have an id. Call setId() or include an android:id in your " +
-                "navigation XML."
+        val innerRoute = node.route
+        require(id != 0 || innerRoute != null) {
+            "Destinations must have an id or route. Call setId(), setRoute(), or include an " +
+                "android:id or app:route in your navigation XML."
+        }
+        if (route != null) {
+            require(innerRoute != route) {
+                "Destination $node cannot have the same route as graph $this"
+            }
         }
         require(id != this.id) { "Destination $node cannot have the same id as graph $this" }
         val existingDestination = nodes[id]
@@ -111,7 +117,7 @@
      * [NavDestination.id] id} set.
      *
      * Each destination must not have a [parent][NavDestination.parent] set. If any
-     * destination is already part of a [navigation graph][NavGraph], call [.remove] before
+     * destination is already part of a [navigation graph][NavGraph], call [remove] before
      * calling this method.
      *
      * @param nodes destinations to add
@@ -130,7 +136,7 @@
      * [NavDestination.id] id} set.
      *
      * Each destination must not have a [parent][NavDestination.parent] set. If any
-     * destination is already part of a [navigation graph][NavGraph], call [.remove] before
+     * destination is already part of a [navigation graph][NavGraph], call [remove] before
      * calling this method.
      *
      * @param nodes destinations to add
@@ -143,7 +149,7 @@
 
     /**
      * Finds a destination in the collection by ID. This will recursively check the
-     * [parent][.getParent] of this navigation graph if node is not found in this navigation graph.
+     * [parent][getParent] of this navigation graph if node is not found in this navigation graph.
      *
      * @param resid ID to locate
      * @return the node with ID resid
@@ -152,6 +158,20 @@
         return findNode(resid, true)
     }
 
+    /**
+     * Finds a destination in the collection by route. This will recursively check the
+     * [parent][getParent] of this navigation graph if node is not found in this navigation graph.
+     *
+     * @param route Route to locate
+     * @return the node with route
+     */
+    public fun findNode(route: String?): NavDestination? {
+        return if (!route.isNullOrBlank()) findNode(route, true) else null
+    }
+
+    /**
+     * @hide
+     */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun findNode(@IdRes resid: Int, searchParents: Boolean): NavDestination? {
         val destination = nodes[resid]
@@ -162,6 +182,19 @@
     }
 
     /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun findNode(route: String, searchParents: Boolean): NavDestination? {
+        val id = createRoute(route).hashCode()
+        val destination = nodes[id]
+        // Search the parent for the NavDestination if it is not a child of this navigation graph
+        // and searchParents is true
+        return destination
+            ?: if (searchParents && parent != null) parent!!.findNode(route) else null
+    }
+
+    /**
      * @throws NoSuchElementException if there no more elements
      */
     public final override fun iterator(): MutableIterator<NavDestination> {
@@ -239,8 +272,18 @@
          */
         get() = if (id != 0) super.displayName else "the root navigation"
 
+    /**
+     * Returns the starting destination for this NavGraph. When navigating to the NavGraph, this
+     * destination is the one the user will initially see.
+     *
+     * @return the start destination
+     */
+    @IdRes
+    @Deprecated("Use getStartDestinationId instead.", ReplaceWith("startDestinationId"))
+    public fun getStartDestination(): Int = startDestinationId
+
     @get:IdRes
-    public var startDestination: Int
+    public var startDestinationId: Int
         /**
          * Returns the starting destination for this NavGraph. When navigating to the NavGraph, this
          * destination is the one the user will initially see.
@@ -248,20 +291,64 @@
          * @return the start destination
          */
         get() = startDestId
-        /**
-         * Sets the starting destination for this NavGraph.
-         *
-         * @param startDestId The id of the destination to be shown when navigating to this
-         *                    NavGraph.
-         */
-        set(startDestId) {
+        private set(startDestId) {
             require(startDestId != id) {
                 "Start destination $startDestId cannot use the same id as the graph $this"
             }
+            if (startDestinationRoute != null) {
+                startDestinationRoute = null
+            }
             this.startDestId = startDestId
             startDestIdName = null
         }
 
+    /**
+     * Sets the starting destination for this NavGraph.
+     *
+     * This will clear any previously set [startDestinationRoute]
+     *
+     * @param startDestId The id of the destination to be shown when navigating to this
+     *                    NavGraph.
+     */
+    public fun setStartDestination(startDestId: Int) {
+        startDestinationId = startDestId
+    }
+
+    /**
+     * Sets the starting destination for this NavGraph.
+     *
+     * This will override any previously set [startDestinationId]
+     *
+     * @param startDestRoute The route of the destination to be shown when navigating to this
+     *                    NavGraph.
+     */
+    public fun setStartDestination(startDestRoute: String) {
+        startDestinationRoute = startDestRoute
+    }
+
+    /**
+     * Returns the route for the starting destination for this NavGraph. When navigating to the
+     * NavGraph, this destination is the one the user will initially see.
+     *
+     * @return the start destination
+     */
+    public var startDestinationRoute: String? = null
+        private set(startDestRoute) {
+            startDestId = if (startDestRoute == null) {
+                0
+            } else {
+                require(startDestRoute != route) {
+                    "Start destination $startDestRoute cannot use the same route as the graph $this"
+                }
+                require(startDestRoute.isNotBlank()) {
+                    "Cannot have an empty start destination route"
+                }
+                val internalRoute = createRoute(startDestRoute)
+                internalRoute.hashCode()
+            }
+            field = startDestRoute
+        }
+
     public val startDestDisplayName: String
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         get() {
@@ -274,14 +361,13 @@
     public override fun toString(): String {
         val sb = StringBuilder()
         sb.append(super.toString())
+        val startDestination = findNode(startDestinationRoute) ?: findNode(startDestinationId)
         sb.append(" startDestination=")
-        val startDestination = findNode(startDestination)
         if (startDestination == null) {
-            if (startDestIdName == null) {
-                sb.append("0x")
-                sb.append(Integer.toHexString(startDestId))
-            } else {
-                sb.append(startDestIdName)
+            when {
+                startDestinationRoute != null -> sb.append(startDestinationRoute)
+                startDestIdName != null -> sb.append(startDestIdName)
+                else -> sb.append("0x${Integer.toHexString(startDestId)}")
             }
         } else {
             sb.append("{")
@@ -301,9 +387,22 @@
 public inline operator fun NavGraph.get(@IdRes id: Int): NavDestination =
     findNode(id) ?: throw IllegalArgumentException("No destination for $id was found in $this")
 
+/**
+ * Returns the destination with `route`.
+ *
+ * @throws IllegalArgumentException if no destination is found with that route.
+ */
+@Suppress("NOTHING_TO_INLINE")
+public inline operator fun NavGraph.get(route: String): NavDestination =
+    findNode(route)
+        ?: throw IllegalArgumentException("No destination for $route was found in $this")
+
 /** Returns `true` if a destination with `id` is found in this navigation graph. */
 public operator fun NavGraph.contains(@IdRes id: Int): Boolean = findNode(id) != null
 
+/** Returns `true` if a destination with `route` is found in this navigation graph. */
+public operator fun NavGraph.contains(route: String): Boolean = findNode(route) != null
+
 /**
  * Adds a destination to this NavGraph. The destination must have an
  * [id][NavDestination.getId] set.
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
index e357290..cfe6d65 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphBuilder.kt
@@ -20,6 +20,12 @@
 
 /**
  * Construct a new [NavGraph]
+ *
+ * @param id the destination's unique id
+ * @param startDestination the starting destination for this NavGraph
+ * @param builder the builder used to construct the graph
+ *
+ * @return the newly constructed NavGraph
  */
 public inline fun NavigatorProvider.navigation(
     @IdRes id: Int = 0,
@@ -28,7 +34,29 @@
 ): NavGraph = NavGraphBuilder(this, id, startDestination).apply(builder).build()
 
 /**
+ * Construct a new [NavGraph]
+ *
+ * @param startDestination the starting destination's route for this NavGraph
+ * @param route the destination's unique route
+ * @param builder the builder used to construct the graph
+ *
+ * @return the newly constructed NavGraph
+ */
+public inline fun NavigatorProvider.navigation(
+    startDestination: String,
+    route: String? = null,
+    builder: NavGraphBuilder.() -> Unit
+): NavGraph = NavGraphBuilder(this, startDestination, route).apply(builder)
+    .build()
+
+/**
  * Construct a nested [NavGraph]
+ *
+ * @param id the destination's unique id
+ * @param startDestination the starting destination for this NavGraph
+ * @param builder the builder used to construct the graph
+ *
+ * @return the newly constructed nested NavGraph
  */
 public inline fun NavGraphBuilder.navigation(
     @IdRes id: Int,
@@ -37,14 +65,70 @@
 ): Unit = destination(NavGraphBuilder(provider, id, startDestination).apply(builder))
 
 /**
+ * Construct a nested [NavGraph]
+ *
+ * @param startDestination the starting destination's route for this NavGraph
+ * @param route the destination's unique route
+ * @param builder the builder used to construct the graph
+ *
+ * @return the newly constructed nested NavGraph
+ */
+public inline fun NavGraphBuilder.navigation(
+    startDestination: String,
+    route: String,
+    builder: NavGraphBuilder.() -> Unit
+): Unit = destination(NavGraphBuilder(provider, startDestination, route).apply(builder))
+
+/**
  * DSL for constructing a new [NavGraph]
  */
 @NavDestinationDsl
-public open class NavGraphBuilder(
-    public val provider: NavigatorProvider,
-    @IdRes id: Int,
-    @IdRes private var startDestination: Int
-) : NavDestinationBuilder<NavGraph>(provider[NavGraphNavigator::class], id) {
+public open class NavGraphBuilder : NavDestinationBuilder<NavGraph> {
+    /**
+     * Retrieve the [NavGraphBuilder]'s [NavigatorProvider].
+     *
+     * @return The [NavigatorProvider] used by this [NavGraphBuilder].
+     */
+    public val provider: NavigatorProvider
+    @IdRes private var startDestinationId: Int = 0
+    private var startDestinationRoute: String? = null
+
+    /**
+     * DSL for constructing a new [NavGraph]
+     *
+     * @param provider navigator used to create the destination
+     * @param id the graph's unique id
+     * @param startDestination the starting destination for this NavGraph
+     *
+     * @return the newly created NavGraph
+     */
+    public constructor(
+        provider: NavigatorProvider,
+        @IdRes id: Int,
+        @IdRes startDestination: Int
+    ) : super(provider[NavGraphNavigator::class], id) {
+        this.provider = provider
+        this.startDestinationId = startDestination
+    }
+
+    /**
+     * DSL for constructing a new [NavGraph]
+     *
+     * @param provider navigator used to create the destination
+     * @param startDestination the starting destination's route for this NavGraph
+     * @param route the graph's unique route
+     *
+     * @return the newly created NavGraph
+     */
+    public constructor(
+        provider: NavigatorProvider,
+        startDestination: String,
+        route: String?
+    ) : super(provider[NavGraphNavigator::class], route) {
+        this.provider = provider
+        this.startDestinationRoute = startDestination
+    }
+
     private val destinations = mutableListOf<NavDestination>()
 
     /**
@@ -70,9 +154,17 @@
 
     override fun build(): NavGraph = super.build().also { navGraph ->
         navGraph.addDestinations(destinations)
-        if (startDestination == 0) {
-            throw IllegalStateException("You must set a startDestination")
+        if (startDestinationId == 0 && startDestinationRoute == null) {
+            if (route != null) {
+                throw IllegalStateException("You must set a start destination route")
+            } else {
+                throw IllegalStateException("You must set a start destination id")
+            }
         }
-        navGraph.startDestination = startDestination
+        if (startDestinationRoute != null) {
+            navGraph.setStartDestination(startDestinationRoute!!)
+        } else {
+            navGraph.setStartDestination(startDestinationId)
+        }
     }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt
index 748bb59..4b58555 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavGraphNavigator.kt
@@ -15,9 +15,6 @@
  */
 package androidx.navigation
 
-import android.os.Bundle
-import java.lang.IllegalArgumentException
-
 /**
  * A Navigator built specifically for [NavGraph] elements. Handles navigating to the
  * correct destination when the NavGraph is the target of navigation actions.
@@ -44,16 +41,32 @@
      * @throws IllegalArgumentException if given destination is not a child of the current navgraph
      */
     override fun navigate(
-        destination: NavGraph,
-        args: Bundle?,
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
-    ): NavDestination? {
-        val startId = destination.startDestination
-        check(startId != 0) {
+    ) {
+        for (entry in entries) {
+            navigate(entry, navOptions, navigatorExtras)
+        }
+    }
+
+    private fun navigate(
+        entry: NavBackStackEntry,
+        navOptions: NavOptions?,
+        navigatorExtras: Extras?
+    ) {
+        val destination = entry.destination as NavGraph
+        val args = entry.arguments
+        val startId = destination.startDestinationId
+        val startRoute = destination.startDestinationRoute
+        check(startId != 0 || startRoute != null) {
             ("no start destination defined via app:startDestination for ${destination.displayName}")
         }
-        val startDestination = destination.findNode(startId, false)
+        val startDestination = if (startRoute != null) {
+            destination.findNode(startRoute, false)
+        } else {
+            destination.findNode(startId, false)
+        }
         requireNotNull(startDestination) {
             val dest = destination.startDestDisplayName
             throw IllegalArgumentException(
@@ -63,15 +76,10 @@
         val navigator = navigatorProvider.getNavigator<Navigator<NavDestination>>(
             startDestination.navigatorName
         )
-        return navigator.navigate(
+        val startDestinationEntry = state.createBackStackEntry(
             startDestination,
-            startDestination.addInDefaultArgs(args),
-            navOptions,
-            navigatorExtras
+            startDestination.addInDefaultArgs(args)
         )
-    }
-
-    override fun popBackStack(): Boolean {
-        return true
+        navigator.navigate(listOf(startDestinationEntry), navOptions, navigatorExtras)
     }
 }
\ No newline at end of file
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt
index d7a86a2..38e8fa3 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavOptions.kt
@@ -18,6 +18,7 @@
 import androidx.annotation.AnimRes
 import androidx.annotation.AnimatorRes
 import androidx.annotation.IdRes
+import androidx.navigation.NavDestination.Companion.createRoute
 
 /**
  * NavOptions stores special options for navigate actions
@@ -35,7 +36,7 @@
      * @see shouldPopUpToSaveState
      */
     @field:IdRes @get:IdRes @param:IdRes
-    public val popUpTo: Int,
+    public val popUpToId: Int,
     private val popUpToInclusive: Boolean,
     private val popUpToSaveState: Boolean,
     /**
@@ -66,6 +67,58 @@
     public val popExitAnim: Int
 ) {
     /**
+     * The destination to pop up to before navigating. When set, all non-matching destinations
+     * should be popped from the back stack.
+     * @return the destinationId to pop up to, clearing all intervening destinations
+     * @see Builder.setPopUpTo
+     *
+     * @see isPopUpToInclusive
+     * @see shouldPopUpToSaveState
+     */
+    @IdRes
+    @Deprecated("Use popUpToId instead.", ReplaceWith("popUpToId"))
+    public fun getPopUpTo(): Int = popUpToId
+
+    /**
+     * Route for the destination to pop up to before navigating. When set, all non-matching
+     * destinations should be popped from the back stack.
+     * @return the destination route to pop up to, clearing all intervening destinations
+     * @see Builder.setPopUpTo
+     *
+     * @see isPopUpToInclusive
+     * @see shouldPopUpToSaveState
+     */
+    public var popUpToRoute: String? = null
+        private set
+
+    /**
+     * NavOptions stores special options for navigate actions
+     */
+    internal constructor(
+        singleTop: Boolean,
+        restoreState: Boolean,
+        popUpToRoute: String?,
+        popUpToInclusive: Boolean,
+        popUpToSaveState: Boolean,
+        enterAnim: Int,
+        exitAnim: Int,
+        popEnterAnim: Int,
+        popExitAnim: Int
+    ) : this(
+        singleTop,
+        restoreState,
+        createRoute(popUpToRoute).hashCode(),
+        popUpToInclusive,
+        popUpToSaveState,
+        enterAnim,
+        exitAnim,
+        popEnterAnim,
+        popExitAnim
+    ) {
+        this.popUpToRoute = popUpToRoute
+    }
+
+    /**
      * Whether this navigation action should launch as single-top (i.e., there will be at most
      * one copy of a given destination on the top of the back stack).
      *
@@ -86,7 +139,7 @@
     }
 
     /**
-     * Whether the destination set in [.getPopUpTo] should be popped from the back stack.
+     * Whether the destination set in [getPopUpTo] should be popped from the back stack.
      * @see Builder.setPopUpTo
      *
      * @see NavOptions.getPopUpTo
@@ -97,9 +150,9 @@
 
     /**
      * Whether the back stack and the state of all destinations between the
-     * current destination and [popUpTo] should be saved for later restoration via
+     * current destination and [popUpToId] should be saved for later restoration via
      * [Builder.setRestoreState] or the `restoreState` attribute using the same ID
-     * as [popUpTo] (note: this matching ID is true whether [isPopUpToInclusive] is true or
+     * as [popUpToId] (note: this matching ID is true whether [isPopUpToInclusive] is true or
      * false).
      */
     public fun shouldPopUpToSaveState(): Boolean {
@@ -112,7 +165,8 @@
         val that = other as NavOptions
         return singleTop == that.singleTop &&
             restoreState == that.restoreState &&
-            popUpTo == that.popUpTo &&
+            popUpToId == that.popUpToId &&
+            popUpToRoute == that.popUpToRoute &&
             popUpToInclusive == that.popUpToInclusive &&
             popUpToSaveState == that.popUpToSaveState &&
             enterAnim == that.enterAnim &&
@@ -124,7 +178,8 @@
     override fun hashCode(): Int {
         var result = if (shouldLaunchSingleTop()) 1 else 0
         result = 31 * result + if (shouldRestoreState()) 1 else 0
-        result = 31 * result + popUpTo
+        result = 31 * result + popUpToId
+        result = 31 * result + popUpToRoute.hashCode()
         result = 31 * result + if (isPopUpToInclusive()) 1 else 0
         result = 31 * result + if (shouldPopUpToSaveState()) 1 else 0
         result = 31 * result + enterAnim
@@ -142,7 +197,8 @@
         private var restoreState = false
 
         @IdRes
-        private var popUpTo = -1
+        private var popUpToId = -1
+        private var popUpToRoute: String? = null
         private var popUpToInclusive = false
         private var popUpToSaveState = false
 
@@ -194,11 +250,11 @@
          * @param saveState true if the back stack and the state of all destinations between the
          * current destination and [destinationId] should be saved for later restoration via
          * [setRestoreState] or the `restoreState` attribute using the same ID
-         * as [popUpTo] (note: this matching ID is true whether [inclusive] is true or
+         * as [popUpToId] (note: this matching ID is true whether [inclusive] is true or
          * false).
          * @return this Builder
          *
-         * @see NavOptions.popUpTo
+         * @see NavOptions.popUpToId
          * @see NavOptions.isPopUpToInclusive
          */
         @JvmOverloads
@@ -207,7 +263,37 @@
             inclusive: Boolean,
             saveState: Boolean = false
         ): Builder {
-            popUpTo = destinationId
+            popUpToId = destinationId
+            popUpToRoute = null
+            popUpToInclusive = inclusive
+            popUpToSaveState = saveState
+            return this
+        }
+
+        /**
+         * Pop up to a given destination before navigating. This pops all non-matching destinations
+         * from the back stack until this destination is found.
+         *
+         * @param route route for destination to pop up to, clearing all intervening destinations.
+         * @param inclusive true to also pop the given destination from the back stack.
+         * @param saveState true if the back stack and the state of all destinations between the
+         * current destination and [route] should be saved for later restoration via
+         * [setRestoreState] or the `restoreState` attribute using the same ID
+         * as [popUpToRoute] (note: this matching ID is true whether [inclusive] is true or
+         * false).
+         * @return this Builder
+         *
+         * @see NavOptions.popUpToId
+         * @see NavOptions.isPopUpToInclusive
+         */
+        @JvmOverloads
+        public fun setPopUpTo(
+            route: String?,
+            inclusive: Boolean,
+            saveState: Boolean = false
+        ): Builder {
+            popUpToRoute = route
+            popUpToId = -1
             popUpToInclusive = inclusive
             popUpToSaveState = saveState
             return this
@@ -275,11 +361,18 @@
          * @return a constructed NavOptions
          */
         public fun build(): NavOptions {
-            return NavOptions(
-                singleTop, restoreState,
-                popUpTo, popUpToInclusive, popUpToSaveState,
-                enterAnim, exitAnim, popEnterAnim, popExitAnim
-            )
+            return if (popUpToRoute != null)
+                NavOptions(
+                    singleTop, restoreState,
+                    popUpToRoute, popUpToInclusive, popUpToSaveState,
+                    enterAnim, exitAnim, popEnterAnim, popExitAnim
+                )
+            else
+                NavOptions(
+                    singleTop, restoreState,
+                    popUpToId, popUpToInclusive, popUpToSaveState,
+                    enterAnim, exitAnim, popEnterAnim, popExitAnim
+                )
         }
     }
 }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt
index 05e7986..8865788 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavOptionsBuilder.kt
@@ -55,14 +55,38 @@
     public var restoreState: Boolean = false
 
     /**
+     * Returns the current destination that the builder will pop up to.
+     */
+    @IdRes
+    public var popUpToId: Int = -1
+        internal set(value) {
+            field = value
+            inclusive = false
+        }
+
+    /**
      * Pop up to a given destination before navigating. This pops all non-matching destinations
      * from the back stack until this destination is found.
      */
-    @IdRes
-    public var popUpTo: Int = -1
+    @Deprecated("Use the popUpToId property.")
+    public var popUpTo: Int
+        get() = popUpToId
+        @Deprecated("Use the popUpTo function and passing in the id.")
         set(value) {
-            field = value
-            inclusive = false
+            popUpTo(value)
+        }
+
+    /**
+     * Pop up to a given destination before navigating. This pops all non-matching destinations
+     * from the back stack until this destination is found.
+     */
+    public var popUpToRoute: String? = null
+        private set(value) {
+            if (value != null) {
+                require(value.isNotBlank()) { "Cannot pop up to an empty route" }
+                field = value
+                inclusive = false
+            }
         }
     private var inclusive = false
     private var saveState = false
@@ -71,8 +95,24 @@
      * Pop up to a given destination before navigating. This pops all non-matching destinations
      * from the back stack until this destination is found.
      */
-    public fun popUpTo(@IdRes id: Int, popUpToBuilder: PopUpToBuilder.() -> Unit) {
-        popUpTo = id
+    public fun popUpTo(@IdRes id: Int, popUpToBuilder: PopUpToBuilder.() -> Unit = {}) {
+        popUpToId = id
+        popUpToRoute = null
+        val builder = PopUpToBuilder().apply(popUpToBuilder)
+        inclusive = builder.inclusive
+        saveState = builder.saveState
+    }
+
+    /**
+     * Pop up to a given destination before navigating. This pops all non-matching destination routes
+     * from the back stack until the destination with a matching route is found.
+     *
+     * @param route route for the destination
+     * @param popUpToBuilder builder used to construct a popUpTo operation
+     */
+    public fun popUpTo(route: String, popUpToBuilder: PopUpToBuilder.() -> Unit = {}) {
+        popUpToRoute = route
+        popUpToId = -1
         val builder = PopUpToBuilder().apply(popUpToBuilder)
         inclusive = builder.inclusive
         saveState = builder.saveState
@@ -95,7 +135,11 @@
     internal fun build() = builder.apply {
         setLaunchSingleTop(launchSingleTop)
         setRestoreState(restoreState)
-        setPopUpTo(popUpTo, inclusive, saveState)
+        if (popUpToRoute != null) {
+            setPopUpTo(popUpToRoute, inclusive, saveState)
+        } else {
+            setPopUpTo(popUpToId, inclusive, saveState)
+        }
     }.build()
 }
 
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt
index 7b11712..b52cb29 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavType.kt
@@ -29,7 +29,7 @@
  *
  * You should only use one of the static NavType instances and subclasses defined in this class.
  *
- * @param <T> the type of the data that is supported by this NavType
+ * @param T the type of the data that is supported by this NavType
  */
 public abstract class NavType<T> internal constructor(
     /**
@@ -749,12 +749,9 @@
          */
         @Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
         public override fun parseValue(value: String): D {
-            for (constant in type.enumConstants) {
-                if ((constant as Enum<*>).name == value) {
-                    return constant
-                }
-            }
-            throw IllegalArgumentException(
+            return type.enumConstants.firstOrNull { constant ->
+                constant.name.equals(value, ignoreCase = true)
+            } ?: throw IllegalArgumentException(
                 "Enum value $value not found for type ${type.name}."
             )
         }
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavViewModelStoreProvider.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavViewModelStoreProvider.kt
new file mode 100644
index 0000000..74fdc56
--- /dev/null
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavViewModelStoreProvider.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.navigation
+
+import androidx.annotation.RestrictTo
+import androidx.lifecycle.ViewModelStore
+
+/**
+ * Interface that allows you to retrieve a [ViewModelStore] associated with a
+ * particular [NavBackStackEntry.id].
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public interface NavViewModelStoreProvider {
+    public fun getViewModelStore(backStackEntryId: String): ViewModelStore
+}
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt b/navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt
index 16c4774..21e06b4 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/Navigator.kt
@@ -16,6 +16,7 @@
 package androidx.navigation
 
 import android.os.Bundle
+import androidx.annotation.CallSuper
 import androidx.navigation.Navigator.Name
 
 /**
@@ -51,6 +52,41 @@
     @Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS)
     public annotation class Name(val value: String)
 
+    private var _state: NavigatorState? = null
+
+    /**
+     * The state of the Navigator is the communication conduit between the Navigator
+     * and the [NavController] that has called [onAttach].
+     *
+     * It is the responsibility of the Navigator to call [NavigatorState.add]
+     * and [NavigatorState.pop] to in order to update the [NavigatorState.backStack] at
+     * the appropriate times.
+     *
+     * @throws IllegalStateException if [isAttached] is `false`
+     */
+    protected val state: NavigatorState
+        get() = checkNotNull(_state) {
+            "You cannot access the Navigator's state until the Navigator is attached"
+        }
+
+    /**
+     * Whether this Navigator is actively being used by a [NavController].
+     *
+     * This is set to `true` when [onAttach] is called.
+     */
+    public var isAttached: Boolean = false
+        private set
+
+    /**
+     * Indicator that this Navigator is actively being used by a [NavController]. This
+     * is called when the NavController's state is ready to be restored.
+     */
+    @CallSuper
+    public open fun onAttach(state: NavigatorState) {
+        _state = state
+        isAttached = true
+    }
+
     /**
      * Construct a new NavDestination associated with this Navigator.
      *
@@ -67,6 +103,55 @@
      * the navigation graph. This method generally should not be called directly;
      * [NavController] will delegate to it when appropriate.
      *
+     * @param entries destination(s) to navigate to
+     * @param navOptions additional options for navigation
+     * @param navigatorExtras extras unique to your Navigator.
+     */
+    @Suppress("UNCHECKED_CAST")
+    public open fun navigate(
+        entries: List<NavBackStackEntry>,
+        navOptions: NavOptions?,
+        navigatorExtras: Extras?
+    ) {
+        entries.asSequence().map { backStackEntry ->
+            val destination = backStackEntry.destination as? D ?: return@map null
+            val navigatedToDestination = navigate(
+                destination, backStackEntry.arguments, navOptions, navigatorExtras
+            )
+            when (navigatedToDestination) {
+                null -> null
+                destination -> backStackEntry
+                else -> {
+                    backStackEntry.replaceArguments(
+                        navigatedToDestination.addInDefaultArgs(backStackEntry.arguments)
+                    )
+                    state.createBackStackEntry(navigatedToDestination, backStackEntry.arguments)
+                }
+            }
+        }.filterNotNull().forEach { backStackEntry ->
+            state.add(backStackEntry)
+        }
+    }
+
+    /**
+     * Informational callback indicating that the given [backStackEntry] has been
+     * affected by a [NavOptions.shouldLaunchSingleTop] operation. The entry's state
+     * and arguments have already been updated, but this callback can be used to synchronize
+     * any external state with this operation.
+     */
+    @Suppress("UNCHECKED_CAST")
+    public open fun onLaunchSingleTop(backStackEntry: NavBackStackEntry) {
+        val destination = backStackEntry.destination as? D ?: return
+        navigate(destination, null, navOptions { launchSingleTop = true }, null)
+    }
+
+    /**
+     * Navigate to a destination.
+     *
+     * Requests navigation to a given destination associated with this navigator in
+     * the navigation graph. This method generally should not be called directly;
+     * [NavController] will delegate to it when appropriate.
+     *
      * @param destination destination node to navigate to
      * @param args arguments to use for navigation
      * @param navOptions additional options for navigation
@@ -75,12 +160,44 @@
      * no change was made to the back stack (i.e., in cases of single top operations
      * where the destination is already on top of the back stack).
      */
-    public abstract fun navigate(
+    // TODO Deprecate this method once all call sites are removed
+    @Suppress("UNUSED_PARAMETER", "RedundantNullableReturnType")
+    public open fun navigate(
         destination: D,
         args: Bundle?,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
-    ): NavDestination?
+    ): NavDestination? = destination
+
+    /**
+     * Attempt to pop this navigator's back stack, performing the appropriate navigation.
+     *
+     * All destinations back to [popUpTo] should be popped off the back stack.
+     *
+     * @param popUpTo the entry that should be popped off the [NavigatorState.backStack]
+     * along with all entries above this entry.
+     * @param savedState whether any Navigator specific state associated with [popUpTo] should
+     * be saved to later be restored by a call to [navigate] with [NavOptions.shouldRestoreState].
+     */
+    @Suppress("UNUSED_PARAMETER")
+    public open fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) {
+        val backStack = state.backStack.value
+        check(backStack.contains(popUpTo)) {
+            "popBackStack was called with $popUpTo which does not exist in back stack $backStack"
+        }
+        val iterator = backStack.listIterator(backStack.size)
+        var lastPoppedEntry: NavBackStackEntry? = null
+        do {
+            if (!popBackStack()) {
+                // Quit early if popBackStack() returned false
+                break
+            }
+            lastPoppedEntry = iterator.previous()
+        } while (lastPoppedEntry != popUpTo)
+        if (lastPoppedEntry != null) {
+            state.pop(lastPoppedEntry, savedState)
+        }
+    }
 
     /**
      * Attempt to pop this navigator's back stack, performing the appropriate navigation.
@@ -91,23 +208,24 @@
      *
      * @return `true` if pop was successful
      */
-    public abstract fun popBackStack(): Boolean
+    // TODO Deprecate this method once all call sites are removed
+    public open fun popBackStack(): Boolean = true
 
     /**
      * Called to ask for a [Bundle] representing the Navigator's state. This will be
-     * restored in [.onRestoreState].
+     * restored in [onRestoreState].
      */
     public open fun onSaveState(): Bundle? {
         return null
     }
 
     /**
-     * Restore any state previously saved in [.onSaveState]. This will be called before
-     * any calls to [.navigate] or
-     * [.popBackStack].
+     * Restore any state previously saved in [onSaveState]. This will be called before
+     * any calls to [navigate] or
+     * [popBackStack].
      *
-     * Calls to [.createDestination] should not be dependent on any state restored here as
-     * [.createDestination] can be called before the state is restored.
+     * Calls to [createDestination] should not be dependent on any state restored here as
+     * [createDestination] can be called before the state is restored.
      *
      * @param savedState The state previously saved
      */
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt
index d59a4e3..8162b45 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorProvider.kt
@@ -102,6 +102,16 @@
         navigator: Navigator<out NavDestination>
     ): Navigator<out NavDestination>? {
         require(validateName(name)) { "navigator name cannot be an empty string" }
+        val previousNavigator = _navigators[name]
+        if (previousNavigator == navigator) {
+            return navigator
+        }
+        check(previousNavigator?.isAttached != true) {
+            "Navigator $navigator is replacing an already attached $previousNavigator"
+        }
+        check(!navigator.isAttached) {
+            "Navigator $navigator is already attached to another NavController"
+        }
         return _navigators.put(name, navigator)
     }
 
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
new file mode 100644
index 0000000..949fa58
--- /dev/null
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation
+
+import android.os.Bundle
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * The NavigatorState encapsulates the state shared between the [Navigator] and the
+ * [NavController].
+ */
+public abstract class NavigatorState {
+    private val backStackLock = ReentrantLock(true)
+    private val _backStack: MutableStateFlow<List<NavBackStackEntry>> = MutableStateFlow(listOf())
+
+    /**
+     * While the [NavController] is responsible for the combined back stack across all
+     * Navigators, this back stack is specifically the set of destinations associated
+     * with this Navigator.
+     *
+     * Changing the back stack must be done via [add] and [pop].
+     */
+    public val backStack: StateFlow<List<NavBackStackEntry>> = _backStack.asStateFlow()
+
+    /**
+     * Adds the given [backStackEntry] to the [backStack].
+     */
+    public open fun add(backStackEntry: NavBackStackEntry) {
+        backStackLock.withLock {
+            _backStack.value = _backStack.value + backStackEntry
+        }
+    }
+
+    /**
+     * Create a new [NavBackStackEntry] from a given [destination] and [arguments].
+     */
+    public abstract fun createBackStackEntry(
+        destination: NavDestination,
+        arguments: Bundle?
+    ): NavBackStackEntry
+
+    /**
+     * Pop all destinations up to and including [popUpTo]. This will remove those
+     * destinations from the [backStack], saving their state if [saveState] is `true`.
+     */
+    public open fun pop(popUpTo: NavBackStackEntry, saveState: Boolean) {
+        backStackLock.withLock {
+            _backStack.value = _backStack.value.takeWhile { it != popUpTo }
+        }
+    }
+}
diff --git a/navigation/navigation-common/src/main/res-public/values/public_attrs.xml b/navigation/navigation-common/src/main/res-public/values/public_attrs.xml
index f804479..c9abf91 100644
--- a/navigation/navigation-common/src/main/res-public/values/public_attrs.xml
+++ b/navigation/navigation-common/src/main/res-public/values/public_attrs.xml
@@ -29,6 +29,7 @@
     <public type="attr" name="popEnterAnim"/>
     <public type="attr" name="popExitAnim"/>
     <public type="attr" name="restoreState"/>
+    <public type="attr" name="route"/>
     <public type="attr" name="startDestination"/>
     <public type="attr" name="uri"/>
 </resources>
diff --git a/navigation/navigation-common/src/main/res/values/attrs.xml b/navigation/navigation-common/src/main/res/values/attrs.xml
index 1babc33..c16b0df 100644
--- a/navigation/navigation-common/src/main/res/values/attrs.xml
+++ b/navigation/navigation-common/src/main/res/values/attrs.xml
@@ -14,6 +14,7 @@
 <resources>
     <declare-styleable name="Navigator">
         <attr name="android:id"/>
+        <attr name="route" format="string"/>
         <attr name="android:label" />
     </declare-styleable>
 
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
index 2d031b6..a0a0af1 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/NavDestinationTest.kt
@@ -150,7 +150,7 @@
         val navGraphNavigator = NavGraphNavigator(mock(NavigatorProvider::class.java))
         val parent = navGraphNavigator.createDestination().apply {
             id = parentId
-            startDestination = DESTINATION_ID
+            setStartDestination(DESTINATION_ID)
         }
         destination.parent = parent
         val deepLinkIds = destination.buildDeepLinkIds()
@@ -181,13 +181,13 @@
         val navGraphNavigator = NavGraphNavigator(mock(NavigatorProvider::class.java))
         val parent = navGraphNavigator.createDestination().apply {
             id = parentId
-            startDestination = DESTINATION_ID
+            setStartDestination(DESTINATION_ID)
         }
         destination.parent = parent
         val grandparentId = 3
         val grandparent = navGraphNavigator.createDestination().apply {
             id = grandparentId
-            startDestination = parentId
+            setStartDestination(parentId)
         }
         parent.parent = grandparent
         val deepLinkIds = destination.buildDeepLinkIds()
@@ -208,7 +208,7 @@
         val grandparentId = 3
         val grandparent = navGraphNavigator.createDestination().apply {
             id = grandparentId
-            startDestination = parentId
+            setStartDestination(parentId)
         }
         parent.parent = grandparent
         val deepLinkIds = destination.buildDeepLinkIds()
@@ -229,7 +229,7 @@
         val grandparentId = 3
         val grandparent = navGraphNavigator.createDestination().apply {
             id = grandparentId
-            startDestination = parentId
+            setStartDestination(parentId)
         }
         parent.parent = grandparent
         val deepLinkIds = destination.buildDeepLinkIds()
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt
index cd5e75f..5cd574a 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphNavigatorTest.kt
@@ -17,9 +17,11 @@
 package androidx.navigation
 
 import androidx.annotation.IdRes
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import androidx.navigation.testing.TestNavigatorState
 import com.google.common.truth.Truth.assertThat
-import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -34,8 +36,13 @@
         private const val SECOND_DESTINATION_ID = 2
     }
 
+    @get:Rule
+    val instantTaskExecutorRule = InstantTaskExecutorRule()
+
     private lateinit var provider: NavigatorProvider
+    private lateinit var noOpState: TestNavigatorState
     private lateinit var noOpNavigator: NoOpNavigator
+    private lateinit var navGraphState: TestNavigatorState
     private lateinit var navGraphNavigator: NavGraphNavigator
 
     @Before
@@ -48,6 +55,10 @@
                 }
             )
         }
+        noOpState = TestNavigatorState()
+        noOpNavigator.onAttach(noOpState)
+        navGraphState = TestNavigatorState()
+        navGraphNavigator.onAttach(navGraphState)
     }
 
     private fun createFirstDestination() = noOpNavigator.createDestination().apply {
@@ -63,7 +74,7 @@
         startId: Int = destination.id
     ) = navGraphNavigator.createDestination().apply {
         addDestination(destination)
-        startDestination = startId
+        setStartDestination(startId)
     }
 
     @Test(expected = IllegalStateException::class)
@@ -72,94 +83,19 @@
         val graph = navGraphNavigator.createDestination().apply {
             addDestination(destination)
             id = 2 // can't match id of first destination or the start destination
-            startDestination = 0
+            setStartDestination(0)
         }
-        navGraphNavigator.navigate(graph, null, null, null)
+        val entry = navGraphState.createBackStackEntry(graph, null)
+        navGraphNavigator.navigate(listOf(entry), null, null)
     }
 
     @Test
     fun navigate() {
         val destination = createFirstDestination()
         val graph = createGraphWithDestination(destination)
-        assertThat(navGraphNavigator.navigate(graph, null, null, null))
-            .isEqualTo(destination)
-    }
-
-    @Test
-    fun navigateThenPop() {
-        val destination = createFirstDestination()
-        val graph = createGraphWithDestination(destination)
-        assertThat(navGraphNavigator.navigate(graph, null, null, null))
-            .isEqualTo(destination)
-        val success = navGraphNavigator.popBackStack()
-        assertWithMessage("popBackStack should return true")
-            .that(success)
-            .isTrue()
-    }
-
-    @Test
-    fun navigateSingleTopOnEmptyStack() {
-        val destination = createFirstDestination()
-        val graph = createGraphWithDestination(destination)
-        // singleTop should still show as added on an empty stack
-        assertThat(
-            navGraphNavigator.navigate(
-                graph, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
-        )
-            .isEqualTo(destination)
-    }
-
-    @Test
-    fun navigateSingleTop() {
-        val destination = createFirstDestination()
-        val graph = createGraphWithDestination(destination)
-        assertThat(navGraphNavigator.navigate(graph, null, null, null))
-            .isEqualTo(destination)
-        assertThat(
-            navGraphNavigator.navigate(
-                graph, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
-        )
-            .isEqualTo(destination)
-    }
-
-    @Test
-    fun navigateSingleTopNotTop() {
-        val destination = createFirstDestination()
-        val graph = createGraphWithDestination(destination)
-        val secondDestination = createSecondDestination()
-        val secondGraph = createGraphWithDestination(secondDestination).apply {
-            id = SECOND_DESTINATION_ID
-        }
-        assertThat(navGraphNavigator.navigate(graph, null, null, null))
-            .isEqualTo(destination)
-        assertThat(
-            navGraphNavigator.navigate(
-                secondGraph, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
-        )
-            .isEqualTo(secondDestination)
-    }
-
-    @Test
-    fun navigateSingleTopNested() {
-        val destination = createFirstDestination()
-        val nestedGraph = createGraphWithDestination(destination).apply {
-            id = FIRST_DESTINATION_ID
-        }
-        val graph = createGraphWithDestination(nestedGraph)
-        assertThat(navGraphNavigator.navigate(graph, null, null, null))
-            .isEqualTo(destination)
-        assertThat(
-            navGraphNavigator.navigate(
-                graph, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
-        )
-            .isEqualTo(destination)
+        val entry = navGraphState.createBackStackEntry(graph, null)
+        navGraphNavigator.navigate(listOf(entry), null, null)
+        assertThat(noOpState.backStack.value.map { it.destination })
+            .containsExactly(destination)
     }
 }
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt
index 003c8b2..296c666 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/NavGraphTest.kt
@@ -107,7 +107,7 @@
             id = FIRST_DESTINATION_ID
         }
         try {
-            graph.startDestination = destination.id
+            graph.setStartDestination(destination.id)
         } catch (e: IllegalArgumentException) {
             assertWithMessage("Setting a start destination with same id as its parent should fail")
                 .that(e).hasMessageThat().contains(
diff --git a/navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt b/navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt
index d4dcfe6..8a6c0c6 100644
--- a/navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt
+++ b/navigation/navigation-common/src/test/java/androidx/navigation/NavigatorProviderTest.kt
@@ -17,6 +17,7 @@
 package androidx.navigation
 
 import android.os.Bundle
+import androidx.navigation.testing.TestNavigatorState
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Assert.fail
@@ -100,6 +101,50 @@
             .isEqualTo(navigator)
     }
 
+    @Test
+    fun addExistingNavigatorDoesntReplace() {
+        val navigatorState = TestNavigatorState()
+        val provider = NavigatorProvider()
+        val navigator = EmptyNavigator()
+
+        provider.addNavigator(navigator)
+        assertThat(provider.getNavigator<EmptyNavigator>(EmptyNavigator.NAME))
+            .isEqualTo(navigator)
+
+        navigator.onAttach(navigatorState)
+        assertWithMessage("Navigator should be attached")
+            .that(provider.getNavigator<EmptyNavigator>(EmptyNavigator.NAME).isAttached)
+            .isTrue()
+
+        // addNavigator should throw when trying to replace an existing, attached navigator, but
+        // we should have returned before that
+        try {
+            provider.addNavigator(navigator)
+        } catch (navigatorAlreadyAttached: IllegalStateException) {
+            fail(
+                "addNavigator with an existing navigator should return early and not " +
+                    "attempt to replace"
+            )
+        }
+    }
+
+    @Test
+    fun addWithSameNameButUnequalNavigatorDoesReplace() {
+        val provider = NavigatorProvider()
+        val navigatorA = EmptyNavigator()
+        val navigatorB = EmptyNavigator()
+
+        assertThat(navigatorA).isNotEqualTo(navigatorB)
+
+        provider.addNavigator(navigatorA)
+        assertThat(provider.getNavigator<EmptyNavigator>(EmptyNavigator.NAME))
+            .isEqualTo(navigatorA)
+
+        provider.addNavigator(navigatorB)
+        assertThat(provider.getNavigator<EmptyNavigator>(EmptyNavigator.NAME))
+            .isEqualTo(navigatorB)
+    }
+
     private val provider = NavigatorProvider()
 
     @Test
diff --git a/navigation/navigation-compose/api/api_lint.ignore b/navigation/navigation-compose/api/api_lint.ignore
deleted file mode 100644
index 6dc016e7..0000000
--- a/navigation/navigation-compose/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-MissingJvmstatic: androidx.navigation.compose.NavHostKt#NavHost(androidx.navigation.NavHostController, String, androidx.compose.ui.Modifier, String, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,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
-MissingJvmstatic: androidx.navigation.compose.NavHostKt#NavHost(androidx.navigation.NavHostController, androidx.navigation.NavGraph, androidx.compose.ui.Modifier):
-    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/navigation/navigation-compose/api/current.txt b/navigation/navigation-compose/api/current.txt
index e11a6d2..7a9fbf0 100644
--- a/navigation/navigation-compose/api/current.txt
+++ b/navigation/navigation-compose/api/current.txt
@@ -4,8 +4,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.compose.ComposeNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
@@ -13,24 +11,29 @@
   }
 
   public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
   }
 
   public final class NamedNavArgumentKt {
     method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
   }
 
+  public final class NavBackStackEntryProviderKt {
+    method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class NavGraphBuilderKt {
     method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
-    method public static androidx.navigation.NavBackStackEntry getBackStackEntry(androidx.navigation.NavController, String route);
-    method public static void navigate(androidx.navigation.NavController, String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController();
-    field public static final String KEY_ROUTE = "android-support-nav:controller:route";
   }
 
   public final class NavHostKt {
@@ -38,9 +41,5 @@
     method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
   }
 
-  public final class NavOptionsBuilderKt {
-    method public static void popUpTo(androidx.navigation.NavOptionsBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
-  }
-
 }
 
diff --git a/navigation/navigation-compose/api/public_plus_experimental_current.txt b/navigation/navigation-compose/api/public_plus_experimental_current.txt
index e11a6d2..7a9fbf0 100644
--- a/navigation/navigation-compose/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-compose/api/public_plus_experimental_current.txt
@@ -4,8 +4,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.compose.ComposeNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
@@ -13,24 +11,29 @@
   }
 
   public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
   }
 
   public final class NamedNavArgumentKt {
     method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
   }
 
+  public final class NavBackStackEntryProviderKt {
+    method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class NavGraphBuilderKt {
     method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
-    method public static androidx.navigation.NavBackStackEntry getBackStackEntry(androidx.navigation.NavController, String route);
-    method public static void navigate(androidx.navigation.NavController, String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController();
-    field public static final String KEY_ROUTE = "android-support-nav:controller:route";
   }
 
   public final class NavHostKt {
@@ -38,9 +41,5 @@
     method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
   }
 
-  public final class NavOptionsBuilderKt {
-    method public static void popUpTo(androidx.navigation.NavOptionsBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
-  }
-
 }
 
diff --git a/navigation/navigation-compose/api/restricted_current.txt b/navigation/navigation-compose/api/restricted_current.txt
index e11a6d2..7a9fbf0 100644
--- a/navigation/navigation-compose/api/restricted_current.txt
+++ b/navigation/navigation-compose/api/restricted_current.txt
@@ -4,8 +4,6 @@
   @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();
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.compose.ComposeNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
@@ -13,24 +11,29 @@
   }
 
   public final class NamedNavArgument {
+    method public operator String component1();
+    method public operator androidx.navigation.NavArgument component2();
+    method public androidx.navigation.NavArgument getArgument();
+    method public String getName();
+    property public final androidx.navigation.NavArgument argument;
+    property public final String name;
   }
 
   public final class NamedNavArgumentKt {
     method @androidx.navigation.NavDestinationDsl public static androidx.navigation.compose.NamedNavArgument navArgument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> builder);
   }
 
+  public final class NavBackStackEntryProviderKt {
+    method @androidx.compose.runtime.Composable public static void LocalOwnersProvider(androidx.navigation.NavBackStackEntry, androidx.compose.runtime.saveable.SaveableStateHolder saveableStateHolder, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class NavGraphBuilderKt {
     method public static void composable(androidx.navigation.NavGraphBuilder, String route, optional java.util.List<androidx.navigation.compose.NamedNavArgument> arguments, optional java.util.List<androidx.navigation.NavDeepLink> deepLinks, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
-    method public static void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
   }
 
   public final class NavHostControllerKt {
-    method public static androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
-    method public static androidx.navigation.NavBackStackEntry getBackStackEntry(androidx.navigation.NavController, String route);
-    method public static void navigate(androidx.navigation.NavController, String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
     method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController();
-    field public static final String KEY_ROUTE = "android-support-nav:controller:route";
   }
 
   public final class NavHostKt {
@@ -38,9 +41,5 @@
     method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
   }
 
-  public final class NavOptionsBuilderKt {
-    method public static void popUpTo(androidx.navigation.NavOptionsBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
-  }
-
 }
 
diff --git a/navigation/navigation-compose/build.gradle b/navigation/navigation-compose/build.gradle
index 99873f8..11e4895 100644
--- a/navigation/navigation-compose/build.gradle
+++ b/navigation/navigation-compose/build.gradle
@@ -41,9 +41,10 @@
     api(projectOrArtifact(":navigation:navigation-runtime-ktx"))
 
     androidTestImplementation(projectOrArtifact(":compose:material:material"))
+    androidTestImplementation projectOrArtifact(":compose:test-utils")
     androidTestImplementation(projectOrArtifact(":navigation:navigation-testing"))
     androidTestImplementation(projectOrArtifact(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
     androidTestImplementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/BottomBarNavDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/BottomBarNavDemo.kt
index 6dffc78..6bf9217 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/BottomBarNavDemo.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/BottomBarNavDemo.kt
@@ -27,11 +27,9 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
-import androidx.navigation.compose.KEY_ROUTE
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
 import androidx.navigation.compose.currentBackStackEntryAsState
-import androidx.navigation.compose.navigate
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.compose.samples.Dashboard
 import androidx.navigation.compose.samples.Profile
@@ -52,7 +50,7 @@
         bottomBar = {
             BottomNavigation {
                 val navBackStackEntry = navController.currentBackStackEntryAsState().value
-                val entryRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)
+                val entryRoute = navBackStackEntry?.destination?.route
                 items.forEach { (name, route) ->
                     BottomNavigationItem(
                         icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
@@ -60,8 +58,10 @@
                         selected = entryRoute == route,
                         onClick = {
                             navController.navigate(route) {
-                                launchSingleTop = true
-                                popUpTo = navController.graph.startDestination
+                                restoreState = true
+                                popUpTo(navController.graph.startDestinationId) {
+                                    saveState = true
+                                }
                             }
                         }
                     )
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt
index a195480a..243a1d1 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt
@@ -30,8 +30,6 @@
 import androidx.navigation.NavController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigate
-import androidx.navigation.compose.popUpTo
 import androidx.navigation.compose.rememberNavController
 
 @Composable
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt
index 0cc7bcb..051d40b 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt
@@ -30,7 +30,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigate
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.compose.samples.NavigateButton
 
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavWithArgsDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavWithArgsDemo.kt
index e5253fb..2dbaf21 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavWithArgsDemo.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavWithArgsDemo.kt
@@ -33,7 +33,6 @@
 import androidx.navigation.NavController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigate
 import androidx.navigation.compose.rememberNavController
 import androidx.navigation.compose.samples.Dashboard
 import androidx.navigation.compose.samples.NavigateButton
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/res/values/strings.xml b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from navigation/navigation-compose/integration-tests/navigation-demos/src/main/res/values/strings.xml
rename to navigation/navigation-compose/integration-tests/navigation-demos/src/main/res/values/donottranslate-strings.xml
diff --git a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
index 639aeef..3f988fc 100644
--- a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
+++ b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
@@ -41,9 +41,8 @@
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigate
-import androidx.navigation.compose.navigation
 import androidx.navigation.compose.rememberNavController
+import androidx.navigation.navigation
 
 sealed class Screen(val route: String, @StringRes val resourceId: Int) {
     object Profile : Screen("profile", R.string.profile)
@@ -61,7 +60,6 @@
     }
 }
 
-@Sampled
 @Composable
 fun NestedNavStartDestination() {
     val navController = rememberNavController()
@@ -74,7 +72,6 @@
     }
 }
 
-@Sampled
 @Composable
 fun NestedNavInGraph() {
     val navController = rememberNavController()
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/ComposeNavigatorTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/ComposeNavigatorTest.kt
index 1079ad8..d2dceea 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/ComposeNavigatorTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/ComposeNavigatorTest.kt
@@ -16,120 +16,49 @@
 
 package androidx.navigation.compose
 
-import androidx.navigation.navOptions
+import androidx.navigation.testing.TestNavigatorState
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.LargeTest
+import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
-import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@LargeTest
+@MediumTest
 @RunWith(AndroidJUnit4::class)
 class ComposeNavigatorTest {
 
     @Test
-    fun testNavigateConfigChangeThenPop() {
+    fun testBackStackPriorToAttach() {
         val navigator = ComposeNavigator()
-        val destination = navigator.createDestination()
-        destination.id = FIRST_DESTINATION_ID
+        val beforeAttachBackStack = navigator.backStack
+        assertThat(beforeAttachBackStack.value)
+            .isEmpty()
 
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-
-        destination.id = SECOND_DESTINATION_ID
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-
-        val savedState = navigator.onSaveState()!!
-        val restoredNavigator = ComposeNavigator()
-
-        restoredNavigator.onRestoreState(savedState)
-
-        assertWithMessage("ComposeNavigator should return true when popping the second destination")
-            .that(navigator.popBackStack())
-            .isTrue()
+        val navigatorState = TestNavigatorState()
+        navigator.onAttach(navigatorState)
+        val afterAttachBackStack = navigator.backStack
+        assertThat(afterAttachBackStack)
+            .isNotSameInstanceAs(beforeAttachBackStack)
     }
 
     @Test
-    fun testNavigateWithPopUpToThenPop() {
+    fun testNavigateAndPopUpdatesBackStack() {
         val navigator = ComposeNavigator()
-        val destination = navigator.createDestination()
-        destination.id = FIRST_DESTINATION_ID
+        val navigatorState = TestNavigatorState()
+        navigator.onAttach(navigatorState)
 
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val entry = navigatorState.createBackStackEntry(navigator.createDestination(), null)
+        navigator.navigate(listOf(entry), null, null)
+        assertThat(navigator.backStack.value)
+            .containsExactly(entry).inOrder()
 
-        destination.id = SECOND_DESTINATION_ID
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val secondEntry = navigatorState.createBackStackEntry(navigator.createDestination(), null)
+        navigator.navigate(listOf(secondEntry), null, null)
+        assertThat(navigator.backStack.value)
+            .containsExactly(entry, secondEntry).inOrder()
 
-        assertWithMessage("ComposeNavigator should return true when popping the third destination")
-            .that(navigator.popBackStack())
-            .isTrue()
-        destination.id = THIRD_DESTINATION_ID
-        assertThat(
-            navigator.navigate(
-                destination, null,
-                navOptions { popUpTo(FIRST_DESTINATION_ID) { inclusive = false } }, null
-            )
-        ).isEqualTo(destination)
-
-        assertWithMessage("ComposeNavigator should return true when popping the third destination")
-            .that(navigator.popBackStack())
-            .isTrue()
-    }
-
-    @Test
-    fun testSingleTopInitial() {
-        val navigator = ComposeNavigator()
-        val destination = navigator.createDestination()
-        destination.id = FIRST_DESTINATION_ID
-
-        navigator.navigate(destination, null, null, null)
-
-        assertThat(
-            navigator.navigate(
-                destination, null,
-                navOptions { launchSingleTop = true }, null
-            )
-        ).isNull()
-    }
-
-    @Test
-    fun testSingleTop() {
-        val navigator = ComposeNavigator()
-        val destination = navigator.createDestination()
-        destination.id = FIRST_DESTINATION_ID
-
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-
-        destination.id = SECOND_DESTINATION_ID
-        assertThat(navigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-
-        assertThat(
-            navigator.navigate(
-                destination, null,
-                navOptions { launchSingleTop = true }, null
-            )
-        ).isNull()
-
-        destination.id = FIRST_DESTINATION_ID
-        assertThat(
-            navigator.navigate(
-                destination, null,
-                navOptions { launchSingleTop = true }, null
-            )
-        ).isEqualTo(destination)
-
-        assertWithMessage("ComposeNavigator should return true when popping the first destination")
-            .that(navigator.popBackStack())
-            .isTrue()
+        navigator.popBackStack(secondEntry, false)
+        assertThat(navigator.backStack.value)
+            .containsExactly(entry).inOrder()
     }
 }
-
-private const val FIRST_DESTINATION_ID = 1
-private const val SECOND_DESTINATION_ID = 2
-private const val THIRD_DESTINATION_ID = 3
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavBackStackEntryProviderTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavBackStackEntryProviderTest.kt
new file mode 100644
index 0000000..20edc30
--- /dev/null
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavBackStackEntryProviderTest.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.navigation.compose
+
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.saveable.rememberSaveableStateHolder
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
+import androidx.compose.ui.test.junit4.StateRestorationTester
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
+import androidx.navigation.NavBackStackEntry
+import androidx.navigation.testing.TestNavigatorState
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.testutils.TestNavigator
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class NavBackStackEntryProviderTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @Test
+    fun testViewModelStoreOwnerProvided() {
+        val backStackEntry = createBackStackEntry()
+        var viewModelStoreOwner: ViewModelStoreOwner? = null
+
+        composeTestRule.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                viewModelStoreOwner = LocalViewModelStoreOwner.current
+            }
+        }
+
+        assertWithMessage("ViewModelStoreOwner is provided by $backStackEntry")
+            .that(viewModelStoreOwner).isEqualTo(backStackEntry)
+    }
+
+    @Test
+    fun testLifecycleOwnerProvided() {
+        val backStackEntry = createBackStackEntry()
+        var lifecycleOwner: LifecycleOwner? = null
+
+        composeTestRule.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                lifecycleOwner = LocalLifecycleOwner.current
+            }
+        }
+
+        assertWithMessage("LifecycleOwner is provided by $backStackEntry")
+            .that(lifecycleOwner).isEqualTo(backStackEntry)
+    }
+
+    @Test
+    fun testLocalSavedStateRegistryOwnerProvided() {
+        val backStackEntry = createBackStackEntry()
+        var localSavedStateRegistryOwner: SavedStateRegistryOwner? = null
+
+        composeTestRule.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                localSavedStateRegistryOwner = LocalSavedStateRegistryOwner.current
+            }
+        }
+
+        assertWithMessage("LocalSavedStateRegistryOwner is provided by $backStackEntry")
+            .that(localSavedStateRegistryOwner).isEqualTo(backStackEntry)
+    }
+
+    @Test
+    fun testSaveableValueInContentIsSaved() {
+        val backStackEntry = createBackStackEntry()
+        val restorationTester = StateRestorationTester(composeTestRule)
+        var array: IntArray? = null
+
+        restorationTester.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                array = rememberSaveable {
+                    intArrayOf(0)
+                }
+            }
+        }
+
+        assertThat(array).isEqualTo(intArrayOf(0))
+
+        composeTestRule.runOnUiThread {
+            array!![0] = 1
+            // we null it to ensure recomposition happened
+            array = null
+        }
+
+        restorationTester.emulateSavedInstanceStateRestore()
+
+        assertThat(array).isEqualTo(intArrayOf(1))
+    }
+
+    @Test
+    fun testNonSaveableValueInContentIsNotSaved() {
+        val backStackEntry = createBackStackEntry()
+        val restorationTester = StateRestorationTester(composeTestRule)
+        var nonSaveable: IntArray? = null
+        val initialValue = intArrayOf(10)
+
+        restorationTester.setContent {
+            val saveableStateHolder = rememberSaveableStateHolder()
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                nonSaveable = remember { initialValue }
+            }
+        }
+
+        assertThat(nonSaveable).isEqualTo(initialValue)
+
+        composeTestRule.runOnUiThread {
+            nonSaveable!![0] = 1
+            // we null it to ensure recomposition happened
+            nonSaveable = null
+        }
+
+        restorationTester.emulateSavedInstanceStateRestore()
+
+        assertThat(nonSaveable).isEqualTo(initialValue)
+    }
+
+    private fun createBackStackEntry(): NavBackStackEntry {
+        val testNavigator = TestNavigator()
+        val testNavigatorState = TestNavigatorState()
+        testNavigator.onAttach(testNavigatorState)
+        val backStackEntry = testNavigatorState.createBackStackEntry(
+            testNavigator.createDestination(),
+            null
+        )
+        // We navigate to move the NavBackStackEntry to the correct state
+        testNavigator.navigate(listOf(backStackEntry), null, null)
+        return backStackEntry
+    }
+}
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
index eac32a3..776d4a2 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
@@ -20,8 +20,10 @@
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.core.net.toUri
+import androidx.navigation.contains
 import androidx.navigation.NavDeepLinkRequest
 import androidx.navigation.navDeepLink
+import androidx.navigation.navigation
 import androidx.navigation.testing.TestNavHostController
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
diff --git a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
index 48fa470..e89ce23 100644
--- a/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
+++ b/navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostControllerTest.kt
@@ -16,26 +16,26 @@
 
 package androidx.navigation.compose
 
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavController
-import androidx.navigation.NavDestination
-import androidx.navigation.NavDestinationBuilder
-import androidx.navigation.NavGraphBuilder
+import androidx.navigation.createGraph
 import androidx.navigation.get
+import androidx.navigation.plusAssign
 import androidx.navigation.testing.TestNavHostController
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.testutils.TestNavigator
+import androidx.testutils.test
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.lang.IllegalArgumentException
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -47,7 +47,7 @@
     fun testCurrentBackStackEntrySetGraph() {
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         composeTestRule.setContent {
-            val navController = TestNavHostController(LocalContext.current)
+            val navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -57,7 +57,7 @@
         }
 
         assertWithMessage("the currentBackStackEntry should be set with the graph")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(FIRST_DESTINATION)
     }
 
@@ -66,7 +66,7 @@
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -77,7 +77,7 @@
         }
 
         assertWithMessage("the currentBackStackEntry should be set with the graph")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(FIRST_DESTINATION)
 
         composeTestRule.runOnUiThread {
@@ -85,7 +85,7 @@
         }
 
         assertWithMessage("the currentBackStackEntry should be after navigate")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(SECOND_DESTINATION)
     }
 
@@ -94,7 +94,7 @@
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -110,7 +110,7 @@
         }
 
         assertWithMessage("the currentBackStackEntry should return to first destination after pop")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(FIRST_DESTINATION)
     }
 
@@ -118,10 +118,8 @@
     fun testNavigateThenNavigateWithPop() {
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: NavController
-        val navigator = TestNavigator()
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
-            navController.navigatorProvider.addNavigator(navigator)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -131,8 +129,10 @@
             currentBackStackEntry = navController.currentBackStackEntryAsState()
         }
 
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+
         assertWithMessage("the currentBackStackEntry should be set with the graph")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(FIRST_DESTINATION)
         assertThat(navigator.backStack.size).isEqualTo(1)
 
@@ -143,7 +143,7 @@
         }
 
         assertWithMessage("the currentBackStackEntry should be after navigate")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(SECOND_DESTINATION)
         assertWithMessage("the second destination should be the only one on the back stack")
             .that(navigator.backStack.size)
@@ -154,10 +154,8 @@
     fun testNavigateOptionSingleTop() {
         var currentBackStackEntry: State<NavBackStackEntry?> = mutableStateOf(null)
         lateinit var navController: NavController
-        val navigator = TestNavigator()
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
-            navController.navigatorProvider.addNavigator(navigator)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -167,8 +165,9 @@
             currentBackStackEntry = navController.currentBackStackEntryAsState()
         }
 
+        val navigator = navController.navigatorProvider[TestNavigator::class]
         assertWithMessage("the currentBackStackEntry should be set with the graph")
-            .that(currentBackStackEntry.value?.arguments?.getString(KEY_ROUTE))
+            .that(currentBackStackEntry.value?.destination?.route)
             .isEqualTo(FIRST_DESTINATION)
         assertThat(navigator.backStack.size).isEqualTo(1)
 
@@ -195,7 +194,7 @@
     fun testGetBackStackEntry() {
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -209,13 +208,13 @@
 
         assertWithMessage("first destination should be on back stack")
             .that(
-                navController.getBackStackEntry(FIRST_DESTINATION).arguments?.getString(KEY_ROUTE)
+                navController.getBackStackEntry(FIRST_DESTINATION).destination.route
             )
             .isEqualTo(FIRST_DESTINATION)
 
         assertWithMessage("second destination should be on back stack")
             .that(
-                navController.getBackStackEntry(SECOND_DESTINATION).arguments?.getString(KEY_ROUTE)
+                navController.getBackStackEntry(SECOND_DESTINATION).destination.route
             )
             .isEqualTo(SECOND_DESTINATION)
     }
@@ -224,7 +223,7 @@
     fun testGetBackStackEntryNoEntryFound() {
         lateinit var navController: NavController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController()
 
             navController.graph = navController.createGraph(startDestination = FIRST_DESTINATION) {
                 test(FIRST_DESTINATION)
@@ -247,21 +246,15 @@
                 )
         }
     }
+
+    @Composable
+    private fun createNavController(): TestNavHostController {
+        val navController = TestNavHostController(LocalContext.current)
+        val navigator = TestNavigator()
+        navController.navigatorProvider += navigator
+        return navController
+    }
 }
 
-internal inline fun NavGraphBuilder.test(
-    route: String,
-    builder: NavDestinationBuilder<NavDestination>.() -> Unit = { deepLink(createRoute(route)) }
-) = destination(
-    NavDestinationBuilder<NavDestination>(
-        provider["test"],
-        createRoute(route).hashCode()
-    ).apply(builder).apply { argument(KEY_ROUTE) { defaultValue = route } }
-)
-
-internal fun TestNavHostController.setCurrentDestination(
-    route: String
-) = setCurrentDestination(createRoute(route).hashCode())
-
 private const val FIRST_DESTINATION = "first"
 private const val SECOND_DESTINATION = "second"
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 637f279..68c9654 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
@@ -17,7 +17,7 @@
 package androidx.navigation.compose
 
 import android.annotation.SuppressLint
-import android.net.Uri
+import android.content.Context
 import android.os.Bundle
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -35,17 +35,19 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
-import androidx.core.net.toUri
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
-import androidx.navigation.NavGraph
+import androidx.navigation.contains
 import androidx.navigation.NavHostController
+import androidx.navigation.plusAssign
 import androidx.navigation.testing.TestNavHostController
 import androidx.savedstate.SavedStateRegistry
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
+import androidx.testutils.TestNavigator
+import androidx.testutils.test
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Rule
@@ -62,7 +64,7 @@
     fun testSingleDestinationSet() {
         lateinit var navController: NavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -78,7 +80,7 @@
     fun testNavigate() {
         lateinit var navController: NavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -95,9 +97,7 @@
         }
 
         assertWithMessage("second destination should be current")
-            .that(
-                navController.currentDestination?.hasDeepLink(Uri.parse(createRoute("second")))
-            ).isTrue()
+            .that(navController.currentDestination?.route).isEqualTo("second")
     }
 
     @Test
@@ -134,9 +134,7 @@
 
         composeTestRule.runOnIdle {
             assertWithMessage("second destination should be current")
-                .that(
-                    navController.currentDestination?.hasDeepLink(Uri.parse(createRoute("second")))
-                ).isTrue()
+                .that(navController.currentDestination?.route).isEqualTo("second")
         }
 
         composeTestRule.onNodeWithText(text)
@@ -146,9 +144,7 @@
             // ensure our click listener was fired
             assertThat(counter).isEqualTo(1)
             assertWithMessage("second destination should be current")
-                .that(
-                    navController.currentDestination?.hasDeepLink(Uri.parse(createRoute("second")))
-                ).isTrue()
+                .that(navController.currentDestination?.route).isEqualTo("second")
         }
     }
 
@@ -156,7 +152,7 @@
     fun testPop() {
         lateinit var navController: TestNavHostController
         composeTestRule.setContent {
-            navController = TestNavHostController(LocalContext.current)
+            navController = createNavController(LocalContext.current)
 
             NavHost(navController, startDestination = "first") {
                 test("first")
@@ -170,10 +166,7 @@
         }
 
         assertWithMessage("First destination should be current")
-            .that(
-                navController.currentDestination?.hasDeepLink(createRoute("first").toUri())
-            )
-            .isTrue()
+            .that(navController.currentDestination?.route).isEqualTo("first")
     }
 
     @Test
@@ -185,7 +178,7 @@
             val context = LocalContext.current
             // added to avoid lint error b/184349025
             @SuppressLint("RememberReturnType")
-            navController = remember { TestNavHostController(context) }
+            navController = remember { createNavController(context) }
 
             NavHost(navController, startDestination = state.value) {
                 test("first")
@@ -199,9 +192,7 @@
 
         composeTestRule.runOnIdle {
             assertWithMessage("First destination should be current")
-                .that(
-                    navController.currentDestination?.hasDeepLink(createRoute("first").toUri())
-                ).isTrue()
+                .that(navController.currentDestination?.route).isEqualTo("first")
         }
     }
 
@@ -214,7 +205,7 @@
             state = remember { mutableStateOf(0) }
             // added to avoid lint error b/184349025
             @SuppressLint("RememberReturnType")
-            navController = remember { TestNavHostController(context) }
+            navController = remember { createNavController(context) }
             if (state.value == 0) {
                 NavHost(navController, startDestination = "first") {
                     test("first")
@@ -234,9 +225,7 @@
 
         composeTestRule.runOnIdle {
             assertWithMessage("First destination should be current")
-                .that(
-                    navController.currentDestination?.hasDeepLink(createRoute("first").toUri())
-                ).isTrue()
+                .that(navController.currentDestination?.route).isEqualTo("first")
         }
     }
 
@@ -283,9 +272,7 @@
 
         composeTestRule.runOnIdle {
             assertWithMessage("First destination should be current")
-                .that(
-                    navController.currentDestination?.hasDeepLink(createRoute("first").toUri())
-                ).isTrue()
+                .that(navController.currentDestination?.route).isEqualTo("first")
             assertThat(savedViewModel.value).isEqualTo(viewModel.value)
         }
     }
@@ -393,11 +380,14 @@
                 .isNotEqualTo(registry2)
         }
     }
-}
 
-operator fun NavGraph.contains(
-    route: String
-): Boolean = findNode(createRoute(route).hashCode()) != null
+    private fun createNavController(context: Context): TestNavHostController {
+        val navController = TestNavHostController(context)
+        val navigator = TestNavigator()
+        navController.navigatorProvider += navigator
+        return navController
+    }
+}
 
 class TestViewModel : ViewModel() {
     var value: String = "nothing"
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/ComposeNavigator.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/ComposeNavigator.kt
index 4903062..1d90b08 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/ComposeNavigator.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/ComposeNavigator.kt
@@ -16,13 +16,18 @@
 
 package androidx.navigation.compose
 
-import android.os.Bundle
 import androidx.compose.runtime.Composable
-import androidx.core.os.bundleOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
+import androidx.navigation.NavigatorState
+import androidx.navigation.compose.ComposeNavigator.Destination
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
 
 /**
  * Navigator that navigates through [Composable]s. Every destination using this Navigator must
@@ -30,42 +35,42 @@
  * [composable].
  */
 @Navigator.Name("composable")
-public class ComposeNavigator : Navigator<ComposeNavigator.Destination>() {
-    private val backstack = mutableListOf<Int>()
+public class ComposeNavigator : Navigator<Destination>() {
+    private var attached by mutableStateOf(false)
+
+    /**
+     * Get the back stack from the [state]. NavHost will compose at least
+     * once (due to the use of [androidx.compose.runtime.DisposableEffect]) before
+     * the Navigator is attached, so we specifically return an empty flow if we
+     * aren't attached yet.
+     */
+    internal val backStack: StateFlow<List<NavBackStackEntry>> get() = if (attached) {
+        state.backStack
+    } else {
+        MutableStateFlow(emptyList())
+    }
+
+    override fun onAttach(state: NavigatorState) {
+        super.onAttach(state)
+        attached = true
+    }
 
     override fun navigate(
-        destination: Destination,
-        args: Bundle?,
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
-    ): NavDestination? {
-        if (
-            navOptions?.shouldLaunchSingleTop() == true && backstack.lastOrNull() == destination.id
-        ) {
-            return null
+    ) {
+        entries.forEach { entry ->
+            state.add(entry)
         }
-        backstack.add(destination.id)
-        return destination
     }
 
     override fun createDestination(): Destination {
         return Destination(this) { }
     }
 
-    override fun popBackStack(): Boolean {
-        return backstack.removeLastOrNull() != null
-    }
-
-    override fun onSaveState(): Bundle? {
-        return bundleOf(KEY_BACK_STACK_IDS to backstack.toIntArray())
-    }
-
-    override fun onRestoreState(savedState: Bundle) {
-        val restoredBackStack = savedState.getIntArray(KEY_BACK_STACK_IDS)
-        if (restoredBackStack != null) {
-            backstack.clear()
-            backstack.addAll(restoredBackStack.asList())
-        }
+    override fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) {
+        state.pop(popUpTo, savedState)
     }
 
     /**
@@ -77,7 +82,7 @@
         internal val content: @Composable (NavBackStackEntry) -> Unit
     ) : NavDestination(navigator)
 
-    private companion object {
-        private const val KEY_BACK_STACK_IDS = "androidx-nav-compose:navigator:backStackIds"
+    internal companion object {
+        internal const val NAME = "composable"
     }
 }
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt
index 3589239..988c7c2 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NamedNavArgument.kt
@@ -33,9 +33,24 @@
  * Construct a named [NavArgument] by using the [navArgument] method.
  */
 public class NamedNavArgument internal constructor(
-    private val name: String,
-    private val argument: NavArgument
+
+    /**
+     * The name the argument is associated with
+     */
+    public val name: String,
+
+    /**
+     * The [NavArgument] associated with the name
+     */
+    public val argument: NavArgument
 ) {
-    internal operator fun component1(): String = name
-    internal operator fun component2(): NavArgument = argument
+    /**
+     * Provides destructuring access to this [NamedNavArgument]'s [name]
+     */
+    public operator fun component1(): String = name
+
+    /**
+     * Provides destructuring access to this [NamedNavArgument]'s [argument]
+     */
+    public operator fun component2(): NavArgument = argument
 }
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavBackStackEntryProvider.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavBackStackEntryProvider.kt
new file mode 100644
index 0000000..c9ecf81
--- /dev/null
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavBackStackEntryProvider.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.compose
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.saveable.SaveableStateHolder
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
+import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavBackStackEntry
+import java.util.UUID
+
+/**
+ * Provides [this] [NavBackStackEntry] as [LocalViewModelStoreOwner], [LocalLifecycleOwner] and
+ * [LocalSavedStateRegistryOwner] to the [content] and saves the [content]'s saveable states with
+ * the given [saveableStateHolder].
+ *
+ * @param saveableStateHolder The [SaveableStateHolder] that holds the saved states. The same
+ * holder should be used for all [NavBackStackEntry]s in the encapsulating [Composable] and the
+ * holder should be hoisted.
+ * @param content The content [Composable]
+ */
+@Composable
+public fun NavBackStackEntry.LocalOwnersProvider(
+    saveableStateHolder: SaveableStateHolder,
+    content: @Composable () -> Unit
+) {
+    CompositionLocalProvider(
+        LocalViewModelStoreOwner provides this,
+        LocalLifecycleOwner provides this,
+        LocalSavedStateRegistryOwner provides this
+    ) {
+        saveableStateHolder.SaveableStateProvider(content)
+    }
+}
+
+@Composable
+private fun SaveableStateHolder.SaveableStateProvider(content: @Composable () -> Unit) {
+    val viewModel = viewModel<BackStackEntryIdViewModel>()
+    viewModel.saveableStateHolder = this
+    SaveableStateProvider(viewModel.id, content)
+}
+
+internal class BackStackEntryIdViewModel(handle: SavedStateHandle) : ViewModel() {
+
+    private val IdKey = "SaveableStateHolder_BackStackEntryKey"
+
+    // we create our own id for each back stack entry to support multiple entries of the same
+    // destination. this id will be restored by SavedStateHandle
+    val id: UUID = handle.get<UUID>(IdKey) ?: UUID.randomUUID().also { handle.set(IdKey, it) }
+
+    var saveableStateHolder: SaveableStateHolder? = null
+
+    // onCleared will be called on the entries removed from the back stack. here we notify
+    // RestorableStateHolder that we shouldn't save the state for this id, so when we open this
+    // destination again the state will not be restored.
+    override fun onCleared() {
+        super.onCleared()
+        saveableStateHolder?.removeState(id)
+    }
+}
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
index bda379b..3774f72 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
@@ -19,10 +19,8 @@
 import androidx.compose.runtime.Composable
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDeepLink
-import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.get
-import androidx.navigation.navigation
 
 /**
  * Add the [Composable] to the [NavGraphBuilder]
@@ -40,11 +38,7 @@
 ) {
     addDestination(
         ComposeNavigator.Destination(provider[ComposeNavigator::class], content).apply {
-            val internalRoute = createRoute(route)
-            addDeepLink(internalRoute)
-            val argument = navArgument(KEY_ROUTE) { defaultValue = route }
-            addArgument(argument.component1(), argument.component2())
-            id = internalRoute.hashCode()
+            this.route = route
             arguments.forEach { (argumentName, argument) ->
                 addArgument(argumentName, argument)
             }
@@ -54,21 +48,3 @@
         }
     )
 }
-
-/**
- * Construct a nested [NavGraph]
- *
- * @sample androidx.navigation.compose.samples.NestedNavStartDestination
- * @sample androidx.navigation.compose.samples.NestedNavInGraph
- */
-public fun NavGraphBuilder.navigation(
-    startDestination: String,
-    route: String,
-    builder: NavGraphBuilder.() -> Unit
-): Unit = navigation(
-    createRoute(route).hashCode(),
-    createRoute(startDestination).hashCode()
-) {
-    deepLink(createRoute(route))
-    apply(builder)
-}
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
index 004c6f6..61eb0d8 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt
@@ -20,21 +20,21 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.saveable.SaveableStateHolder
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalLifecycleOwner
-import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.ViewModel
+import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
-import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavDestination
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphBuilder
 import androidx.navigation.NavHostController
-import java.util.UUID
+import androidx.navigation.createGraph
+import androidx.navigation.Navigator
+import androidx.navigation.get
 
 /**
  * Provides in place in the Compose hierarchy for self contained navigation to occur.
@@ -116,55 +116,23 @@
 
     val saveableStateHolder = rememberSaveableStateHolder()
 
-    // state from the navController back stack
-    val currentNavBackStackEntry = navController.currentBackStackEntryAsState().value
+    // 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>>(
+        ComposeNavigator.NAME
+    ) as? ComposeNavigator ?: return
+    val backStack by composeNavigator.backStack.collectAsState()
 
-    // If the currentNavBackStackEntry is null, we have popped all of the destinations
-    // off of the navController back stack and have nothing to show.
-    if (currentNavBackStackEntry != null) {
-        val destination = currentNavBackStackEntry.destination
-        // If the destination is not a compose destination, (e.i. activity, dialog, view, etc)
-        // then we do nothing and rely on Navigation to show the proper destination
-        if (destination is ComposeNavigator.Destination) {
-            // while in the scope of the composable, we provide the navBackStackEntry as the
-            // ViewModelStoreOwner and LifecycleOwner
-            Box(modifier, propagateMinConstraints = true) {
-                CompositionLocalProvider(
-                    LocalViewModelStoreOwner provides currentNavBackStackEntry,
-                    LocalLifecycleOwner provides currentNavBackStackEntry,
-                    LocalSavedStateRegistryOwner provides currentNavBackStackEntry
-                ) {
-                    saveableStateHolder.SaveableStateProvider {
-                        destination.content(currentNavBackStackEntry)
-                    }
-                }
+    backStack.filter { backStackEntry ->
+        backStackEntry.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
+    }.forEach { backStackEntry ->
+        val destination = backStackEntry.destination as ComposeNavigator.Destination
+        // while in the scope of the composable, we provide the navBackStackEntry as the
+        // ViewModelStoreOwner and LifecycleOwner
+        Box(modifier, propagateMinConstraints = true) {
+            backStackEntry.LocalOwnersProvider(saveableStateHolder) {
+                destination.content(backStackEntry)
             }
         }
     }
 }
-
-@Composable
-private fun SaveableStateHolder.SaveableStateProvider(content: @Composable () -> Unit) {
-    val viewModel = viewModel<BackStackEntryIdViewModel>()
-    viewModel.saveableStateHolder = this
-    SaveableStateProvider(viewModel.id, content)
-}
-
-internal class BackStackEntryIdViewModel(handle: SavedStateHandle) : ViewModel() {
-
-    private val IdKey = "SaveableStateHolder_BackStackEntryKey"
-
-    // we create our own id for each back stack entry to support multiple entries of the same
-    // destination. this id will be restored by SavedStateHandle
-    val id: UUID = handle.get<UUID>(IdKey) ?: UUID.randomUUID().also { handle.set(IdKey, it) }
-
-    var saveableStateHolder: SaveableStateHolder? = null
-
-    // onCleared will be called on the entries removed from the back stack. here we notify
-    // RestorableStateHolder that we shouldn't save the state for this id, so when we open this
-    // destination again the state will not be restored.
-    override fun onCleared() {
-        super.onCleared()
-        saveableStateHolder?.removeState(id)
-    }
-}
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
index 08c66a0..b564e4c 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHostController.kt
@@ -27,22 +27,9 @@
 import androidx.compose.runtime.saveable.Saver
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.platform.LocalContext
-import androidx.core.net.toUri
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavController
-import androidx.navigation.NavDeepLinkRequest
-import androidx.navigation.NavGraph
-import androidx.navigation.NavGraphBuilder
 import androidx.navigation.NavHostController
-import androidx.navigation.NavOptions
-import androidx.navigation.NavOptionsBuilder
-import androidx.navigation.navOptions
-import androidx.navigation.navigation
-
-/**
- * The route linked to the current destination.
- */
-const val KEY_ROUTE = "android-support-nav:controller:route"
 
 /**
  * Gets the current navigation back stack entry as a [MutableState]. When the given navController
@@ -96,56 +83,3 @@
     save = { it.saveState() },
     restore = { createNavController(context).apply { restoreState(it) } }
 )
-
-/**
- * Navigate to a route in the current NavGraph.
- *
- * @param route route for the destination
- * @param builder DSL for constructing a new [NavOptions]
- */
-public fun NavController.navigate(route: String, builder: NavOptionsBuilder.() -> Unit = {}) {
-    navigate(
-        NavDeepLinkRequest.Builder.fromUri(createRoute(route).toUri()).build(),
-        navOptions(builder)
-    )
-}
-
-/**
- * Construct a new [NavGraph]
- *
- * @param route the route for the graph
- * @param startDestination the route for the start destination
- * @param builder the builder used to construct the graph
- */
-fun NavController.createGraph(
-    startDestination: String,
-    route: String? = null,
-    builder: NavGraphBuilder.() -> Unit
-): NavGraph = navigatorProvider.navigation(
-    if (route != null) createRoute(route).hashCode() else 0,
-    createRoute(startDestination).hashCode(),
-    builder
-)
-
-/**
- * Gets the topmost {@link NavBackStackEntry} for a route.
- * <p>
- * This is always safe to use with {@link #getCurrentDestination() the current destination} or
- * {@link NavDestination#getParent() its parent} or grandparent navigation graphs as these
- * destinations are guaranteed to be on the back stack.
- *
- * @param route route of a destination that exists on the back stack
- * @throws IllegalArgumentException if the destination is not on the back stack
- */
-public fun NavController.getBackStackEntry(route: String): NavBackStackEntry {
-    try {
-        return getBackStackEntry(createRoute(route).hashCode())
-    } catch (e: IllegalArgumentException) {
-        throw IllegalArgumentException(
-            "No destination with route $route is on the NavController's back stack. The current " +
-                "destination is $currentDestination"
-        )
-    }
-}
-
-internal fun createRoute(route: String) = "android-app://androidx.navigation.compose/$route"
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavOptionsBuilder.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavOptionsBuilder.kt
deleted file mode 100644
index 7701f08..0000000
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavOptionsBuilder.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.navigation.compose
-
-import androidx.navigation.NavOptionsBuilder
-import androidx.navigation.PopUpToBuilder
-
-/**
- * Pop up to a given destination before navigating. This pops all non-matching destination routes
- * from the back stack until the destination with a matching route is found.
- *
- * @param route route for the destination
- * @param popUpToBuilder builder used to construct a popUpTo operation
- */
-fun NavOptionsBuilder.popUpTo(route: String, popUpToBuilder: PopUpToBuilder.() -> Unit) {
-    popUpTo(createRoute(route).hashCode(), popUpToBuilder)
-}
diff --git a/navigation/navigation-dynamic-features-fragment/build.gradle b/navigation/navigation-dynamic-features-fragment/build.gradle
index ccf402b..596d055 100644
--- a/navigation/navigation-dynamic-features-fragment/build.gradle
+++ b/navigation/navigation-dynamic-features-fragment/build.gradle
@@ -26,6 +26,12 @@
     id("kotlin-android")
 }
 
+android {
+    defaultConfig {
+        multiDexEnabled true
+    }
+}
+
 dependencies {
     api(project(":navigation:navigation-dynamic-features-runtime"))
     api(project(":navigation:navigation-fragment"))
@@ -42,10 +48,11 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
     androidTestImplementation(TRUTH)
+    androidTestImplementation(MULTIDEX)
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.fragment", module: "fragment"
     })
diff --git a/navigation/navigation-dynamic-features-fragment/lint-baseline.xml b/navigation/navigation-dynamic-features-fragment/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-dynamic-features-fragment/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigator.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigator.kt
index 574c877..a3ac6d7 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigator.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigator.kt
@@ -17,11 +17,10 @@
 package androidx.navigation.dynamicfeatures.fragment
 
 import android.content.Context
-import android.os.Bundle
 import android.util.AttributeSet
 import androidx.core.content.withStyledAttributes
 import androidx.fragment.app.FragmentManager
-import androidx.navigation.NavDestination
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
 import androidx.navigation.NavigatorProvider
@@ -43,21 +42,32 @@
     override fun createDestination(): Destination = Destination(this)
 
     override fun navigate(
-        destination: FragmentNavigator.Destination,
-        args: Bundle?,
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Navigator.Extras?
-    ): NavDestination? {
+    ) {
+        for (entry in entries) {
+            navigate(entry, navOptions, navigatorExtras)
+        }
+    }
+
+    private fun navigate(
+        entry: NavBackStackEntry,
+        navOptions: NavOptions?,
+        navigatorExtras: Navigator.Extras?
+    ) {
+        val destination = entry.destination
+        val args = entry.arguments
         val extras = navigatorExtras as? DynamicExtras
         if (destination is Destination) {
             val moduleName = destination.moduleName
             if (moduleName != null && installManager.needsInstall(moduleName)) {
-                return installManager.performInstall(destination, args, extras, moduleName)
+                installManager.performInstall(destination, args, extras, moduleName)
+                return
             }
         }
-        return super.navigate(
-            destination,
-            args,
+        super.navigate(
+            listOf(entry),
             navOptions,
             if (extras != null) extras.destinationExtras else navigatorExtras
         )
diff --git a/navigation/navigation-dynamic-features-runtime/api/current.ignore b/navigation/navigation-dynamic-features-runtime/api/current.ignore
index 86f7ec0..fdf7759 100644
--- a/navigation/navigation-dynamic-features-runtime/api/current.ignore
+++ b/navigation/navigation-dynamic-features-runtime/api/current.ignore
@@ -1,3 +1,5 @@
 // Baseline format: 1.0
 RemovedMethod: androidx.navigation.dynamicfeatures.DynamicExtras#DynamicExtras():
     Removed constructor androidx.navigation.dynamicfeatures.DynamicExtras()
+RemovedMethod: androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator#popBackStack():
+    Removed method androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.popBackStack()
diff --git a/navigation/navigation-dynamic-features-runtime/api/current.txt b/navigation/navigation-dynamic-features-runtime/api/current.txt
index 2145c1f..3dd9850 100644
--- a/navigation/navigation-dynamic-features-runtime/api/current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/current.txt
@@ -70,7 +70,6 @@
     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();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
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 2145c1f..3dd9850 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
@@ -70,7 +70,6 @@
     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();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_current.ignore b/navigation/navigation-dynamic-features-runtime/api/restricted_current.ignore
index 86f7ec0..fdf7759 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_current.ignore
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_current.ignore
@@ -1,3 +1,5 @@
 // Baseline format: 1.0
 RemovedMethod: androidx.navigation.dynamicfeatures.DynamicExtras#DynamicExtras():
     Removed constructor androidx.navigation.dynamicfeatures.DynamicExtras()
+RemovedMethod: androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator#popBackStack():
+    Removed method androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.popBackStack()
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
index 2145c1f..3dd9850 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
@@ -70,7 +70,6 @@
     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();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
diff --git a/navigation/navigation-dynamic-features-runtime/build.gradle b/navigation/navigation-dynamic-features-runtime/build.gradle
index 3853ed4..09812400 100644
--- a/navigation/navigation-dynamic-features-runtime/build.gradle
+++ b/navigation/navigation-dynamic-features-runtime/build.gradle
@@ -26,11 +26,19 @@
     id("kotlin-android")
 }
 
+android {
+    defaultConfig {
+        multiDexEnabled true
+    }
+}
+
 dependencies {
     api(project(":navigation:navigation-runtime"))
     api(PLAY_CORE)
     api(KOTLIN_STDLIB)
 
+    testImplementation(project(":navigation:navigation-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_EXT_JUNIT)
     testImplementation(ANDROIDX_TEST_RUNNER)
@@ -43,10 +51,11 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
     androidTestImplementation(TRUTH)
+    androidTestImplementation(MULTIDEX)
 }
 
 androidx {
diff --git a/navigation/navigation-dynamic-features-runtime/lint-baseline.xml b/navigation/navigation-dynamic-features-runtime/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-dynamic-features-runtime/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicGraphNavigator.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicGraphNavigator.kt
index 04ec5fa..1aa62d6 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicGraphNavigator.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicGraphNavigator.kt
@@ -21,6 +21,7 @@
 import android.util.AttributeSet
 import androidx.annotation.RestrictTo
 import androidx.core.content.withStyledAttributes
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraphNavigator
@@ -58,20 +59,32 @@
      * module has successfully been installed.
      */
     override fun navigate(
-        destination: NavGraph,
-        args: Bundle?,
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Extras?
-    ): NavDestination? {
+    ) {
+        for (entry in entries) {
+            navigate(entry, navOptions, navigatorExtras)
+        }
+    }
+
+    private fun navigate(
+        entry: NavBackStackEntry,
+        navOptions: NavOptions?,
+        navigatorExtras: Extras?
+    ) {
+        val destination = entry.destination
+        val args = entry.arguments
         val extras = if (navigatorExtras is DynamicExtras) navigatorExtras else null
         if (destination is DynamicNavGraph) {
             val moduleName = destination.moduleName
             if (moduleName != null && installManager.needsInstall(moduleName)) {
-                return installManager.performInstall(destination, args, extras, moduleName)
+                installManager.performInstall(destination, args, extras, moduleName)
+                return
             }
         }
-        return super.navigate(
-            destination, args, navOptions,
+        super.navigate(
+            listOf(entry), navOptions,
             if (extras != null) extras.destinationExtras else navigatorExtras
         )
     }
@@ -110,7 +123,7 @@
     internal fun navigateToProgressDestination(
         dynamicNavGraph: DynamicNavGraph,
         progressArgs: Bundle?
-    ): NavDestination? {
+    ) {
         var progressDestinationId = dynamicNavGraph.progressDestination
         if (progressDestinationId == 0) {
             progressDestinationId = installDefaultProgressDestination(dynamicNavGraph)
@@ -124,7 +137,8 @@
         val navigator = navigatorProvider.getNavigator<Navigator<NavDestination>>(
             progressDestination.navigatorName
         )
-        return navigator.navigate(progressDestination, progressArgs, null, null)
+        val entry = state.createBackStackEntry(progressDestination, progressArgs)
+        navigator.navigate(listOf(entry), null, null)
     }
 
     /**
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallManager.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallManager.kt
index 0d14629e..eab3688 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallManager.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallManager.kt
@@ -79,8 +79,9 @@
             val dynamicNavGraph = DynamicNavGraph.getOrThrow(destination)
             val navigator: Navigator<*> =
                 dynamicNavGraph.navigatorProvider[dynamicNavGraph.navigatorName]
-            return if (navigator is DynamicGraphNavigator) {
+            if (navigator is DynamicGraphNavigator) {
                 navigator.navigateToProgressDestination(dynamicNavGraph, progressArgs)
+                return null
             } else {
                 throw IllegalStateException(
                     "You must use a DynamicNavGraph to perform a module installation."
diff --git a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallMonitor.kt b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallMonitor.kt
index 48ba4ff..672d00d 100644
--- a/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallMonitor.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/main/java/androidx/navigation/dynamicfeatures/DynamicInstallMonitor.kt
@@ -26,7 +26,7 @@
 
 /**
  * Monitor installation progress of dynamic feature modules.
- * This class enables you to subscribe to the current installation state via [.getStatus].
+ * This class enables you to subscribe to the current installation state via [getStatus].
  * You also can perform various checks on installation state directly through this monitor.
  *
  * In order to enable installation and monitoring of progress you'll have to provide an instance
diff --git a/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicNavGraphTest.kt b/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicNavGraphTest.kt
index 73897f5..f48fdbb 100644
--- a/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicNavGraphTest.kt
+++ b/navigation/navigation-dynamic-features-runtime/src/test/java/androidx/navigation/dynamicfeatures/DynamicNavGraphTest.kt
@@ -16,14 +16,17 @@
 
 package androidx.navigation.dynamicfeatures
 
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
 import androidx.navigation.NavDestination
 import androidx.navigation.NavigatorProvider
 import androidx.navigation.NoOpNavigator
 import androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph
 import androidx.navigation.dynamicfeatures.shared.TestDynamicInstallManager
+import androidx.navigation.testing.TestNavigatorState
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -31,10 +34,15 @@
 @RunWith(JUnit4::class)
 class DynamicNavGraphTest {
 
+    @get:Rule
+    val instantTaskExecutorRule = InstantTaskExecutorRule()
+
     private val progressId = 1
     private lateinit var provider: NavigatorProvider
+    private lateinit var navigatorState: TestNavigatorState
     private lateinit var navigator: DynamicGraphNavigator
     private lateinit var dynamicNavGraph: DynamicNavGraph
+    private lateinit var noOpState: TestNavigatorState
     private lateinit var noOpNavigator: NoOpNavigator
 
     @Before
@@ -46,6 +54,8 @@
             TestDynamicInstallManager()
         )
         provider.addNavigator(noOpNavigator)
+        noOpState = TestNavigatorState()
+        noOpNavigator.onAttach(noOpState)
         dynamicNavGraph = navigator.createDestination()
     }
 
@@ -61,7 +71,8 @@
                 id = progressId
             }
         )
-        val progressDestination = navigator.navigateToProgressDestination(dynamicNavGraph, null)
+        navigator.navigateToProgressDestination(dynamicNavGraph, null)
+        val progressDestination = noOpState.backStack.value.lastOrNull()?.destination
         assertNotNull(progressDestination)
         progressDestination?.let {
             DynamicNavGraph.getOrThrow(progressDestination)
@@ -82,7 +93,8 @@
                 id = progressId
             }
         )
-        val destination = navigator.navigateToProgressDestination(dynamicNavGraph, null)
+        navigator.navigateToProgressDestination(dynamicNavGraph, null)
+        val destination = noOpState.backStack.value.lastOrNull()?.destination
         assertTrue(destination?.parent is DynamicNavGraph)
     }
 
@@ -91,6 +103,8 @@
             navigator.installDefaultProgressDestination { it }
         }
         provider.addNavigator(navigator)
+        navigatorState = TestNavigatorState()
+        navigator.onAttach(navigatorState)
         dynamicNavGraph = navigator.createDestination()
     }
 }
diff --git a/navigation/navigation-fragment-ktx/lint-baseline.xml b/navigation/navigation-fragment-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-fragment-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-fragment/api/current.ignore b/navigation/navigation-fragment/api/current.ignore
index dd7b98f..bed10fd 100644
--- a/navigation/navigation-fragment/api/current.ignore
+++ b/navigation/navigation-fragment/api/current.ignore
@@ -1,3 +1,11 @@
 // Baseline format: 1.0
 ChangedType: androidx.navigation.fragment.FragmentNavigator.Extras#getSharedElements():
     Method androidx.navigation.fragment.FragmentNavigator.Extras.getSharedElements has changed return type from java.util.Map<android.view.View!,java.lang.String!> to java.util.Map<android.view.View,java.lang.String>
+
+
+RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#popBackStack():
+    Removed method androidx.navigation.fragment.DialogFragmentNavigator.popBackStack()
+RemovedMethod: androidx.navigation.fragment.FragmentNavigator#navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
+    Removed method androidx.navigation.fragment.FragmentNavigator.navigate(androidx.navigation.fragment.FragmentNavigator.Destination,android.os.Bundle,androidx.navigation.NavOptions,androidx.navigation.Navigator.Extras)
+RemovedMethod: androidx.navigation.fragment.FragmentNavigator#popBackStack():
+    Removed method androidx.navigation.fragment.FragmentNavigator.popBackStack()
diff --git a/navigation/navigation-fragment/api/current.txt b/navigation/navigation-fragment/api/current.txt
index 633200e..5f8b262 100644
--- a/navigation/navigation-fragment/api/current.txt
+++ b/navigation/navigation-fragment/api/current.txt
@@ -13,7 +13,6 @@
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -46,8 +45,6 @@
     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);
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
index 633200e..5f8b262 100644
--- a/navigation/navigation-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
@@ -13,7 +13,6 @@
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -46,8 +45,6 @@
     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);
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
diff --git a/navigation/navigation-fragment/api/restricted_current.ignore b/navigation/navigation-fragment/api/restricted_current.ignore
index dd7b98f..bed10fd 100644
--- a/navigation/navigation-fragment/api/restricted_current.ignore
+++ b/navigation/navigation-fragment/api/restricted_current.ignore
@@ -1,3 +1,11 @@
 // Baseline format: 1.0
 ChangedType: androidx.navigation.fragment.FragmentNavigator.Extras#getSharedElements():
     Method androidx.navigation.fragment.FragmentNavigator.Extras.getSharedElements has changed return type from java.util.Map<android.view.View!,java.lang.String!> to java.util.Map<android.view.View,java.lang.String>
+
+
+RemovedMethod: androidx.navigation.fragment.DialogFragmentNavigator#popBackStack():
+    Removed method androidx.navigation.fragment.DialogFragmentNavigator.popBackStack()
+RemovedMethod: androidx.navigation.fragment.FragmentNavigator#navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle, androidx.navigation.NavOptions, androidx.navigation.Navigator.Extras):
+    Removed method androidx.navigation.fragment.FragmentNavigator.navigate(androidx.navigation.fragment.FragmentNavigator.Destination,android.os.Bundle,androidx.navigation.NavOptions,androidx.navigation.Navigator.Extras)
+RemovedMethod: androidx.navigation.fragment.FragmentNavigator#popBackStack():
+    Removed method androidx.navigation.fragment.FragmentNavigator.popBackStack()
diff --git a/navigation/navigation-fragment/api/restricted_current.txt b/navigation/navigation-fragment/api/restricted_current.txt
index 633200e..5f8b262 100644
--- a/navigation/navigation-fragment/api/restricted_current.txt
+++ b/navigation/navigation-fragment/api/restricted_current.txt
@@ -13,7 +13,6 @@
     ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
     method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
@@ -46,8 +45,6 @@
     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);
-    method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
   }
 
   @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 2c03dad..5837d97 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -31,6 +31,7 @@
     api(project(":navigation:navigation-runtime"))
 
     api(KOTLIN_STDLIB)
+    androidTestImplementation(project(":navigation:navigation-testing"))
     androidTestImplementation(projectOrArtifact(":fragment:fragment-testing"))
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
@@ -41,7 +42,7 @@
         exclude group: "androidx.fragment", module: "fragment"
     })
     androidTestImplementation(project(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
 }
 
diff --git a/navigation/navigation-fragment/lint-baseline.xml b/navigation/navigation-fragment/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-fragment/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/BaseNavControllerTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/BaseNavControllerTest.kt
index c087737..ff2e791f2 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/BaseNavControllerTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/BaseNavControllerTest.kt
@@ -108,7 +108,7 @@
 
         // Test that the deep link Intent was passed through even though we don't pass in any args
 
-        val deepLinkIntent = navigator.current.second?.getParcelable<Intent>(
+        val deepLinkIntent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertNotNull(deepLinkIntent)
@@ -159,10 +159,10 @@
         val navigator = navController.navigatorProvider[TestNavigator::class]
         assertEquals(expectedStackSize, navigator.backStack.size)
 
-        assertEquals(TEST_ARG_VALUE, navigator.current.second?.getString(TEST_ARG))
+        assertEquals(TEST_ARG_VALUE, navigator.current.arguments?.getString(TEST_ARG))
 
         // Test that the deep link Intent was passed in alongside our args
-        val deepLinkIntent = navigator.current.second?.getParcelable<Intent>(
+        val deepLinkIntent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertNotNull(deepLinkIntent)
@@ -238,10 +238,10 @@
         assertEquals(destId, navController.currentDestination?.id ?: 0)
         val navigator = navController.navigatorProvider[TestNavigator::class]
         assertEquals(expectedStackSize, navigator.backStack.size)
-        assertEquals(expectedValue, navigator.current.second?.getString(TEST_ARG))
+        assertEquals(expectedValue, navigator.current.arguments?.getString(TEST_ARG))
 
         // Test that the deep link Intent was passed in alongside our args
-        val deepLinkIntent = navigator.current.second?.getParcelable<Intent>(
+        val deepLinkIntent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertNotNull(deepLinkIntent)
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
index 8b7571e..2498514 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
@@ -22,9 +22,11 @@
 import androidx.fragment.app.FragmentFactory
 import androidx.fragment.app.FragmentManager
 import androidx.lifecycle.Lifecycle
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavOptions
 import androidx.navigation.fragment.test.EmptyFragment
 import androidx.navigation.fragment.test.R
+import androidx.navigation.testing.TestNavigatorState
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -38,6 +40,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import kotlin.reflect.KClass
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -57,24 +60,26 @@
 
     private lateinit var emptyActivity: EmptyActivity
     private lateinit var fragmentManager: FragmentManager
+    private lateinit var navigatorState: TestNavigatorState
+    private lateinit var fragmentNavigator: FragmentNavigator
 
     @Before
     fun setup() {
         emptyActivity = activityRule.activity
         fragmentManager = emptyActivity.supportFragmentManager
+        navigatorState = TestNavigatorState()
+        fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
+        fragmentNavigator.onAttach(navigatorState)
     }
 
     @UiThreadTest
     @Test
     fun testNavigate() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination().apply {
-            id = INITIAL_FRAGMENT
-            setClassName(EmptyFragment::class.java.name)
-        }
+        val entry = createBackStackEntry()
 
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Fragment should be added", fragment)
@@ -92,14 +97,11 @@
     @Test
     fun testNavigateWithFragmentFactory() {
         fragmentManager.fragmentFactory = NonEmptyFragmentFactory()
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination().apply {
-            id = INITIAL_FRAGMENT
-            setClassName(NonEmptyConstructorFragment::class.java.name)
-        }
+        val entry = createBackStackEntry(clazz = NonEmptyConstructorFragment::class)
 
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Fragment should be added")
@@ -116,14 +118,11 @@
     @UiThreadTest
     @Test
     fun testNavigateTwice() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination().apply {
-            id = INITIAL_FRAGMENT
-            setClassName(EmptyFragment::class.java.name)
-        }
+        val entry = createBackStackEntry()
 
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Fragment should be added", fragment)
@@ -137,9 +136,10 @@
         )
 
         // Now push a second fragment
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Replacement Fragment should be added", replacementFragment)
@@ -156,60 +156,55 @@
     @UiThreadTest
     @Test
     fun testNavigateWithPopUpToThenPop() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // Push initial fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
 
         // Push a second fragment
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val secondEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(secondEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry).inOrder()
         fragmentManager.executePendingTransactions()
 
         // Pop and then push third fragment, simulating popUpTo to initial.
-        val success = fragmentNavigator.popBackStack()
-        assertTrue("FragmentNavigator should return true when popping the third fragment", success)
-        destination.id = THIRD_FRAGMENT
-        assertThat(
-            fragmentNavigator.navigate(
-                destination, null,
-                NavOptions.Builder().setPopUpTo(INITIAL_FRAGMENT, false).build(), null
-            )
-        )
-            .isEqualTo(destination)
+        fragmentNavigator.popBackStack(secondEntry, false)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        val thirdEntry = createBackStackEntry(THIRD_FRAGMENT)
+        fragmentNavigator.navigate(listOf(thirdEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, thirdEntry).inOrder()
         fragmentManager.executePendingTransactions()
 
         // Now pop the Fragment
-        val popped = fragmentNavigator.popBackStack()
-        assertTrue("FragmentNavigator should return true when popping the third fragment", popped)
+        fragmentNavigator.popBackStack(thirdEntry, false)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
     }
 
     @UiThreadTest
     @Test
     fun testSingleTopInitial() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
-        fragmentNavigator.navigate(destination, null, null, null)
+        fragmentNavigator.navigate(listOf(entry), null, null)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Fragment should be added", fragment)
         val lifecycle = fragment!!.lifecycle
 
-        assertThat(
-            fragmentNavigator.navigate(
-                destination, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
+        fragmentNavigator.navigate(
+            listOf(entry),
+            NavOptions.Builder().setLaunchSingleTop(true).build(),
+            null
         )
-            .isNull()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Replacement Fragment should be added", replacementFragment)
@@ -234,13 +229,12 @@
     @UiThreadTest
     @Test
     fun testSingleTop() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // First push an initial Fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val initialFragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Initial Fragment should be added")
@@ -248,9 +242,10 @@
             .isNotNull()
 
         // Now push the Fragment that we want to replace with a singleTop operation
-        destination.id = 1
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Fragment should be added")
@@ -258,13 +253,13 @@
             .isNotNull()
         val lifecycle = fragment!!.lifecycle
 
-        assertThat(
-            fragmentNavigator.navigate(
-                destination, null,
-                NavOptions.Builder().setLaunchSingleTop(true).build(), null
-            )
+        fragmentNavigator.navigate(
+            listOf(replacementEntry),
+            NavOptions.Builder().setLaunchSingleTop(true).build(),
+            null
         )
-            .isNull()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Replacement Fragment should be added")
@@ -283,8 +278,10 @@
             .that(lifecycle.currentState)
             .isEqualTo(Lifecycle.State.DESTROYED)
 
-        assertThat(fragmentNavigator.popBackStack())
-            .isTrue()
+        fragmentNavigator.popBackStack(replacementEntry, false)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+
         fragmentManager.executePendingTransactions()
         assertWithMessage("Initial Fragment should be on top of back stack after pop")
             .that(fragmentManager.findFragmentById(R.id.container))
@@ -297,47 +294,37 @@
     @UiThreadTest
     @Test
     fun testPopInitial() {
-        val fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // First push an initial Fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
 
         // Now pop the initial Fragment
-        val popped = fragmentNavigator.popBackStack()
-        assertWithMessage(
-            "FragmentNavigator should return false when popping " +
-                "the initial Fragment"
-        )
-            .that(popped)
-            .isTrue()
+        fragmentNavigator.popBackStack(entry, false)
+        assertThat(navigatorState.backStack.value)
+            .isEmpty()
     }
 
     @UiThreadTest
     @Test
     fun testPop() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // First push an initial Fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Fragment should be added", fragment)
 
         // Now push the Fragment that we want to pop
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Replacement Fragment should be added", replacementFragment)
@@ -351,9 +338,10 @@
         )
 
         // Now pop the Fragment
-        val popped = fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(replacementEntry, false)
         fragmentManager.executePendingTransactions()
-        assertTrue("FragmentNavigator should return true when popping a Fragment", popped)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         assertEquals(
             "Fragment should be the primary navigation Fragment after pop",
             fragment, fragmentManager.primaryNavigationFragment
@@ -363,14 +351,12 @@
     @UiThreadTest
     @Test
     fun testPopWithSameDestinationTwice() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // First push an initial Fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Fragment should be added")
@@ -378,9 +364,10 @@
             .isNotNull()
 
         // Now push a second Fragment
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val secondEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(secondEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Replacement Fragment should be added")
@@ -392,8 +379,10 @@
 
         // Push the same Fragment a second time, creating a stack of two
         // identical Fragments
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val fragmentToPop = fragmentManager.findFragmentById(R.id.container)
         assertWithMessage("Fragment to pop should be added")
@@ -404,11 +393,10 @@
             .isSameInstanceAs(fragmentToPop)
 
         // Now pop the Fragment
-        val popped = fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(replacementEntry, false)
         fragmentManager.executePendingTransactions()
-        assertWithMessage("FragmentNavigator should return true when popping a Fragment")
-            .that(popped)
-            .isTrue()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry).inOrder()
         assertWithMessage(
             "Replacement Fragment should be the primary navigation Fragment " +
                 "after pop"
@@ -420,22 +408,21 @@
     @UiThreadTest
     @Test
     fun testPopWithChildFragmentBackStack() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
 
         // First push an initial Fragment
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Fragment should be added", fragment)
 
         // Now push the Fragment that we want to pop
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Replacement Fragment should be added", replacementFragment)
@@ -458,9 +445,10 @@
         }
 
         // Now pop the Fragment
-        val popped = fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(replacementEntry, false)
         fragmentManager.executePendingTransactions()
-        assertTrue("FragmentNavigator should return true when popping a Fragment", popped)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
         assertEquals(
             "Fragment should be the primary navigation Fragment after pop",
             fragment, fragmentManager.primaryNavigationFragment
@@ -470,22 +458,19 @@
     @UiThreadTest
     @Test
     fun testDeepLinkPop() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
+        val secondEntry = createBackStackEntry(SECOND_FRAGMENT)
 
         // First push two Fragments as our 'deep link'
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        fragmentNavigator.navigate(listOf(entry, secondEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry)
 
         // Now push the Fragment that we want to pop
-        destination.id = THIRD_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
+        val thirdEntry = createBackStackEntry(THIRD_FRAGMENT)
+        fragmentNavigator.navigate(listOf(thirdEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry, thirdEntry)
         fragmentManager.executePendingTransactions()
         val replacementFragment = fragmentManager.findFragmentById(R.id.container)
         assertNotNull("Replacement Fragment should be added", replacementFragment)
@@ -499,7 +484,7 @@
         )
 
         // Now pop the Fragment
-        fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(thirdEntry, false)
         fragmentManager.executePendingTransactions()
         val fragment = fragmentManager.findFragmentById(R.id.container)
         assertEquals(
@@ -510,156 +495,19 @@
 
     @UiThreadTest
     @Test
-    fun testDeepLinkPopWithSaveState() {
-        var fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
-
-        // First push two Fragments as our 'deep link'
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-
-        // Now push the Fragment that we want to pop
-        destination.id = THIRD_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        fragmentManager.executePendingTransactions()
-        val replacementFragment = fragmentManager.findFragmentById(R.id.container)
-        assertNotNull("Replacement Fragment should be added", replacementFragment)
-        assertTrue(
-            "Replacement Fragment should be the correct type",
-            replacementFragment is EmptyFragment
-        )
-        assertEquals(
-            "Replacement Fragment should be the primary navigation Fragment",
-            replacementFragment, fragmentManager.primaryNavigationFragment
-        )
-
-        // Create a new FragmentNavigator, replacing the previous one
-        val savedState = fragmentNavigator.onSaveState() as Bundle
-        fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        fragmentNavigator.onRestoreState(savedState)
-
-        // Now pop the Fragment
-        fragmentNavigator.popBackStack()
-        fragmentManager.executePendingTransactions()
-        val fragment = fragmentManager.findFragmentById(R.id.container)
-        assertEquals(
-            "Fragment should be the primary navigation Fragment after pop",
-            fragment, fragmentManager.primaryNavigationFragment
-        )
-    }
-
-    @UiThreadTest
-    @Test
-    fun testNavigateThenPopAfterSaveState() {
-        var fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        val destination = fragmentNavigator.createDestination()
-        destination.id = INITIAL_FRAGMENT
-        destination.setClassName(EmptyFragment::class.java.name)
-
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        fragmentManager.executePendingTransactions()
-        var fragment = fragmentManager.findFragmentById(R.id.container)
-        assertNotNull("Fragment should be added", fragment)
-        assertEquals(
-            "Fragment should be the correct type",
-            EmptyFragment::class.java, fragment!!::class.java
-        )
-        assertEquals(
-            "Fragment should be the primary navigation Fragment",
-            fragment, fragmentManager.primaryNavigationFragment
-        )
-
-        // Now push a second fragment
-        destination.id = SECOND_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        fragmentManager.executePendingTransactions()
-        var replacementFragment = fragmentManager.findFragmentById(R.id.container)
-        assertNotNull("Replacement Fragment should be added", replacementFragment)
-        assertEquals(
-            "Replacement Fragment should be the correct type",
-            EmptyFragment::class.java, replacementFragment!!::class.java
-        )
-        assertEquals(
-            "Replacement Fragment should be the primary navigation Fragment",
-            replacementFragment, fragmentManager.primaryNavigationFragment
-        )
-
-        // Create a new FragmentNavigator, replacing the previous one
-        val savedState = fragmentNavigator.onSaveState() as Bundle
-        fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        fragmentNavigator.onRestoreState(savedState)
-
-        // Now push a third fragment after the state save
-        destination.id = THIRD_FRAGMENT
-        assertThat(fragmentNavigator.navigate(destination, null, null, null))
-            .isEqualTo(destination)
-        fragmentManager.executePendingTransactions()
-        replacementFragment = fragmentManager.findFragmentById(R.id.container)
-        assertNotNull("Replacement Fragment should be added", replacementFragment)
-        assertTrue(
-            "Replacement Fragment should be the correct type",
-            replacementFragment is EmptyFragment
-        )
-        assertEquals(
-            "Replacement Fragment should be the primary navigation Fragment",
-            replacementFragment, fragmentManager.primaryNavigationFragment
-        )
-
-        // Now pop the Fragment
-        fragmentNavigator.popBackStack()
-        fragmentManager.executePendingTransactions()
-        fragment = fragmentManager.findFragmentById(R.id.container)
-        assertEquals(
-            "Fragment should be the primary navigation Fragment after pop",
-            fragment, fragmentManager.primaryNavigationFragment
-        )
-    }
-
-    @UiThreadTest
-    @Test
     fun testMultipleNavigateFragmentTransactionsThenPop() {
-        val fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        val destination = fragmentNavigator.createDestination()
-        destination.setClassName(EmptyFragment::class.java.name)
-        val destination2 = fragmentNavigator.createDestination()
-        destination2.setClassName(Fragment::class.java.name)
+        val entry = createBackStackEntry()
+        val secondEntry = createBackStackEntry(SECOND_FRAGMENT, clazz = Fragment::class)
+        val thirdEntry = createBackStackEntry(THIRD_FRAGMENT)
 
         // Push 3 fragments without executing pending transactions.
-        destination.id = INITIAL_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
-        destination2.id = SECOND_FRAGMENT
-        fragmentNavigator.navigate(destination2, null, null, null)
-        destination.id = THIRD_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
+        fragmentNavigator.navigate(listOf(entry, secondEntry, thirdEntry), null, null)
 
         // Now pop the Fragment
-        val popped = fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(thirdEntry, false)
         fragmentManager.executePendingTransactions()
-        assertWithMessage("FragmentNavigator should return true when popping the third fragment")
-            .that(popped).isTrue()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, secondEntry)
         // We should ensure the fragment manager is on the proper fragment at the end
         assertWithMessage("FragmentManager back stack should have only SECOND_FRAGMENT")
             .that(fragmentManager.backStackEntryCount)
@@ -672,36 +520,176 @@
     @UiThreadTest
     @Test
     fun testMultiplePopFragmentTransactionsThenPop() {
-        val fragmentNavigator = FragmentNavigator(
-            emptyActivity,
-            fragmentManager, R.id.container
-        )
-        val destination = fragmentNavigator.createDestination()
-        destination.setClassName(EmptyFragment::class.java.name)
+        val entry = createBackStackEntry()
+        val secondEntry = createBackStackEntry(SECOND_FRAGMENT)
+        val thirdEntry = createBackStackEntry(THIRD_FRAGMENT)
+        val fourthEntry = createBackStackEntry(FOURTH_FRAGMENT)
 
         // Push 4 fragments
-        destination.id = INITIAL_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
-        destination.id = SECOND_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
-        destination.id = THIRD_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
-        destination.id = FOURTH_FRAGMENT
-        fragmentNavigator.navigate(destination, null, null, null)
+        fragmentNavigator.navigate(
+            listOf(entry, secondEntry, thirdEntry, fourthEntry),
+            null, null
+        )
         fragmentManager.executePendingTransactions()
 
         // Pop 2 fragments without executing pending transactions.
-        fragmentNavigator.popBackStack()
-        fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(thirdEntry, false)
 
-        val popped = fragmentNavigator.popBackStack()
+        fragmentNavigator.popBackStack(secondEntry, false)
         fragmentManager.executePendingTransactions()
-        assertTrue("FragmentNavigator should return true when popping the third fragment", popped)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreState() {
+        val entry = createBackStackEntry()
+
+        // First push an initial Fragment
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        fragmentManager.executePendingTransactions()
+        val fragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment)
+            .isNotNull()
+
+        // Now push the Fragment that we want to save
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT, SavedStateFragment::class)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
+        fragmentManager.executePendingTransactions()
+        val replacementFragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Replacement Fragment should be added")
+            .that(replacementFragment)
+            .isNotNull()
+        assertWithMessage("Replacement Fragment should be the correct type")
+            .that(replacementFragment)
+            .isInstanceOf(SavedStateFragment::class.java)
+        assertWithMessage("Replacement Fragment should be the primary navigation Fragment")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(replacementFragment)
+
+        // Save some state into the replacement fragment
+        (replacementFragment as SavedStateFragment).savedState = "test"
+
+        // Now save the Fragment
+        fragmentNavigator.popBackStack(replacementEntry, true)
+        fragmentManager.executePendingTransactions()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        assertWithMessage("Fragment should be the primary navigation Fragment after pop")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(fragment)
+
+        // And now restore the fragment
+        val restoredEntry = navigatorState.restoreBackStackEntry(replacementEntry)
+        fragmentNavigator.navigate(
+            listOf(restoredEntry),
+            NavOptions.Builder().setRestoreState(true).build(), null
+        )
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, restoredEntry).inOrder()
+        fragmentManager.executePendingTransactions()
+        val restoredFragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Restored Fragment should be added")
+            .that(restoredFragment)
+            .isNotNull()
+        assertWithMessage("Restored Fragment should be the correct type")
+            .that(restoredFragment)
+            .isInstanceOf(SavedStateFragment::class.java)
+        assertWithMessage("Restored Fragment should be the primary navigation Fragment")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(restoredFragment)
+
+        assertWithMessage("Restored Fragment should have its state restored")
+            .that((restoredFragment as SavedStateFragment).savedState)
+            .isEqualTo("test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreStateAfterSaveState() {
+        val entry = createBackStackEntry()
+
+        // First push an initial Fragment
+        fragmentNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        fragmentManager.executePendingTransactions()
+        val fragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Fragment should be added")
+            .that(fragment)
+            .isNotNull()
+
+        // Now push the Fragment that we want to save
+        val replacementEntry = createBackStackEntry(SECOND_FRAGMENT, SavedStateFragment::class)
+        fragmentNavigator.navigate(listOf(replacementEntry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, replacementEntry).inOrder()
+        fragmentManager.executePendingTransactions()
+        val replacementFragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Replacement Fragment should be added")
+            .that(replacementFragment)
+            .isNotNull()
+        assertWithMessage("Replacement Fragment should be the correct type")
+            .that(replacementFragment)
+            .isInstanceOf(SavedStateFragment::class.java)
+        assertWithMessage("Replacement Fragment should be the primary navigation Fragment")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(replacementFragment)
+
+        // Save some state into the replacement fragment
+        (replacementFragment as SavedStateFragment).savedState = "test"
+
+        // Now save the Fragment
+        fragmentNavigator.popBackStack(replacementEntry, true)
+        fragmentManager.executePendingTransactions()
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        assertWithMessage("Fragment should be the primary navigation Fragment after pop")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(fragment)
+
+        // Create a new FragmentNavigator, replacing the previous one
+        val savedState = fragmentNavigator.onSaveState() as Bundle
+        fragmentNavigator = FragmentNavigator(
+            emptyActivity,
+            fragmentManager, R.id.container
+        )
+        fragmentNavigator.onAttach(navigatorState)
+        fragmentNavigator.onRestoreState(savedState)
+
+        // And now restore the fragment
+        val restoredEntry = navigatorState.restoreBackStackEntry(replacementEntry)
+        fragmentNavigator.navigate(
+            listOf(restoredEntry),
+            NavOptions.Builder().setRestoreState(true).build(), null
+        )
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry, restoredEntry).inOrder()
+        fragmentManager.executePendingTransactions()
+        val restoredFragment = fragmentManager.findFragmentById(R.id.container)
+        assertWithMessage("Restored Fragment should be added")
+            .that(restoredFragment)
+            .isNotNull()
+        assertWithMessage("Restored Fragment should be the correct type")
+            .that(restoredFragment)
+            .isInstanceOf(SavedStateFragment::class.java)
+        assertWithMessage("Restored Fragment should be the primary navigation Fragment")
+            .that(fragmentManager.primaryNavigationFragment)
+            .isSameInstanceAs(restoredFragment)
+
+        assertWithMessage("Restored Fragment should have its state restored")
+            .that((restoredFragment as SavedStateFragment).savedState)
+            .isEqualTo("test")
     }
 
     @Test
     fun testToString() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
         val destination = fragmentNavigator.createDestination().apply {
             id = INITIAL_FRAGMENT
             setClassName(EmptyFragment::class.java.name)
@@ -714,7 +702,6 @@
 
     @Test
     fun testToStringNoClassName() {
-        val fragmentNavigator = FragmentNavigator(emptyActivity, fragmentManager, R.id.container)
         val destination = fragmentNavigator.createDestination().apply {
             id = INITIAL_FRAGMENT
             label = TEST_LABEL
@@ -723,6 +710,17 @@
             "class=null"
         assertThat(destination.toString()).isEqualTo(expected)
     }
+
+    private fun createBackStackEntry(
+        destId: Int = INITIAL_FRAGMENT,
+        clazz: KClass<out Fragment> = EmptyFragment::class
+    ): NavBackStackEntry {
+        val destination = fragmentNavigator.createDestination().apply {
+            id = destId
+            setClassName(clazz.java.name)
+        }
+        return navigatorState.createBackStackEntry(destination, null)
+    }
 }
 
 class EmptyActivity : FragmentActivity() {
@@ -732,6 +730,20 @@
     }
 }
 
+class SavedStateFragment : Fragment() {
+    var savedState: String? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        savedState = savedInstanceState?.getString("savedState")
+    }
+
+    override fun onSaveInstanceState(outState: Bundle) {
+        super.onSaveInstanceState(outState)
+        outState.putString("savedState", savedState)
+    }
+}
+
 class NonEmptyConstructorFragment(val test: String) : Fragment()
 
 class NonEmptyFragmentFactory : FragmentFactory() {
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 136e748..f64bdbf 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
@@ -29,6 +29,7 @@
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
+import androidx.navigation.NavigatorState
 import androidx.navigation.NavigatorProvider
 import androidx.navigation.fragment.DialogFragmentNavigator.Destination
 
@@ -121,7 +122,8 @@
         }
     }
 
-    init {
+    override fun onAttach(state: NavigatorState) {
+        super.onAttach(state)
         fragmentManager.addFragmentOnAttachListener { _, childFragment ->
             val needToAddObserver = restoredTagsAwaitingAttach.remove(childFragment.tag)
             if (needToAddObserver) {
@@ -137,7 +139,7 @@
     public open class Destination
     /**
      * Construct a new fragment destination. This destination is not valid until you set the
-     * Fragment via [.setClassName].
+     * Fragment via [setClassName].
      *
      * @param fragmentNavigator The [DialogFragmentNavigator] which this destination will be
      *                          associated with. Generally retrieved via a [NavController]'s
@@ -159,7 +161,7 @@
 
         /**
          * Construct a new fragment destination. This destination is not valid until you set the
-         * Fragment via [.setClassName].
+         * Fragment via [setClassName].
          *
          * @param navigatorProvider The [NavController] which this destination
          * will be associated with.
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt
index 024652b..7e575fc 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt
@@ -23,8 +23,10 @@
 import androidx.annotation.CallSuper
 import androidx.annotation.IdRes
 import androidx.core.content.res.use
+import androidx.core.os.bundleOf
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
@@ -50,7 +52,7 @@
     private val fragmentManager: FragmentManager,
     private val containerId: Int
 ) : Navigator<Destination>() {
-    private val backStack = ArrayDeque<Int>()
+    private val savedIds = mutableSetOf<String>()
 
     /**
      * {@inheritDoc}
@@ -64,22 +66,41 @@
      * asynchronously, so the newly visible Fragment from the back stack
      * is not instantly available after this call completes.
      */
-    public override fun popBackStack(): Boolean {
-        if (backStack.isEmpty()) {
-            return false
-        }
+    override fun popBackStack(popUpTo: NavBackStackEntry, savedState: Boolean) {
         if (fragmentManager.isStateSaved) {
             Log.i(
                 TAG, "Ignoring popBackStack() call: FragmentManager has already saved its state"
             )
-            return false
+            return
         }
-        fragmentManager.popBackStack(
-            generateBackStackName(backStack.size, backStack.last()),
-            FragmentManager.POP_BACK_STACK_INCLUSIVE
-        )
-        backStack.removeLast()
-        return true
+        if (savedState) {
+            val beforePopList = state.backStack.value
+            val initialEntry = beforePopList.first()
+            // Get the set of entries that are going to be popped
+            val poppedList = beforePopList.subList(
+                beforePopList.indexOf(popUpTo),
+                beforePopList.size
+            )
+            // Now go through the list in reversed order (i.e., started from the most added)
+            // and save the back stack state of each.
+            for (entry in poppedList.reversed()) {
+                if (entry == initialEntry) {
+                    Log.i(
+                        TAG,
+                        "FragmentManager cannot save the state of the initial destination $entry"
+                    )
+                } else {
+                    fragmentManager.saveBackStack(entry.id)
+                    savedIds += entry.id
+                }
+            }
+        } else {
+            fragmentManager.popBackStack(
+                popUpTo.id,
+                FragmentManager.POP_BACK_STACK_INCLUSIVE
+            )
+        }
+        state.pop(popUpTo, savedState)
     }
 
     public override fun createDestination(): Destination {
@@ -126,18 +147,42 @@
      * asynchronously, so the new Fragment is not instantly available
      * after this call completes.
      */
-    public override fun navigate(
-        destination: Destination,
-        args: Bundle?,
+    override fun navigate(
+        entries: List<NavBackStackEntry>,
         navOptions: NavOptions?,
         navigatorExtras: Navigator.Extras?
-    ): NavDestination? {
+    ) {
         if (fragmentManager.isStateSaved) {
             Log.i(
                 TAG, "Ignoring navigate() call: FragmentManager has already saved its state"
             )
-            return null
+            return
         }
+        for (entry in entries) {
+            navigate(entry, navOptions, navigatorExtras)
+        }
+    }
+
+    private fun navigate(
+        entry: NavBackStackEntry,
+        navOptions: NavOptions?,
+        navigatorExtras: Navigator.Extras?
+    ) {
+        val backStack = state.backStack.value
+        val initialNavigation = backStack.isEmpty()
+        val restoreState = (
+            navOptions != null && !initialNavigation &&
+                navOptions.shouldRestoreState() &&
+                savedIds.remove(entry.id)
+            )
+        if (restoreState) {
+            // Restore back stack does all the work to restore the entry
+            fragmentManager.restoreBackStack(entry.id)
+            state.add(entry)
+            return
+        }
+        val destination = entry.destination as Destination
+        val args = entry.arguments
         var className = destination.className
         if (className[0] == '.') {
             className = context.packageName + className
@@ -159,15 +204,13 @@
         ft.replace(containerId, frag)
         ft.setPrimaryNavigationFragment(frag)
         @IdRes val destId = destination.id
-        val initialNavigation = backStack.isEmpty()
         // TODO Build first class singleTop behavior for fragments
         val isSingleTopReplacement = (
             navOptions != null && !initialNavigation &&
                 navOptions.shouldLaunchSingleTop() &&
-                backStack.last() == destId
+                backStack.last().destination.id == destId
             )
-        val isAdded: Boolean
-        isAdded = when {
+        val isAdded = when {
             initialNavigation -> {
                 true
             }
@@ -179,15 +222,15 @@
                     // remove it from the back stack and put our replacement
                     // on the back stack in its place
                     fragmentManager.popBackStack(
-                        generateBackStackName(backStack.size, backStack.last()),
+                        entry.id,
                         FragmentManager.POP_BACK_STACK_INCLUSIVE
                     )
-                    ft.addToBackStack(generateBackStackName(backStack.size, destId))
+                    ft.addToBackStack(entry.id)
                 }
                 false
             }
             else -> {
-                ft.addToBackStack(generateBackStackName(backStack.size + 1, destId))
+                ft.addToBackStack(entry.id)
                 true
             }
         }
@@ -199,35 +242,26 @@
         ft.setReorderingAllowed(true)
         ft.commit()
         // The commit succeeded, update our view of the world
-        return if (isAdded) {
-            backStack.add(destId)
-            destination
-        } else {
-            null
+        if (isAdded) {
+            state.add(entry)
         }
     }
 
     public override fun onSaveState(): Bundle? {
-        val b = Bundle()
-        val backStack = backStack.toIntArray()
-        b.putIntArray(KEY_BACK_STACK_IDS, backStack)
-        return b
+        if (savedIds.isEmpty()) {
+            return null
+        }
+        return bundleOf(KEY_SAVED_IDS to ArrayList(savedIds))
     }
 
     public override fun onRestoreState(savedState: Bundle) {
-        val backStack = savedState.getIntArray(KEY_BACK_STACK_IDS)
-        if (backStack != null) {
-            this.backStack.clear()
-            for (destId in backStack) {
-                this.backStack.add(destId)
-            }
+        val savedIds = savedState.getStringArrayList(KEY_SAVED_IDS)
+        if (savedIds != null) {
+            this.savedIds.clear()
+            this.savedIds += savedIds
         }
     }
 
-    private fun generateBackStackName(backStackIndex: Int, destId: Int): String {
-        return "$backStackIndex-$destId"
-    }
-
     /**
      * NavDestination specific to [FragmentNavigator]
      */
@@ -235,7 +269,7 @@
     public open class Destination
     /**
      * Construct a new fragment destination. This destination is not valid until you set the
-     * Fragment via [.setClassName].
+     * Fragment via [setClassName].
      *
      * @param fragmentNavigator The [FragmentNavigator] which this destination
      * will be associated with. Generally retrieved via a
@@ -247,7 +281,7 @@
 
         /**
          * Construct a new fragment destination. This destination is not valid until you set the
-         * Fragment via [.setClassName].
+         * Fragment via [setClassName].
          *
          * @param navigatorProvider The [NavController] which this destination
          * will be associated with.
@@ -368,6 +402,6 @@
 
     private companion object {
         private const val TAG = "FragmentNavigator"
-        private const val KEY_BACK_STACK_IDS = "androidx-nav-fragment:navigator:backStackIds"
+        private const val KEY_SAVED_IDS = "androidx-nav-fragment:navigator:savedIds"
     }
 }
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
index c4ccfb9..82c77bb 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
@@ -85,11 +85,11 @@
 
     /**
      * Returns the [navigation controller][NavController] for this navigation host.
-     * This method will return null until this host fragment's [.onCreate]
+     * This method will return null until this host fragment's [onCreate]
      * has been called and it has had an opportunity to restore from a previous instance state.
      *
      * @return this host's navigation controller
-     * @throws IllegalStateException if called before [.onCreate]
+     * @throws IllegalStateException if called before [onCreate]
      */
     final override val navController: NavController
         get() {
@@ -175,11 +175,11 @@
      *
      * By default, this adds a [DialogFragmentNavigator] and [FragmentNavigator].
      *
-     * This is only called once in [.onCreate] and should not be called directly by
+     * This is only called once in [onCreate] and should not be called directly by
      * subclasses.
      *
      * @param navHostController The newly created [NavHostController] that will be
-     * returned by [.getNavController] after
+     * returned by [getNavController] after
      */
     @Suppress("DEPRECATION")
     @CallSuper
@@ -188,13 +188,13 @@
     }
 
     /**
-     * Callback for when the [NavController][.getNavController] is created. If you
+     * Callback for when the [NavController][getNavController] is created. If you
      * support any custom destination types, their [Navigator] should be added here to
      * ensure it is available before the navigation graph is inflated / set.
      *
      * By default, this adds a [DialogFragmentNavigator] and [FragmentNavigator].
      *
-     * This is only called once in [.onCreate] and should not be called directly by
+     * This is only called once in [onCreate] and should not be called directly by
      * subclasses.
      *
      * @param navController The newly created [NavController].
@@ -224,7 +224,7 @@
      * Create the FragmentNavigator that this NavHostFragment will use. By default, this uses
      * [FragmentNavigator], which replaces the entire contents of the NavHostFragment.
      *
-     * This is only called once in [.onCreate] and should not be called directly by
+     * This is only called once in [onCreate] and should not be called directly by
      * subclasses.
      * @return a new instance of a FragmentNavigator
      */
diff --git a/navigation/navigation-runtime-ktx/lint-baseline.xml b/navigation/navigation-runtime-ktx/lint-baseline.xml
deleted file mode 100644
index cb22724..0000000
--- a/navigation/navigation-runtime-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="IllegalExperimentalApiUsage"
-        message="`Experimental`/`OptIn` APIs should only be used from within the same library or libraries within the same requireSameVersion group"
-        errorLine1="public val NavController.currentBackStackEntryFlow: Flow&lt;NavBackStackEntry> get() = callbackFlow {"
-        errorLine2="                                                                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/NavController.kt"
-            line="40"
-            column="85"/>
-    </issue>
-
-    <issue
-        id="IllegalExperimentalApiUsage"
-        message="`Experimental`/`OptIn` APIs should only be used from within the same library or libraries within the same requireSameVersion group"
-        errorLine1="    awaitClose {"
-        errorLine2="    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/navigation/NavController.kt"
-            line="46"
-            column="5"/>
-    </issue>
-
-</issues>
diff --git a/navigation/navigation-runtime-truth/build.gradle b/navigation/navigation-runtime-truth/build.gradle
index f9798fd..dca17f9 100644
--- a/navigation/navigation-runtime-truth/build.gradle
+++ b/navigation/navigation-runtime-truth/build.gradle
@@ -29,12 +29,12 @@
 }
 
 dependencies {
-    api(project(":navigation:navigation-runtime-ktx"))
+    api(project(":navigation:navigation-runtime"))
     api(TRUTH)
     api(KOTLIN_STDLIB)
     androidTestImplementation(project(":internal-testutils-truth"))
     androidTestImplementation(project(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
     androidTestImplementation(TRUTH)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/navigation/navigation-runtime-truth/lint-baseline.xml b/navigation/navigation-runtime-truth/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-runtime-truth/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-runtime/api/current.ignore b/navigation/navigation-runtime/api/current.ignore
new file mode 100644
index 0000000..cc81f5f
--- /dev/null
+++ b/navigation/navigation-runtime/api/current.ignore
@@ -0,0 +1,7 @@
+// Baseline format: 1.0
+RemovedClass: androidx.navigation.NavBackStackEntry:
+    Removed class androidx.navigation.NavBackStackEntry
+
+
+RemovedMethod: androidx.navigation.ActivityNavigator#popBackStack():
+    Removed method androidx.navigation.ActivityNavigator.popBackStack()
diff --git a/navigation/navigation-runtime/api/current.txt b/navigation/navigation-runtime/api/current.txt
index eb3162c..219326d 100644
--- a/navigation/navigation-runtime/api/current.txt
+++ b/navigation/navigation-runtime/api/current.txt
@@ -14,7 +14,6 @@
     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);
-    method public boolean popBackStack();
     field public static final androidx.navigation.ActivityNavigator.Companion Companion;
   }
 
@@ -87,25 +86,14 @@
     method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
   }
 
-  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 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 androidx.lifecycle.SavedStateHandle savedStateHandle;
-  }
-
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
     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();
@@ -123,12 +111,19 @@
     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 public void navigate(androidx.navigation.NavDirections directions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public boolean navigateUp();
-    method public boolean popBackStack();
-    method public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
+    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();
@@ -137,6 +132,7 @@
     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;
@@ -155,13 +151,15 @@
 
   public final class NavControllerKt {
     method 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 kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow(androidx.navigation.NavController);
+    method public static 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);
@@ -169,6 +167,8 @@
     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);
   }
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
index 9ba0a28..308daa9 100644
--- a/navigation/navigation-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
@@ -15,7 +15,6 @@
     method public androidx.navigation.ActivityNavigator.Destination createDestination();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final android.content.Context getContext();
     method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
-    method public boolean popBackStack();
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final android.content.Context context;
     field public static final androidx.navigation.ActivityNavigator.Companion Companion;
   }
@@ -89,38 +88,18 @@
     method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
   }
 
-  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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.util.UUID getId();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.lifecycle.Lifecycle.State getMaxLifecycle();
-    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
-    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
-    method public androidx.lifecycle.ViewModelStore getViewModelStore();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event event);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void replaceArguments(android.os.Bundle? newArgs);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void saveState(android.os.Bundle outBundle);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setArguments(android.os.Bundle? p);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setMaxLifecycle(androidx.lifecycle.Lifecycle.State maxState);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void updateState();
-    property public final android.os.Bundle? arguments;
-    property public final androidx.navigation.NavDestination destination;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final java.util.UUID id;
-    property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.lifecycle.Lifecycle.State maxLifecycle;
-    property public final androidx.lifecycle.SavedStateHandle savedStateHandle;
-  }
-
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
     method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void enableOnBackPressed(boolean enabled);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.navigation.NavDestination? findDestination(@IdRes int destinationId);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.navigation.NavDestination? findDestination(String destinationRoute);
     method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
+    method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final android.content.Context getContext();
     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();
@@ -138,13 +117,19 @@
     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 public void navigate(androidx.navigation.NavDirections directions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public boolean navigateUp();
-    method public boolean popBackStack();
-    method public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final boolean popBackStackInternal(@IdRes int destinationId, boolean inclusive);
+    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();
@@ -157,6 +142,7 @@
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setViewModelStore(androidx.lifecycle.ViewModelStore viewModelStore);
     property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final android.content.Context context;
     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;
@@ -179,13 +165,15 @@
 
   public final class NavControllerKt {
     method 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 kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow(androidx.navigation.NavController);
+    method public static 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);
@@ -193,6 +181,8 @@
     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);
   }
diff --git a/navigation/navigation-runtime/api/restricted_current.ignore b/navigation/navigation-runtime/api/restricted_current.ignore
new file mode 100644
index 0000000..cc81f5f
--- /dev/null
+++ b/navigation/navigation-runtime/api/restricted_current.ignore
@@ -0,0 +1,7 @@
+// Baseline format: 1.0
+RemovedClass: androidx.navigation.NavBackStackEntry:
+    Removed class androidx.navigation.NavBackStackEntry
+
+
+RemovedMethod: androidx.navigation.ActivityNavigator#popBackStack():
+    Removed method androidx.navigation.ActivityNavigator.popBackStack()
diff --git a/navigation/navigation-runtime/api/restricted_current.txt b/navigation/navigation-runtime/api/restricted_current.txt
index eb3162c..219326d 100644
--- a/navigation/navigation-runtime/api/restricted_current.txt
+++ b/navigation/navigation-runtime/api/restricted_current.txt
@@ -14,7 +14,6 @@
     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);
-    method public boolean popBackStack();
     field public static final androidx.navigation.ActivityNavigator.Companion Companion;
   }
 
@@ -87,25 +86,14 @@
     method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
   }
 
-  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 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 androidx.lifecycle.SavedStateHandle savedStateHandle;
-  }
-
   public class NavController {
     ctor public NavController(android.content.Context context);
     method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
     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();
@@ -123,12 +111,19 @@
     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 public void navigate(androidx.navigation.NavDirections directions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
-    method public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
-    method public boolean navigateUp();
-    method public boolean popBackStack();
-    method public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
+    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();
@@ -137,6 +132,7 @@
     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;
@@ -155,13 +151,15 @@
 
   public final class NavControllerKt {
     method 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 kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow(androidx.navigation.NavController);
+    method public static 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);
@@ -169,6 +167,8 @@
     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);
   }
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index 92ad242..9ac58b4 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -32,8 +32,6 @@
     api("androidx.activity:activity-ktx:1.2.2")
     api("androidx.lifecycle:lifecycle-runtime-ktx:2.3.1")
     api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
-    api("androidx.savedstate:savedstate:1.0.0")
-    api("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1")
 
     api(KOTLIN_STDLIB)
     androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
@@ -46,8 +44,8 @@
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(ESPRESSO_INTENTS)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(KOTLIN_STDLIB)
 }
 
diff --git a/navigation/navigation-runtime/lint-baseline.xml b/navigation/navigation-runtime/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-runtime/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
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 33716e8..bcd0b19 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
@@ -18,10 +18,13 @@
 
 import android.app.Application
 import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.get
+import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.navigation.test.R
 import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ApplicationProvider
@@ -218,26 +221,52 @@
     @UiThreadTest
     @Test
     fun testGetSavedStateHandle() {
-        val entry = NavBackStackEntry(
+        val entry = NavBackStackEntry.create(
             ApplicationProvider.getApplicationContext(),
-            NavDestination(TestNavigator()), null, null, NavControllerViewModel()
+            NavDestination(TestNavigator()), null, TestLifecycleOwner(), NavControllerViewModel()
         )
+        entry.maxLifecycle = Lifecycle.State.CREATED
 
         assertThat(entry.savedStateHandle).isNotNull()
     }
 
     @UiThreadTest
     @Test
-    fun testGetSavedStateHandleNoViewModelSet() {
-        val entry = NavBackStackEntry(
+    fun testGetSavedStateHandleInitializedLifecycle() {
+        val entry = NavBackStackEntry.create(
             ApplicationProvider.getApplicationContext(),
-            NavDestination(TestNavigator()), null, null, null
+            NavDestination(TestNavigator()), viewModelStoreProvider = NavControllerViewModel()
         )
 
         try {
             entry.savedStateHandle
             fail(
                 "Attempting to get SavedStateHandle for back stack entry without " +
+                    "moving the Lifecycle to CREATED set should throw IllegalStateException"
+            )
+        } catch (e: IllegalStateException) {
+            assertThat(e)
+                .hasMessageThat().contains(
+                    "You cannot access the NavBackStackEntry's SavedStateHandle until it is " +
+                        "added to the NavController's back stack (i.e., the Lifecycle of the " +
+                        "NavBackStackEntry reaches the CREATED state)."
+                )
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun testGetSavedStateHandleNoViewModelSet() {
+        val entry = NavBackStackEntry.create(
+            ApplicationProvider.getApplicationContext(),
+            NavDestination(TestNavigator())
+        )
+        entry.maxLifecycle = Lifecycle.State.CREATED
+
+        try {
+            entry.savedStateHandle
+            fail(
+                "Attempting to get SavedStateHandle for back stack entry without " +
                     "navControllerViewModel set should throw IllegalStateException"
             )
         } catch (e: IllegalStateException) {
@@ -249,14 +278,122 @@
         }
     }
 
+    @UiThreadTest
+    @Test
+    fun testOnClearedWhenHostCleared() {
+        val hostStore = ViewModelStore()
+        val navController = createNavController()
+        navController.setViewModelStore(hostStore)
+        val navGraph = navController.navigatorProvider.navigation(
+            id = 1,
+            startDestination = R.id.start_test
+        ) {
+            test(R.id.start_test)
+        }
+        navController.setGraph(navGraph, null)
+
+        val owner = navController.getViewModelStoreOwner(navGraph.id)
+        assertThat(owner).isNotNull()
+        val viewModel: TestAndroidViewModel = ViewModelProvider(owner).get()
+        assertThat(viewModel.isCleared).isFalse()
+
+        hostStore.clear()
+
+        assertWithMessage("ViewModel should be cleared when the host is cleared")
+            .that(viewModel.isCleared)
+            .isTrue()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testOnClearedWhenPopped() {
+        val hostStore = ViewModelStore()
+        val navController = createNavController()
+        navController.setViewModelStore(hostStore)
+        val navGraph = navController.navigatorProvider.navigation(
+            id = 1,
+            startDestination = R.id.start_test
+        ) {
+            test(R.id.start_test)
+        }
+        navController.setGraph(navGraph, null)
+
+        val owner = navController.getBackStackEntry(R.id.start_test)
+        assertThat(owner).isNotNull()
+        val viewModel: TestAndroidViewModel = ViewModelProvider(owner).get()
+        assertThat(viewModel.isCleared).isFalse()
+
+        // Navigate to a new instance of start_test, popping the previous one
+        navController.navigate(
+            R.id.start_test,
+            null,
+            navOptions {
+                popUpTo(R.id.start_test) {
+                    inclusive = true
+                }
+            }
+        )
+        assertWithMessage("ViewModel should be cleared when the destination is popped")
+            .that(viewModel.isCleared)
+            .isTrue()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testOnClearedWhenHostClearedAfterSaveState() {
+        val hostStore = ViewModelStore()
+        val navController = createNavController()
+        navController.setViewModelStore(hostStore)
+        val navGraph = navController.navigatorProvider.navigation(
+            id = 1,
+            startDestination = R.id.start_test
+        ) {
+            test(R.id.start_test)
+        }
+        navController.setGraph(navGraph, null)
+
+        val owner = navController.getBackStackEntry(R.id.start_test)
+        assertThat(owner).isNotNull()
+        val viewModel: TestAndroidViewModel = ViewModelProvider(owner).get()
+        assertThat(viewModel.isCleared).isFalse()
+
+        // Navigate to a new instance of start_test, popping the previous one and saving state
+        navController.navigate(
+            R.id.start_test,
+            null,
+            navOptions {
+                popUpTo(R.id.start_test) {
+                    inclusive = true
+                    saveState = true
+                }
+            }
+        )
+        assertWithMessage("ViewModel should be saved when the destination is saved")
+            .that(viewModel.isCleared)
+            .isFalse()
+
+        hostStore.clear()
+
+        assertWithMessage("ViewModel should be cleared when the host is cleared")
+            .that(viewModel.isCleared)
+            .isTrue()
+    }
+
     private fun createNavController(): NavController {
-        val navController = NavController(ApplicationProvider.getApplicationContext())
+        val navController = NavHostController(ApplicationProvider.getApplicationContext())
+        navController.setLifecycleOwner(TestLifecycleOwner())
         val navigator = TestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         return navController
     }
 }
 
-class TestAndroidViewModel(application: Application) : AndroidViewModel(application)
+internal class TestAndroidViewModel(application: Application) : AndroidViewModel(application) {
+    var isCleared = false
+
+    override fun onCleared() {
+        isCleared = true
+    }
+}
 
 class TestSavedStateViewModel(val savedStateHandle: SavedStateHandle) : ViewModel()
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
new file mode 100644
index 0000000..654ffd9
--- /dev/null
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerRouteTest.kt
@@ -0,0 +1,1338 @@
+/*
+ * 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.navigation
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.os.Parcel
+import androidx.activity.OnBackPressedDispatcher
+import androidx.activity.addCallback
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.testing.TestLifecycleOwner
+import androidx.navigation.NavDestination.Companion.createRoute
+import androidx.navigation.test.R
+import androidx.test.annotation.UiThreadTest
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.espresso.intent.Intents
+import androidx.test.espresso.intent.Intents.intended
+import androidx.test.espresso.intent.matcher.BundleMatchers
+import androidx.test.espresso.intent.matcher.IntentMatchers.hasAction
+import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
+import androidx.test.espresso.intent.matcher.IntentMatchers.hasData
+import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra
+import androidx.test.espresso.intent.matcher.IntentMatchers.toPackage
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.ext.truth.os.BundleSubject.assertThat
+import androidx.test.filters.LargeTest
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.testutils.TestNavigator
+import androidx.testutils.test
+import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.CoreMatchers.not
+import org.hamcrest.Matchers
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyString
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class NavControllerRouteTest {
+
+    val nav_simple_route_graph =
+        createNavController().createGraph(route = "nav_root", startDestination = "start_test") {
+            test("start_test")
+            test("start_test_with_default_arg") {
+                argument("defaultArg") { defaultValue = true }
+            }
+            test("second_test") {
+                argument("arg2") { type = NavType.StringType }
+                argument("defaultArg") {
+                    type = NavType.StringType
+                    defaultValue = "defaultValue"
+                }
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "type/test"
+                }
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test/{arg1}/{arg2}"
+                }
+            }
+        }
+
+    val nav_start_destination_route_graph =
+        createNavController().createGraph(route = "graph", startDestination = "start_test") {
+            test("start_test") {
+                argument("test") {
+                    type = NavType.StringType
+                    defaultValue = "@null"
+                }
+            }
+        }
+
+    val nav_nested_start_destination_route_graph =
+        createNavController().createGraph(route = "graph", startDestination = "nested") {
+            navigation(route = "nested", startDestination = "nested_test") {
+                test("nested_test")
+                test("nested_second_test")
+            }
+            test("second_test")
+        }
+
+    val nav_deeplink_route_graph =
+        createNavController().createGraph(route = "nav_root", startDestination = "first_test") {
+            test("first_test") {
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "*/*"
+                }
+            }
+            test("second_test") {
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "image/*"
+                }
+            }
+            test("third_test") {
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "*/test"
+                }
+            }
+            test("forth_test") {
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "type/test"
+                }
+            }
+        }
+
+    val nav_multiple_navigation_route_graph =
+        createNavController().createGraph(
+            route = "nav_multi_module_base", startDestination = "simple_child_start"
+        ) {
+            navigation(route = "simple_child_start", startDestination = "simple_child_start_test") {
+                test("simple_child_start_test")
+                test("simple_child_second_test")
+            }
+            navigation(
+                route = "deep_link_child_start", startDestination = "deep_link_child_start_test"
+            ) {
+                test("deep_link_child_start_test")
+                test("deep_link_child_second_test") {
+                    deepLink { uriPattern = "android-app://androidx.navigation.test/test" }
+                }
+                navigation(
+                    route = "deep_link_child_second",
+                    startDestination = "deep_link_grandchild_start_test"
+                ) {
+                    test("deep_link_grandchild_start_test") {
+                        deepLink {
+                            uriPattern = "android-app://androidx.navigation.test/grand_child_test"
+                        }
+                    }
+                    test("deep_link_child_second_test") {
+                        deepLink { uriPattern = "android-app://androidx.navigation.test/test" }
+                    }
+                }
+            }
+        }
+
+    companion object {
+        private const val UNKNOWN_DESTINATION_ID = -1
+        private const val TEST_ARG = "test"
+        private const val TEST_ARG_VALUE = "value"
+        private const val TEST_OVERRIDDEN_VALUE_ARG = "test_overridden_value"
+        private const val TEST_OVERRIDDEN_VALUE_ARG_VALUE = "override"
+    }
+
+    @UiThreadTest
+    @Test
+    fun testGetCurrentBackStackEntry() {
+        val navController = createNavController()
+        navController.graph = nav_start_destination_route_graph
+        assertThat(navController.currentBackStackEntry?.destination?.route).isEqualTo("start_test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testGetPreviousBackStackEntry() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        navController.navigate("second_test")
+        assertThat(navController.previousBackStackEntry?.destination?.route).isEqualTo("start_test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testStartDestination() {
+        val navController = createNavController()
+        navController.graph = nav_start_destination_route_graph
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetGraphTwice() {
+        val navController = createNavController()
+        navController.graph = nav_start_destination_route_graph
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("start_test")
+        assertThat(navigator.backStack.size)
+            .isEqualTo(1)
+
+        // Now set a new graph, overriding the first
+        navController.graph = nav_nested_start_destination_route_graph
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("nested_test")
+        assertThat(navigator.backStack.size)
+            .isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testStartDestinationWithArgs() {
+        val navController = createNavController()
+        val args = Bundle().apply {
+            putString(TEST_ARG, TEST_ARG_VALUE)
+        }
+        navController.setGraph(nav_simple_route_graph, args)
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val foundArgs = navigator.current.arguments
+        assertThat(foundArgs).isNotNull()
+        assertThat(foundArgs?.getString(TEST_ARG)).isEqualTo(TEST_ARG_VALUE)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testStartDestinationWithArgsProgrammatic() {
+        val navController = createNavController()
+        val args = Bundle().apply {
+            putString(TEST_ARG, TEST_ARG_VALUE)
+        }
+
+        val navGraph = navController.navigatorProvider.navigation(
+            route = "graph", startDestination = "start"
+        ) {
+            test("start")
+        }
+        navController.setGraph(navGraph, args)
+        val navigator = navController.navigatorProvider[TestNavigator::class]
+        assertThat(navController.currentDestination?.route).isEqualTo("start")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val foundArgs = navigator.current.arguments
+        assertThat(foundArgs).isNotNull()
+        assertThat(foundArgs?.getString(TEST_ARG)).isEqualTo(TEST_ARG_VALUE)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNestedStartDestination() {
+        val navController = createNavController()
+        navController.graph = nav_nested_start_destination_route_graph
+        assertThat(navController.currentDestination?.route).isEqualTo("nested_test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetGraph() {
+        val navController = createNavController()
+
+        navController.graph = nav_start_destination_route_graph
+        assertThat(navController.graph).isNotNull()
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetViewModelStoreOwnerAfterGraphSet() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        val navGraph = navController.navigatorProvider.navigation(
+            route = "graph", startDestination = "start"
+        ) {
+            test("start")
+        }
+        navController.setGraph(navGraph, null)
+
+        try {
+            navController.setViewModelStore(ViewModelStore())
+        } catch (e: IllegalStateException) {
+            assertThat(e).hasMessageThat().contains(
+                "ViewModelStore should be set before setGraph call"
+            )
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetSameViewModelStoreOwnerAfterGraphSet() {
+        val navController = createNavController()
+        val viewModelStore = ViewModelStore()
+        navController.setViewModelStore(viewModelStore)
+        val navGraph = navController.navigatorProvider.navigation(
+            route = "graph",
+            startDestination = "start"
+        ) {
+            test("start")
+        }
+        navController.setGraph(navGraph, null)
+
+        navController.setViewModelStore(viewModelStore)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigate() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test")
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLink() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        val intent = navigator.current.arguments?.getParcelable<Intent>(
+            NavController.KEY_DEEP_LINK_INTENT
+        )
+        assertThat(intent?.data).isEqualTo(deepLink)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkDefaultArgs() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(deepLink)
+
+        val destination = navController.currentDestination
+        assertThat(destination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        assertThat(destination?.arguments?.get("defaultArg")?.defaultValue.toString())
+            .isEqualTo("defaultValue")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkActionDifferentURI() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = NavDeepLinkRequest(Uri.parse("invalidDeepLink.com"), "test.action", null)
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkMimeTypeDifferentUri() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = NavDeepLinkRequest(Uri.parse("invalidDeepLink.com"), null, "type/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkMimeType() {
+        val navController = createNavController()
+        navController.graph = nav_deeplink_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val mimeType = "type/test"
+        val deepLink = NavDeepLinkRequest(null, null, mimeType)
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("forth_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        val intent = navigator.current.arguments?.getParcelable<Intent>(
+            NavController.KEY_DEEP_LINK_INTENT
+        )
+        assertThat(intent?.type).isEqualTo(mimeType)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkMimeTypeWildCard() {
+        val navController = createNavController()
+        navController.graph = nav_deeplink_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = NavDeepLinkRequest(null, null, "any/thing")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("first_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkMimeTypeWildCardSubtype() {
+        val navController = createNavController()
+        navController.graph = nav_deeplink_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = NavDeepLinkRequest(null, null, "image/jpg")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateViaDeepLinkMimeTypeWildCardType() {
+        val navController = createNavController()
+        navController.graph = nav_deeplink_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = NavDeepLinkRequest(null, null, "doesNotEvenMatter/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("third_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigationViaDeepLinkPopUpTo() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(
+            deepLink,
+            navOptions {
+                popUpTo("nav_root") { inclusive = true }
+            }
+        )
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateToDifferentGraphViaDeepLink() {
+        val navController = createNavController()
+        navController.graph = nav_multiple_navigation_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("deep_link_child_second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        val popped = navController.popBackStack()
+        assertWithMessage("NavController should return true when popping a non-root destination")
+            .that(popped)
+            .isTrue()
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateToDifferentGraphViaDeepLink3x() {
+        val navController = createNavController()
+        navController.graph = nav_multiple_navigation_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route).isEqualTo("deep_link_child_second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        navController.popBackStack()
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        // repeat nav and pop 2 more times.
+        navController.navigate(deepLink)
+        navController.popBackStack()
+        navController.navigate(deepLink)
+
+        val popped = navController.popBackStack()
+        assertWithMessage("NavController should return true when popping a non-root destination")
+            .that(popped)
+            .isTrue()
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateToDifferentGraphViaDeepLinkToGrandchild3x() {
+        val navController = createNavController()
+        navController.graph = nav_multiple_navigation_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/grand_child_test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("deep_link_grandchild_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        navController.popBackStack()
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        // repeat nav and pop 2 more times.
+        navController.navigate(deepLink)
+        navController.popBackStack()
+        navController.navigate(deepLink)
+
+        val popped = navController.popBackStack()
+        assertWithMessage("NavController should return true when popping a non-root destination")
+            .that(popped)
+            .isTrue()
+        assertThat(navController.currentDestination?.route).isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @LargeTest
+    @Test
+    @SdkSuppress(minSdkVersion = 17)
+    fun testNavigateViaImplicitDeepLink() {
+        val intent = Intent(
+            Intent.ACTION_VIEW,
+            Uri.parse("android-app://androidx.navigation.test/test/argument1/argument2"),
+            ApplicationProvider.getApplicationContext() as Context,
+            TestActivity::class.java
+        )
+
+        Intents.init()
+
+        with(ActivityScenario.launch<TestActivity>(intent)) {
+            moveToState(Lifecycle.State.CREATED)
+            onActivity { activity ->
+                run {
+                    val navController = activity.navController
+                    navController.graph = nav_simple_route_graph
+
+                    val navigator =
+                        navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+
+                    assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+
+                    // Only the leaf destination should be on the stack.
+                    assertThat(navigator.backStack.size).isEqualTo(1)
+                    // The parent will be constructed in a new Activity after navigateUp()
+                    navController.navigateUp()
+                }
+            }
+
+            assertThat(this.state).isEqualTo(Lifecycle.State.DESTROYED)
+        }
+
+        // this relies on MonitoringInstrumentation.execStartActivity() which was added in API 17
+        intended(
+            allOf(
+                toPackage((ApplicationProvider.getApplicationContext() as Context).packageName),
+                not(hasData(anyString())), // The rethrow should not use the URI as primary target.
+                hasExtra(
+                    NavController.KEY_DEEP_LINK_IDS, intArrayOf(createRoute("nav_root").hashCode())
+                ),
+                hasExtra(
+                    Matchers.`is`(NavController.KEY_DEEP_LINK_EXTRAS),
+                    allOf(
+                        BundleMatchers.hasEntry("arg1", "argument1"),
+                        BundleMatchers.hasEntry("arg2", "argument2"),
+                        BundleMatchers.hasEntry(
+                            NavController.KEY_DEEP_LINK_INTENT,
+                            allOf(
+                                hasAction(intent.action),
+                                hasData(intent.data),
+                                hasComponent(intent.component)
+                            )
+                        )
+                    )
+                )
+            )
+        )
+
+        Intents.release()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreStateXml() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        navController.graph = nav_simple_route_graph
+        navController.navigate("second_test")
+
+        val savedState = navController.saveState()
+        navController = NavController(context)
+        navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        // Restore state doesn't recreate any graph
+        navController.restoreState(savedState)
+        assertThat(navController.currentDestination).isNull()
+
+        // Explicitly setting a graph then restores the state
+        navController.graph = nav_simple_route_graph
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        // Save state should be called on the navigator exactly once
+        assertThat(navigator.saveStateCount).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreStateDestinationChanged() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        navController.graph = nav_simple_route_graph
+
+        val savedState = navController.saveState()
+        navController = NavController(context)
+        navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        // Restore state doesn't recreate any graph
+        navController.restoreState(savedState)
+        assertThat(navController.currentDestination).isNull()
+
+        var destinationChangedCount = 0
+
+        navController.addOnDestinationChangedListener { _, _, _ ->
+            destinationChangedCount++
+        }
+
+        // Explicitly setting a graph then restores the state
+        navController.graph = nav_simple_route_graph
+        // Save state should be called on the navigator exactly once
+        assertThat(navigator.saveStateCount).isEqualTo(1)
+        // listener should have been fired again when state restored
+        assertThat(destinationChangedCount).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreStateProgrammatic() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = TestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        navController.graph = nav_simple_route_graph
+        navController.navigate("second_test")
+
+        val savedState = navController.saveState()
+        navController = NavController(context)
+        navigator = TestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        // Restore state doesn't recreate any graph
+        navController.restoreState(savedState)
+        assertThat(navController.currentDestination).isNull()
+
+        // Explicitly setting a graph then restores the state
+        navController.graph = nav_simple_route_graph
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreStateBundleParceled() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        navController.graph = nav_simple_route_graph
+
+        navigator.customParcel = CustomTestParcelable(TEST_ARG_VALUE)
+
+        val savedState = navController.saveState()
+
+        val parcel = Parcel.obtain()
+        savedState?.writeToParcel(parcel, 0)
+        parcel.setDataPosition(0)
+
+        val restoredState = Bundle.CREATOR.createFromParcel(parcel)
+
+        navController = NavController(context)
+        navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        navController.restoreState(restoredState)
+        navController.graph = nav_simple_route_graph
+
+        // Ensure custom parcelable is present and can be read
+        assertThat(navigator.customParcel?.name).isEqualTo(TEST_ARG_VALUE)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSaveRestoreAfterNavigateToDifferentNavGraph() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        navController.graph = nav_multiple_navigation_route_graph
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val deepLink = Uri.parse("android-app://androidx.navigation.test/test")
+
+        navController.navigate(deepLink)
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("deep_link_child_second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        navController.navigate("simple_child_start")
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(3)
+
+        val savedState = navController.saveState()
+        navController = NavController(context)
+        navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        // Restore state doesn't recreate any graph
+        navController.restoreState(savedState)
+        assertThat(navController.currentDestination).isNull()
+
+        // Explicitly setting a graph then restores the state
+        navController.graph = nav_multiple_navigation_route_graph
+        assertThat(navController.currentDestination?.route)
+            .isEqualTo("simple_child_start_test")
+        assertThat(navigator.backStack.size).isEqualTo(3)
+        // Save state should be called on the navigator exactly once
+        assertThat(navigator.saveStateCount).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testBackstackArgsBundleParceled() {
+        val context = ApplicationProvider.getApplicationContext() as Context
+        var navController = NavController(context)
+        var navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        val backStackArg1 = Bundle()
+        backStackArg1.putParcelable(TEST_ARG, CustomTestParcelable(TEST_ARG_VALUE))
+        navController.setGraph(R.navigation.nav_arguments)
+        navController.navigate(R.id.second_test, backStackArg1)
+
+        val savedState = navController.saveState()
+
+        val parcel = Parcel.obtain()
+        savedState?.writeToParcel(parcel, 0)
+        parcel.setDataPosition(0)
+
+        val restoredState = Bundle.CREATOR.createFromParcel(parcel)
+
+        navController = NavController(context)
+        navigator = SaveStateTestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+
+        navController.restoreState(restoredState)
+        navController.setGraph(R.navigation.nav_arguments)
+
+        navController.addOnDestinationChangedListener { _, _, arguments ->
+            assertThat(arguments?.getParcelable<CustomTestParcelable>(TEST_ARG)?.name)
+                .isEqualTo(TEST_ARG_VALUE)
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateArgs() {
+        val navController = createNavController()
+        navController.setGraph(R.navigation.nav_arguments)
+
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val returnedArgs = navigator.current.arguments
+        assertThat(returnedArgs).isNotNull()
+        assertThat(returnedArgs!!["test_start_default"])
+            .isEqualTo("default")
+
+        navController.addOnDestinationChangedListener { _, _, arguments ->
+            assertThat(arguments).isNotNull()
+            assertThat(arguments!!["test_start_default"])
+                .isEqualTo("default")
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateWithNoDefaultValue() {
+        val returnedArgs = navigateWithArgs(null)
+
+        // Test that arguments without a default value aren't passed through at all
+        assertThat(returnedArgs.containsKey("test_no_default_value")).isFalse()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateWithDefaultArgs() {
+        val returnedArgs = navigateWithArgs(null)
+
+        // Test that default values are passed through
+        assertThat(returnedArgs.getString("test_default_value")).isEqualTo("default")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateWithArgs() {
+        val args = Bundle()
+        args.putString(TEST_ARG, TEST_ARG_VALUE)
+        val returnedArgs = navigateWithArgs(args)
+
+        // Test that programmatically constructed arguments are passed through
+        assertThat(returnedArgs.getString(TEST_ARG)).isEqualTo(TEST_ARG_VALUE)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateWithOverriddenDefaultArgs() {
+        val args = Bundle()
+        args.putString(TEST_OVERRIDDEN_VALUE_ARG, TEST_OVERRIDDEN_VALUE_ARG_VALUE)
+        val returnedArgs = navigateWithArgs(args)
+
+        // Test that default values can be overridden by programmatic values
+        assertThat(returnedArgs.getString(TEST_OVERRIDDEN_VALUE_ARG))
+            .isEqualTo(TEST_OVERRIDDEN_VALUE_ARG_VALUE)
+    }
+
+    private fun navigateWithArgs(args: Bundle?): Bundle {
+        val navController = createNavController()
+        navController.setGraph(R.navigation.nav_arguments)
+
+        navController.navigate(R.id.second_test, args)
+
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        val returnedArgs = navigator.current.arguments
+        assertThat(returnedArgs).isNotNull()
+
+        return returnedArgs!!
+    }
+
+    @UiThreadTest
+    @Test
+    fun testPopRoot() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val success = navController.popBackStack()
+        assertWithMessage("NavController should return false when popping the root")
+            .that(success)
+            .isFalse()
+        assertThat(navController.currentDestination).isNull()
+        assertThat(navigator.backStack.size).isEqualTo(0)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testPopOnEmptyStack() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val success = navController.popBackStack()
+        assertWithMessage("NavController should return false when popping the root")
+            .that(success)
+            .isFalse()
+        assertThat(navController.currentDestination).isNull()
+        assertThat(navigator.backStack.size).isEqualTo(0)
+
+        val popped = navController.popBackStack()
+        assertWithMessage(
+            "popBackStack should return false when there's nothing on the " +
+                "back stack"
+        )
+            .that(popped)
+            .isFalse()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenPop() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test")
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        val popped = navController.popBackStack()
+        assertWithMessage("NavController should return true when popping a non-root destination")
+            .that(popped)
+            .isTrue()
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenPopToUnknownDestination() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test")
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        val popped = navController.popBackStack(UNKNOWN_DESTINATION_ID, false)
+        assertWithMessage("Popping to an invalid destination should return false")
+            .that(popped)
+            .isFalse()
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenNavigateWithPop() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test") {
+            popUpTo("start_test") { inclusive = true }
+        }
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenNavigateWithPopRoot() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test") {
+            popUpTo("nav_root") { inclusive = true }
+        }
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenNavigateUp() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test")
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        // This should function identically to popBackStack()
+        val success = navController.navigateUp()
+        assertThat(success)
+            .isTrue()
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateThenNavigateUpWithDefaultArgs() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test")
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate("second_test")
+        assertThat(navController.currentDestination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        navController.navigate("start_test_with_default_arg")
+        assertThat(navController.currentDestination?.route).isEqualTo("start_test_with_default_arg")
+        assertThat(navigator.backStack.size).isEqualTo(3)
+
+        // This should function identically to popBackStack()
+        val success = navController.navigateUp()
+        assertThat(success).isTrue()
+        val destination = navController.currentDestination
+        assertThat(destination?.route).isEqualTo("second_test")
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        assertThat(destination?.arguments?.get("defaultArg")?.defaultValue.toString())
+            .isEqualTo("defaultValue")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testDeepLinkFromNavGraph() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("second_test")
+            .createTaskStackBuilder()
+        assertThat(taskStackBuilder).isNotNull()
+        assertThat(taskStackBuilder.intentCount).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testDeepLinkIntent() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+
+        val args = Bundle()
+        args.putString("test", "test")
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("second_test")
+            .setArguments(args)
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        navController.handleDeepLink(intent)
+
+        // The original Intent should be untouched and safely writable to a Parcel
+        val p = Parcel.obtain()
+        intent!!.writeToParcel(p, 0)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testDeepLinkIntentWithDefaultArgs() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("second_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        navController.handleDeepLink(intent)
+
+        // The original Intent should be untouched and safely writable to a Parcel
+        val p = Parcel.obtain()
+        intent!!.writeToParcel(p, 0)
+
+        val destination = navController.currentDestination
+        assertThat(destination?.route).isEqualTo("second_test")
+        assertThat(destination?.arguments?.get("defaultArg")?.defaultValue.toString())
+            .isEqualTo("defaultValue")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkValid() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val collectedDestinationIds = mutableListOf<String?>()
+        navController.addOnDestinationChangedListener { _, destination, _ ->
+            collectedDestinationIds.add(destination.route)
+        }
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("second_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("NavController should handle deep links to its own graph")
+            .that(navController.handleDeepLink(intent))
+            .isTrue()
+        // Verify that we navigated down to the deep link
+        assertThat(collectedDestinationIds)
+            .containsExactly("start_test", "start_test", "second_test")
+            .inOrder()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkNestedStartDestination() {
+        val navController = createNavController()
+        navController.graph = nav_nested_start_destination_route_graph
+        val collectedDestinationIds = mutableListOf<String?>()
+        navController.addOnDestinationChangedListener { _, destination, _ ->
+            collectedDestinationIds.add(destination.route)
+        }
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("second_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("NavController should handle deep links to its own graph")
+            .that(navController.handleDeepLink(intent))
+            .isTrue()
+
+        // Verify that we navigated down to the deep link
+        assertThat(collectedDestinationIds)
+            .containsExactly("nested_test", "nested_test", "second_test")
+            .inOrder()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkMultipleDestinations() {
+        val navController = createNavController()
+        navController.graph = nav_multiple_navigation_route_graph
+        val collectedDestinationRoutes = mutableListOf<String?>()
+        navController.addOnDestinationChangedListener { _, destination, _ ->
+            collectedDestinationRoutes.add(destination.route)
+        }
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination("simple_child_second_test")
+            .addDestination("deep_link_child_second_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("NavController should handle deep links to its own graph")
+            .that(navController.handleDeepLink(intent))
+            .isTrue()
+
+        // Verify that we navigated down to the deep link
+        assertThat(collectedDestinationRoutes)
+            .containsExactly(
+                // First to the destination added via setDestination()
+                "simple_child_start_test", "simple_child_start_test",
+                "simple_child_second_test",
+                // Then to the second destination added via addDestination()
+                "deep_link_child_start_test", "deep_link_child_second_test"
+            )
+            .inOrder()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkMultipleDestinationsWithArgs() {
+        val navController = createNavController()
+        navController.graph = nav_multiple_navigation_route_graph
+        val collectedDestinations = mutableListOf<Pair<String?, Bundle?>>()
+        navController.addOnDestinationChangedListener { _, destination, arguments ->
+            collectedDestinations.add(destination.route to arguments)
+        }
+
+        val globalBundle = Bundle().apply {
+            putString("global", "global")
+        }
+        val firstBundle = Bundle().apply {
+            putString("test", "first")
+        }
+        val secondBundle = Bundle().apply {
+            putString("global", "overridden")
+            putString("test", "second")
+        }
+        val taskStackBuilder = navController.createDeepLink()
+            .setDestination(createRoute("simple_child_second_test").hashCode(), firstBundle)
+            .addDestination(createRoute("deep_link_child_second_test").hashCode(), secondBundle)
+            .setArguments(globalBundle)
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("NavController should handle deep links to its own graph")
+            .that(navController.handleDeepLink(intent))
+            .isTrue()
+
+        // Verify that we navigated down to the deep link
+        // First to the destination added via setDestination()
+        val (destinationRoutes, bundle) = collectedDestinations[0]
+        assertThat(destinationRoutes).isEqualTo("simple_child_start_test")
+        assertThat(bundle).isEqualTo(null)
+
+        val (destinationId1, bundle1) = collectedDestinations[1]
+        assertThat(destinationId1).isEqualTo("simple_child_start_test")
+        assertThat(bundle1).string("global").isEqualTo("global")
+        assertThat(bundle1).string("test").isEqualTo("first")
+
+        val (destinationId2, bundle2) = collectedDestinations[2]
+        assertThat(destinationId2).isEqualTo("simple_child_second_test")
+        assertThat(bundle2).string("global").isEqualTo("global")
+        assertThat(bundle2).string("test").isEqualTo("first")
+
+        // Then to the second destination added via addDestination()
+        val (destinationId3, bundle3) = collectedDestinations[3]
+        assertThat(destinationId3).isEqualTo("deep_link_child_start_test")
+        assertThat(bundle3).string("global").isEqualTo("overridden")
+        assertThat(bundle3).string("test").isEqualTo("second")
+
+        val (destinationId4, bundle4) = collectedDestinations[4]
+        assertThat(destinationId4).isEqualTo("deep_link_child_second_test")
+        assertThat(bundle4).string("global").isEqualTo("overridden")
+        assertThat(bundle4).string("test").isEqualTo("second")
+
+        assertWithMessage("$collectedDestinations should have 5 destinations")
+            .that(collectedDestinations).hasSize(5)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkInvalid() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val collectedDestinationRoutes = mutableListOf<String?>()
+        navController.addOnDestinationChangedListener { _, destination, _ ->
+            collectedDestinationRoutes.add(destination.route)
+        }
+
+        assertThat(collectedDestinationRoutes).containsExactly("start_test")
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setGraph(nav_nested_start_destination_route_graph)
+            .setDestination("nested_second_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("handleDeepLink should return false when passed an invalid deep link")
+            .that(navController.handleDeepLink(intent))
+            .isFalse()
+
+        assertWithMessage("$collectedDestinationRoutes should have 1 destination id")
+            .that(collectedDestinationRoutes).hasSize(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testHandleDeepLinkToRootInvalid() {
+        val navController = createNavController()
+        navController.graph = nav_simple_route_graph
+        val collectedDestinationRoutes = mutableListOf<String?>()
+        navController.addOnDestinationChangedListener { _, destination, _ ->
+            collectedDestinationRoutes.add(destination.route)
+        }
+
+        assertThat(collectedDestinationRoutes).containsExactly("start_test")
+
+        val taskStackBuilder = navController.createDeepLink()
+            .setGraph(nav_nested_start_destination_route_graph)
+            .setDestination("nested_test")
+            .createTaskStackBuilder()
+
+        val intent = taskStackBuilder.editIntentAt(0)
+        assertThat(intent).isNotNull()
+        assertWithMessage("handleDeepLink should return false when passed an invalid deep link")
+            .that(navController.handleDeepLink(intent))
+            .isFalse()
+
+        assertWithMessage("$collectedDestinationRoutes should have 1 destination id")
+            .that(collectedDestinationRoutes).hasSize(1)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSetOnBackPressedDispatcherOnNavBackStackEntry() {
+        var backPressedIntercepted = false
+        val navController = createNavController()
+        val lifecycleOwner = TestLifecycleOwner()
+        val dispatcher = OnBackPressedDispatcher()
+
+        navController.setLifecycleOwner(lifecycleOwner)
+        navController.setOnBackPressedDispatcher(dispatcher)
+
+        navController.graph = nav_simple_route_graph
+        navController.navigate("second_test")
+        assertThat(navController.previousBackStackEntry?.destination?.route)
+            .isEqualTo("start_test")
+
+        dispatcher.addCallback(navController.currentBackStackEntry!!) {
+            backPressedIntercepted = true
+        }
+
+        // Move to STOPPED
+        lifecycleOwner.currentState = Lifecycle.State.CREATED
+        // Move back up to RESUMED
+        lifecycleOwner.currentState = Lifecycle.State.RESUMED
+
+        dispatcher.onBackPressed()
+
+        assertThat(backPressedIntercepted).isTrue()
+    }
+
+    private fun createNavController(): NavController {
+        val navController = NavController(ApplicationProvider.getApplicationContext())
+        val navigator = TestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        return navController
+    }
+}
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
index 7bb4733..5dd486d 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
@@ -28,7 +28,9 @@
 import androidx.activity.OnBackPressedDispatcher
 import androidx.activity.addCallback
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.get
 import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.navigation.test.R
 import androidx.test.annotation.UiThreadTest
@@ -156,7 +158,7 @@
         val navigator = navController.navigatorProvider[TestNavigator::class]
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
         assertThat(navigator.backStack.size).isEqualTo(1)
-        val foundArgs = navigator.current.second
+        val foundArgs = navigator.current.arguments
         assertThat(foundArgs).isNotNull()
         assertThat(foundArgs?.getString(TEST_ARG)).isEqualTo(TEST_ARG_VALUE)
     }
@@ -188,7 +190,7 @@
         val navigator = navController.navigatorProvider[TestNavigator::class]
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
         assertThat(navigator.backStack.size).isEqualTo(1)
-        val foundArgs = navigator.current.second
+        val foundArgs = navigator.current.arguments
         assertThat(foundArgs).isNotNull()
         assertThat(foundArgs?.getString(TEST_ARG)).isEqualTo(TEST_ARG_VALUE)
     }
@@ -290,6 +292,22 @@
 
     @UiThreadTest
     @Test
+    fun testSetNewLifecycleOwner() {
+        val navController = createNavController()
+        val lifecycleOwner = TestLifecycleOwner(Lifecycle.State.RESUMED)
+
+        navController.setLifecycleOwner(lifecycleOwner)
+        assertThat(lifecycleOwner.observerCount).isEqualTo(1)
+
+        val replacementLifecycleOwner = TestLifecycleOwner(Lifecycle.State.RESUMED)
+
+        navController.setLifecycleOwner(replacementLifecycleOwner)
+        assertThat(lifecycleOwner.observerCount).isEqualTo(0)
+        assertThat(replacementLifecycleOwner.observerCount).isEqualTo(1)
+    }
+
+    @UiThreadTest
+    @Test
     fun testNavigate() {
         val navController = createNavController()
         navController.setGraph(R.navigation.nav_simple)
@@ -334,7 +352,7 @@
         navController.navigate(deepLink)
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
         assertThat(navigator.backStack.size).isEqualTo(2)
-        val intent = navigator.current.second?.getParcelable<Intent>(
+        val intent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertThat(intent?.data).isEqualTo(deepLink)
@@ -369,7 +387,7 @@
         navController.navigate(deepLink)
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
         assertThat(navigator.backStack.size).isEqualTo(2)
-        val intent = navigator.current.second?.getParcelable<Intent>(
+        val intent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertThat(intent?.action).isEqualTo(action)
@@ -413,7 +431,7 @@
         navController.navigate(deepLink)
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.forth_test)
         assertThat(navigator.backStack.size).isEqualTo(2)
-        val intent = navigator.current.second?.getParcelable<Intent>(
+        val intent = navigator.current.arguments?.getParcelable<Intent>(
             NavController.KEY_DEEP_LINK_INTENT
         )
         assertThat(intent?.type).isEqualTo(mimeType)
@@ -644,13 +662,14 @@
     fun testSaveRestoreStateXml() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = SaveStateTestNavigator()
+        var navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         navController.setGraph(R.navigation.nav_simple)
         navController.navigate(R.id.second_test)
 
         val savedState = navController.saveState()
         navController = NavController(context)
+        navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         // Restore state doesn't recreate any graph
@@ -670,13 +689,14 @@
     fun testSaveRestoreStateDestinationChanged() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = SaveStateTestNavigator()
+        var navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         navController.setGraph(R.navigation.nav_simple)
 
         val savedState = navController.saveState()
         navController = NavController(context)
+        navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         // Restore state doesn't recreate any graph
@@ -702,7 +722,7 @@
     fun testSaveRestoreStateProgrammatic() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = TestNavigator()
+        var navigator = TestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         val graph = NavInflater(context, navController.navigatorProvider)
             .inflate(R.navigation.nav_simple)
@@ -711,6 +731,7 @@
 
         val savedState = navController.saveState()
         navController = NavController(context)
+        navigator = TestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         // Restore state doesn't recreate any graph
@@ -728,7 +749,7 @@
     fun testSaveRestoreStateBundleParceled() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = SaveStateTestNavigator()
+        var navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         navController.setGraph(R.navigation.nav_simple)
 
@@ -743,6 +764,7 @@
         val restoredState = Bundle.CREATOR.createFromParcel(parcel)
 
         navController = NavController(context)
+        navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         navController.restoreState(restoredState)
@@ -757,7 +779,7 @@
     fun testSaveRestoreAfterNavigateToDifferentNavGraph() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = SaveStateTestNavigator()
+        var navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         navController.setGraph(R.navigation.nav_multiple_navigation)
         assertThat(navController.currentDestination?.id ?: 0)
@@ -778,6 +800,7 @@
 
         val savedState = navController.saveState()
         navController = NavController(context)
+        navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         // Restore state doesn't recreate any graph
@@ -798,7 +821,7 @@
     fun testBackstackArgsBundleParceled() {
         val context = ApplicationProvider.getApplicationContext() as Context
         var navController = NavController(context)
-        val navigator = SaveStateTestNavigator()
+        var navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         val backStackArg1 = Bundle()
@@ -815,6 +838,7 @@
         val restoredState = Bundle.CREATOR.createFromParcel(parcel)
 
         navController = NavController(context)
+        navigator = SaveStateTestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
 
         navController.restoreState(restoredState)
@@ -833,7 +857,7 @@
         navController.setGraph(R.navigation.nav_arguments)
 
         val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs).isNotNull()
         assertThat(returnedArgs!!["test_start_default"])
             .isEqualTo("default")
@@ -893,7 +917,7 @@
         navController.navigate(R.id.second_test, args)
 
         val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs).isNotNull()
 
         return returnedArgs!!
@@ -1127,7 +1151,7 @@
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
         assertThat(navigator.backStack.size).isEqualTo(2)
 
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs?.getString(testKey)).isEqualTo(testValue)
         assertThat(destinationListenerExecuted).isTrue()
     }
@@ -1140,7 +1164,7 @@
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
         val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
         assertThat(navigator.backStack.size).isEqualTo(1)
-        assertThat(navigator.current.second).isNull()
+        assertThat(navigator.current.arguments).isNull()
 
         val args = Bundle()
         val testKey = "testKey"
@@ -1165,7 +1189,7 @@
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
         assertThat(navigator.backStack.size).isEqualTo(1)
 
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs?.getString(testKey)).isEqualTo(testValue)
         assertThat(destinationListenerExecuted).isTrue()
     }
@@ -1180,8 +1204,8 @@
             .isEqualTo(R.id.start_test_with_default_arg)
         val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
         assertThat(navigator.backStack.size).isEqualTo(2)
-        assertThat(navigator.current.second).isNotNull()
-        assertThat(navigator.current.second?.getBoolean("defaultArg", false)).isTrue()
+        assertThat(navigator.current.arguments).isNotNull()
+        assertThat(navigator.current.arguments?.getBoolean("defaultArg", false)).isTrue()
 
         val args = Bundle()
         val testKey = "testKey"
@@ -1208,7 +1232,7 @@
             .isEqualTo(R.id.start_test_with_default_arg)
         assertThat(navigator.backStack.size).isEqualTo(2)
 
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs?.getString(testKey)).isEqualTo(testValue)
         assertThat(returnedArgs?.getBoolean("defaultArg", false)).isTrue()
         assertThat(destinationListenerExecuted).isTrue()
@@ -1242,13 +1266,297 @@
         assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
         assertThat(navigator.backStack.size).isEqualTo(2)
 
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs?.getString(testKey)).isEqualTo(testValue)
         assertThat(destinationListenerExecuted).isTrue()
     }
 
     @UiThreadTest
     @Test
+    fun testNavigateOptionSaveRestoreState() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_simple)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navigator.backStack[0]
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+        navController.navigate(
+            R.id.second_test,
+            null,
+            navOptions {
+                popUpTo(R.id.start_test) {
+                    inclusive = true
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate(
+            R.id.start_test,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.second_test) {
+                    inclusive = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val newBackStackEntry = navigator.backStack[0]
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateOptionSaveStackRestoreState() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_simple)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navController.getBackStackEntry(R.id.nav_root)
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+        navController.navigate(
+            R.id.second_test,
+            null,
+            navOptions {
+                popUpTo(R.id.nav_root) {
+                    inclusive = true
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.second_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate(
+            R.id.nav_root,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.nav_root) {
+                    inclusive = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0).isEqualTo(R.id.start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val newBackStackEntry = navController.getBackStackEntry(R.id.nav_root)
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateOptionNestedSaveRestoreStateInclusive() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_multiple_navigation)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+        navController.navigate(R.id.simple_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        navController.navigate(
+            R.id.deep_link_child_start,
+            null,
+            navOptions {
+                popUpTo(R.id.simple_child_start) {
+                    inclusive = true
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.deep_link_child_start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        navController.navigate(
+            R.id.simple_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.deep_link_child_start) {
+                    inclusive = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.simple_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        val newBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateOptionNestedSaveRestoreStateNonInclusive() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_multiple_navigation)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+        navController.navigate(R.id.simple_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        // Navigate to the second graph
+        navController.navigate(
+            R.id.deep_link_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.deep_link_child_start_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        val secondGraphBackStackEntry = navController
+            .getBackStackEntry(R.id.deep_link_child_start_test)
+        val secondGraphViewModel = ViewModelProvider(secondGraphBackStackEntry)
+            .get<TestAndroidViewModel>()
+        assertThat(secondGraphViewModel).isNotSameInstanceAs(originalViewModel)
+        navController.navigate(R.id.deep_link_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(3)
+
+        // Navigate back to the first graph
+        navController.navigate(
+            R.id.simple_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.simple_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+
+        val newBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+
+        // Now navigate back to that second graph
+        navController.navigate(
+            R.id.deep_link_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.deep_link_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(3)
+        val newSecondGraphBackStackEntry = navController
+            .getBackStackEntry(R.id.deep_link_child_start_test)
+        val newSecondGraphViewModel = ViewModelProvider(newSecondGraphBackStackEntry)
+            .get<TestAndroidViewModel>()
+        assertThat(newSecondGraphBackStackEntry.id).isSameInstanceAs(secondGraphBackStackEntry.id)
+        assertThat(newSecondGraphViewModel).isSameInstanceAs(secondGraphViewModel)
+    }
+
+    @UiThreadTest
+    @Test
+    fun testNavigateOptionNestedSaveRestoreStateNonInclusiveNoPopUpToState() {
+        val navController = createNavController()
+        navController.setViewModelStore(ViewModelStore())
+        navController.setGraph(R.navigation.nav_multiple_navigation)
+        val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+        val originalBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val originalViewModel = ViewModelProvider(originalBackStackEntry)
+            .get<TestAndroidViewModel>()
+
+        // Navigate to the second graph
+        navController.navigate(
+            R.id.deep_link_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.deep_link_child_start_test)
+        assertThat(navigator.backStack.size).isEqualTo(2)
+        val secondGraphBackStackEntry = navController
+            .getBackStackEntry(R.id.deep_link_child_start_test)
+        val secondGraphViewModel = ViewModelProvider(secondGraphBackStackEntry)
+            .get<TestAndroidViewModel>()
+        assertThat(secondGraphViewModel).isNotSameInstanceAs(originalViewModel)
+        navController.navigate(R.id.deep_link_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(3)
+
+        // Navigate back to the first graph
+        navController.navigate(
+            R.id.simple_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.simple_child_start_test)
+        assertThat(navigator.backStack.size).isEqualTo(1)
+
+        val newBackStackEntry = navController.getBackStackEntry(R.id.simple_child_start)
+        val newViewModel = ViewModelProvider(newBackStackEntry).get<TestAndroidViewModel>()
+        assertThat(newBackStackEntry.id).isSameInstanceAs(originalBackStackEntry.id)
+        assertThat(newViewModel).isSameInstanceAs(originalViewModel)
+
+        // Now navigate back to that second graph
+        navController.navigate(
+            R.id.deep_link_child_start,
+            null,
+            navOptions {
+                restoreState = true
+                popUpTo(R.id.simple_child_start_test) {
+                    saveState = true
+                }
+            }
+        )
+        assertThat(navController.currentDestination?.id ?: 0)
+            .isEqualTo(R.id.deep_link_child_second_test)
+        assertThat(navigator.backStack.size).isEqualTo(3)
+        val newSecondGraphBackStackEntry = navController
+            .getBackStackEntry(R.id.deep_link_child_start_test)
+        val newSecondGraphViewModel = ViewModelProvider(newSecondGraphBackStackEntry)
+            .get<TestAndroidViewModel>()
+        assertThat(newSecondGraphBackStackEntry.id).isSameInstanceAs(secondGraphBackStackEntry.id)
+        assertThat(newSecondGraphViewModel).isSameInstanceAs(secondGraphViewModel)
+    }
+
+    @UiThreadTest
+    @Test
     fun testNavigateOptionPopUpToInAction() {
         val navController = createNavController()
         navController.setGraph(R.navigation.nav_simple)
@@ -1273,7 +1581,7 @@
         assertThat(navigator.backStack.size).isEqualTo(2)
 
         val navOptions = navOptions {
-            popUpTo = R.id.start_test
+            popUpTo(R.id.start_test)
         }
         // the same as to call .navigate(R.id.finish)
         navController.navigate(0, null, navOptions)
@@ -1323,7 +1631,7 @@
         navController.navigate(R.id.second, args)
 
         val navigator = navController.navigatorProvider.getNavigator(TestNavigator::class.java)
-        val returnedArgs = navigator.current.second
+        val returnedArgs = navigator.current.arguments
         assertThat(returnedArgs).isNotNull()
 
         // Test that arguments without a default value aren't passed through at all
@@ -1665,8 +1973,8 @@
             .collect()
     }
 
-    private fun createNavController(): NavController {
-        val navController = NavController(ApplicationProvider.getApplicationContext())
+    private fun createNavController(): NavHostController {
+        val navController = NavHostController(ApplicationProvider.getApplicationContext())
         val navigator = TestNavigator()
         navController.navigatorProvider.addNavigator(navigator)
         return navController
@@ -1705,15 +2013,16 @@
     var saveStateCount = 0
     var customParcel: CustomTestParcelable? = null
 
-    override fun onSaveState(): Bundle? {
+    override fun onSaveState(): Bundle {
         saveStateCount += 1
-        val state = Bundle()
+        val state = super.onSaveState() ?: Bundle()
         state.putInt(STATE_SAVED_COUNT, saveStateCount)
         state.putParcelable(TEST_PARCEL, customParcel)
         return state
     }
 
     override fun onRestoreState(savedState: Bundle) {
+        super.onRestoreState(savedState)
         saveStateCount = savedState.getInt(STATE_SAVED_COUNT)
         customParcel = savedState.getParcelable(TEST_PARCEL)
     }
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerViewModelTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerViewModelTest.kt
index ca5ed11..d786d7a 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerViewModelTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavControllerViewModelTest.kt
@@ -30,7 +30,7 @@
 
     @Test
     fun testGetViewModelStore() {
-        val navGraphId = UUID.randomUUID()
+        val navGraphId = UUID.randomUUID().toString()
         val viewModel = NavControllerViewModel()
         val viewModelStore = viewModel.getViewModelStore(navGraphId)
         assertThat(viewModel.getViewModelStore(navGraphId)).isSameInstanceAs(viewModelStore)
@@ -46,7 +46,7 @@
     @Test
     fun testClear() {
         val viewModel = NavControllerViewModel.getInstance(ViewModelStore())
-        val navGraphId = UUID.randomUUID()
+        val navGraphId = UUID.randomUUID().toString()
         val viewModelStore = viewModel.getViewModelStore(navGraphId)
         assertThat(viewModelStore).isNotNull()
 
@@ -58,10 +58,10 @@
     fun testOnCleared() {
         val baseViewModelStore = ViewModelStore()
         val viewModel = NavControllerViewModel.getInstance(baseViewModelStore)
-        val navGraphId = UUID.randomUUID()
+        val navGraphId = UUID.randomUUID().toString()
         val navGraphViewModelStore = viewModel.getViewModelStore(navGraphId)
         // test clearing two viewmodel stores.
-        viewModel.getViewModelStore(UUID.randomUUID())
+        viewModel.getViewModelStore(UUID.randomUUID().toString())
 
         assertThat(navGraphViewModelStore).isNotNull()
 
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
index afdccd1..951a236 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavDeepLinkBuilderTest.kt
@@ -36,6 +36,29 @@
 
     private val targetContext get() = ApplicationProvider.getApplicationContext() as Context
 
+    val nav_simple_route_graph =
+        createNavController().createGraph(route = "nav_root", startDestination = "start_test") {
+            test("start_test")
+            test("start_test_with_default_arg") {
+                argument("defaultArg") { defaultValue = true }
+            }
+            test("second_test") {
+                argument("arg2") { type = NavType.StringType }
+                argument("defaultArg") {
+                    type = NavType.StringType
+                    defaultValue = "defaultValue"
+                }
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test"
+                    action = "test.action"
+                    mimeType = "type/test"
+                }
+                deepLink {
+                    uriPattern = "android-app://androidx.navigation.test/test/{arg1}/{arg2}"
+                }
+            }
+        }
+
     @Test
     fun fromContextSetGraphXml() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
@@ -47,6 +70,16 @@
     }
 
     @Test
+    fun fromContextSetGraphXmlRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        deepLinkBuilder.setDestination("second_test")
+        val taskStackBuilder = deepLinkBuilder.createTaskStackBuilder()
+        assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
+    }
+
+    @Test
     fun fromContextSetGraphNavInflater() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
 
@@ -63,6 +96,16 @@
     }
 
     @Test
+    fun fromContextSetGraphNavInflaterRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        deepLinkBuilder.setDestination("second_test")
+        val taskStackBuilder = deepLinkBuilder.createTaskStackBuilder()
+        assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
+    }
+
+    @Test
     fun fromContextSetGraphProgrammatic() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
 
@@ -79,6 +122,25 @@
         assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
     }
 
+    @Test
+    fun fromContextSetGraphProgrammaticRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        val navigatorProvider = NavigatorProvider().apply {
+            addNavigator(NavGraphNavigator(this))
+            addNavigator(TestNavigator())
+        }
+        val navGraph = navigatorProvider.navigation(
+            route = "graph", startDestination = "test"
+        ) {
+            test("test")
+        }
+        deepLinkBuilder.setGraph(navGraph)
+        deepLinkBuilder.setDestination("test")
+        val taskStackBuilder = deepLinkBuilder.createTaskStackBuilder()
+        assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
+    }
+
     @UiThreadTest
     @Test
     fun fromNavController() {
@@ -93,6 +155,20 @@
         assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
     }
 
+    @UiThreadTest
+    @Test
+    fun fromNavControllerRoute() {
+        val navController = NavController(targetContext).apply {
+            navigatorProvider.addNavigator(TestNavigator())
+            graph = nav_simple_route_graph
+        }
+        val deepLinkBuilder = NavDeepLinkBuilder(navController)
+
+        deepLinkBuilder.setDestination("second_test")
+        val taskStackBuilder = deepLinkBuilder.createTaskStackBuilder()
+        assertEquals("Expected one Intent", 1, taskStackBuilder.intentCount)
+    }
+
     @Test
     fun pendingIntentEqualsWithSameArgs() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
@@ -113,6 +189,25 @@
     }
 
     @Test
+    fun pendingIntentEqualsWithSameArgsRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        deepLinkBuilder.setDestination("second_test")
+        val args = Bundle().apply {
+            putString("test", "test")
+        }
+        deepLinkBuilder.setArguments(args)
+        val firstPendingIntent = deepLinkBuilder.createPendingIntent()
+
+        // Don't change anything and generate a new PendingIntent
+        val secondPendingIntent = deepLinkBuilder.createPendingIntent()
+        assertWithMessage("PendingIntents with the same destination and args should be the same")
+            .that(firstPendingIntent)
+            .isEqualTo(secondPendingIntent)
+    }
+
+    @Test
     fun pendingIntentNotEqualsWithDifferentDestination() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
 
@@ -133,6 +228,26 @@
     }
 
     @Test
+    fun pendingIntentNotEqualsWithDifferentDestinationRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        deepLinkBuilder.setDestination("second_test")
+        val args = Bundle().apply {
+            putString("test", "test")
+        }
+        deepLinkBuilder.setArguments(args)
+        val firstPendingIntent = deepLinkBuilder.createPendingIntent()
+
+        // Change the destination but not the args
+        deepLinkBuilder.setDestination("start_test")
+        val secondPendingIntent = deepLinkBuilder.createPendingIntent()
+        assertWithMessage("PendingIntents with different destinations should be different")
+            .that(firstPendingIntent)
+            .isNotEqualTo(secondPendingIntent)
+    }
+
+    @Test
     fun pendingIntentNotEqualsWithDifferentArgs() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
 
@@ -153,6 +268,26 @@
     }
 
     @Test
+    fun pendingIntentNotEqualsWithDifferentArgsRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        deepLinkBuilder.setDestination("second_test")
+        val args = Bundle().apply {
+            putString("test", "test")
+        }
+        deepLinkBuilder.setArguments(args)
+        val firstPendingIntent = deepLinkBuilder.createPendingIntent()
+
+        // Change the args but not the destination
+        args.putString("test", "test2")
+        val secondPendingIntent = deepLinkBuilder.createPendingIntent()
+        assertWithMessage("PendingIntents with different arguments should be different")
+            .that(firstPendingIntent)
+            .isNotEqualTo(secondPendingIntent)
+    }
+
+    @Test
     fun pendingIntentNotEqualsWithDifferentDestinationArgs() {
         val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
 
@@ -172,4 +307,32 @@
             .that(firstPendingIntent)
             .isNotEqualTo(secondPendingIntent)
     }
+
+    @Test
+    fun pendingIntentNotEqualsWithDifferentDestinationArgsRoute() {
+        val deepLinkBuilder = NavDeepLinkBuilder(targetContext)
+
+        deepLinkBuilder.setGraph(nav_simple_route_graph)
+        val args = Bundle().apply {
+            putString("test", "test")
+        }
+        deepLinkBuilder.setDestination("second_test", args)
+        val firstPendingIntent = deepLinkBuilder.createPendingIntent()
+
+        // Change the args but not the destination
+        args.putString("test", "test2")
+        val secondPendingIntent = deepLinkBuilder.createPendingIntent()
+        assertWithMessage(
+            "PendingIntents with different destination arguments should be different"
+        )
+            .that(firstPendingIntent)
+            .isNotEqualTo(secondPendingIntent)
+    }
+
+    private fun createNavController(): NavController {
+        val navController = NavController(ApplicationProvider.getApplicationContext())
+        val navigator = TestNavigator()
+        navController.navigatorProvider.addNavigator(navigator)
+        return navController
+    }
 }
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
index 8f6c3a5..9f25763 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavInflaterTest.kt
@@ -48,7 +48,7 @@
         val graph = navInflater.inflate(R.navigation.nav_simple)
 
         assertThat(graph).isNotNull()
-        assertThat(graph.startDestination)
+        assertThat(graph.startDestinationId)
             .isEqualTo(R.id.start_test)
     }
 
@@ -264,7 +264,7 @@
         val context = ApplicationProvider.getApplicationContext() as Context
         val navInflater = NavInflater(context, TestNavigatorProvider())
         val graph = navInflater.inflate(R.navigation.nav_default_arguments)
-        val startDestination = graph.findNode(graph.startDestination)
+        val startDestination = graph.findNode(graph.startDestinationId)
         val action = startDestination?.getAction(R.id.my_action)
         assertThat(action?.defaultArguments?.get("test_action_arg"))
             .isEqualTo(123L)
@@ -275,7 +275,7 @@
         val navInflater = NavInflater(context, TestNavigatorProvider())
         val graph = navInflater.inflate(R.navigation.nav_default_arguments)
 
-        val startDestination = graph.findNode(graph.startDestination)
+        val startDestination = graph.findNode(graph.startDestinationId)
         val defaultArguments = startDestination?.arguments
 
         assertThat(defaultArguments).isNotNull()
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigator.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigator.kt
index 532a73a..fe38d04 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigator.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/ActivityNavigator.kt
@@ -192,7 +192,7 @@
      * NavDestination for activity navigation
      *
      * Construct a new activity destination. This destination is not valid until you set the
-     * Intent via [.setIntent] or one or more of the other set method.
+     * Intent via [setIntent] or one or more of the other set method.
      *
      * @param activityNavigator The [ActivityNavigator] which this destination
      * will be associated with. Generally retrieved via a
@@ -246,7 +246,7 @@
 
         /**
          * Construct a new activity destination. This destination is not valid until you set the
-         * Intent via [.setIntent] or one or more of the other set method.
+         * Intent via [setIntent] or one or more of the other set method.
          *
          *
          * @param navigatorProvider The [NavController] which this destination
@@ -367,7 +367,7 @@
          *
          *
          * To use a dynamic URI that changes based on the arguments passed in when navigating,
-         * use [.setDataPattern], which will take precedence when arguments are
+         * use [setDataPattern], which will take precedence when arguments are
          * present.
          *
          * @param data A static URI that should always be used.
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.kt
deleted file mode 100644
index 303200a..0000000
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.kt
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package androidx.navigation
-
-import android.app.Application
-import android.content.Context
-import android.os.Bundle
-import androidx.annotation.RestrictTo
-import androidx.lifecycle.AbstractSavedStateViewModelFactory
-import androidx.lifecycle.HasDefaultViewModelProviderFactory
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.LifecycleRegistry
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.SavedStateViewModelFactory
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.ViewModelStore
-import androidx.lifecycle.ViewModelStoreOwner
-import androidx.savedstate.SavedStateRegistry
-import androidx.savedstate.SavedStateRegistryController
-import androidx.savedstate.SavedStateRegistryOwner
-import java.util.UUID
-
-/**
- * Representation of an entry in the back stack of a [NavController]. The
- * [Lifecycle], [ViewModelStore], and [SavedStateRegistry] provided via
- * this object are valid for the lifetime of this destination on the back stack: when this
- * destination is popped off the back stack, the lifecycle will be destroyed, state
- * will no longer be saved, and ViewModels will be cleared.
- */
-public class NavBackStackEntry @JvmOverloads internal constructor(
-    private val context: Context,
-    /**
-     * Gets the destination associated with this entry
-     * @return The destination that is currently visible to users
-     */
-    public val destination: NavDestination,
-    /**
-     * Gets the arguments used for this entry
-     * @return The arguments used when this entry was created
-     */
-    @set:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public var arguments: Bundle?,
-    navControllerLifecycleOwner: LifecycleOwner?,
-    private val navControllerViewModel: NavControllerViewModel?,
-    // Internal unique name for this navBackStackEntry;
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public val id: UUID = UUID.randomUUID(),
-    savedState: Bundle? = null
-) : LifecycleOwner,
-    ViewModelStoreOwner,
-    HasDefaultViewModelProviderFactory,
-    SavedStateRegistryOwner {
-
-    private var lifecycle = LifecycleRegistry(this)
-    private val savedStateRegistryController = SavedStateRegistryController.create(this)
-    private var hostLifecycle = Lifecycle.State.CREATED
-    private val defaultFactory by lazy {
-        SavedStateViewModelFactory((context.applicationContext as Application), this, arguments)
-    }
-
-    /**
-     * Gets the [SavedStateHandle] for this entry.
-     *
-     * @return the SavedStateHandle for this entry
-     */
-    public val savedStateHandle: SavedStateHandle by lazy {
-        ViewModelProvider(
-            this, NavResultSavedStateFactory(this, null)
-        ).get(SavedStateViewModel::class.java).handle
-    }
-
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun replaceArguments(newArgs: Bundle?) {
-        arguments = newArgs
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * If the [NavHost] has not called [NavHostController.setLifecycleOwner], the
-     * Lifecycle will be capped at [Lifecycle.State.CREATED].
-     */
-    public override fun getLifecycle(): Lifecycle {
-        return lifecycle
-    }
-
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @set:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public var maxLifecycle: Lifecycle.State = Lifecycle.State.RESUMED
-        set(maxState) {
-            field = maxState
-            updateState()
-        }
-
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun handleLifecycleEvent(event: Lifecycle.Event) {
-        hostLifecycle = getStateAfter(event)
-        updateState()
-    }
-
-    /**
-     * Update the state to be the lower of the two constraints:
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun updateState() {
-        if (hostLifecycle.ordinal < maxLifecycle.ordinal) {
-            lifecycle.currentState = hostLifecycle
-        } else {
-            lifecycle.currentState = maxLifecycle
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @throws IllegalStateException if called before the [NavHost] has called
-     * [NavHostController.setViewModelStore].
-     */
-    public override fun getViewModelStore(): ViewModelStore {
-        checkNotNull(navControllerViewModel) {
-            "You must call setViewModelStore() on your NavHostController before accessing the " +
-                "ViewModelStore of a navigation graph."
-        }
-        return navControllerViewModel.getViewModelStore(id)
-    }
-
-    public override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory {
-        return defaultFactory
-    }
-
-    public override fun getSavedStateRegistry(): SavedStateRegistry {
-        return savedStateRegistryController.savedStateRegistry
-    }
-
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun saveState(outBundle: Bundle) {
-        savedStateRegistryController.performSave(outBundle)
-    }
-
-    /**
-     * Used to create the {SavedStateViewModel}
-     */
-    private class NavResultSavedStateFactory(
-        owner: SavedStateRegistryOwner,
-        defaultArgs: Bundle?
-    ) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
-        @Suppress("UNCHECKED_CAST")
-        override fun <T : ViewModel?> create(
-            key: String,
-            modelClass: Class<T>,
-            handle: SavedStateHandle
-        ): T {
-            return SavedStateViewModel(handle) as T
-        }
-    }
-
-    private class SavedStateViewModel(val handle: SavedStateHandle) : ViewModel()
-
-    internal companion object {
-        /**
-         * Copied from LifecycleRegistry.getStateAfter()
-         * TODO: update to Event.getTargetState() when navigation's lifecycle-core dependency is updated
-         */
-        internal fun getStateAfter(event: Lifecycle.Event): Lifecycle.State {
-            when (event) {
-                Lifecycle.Event.ON_CREATE, Lifecycle.Event.ON_STOP -> return Lifecycle.State.CREATED
-                Lifecycle.Event.ON_START, Lifecycle.Event.ON_PAUSE -> return Lifecycle.State.STARTED
-                Lifecycle.Event.ON_RESUME -> return Lifecycle.State.RESUMED
-                Lifecycle.Event.ON_DESTROY -> return Lifecycle.State.DESTROYED
-                Lifecycle.Event.ON_ANY -> {
-                }
-            }
-            throw IllegalArgumentException("Unexpected event value $event")
-        }
-    }
-
-    init {
-        savedStateRegistryController.performRestore(savedState)
-        if (navControllerLifecycleOwner != null) {
-            hostLifecycle = navControllerLifecycleOwner.lifecycle.currentState
-        }
-    }
-}
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 b6310eb..0caf28a 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2019 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,20 +16,21 @@
 package androidx.navigation
 
 import android.annotation.SuppressLint
+import android.content.Context
 import android.os.Bundle
 import android.os.Parcelable
 import android.os.Parcel
-import java.util.UUID
+import androidx.lifecycle.LifecycleOwner
 
 @SuppressLint("BanParcelableUsage")
 internal class NavBackStackEntryState : Parcelable {
-    val uuid: UUID
+    val id: String
     val destinationId: Int
     val args: Bundle?
     val savedState: Bundle
 
     constructor(entry: NavBackStackEntry) {
-        uuid = entry.id
+        id = entry.id
         destinationId = entry.destination.id
         args = entry.arguments
         savedState = Bundle()
@@ -37,18 +38,34 @@
     }
 
     constructor(inParcel: Parcel) {
-        uuid = UUID.fromString(inParcel.readString())
+        id = inParcel.readString()!!
         destinationId = inParcel.readInt()
         args = inParcel.readBundle(javaClass.classLoader)
         savedState = inParcel.readBundle(javaClass.classLoader)!!
     }
 
+    fun instantiate(
+        context: Context,
+        destination: NavDestination,
+        lifecycleOwner: LifecycleOwner?,
+        viewModel: NavControllerViewModel?
+    ): NavBackStackEntry {
+        val args = args?.apply {
+            classLoader = context.classLoader
+        }
+        return NavBackStackEntry.create(
+            context, destination, args,
+            lifecycleOwner, viewModel,
+            id, savedState
+        )
+    }
+
     override fun describeContents(): Int {
         return 0
     }
 
     override fun writeToParcel(parcel: Parcel, i: Int) {
-        parcel.writeString(uuid.toString())
+        parcel.writeString(id)
         parcel.writeInt(destinationId)
         parcel.writeBundle(args)
         parcel.writeBundle(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 defad3a..054d302 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -31,17 +31,18 @@
 import androidx.annotation.NavigationRes
 import androidx.annotation.RestrictTo
 import androidx.core.app.TaskStackBuilder
+import androidx.core.net.toUri
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStore
 import androidx.lifecycle.ViewModelStoreOwner
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.channels.sendBlocking
+import androidx.navigation.NavDestination.Companion.createRoute
+import kotlinx.coroutines.channels.BufferOverflow
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.asSharedFlow
 
 /**
  * NavController manages app navigation within a [NavHost].
@@ -51,7 +52,7 @@
  *
  * Navigation flows and destinations are determined by the
  * [navigation graph][NavGraph] owned by the controller. These graphs are typically
- * [inflated][.getNavInflater] from an Android resource, but, like views, they can also
+ * [inflated][getNavInflater] from an Android resource, but, like views, they can also
  * be constructed or combined programmatically or for the case of dynamic navigation structure.
  * (For example, if the navigation structure of the application is determined by live data obtained'
  * from a remote server.)
@@ -84,7 +85,7 @@
          * Sets the [navigation graph][NavGraph] to the specified graph.
          * Any current navigation graph data (including back stack) will be replaced.
          *
-         * The graph can be retrieved later via [.getGraph].
+         * The graph can be retrieved later via [getGraph].
          *
          * @param graph graph to set
          * @see NavController.setGraph
@@ -108,6 +109,8 @@
      */
     @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public open val backQueue: ArrayDeque<NavBackStackEntry> = ArrayDeque()
+    private val backStackMap = mutableMapOf<Int, String?>()
+    private val backStackStates = mutableMapOf<String, ArrayDeque<NavBackStackEntryState>>()
     private var lifecycleOwner: LifecycleOwner? = null
     private var viewModel: NavControllerViewModel? = null
     private val onDestinationChangedListeners =
@@ -131,11 +134,11 @@
 
     /**
      * OnDestinationChangedListener receives a callback when the
-     * [.getCurrentDestination] or its arguments change.
+     * [getCurrentDestination] or its arguments change.
      */
     public fun interface OnDestinationChangedListener {
         /**
-         * Callback for when the [.getCurrentDestination] or its arguments change.
+         * Callback for when the [getCurrentDestination] or its arguments change.
          * This navigation may be to a destination that has not been seen before, or one that
          * was previously on the back stack. This method is called after navigation is complete,
          * but associated transitions may still be playing.
@@ -178,6 +181,102 @@
             _navigatorProvider = navigatorProvider
         }
 
+    private val navigatorState =
+        mutableMapOf<Navigator<out NavDestination>, NavControllerNavigatorState>()
+    private var addToBackStackHandler: ((backStackEntry: NavBackStackEntry) -> Unit)? = null
+    private var popFromBackStackHandler: ((popUpTo: NavBackStackEntry) -> Unit)? = null
+
+    /**
+     * Call [Navigator.navigate] while setting up a [handler] that receives callbacks
+     * when [NavigatorState.add] is called.
+     */
+    private fun Navigator<out NavDestination>.navigateInternal(
+        entries: List<NavBackStackEntry>,
+        navOptions: NavOptions?,
+        navigatorExtras: Navigator.Extras?,
+        handler: (backStackEntry: NavBackStackEntry) -> Unit = {}
+    ) {
+        addToBackStackHandler = handler
+        navigate(entries, navOptions, navigatorExtras)
+        addToBackStackHandler = null
+    }
+
+    /**
+     * Call [Navigator.popBackStack] while setting up a [handler] that receives callbacks
+     * when [NavigatorState.pop] is called.
+     */
+    private fun Navigator<out NavDestination>.popBackStackInternal(
+        popUpTo: NavBackStackEntry,
+        saveState: Boolean,
+        handler: (popUpTo: NavBackStackEntry) -> Unit = {}
+    ) {
+        popFromBackStackHandler = handler
+        popBackStack(popUpTo, saveState)
+        popFromBackStackHandler = null
+    }
+
+    private inner class NavControllerNavigatorState(
+        val navigator: Navigator<out NavDestination>
+    ) : NavigatorState() {
+        override fun add(backStackEntry: NavBackStackEntry) {
+            val destinationNavigator: Navigator<out NavDestination> =
+                _navigatorProvider[backStackEntry.destination.navigatorName]
+            if (destinationNavigator == navigator) {
+                val handler = addToBackStackHandler
+                if (handler != null) {
+                    handler(backStackEntry)
+                    addInternal(backStackEntry)
+                } else {
+                    // TODO handle the Navigator calling add() outside of a call to navigate()
+                    Log.i(
+                        TAG,
+                        "Ignoring add of destination ${backStackEntry.destination} " +
+                            "outside of the call to navigate(). "
+                    )
+                }
+            } else {
+                val navigatorBackStack = checkNotNull(navigatorState[destinationNavigator]) {
+                    "NavigatorBackStack for ${backStackEntry.destination.navigatorName} should " +
+                        "already be created"
+                }
+                navigatorBackStack.add(backStackEntry)
+            }
+        }
+
+        fun addInternal(backStackEntry: NavBackStackEntry) {
+            super.add(backStackEntry)
+        }
+
+        override fun createBackStackEntry(
+            destination: NavDestination,
+            arguments: Bundle?
+        ) = NavBackStackEntry.create(
+            context, destination, arguments,
+            lifecycleOwner, viewModel
+        )
+
+        override fun pop(popUpTo: NavBackStackEntry, saveState: Boolean) {
+            val destinationNavigator: Navigator<out NavDestination> =
+                _navigatorProvider[popUpTo.destination.navigatorName]
+            if (destinationNavigator == navigator) {
+                val handler = popFromBackStackHandler
+                if (handler != null) {
+                    handler(popUpTo)
+                    super.pop(popUpTo, saveState)
+                } else {
+                    // TODO handle the Navigator calling pop() outside of a call to popBackStack()
+                    Log.i(
+                        TAG,
+                        "Ignoring pop of destination ${popUpTo.destination} " +
+                            "outside of the call to popBackStack(). "
+                    )
+                }
+            } else {
+                navigatorState[destinationNavigator]!!.pop(popUpTo, saveState)
+            }
+        }
+    }
+
     /**
      * Constructs a new controller for a given [Context]. Controllers should not be
      * used outside of their context and retain a hard reference to the context supplied.
@@ -202,7 +301,7 @@
 
     /**
      * Adds an [OnDestinationChangedListener] to this controller to receive a callback
-     * whenever the [.getCurrentDestination] or its arguments change.
+     * whenever the [getCurrentDestination] or its arguments change.
      *
      * The current destination, if any, will be immediately sent to your listener.
      *
@@ -239,6 +338,7 @@
      * @return true if the stack was popped at least once and the user has been navigated to
      * another destination, false otherwise
      */
+    @MainThread
     public open fun popBackStack(): Boolean {
         return if (backQueue.isEmpty()) {
             // Nothing to pop if the back stack is empty
@@ -257,31 +357,86 @@
      * @return true if the stack was popped at least once and the user has been navigated to
      * another destination, false otherwise
      */
+    @MainThread
     public open fun popBackStack(@IdRes destinationId: Int, inclusive: Boolean): Boolean {
-        val popped = popBackStackInternal(destinationId, inclusive)
+        return popBackStack(destinationId, inclusive, false)
+    }
+
+    /**
+     * Attempts to pop the controller's back stack back to a specific destination.
+     *
+     * @param destinationId The topmost destination to retain
+     * @param inclusive Whether the given destination should also be popped.
+     * @param saveState Whether the back stack and the state of all destinations between the
+     * current destination and the [destinationId] should be saved for later
+     * restoration via [NavOptions.Builder.setRestoreState] or the `restoreState` attribute using
+     * the same [destinationId] (note: this matching ID is true whether
+     * [inclusive] is true or false).
+     *
+     * @return true if the stack was popped at least once and the user has been navigated to
+     * another destination, false otherwise
+     */
+    @MainThread
+    public open fun popBackStack(
+        @IdRes destinationId: Int,
+        inclusive: Boolean,
+        saveState: Boolean
+    ): Boolean {
+        val popped = popBackStackInternal(destinationId, inclusive, saveState)
         // Only return true if the pop succeeded and we've dispatched
         // the change to a new destination
         return popped && dispatchOnDestinationChanged()
     }
 
     /**
+     * Attempts to pop the controller's back stack back to a specific destination.
+     *
+     * @param route The topmost destination to retain
+     * @param inclusive Whether the given destination should also be popped.
+     * @param saveState Whether the back stack and the state of all destinations between the
+     * current destination and the [route] should be saved for later
+     * restoration via [NavOptions.Builder.setRestoreState] or the `restoreState` attribute using
+     * the same [route] (note: this matching ID is true whether
+     * [inclusive] is true or false).
+     *
+     * @return true if the stack was popped at least once and the user has been navigated to
+     * another destination, false otherwise
+     */
+    @MainThread
+    @JvmOverloads
+    public fun popBackStack(
+        route: String,
+        inclusive: Boolean,
+        saveState: Boolean = false
+    ): Boolean = popBackStack(createRoute(route).hashCode(), inclusive, saveState)
+
+    /**
      * Attempts to pop the controller's back stack back to a specific destination. This does
-     * **not** handle calling [.dispatchOnDestinationChanged]
+     * **not** handle calling [dispatchOnDestinationChanged]
      *
      * @param destinationId The topmost destination to retain
      * @param inclusive Whether the given destination should also be popped.
+     * @param saveState Whether the back stack and the state of all destinations between the
+     * current destination and the [destinationId] should be saved for later
+     * restoration via [NavOptions.Builder.setRestoreState] or the `restoreState` attribute using
+     * the same [destinationId] (note: this matching ID is true whether
+     * [inclusive] is true or false).
      *
      * @return true if the stack was popped at least once, false otherwise
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun popBackStackInternal(@IdRes destinationId: Int, inclusive: Boolean): Boolean {
+    @MainThread
+    private fun popBackStackInternal(
+        @IdRes destinationId: Int,
+        inclusive: Boolean,
+        saveState: Boolean = false
+    ): Boolean {
         if (backQueue.isEmpty()) {
             // Nothing to pop if the back stack is empty
             return false
         }
         val popOperations = mutableListOf<Navigator<*>>()
         val iterator = backQueue.reversed().iterator()
-        var foundDestination = false
+        var foundDestination: NavDestination? = null
         while (iterator.hasNext()) {
             val destination = iterator.next().destination
             val navigator = _navigatorProvider.getNavigator<Navigator<*>>(
@@ -291,11 +446,11 @@
                 popOperations.add(navigator)
             }
             if (destination.id == destinationId) {
-                foundDestination = true
+                foundDestination = destination
                 break
             }
         }
-        if (!foundDestination) {
+        if (foundDestination == null) {
             // We were passed a destinationId that doesn't exist on our back stack.
             // Better to ignore the popBackStack than accidentally popping the entire stack
             val destinationName = NavDestination.getDisplayName(
@@ -309,29 +464,94 @@
             return false
         }
         var popped = false
+        val savedState = ArrayDeque<NavBackStackEntryState>()
         for (navigator in popOperations) {
-            if (navigator.popBackStack()) {
-                val entry = backQueue.removeLast()
-                if (entry.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
-                    entry.maxLifecycle = Lifecycle.State.DESTROYED
-                }
-                viewModel?.clear(entry.id)
+            var receivedPop = false
+            navigator.popBackStackInternal(backQueue.last(), saveState) { entry ->
+                receivedPop = true
                 popped = true
-            } else {
+                popEntryFromBackStack(entry, saveState, savedState)
+            }
+            if (!receivedPop) {
                 // The pop did not complete successfully, so stop immediately
                 break
             }
         }
+        if (saveState) {
+            if (!inclusive) {
+                // If this isn't an inclusive pop, we need to explicitly map the
+                // saved state to the destination you've actually passed to popUpTo
+                // as well as its parents (if it is the start destination)
+                generateSequence(foundDestination) { destination ->
+                    if (destination.parent?.startDestinationId == destination.id) {
+                        destination.parent
+                    } else {
+                        null
+                    }
+                }.takeWhile { destination ->
+                    // Only add the state if it doesn't already exist
+                    !backStackMap.containsKey(destination.id)
+                }.forEach { destination ->
+                    backStackMap[destination.id] = savedState.firstOrNull()?.id
+                }
+            }
+            if (savedState.isNotEmpty()) {
+                val firstState = savedState.first()
+                // Whether is is inclusive or not, we need to map the
+                // saved state to the destination that was popped
+                // as well as its parents (if it is the start destination)
+                val firstStateDestination = findDestination(firstState.destinationId)
+                generateSequence(firstStateDestination) { destination ->
+                    if (destination.parent?.startDestinationId == destination.id) {
+                        destination.parent
+                    } else {
+                        null
+                    }
+                }.takeWhile { destination ->
+                    // Only add the state if it doesn't already exist
+                    !backStackMap.containsKey(destination.id)
+                }.forEach { destination ->
+                    backStackMap[destination.id] = firstState.id
+                }
+                // And finally, store the actual state itself
+                backStackStates[firstState.id] = savedState
+            }
+        }
         updateOnBackPressedCallbackEnabled()
         return popped
     }
 
+    private fun popEntryFromBackStack(
+        popUpTo: NavBackStackEntry,
+        saveState: Boolean,
+        savedState: ArrayDeque<NavBackStackEntryState>
+    ) {
+        val entry = backQueue.last()
+        check(entry == popUpTo) {
+            "Attempted to pop ${popUpTo.destination}, which is not the top of the back stack " +
+                "(${entry.destination})"
+        }
+        backQueue.removeLast()
+        if (entry.lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
+            if (saveState) {
+                // Move the state through STOPPED
+                entry.maxLifecycle = Lifecycle.State.CREATED
+                // Then save the state of the NavBackStackEntry
+                savedState.addFirst(NavBackStackEntryState(entry))
+            }
+            entry.maxLifecycle = Lifecycle.State.DESTROYED
+        }
+        if (!saveState) {
+            viewModel?.clear(entry.id)
+        }
+    }
+
     /**
      * Attempts to navigate up in the navigation hierarchy. Suitable for when the
      * user presses the "Up" button marked with a left (or start)-facing arrow in the upper left
      * (or starting) corner of the app UI.
      *
-     * The intended behavior of Up differs from [Back][.popBackStack] when the user
+     * The intended behavior of Up differs from [Back][popBackStack] when the user
      * did not reach the current destination from the application's own task. e.g. if the user
      * is viewing a document or link in the current app in an activity hosted on another app's
      * task where the user clicked the link. In this case the current activity (determined by the
@@ -340,6 +560,7 @@
      *
      * @return true if navigation was successful, false otherwise
      */
+    @MainThread
     public open fun navigateUp(): Boolean {
         return if (destinationCountOnBackStack == 1) {
             // If there's only one entry, then we've deep linked into a specific destination
@@ -348,7 +569,7 @@
             var destId = currentDestination!!.id
             var parent = currentDestination.parent
             while (parent != null) {
-                if (parent.startDestination != destId) {
+                if (parent.startDestinationId != destId) {
                     val args = Bundle()
                     if (activity != null && activity!!.intent != null) {
                         val data = activity!!.intent.data
@@ -486,6 +707,7 @@
                     backStackEntry.arguments
                 )
             }
+            _currentBackStackEntryFlow.tryEmit(backStackEntry)
             return true
         }
         return false
@@ -504,7 +726,7 @@
      * Sets the [navigation graph][NavGraph] to the specified resource.
      * Any current navigation graph data (including back stack) will be replaced.
      *
-     * The inflated graph can be retrieved via [.getGraph].
+     * The inflated graph can be retrieved via [getGraph].
      *
      * @param graphResId resource id of the navigation graph to inflate
      *
@@ -522,7 +744,7 @@
      * Sets the [navigation graph][NavGraph] to the specified resource.
      * Any current navigation graph data (including back stack) will be replaced.
      *
-     * The inflated graph can be retrieved via [.getGraph].
+     * The inflated graph can be retrieved via [getGraph].
      *
      * @param graphResId resource id of the navigation graph to inflate
      * @param startDestinationArgs arguments to send to the start destination of the graph
@@ -541,7 +763,7 @@
      * Sets the [navigation graph][NavGraph] to the specified graph.
      * Any current navigation graph data (including back stack) will be replaced.
      *
-     * The graph can be retrieved later via [.getGraph].
+     * The graph can be retrieved later via [getGraph].
      *
      * @param graph graph to set
      * @see NavController.setGraph
@@ -567,6 +789,10 @@
             if (navigatorNames != null) {
                 for (name in navigatorNames) {
                     val navigator = _navigatorProvider.getNavigator<Navigator<*>>(name)
+                    val navigatorBackStack = navigatorState.getOrPut(navigator) {
+                        NavControllerNavigatorState(navigator)
+                    }
+                    navigator.onAttach(navigatorBackStack)
                     val bundle = navigatorStateToRestore.getBundle(name)
                     if (bundle != null) {
                         navigator.onRestoreState(bundle)
@@ -574,6 +800,13 @@
                 }
             }
         }
+        // Mark all other Navigators as attached
+        _navigatorProvider.navigators.values.filterNot { it.isAttached }.forEach { navigator ->
+            val navigatorBackStack = navigatorState.getOrPut(navigator) {
+                NavControllerNavigatorState(navigator)
+            }
+            navigator.onAttach(navigatorBackStack)
+        }
         backStackToRestore?.let { backStackToRestore ->
             for (parcelable in backStackToRestore) {
                 val state = parcelable as NavBackStackEntryState
@@ -588,15 +821,13 @@
                             "found from the current destination $currentDestination"
                     )
                 }
-                val args = state.args?.apply {
-                    classLoader = context.classLoader
+                val entry = state.instantiate(context, node, lifecycleOwner, viewModel)
+                val navigator = _navigatorProvider.getNavigator<Navigator<*>>(node.navigatorName)
+                val navigatorBackStack = checkNotNull(navigatorState[navigator]) {
+                    "NavigatorBackStack for ${node.navigatorName} should already be created"
                 }
-                val entry = NavBackStackEntry(
-                    context, node, args,
-                    lifecycleOwner, viewModel,
-                    state.uuid, state.savedState
-                )
                 backQueue.add(entry)
+                navigatorBackStack.addInternal(entry)
             }
             updateOnBackPressedCallbackEnabled()
             this.backStackToRestore = null
@@ -623,14 +854,14 @@
      * The types of Intents that are supported include:
      *
      * Intents created by [NavDeepLinkBuilder] or
-     * [.createDeepLink]. This assumes that the current graph shares
+     * [createDeepLink]. This assumes that the current graph shares
      * the same hierarchy to get to the deep linked destination as when the deep link was
      * constructed.
      * Intents that include a [data Uri][Intent.getData]. This Uri will be checked
      * against the Uri patterns in the [NavDeepLinks][NavDeepLink] added via
      * [NavDestination.addDeepLink].
      *
-     * The [navigation graph][.getGraph] should be set before calling this method.
+     * The [navigation graph][getGraph] should be set before calling this method.
      * @param intent The Intent that may contain a valid deep link
      * @return True if the navigation controller found a valid deep link and navigated to it.
      * @throws IllegalStateException if deep link cannot be accessed from the current destination
@@ -747,8 +978,8 @@
                     graph = node
                     // Automatically go down the navigation graph when
                     // the start destination is also a NavGraph
-                    while (graph!!.findNode(graph.startDestination) is NavGraph) {
-                        graph = graph.findNode(graph.startDestination) as NavGraph?
+                    while (graph!!.findNode(graph.startDestinationId) is NavGraph) {
+                        graph = graph.findNode(graph.startDestinationId) as NavGraph?
                     }
                 }
             } else {
@@ -795,8 +1026,8 @@
                     graph = node
                     // Automatically go down the navigation graph when
                     // the start destination is also a NavGraph
-                    while (graph!!.findNode(graph.startDestination) is NavGraph) {
-                        graph = graph.findNode(graph.startDestination) as NavGraph?
+                    while (graph!!.findNode(graph.startDestinationId) is NavGraph) {
+                        graph = graph.findNode(graph.startDestinationId) as NavGraph?
                     }
                 }
             }
@@ -821,11 +1052,31 @@
         if (_graph!!.id == destinationId) {
             return _graph
         }
-        val currentNode = if (backQueue.isEmpty()) _graph!! else backQueue.last().destination
-        val currentGraph = if (currentNode is NavGraph) currentNode else currentNode.parent!!
+        val currentNode = backQueue.lastOrNull()?.destination ?: _graph!!
+        return currentNode.findDestination(destinationId)
+    }
+
+    private fun NavDestination.findDestination(@IdRes destinationId: Int): NavDestination? {
+        if (id == destinationId) {
+            return this
+        }
+        val currentGraph = if (this is NavGraph) this else parent!!
         return currentGraph.findNode(destinationId)
     }
 
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun findDestination(destinationRoute: String): NavDestination? {
+        if (_graph == null) {
+            return null
+        }
+        if (_graph!!.route == destinationRoute) {
+            return _graph
+        }
+        val currentNode = backQueue.lastOrNull()?.destination ?: _graph!!
+        val currentGraph = if (currentNode is NavGraph) currentNode else currentNode.parent!!
+        return currentGraph.findNode(destinationRoute)
+    }
+
     /**
      * Navigate to a destination from the current navigation graph. This supports both navigating
      * via an [action][NavDestination.getAction] and directly navigating to a destination.
@@ -926,8 +1177,8 @@
             }
             combinedArgs.putAll(args)
         }
-        if (destId == 0 && finalNavOptions != null && finalNavOptions.popUpTo != -1) {
-            popBackStack(finalNavOptions.popUpTo, finalNavOptions.isPopUpToInclusive())
+        if (destId == 0 && finalNavOptions != null && finalNavOptions.popUpToId != -1) {
+            popBackStack(finalNavOptions.popUpToId, finalNavOptions.isPopUpToInclusive())
             return
         }
         require(destId != 0) {
@@ -952,7 +1203,7 @@
     /**
      * Navigate to a destination via the given deep link [Uri].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -967,7 +1218,7 @@
     /**
      * Navigate to a destination via the given deep link [Uri].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -983,7 +1234,7 @@
     /**
      * Navigate to a destination via the given deep link [Uri].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -1004,7 +1255,7 @@
     /**
      * Navigate to a destination via the given [NavDeepLinkRequest].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -1020,7 +1271,7 @@
     /**
      * Navigate to a destination via the given [NavDeepLinkRequest].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -1037,7 +1288,7 @@
     /**
      * Navigate to a destination via the given [NavDeepLinkRequest].
      * [NavDestination.hasDeepLink] should be called on
-     * [the navigation graph][.getGraph] prior to calling this method to check if the deep
+     * [the navigation graph][getGraph] prior to calling this method to check if the deep
      * link is valid. If an invalid deep link is given, an [IllegalArgumentException] will be
      * thrown.
      *
@@ -1081,105 +1332,216 @@
     ) {
         var popped = false
         var launchSingleTop = false
+        var navigated = false
         if (navOptions != null) {
-            if (navOptions.popUpTo != -1) {
+            if (navOptions.popUpToId != -1) {
                 popped = popBackStackInternal(
-                    navOptions.popUpTo,
-                    navOptions.isPopUpToInclusive()
+                    navOptions.popUpToId,
+                    navOptions.isPopUpToInclusive(),
+                    navOptions.shouldPopUpToSaveState()
                 )
             }
         }
-        val navigator = _navigatorProvider.getNavigator<Navigator<NavDestination>>(
-            node.navigatorName
-        )
         val finalArgs = node.addInDefaultArgs(args)
-        val newDest = navigator.navigate(
-            node, finalArgs,
-            navOptions, navigatorExtras
-        )
-        if (newDest != null) {
-            if (newDest !is FloatingWindow) {
-                // We've successfully navigating to the new destination, which means
-                // we should pop any FloatingWindow destination off the back stack
-                // before updating the back stack with our new destination
-                while (!backQueue.isEmpty() &&
-                    backQueue.last().destination is FloatingWindow &&
-                    popBackStackInternal(backQueue.last().destination.id, true)
-                ) {
-                    // Keep popping
+        val currentBackStackEntry = currentBackStackEntry
+        if (navOptions?.shouldLaunchSingleTop() == true &&
+            node.id == currentBackStackEntry?.destination?.id
+        ) {
+            // Single top operations don't change the back stack, they just update arguments
+            launchSingleTop = true
+            currentBackStackEntry.replaceArguments(finalArgs)
+            val navigator = _navigatorProvider.getNavigator<Navigator<NavDestination>>(
+                node.navigatorName
+            )
+            navigator.onLaunchSingleTop(currentBackStackEntry)
+        }
+        // Now determine what new destinations we need to add to the back stack
+        if (navOptions?.shouldRestoreState() == true && backStackMap.containsKey(node.id)) {
+            val backStackId = backStackMap[node.id]
+            // Clear out the state we're going to restore so that it isn't restored a second time
+            backStackMap.values.removeAll { it == backStackId }
+            val backStackState = backStackStates.remove(backStackId)
+            // Now restore the back stack from its saved state
+            val entries = instantiateBackStack(backStackState)
+            // Split up the entries by Navigator so we can restore them as an atomic operation
+            val entriesGroupedByNavigator = mutableListOf<MutableList<NavBackStackEntry>>()
+            entries.filterNot { entry ->
+                // Skip navigation graphs - they'll be added by addEntryToBackStack()
+                entry.destination is NavGraph
+            }.forEach { entry ->
+                val previousEntryList = entriesGroupedByNavigator.lastOrNull()
+                val previousNavigatorName = previousEntryList?.last()?.destination?.navigatorName
+                if (previousNavigatorName == entry.destination.navigatorName) {
+                    // Group back to back entries associated with the same Navigator together
+                    previousEntryList += entry
+                } else {
+                    // Create a new group for the new Navigator
+                    entriesGroupedByNavigator += mutableListOf(entry)
                 }
             }
-
-            // When you navigate() to a NavGraph, we need to ensure that a new instance
-            // is always created vs reusing an existing copy of that destination
-            val hierarchy = ArrayDeque<NavBackStackEntry>()
-            var destination = newDest
-            if (node is NavGraph) {
-                do {
-                    val parent = destination!!.parent
-                    if (parent != null) {
-                        val entry = NavBackStackEntry(
-                            context, parent,
-                            finalArgs, lifecycleOwner, viewModel
-                        )
-                        hierarchy.addFirst(entry)
-                        // Pop any orphaned copy of that navigation graph off the back stack
-                        if (backQueue.isNotEmpty() && backQueue.last().destination === parent) {
-                            popBackStackInternal(parent.id, true)
+            // Now actually navigate to each set of entries
+            for (entryList in entriesGroupedByNavigator) {
+                val navigator = _navigatorProvider.getNavigator<Navigator<NavDestination>>(
+                    entryList.first().destination.navigatorName
+                )
+                var lastNavigatedIndex = 0
+                var lastDestination = node
+                navigator.navigateInternal(entryList, navOptions, navigatorExtras) { entry ->
+                    navigated = true
+                    // If this destination is part of the restored back stack,
+                    // pass all destinations between the last navigated entry and this one
+                    // to ensure that any navigation graphs are properly restored as well
+                    val entryIndex = entries.indexOf(entry)
+                    val restoredEntries = if (entryIndex != -1) {
+                        entries.subList(lastNavigatedIndex, entryIndex + 1).also {
+                            lastNavigatedIndex = entryIndex + 1
+                            lastDestination = entry.destination
                         }
+                    } else {
+                        emptyList()
                     }
-                    destination = parent
-                } while (destination != null && destination !== node)
-            }
-
-            // Now collect the set of all intermediate NavGraphs that need to be put onto
-            // the back stack
-            destination = if (hierarchy.isEmpty()) newDest else hierarchy.first().destination
-            while (destination != null && findDestination(destination.id) == null) {
-                val parent = destination.parent
-                if (parent != null) {
-                    val entry = NavBackStackEntry(
-                        context, parent, finalArgs, lifecycleOwner, viewModel
-                    )
-                    hierarchy.addFirst(entry)
+                    addEntryToBackStack(lastDestination, finalArgs, entry, restoredEntries)
                 }
-                destination = parent
             }
-            val overlappingDestination: NavDestination =
-                if (hierarchy.isEmpty())
-                    newDest
-                else
-                    hierarchy.last().destination
-            // Pop any orphaned navigation graphs that don't connect to the new destinations
-            while (!backQueue.isEmpty() && backQueue.last().destination is NavGraph &&
-                (backQueue.last().destination as NavGraph).findNode(
-                        overlappingDestination.id, false
-                    ) == null && popBackStackInternal(backQueue.last().destination.id, true)
+        } else if (!launchSingleTop) {
+            // 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
+            )
+            val navigator = _navigatorProvider.getNavigator<Navigator<NavDestination>>(
+                node.navigatorName
+            )
+            navigator.navigateInternal(listOf(backStackEntry), navOptions, navigatorExtras) {
+                navigated = true
+                addEntryToBackStack(node, finalArgs, it)
+            }
+        }
+        updateOnBackPressedCallbackEnabled()
+        if (popped || navigated || launchSingleTop) {
+            dispatchOnDestinationChanged()
+        }
+    }
+
+    private fun instantiateBackStack(
+        backStackState: ArrayDeque<NavBackStackEntryState>?
+    ): List<NavBackStackEntry> {
+        val backStack = mutableListOf<NavBackStackEntry>()
+        var currentDestination = backQueue.lastOrNull()?.destination ?: graph
+        backStackState?.forEach { state ->
+            val node = currentDestination.findDestination(state.destinationId)
+            checkNotNull(node) {
+                val dest = NavDestination.getDisplayName(
+                    context, state.destinationId
+                )
+                "Restore State failed: destination $dest cannot be found from the current " +
+                    "destination $currentDestination"
+            }
+            backStack += state.instantiate(context, node, lifecycleOwner, viewModel)
+            currentDestination = node
+        }
+        return backStack
+    }
+
+    private fun addEntryToBackStack(
+        node: NavDestination,
+        finalArgs: Bundle?,
+        backStackEntry: NavBackStackEntry,
+        restoredEntries: List<NavBackStackEntry> = emptyList()
+    ) {
+        val newDest = backStackEntry.destination
+        if (newDest !is FloatingWindow) {
+            // We've successfully navigating to the new destination, which means
+            // we should pop any FloatingWindow destination off the back stack
+            // before updating the back stack with our new destination
+            while (!backQueue.isEmpty() &&
+                backQueue.last().destination is FloatingWindow &&
+                popBackStackInternal(backQueue.last().destination.id, true)
             ) {
                 // Keep popping
             }
-            backQueue.addAll(hierarchy)
-            // The _graph should always be on the back stack after you navigate()
-            if (backQueue.isEmpty() || backQueue.first().destination !== _graph) {
-                val entry = NavBackStackEntry(
-                    context, _graph!!, finalArgs, lifecycleOwner, viewModel
+        }
+
+        // When you navigate() to a NavGraph, we need to ensure that a new instance
+        // is always created vs reusing an existing copy of that destination
+        val hierarchy = ArrayDeque<NavBackStackEntry>()
+        var destination: NavDestination? = newDest
+        if (node is NavGraph) {
+            do {
+                val parent = destination!!.parent
+                if (parent != null) {
+                    val entry = restoredEntries.lastOrNull { restoredEntry ->
+                        restoredEntry.destination == parent
+                    } ?: NavBackStackEntry.create(
+                        context, parent,
+                        finalArgs, lifecycleOwner, viewModel
+                    )
+                    hierarchy.addFirst(entry)
+                    // Pop any orphaned copy of that navigation graph off the back stack
+                    if (backQueue.isNotEmpty() && backQueue.last().destination === parent) {
+                        popBackStackInternal(parent.id, true)
+                    }
+                }
+                destination = parent
+            } while (destination != null && destination !== node)
+        }
+
+        // Now collect the set of all intermediate NavGraphs that need to be put onto
+        // the back stack
+        destination = if (hierarchy.isEmpty()) newDest else hierarchy.first().destination
+        while (destination != null && findDestination(destination.id) == null) {
+            val parent = destination.parent
+            if (parent != null) {
+                val entry = restoredEntries.lastOrNull { restoredEntry ->
+                    restoredEntry.destination == parent
+                } ?: NavBackStackEntry.create(
+                    context, parent, parent.addInDefaultArgs(finalArgs), lifecycleOwner, viewModel
                 )
-                backQueue.addFirst(entry)
+                hierarchy.addFirst(entry)
             }
-            // And finally, add the new destination with its default args
-            val newBackStackEntry = NavBackStackEntry(
-                context, newDest, newDest.addInDefaultArgs(finalArgs), lifecycleOwner, viewModel
+            destination = parent
+        }
+        val overlappingDestination: NavDestination =
+            if (hierarchy.isEmpty())
+                newDest
+            else
+                hierarchy.last().destination
+        // Pop any orphaned navigation graphs that don't connect to the new destinations
+        while (!backQueue.isEmpty() && backQueue.last().destination is NavGraph &&
+            (backQueue.last().destination as NavGraph).findNode(
+                    overlappingDestination.id, false
+                ) == null && popBackStackInternal(backQueue.last().destination.id, true)
+        ) {
+            // Keep popping
+        }
+        // Now add the parent hierarchy to the NavigatorStates and back stack
+        hierarchy.forEach { entry ->
+            val navigator = _navigatorProvider.getNavigator<Navigator<*>>(
+                entry.destination.navigatorName
             )
-            backQueue.add(newBackStackEntry)
-        } else if (navOptions != null && navOptions.shouldLaunchSingleTop()) {
-            launchSingleTop = true
-            val singleTopBackStackEntry = backQueue.last()
-            singleTopBackStackEntry.replaceArguments(finalArgs)
+            val navigatorBackStack = checkNotNull(navigatorState[navigator]) {
+                "NavigatorBackStack for ${node.navigatorName} should already be created"
+            }
+            navigatorBackStack.addInternal(entry)
         }
-        updateOnBackPressedCallbackEnabled()
-        if (popped || newDest != null || launchSingleTop) {
-            dispatchOnDestinationChanged()
+        backQueue.addAll(hierarchy)
+        // The _graph should always be on the back stack after you navigate()
+        if (backQueue.isEmpty() || backQueue.first().destination !== _graph) {
+            val entry = restoredEntries.lastOrNull { restoredEntry ->
+                restoredEntry.destination == _graph!!
+            } ?: NavBackStackEntry.create(
+                context, _graph!!, _graph!!.addInDefaultArgs(finalArgs), lifecycleOwner, viewModel
+            )
+            val navigator = _navigatorProvider.getNavigator<Navigator<*>>(
+                entry.destination.navigatorName
+            )
+            val navigatorBackStack = checkNotNull(navigatorState[navigator]) {
+                "NavigatorBackStack for ${node.navigatorName} should already be created"
+            }
+            navigatorBackStack.addInternal(entry)
+            backQueue.addFirst(entry)
         }
+        // And finally, add the new destination
+        backQueue.add(backStackEntry)
     }
 
     /**
@@ -1187,6 +1549,7 @@
      *
      * @param directions directions that describe this navigation operation
      */
+    @MainThread
     public open fun navigate(directions: NavDirections) {
         navigate(directions.actionId, directions.arguments, null)
     }
@@ -1197,6 +1560,7 @@
      * @param directions directions that describe this navigation operation
      * @param navOptions special options for this navigation operation
      */
+    @MainThread
     public open fun navigate(directions: NavDirections, navOptions: NavOptions?) {
         navigate(directions.actionId, directions.arguments, navOptions)
     }
@@ -1207,11 +1571,47 @@
      * @param directions directions that describe this navigation operation
      * @param navigatorExtras extras to pass to the [Navigator]
      */
+    @MainThread
     public open fun navigate(directions: NavDirections, navigatorExtras: Navigator.Extras) {
         navigate(directions.actionId, directions.arguments, null, navigatorExtras)
     }
 
     /**
+     * Navigate to a route in the current NavGraph. If an invalid route is given, an
+     * [IllegalArgumentException] will be thrown.
+     *
+     * @param route route for the destination
+     * @param builder DSL for constructing a new [NavOptions]
+     *
+     * @throws IllegalArgumentException if the given route is invalid
+     */
+    public fun navigate(route: String, builder: NavOptionsBuilder.() -> Unit) {
+        navigate(route, navOptions(builder))
+    }
+
+    /**
+     * Navigate to a route in the current NavGraph. If an invalid route is given, an
+     * [IllegalArgumentException] will be thrown.
+     *
+     * @param route route for the destination
+     * @param navOptions special options for this navigation operation
+     * @param navigatorExtras extras to pass to the [Navigator]
+     *
+     * @throws IllegalArgumentException if the given route is invalid
+     */
+    @JvmOverloads
+    public fun navigate(
+        route: String,
+        navOptions: NavOptions? = null,
+        navigatorExtras: Navigator.Extras? = null
+    ) {
+        navigate(
+            NavDeepLinkRequest.Builder.fromUri(createRoute(route).toUri()).build(), navOptions,
+            navigatorExtras
+        )
+    }
+
+    /**
      * Create a deep link to a destination within this NavController.
      *
      * @return a [NavDeepLinkBuilder] suitable for constructing a deep link
@@ -1224,7 +1624,7 @@
      * Saves all navigation controller state to a Bundle.
      *
      * State may be restored from a bundle returned from this method by calling
-     * [.restoreState]. Saving controller state is the responsibility
+     * [restoreState]. Saving controller state is the responsibility
      * of a [NavHost].
      *
      * @return saved state for this controller
@@ -1257,6 +1657,35 @@
             }
             b.putParcelableArray(KEY_BACK_STACK, backStack)
         }
+        if (backStackMap.isNotEmpty()) {
+            if (b == null) {
+                b = Bundle()
+            }
+            val backStackDestIds = IntArray(backStackMap.size)
+            val backStackIds = ArrayList<String?>()
+            var index = 0
+            for ((destId, id) in backStackMap) {
+                backStackDestIds[index++] = destId
+                backStackIds += id
+            }
+            b.putIntArray(KEY_BACK_STACK_DEST_IDS, backStackDestIds)
+            b.putStringArrayList(KEY_BACK_STACK_IDS, backStackIds)
+        }
+        if (backStackStates.isNotEmpty()) {
+            if (b == null) {
+                b = Bundle()
+            }
+            val backStackStateIds = ArrayList<String>()
+            for ((id, backStackStates) in backStackStates) {
+                backStackStateIds += id
+                val states = arrayOfNulls<Parcelable>(backStackStates.size)
+                backStackStates.forEachIndexed { stateIndex, backStackState ->
+                    states[stateIndex] = backStackState
+                }
+                b.putParcelableArray(KEY_BACK_STACK_STATES_PREFIX + id, states)
+            }
+            b.putStringArrayList(KEY_BACK_STACK_STATES_IDS, backStackStateIds)
+        }
         if (deepLinkHandled) {
             if (b == null) {
                 b = Bundle()
@@ -1268,9 +1697,9 @@
 
     /**
      * Restores all navigation controller state from a bundle. This should be called before any
-     * call to [.setGraph].
+     * call to [setGraph].
      *
-     * State may be saved to a bundle by calling [.saveState].
+     * State may be saved to a bundle by calling [saveState].
      * Restoring controller state is the responsibility of a [NavHost].
      *
      * @param navState state bundle to restore
@@ -1283,6 +1712,27 @@
         navState.classLoader = context.classLoader
         navigatorStateToRestore = navState.getBundle(KEY_NAVIGATOR_STATE)
         backStackToRestore = navState.getParcelableArray(KEY_BACK_STACK)
+        backStackStates.clear()
+        val backStackDestIds = navState.getIntArray(KEY_BACK_STACK_DEST_IDS)
+        val backStackIds = navState.getStringArrayList(KEY_BACK_STACK_IDS)
+        if (backStackDestIds != null && backStackIds != null) {
+            backStackDestIds.forEachIndexed { index, id ->
+                backStackMap[id] = backStackIds[index]
+            }
+        }
+        val backStackStateIds = navState.getStringArrayList(KEY_BACK_STACK_STATES_IDS)
+        backStackStateIds?.forEach { id ->
+            val backStackState = navState.getParcelableArray(KEY_BACK_STACK_STATES_PREFIX + id)
+            if (backStackState != null) {
+                backStackStates[id] = ArrayDeque<NavBackStackEntryState>(
+                    backStackState.size
+                ).apply {
+                    for (parcelable in backStackState) {
+                        add(parcelable as NavBackStackEntryState)
+                    }
+                }
+            }
+        }
         deepLinkHandled = navState.getBoolean(KEY_DEEP_LINK_HANDLED)
     }
 
@@ -1291,8 +1741,9 @@
         if (owner == lifecycleOwner) {
             return
         }
+        lifecycleOwner?.lifecycle?.removeObserver(lifecycleObserver)
         lifecycleOwner = owner
-        lifecycleOwner!!.lifecycle.addObserver(lifecycleObserver)
+        owner.lifecycle.addObserver(lifecycleObserver)
     }
 
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -1359,7 +1810,7 @@
     /**
      * Gets the topmost [NavBackStackEntry] for a destination id.
      *
-     * This is always safe to use with [the current destination][.getCurrentDestination] or
+     * This is always safe to use with [the current destination][getCurrentDestination] or
      * [its parent][NavDestination.getParent] or grandparent navigation graphs as these
      * destinations are guaranteed to be on the back stack.
      *
@@ -1378,6 +1829,27 @@
     }
 
     /**
+     * Gets the topmost {@link NavBackStackEntry} for a route.
+     * <p>
+     * This is always safe to use with {@link #getCurrentDestination() the current destination} or
+     * {@link NavDestination#getParent() its parent} or grandparent navigation graphs as these
+     * destinations are guaranteed to be on the back stack.
+     *
+     * @param route route of a destination that exists on the back stack
+     * @throws IllegalArgumentException if the destination is not on the back stack
+     */
+    public fun getBackStackEntry(route: String): NavBackStackEntry {
+        val lastFromBackStack: NavBackStackEntry? = backQueue.lastOrNull { entry ->
+            entry.destination.route == route
+        }
+        requireNotNull(lastFromBackStack) {
+            "No destination with route $route is on the NavController's back stack. The " +
+                "current destination is $currentDestination"
+        }
+        return lastFromBackStack
+    }
+
+    /**
      * Gets the topmost [NavBackStackEntry].
      *
      * @return the topmost entry on the back stack or null if the back stack is empty
@@ -1385,6 +1857,16 @@
     public open val currentBackStackEntry: NavBackStackEntry?
         get() = backQueue.lastOrNull()
 
+    private val _currentBackStackEntryFlow: MutableSharedFlow<NavBackStackEntry> =
+        MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
+
+    /**
+     * Returns a [Flow] that will emit the currently active [NavBackStackEntry] whenever it
+     * changes. If there is no active [NavBackStackEntry], no item will be emitted.
+     */
+    public val currentBackStackEntryFlow: Flow<NavBackStackEntry> =
+        _currentBackStackEntryFlow.asSharedFlow()
+
     /**
      * Gets the previous visible [NavBackStackEntry].
      *
@@ -1411,6 +1893,14 @@
         private const val KEY_NAVIGATOR_STATE_NAMES =
             "android-support-nav:controller:navigatorState:names"
         private const val KEY_BACK_STACK = "android-support-nav:controller:backStack"
+        private const val KEY_BACK_STACK_DEST_IDS =
+            "android-support-nav:controller:backStackDestIds"
+        private const val KEY_BACK_STACK_IDS =
+            "android-support-nav:controller:backStackIds"
+        private const val KEY_BACK_STACK_STATES_IDS =
+            "android-support-nav:controller:backStackStates"
+        private const val KEY_BACK_STACK_STATES_PREFIX =
+            "android-support-nav:controller:backStackStates:"
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public const val KEY_DEEP_LINK_IDS: String = "android-support-nav:controller:deepLinkIds"
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -1441,18 +1931,14 @@
 ): NavGraph = navigatorProvider.navigation(id, startDestination, builder)
 
 /**
- * Creates and returns a [Flow] that will emit the currently active [NavBackStackEntry] whenever
- * it changes. If there is no active [NavBackStackEntry], no item will be emitted.
+ * Construct a new [NavGraph]
+ *
+ * @param route the route for the graph
+ * @param startDestination the route for the start destination
+ * @param builder the builder used to construct the graph
  */
-@ExperimentalCoroutinesApi
-public val NavController.currentBackStackEntryFlow: Flow<NavBackStackEntry>
-    get() = callbackFlow {
-        val listener = NavController.OnDestinationChangedListener { controller, _, _ ->
-            controller.currentBackStackEntry?.let { sendBlocking(it) }
-        }
-
-        addOnDestinationChangedListener(listener)
-        awaitClose {
-            removeOnDestinationChangedListener(listener)
-        }
-    }
\ No newline at end of file
+public fun NavController.createGraph(
+    startDestination: String,
+    route: String? = null,
+    builder: NavGraphBuilder.() -> Unit
+): NavGraph = navigatorProvider.navigation(startDestination, route, builder)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt
index 01667f6..4534b3a 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt
@@ -19,18 +19,17 @@
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStore
 import androidx.lifecycle.get
-import java.util.UUID
 
 /**
  * NavControllerViewModel is the always up to date view of the NavController's
  * non configuration state
  */
-internal class NavControllerViewModel : ViewModel() {
-    private val viewModelStores = mutableMapOf<UUID, ViewModelStore>()
+internal class NavControllerViewModel : ViewModel(), NavViewModelStoreProvider {
+    private val viewModelStores = mutableMapOf<String, ViewModelStore>()
 
-    fun clear(backStackEntryUUID: UUID) {
+    fun clear(backStackEntryId: String) {
         // Clear and remove the NavGraph's ViewModelStore
-        val viewModelStore = viewModelStores.remove(backStackEntryUUID)
+        val viewModelStore = viewModelStores.remove(backStackEntryId)
         viewModelStore?.clear()
     }
 
@@ -41,11 +40,11 @@
         viewModelStores.clear()
     }
 
-    fun getViewModelStore(backStackEntryUUID: UUID): ViewModelStore {
-        var viewModelStore = viewModelStores[backStackEntryUUID]
+    override fun getViewModelStore(backStackEntryId: String): ViewModelStore {
+        var viewModelStore = viewModelStores[backStackEntryId]
         if (viewModelStore == null) {
             viewModelStore = ViewModelStore()
-            viewModelStores[backStackEntryUUID] = viewModelStore
+            viewModelStores[backStackEntryId] = viewModelStore
         }
         return viewModelStore
     }
@@ -54,7 +53,7 @@
         val sb = StringBuilder("NavControllerViewModel{")
         sb.append(Integer.toHexString(System.identityHashCode(this)))
         sb.append("} ViewModelStores (")
-        val viewModelStoreIterator: Iterator<UUID> = viewModelStores.keys.iterator()
+        val viewModelStoreIterator: Iterator<String> = viewModelStores.keys.iterator()
         while (viewModelStoreIterator.hasNext()) {
             sb.append(viewModelStoreIterator.next())
             if (viewModelStoreIterator.hasNext()) {
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkBuilder.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkBuilder.kt
index 2b65a53..0d8bbb9 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkBuilder.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkBuilder.kt
@@ -24,6 +24,7 @@
 import androidx.annotation.IdRes
 import androidx.annotation.NavigationRes
 import androidx.core.app.TaskStackBuilder
+import androidx.navigation.NavDestination.Companion.createRoute
 
 /**
  * Class used to construct deep links to a particular destination in a [NavGraph].
@@ -40,7 +41,7 @@
  * the start destination of its containing navigation graph, the start destination of its
  * grandparent is used.
  *
- * You can construct an instance directly with [.NavDeepLinkBuilder] or build one
+ * You can construct an instance directly with [NavDeepLinkBuilder] or build one
  * using an existing [NavController] via [NavController.createDeepLink].
  */
 public class NavDeepLinkBuilder
@@ -105,7 +106,7 @@
     }
 
     /**
-     * Sets the graph that contains the [deep link destination][.setDestination].
+     * Sets the graph that contains the [deep link destination][setDestination].
      *
      * @param navGraphId ID of the [NavGraph] containing the deep link destination
      * @return this object for chaining
@@ -115,7 +116,7 @@
     }
 
     /**
-     * Sets the graph that contains the [deep link destination][.setDestination].
+     * Sets the graph that contains the [deep link destination][setDestination].
      *
      * If you do not have access to a [NavController], you can create a
      * [NavigatorProvider] and use that to programmatically construct a navigation
@@ -132,7 +133,7 @@
 
     /**
      * Sets the destination id to deep link to. Any destinations previous added via
-     * [.addDestination] are cleared, effectively resetting this object
+     * [addDestination] are cleared, effectively resetting this object
      * back to only this single destination.
      *
      * @param destId destination ID to deep link to.
@@ -151,8 +152,28 @@
     }
 
     /**
+     * Sets the destination route to deep link to. Any destinations previous added via
+     * [.addDestination] are cleared, effectively resetting this object
+     * back to only this single destination.
+     *
+     * @param destRoute destination route to deep link to.
+     * @param args Arguments to pass to this destination and any synthetic back stack created
+     * due to this destination being added.
+     * @return this object for chaining
+     */
+    @JvmOverloads
+    public fun setDestination(destRoute: String, args: Bundle? = null): NavDeepLinkBuilder {
+        destinations.clear()
+        destinations.add(DeepLinkDestination(createRoute(destRoute).hashCode(), args))
+        if (graph != null) {
+            verifyAllDestinations()
+        }
+        return this
+    }
+
+    /**
      * Add a new destination id to deep link to. This builds off any previous calls to this method
-     * or calls to [.setDestination], building the minimal synthetic back stack of
+     * or calls to [setDestination], building the minimal synthetic back stack of
      * start destinations between the previous deep link destination and the newly added
      * deep link destination.
      *
@@ -170,6 +191,26 @@
         return this
     }
 
+    /**
+     * Add a new destination route to deep link to. This builds off any previous calls to this
+     * method or calls to [.setDestination], building the minimal synthetic back stack of
+     * start destinations between the previous deep link destination and the newly added
+     * deep link destination.
+     *
+     * @param route destination route to deep link to.
+     * @param args Arguments to pass to this destination and any synthetic back stack created
+     * due to this destination being added.
+     * @return this object for chaining
+     */
+    @JvmOverloads
+    public fun addDestination(route: String, args: Bundle? = null): NavDeepLinkBuilder {
+        destinations.add(DeepLinkDestination(createRoute(route).hashCode(), args))
+        if (graph != null) {
+            verifyAllDestinations()
+        }
+        return this
+    }
+
     private fun findDestination(@IdRes destId: Int): NavDestination? {
         val possibleDestinations = ArrayDeque<NavDestination>()
         possibleDestinations.add(graph!!)
@@ -239,7 +280,7 @@
      * Construct the full [task stack][TaskStackBuilder] needed to deep link to the given
      * destination.
      *
-     * You must have [set a NavGraph][.setGraph] and [set a destination][.setDestination]
+     * You must have [set a NavGraph][setGraph] and [set a destination][setDestination]
      * before calling this method.
      *
      * @return a [TaskStackBuilder] which can be used to
@@ -270,11 +311,11 @@
     }
 
     /**
-     * Construct a [PendingIntent] to the [deep link destination][.setDestination].
+     * Construct a [PendingIntent] to the [deep link destination][setDestination].
      *
-     * This constructs the entire [task stack][.createTaskStackBuilder] needed.
+     * This constructs the entire [task stack][createTaskStackBuilder] needed.
      *
-     * You must have [set a NavGraph][.setGraph] and [set a destination][.setDestination]
+     * You must have [set a NavGraph][setGraph] and [set a destination][setDestination]
      * before calling this method.
      *
      * @return a PendingIntent constructed with [TaskStackBuilder.getPendingIntent] to deep link
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.kt
index db850b7..2ca6a8b1 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.kt
@@ -58,17 +58,17 @@
      * Sets the host's [OnBackPressedDispatcher]. If set, NavController will
      * register a [OnBackPressedCallback] to handle system Back button events.
      *
-     * You must explicitly called [.setLifecycleOwner] before calling this
+     * You must explicitly called [setLifecycleOwner] before calling this
      * method as the owner set there will be used as the [LifecycleOwner] for registering
      * the [OnBackPressedCallback].
      *
      * You can dynamically enable and disable whether the NavController should handle the
-     * system Back button events by calling [.enableOnBackPressed].
+     * system Back button events by calling [enableOnBackPressed].
      *
      * @param dispatcher The [OnBackPressedDispatcher] associated with the containing
      * [NavHost].
      * @throws IllegalStateException if you have not called
-     * [.setLifecycleOwner] before calling this method.
+     * [setLifecycleOwner] before calling this method.
      * @see NavHostController.setLifecycleOwner
      */
     public final override fun setOnBackPressedDispatcher(dispatcher: OnBackPressedDispatcher) {
@@ -87,15 +87,15 @@
 
     /**
      * Sets the host's ViewModelStore used by the NavController to store ViewModels at the
-     * navigation graph level. This is required to call [.getViewModelStoreOwner] and
+     * navigation graph level. This is required to call [getViewModelStoreOwner] and
      * should generally be called for you by your [NavHost].
      *
-     * You must call this method before [.setGraph] or similar methods, because the
+     * You must call this method before [setGraph] or similar methods, because the
      * [ViewModelStore] set here will be used by the created [NavBackStackEntry] items.
      *
      * @param viewModelStore ViewModelStore used to store ViewModels at the navigation graph level
      * @throws IllegalStateException if this method is called when graph was already set via
-     * [.setGraph] or similar methods.
+     * [setGraph] or similar methods.
      */
     public final override fun setViewModelStore(viewModelStore: ViewModelStore) {
         super.setViewModelStore(viewModelStore)
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/Navigation.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/Navigation.kt
index 9caf791..09b284a 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/Navigation.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/Navigation.kt
@@ -32,7 +32,7 @@
 public object Navigation {
     /**
      * Find a [NavController] given the id of a View and its containing
-     * [Activity]. This is a convenience wrapper around [.findNavController].
+     * [Activity]. This is a convenience wrapper around [findNavController].
      *
      * This method will locate the [NavController] associated with this view.
      * This is automatically populated for the id of a [NavHost] and its children.
@@ -104,13 +104,13 @@
 
     /**
      * Associates a NavController with the given View, allowing developers to use
-     * [.findNavController] and [.findNavController] with that
+     * [findNavController] and [findNavController] with that
      * View or any of its children to retrieve the NavController.
      *
      * This is generally called for you by the hosting [NavHost].
      * @param view View that should be associated with the given NavController
      * @param controller The controller you wish to later retrieve via
-     * [.findNavController]
+     * [findNavController]
      */
     @JvmStatic
     public fun setViewNavController(view: View, controller: NavController?) {
diff --git a/navigation/navigation-safe-args-generator/build.gradle b/navigation/navigation-safe-args-generator/build.gradle
index 757d8ed..22d143a 100644
--- a/navigation/navigation-safe-args-generator/build.gradle
+++ b/navigation/navigation-safe-args-generator/build.gradle
@@ -32,7 +32,7 @@
     implementation(KOTLIN_STDLIB)
 
     implementation(JAVAPOET)
-    implementation("com.squareup:kotlinpoet:1.7.2")
+    implementation(KOTLINPOET)
 
     testImplementation(JUNIT)
     testImplementation(GOOGLE_COMPILE_TESTING)
@@ -58,8 +58,8 @@
     it.classpath = files(classpath.minus(androidJar).plus(androidJar))
 }
 
-tasks.findByName("compileKotlin").dependsOn(":navigation:navigation-common:jarDebug")
-tasks.findByName("compileKotlin").dependsOn(":lifecycle:lifecycle-viewmodel-savedstate:jarDebug")
+tasks.findByName("compileKotlin").dependsOn(":navigation:navigation-common:jarRelease")
+tasks.findByName("compileKotlin").dependsOn(":lifecycle:lifecycle-viewmodel-savedstate:jarRelease")
 
 androidx {
     name = "Android Navigation TypeSafe Arguments Generator"
diff --git a/navigation/navigation-safe-args-generator/lint-baseline.xml b/navigation/navigation-safe-args-generator/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/navigation/navigation-safe-args-generator/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-safe-args-gradle-plugin/lint-baseline.xml b/navigation/navigation-safe-args-gradle-plugin/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/navigation/navigation-safe-args-gradle-plugin/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/SafeArgsPlugin.kt b/navigation/navigation-safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/SafeArgsPlugin.kt
index fe012d4..ef3a3e8 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/SafeArgsPlugin.kt
+++ b/navigation/navigation-safe-args-gradle-plugin/src/main/kotlin/androidx/navigation/safeargs/gradle/SafeArgsPlugin.kt
@@ -20,7 +20,6 @@
 import com.android.build.gradle.BaseExtension
 import com.android.build.gradle.LibraryExtension
 import com.android.build.gradle.api.BaseVariant
-import groovy.util.XmlSlurper
 import org.gradle.api.GradleException
 import org.gradle.api.Plugin
 import org.gradle.api.Project
@@ -104,7 +103,8 @@
         val mainSourceSet = sourceSets.find { it.name == "main" }
         val sourceSet = mainSourceSet ?: sourceSets[0]
         val manifest = sourceSet.manifestFile
-        val parsed = XmlSlurper(false, false).parse(manifest)
+        @Suppress("DEPRECATION") // b/181913965
+        val parsed = groovy.util.XmlSlurper(false, false).parse(manifest)
         parsed.getProperty("@package").toString()
     }
 
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 5a32c9d..45ecc19 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,11 +18,13 @@
 
 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 4e81b7d..359653a 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,11 +16,13 @@
 
 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 c937f2e..412ce2f 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,11 +16,13 @@
 
 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/src/main/res/values/strings.xml b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/src/main/res/values/strings.xml
rename to navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/src/main/res/values/donottranslate-strings.xml
diff --git a/navigation/navigation-testing/api/current.txt b/navigation/navigation-testing/api/current.txt
index 9e8e4f8..8fc24e8 100644
--- a/navigation/navigation-testing/api/current.txt
+++ b/navigation/navigation-testing/api/current.txt
@@ -6,8 +6,17 @@
     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);
+    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 9e8e4f8..8fc24e8 100644
--- a/navigation/navigation-testing/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-testing/api/public_plus_experimental_current.txt
@@ -6,8 +6,17 @@
     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);
+    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 9e8e4f8..8fc24e8 100644
--- a/navigation/navigation-testing/api/restricted_current.txt
+++ b/navigation/navigation-testing/api/restricted_current.txt
@@ -6,8 +6,17 @@
     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);
+    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/build.gradle b/navigation/navigation-testing/build.gradle
index 7981115..139c664 100644
--- a/navigation/navigation-testing/build.gradle
+++ b/navigation/navigation-testing/build.gradle
@@ -28,10 +28,11 @@
 }
 
 dependencies {
-    api(project(":navigation:navigation-runtime-ktx"))
+    api(project(":navigation:navigation-runtime"))
+    api("androidx.lifecycle:lifecycle-runtime-testing:2.3.1")
 
     androidTestImplementation(project(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/navigation/navigation-testing/lint-baseline.xml b/navigation/navigation-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
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
new file mode 100644
index 0000000..b20964e
--- /dev/null
+++ b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.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.navigation.testing
+
+import androidx.lifecycle.Lifecycle
+import androidx.navigation.FloatingWindow
+import androidx.navigation.NavDestination
+import androidx.navigation.Navigator
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class TestNavigatorStateTest {
+    private lateinit var state: TestNavigatorState
+
+    @Before
+    fun setUp() {
+        state = TestNavigatorState()
+    }
+
+    @Test
+    fun testLifecycle() {
+        val navigator = TestNavigator()
+        navigator.onAttach(state)
+        val firstEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.INITIALIZED)
+
+        navigator.navigate(listOf(firstEntry), null, null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        val secondEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        navigator.navigate(listOf(secondEntry), null, null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.CREATED)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        navigator.popBackStack(secondEntry, false)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.DESTROYED)
+    }
+
+    @Test
+    fun testFloatingWindowLifecycle() {
+        val navigator = FloatingWindowTestNavigator()
+        navigator.onAttach(state)
+        val firstEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.INITIALIZED)
+
+        navigator.navigate(listOf(firstEntry), null, null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        val secondEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        navigator.navigate(listOf(secondEntry), null, null)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.STARTED)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+
+        navigator.popBackStack(secondEntry, false)
+        assertThat(firstEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.RESUMED)
+        assertThat(secondEntry.lifecycle.currentState)
+            .isEqualTo(Lifecycle.State.DESTROYED)
+    }
+
+    @Navigator.Name("test")
+    internal class TestNavigator : Navigator<NavDestination>() {
+        override fun createDestination(): NavDestination = NavDestination(this)
+    }
+
+    @Navigator.Name("test")
+    internal class FloatingWindowTestNavigator : Navigator<FloatingTestDestination>() {
+        override fun createDestination(): FloatingTestDestination = FloatingTestDestination(this)
+    }
+
+    internal class FloatingTestDestination(
+        navigator: Navigator<out NavDestination>
+    ) : NavDestination(navigator), FloatingWindow
+}
\ No newline at end of file
diff --git a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavHostController.kt b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavHostController.kt
index ecf869a..8308c17 100644
--- a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavHostController.kt
+++ b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavHostController.kt
@@ -55,4 +55,24 @@
         val intent = taskStackBuilder.editIntentAt(0)
         require(handleDeepLink(intent)) { "Destination does not exist on the NavGraph." }
     }
+
+    /**
+     * Navigate directly to any destination on the current [androidx.navigation.NavGraph] via an
+     * explicit deep link. If an implicit deep link exists for this destination use
+     * [#navigate(Uri)] instead.
+     *
+     * @param destRoute The destination route to navigate to.
+     * @param args The arguments to pass to the destination.
+     * @throws IllegalArgumentException If the [destination][destRoute] does not exist on the
+     * NavGraph.
+     */
+    @JvmOverloads
+    public fun setCurrentDestination(destRoute: String, args: Bundle = Bundle()) {
+        val taskStackBuilder = createDeepLink()
+            .setDestination(destRoute)
+            .setArguments(args)
+            .createTaskStackBuilder()
+        val intent = taskStackBuilder.editIntentAt(0)
+        require(handleDeepLink(intent)) { "Destination does not exist on the NavGraph." }
+    }
 }
diff --git a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorProvider.kt b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorProvider.kt
index 62e9ba8..74efdb5 100644
--- a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorProvider.kt
+++ b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorProvider.kt
@@ -16,10 +16,8 @@
 
 package androidx.navigation.testing
 
-import android.os.Bundle
 import androidx.navigation.NavDestination
 import androidx.navigation.NavGraphNavigator
-import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
 import androidx.navigation.NavigatorProvider
 import java.lang.IllegalStateException
@@ -35,23 +33,11 @@
      */
     private val navigator = object : Navigator<NavDestination>() {
         override fun createDestination() = NavDestination("test")
-
-        override fun navigate(
-            destination: NavDestination,
-            args: Bundle?,
-            navOptions: NavOptions?,
-            navigatorExtras: Extras?
-        ): NavDestination? {
-            return destination
-        }
-
-        override fun popBackStack(): Boolean {
-            return true
-        }
     }
 
     init {
         addNavigator(NavGraphNavigator(this))
+        addNavigator("test", navigator)
     }
 
     override fun <T : Navigator<out NavDestination>> getNavigator(name: String): T {
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
new file mode 100644
index 0000000..9140e76
--- /dev/null
+++ b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
@@ -0,0 +1,139 @@
+/*
+ * 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.navigation.testing
+
+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
+import androidx.navigation.NavViewModelStoreProvider
+import androidx.navigation.NavigatorState
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+
+/**
+ * An implementation of [NavigatorState] that allows testing a
+ * [androidx.navigation.Navigator] in isolation (i.e., without requiring a
+ * [androidx.navigation.NavController]).
+ *
+ * An optional [context] can be provided to allow for the usages of
+ * [androidx.lifecycle.AndroidViewModel] within the created [NavBackStackEntry]
+ * instances.
+ *
+ * The [Lifecycle] of all [NavBackStackEntry] instances added to this TestNavigatorState
+ * will be updated as they are added and removed from the state. This work is kicked off
+ * on the [coroutineDispatcher].
+ */
+public class TestNavigatorState @JvmOverloads constructor(
+    private val context: Context? = null,
+    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(
+            backStackEntryId: String
+        ) = viewModelStores.getOrPut(backStackEntryId) {
+            ViewModelStore()
+        }
+    }
+
+    private val savedStates = mutableMapOf<String, Bundle>()
+
+    override fun createBackStackEntry(
+        destination: NavDestination,
+        arguments: Bundle?
+    ): NavBackStackEntry = NavBackStackEntry.create(
+        context, destination, arguments, lifecycleOwner, viewModelStoreProvider
+    )
+
+    /**
+     * Restore a previously saved [NavBackStackEntry]. You must have previously called
+     * [pop] with [previouslySavedEntry] and `true`.
+     */
+    public fun restoreBackStackEntry(previouslySavedEntry: NavBackStackEntry): NavBackStackEntry {
+        val savedState = checkNotNull(savedStates[previouslySavedEntry.id]) {
+            "restoreBackStackEntry(previouslySavedEntry) must be passed a NavBackStackEntry " +
+                "that was previously popped with popBackStack(previouslySavedEntry, true)"
+        }
+        return NavBackStackEntry.create(
+            context,
+            previouslySavedEntry.destination, previouslySavedEntry.arguments,
+            lifecycleOwner, viewModelStoreProvider,
+            previouslySavedEntry.id, savedState
+        )
+    }
+
+    override fun add(backStackEntry: NavBackStackEntry) {
+        super.add(backStackEntry)
+        updateMaxLifecycle()
+    }
+
+    override fun pop(popUpTo: NavBackStackEntry, saveState: Boolean) {
+        val beforePopList = backStack.value
+        val poppedList = beforePopList.subList(beforePopList.indexOf(popUpTo), beforePopList.size)
+        super.pop(popUpTo, saveState)
+        updateMaxLifecycle(poppedList, saveState)
+    }
+
+    private fun updateMaxLifecycle(
+        poppedList: List<NavBackStackEntry> = emptyList(),
+        saveState: Boolean = false
+    ) {
+        runBlocking(coroutineDispatcher) {
+            // NavBackStackEntry Lifecycles must be updated on the main thread
+            // as per the contract within Lifecycle, so we explicitly swap to the main thread
+            // no matter what CoroutineDispatcher was passed to us.
+            withContext(Dispatchers.Main.immediate) {
+                // Mark all removed NavBackStackEntries as DESTROYED
+                for (entry in poppedList.reversed()) {
+                    if (saveState) {
+                        // Move the NavBackStackEntry to the stopped state, then save its state
+                        entry.maxLifecycle = Lifecycle.State.CREATED
+                        val savedState = Bundle()
+                        entry.saveState(savedState)
+                        savedStates[entry.id] = savedState
+                    }
+                    entry.maxLifecycle = Lifecycle.State.DESTROYED
+                }
+                // Now go through the current list of destinations, updating their Lifecycle state
+                val currentList = backStack.value
+                var previousEntry: NavBackStackEntry? = null
+                for (entry in currentList.reversed()) {
+                    entry.maxLifecycle = when {
+                        previousEntry == null -> Lifecycle.State.RESUMED
+                        previousEntry.destination is FloatingWindow -> Lifecycle.State.STARTED
+                        else -> Lifecycle.State.CREATED
+                    }
+                    previousEntry = entry
+                }
+            }
+        }
+    }
+}
diff --git a/navigation/navigation-ui-ktx/lint-baseline.xml b/navigation/navigation-ui-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-ui-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index f8525004..ab64177 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -30,6 +30,9 @@
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
+    defaultConfig {
+        multiDexEnabled true
+    }
 }
 
 dependencies {
@@ -40,13 +43,14 @@
     implementation("androidx.transition:transition:1.3.0")
 
     androidTestImplementation(project(":internal-testutils-navigation"), {
-        exclude group: "androidx.navigation", module: "navigation-common-ktx"
+        exclude group: "androidx.navigation", module: "navigation-common"
     })
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(TRUTH)
+    androidTestImplementation(MULTIDEX)
 }
 
 androidx {
diff --git a/navigation/navigation-ui/lint-baseline.xml b/navigation/navigation-ui/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/navigation/navigation-ui/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/navigation/navigation-ui/src/androidTest/AndroidManifest.xml b/navigation/navigation-ui/src/androidTest/AndroidManifest.xml
index 40d9eb7..ed9f9a9 100644
--- a/navigation/navigation-ui/src/androidTest/AndroidManifest.xml
+++ b/navigation/navigation-ui/src/androidTest/AndroidManifest.xml
@@ -15,6 +15,7 @@
   ~ limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.navigation.ui">
+          package="androidx.navigation.ui"
+          android:name="androidx.multidex.MultiDexApplication">
 
 </manifest>
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
new file mode 100644
index 0000000..4fe3d282
--- /dev/null
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.navigation.ui
+
+import androidx.navigation.NavGraph
+import androidx.navigation.NavGraphNavigator
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.testutils.TestNavigator
+import androidx.testutils.TestNavigatorProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class NavigationUITest {
+    @Test
+    fun matchDestinationsTest() {
+        val destination = TestNavigator().createDestination().apply {
+            id = 1
+            parent = NavGraph(NavGraphNavigator(TestNavigatorProvider()))
+        }
+
+        assertThat(NavigationUI.matchDestinations(destination, setOf(1, 2))).isTrue()
+    }
+}
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 f929423..3f63801 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
@@ -159,7 +159,7 @@
      * destination. On the start destination of your navigation graph, the ActionBar will show
      * the drawer icon if the given Openable layout is non null. On all other destinations,
      * the ActionBar will show the Up button.
-     * Call [.navigateUp] to handle the Up button.
+     * Call [navigateUp] to handle the Up button.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
      *
@@ -193,7 +193,7 @@
      *
      * The [AppBarConfiguration] you provide controls how the Navigation button is
      * displayed.
-     * Call [.navigateUp] to handle the Up button.
+     * Call [navigateUp] to handle the Up button.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
      *
@@ -226,7 +226,7 @@
      * destination. On the start destination of your navigation graph, the Toolbar will show
      * the drawer icon if the given Openable layout is non null. On all other destinations,
      * the Toolbar will show the Up button. This method will call
-     * [.navigateUp] when the Navigation button is clicked.
+     * [navigateUp] when the Navigation button is clicked.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
      *
@@ -234,7 +234,7 @@
      * @param navController The NavController whose navigation actions will be reflected
      * in the title of the Toolbar.
      * @param openableLayout The Openable layout that should be toggled from the Navigation button
-     * @see .setupWithNavController
+     * @see setupWithNavController
      */
     @JvmStatic
     public fun setupWithNavController(
@@ -258,7 +258,7 @@
      *
      * The [AppBarConfiguration] you provide controls how the Navigation button is
      * displayed and what action is triggered when the Navigation button is tapped. This method
-     * will call [.navigateUp] when the Navigation button
+     * will call [navigateUp] when the Navigation button
      * is clicked.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
@@ -295,7 +295,7 @@
      * destination. On the start destination of your navigation graph, the Toolbar will show
      * the drawer icon if the given Openable layout is non null. On all other destinations,
      * the Toolbar will show the Up button. This method will call
-     * [.navigateUp] when the Navigation button is clicked.
+     * [navigateUp] when the Navigation button is clicked.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
      *
@@ -330,7 +330,7 @@
      *
      * The [AppBarConfiguration] you provide controls how the Navigation button is
      * displayed and what action is triggered when the Navigation button is tapped. This method
-     * will call [.navigateUp] when the Navigation button
+     * will call [navigateUp] when the Navigation button
      * is clicked.
      *
      * Destinations that implement [androidx.navigation.FloatingWindow] will be ignored.
@@ -362,7 +362,7 @@
 
     /**
      * Sets up a [NavigationView] for use with a [NavController]. This will call
-     * [.onNavDestinationSelected] when a menu item is selected.
+     * [onNavDestinationSelected] when a menu item is selected.
      * The selected item in the NavigationView will automatically be updated when the destination
      * changes.
      *
@@ -443,7 +443,7 @@
 
     /**
      * Sets up a [BottomNavigationView] for use with a [NavController]. This will call
-     * [.onNavDestinationSelected] when a menu item is selected. The
+     * [onNavDestinationSelected] when a menu item is selected. The
      * selected item in the BottomNavigationView will automatically be updated when the destination
      * changes.
      *
@@ -509,7 +509,7 @@
     @JvmStatic
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun matchDestinations(destination: NavDestination, destinationIds: Set<Int?>): Boolean =
-        generateSequence(destination) { it.parent }.all { destinationIds.contains(it.id) }
+        generateSequence(destination) { it.parent }.any { destinationIds.contains(it.id) }
 
     /**
      * Finds the actual start destination of the graph, handling cases where the graph's starting
@@ -518,9 +518,9 @@
     @JvmStatic
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun findStartDestination(graph: NavGraph): NavDestination =
-        generateSequence(graph.findNode(graph.startDestination)) {
+        generateSequence(graph.findNode(graph.startDestinationId)) {
             if (it is NavGraph) {
-                it.findNode(it.startDestination)
+                it.findNode(it.startDestinationId)
             } else {
                 null
             }
diff --git a/navigation/settings.gradle b/navigation/settings.gradle
index 6352fd2..ec9b1d1 100644
--- a/navigation/settings.gradle
+++ b/navigation/settings.gradle
@@ -21,7 +21,6 @@
 selectProjectsFromAndroidX({ name ->
     // Compose projects are not supported in playground yet
     if (name.startsWith(":navigation")) return true
-    if (name == ":activity:activity-compose") return true
     if (name == ":annotation:annotation-sampled") return true
     if (name == ":compose:integration-tests:demos:common") return true
     if (name == ":lifecycle:lifecycle-viewmodel-savedstate") return true
@@ -29,8 +28,8 @@
     if (name == ":internal-testutils-runtime") return true
     if (name == ":internal-testutils-truth") return true
     if (name == ":compose:lint:common") return true
-    if (name == ":compose:lint:internal-lint-checks") return true
     if (name == ":compose:test-utils") return true
+    if (name == ":compose:lint:internal-lint-checks") return true
     if (name == ":test-screenshot") return true
     return false
 })
diff --git a/paging/common/build.gradle b/paging/common/build.gradle
index 4d61a3f..ae0f19b 100644
--- a/paging/common/build.gradle
+++ b/paging/common/build.gradle
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("kotlin")
@@ -30,20 +26,20 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.arch.core:core-common:2.1.0")
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_CORE)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesCore)
 
-    testImplementation(JUNIT)
-    testImplementation(MOCKITO_CORE)
-    testImplementation(MOCKITO_KOTLIN, {
+    testImplementation(libs.junit)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.mockitoKotlin, {
         exclude group: "org.mockito" // to keep control on the mockito version
     })
     testImplementation(project(":internal-testutils-common"))
     testImplementation(project(":internal-testutils-ktx"))
     testImplementation(project(":internal-testutils-paging"))
-    testImplementation(KOTLIN_TEST)
-    testImplementation(KOTLIN_COROUTINES_TEST)
-    testImplementation(TRUTH)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.kotlinCoroutinesTest)
+    testImplementation(libs.truth)
 }
 
 androidx {
diff --git a/paging/common/ktx/build.gradle b/paging/common/ktx/build.gradle
index 36a2f66..f1c6ca8 100644
--- a/paging/common/ktx/build.gradle
+++ b/paging/common/ktx/build.gradle
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
-import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
 
 plugins {
diff --git a/paging/common/ktx/lint-baseline.xml b/paging/common/ktx/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/paging/common/ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
index 500558c..76ad766 100644
--- a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
@@ -93,7 +93,7 @@
  * can differentiate unloaded placeholder items from content that has been paged in.
  *
  * @param Key Unique identifier for item loaded from DataSource. Often an integer to represent
- * position in data set. Note - this is distinct from e.g. Room's `<Value> Value type
+ * position in data set. Note - this is distinct from e.g. Room's `<Value>` Value type
  * loaded by the DataSource.
  */
 public abstract class DataSource<Key : Any, Value : Any>
diff --git a/paging/common/src/main/kotlin/androidx/paging/LegacyPagingSource.kt b/paging/common/src/main/kotlin/androidx/paging/LegacyPagingSource.kt
index 0dec76a..cdf77c1 100644
--- a/paging/common/src/main/kotlin/androidx/paging/LegacyPagingSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/LegacyPagingSource.kt
@@ -16,6 +16,7 @@
 
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import androidx.paging.DataSource.KeyType.ITEM_KEYED
 import androidx.paging.DataSource.KeyType.PAGE_KEYED
 import androidx.paging.DataSource.KeyType.POSITIONAL
@@ -30,8 +31,11 @@
 
 /**
  * A wrapper around [DataSource] which adapts it to the [PagingSource] API.
+ *
+ * @hide
  */
-internal class LegacyPagingSource<Key : Any, Value : Any>(
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class LegacyPagingSource<Key : Any, Value : Any>(
     private val fetchDispatcher: CoroutineDispatcher,
     internal val dataSource: DataSource<Key, Value>
 ) : PagingSource<Key, Value>() {
@@ -60,7 +64,11 @@
         }
     }
 
-    fun setPageSize(pageSize: Int) {
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun setPageSize(pageSize: Int) {
         check(this.pageSize == PAGE_SIZE_NOT_SET || pageSize == this.pageSize) {
             "Page size is already set to ${this.pageSize}."
         }
@@ -147,7 +155,7 @@
     override val jumpingSupported: Boolean
         get() = dataSource.type == POSITIONAL
 
-    companion object {
-        const val PAGE_SIZE_NOT_SET = Integer.MIN_VALUE
+    private companion object {
+        private const val PAGE_SIZE_NOT_SET = Integer.MIN_VALUE
     }
 }
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
index 0dd12d2..39b8e5c 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
@@ -493,9 +493,11 @@
                 LegacyPagingSource(
                     fetchDispatcher = fetchDispatcher,
                     dataSource = dataSource
-                ).also {
-                    it.setPageSize(config.pageSize)
-                }
+                )
+            }
+
+            if (pagingSource is LegacyPagingSource) {
+                pagingSource.setPageSize(config.pageSize)
             }
 
             check(pagingSource != null) {
diff --git a/paging/guava/build.gradle b/paging/guava/build.gradle
index 9c323c6..0b21de1 100644
--- a/paging/guava/build.gradle
+++ b/paging/guava/build.gradle
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -30,15 +26,15 @@
 
 dependencies {
     api(project(":paging:paging-common"))
-    api(KOTLIN_STDLIB)
-    api(GUAVA_ANDROID)
-    implementation(KOTLIN_COROUTINES_GUAVA)
+    api(libs.kotlinStdlib)
+    api(libs.guavaAndroid)
+    implementation(libs.kotlinCoroutinesGuava)
 
     testImplementation(project(":internal-testutils-common"))
     testImplementation(project(":internal-testutils-paging"))
-    testImplementation(JUNIT)
-    testImplementation(KOTLIN_TEST)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.kotlinCoroutinesTest)
 }
 
 androidx {
diff --git a/paging/guava/lint-baseline.xml b/paging/guava/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/guava/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index 16c5130..4b067c3 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -14,12 +14,8 @@
  * limitations under the License.
  */
 
-
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.MULTIDEX
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.application")
@@ -38,11 +34,11 @@
 
     kapt(projectOrArtifact(":room:room-compiler"))
 
-    implementation(MULTIDEX)
+    implementation(libs.multidex)
     implementation(projectOrArtifact(":recyclerview:recyclerview"))
     implementation("androidx.fragment:fragment-ktx:1.3.0")
     implementation("androidx.appcompat:appcompat:1.1.0")
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 }
 
 kapt {
diff --git a/paging/integration-tests/testapp/lint-baseline.xml b/paging/integration-tests/testapp/lint-baseline.xml
index 3deda18..6d2337a 100644
--- a/paging/integration-tests/testapp/lint-baseline.xml
+++ b/paging/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnusedResources"
@@ -7,7 +7,7 @@
         errorLine1="    &lt;string name=&quot;error_occurred&quot;>An error occurred while loading.&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="22"
             column="13"/>
     </issue>
diff --git a/paging/integration-tests/testapp/src/main/res/values/strings.xml b/paging/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from paging/integration-tests/testapp/src/main/res/values/strings.xml
rename to paging/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/paging/paging-compose/build.gradle b/paging/paging-compose/build.gradle
index 3c21e24..669f393d3 100644
--- a/paging/paging-compose/build.gradle
+++ b/paging/paging-compose/build.gradle
@@ -19,8 +19,6 @@
 import androidx.build.Publish
 import androidx.build.RunApiTasks
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -32,16 +30,16 @@
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
 
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
     api(projectOrArtifact(":compose:foundation:foundation"))
-    api(projectOrArtifact(":paging:paging-common"))
+    api("androidx.paging:paging-common:3.0.0")
 
     androidTestImplementation(projectOrArtifact(":compose:ui:ui-test-junit4"))
-    androidTestImplementation(projectOrArtifact(":compose:test-utils"))
+    androidTestImplementation(project(":compose:test-utils"))
     androidTestImplementation(projectOrArtifact(":internal-testutils-paging"))
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(TRUTH)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.truth)
 }
 
 androidx {
diff --git a/paging/paging-compose/integration-tests/paging-demos/build.gradle b/paging/paging-compose/integration-tests/paging-demos/build.gradle
index fe7986fb..ef6e14d 100644
--- a/paging/paging-compose/integration-tests/paging-demos/build.gradle
+++ b/paging/paging-compose/integration-tests/paging-demos/build.gradle
@@ -14,11 +14,8 @@
  * limitations under the License.
  */
 
-
 import androidx.build.Publish
 
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -29,7 +26,7 @@
 
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     implementation(projectOrArtifact(":compose:integration-tests:demos:common"))
     implementation(projectOrArtifact(":compose:foundation:foundation"))
diff --git a/paging/paging-compose/samples/build.gradle b/paging/paging-compose/samples/build.gradle
index 3ae394a..cdf0963 100644
--- a/paging/paging-compose/samples/build.gradle
+++ b/paging/paging-compose/samples/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.LibraryVersions
 import androidx.build.LibraryType
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -29,7 +27,7 @@
 
 dependencies {
     kotlinPlugin(projectOrArtifact(":compose:compiler:compiler"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
     compileOnly(projectOrArtifact(":annotation:annotation-sampled"))
     implementation(projectOrArtifact(":compose:foundation:foundation"))
diff --git a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
index 0df5445..7a4302d 100644
--- a/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
+++ b/paging/paging-compose/src/main/java/androidx/paging/compose/LazyPagingItems.kt
@@ -48,10 +48,12 @@
  * This instance can be used by the [items] and [itemsIndexed] methods inside [LazyListScope] to
  * display data received from the [Flow] of [PagingData].
  *
- * @param flow the [Flow] object which contains a stream of [PagingData] elements.
  * @param T the type of value used by [PagingData].
  */
 public class LazyPagingItems<T : Any> internal constructor(
+    /**
+     * the [Flow] object which contains a stream of [PagingData] elements.
+     */
     private val flow: Flow<PagingData<T>>
 ) {
     private val mainDispatcher = Dispatchers.Main
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 1a8574a..32d8093 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -18,8 +18,6 @@
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -41,23 +39,23 @@
     api("androidx.lifecycle:lifecycle-runtime-ktx:2.2.0")
     api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0")
     api("androidx.recyclerview:recyclerview:1.2.0-rc01")
-    api(KOTLIN_STDLIB)
-    api(KOTLIN_COROUTINES_ANDROID)
+    api(libs.kotlinStdlib)
+    api(libs.kotlinCoroutinesAndroid)
     implementation("androidx.core:core-ktx:1.2.0")
 
     androidTestImplementation(project(":internal-testutils-common"))
     androidTestImplementation(project(":internal-testutils-ktx"))
     androidTestImplementation(project(":internal-testutils-paging"))
     androidTestImplementation(projectOrArtifact(":lifecycle:lifecycle-runtime-testing"))
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation("androidx.arch.core:core-testing:2.1.0")
-    androidTestImplementation(TRUTH)
-    androidTestImplementation(KOTLIN_TEST)
-    androidTestImplementation(KOTLIN_COROUTINES_TEST)
-    androidTestImplementation(JUNIT)
-    androidTestImplementation(MULTIDEX)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.kotlinTest)
+    androidTestImplementation(libs.kotlinCoroutinesTest)
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.multidex)
 }
 
 androidx {
diff --git a/paging/runtime/ktx/lint-baseline.xml b/paging/runtime/ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/runtime/ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/runtime/lint-baseline.xml b/paging/runtime/lint-baseline.xml
index 28704b3..d8e022b 100644
--- a/paging/runtime/lint-baseline.xml
+++ b/paging/runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="RestrictedApi"
diff --git a/paging/runtime/src/androidTest/java/androidx/paging/AsyncPagingDataDifferTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/AsyncPagingDataDifferTest.kt
index 69c49c0..7fd3cb8 100644
--- a/paging/runtime/src/androidTest/java/androidx/paging/AsyncPagingDataDifferTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/AsyncPagingDataDifferTest.kt
@@ -49,6 +49,8 @@
 import kotlin.test.assertTrue
 
 private class ListUpdateCapture : ListUpdateCallback {
+    private var lastEventsListIndex = -1
+
     val events = mutableListOf<ListUpdateEvent>()
 
     override fun onChanged(position: Int, count: Int, payload: Any?) {
@@ -66,6 +68,12 @@
     override fun onRemoved(position: Int, count: Int) {
         events.add(Removed(position, count))
     }
+
+    fun newEvents(): List<ListUpdateEvent> {
+        return events.drop(lastEventsListIndex + 1).also {
+            lastEventsListIndex = events.lastIndex
+        }
+    }
 }
 
 private sealed class ListUpdateEvent {
@@ -242,31 +250,41 @@
             // Load REFRESH [50, 51]
             advanceUntilIdle()
 
-            // Load END [52] to fulfill prefetch distance
+            assertEvents(
+                listOf(
+                    Inserted(0, 100), // [(50 placeholders), 50, 51, (48 placeholders)]
+                ),
+                listUpdateCapture.newEvents()
+            )
+
+            // Load APPEND [52] to fulfill prefetch distance
             differ.getItem(51)
             advanceUntilIdle()
 
+            assertEvents(
+                // TODO(b/182510751): Every change event here should have payload.
+                listOf(
+                    Changed(52, 1, null), // [(50 placeholders), 50, 51, 52, (47 placeholders)]
+                ),
+                listUpdateCapture.newEvents()
+            )
+
             // Load REFRESH [51, 52]
-            // Load START [50] to fulfill prefetch distance of transformed index
+            // Load PREPEND [50] to fulfill prefetch distance of transformed index
             currentPagedSource!!.invalidate()
             advanceUntilIdle()
 
-            // TODO every change event here should have payload and we should also not dispatch
-            //  events with 0 count
-            //  b/182510751
-            val expected = listOf(
-                Inserted(0, 100), // [(50 placeholders), 50, 51, (48 placeholders)]
-                Changed(52, 1, null), // [(50 placeholders), 50, 51, 52, (47 placeholders)]
-                Inserted(53, 0), // ignored
-                // refresh
-                Changed(50, 1, ITEM_TO_PLACEHOLDER), // 50 got unloaded
-                // fix prefetch, 50 got reloaded
-                Changed(50, 1, null), // [(50 placeholders), 50, 51, 52, (47 placeholders)]
-                Inserted(0, 0) // ignored
+            assertEvents(
+                // TODO(b/182510751): Every change event here should have payload.
+                listOf(
+                    // refresh
+                    Changed(50, 1, ITEM_TO_PLACEHOLDER), // 50 got unloaded
+                    // fix prefetch, 50 got reloaded
+                    Changed(50, 1, null), // [(50 placeholders), 50, 51, 52, (47 placeholders)]
+                ),
+                listUpdateCapture.newEvents()
             )
 
-            assertEvents(expected, listUpdateCapture.events)
-
             job.cancel()
         }
     }
diff --git a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
index e07551d..2b6ab75 100644
--- a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
@@ -27,8 +27,10 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.testutils.TestExecutor
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.Runnable
+import kotlinx.coroutines.asCoroutineDispatcher
 import org.junit.After
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotNull
@@ -260,6 +262,60 @@
         )
     }
 
+    @Test
+    fun legacyPagingSourcePageSize() {
+        val dataSources = mutableListOf<DataSource<Int, Int>>()
+        val pagedLists = mutableListOf<PagedList<Int>>()
+        val requestedLoadSizes = mutableListOf<Int>()
+        val livePagedList = LivePagedListBuilder(
+            pagingSourceFactory = object : DataSource.Factory<Int, Int>() {
+                override fun create(): DataSource<Int, Int> {
+                    return object : PositionalDataSource<Int>() {
+                        override fun loadInitial(
+                            params: LoadInitialParams,
+                            callback: LoadInitialCallback<Int>
+                        ) {
+                            requestedLoadSizes.add(params.requestedLoadSize)
+                            callback.onResult(listOf(1, 2, 3), 0)
+                        }
+
+                        override fun loadRange(
+                            params: LoadRangeParams,
+                            callback: LoadRangeCallback<Int>
+                        ) {
+                            requestedLoadSizes.add(params.loadSize)
+                        }
+                    }.also {
+                        dataSources.add(it)
+                    }
+                }
+            }.asPagingSourceFactory(backgroundExecutor.asCoroutineDispatcher()),
+            config = PagedList.Config.Builder()
+                .setPageSize(3)
+                .setInitialLoadSizeHint(3)
+                .setEnablePlaceholders(false)
+                .build()
+        ).setFetchExecutor(backgroundExecutor)
+            .build()
+
+        livePagedList.observeForever { pagedLists.add(it) }
+
+        drain()
+        assertThat(requestedLoadSizes).containsExactly(3)
+
+        pagedLists.last().loadAround(2)
+        drain()
+        assertThat(requestedLoadSizes).containsExactly(3, 3)
+
+        dataSources[0].invalidate()
+        drain()
+        assertThat(requestedLoadSizes).containsExactly(3, 3, 3)
+
+        pagedLists.last().loadAround(2)
+        drain()
+        assertThat(requestedLoadSizes).containsExactly(3, 3, 3, 3)
+    }
+
     private fun drain() {
         var executed: Boolean
         do {
diff --git a/paging/runtime/src/androidTest/java/androidx/paging/StateRestorationTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/StateRestorationTest.kt
index 93b09ea..9fe24ea 100644
--- a/paging/runtime/src/androidTest/java/androidx/paging/StateRestorationTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/StateRestorationTest.kt
@@ -193,9 +193,8 @@
             measureAndLayout()
             scrollToPosition(50)
             saveAndRestore()
-            assertThat(
-                layoutManager.restoredState
-            ).isFalse()
+            assertThat(layoutManager.restoredState).isFalse()
+
             val emptyPager = createPager(
                 pageSize = 10,
                 itemCount = 0,
@@ -203,9 +202,7 @@
             )
             collectPagesAsync(emptyPager.flow)
             measureAndLayout()
-            assertThat(
-                layoutManager.restoredState
-            ).isTrue()
+            assertThat(layoutManager.restoredState).isTrue()
         }
     }
 
diff --git a/paging/runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt b/paging/runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
index 6b08423..1ecdef3 100644
--- a/paging/runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
+++ b/paging/runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
@@ -49,15 +49,25 @@
     @Suppress("MemberVisibilityCanBePrivate") // synthetic access
     internal val differCallback = object : DifferCallback {
         override fun onInserted(position: Int, count: Int) {
-            updateCallback.onInserted(position, count)
+            // Ignore if count == 0 as it makes this event a no-op.
+            if (count > 0) {
+                updateCallback.onInserted(position, count)
+            }
         }
 
-        override fun onRemoved(position: Int, count: Int) =
-            updateCallback.onRemoved(position, count)
+        override fun onRemoved(position: Int, count: Int) {
+            // Ignore if count == 0 as it makes this event a no-op.
+            if (count > 0) {
+                updateCallback.onRemoved(position, count)
+            }
+        }
 
         override fun onChanged(position: Int, count: Int) {
-            // NOTE: pass a null payload to convey null -> item, or item -> null
-            updateCallback.onChanged(position, count, null)
+            // Ignore if count == 0 as it makes this event a no-op.
+            if (count > 0) {
+                // NOTE: pass a null payload to convey null -> item, or item -> null
+                updateCallback.onChanged(position, count, null)
+            }
         }
     }
 
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index 29cd5d2..e9b696a 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -75,6 +75,9 @@
             currentData.pagingSource.unregisterInvalidatedCallback(callback)
             val pagingSource = pagingSourceFactory()
             pagingSource.registerInvalidatedCallback(callback)
+            if (pagingSource is LegacyPagingSource) {
+                pagingSource.setPageSize(config.pageSize)
+            }
 
             withContext(notifyDispatcher) {
                 currentData.setInitialLoadState(REFRESH, Loading)
@@ -83,6 +86,7 @@
             @Suppress("UNCHECKED_CAST")
             val lastKey = currentData.lastKey as Key?
             val params = config.toRefreshLoadParams(lastKey)
+
             when (val initialResult = pagingSource.load(params)) {
                 is PagingSource.LoadResult.Error -> {
                     currentData.setInitialLoadState(
diff --git a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
index c22197b..ba7fec9 100644
--- a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
+++ b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
@@ -194,10 +194,10 @@
     /**
      * Called when the current PagedList is updated.
      *
-     * This may be dispatched as part of [.submitList] if a background diff isn't
+     * This may be dispatched as part of [submitList] if a background diff isn't
      * needed (such as when the first list is passed, or the list is cleared). In either case,
      * PagedListAdapter will simply call
-     * [notifyItemRangeInserted/Removed(0, mPreviousSize)][.notifyItemRangeInserted].
+     * [notifyItemRangeInserted/Removed(0, mPreviousSize)][notifyItemRangeInserted].
      *
      * This method will *not*be called when the Adapter switches from presenting a PagedList
      * to a snapshot version of the PagedList during a diff. This means you cannot observe each
@@ -217,7 +217,7 @@
     /**
      * Called when the current PagedList is updated.
      *
-     * This may be dispatched as part of [.submitList] if a background diff isn't
+     * This may be dispatched as part of [submitList] if a background diff isn't
      * needed (such as when the first list is passed, or the list is cleared). In either case,
      * PagedListAdapter will simply call
      * [notifyItemRangeInserted/Removed(0, mPreviousSize)][notifyItemRangeInserted].
diff --git a/paging/runtime/src/main/java/androidx/paging/PagingDataAdapter.kt b/paging/runtime/src/main/java/androidx/paging/PagingDataAdapter.kt
index ba0c9ed..d29fe4f 100644
--- a/paging/runtime/src/main/java/androidx/paging/PagingDataAdapter.kt
+++ b/paging/runtime/src/main/java/androidx/paging/PagingDataAdapter.kt
@@ -18,11 +18,14 @@
 
 import androidx.annotation.IntRange
 import androidx.lifecycle.Lifecycle
+import androidx.paging.LoadState.NotLoading
 import androidx.paging.LoadType.REFRESH
 import androidx.recyclerview.widget.AdapterListUpdateCallback
 import androidx.recyclerview.widget.ConcatAdapter
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy.ALLOW
+import androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy.PREVENT
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.Flow
@@ -61,29 +64,6 @@
     workerDispatcher: CoroutineDispatcher = Dispatchers.Default
 ) : RecyclerView.Adapter<VH>() {
 
-    init {
-        super.setStateRestorationPolicy(StateRestorationPolicy.PREVENT)
-        // prevent state restoration and then watch for the first insert event.
-        // differ calls this with the inserted page even when it is empty, which is what we want
-        // here
-        @Suppress("LeakingThis")
-        registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
-            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
-                considerAllowingStateRestoration()
-                unregisterAdapterDataObserver(this)
-                super.onItemRangeInserted(positionStart, itemCount)
-            }
-
-            private fun considerAllowingStateRestoration() {
-                if (stateRestorationPolicy == StateRestorationPolicy.PREVENT &&
-                    !userSetRestorationPolicy
-                ) {
-                    [email protected](StateRestorationPolicy.ALLOW)
-                }
-            }
-        })
-    }
-
     /**
      * Track whether developer called [setStateRestorationPolicy] or not to decide whether the
      * automated state restoration should apply or not.
@@ -102,6 +82,45 @@
         workerDispatcher = workerDispatcher
     )
 
+    init {
+        // Wait on state restoration until the first insert event.
+        super.setStateRestorationPolicy(PREVENT)
+
+        fun considerAllowingStateRestoration() {
+            if (stateRestorationPolicy == PREVENT && !userSetRestorationPolicy) {
+                [email protected] = ALLOW
+            }
+        }
+
+        // Watch for adapter insert before triggering state restoration. This is almost redundant
+        // with loadState below, but can handle cached case.
+        @Suppress("LeakingThis")
+        registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
+                considerAllowingStateRestoration()
+                unregisterAdapterDataObserver(this)
+                super.onItemRangeInserted(positionStart, itemCount)
+            }
+        })
+
+        // Watch for loadState update before triggering state restoration. This is almost
+        // redundant with data observer above, but can handle empty page case.
+        addLoadStateListener(object : Function1<CombinedLoadStates, Unit> {
+            // Ignore the first event we get, which is always the initial state, since we only
+            // want to observe for Insert events.
+            private var ignoreNextEvent = true
+
+            override fun invoke(loadStates: CombinedLoadStates) {
+                if (ignoreNextEvent) {
+                    ignoreNextEvent = false
+                } else if (loadStates.source.refresh is NotLoading) {
+                    considerAllowingStateRestoration()
+                    removeLoadStateListener(this)
+                }
+            }
+        })
+    }
+
     /**
      * Note: [getItemId] is final, because stable IDs are unnecessary and therefore unsupported.
      *
diff --git a/paging/rxjava2/build.gradle b/paging/rxjava2/build.gradle
index 4868a77..d7a7de6 100644
--- a/paging/rxjava2/build.gradle
+++ b/paging/rxjava2/build.gradle
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -31,19 +27,19 @@
 dependencies {
     api(project(":paging:paging-common"))
     api("androidx.arch.core:core-runtime:2.1.0")
-    api(RX_JAVA)
-    implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_COROUTINES_RX2)
+    api(libs.rxjava2)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.kotlinCoroutinesRx2)
 
     testImplementation(project(":internal-testutils-common"))
     testImplementation(project(":internal-testutils-paging"))
-    testImplementation(JUNIT)
-    testImplementation(KOTLIN_TEST)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.kotlinCoroutinesTest)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation("androidx.arch.core:core-testing:2.1.0")
 }
 
diff --git a/paging/rxjava2/ktx/build.gradle b/paging/rxjava2/ktx/build.gradle
index 1d5a68a..84384a3 100644
--- a/paging/rxjava2/ktx/build.gradle
+++ b/paging/rxjava2/ktx/build.gradle
@@ -30,13 +30,13 @@
     api(project(":paging:paging-rxjava2"))
     // Ensure that the -ktx dependency graph mirrors the Java dependency graph
     api(project(":paging:paging-common-ktx"))
-    implementation(KOTLIN_STDLIB)
+    implementation(libs.kotlinStdlib)
 
-    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(ANDROIDX_TEST_CORE)
-    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
     androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
-    androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(libs.espressoCore)
 }
 
 androidx {
diff --git a/paging/rxjava2/ktx/lint-baseline.xml b/paging/rxjava2/ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/rxjava2/ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/rxjava2/lint-baseline.xml b/paging/rxjava2/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/rxjava2/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
index d721431..9397d75 100644
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
@@ -391,6 +391,9 @@
                 currentData.pagingSource.unregisterInvalidatedCallback(callback)
                 val pagingSource = pagingSourceFactory()
                 pagingSource.registerInvalidatedCallback(callback)
+                if (pagingSource is LegacyPagingSource) {
+                    pagingSource.setPageSize(config.pageSize)
+                }
 
                 withContext(notifyDispatcher) {
                     currentData.setInitialLoadState(LoadType.REFRESH, Loading)
diff --git a/paging/rxjava3/api/current.txt b/paging/rxjava3/api/current.txt
index 45bdff1f..d59dff25 100644
--- a/paging/rxjava3/api/current.txt
+++ b/paging/rxjava3/api/current.txt
@@ -15,6 +15,30 @@
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
   }
 
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+  }
+
   public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
     ctor public RxPagingSource();
     method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
diff --git a/paging/rxjava3/api/public_plus_experimental_current.txt b/paging/rxjava3/api/public_plus_experimental_current.txt
index a6ca4be..d487301 100644
--- a/paging/rxjava3/api/public_plus_experimental_current.txt
+++ b/paging/rxjava3/api/public_plus_experimental_current.txt
@@ -23,6 +23,30 @@
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
   }
 
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+  }
+
   public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
     ctor public RxPagingSource();
     method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
diff --git a/paging/rxjava3/api/restricted_current.txt b/paging/rxjava3/api/restricted_current.txt
index 45bdff1f..d59dff25 100644
--- a/paging/rxjava3/api/restricted_current.txt
+++ b/paging/rxjava3/api/restricted_current.txt
@@ -15,6 +15,30 @@
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
   }
 
+  @Deprecated public final class RxPagedListBuilder<Key, Value> {
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+    ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+    method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+    method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+  }
+
+  public final class RxPagedListKt {
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+    method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+  }
+
   public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
     ctor public RxPagingSource();
     method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
diff --git a/paging/rxjava3/build.gradle b/paging/rxjava3/build.gradle
index 3d8012e..5b5bf91 100644
--- a/paging/rxjava3/build.gradle
+++ b/paging/rxjava3/build.gradle
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-
-import androidx.build.AndroidXExtension
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -31,15 +27,20 @@
 dependencies {
     api(project(":paging:paging-common"))
     api("androidx.arch.core:core-runtime:2.1.0")
-    api(RX_JAVA3)
-    implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_COROUTINES_RX3)
+    api(libs.rxjava3)
+    implementation(libs.kotlinStdlib)
+    implementation(libs.kotlinCoroutinesRx3)
 
     testImplementation(project(":internal-testutils-common"))
     testImplementation(project(":internal-testutils-paging"))
-    testImplementation(JUNIT)
-    testImplementation(KOTLIN_TEST)
-    testImplementation(KOTLIN_COROUTINES_TEST)
+    testImplementation(libs.junit)
+    testImplementation(libs.kotlinTest)
+    testImplementation(libs.kotlinCoroutinesTest)
+
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation("androidx.arch.core:core-testing:2.1.0")
 }
 
 androidx {
diff --git a/paging/rxjava3/lint-baseline.xml b/paging/rxjava3/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/rxjava3/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/rxjava3/src/androidTest/AndroidManifest.xml b/paging/rxjava3/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..2788f86
--- /dev/null
+++ b/paging/rxjava3/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest package="androidx.paging.rxjava3"/>
diff --git a/paging/rxjava3/src/androidTest/java/androidx/paging/RxPagedListTest.kt b/paging/rxjava3/src/androidTest/java/androidx/paging/RxPagedListTest.kt
new file mode 100644
index 0000000..becbace
--- /dev/null
+++ b/paging/rxjava3/src/androidTest/java/androidx/paging/RxPagedListTest.kt
@@ -0,0 +1,94 @@
+/*
+ * 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.paging
+
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import androidx.paging.rxjava3.toFlowable
+import androidx.paging.rxjava3.toObservable
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class RxPagedListTest {
+    @JvmField
+    @Rule
+    val instantTaskExecutorRule = InstantTaskExecutorRule()
+
+    @Test
+    fun observable_config() {
+        @Suppress("DEPRECATION")
+        val observable = dataSourceFactory.toObservable(config)
+        val first = observable.blockingFirst()
+        assertNotNull(first)
+        assertEquals(config, first.config)
+    }
+
+    @Test
+    fun observable_pageSize() {
+        @Suppress("DEPRECATION")
+        val observable = dataSourceFactory.toObservable(20)
+        val first = observable.blockingFirst()
+        assertNotNull(first)
+        assertEquals(20, first.config.pageSize)
+    }
+
+    @Test
+    fun flowable_config() {
+        @Suppress("DEPRECATION")
+        val flowable = dataSourceFactory.toFlowable(config)
+        val first = flowable.blockingFirst()
+        assertNotNull(first)
+        assertEquals(config, first.config)
+    }
+
+    @Test
+    fun flowable_pageSize() {
+        @Suppress("DEPRECATION")
+        val flowable = dataSourceFactory.toFlowable(20)
+        val first = flowable.blockingFirst()
+        assertNotNull(first)
+        assertEquals(20, first.config.pageSize)
+    }
+
+    companion object {
+        @Suppress("DEPRECATION")
+        private val dataSource = object : PositionalDataSource<String>() {
+            override fun loadInitial(
+                params: LoadInitialParams,
+                callback: LoadInitialCallback<String>
+            ) {
+                callback.onResult(listOf(), 0, 0)
+            }
+
+            override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<String>) {
+                // never completes...
+            }
+        }
+
+        private val dataSourceFactory = object : DataSource.Factory<Int, String>() {
+            override fun create() = dataSource
+        }
+
+        private val config = Config(10)
+    }
+}
diff --git a/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedList.kt b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedList.kt
new file mode 100644
index 0000000..7923b35
--- /dev/null
+++ b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedList.kt
@@ -0,0 +1,502 @@
+/*
+ * 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.paging.rxjava3
+
+import androidx.paging.Config
+import androidx.paging.DataSource
+import androidx.paging.PagedList
+import androidx.paging.PagingSource
+import io.reactivex.rxjava3.core.BackpressureStrategy
+import io.reactivex.rxjava3.core.Flowable
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.core.Scheduler
+
+@Suppress("DEPRECATION")
+private fun <Key : Any, Value : Any> createRxPagedListBuilder(
+    dataSourceFactory: DataSource.Factory<Key, Value>,
+    config: PagedList.Config,
+    initialLoadKey: Key?,
+    boundaryCallback: PagedList.BoundaryCallback<Value>?,
+    fetchScheduler: Scheduler?,
+    notifyScheduler: Scheduler?
+): RxPagedListBuilder<Key, Value> {
+    val builder = RxPagedListBuilder(dataSourceFactory, config)
+        .setInitialLoadKey(initialLoadKey)
+        .setBoundaryCallback(boundaryCallback)
+    if (fetchScheduler != null) builder.setFetchScheduler(fetchScheduler)
+    if (notifyScheduler != null) builder.setNotifyScheduler(notifyScheduler)
+    return builder
+}
+
+@Suppress("DEPRECATION")
+private fun <Key : Any, Value : Any> createRxPagedListBuilder(
+    pagingSourceFactory: () -> PagingSource<Key, Value>,
+    config: PagedList.Config,
+    initialLoadKey: Key?,
+    boundaryCallback: PagedList.BoundaryCallback<Value>?,
+    fetchScheduler: Scheduler?,
+    notifyScheduler: Scheduler?
+): RxPagedListBuilder<Key, Value> {
+    val builder = RxPagedListBuilder(pagingSourceFactory, config)
+        .setInitialLoadKey(initialLoadKey)
+        .setBoundaryCallback(boundaryCallback)
+    if (fetchScheduler != null) builder.setFetchScheduler(fetchScheduler)
+    if (notifyScheduler != null) builder.setNotifyScheduler(notifyScheduler)
+    return builder
+}
+
+/**
+ * Constructs a `Observable<PagedList>` from this [DataSource.Factory], convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Observable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [DataSource].
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [DataSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ *
+ * @see RxPagedListBuilder
+ * @see toFlowable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(
+                config.pageSize,
+                config.prefetchDistance,
+                config.enablePlaceholders,
+                config.initialLoadSizeHint,
+                config.maxSize
+            ),
+            initialLoadKey,
+            this.asPagingSourceFactory(fetchScheduler?.asCoroutineDispatcher() ?: Dispatchers.IO)
+        ).observable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.observable",
+        "kotlinx.coroutines.rx3.asCoroutineDispatcher",
+        "kotlinx.coroutines.Dispatchers"
+    )
+)
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toObservable(
+    config: PagedList.Config,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null
+): Observable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        dataSourceFactory = this,
+        config = config,
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildObservable()
+}
+
+/**
+ * Constructs a `Observable<PagedList>` from this [DataSource.Factory], convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Observable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param pageSize Size of pages to load.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [DataSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [DataSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ *
+ * @see RxPagedListBuilder
+ * @see toFlowable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(pageSize),
+            initialLoadKey,
+            this.asPagingSourceFactory(fetchScheduler?.asCoroutineDispatcher() ?: Dispatchers.IO)
+        ).observable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.observable",
+        "kotlinx.coroutines.rx3.asCoroutineDispatcher",
+        "kotlinx.coroutines.Dispatchers"
+    )
+)
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toObservable(
+    pageSize: Int,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null
+): Observable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        dataSourceFactory = this,
+        config = Config(pageSize),
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildObservable()
+}
+
+/**
+ * Constructs a `Flowable<PagedList>`, from this [DataSource.Factory], convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Flowable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [DataSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [DataSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ * @param backpressureStrategy [BackpressureStrategy] for the [Flowable] to use.
+ *
+ * @see RxPagedListBuilder
+ * @see toObservable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(
+                config.pageSize,
+                config.prefetchDistance,
+                config.enablePlaceholders,
+                config.initialLoadSizeHint,
+                config.maxSize
+            ),
+            initialLoadKey,
+            this.asPagingSourceFactory(fetchScheduler?.asCoroutineDispatcher() ?: Dispatchers.IO)
+        ).flowable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.flowable",
+        "kotlinx.coroutines.rx3.asCoroutineDispatcher",
+        "kotlinx.coroutines.Dispatchers"
+    )
+)
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toFlowable(
+    config: PagedList.Config,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null,
+    backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
+): Flowable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        dataSourceFactory = this,
+        config = config,
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildFlowable(backpressureStrategy)
+}
+
+/**
+ * Constructs a `Flowable<PagedList>`, from this [DataSource.Factory], convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Flowable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param pageSize Page size.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [DataSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [DataSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ * @param backpressureStrategy [BackpressureStrategy] for the [Flowable] to use.
+ *
+ * @see RxPagedListBuilder
+ * @see toObservable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(pageSize),
+            initialLoadKey,
+            this.asPagingSourceFactory(fetchScheduler?.asCoroutineDispatcher() ?: Dispatchers.IO)
+        ).flowable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.flowable",
+        "kotlinx.coroutines.rx3.asCoroutineDispatcher",
+        "kotlinx.coroutines.Dispatchers"
+    )
+)
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toFlowable(
+    pageSize: Int,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null,
+    backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
+): Flowable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        dataSourceFactory = this,
+        config = Config(pageSize),
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildFlowable(backpressureStrategy)
+}
+
+/**
+ * Constructs a `Observable<PagedList>` from this [PagingSource] factory, convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Observable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [PagingSource].
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [PagingSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ *
+ * @see RxPagedListBuilder
+ * @see toFlowable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(
+                config.pageSize,
+                config.prefetchDistance,
+                config.enablePlaceholders,
+                config.initialLoadSizeHint,
+                config.maxSize
+            ),
+            initialLoadKey,
+            this.asPagingSourceFactory(fetchScheduler?.asCoroutineDispatcher() ?: Dispatchers.IO)
+        ).observable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.observable",
+        "kotlinx.coroutines.rx3.asCoroutineDispatcher",
+        "kotlinx.coroutines.Dispatchers"
+    )
+)
+fun <Key : Any, Value : Any> (() -> PagingSource<Key, Value>).toObservable(
+    config: PagedList.Config,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null
+): Observable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        pagingSourceFactory = this,
+        config = config,
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildObservable()
+}
+
+/**
+ * Constructs a `Observable<PagedList>` from this [PagingSource] factory, convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Observable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param pageSize Size of pages to load.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [PagingSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [PagingSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ *
+ * @see RxPagedListBuilder
+ * @see toFlowable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(pageSize),
+            initialLoadKey,
+            this
+        ).observable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.observable"
+    )
+)
+fun <Key : Any, Value : Any> (() -> PagingSource<Key, Value>).toObservable(
+    pageSize: Int,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null
+): Observable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        pagingSourceFactory = this,
+        config = Config(pageSize),
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildObservable()
+}
+
+/**
+ * Constructs a `Flowable<PagedList>`, from this [PagingSource] factory, convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Flowable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [PagingSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [PagingSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ * @param backpressureStrategy [BackpressureStrategy] for the [Flowable] to use.
+ *
+ * @see RxPagedListBuilder
+ * @see toObservable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(
+                config.pageSize,
+                config.prefetchDistance,
+                config.enablePlaceholders,
+                config.initialLoadSizeHint,
+                config.maxSize
+            ),
+            initialLoadKey,
+            this
+        ).flowable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.flowable"
+    )
+)
+fun <Key : Any, Value : Any> (() -> PagingSource<Key, Value>).toFlowable(
+    config: PagedList.Config,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null,
+    backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
+): Flowable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        pagingSourceFactory = this,
+        config = config,
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildFlowable(backpressureStrategy)
+}
+
+/**
+ * Constructs a `Flowable<PagedList>`, from this [PagingSource] factory, convenience for
+ * [RxPagedListBuilder].
+ *
+ * The returned [Flowable] will already be subscribed on the [fetchScheduler], and will perform
+ * all loading on that scheduler. It will already be observed on [notifyScheduler], and will
+ * dispatch new [PagedList]s, as well as their updates to that scheduler.
+ *
+ * @param pageSize Page size.
+ * @param initialLoadKey Initial load key passed to the first [PagedList] / [PagingSource].
+ * @param boundaryCallback The boundary callback for listening to [PagedList] load state.
+ * @param notifyScheduler [Scheduler] that receives [PagedList] updates, and where
+ * [PagedList.Callback] calls are dispatched. Generally, this is the UI / main thread.
+ * @param fetchScheduler [Scheduler] used to fetch from [PagingSource]s, generally a background
+ * thread pool for e.g. I/O or network loading.
+ * @param backpressureStrategy [BackpressureStrategy] for the [Flowable] to use.
+ *
+ * @see RxPagedListBuilder
+ * @see toObservable
+ */
+@Suppress("DEPRECATION")
+@Deprecated(
+    message = "PagedList is deprecated and has been replaced by PagingData",
+    replaceWith = ReplaceWith(
+        """Pager(
+            PagingConfig(pageSize),
+            initialLoadKey,
+            this
+        ).flowable""",
+        "androidx.paging.Pager",
+        "androidx.paging.PagingConfig",
+        "androidx.paging.rxjava3.flowable"
+    )
+)
+fun <Key : Any, Value : Any> (() -> PagingSource<Key, Value>).toFlowable(
+    pageSize: Int,
+    initialLoadKey: Key? = null,
+    boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+    fetchScheduler: Scheduler? = null,
+    notifyScheduler: Scheduler? = null,
+    backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
+): Flowable<PagedList<Value>> {
+    return createRxPagedListBuilder(
+        pagingSourceFactory = this,
+        config = Config(pageSize),
+        initialLoadKey = initialLoadKey,
+        boundaryCallback = boundaryCallback,
+        fetchScheduler = fetchScheduler,
+        notifyScheduler = notifyScheduler
+    ).buildFlowable(backpressureStrategy)
+}
diff --git a/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedListBuilder.kt b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedListBuilder.kt
new file mode 100644
index 0000000..0a48711
--- /dev/null
+++ b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/RxPagedListBuilder.kt
@@ -0,0 +1,445 @@
+/*
+ * 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.paging.rxjava3
+
+import android.annotation.SuppressLint
+import androidx.arch.core.executor.ArchTaskExecutor
+import androidx.paging.DataSource
+import androidx.paging.InitialPagedList
+import androidx.paging.InitialPagingSource
+import androidx.paging.LegacyPagingSource
+import androidx.paging.LoadState
+import androidx.paging.LoadState.Loading
+import androidx.paging.LoadType
+import androidx.paging.PagedList
+import androidx.paging.PagingSource
+import androidx.paging.toRefreshLoadParams
+import io.reactivex.rxjava3.core.BackpressureStrategy
+import io.reactivex.rxjava3.core.Flowable
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.core.ObservableEmitter
+import io.reactivex.rxjava3.core.ObservableOnSubscribe
+import io.reactivex.rxjava3.core.Scheduler
+import io.reactivex.rxjava3.functions.Cancellable
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.rx3.SchedulerCoroutineDispatcher
+import kotlinx.coroutines.rx3.asCoroutineDispatcher
+import kotlinx.coroutines.withContext
+
+/**
+ * Builder for `Observable<PagedList>` or `Flowable<PagedList>`, given a [DataSource.Factory] and a
+ * [PagedList.Config].
+ *
+ * The required parameters are in the constructor, so you can simply construct and build, or
+ * optionally enable extra features (such as initial load key, or BoundaryCallback).
+ *
+ * The returned observable/flowable will already be subscribed on the [setFetchScheduler], and will
+ * perform all loading on that scheduler. It will already be observed on [setNotifyScheduler], and
+ * will dispatch new PagedLists, as well as their updates to that scheduler.
+ *
+ * @param Key Type of input valued used to load data from the [DataSource]. Must be integer if
+ * you're using [PositionalDataSource].
+ * @param Value Item type being presented.
+ *
+ */
+@Deprecated("PagedList is deprecated and has been replaced by PagingData")
+class RxPagedListBuilder<Key : Any, Value : Any> {
+    private val pagingSourceFactory: (() -> PagingSource<Key, Value>)?
+    private val dataSourceFactory: DataSource.Factory<Key, Value>?
+
+    @Suppress("DEPRECATION")
+    private val config: PagedList.Config
+
+    private var initialLoadKey: Key? = null
+
+    @Suppress("DEPRECATION")
+    private var boundaryCallback: PagedList.BoundaryCallback<Value>? = null
+    private var notifyDispatcher: SchedulerCoroutineDispatcher? = null
+    private var notifyScheduler: Scheduler? = null
+    private var fetchDispatcher: SchedulerCoroutineDispatcher? = null
+    private var fetchScheduler: Scheduler? = null
+
+    /**
+     * Creates a [RxPagedListBuilder] with required parameters.
+     *
+     * @param pagingSourceFactory DataSource factory providing DataSource generations.
+     * @param config Paging configuration.
+     */
+    @Deprecated(
+        message = "PagedList is deprecated and has been replaced by PagingData",
+        replaceWith = ReplaceWith(
+            """Pager(
+                config = PagingConfig(
+                    config.pageSize,
+                    config.prefetchDistance,
+                    config.enablePlaceholders,
+                    config.initialLoadSizeHint,
+                    config.maxSize
+                ),
+                initialKey = null,
+                pagingSourceFactory = pagingSourceFactory
+            ).flowable""",
+            "androidx.paging.PagingConfig",
+            "androidx.paging.Pager",
+            "androidx.paging.rxjava3.flowable"
+        )
+    )
+    constructor(
+        pagingSourceFactory: () -> PagingSource<Key, Value>,
+        @Suppress("DEPRECATION") config: PagedList.Config
+    ) {
+        this.pagingSourceFactory = pagingSourceFactory
+        this.dataSourceFactory = null
+        this.config = config
+    }
+
+    /**
+     * Creates a [RxPagedListBuilder] with required parameters.
+     *
+     * This method is a convenience for:
+     * ```
+     * RxPagedListBuilder(
+     *     pagingSourceFactory,
+     *     PagedList.Config.Builder().setPageSize(pageSize).build()
+     * )
+     * ```
+     *
+     * @param pagingSourceFactory [PagingSource] factory providing [PagingSource] generations.
+     * @param pageSize Size of pages to load.
+     */
+    @Suppress("DEPRECATION")
+    @Deprecated(
+        message = "PagedList is deprecated and has been replaced by PagingData",
+        replaceWith = ReplaceWith(
+            """Pager(
+                config = PagingConfig(pageSize),
+                initialKey = null,
+                pagingSourceFactory = pagingSourceFactory
+            ).flowable""",
+            "androidx.paging.PagingConfig",
+            "androidx.paging.Pager",
+            "androidx.paging.rxjava3.flowable"
+        )
+    )
+    constructor(pagingSourceFactory: () -> PagingSource<Key, Value>, pageSize: Int) : this(
+        pagingSourceFactory,
+        PagedList.Config.Builder().setPageSize(pageSize).build()
+    )
+
+    /**
+     * Creates a [RxPagedListBuilder] with required parameters.
+     *
+     * @param dataSourceFactory DataSource factory providing DataSource generations.
+     * @param config Paging configuration.
+     */
+    @Deprecated(
+        message = "PagedList is deprecated and has been replaced by PagingData",
+        replaceWith = ReplaceWith(
+            """Pager(
+                config = PagingConfig(
+                    config.pageSize,
+                    config.prefetchDistance,
+                    config.enablePlaceholders,
+                    config.initialLoadSizeHint,
+                    config.maxSize
+                ),
+                initialKey = null,
+                pagingSourceFactory = dataSourceFactory.asPagingSourceFactory(Dispatchers.IO)
+            ).flowable""",
+            "androidx.paging.PagingConfig",
+            "androidx.paging.Pager",
+            "androidx.paging.rxjava3.flowable",
+            "kotlinx.coroutines.Dispatchers"
+        )
+    )
+    constructor(
+        dataSourceFactory: DataSource.Factory<Key, Value>,
+        @Suppress("DEPRECATION") config: PagedList.Config
+    ) {
+        this.pagingSourceFactory = null
+        this.dataSourceFactory = dataSourceFactory
+        this.config = config
+    }
+
+    /**
+     * Creates a [RxPagedListBuilder] with required parameters.
+     *
+     * This method is a convenience for:
+     * ```
+     * RxPagedListBuilder(
+     *     dataSourceFactory,
+     *     PagedList.Config.Builder().setPageSize(pageSize).build()
+     * )
+     * ```
+     *
+     * @param dataSourceFactory [DataSource.Factory] providing DataSource generations.
+     * @param pageSize Size of pages to load.
+     */
+    @Suppress("DEPRECATION")
+    @Deprecated(
+        message = "PagedList is deprecated and has been replaced by PagingData",
+        replaceWith = ReplaceWith(
+            """Pager(
+                config = PagingConfig(pageSize),
+                initialKey = null,
+                pagingSourceFactory = dataSourceFactory.asPagingSourceFactory(Dispatchers.IO)
+            ).flowable""",
+            "androidx.paging.PagingConfig",
+            "androidx.paging.Pager",
+            "androidx.paging.rxjava3.flowable",
+            "kotlinx.coroutines.Dispatchers"
+        )
+    )
+    constructor(
+        dataSourceFactory: DataSource.Factory<Key, Value>,
+        pageSize: Int
+    ) : this(
+        dataSourceFactory,
+        PagedList.Config.Builder().setPageSize(pageSize).build()
+    )
+
+    /**
+     * First loading key passed to the first PagedList/DataSource.
+     *
+     * When a new PagedList/DataSource pair is created after the first, it acquires a load key from
+     * the previous generation so that data is loaded around the position already being observed.
+     *
+     * @param key Initial load key passed to the first PagedList/DataSource.
+     * @return this
+     */
+    fun setInitialLoadKey(key: Key?) = apply {
+        initialLoadKey = key
+    }
+
+    /**
+     * Sets a [androidx.paging.PagedList.BoundaryCallback] on each PagedList created,
+     * typically used to load additional data from network when paging from local storage.
+     *
+     * Pass a BoundaryCallback to listen to when the PagedList runs out of data to load. If this
+     * method is not called, or `null` is passed, you will not be notified when each
+     * DataSource runs out of data to provide to its PagedList.
+     *
+     * If you are paging from a DataSource.Factory backed by local storage, you can set a
+     * BoundaryCallback to know when there is no more information to page from local storage.
+     * This is useful to page from the network when local storage is a cache of network data.
+     *
+     * Note that when using a BoundaryCallback with a `Observable<PagedList>`, method calls
+     * on the callback may be dispatched multiple times - one for each PagedList/DataSource
+     * pair. If loading network data from a BoundaryCallback, you should prevent multiple
+     * dispatches of the same method from triggering multiple simultaneous network loads.
+     *
+     * @param boundaryCallback The boundary callback for listening to PagedList load state.
+     * @return this
+     */
+    fun setBoundaryCallback(
+        @Suppress("DEPRECATION") boundaryCallback: PagedList.BoundaryCallback<Value>?
+    ) = apply { this.boundaryCallback = boundaryCallback }
+
+    /**
+     * Sets scheduler which will be used for observing new PagedLists, as well as loading updates
+     * within the PagedLists.
+     *
+     * If not set, defaults to the UI thread.
+     *
+     * The built [Observable] / [Flowable] will be observed on this scheduler, so that the thread
+     * receiving PagedLists will also receive the internal updates to the PagedList.
+     *
+     * @param scheduler Scheduler that receives PagedList updates, and where [PagedList.Callback]
+     * calls are dispatched. Generally, this is the UI/main thread.
+     * @return this
+     */
+    fun setNotifyScheduler(scheduler: Scheduler) = apply {
+        notifyScheduler = scheduler
+        notifyDispatcher = scheduler.asCoroutineDispatcher()
+    }
+
+    /**
+     * Sets scheduler which will be used for background fetching of PagedLists, as well as on-demand
+     * fetching of pages inside.
+     *
+     * If not set, defaults to the Arch components I/O thread pool.
+     *
+     * The built [Observable] / [Flowable] will be subscribed on this scheduler.
+     *
+     * @param scheduler [Scheduler] used to fetch from DataSources, generally a background thread
+     * pool for e.g. I/O or network loading.
+     * @return this
+     */
+    fun setFetchScheduler(scheduler: Scheduler) = apply {
+        fetchScheduler = scheduler
+        fetchDispatcher = scheduler.asCoroutineDispatcher()
+    }
+
+    /**
+     * Constructs a `Observable<PagedList>`.
+     *
+     * The returned Observable will already be observed on the [notifyScheduler], and subscribed on
+     * the [fetchScheduler].
+     *
+     * @return The [Observable] of PagedLists
+     */
+    @Suppress("BuilderSetStyle", "DEPRECATION")
+    fun buildObservable(): Observable<PagedList<Value>> {
+        @SuppressLint("RestrictedApi")
+        val notifyScheduler = notifyScheduler
+            ?: ScheduledExecutor(ArchTaskExecutor.getMainThreadExecutor())
+        val notifyDispatcher = notifyDispatcher ?: notifyScheduler.asCoroutineDispatcher()
+
+        @SuppressLint("RestrictedApi")
+        val fetchScheduler = fetchScheduler
+            ?: ScheduledExecutor(ArchTaskExecutor.getIOThreadExecutor())
+        val fetchDispatcher = fetchDispatcher ?: fetchScheduler.asCoroutineDispatcher()
+
+        val pagingSourceFactory = pagingSourceFactory
+            ?: dataSourceFactory?.asPagingSourceFactory(fetchDispatcher)
+
+        check(pagingSourceFactory != null) {
+            "RxPagedList cannot be built without a PagingSourceFactory or DataSource.Factory"
+        }
+
+        return Observable
+            .create(
+                PagingObservableOnSubscribe(
+                    initialLoadKey,
+                    config,
+                    boundaryCallback,
+                    pagingSourceFactory,
+                    notifyDispatcher,
+                    fetchDispatcher
+                )
+            )
+            .observeOn(notifyScheduler)
+            .subscribeOn(fetchScheduler)
+    }
+
+    /**
+     * Constructs a `Flowable<PagedList>`.
+     *
+     * The returned Observable will already be observed on the [notifyScheduler], and subscribed on
+     * the [fetchScheduler].
+     *
+     * @param backpressureStrategy BackpressureStrategy for the [Flowable] to use.
+     * @return The [Flowable] of PagedLists
+     */
+    @Suppress("BuilderSetStyle", "DEPRECATION")
+    fun buildFlowable(backpressureStrategy: BackpressureStrategy): Flowable<PagedList<Value>> {
+        return buildObservable().toFlowable(backpressureStrategy)
+    }
+
+    @Suppress("DEPRECATION")
+    internal class PagingObservableOnSubscribe<Key : Any, Value : Any>(
+        initialLoadKey: Key?,
+        private val config: PagedList.Config,
+        private val boundaryCallback: PagedList.BoundaryCallback<Value>?,
+        private val pagingSourceFactory: () -> PagingSource<Key, Value>,
+        private val notifyDispatcher: CoroutineDispatcher,
+        private val fetchDispatcher: CoroutineDispatcher
+    ) : ObservableOnSubscribe<PagedList<Value>>, Cancellable {
+        private var firstSubscribe = true
+        private var currentData: PagedList<Value>
+        private var currentJob: Job? = null
+        private lateinit var emitter: ObservableEmitter<PagedList<Value>>
+
+        private val callback = {
+            invalidate(true)
+        }
+
+        private val refreshRetryCallback = Runnable { invalidate(true) }
+
+        init {
+            currentData = InitialPagedList(
+                pagingSource = InitialPagingSource(),
+                coroutineScope = GlobalScope,
+                notifyDispatcher = notifyDispatcher,
+                backgroundDispatcher = fetchDispatcher,
+                config = config,
+                initialLastKey = initialLoadKey
+            )
+            currentData.setRetryCallback(refreshRetryCallback)
+        }
+
+        override fun subscribe(emitter: ObservableEmitter<PagedList<Value>>) {
+            this.emitter = emitter
+            emitter.setCancellable(this)
+
+            if (firstSubscribe) {
+                emitter.onNext(currentData)
+                firstSubscribe = false
+            }
+
+            invalidate(false)
+        }
+
+        override fun cancel() {
+            currentData.pagingSource.unregisterInvalidatedCallback(callback)
+        }
+
+        private fun invalidate(force: Boolean) {
+            // work is already ongoing, not forcing, so skip invalidate
+            if (currentJob != null && !force) return
+
+            currentJob?.cancel()
+            currentJob = GlobalScope.launch(fetchDispatcher) {
+                currentData.pagingSource.unregisterInvalidatedCallback(callback)
+                val pagingSource = pagingSourceFactory()
+                pagingSource.registerInvalidatedCallback(callback)
+                if (pagingSource is LegacyPagingSource) {
+                    pagingSource.setPageSize(config.pageSize)
+                }
+
+                withContext(notifyDispatcher) {
+                    currentData.setInitialLoadState(LoadType.REFRESH, Loading)
+                }
+
+                @Suppress("UNCHECKED_CAST")
+                val lastKey = currentData.lastKey as Key?
+                val params = config.toRefreshLoadParams(lastKey)
+                when (val initialResult = pagingSource.load(params)) {
+                    is PagingSource.LoadResult.Error -> {
+                        currentData.setInitialLoadState(
+                            LoadType.REFRESH,
+                            LoadState.Error(initialResult.throwable)
+                        )
+                    }
+                    is PagingSource.LoadResult.Page -> {
+                        val pagedList = PagedList.create(
+                            pagingSource,
+                            initialResult,
+                            GlobalScope,
+                            notifyDispatcher,
+                            fetchDispatcher,
+                            boundaryCallback,
+                            config,
+                            lastKey
+                        )
+                        onItemUpdate(currentData, pagedList)
+                        currentData = pagedList
+                        emitter.onNext(pagedList)
+                    }
+                }
+            }
+        }
+
+        private fun onItemUpdate(previous: PagedList<Value>, next: PagedList<Value>) {
+            previous.setRetryCallback(null)
+            next.setRetryCallback(refreshRetryCallback)
+        }
+    }
+}
diff --git a/paging/rxjava3/src/main/java/androidx/paging/rxjava3/ScheduledExecutor.kt b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/ScheduledExecutor.kt
new file mode 100644
index 0000000..f6626d5
--- /dev/null
+++ b/paging/rxjava3/src/main/java/androidx/paging/rxjava3/ScheduledExecutor.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.paging.rxjava3
+
+import io.reactivex.rxjava3.core.Scheduler
+import io.reactivex.rxjava3.schedulers.Schedulers
+import java.util.concurrent.Executor
+
+/**
+ * To be used interchangeably as a Scheduler and an Executor, which retains both references to an
+ * [Executor] and its [Scheduler] even after it has been converted by [Schedulers.from].
+ */
+internal class ScheduledExecutor : Scheduler, Executor {
+    private val executor: Executor
+    private val scheduler: Scheduler
+
+    constructor(scheduler: Scheduler) {
+        val worker = scheduler.createWorker()
+        executor = Executor { command -> worker.schedule(command) }
+        this.scheduler = scheduler
+    }
+
+    constructor(executor: Executor) {
+        this.executor = executor
+        scheduler = Schedulers.from(executor)
+    }
+
+    override fun createWorker() = scheduler.createWorker()
+
+    override fun execute(command: Runnable) {
+        executor.execute(command)
+    }
+}
diff --git a/paging/rxjava3/src/test/java/androidx/paging/RxPagedListBuilderTest.kt b/paging/rxjava3/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
new file mode 100644
index 0000000..14b8c11
--- /dev/null
+++ b/paging/rxjava3/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
@@ -0,0 +1,290 @@
+/*
+ * 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("DEPRECATION")
+
+package androidx.paging
+
+import androidx.paging.LoadState.Error
+import androidx.paging.LoadState.Loading
+import androidx.paging.LoadState.NotLoading
+import androidx.paging.LoadType.REFRESH
+import androidx.paging.rxjava3.RxPagedListBuilder
+import io.reactivex.rxjava3.core.Observable
+import io.reactivex.rxjava3.observers.TestObserver
+import io.reactivex.rxjava3.schedulers.TestScheduler
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import kotlin.test.assertTrue
+
+@RunWith(JUnit4::class)
+class RxPagedListBuilderTest {
+    private data class LoadStateEvent(
+        val type: LoadType,
+        val state: LoadState
+    )
+
+    /**
+     * Creates a data source that will sequentially supply the passed lists
+     */
+    private fun testDataSourceSequence(data: List<List<String>>): DataSource.Factory<Int, String> {
+        return object : DataSource.Factory<Int, String>() {
+            var localData = data
+            override fun create(): DataSource<Int, String> {
+                val currentList = localData.first()
+                localData = localData.drop(1)
+                return TestPositionalDataSource(currentList)
+            }
+        }
+    }
+
+    class MockDataSourceFactory {
+        fun create(): PagingSource<Int, String> {
+            return MockPagingSource()
+        }
+
+        var throwable: Throwable? = null
+
+        fun enqueueError() {
+            throwable = EXCEPTION
+        }
+
+        private inner class MockPagingSource : PagingSource<Int, String>() {
+            override suspend fun load(params: LoadParams<Int>) = when (params) {
+                is LoadParams.Refresh -> loadInitial(params)
+                else -> loadRange()
+            }
+
+            override fun getRefreshKey(state: PagingState<Int, String>): Int? = null
+
+            private fun loadInitial(params: LoadParams<Int>): LoadResult<Int, String> {
+                if (params is LoadParams.Refresh) {
+                    assertEquals(6, params.loadSize)
+                } else {
+                    assertEquals(2, params.loadSize)
+                }
+
+                throwable?.let { error ->
+                    throwable = null
+                    return LoadResult.Error(error)
+                }
+
+                val data = listOf("a", "b")
+                return LoadResult.Page(
+                    data = data,
+                    prevKey = null,
+                    nextKey = data.size,
+                    itemsBefore = 0,
+                    itemsAfter = 4 - data.size
+                )
+            }
+
+            private fun loadRange(): LoadResult<Int, String> {
+                return LoadResult.Page(listOf("c", "d"), 0, 0, 0, 0)
+            }
+        }
+    }
+
+    @Test
+    fun basic() {
+        val factory = testDataSourceSequence(
+            listOf(
+                listOf("a", "b"),
+                listOf("c", "d")
+            )
+        )
+        val scheduler = TestScheduler()
+
+        val observable = RxPagedListBuilder(factory, 10)
+            .setFetchScheduler(scheduler)
+            .setNotifyScheduler(scheduler)
+            .buildObservable()
+
+        val observer = TestObserver<PagedList<String>>()
+
+        observable.subscribe(observer)
+
+        // initial state
+        observer.assertNotComplete()
+        observer.assertValueCount(0)
+
+        // load first item
+        scheduler.triggerActions()
+        observer.assertValueCount(2)
+        assertEquals(listOf<String>(), observer.values().first())
+        assertEquals(listOf("a", "b"), observer.values().last())
+
+        // invalidate triggers second load
+        observer.values().last().dataSource.invalidate()
+        scheduler.triggerActions()
+        observer.assertValueCount(3)
+        assertTrue { observer.values()[1].pagingSource.invalid }
+        assertEquals(listOf("c", "d"), observer.values().last())
+    }
+
+    @Test
+    fun checkSchedulers() {
+        val factory = testDataSourceSequence(listOf(listOf("a", "b"), listOf("c", "d")))
+        val notifyScheduler = TestScheduler()
+        val fetchScheduler = TestScheduler()
+
+        val observable: Observable<PagedList<String>> = RxPagedListBuilder(factory, 10)
+            .setFetchScheduler(fetchScheduler)
+            .setNotifyScheduler(notifyScheduler)
+            .buildObservable()
+
+        val observer = TestObserver<PagedList<String>>()
+        observable.subscribe(observer)
+
+        // notify has nothing to do
+        notifyScheduler.triggerActions()
+        observer.assertValueCount(0)
+
+        // fetch creates list, but observer doesn't see
+        fetchScheduler.triggerActions()
+        observer.assertValueCount(0)
+
+        // now notify reveals item
+        notifyScheduler.triggerActions()
+        observer.assertValueCount(1)
+    }
+
+    @Test
+    fun failedLoad() {
+        val factory = MockDataSourceFactory()
+        factory.enqueueError()
+
+        // NOTE: we use two test schedulers here to inspect state during different stages of the
+        // initial load - if we used one, we wouldn't be able to see the initial Loading state
+        val notifyScheduler = TestScheduler()
+        val fetchScheduler = TestScheduler()
+
+        val observable = RxPagedListBuilder(factory::create, 2)
+            .setFetchScheduler(fetchScheduler)
+            .setNotifyScheduler(notifyScheduler)
+            .buildObservable()
+
+        val observer = TestObserver<PagedList<String>>()
+        observable.subscribe(observer)
+
+        factory.enqueueError()
+
+        fetchScheduler.triggerActions()
+        notifyScheduler.triggerActions()
+        observer.assertValueCount(1)
+
+        val initPagedList = observer.values()[0]!!
+        assertTrue(initPagedList is InitialPagedList<*, *>)
+
+        val loadStates = mutableListOf<LoadStateEvent>()
+
+        // initial load failed, check that we're in error state
+        val loadStateChangedCallback = { type: LoadType, state: LoadState ->
+            if (type == REFRESH) {
+                loadStates.add(LoadStateEvent(type, state))
+            }
+        }
+        initPagedList.addWeakLoadStateListener(loadStateChangedCallback)
+        assertEquals(
+            listOf(
+                LoadStateEvent(REFRESH, Loading)
+            ),
+            loadStates
+        )
+
+        fetchScheduler.triggerActions()
+        notifyScheduler.triggerActions()
+        observer.assertValueCount(1)
+
+        assertEquals(
+            listOf(
+                LoadStateEvent(REFRESH, Loading),
+                LoadStateEvent(REFRESH, Error(EXCEPTION))
+            ),
+            loadStates
+        )
+
+        initPagedList.retry()
+        fetchScheduler.triggerActions()
+        notifyScheduler.triggerActions()
+
+        assertEquals(
+            listOf(
+                LoadStateEvent(REFRESH, Loading),
+                LoadStateEvent(REFRESH, Error(EXCEPTION)),
+                LoadStateEvent(REFRESH, Loading)
+            ),
+            loadStates
+        )
+        // flush loadInitial, should succeed now
+        fetchScheduler.triggerActions()
+        notifyScheduler.triggerActions()
+        observer.assertValueCount(2)
+
+        val newPagedList = observer.values().last()
+        initPagedList.removeWeakLoadStateListener(loadStateChangedCallback)
+        newPagedList.addWeakLoadStateListener(loadStateChangedCallback)
+
+        assertEquals(listOf("a", "b", null, null), observer.values().last())
+
+        assertEquals(
+            listOf(
+                LoadStateEvent(REFRESH, Loading),
+                LoadStateEvent(REFRESH, Error(EXCEPTION)),
+                LoadStateEvent(REFRESH, Loading),
+                LoadStateEvent(
+                    REFRESH,
+                    NotLoading(endOfPaginationReached = false)
+                )
+            ),
+            loadStates
+        )
+    }
+
+    @Test
+    fun instantiatesPagingSourceOnFetchDispatcher() {
+        var pagingSourcesCreated = 0
+        val pagingSourceFactory = {
+            pagingSourcesCreated++
+            TestPagingSource()
+        }
+        val notifyScheduler = TestScheduler()
+        val fetchScheduler = TestScheduler()
+        val rxPagedList = RxPagedListBuilder(
+            pagingSourceFactory = pagingSourceFactory,
+            pageSize = 10,
+        ).apply {
+            setNotifyScheduler(notifyScheduler)
+            setFetchScheduler(fetchScheduler)
+        }.buildObservable()
+
+        fetchScheduler.triggerActions()
+        assertEquals(0, pagingSourcesCreated)
+
+        rxPagedList.subscribe { }
+
+        assertEquals(0, pagingSourcesCreated)
+
+        fetchScheduler.triggerActions()
+        assertEquals(1, pagingSourcesCreated)
+    }
+
+    companion object {
+        val EXCEPTION = Exception("")
+    }
+}
diff --git a/paging/samples/build.gradle b/paging/samples/build.gradle
index 1ec84e5..ec0cb24 100644
--- a/paging/samples/build.gradle
+++ b/paging/samples/build.gradle
@@ -16,11 +16,8 @@
 
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
-import androidx.build.LibraryVersions
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.*
-
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
@@ -49,9 +46,9 @@
     implementation(project(":paging:paging-runtime"))
     implementation(project(":paging:paging-rxjava2"))
 
-    implementation(GUAVA_ANDROID)
-    implementation(MULTIDEX)
-    implementation(RETROFIT)
+    implementation(libs.guavaAndroid)
+    implementation(libs.multidex)
+    implementation(libs.retrofit)
 }
 
 androidx {
diff --git a/paging/samples/lint-baseline.xml b/paging/samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/paging/samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/paging/settings.gradle b/paging/settings.gradle
index 234ca47..9e64c3a 100644
--- a/paging/settings.gradle
+++ b/paging/settings.gradle
@@ -26,6 +26,8 @@
     if (name == ":compose:integration-tests:demos:common") return true
     if (name == ":compose:lint:common") return true
     if (name == ":compose:lint:internal-lint-checks") return true
+    if (name == ":compose:test-utils") return true
+    if (name == ":test-screenshot") return true
     return false
 })
 
diff --git a/palette/palette-ktx/lint-baseline.xml b/palette/palette-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/palette/palette-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/palette/palette/lint-baseline.xml b/palette/palette/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/palette/palette/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/percentlayout/percentlayout/build.gradle b/percentlayout/percentlayout/build.gradle
index ae86a44..bc6a65e 100644
--- a/percentlayout/percentlayout/build.gradle
+++ b/percentlayout/percentlayout/build.gradle
@@ -16,7 +16,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
 }
 
 android {
diff --git a/percentlayout/percentlayout/lint-baseline.xml b/percentlayout/percentlayout/lint-baseline.xml
index 957bf3c..358f41a 100644
--- a/percentlayout/percentlayout/lint-baseline.xml
+++ b/percentlayout/percentlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/playground-common/gradle/wrapper/gradle-wrapper.properties b/playground-common/gradle/wrapper/gradle-wrapper.properties
index 31d1212..03df294 100644
--- a/playground-common/gradle/wrapper/gradle-wrapper.properties
+++ b/playground-common/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
diff --git a/playground-common/playground-build.gradle b/playground-common/playground-build.gradle
index 3e28fd0..fde3496 100644
--- a/playground-common/playground-build.gradle
+++ b/playground-common/playground-build.gradle
@@ -52,14 +52,12 @@
     }
 
     ext.repos = [:]
-    apply from: "$supportRootFolder/buildSrc/build_dependencies.gradle"
-
     dependencies {
-        classpath build_libs.agp
-        classpath build_libs.kotlin.gradle_plugin
-        classpath build_libs.kotlin.ksp_gradle_plugin
+        classpath(libs.androidGradlePlugin)
+        classpath(libs.kotlinGradlePlugin)
+        classpath(libs.kspGradlePlugin)
         classpath "androidx.build:gradle-plugin:0.1.0"
-        classpath "com.github.jengelman.gradle.plugins:shadow:5.2.0"
+        classpath(libs.shadow)
     }
 }
 
diff --git a/playground-common/playground-include-settings.gradle b/playground-common/playground-include-settings.gradle
index 994668d..62f2acb 100644
--- a/playground-common/playground-include-settings.gradle
+++ b/playground-common/playground-include-settings.gradle
@@ -63,6 +63,14 @@
             jcenter()
         }
     }
+    settings.enableFeaturePreview("VERSION_CATALOGS")
+    settings.dependencyResolutionManagement {
+        versionCatalogs {
+            libs {
+                from(files("$supportRoot/gradle/libs.versions.toml"))
+            }
+        }
+    }
     settings.includeBuild(new File(supportRoot, "androidx-plugin"))
     settings.includeProject(":lint-checks", new File(supportRoot, "lint-checks"))
     settings.includeProject(":lint-checks:integration-tests",
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 5d321b0..44261e8 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -28,7 +28,7 @@
 androidx.enableDocumentation=false
 # Disable coverage
 androidx.coverageEnabled=false
-androidx.playground.snapshotBuildId=7260680
+androidx.playground.snapshotBuildId=7324021
 androidx.playground.metalavaBuildId=7255182
-androidx.playground.dokkaBuildId=7180581
+androidx.playground.dokkaBuildId=7299536
 androidx.studio.type=playground
diff --git a/preference/preference-ktx/build.gradle b/preference/preference-ktx/build.gradle
index 0f73207..ef77225 100644
--- a/preference/preference-ktx/build.gradle
+++ b/preference/preference-ktx/build.gradle
@@ -27,13 +27,6 @@
     id("org.jetbrains.kotlin.android")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api(project(":preference:preference"))
     api("androidx.core:core-ktx:1.1.0") {
diff --git a/preference/preference-ktx/lint-baseline.xml b/preference/preference-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/preference/preference-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/preference/preference/build.gradle b/preference/preference/build.gradle
index 5cc86e5..766ba71 100644
--- a/preference/preference/build.gradle
+++ b/preference/preference/build.gradle
@@ -38,19 +38,15 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(TRUTH)
     androidTestImplementation(MULTIDEX)
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     sourceSets {
         main.res.srcDirs = [
                 "res",
diff --git a/preference/preference/lint-baseline.xml b/preference/preference/lint-baseline.xml
index 99fcd2a..244ddad2 100644
--- a/preference/preference/lint-baseline.xml
+++ b/preference/preference/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.preference.PreferenceCategory is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.preference.PreferenceCategory is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            holder.itemView.setAccessibilityHeading(true);"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -679,7 +679,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="36"
+            line="48"
             column="19"/>
     </issue>
 
@@ -690,7 +690,7 @@
         errorLine2="                                                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="36"
+            line="48"
             column="70"/>
     </issue>
 
@@ -701,7 +701,7 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="46"
+            line="58"
             column="26"/>
     </issue>
 
@@ -712,7 +712,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="62"
+            line="74"
             column="37"/>
     </issue>
 
@@ -2318,7 +2318,7 @@
         errorLine2="              ~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="256"
+            line="255"
             column="15"/>
     </issue>
 
@@ -2329,7 +2329,7 @@
         errorLine2="                                      ~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="256"
+            line="255"
             column="39"/>
     </issue>
 
@@ -2340,7 +2340,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="276"
+            line="275"
             column="37"/>
     </issue>
 
@@ -2351,7 +2351,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="302"
+            line="301"
             column="25"/>
     </issue>
 
@@ -2362,7 +2362,7 @@
         errorLine2="                          ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="307"
+            line="306"
             column="27"/>
     </issue>
 
@@ -2373,7 +2373,7 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="79"
+            line="78"
             column="26"/>
     </issue>
 
@@ -2384,7 +2384,7 @@
         errorLine2="                          ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="140"
+            line="139"
             column="27"/>
     </issue>
 
@@ -2395,7 +2395,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="174"
+            line="173"
             column="12"/>
     </issue>
 
@@ -2406,7 +2406,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="190"
+            line="189"
             column="43"/>
     </issue>
 
@@ -2417,7 +2417,7 @@
         errorLine2="              ~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="233"
+            line="242"
             column="15"/>
     </issue>
 
@@ -2428,7 +2428,7 @@
         errorLine2="                                      ~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="233"
+            line="242"
             column="39"/>
     </issue>
 
@@ -2439,7 +2439,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="249"
+            line="258"
             column="37"/>
     </issue>
 
@@ -2450,7 +2450,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="271"
+            line="280"
             column="25"/>
     </issue>
 
diff --git a/preference/preference/res/values-az/strings.xml b/preference/preference/res/values-az/strings.xml
index f0a7068..1f938dc 100644
--- a/preference/preference/res/values-az/strings.xml
+++ b/preference/preference/res/values-az/strings.xml
@@ -3,7 +3,7 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="v7_preference_on" msgid="89551595707643515">"AKTİV"</string>
     <string name="v7_preference_off" msgid="3140233346420563315">"DEAKTİV"</string>
-    <string name="expand_button_title" msgid="2427401033573778270">"Qabaqcıl ayarlar"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Əlavə"</string>
     <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
     <string name="copy" msgid="6083905920877235314">"Kopyalayın"</string>
     <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" buferə kopyalandı."</string>
diff --git a/preference/preference/res/values-es/strings.xml b/preference/preference/res/values-es/strings.xml
index 34c3002..1d0efba 100644
--- a/preference/preference/res/values-es/strings.xml
+++ b/preference/preference/res/values-es/strings.xml
@@ -3,9 +3,9 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="v7_preference_on" msgid="89551595707643515">"ACTIVADO"</string>
     <string name="v7_preference_off" msgid="3140233346420563315">"DESACTIVADA"</string>
-    <string name="expand_button_title" msgid="2427401033573778270">"Avanzado"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"Ajustes avanzados"</string>
     <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
     <string name="copy" msgid="6083905920877235314">"Copiar"</string>
     <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" se ha copiado en el portapapeles."</string>
-    <string name="not_set" msgid="6573031135582639649">"Sin definir"</string>
+    <string name="not_set" msgid="6573031135582639649">"Sin establecer"</string>
 </resources>
diff --git a/preference/preference/res/values-fa/strings.xml b/preference/preference/res/values-fa/strings.xml
index 540d00c..ca6e3b1 100644
--- a/preference/preference/res/values-fa/strings.xml
+++ b/preference/preference/res/values-fa/strings.xml
@@ -7,5 +7,5 @@
     <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>، <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
     <string name="copy" msgid="6083905920877235314">"کپی"</string>
     <string name="preference_copied" msgid="6685851473431805375">"«<xliff:g id="SUMMARY">%1$s</xliff:g>» در بریده‌دان کپی شد."</string>
-    <string name="not_set" msgid="6573031135582639649">"تنظیم نشده است"</string>
+    <string name="not_set" msgid="6573031135582639649">"تنظیم نشده"</string>
 </resources>
diff --git a/preference/preference/res/values-my/strings.xml b/preference/preference/res/values-my/strings.xml
index a840470..270e79b 100644
--- a/preference/preference/res/values-my/strings.xml
+++ b/preference/preference/res/values-my/strings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="v7_preference_on" msgid="89551595707643515">"ဖွင့်ရန်"</string>
-    <string name="v7_preference_off" msgid="3140233346420563315">"ပိတ်ရန်"</string>
+    <string name="v7_preference_on" msgid="89551595707643515">"ဖွင့်"</string>
+    <string name="v7_preference_off" msgid="3140233346420563315">"ပိတ်"</string>
     <string name="expand_button_title" msgid="2427401033573778270">"အဆင့်မြင့်"</string>
     <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>၊ <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
     <string name="copy" msgid="6083905920877235314">"မိတ္တူကူးရန်"</string>
diff --git a/preference/preference/res/values-pa/strings.xml b/preference/preference/res/values-pa/strings.xml
index 966f9ba..7bf4b4a 100644
--- a/preference/preference/res/values-pa/strings.xml
+++ b/preference/preference/res/values-pa/strings.xml
@@ -3,9 +3,9 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="v7_preference_on" msgid="89551595707643515">"ਚਾਲੂ"</string>
     <string name="v7_preference_off" msgid="3140233346420563315">"ਬੰਦ"</string>
-    <string name="expand_button_title" msgid="2427401033573778270">"ਉੱਨਤ"</string>
+    <string name="expand_button_title" msgid="2427401033573778270">"ਵਿਕਸਿਤ"</string>
     <string name="summary_collapsed_preference_list" msgid="9167775378838880170">"<xliff:g id="CURRENT_ITEMS">%1$s</xliff:g>, <xliff:g id="ADDED_ITEMS">%2$s</xliff:g>"</string>
     <string name="copy" msgid="6083905920877235314">"ਕਾਪੀ ਕਰੋ"</string>
     <string name="preference_copied" msgid="6685851473431805375">"\"<xliff:g id="SUMMARY">%1$s</xliff:g>\" ਨੂੰ ਕਲਿੱਪਬੋਰਡ \'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ।"</string>
-    <string name="not_set" msgid="6573031135582639649">"ਸੈੱਟ ਨਹੀਂ"</string>
+    <string name="not_set" msgid="6573031135582639649">"ਸੈੱਟ ਨਹੀਂ ਹੈ"</string>
 </resources>
diff --git a/print/print/lint-baseline.xml b/print/print/lint-baseline.xml
index 0e14fa8..9f73e72 100644
--- a/print/print/lint-baseline.xml
+++ b/print/print/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PrintAttributes attr = new PrintAttributes.Builder()"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMediaSize(mediaSize)"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setColorMode(mColorMode)"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .build();"
         errorLine2="                 ~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        printManager.print(jobName,"
         errorLine2="                     ~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PrintAttributes.Builder builder = new PrintAttributes.Builder();"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        builder.setColorMode(mColorMode);"
         errorLine2="                ~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setMediaSize(PrintAttributes.MediaSize.UNKNOWN_LANDSCAPE);"
         errorLine2="                    ~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setMediaSize(PrintAttributes.MediaSize.UNKNOWN_PORTRAIT);"
         errorLine2="                    ~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PrintAttributes attr = builder.build();"
         errorLine2="                                       ~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        printManager.print(jobName, printDocumentAdapter, attr);"
         errorLine2="                     ~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    cancellationSignal.setOnCancelListener("
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            mediaSize = mAttributes.getMediaSize();"
         errorLine2="                                                    ~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            if (mediaSize.isPortrait() != isPortrait(bitmap)) {"
         errorLine2="                                          ~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        PrintDocumentInfo info = new PrintDocumentInfo.Builder(mJobName)"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                .setContentType(PrintDocumentInfo.CONTENT_TYPE_PHOTO)"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                .setPageCount(1)"
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                .build();"
         errorLine2="                                 ~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        layoutResultCallback.onLayoutFinished(info, changed);"
         errorLine2="                                             ~~~~~~~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        layoutResultCallback.onLayoutFailed(null);"
         errorLine2="                                             ~~~~~~~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    layoutResultCallback.onLayoutCancelled();"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        PrintAttributes.Builder b = new PrintAttributes.Builder()"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMediaSize(other.getMediaSize())"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMediaSize(other.getMediaSize())"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setResolution(other.getResolution())"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setResolution(other.getResolution())"
         errorLine2="                                     ~~~~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMinMargins(other.getMinMargins());"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setMinMargins(other.getMinMargins());"
         errorLine2="                                     ~~~~~~~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (other.getColorMode() != 0) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            b.setColorMode(other.getColorMode());"
         errorLine2="              ~~~~~~~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            b.setColorMode(other.getColorMode());"
         errorLine2="                                 ~~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (other.getDuplexMode() != 0) {"
         errorLine2="                      ~~~~~~~~~~~~~">
         <location
@@ -354,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                b.setDuplexMode(other.getDuplexMode());"
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
@@ -365,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                b.setDuplexMode(other.getDuplexMode());"
         errorLine2="                                      ~~~~~~~~~~~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0)).build();"
         errorLine2="                     ~~~~~~~~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0)).build();"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0)).build();"
         errorLine2="                                                                            ~~~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (cancellationSignal.isCanceled()) {"
         errorLine2="                                           ~~~~~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mContext,"
         errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            pdfAttributes.getColorMode());"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    if (cancellationSignal.isCanceled()) {"
         errorLine2="                                           ~~~~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        PdfDocument.Page page = pdfDocument.startPage(1);"
         errorLine2="                                                            ~~~~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            contentRect = new RectF(page.getInfo().getContentRect());"
         errorLine2="                                                         ~~~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            contentRect = new RectF(page.getInfo().getContentRect());"
         errorLine2="                                                                   ~~~~~~~~~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            PrintedPdfDocument dummyDocument = new PrintedPdfDocument(mContext,"
         errorLine2="                                                               ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            PdfDocument.Page dummyPage = dummyDocument.startPage(1);"
         errorLine2="                                                                       ~~~~~~~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            contentRect = new RectF(dummyPage.getInfo().getContentRect());"
         errorLine2="                                                              ~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            contentRect = new RectF(dummyPage.getInfo().getContentRect());"
         errorLine2="                                                                        ~~~~~~~~~~~~~~">
         <location
@@ -530,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            dummyDocument.finishPage(dummyPage);"
         errorLine2="                                          ~~~~~~~~~~">
         <location
@@ -541,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            dummyDocument.close();"
         errorLine2="                                          ~~~~~">
         <location
@@ -552,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            page.getCanvas().clipRect(contentRect);"
         errorLine2="                                 ~~~~~~~~~">
         <location
@@ -563,8 +563,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        page.getCanvas().drawBitmap(maybeGrayscale, matrix, null);"
         errorLine2="                             ~~~~~~~~~">
         <location
@@ -574,8 +574,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        pdfDocument.finishPage(page);"
         errorLine2="                                    ~~~~~~~~~~">
         <location
@@ -585,8 +585,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        if (cancellationSignal.isCanceled()) {"
         errorLine2="                                               ~~~~~~~~~~">
         <location
@@ -596,8 +596,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        pdfDocument.writeTo("
         errorLine2="                                    ~~~~~~~">
         <location
@@ -607,8 +607,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        pdfDocument.close();"
         errorLine2="                                    ~~~~~">
         <location
@@ -618,8 +618,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                if (cancellationSignal.isCanceled()) {"
         errorLine2="                                       ~~~~~~~~~~">
         <location
@@ -629,8 +629,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    writeResultCallback.onWriteCancelled();"
         errorLine2="                                        ~~~~~~~~~~~~~~~~">
         <location
@@ -640,8 +640,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    writeResultCallback.onWriteFinished("
         errorLine2="                                        ~~~~~~~~~~~~~~~">
         <location
@@ -651,8 +651,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class null is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    writeResultCallback.onWriteFailed(null);"
         errorLine2="                                        ~~~~~~~~~~~~~">
         <location
@@ -662,8 +662,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.print.PrintHelper is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.print.PrintHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mDecodeOptions.inPreferredColorSpace = ColorSpace.get(ColorSpace.Named.SRGB);"
         errorLine2="                                                                  ~~~">
         <location
diff --git a/profileinstaller/OWNERS b/profileinstaller/OWNERS
new file mode 100644
index 0000000..465cf95
--- /dev/null
+++ b/profileinstaller/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/profileinstaller/profileinstaller/api/current.txt b/profileinstaller/profileinstaller/api/current.txt
new file mode 100644
index 0000000..4c185ac
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/current.txt
@@ -0,0 +1,37 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void tryInstallSync(android.content.Context);
+    method @WorkerThread public static void tryInstallSync(android.content.Context, androidx.profileinstaller.ProfileInstaller.Diagnostics);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 1; // 0x1
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 0; // 0x0
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 3; // 0x3
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 2; // 0x2
+    field public static final int RESULT_ALREADY_INSTALLED = 1; // 0x1
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 5; // 0x5
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 4; // 0x4
+    field public static final int RESULT_INSTALL_SUCCESS = 0; // 0x0
+    field public static final int RESULT_IO_EXCEPTION = 6; // 0x6
+    field public static final int RESULT_NOT_WRITABLE = 3; // 0x3
+    field public static final int RESULT_PARSE_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 2; // 0x2
+  }
+
+  public static interface ProfileInstaller.Diagnostics {
+    method public void diagnostic(int, Object?);
+    method public void result(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_current.txt b/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..4c185ac
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt
@@ -0,0 +1,37 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void tryInstallSync(android.content.Context);
+    method @WorkerThread public static void tryInstallSync(android.content.Context, androidx.profileinstaller.ProfileInstaller.Diagnostics);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 1; // 0x1
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 0; // 0x0
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 3; // 0x3
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 2; // 0x2
+    field public static final int RESULT_ALREADY_INSTALLED = 1; // 0x1
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 5; // 0x5
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 4; // 0x4
+    field public static final int RESULT_INSTALL_SUCCESS = 0; // 0x0
+    field public static final int RESULT_IO_EXCEPTION = 6; // 0x6
+    field public static final int RESULT_NOT_WRITABLE = 3; // 0x3
+    field public static final int RESULT_PARSE_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 2; // 0x2
+  }
+
+  public static interface ProfileInstaller.Diagnostics {
+    method public void diagnostic(int, Object?);
+    method public void result(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/res-current.txt b/profileinstaller/profileinstaller/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/res-current.txt
diff --git a/profileinstaller/profileinstaller/api/restricted_current.txt b/profileinstaller/profileinstaller/api/restricted_current.txt
new file mode 100644
index 0000000..4c185ac
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/restricted_current.txt
@@ -0,0 +1,37 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void tryInstallSync(android.content.Context);
+    method @WorkerThread public static void tryInstallSync(android.content.Context, androidx.profileinstaller.ProfileInstaller.Diagnostics);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 1; // 0x1
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 0; // 0x0
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 3; // 0x3
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 2; // 0x2
+    field public static final int RESULT_ALREADY_INSTALLED = 1; // 0x1
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 5; // 0x5
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 4; // 0x4
+    field public static final int RESULT_INSTALL_SUCCESS = 0; // 0x0
+    field public static final int RESULT_IO_EXCEPTION = 6; // 0x6
+    field public static final int RESULT_NOT_WRITABLE = 3; // 0x3
+    field public static final int RESULT_PARSE_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 2; // 0x2
+  }
+
+  public static interface ProfileInstaller.Diagnostics {
+    method public void diagnostic(int, Object?);
+    method public void result(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/build.gradle b/profileinstaller/profileinstaller/build.gradle
new file mode 100644
index 0000000..e939335
--- /dev/null
+++ b/profileinstaller/profileinstaller/build.gradle
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    annotationProcessor(NULLAWAY)
+    api("androidx.startup:startup-runtime:1.0.0")
+    implementation("androidx.annotation:annotation:1.2.0")
+    testImplementation(JUNIT)
+    testImplementation(TRUTH)
+}
+
+androidx {
+    name = "androidx.profile-installer:profile-installer"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenVersion = LibraryVersions.PROFILEINSTALLER
+    mavenGroup = LibraryGroups.PROFILEINSTALLER
+    inceptionYear = "2021"
+    description = "Allows libraries to prepopulate ahead of time compilation traces to be read by" +
+            " ART"
+}
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS b/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS
new file mode 100644
index 0000000..42abc4e
--- /dev/null
+++ b/profileinstaller/profileinstaller/integration-tests/testapp/OWNERS
@@ -0,0 +1,2 @@
[email protected]
[email protected]
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/build.gradle b/profileinstaller/profileinstaller/integration-tests/testapp/build.gradle
new file mode 100644
index 0000000..b45e224
--- /dev/null
+++ b/profileinstaller/profileinstaller/integration-tests/testapp/build.gradle
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'com.google.android.material:material:1.2.1'
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.31"
+    debugImplementation(project(":profileinstaller:profileinstaller"))
+    androidTestImplementation(ANDROIDX_TEST_RUNNER)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 21
+    }
+}
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..62e9000
--- /dev/null
+++ b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.profileinstaller.integration.testapp">
+
+    <application android:label="profileinstaller test app">
+        <activity android:name=".MainActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/src/main/assets/dexopt/baseline.prof b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/assets/dexopt/baseline.prof
new file mode 100644
index 0000000..9107ffa
--- /dev/null
+++ b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/assets/dexopt/baseline.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.kt
new file mode 100644
index 0000000..69fcb63
--- /dev/null
+++ b/profileinstaller/profileinstaller/integration-tests/testapp/src/main/java/androidx/profileinstaller/integration/testapp/MainActivity.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.profileinstaller.integration.testapp
+
+import android.app.Activity
+import android.os.Bundle
+import android.widget.LinearLayout
+import android.widget.TextView
+
+class MainActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val context = this
+
+        setContentView(
+            LinearLayout(context).apply {
+                addView(
+                    TextView(context).apply {
+                        text = "Hello World!"
+                    }
+                )
+            }
+        )
+    }
+}
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/src/main/AndroidManifest.xml b/profileinstaller/profileinstaller/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b5c86b1
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.profileinstaller">
+    
+    <application>
+        <provider
+            android:name="androidx.startup.InitializationProvider"
+            android:authorities="${applicationId}.androidx-startup"
+            android:exported="false"
+            tools:node="merge">
+            <meta-data  android:name="androidx.profileinstaller.ProfileInstallerInitializer"
+                android:value="androidx.startup" />
+        </provider>
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java
new file mode 100644
index 0000000..107ff15
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.profileinstaller;
+
+import androidx.annotation.NonNull;
+
+import java.util.HashMap;
+import java.util.HashSet;
+
+class DexProfileData {
+    final @NonNull
+    String key;
+    final long dexChecksum;
+    final int classSetSize;
+    final int hotMethodRegionSize;
+    final int numMethodIds;
+    final @NonNull
+    HashSet<Integer> classes;
+    final @NonNull
+    HashMap<Integer, Integer> methods;
+
+    DexProfileData(
+            @NonNull String key,
+            long dexChecksum,
+            int classSetSize,
+            int hotMethodRegionSize,
+            int numMethodIds,
+            @NonNull HashSet<Integer> classes,
+            @NonNull HashMap<Integer, Integer> methods
+    ) {
+        this.key = key;
+        this.dexChecksum = dexChecksum;
+        this.classSetSize = classSetSize;
+        this.hotMethodRegionSize = hotMethodRegionSize;
+        this.numMethodIds = numMethodIds;
+        this.classes = classes;
+        this.methods = methods;
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/Encoding.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/Encoding.java
new file mode 100644
index 0000000..84ff365
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/Encoding.java
@@ -0,0 +1,169 @@
+/*
+ * 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.profileinstaller;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.zip.DataFormatException;
+import java.util.zip.Inflater;
+
+/**
+ * A set of utilities on top of InputStream / OutputStream that are used by [ProfileTranscoder].
+ */
+@RequiresApi(19)
+class Encoding {
+    private Encoding() {}
+
+    static final int SIZEOF_BYTE = java.lang.Byte.SIZE;
+    static final int UINT_8_SIZE = 1;
+    static final int UINT_16_SIZE = 2;
+    static final int UINT_32_SIZE = 4;
+
+    static int utf8Length(@NonNull String s) {
+        return s.getBytes(StandardCharsets.UTF_8).length;
+    }
+
+    static void writeUInt(@NonNull OutputStream os, long value, int numberOfBytes) throws
+            IOException {
+        byte[] buffer = new byte[numberOfBytes];
+        for (int i = 0; i < numberOfBytes; i++) {
+            buffer[i] = (byte) ((value >> (i * SIZEOF_BYTE)) & 0xff);
+        }
+        os.write(buffer);
+    }
+
+    static void writeUInt8(@NonNull OutputStream os, int value) throws IOException {
+        writeUInt(os, value, UINT_8_SIZE);
+    }
+
+    static void writeUInt16(@NonNull OutputStream os, int value) throws IOException {
+        writeUInt(os, value, UINT_16_SIZE);
+    }
+
+    static void writeUInt32(@NonNull OutputStream os, long value) throws IOException {
+        writeUInt(os, value, UINT_32_SIZE);
+    }
+
+    static void writeString(@NonNull OutputStream os, @NonNull String s) throws IOException {
+        os.write(s.getBytes(StandardCharsets.UTF_8));
+    }
+
+    static int bitsToBytes(int numberOfBits) {
+        return (numberOfBits + SIZEOF_BYTE - 1 & -SIZEOF_BYTE) / SIZEOF_BYTE;
+    }
+
+    static @NonNull byte[] read(@NonNull InputStream is, int length) throws IOException {
+        byte[] buffer = new byte[length];
+        int offset = 0;
+        while (offset < length) {
+            int result = is.read(buffer, offset, length - offset);
+            if (result < 0) {
+                throw error("Not enough bytes to read: " + length);
+            }
+            offset += result;
+        }
+        return buffer;
+    }
+
+    static long readUInt(@NonNull InputStream is, int numberOfBytes) throws IOException {
+        byte[] buffer = read(is, numberOfBytes);
+        long value = 0;
+        for (int i = 0; i < numberOfBytes; i++) {
+            long next = buffer[i] & 0xff;
+            value += next << (i * SIZEOF_BYTE);
+        }
+        return value;
+    }
+
+    static int readUInt8(@NonNull InputStream is) throws IOException {
+        return (int) readUInt(is, UINT_8_SIZE);
+    }
+
+    static int readUInt16(@NonNull InputStream is) throws IOException {
+        return (int) readUInt(is, UINT_16_SIZE);
+    }
+
+    static long readUInt32(@NonNull InputStream is) throws IOException {
+        return readUInt(is, UINT_32_SIZE);
+    }
+
+    static @NonNull String readString(InputStream is, int size) throws IOException {
+        return new String(read(is, size), StandardCharsets.UTF_8);
+    }
+
+    static @NonNull byte[] readCompressed(
+            @NonNull InputStream is,
+            int compressedDataSize,
+            int uncompressedDataSize
+    ) throws IOException {
+        // Read the expected compressed data size.
+        Inflater inf = new Inflater();
+        byte[] result = new byte[uncompressedDataSize];
+        int totalBytesRead = 0;
+        int totalBytesInflated = 0;
+        byte[] input = new byte[2048]; // 2KB read window size;
+        while (!inf.finished() && !inf.needsDictionary() && totalBytesRead < compressedDataSize) {
+            int bytesRead = is.read(input);
+            if (bytesRead < 0) {
+                throw error(
+                        "Invalid zip data. Stream ended after $totalBytesRead bytes. " +
+                                "Expected " + compressedDataSize + " bytes"
+                );
+            }
+            inf.setInput(input, 0, bytesRead);
+            try {
+                totalBytesInflated += inf.inflate(
+                        result,
+                        totalBytesInflated,
+                        uncompressedDataSize - totalBytesInflated
+                );
+            } catch (DataFormatException e) {
+                throw error(e.getMessage());
+            }
+            totalBytesRead += bytesRead;
+        }
+        if (totalBytesRead != compressedDataSize) {
+            throw error(
+                    "Didn't read enough bytes during decompression." +
+                            " expected=" + compressedDataSize +
+                            " actual=" + totalBytesRead
+            );
+        }
+        if (!inf.finished()) {
+            throw error("Inflater did not finish");
+        }
+        return result;
+    }
+
+    static void writeAll(@NonNull InputStream is, @NonNull OutputStream os) throws IOException {
+        byte[] buf = new byte[512];
+        int length;
+        while ((length = is.read(buf)) > 0) {
+            os.write(buf, 0, length);
+        }
+    }
+
+    static @NonNull RuntimeException error(@Nullable String message) {
+        return new IllegalStateException(message);
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
new file mode 100644
index 0000000..1da5dfa
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
@@ -0,0 +1,459 @@
+/*
+ * 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.profileinstaller;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
+import android.os.Build;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.WorkerThread;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Install ahead of time tracing profiles to configure ART to precompile bundled libraries.
+ *
+ * This will automatically be called by {@link ProfileInstallerInitializer} and you should never
+ * call this unless you have disabled the initializer in your manifest.
+ *
+ * This reads profiles from the assets directory, where they must be embedded during the build
+ * process. This will have no effect if there is not a profile embedded in the current APK.
+ */
+public class ProfileInstaller {
+    // cannot construct
+    private ProfileInstaller() {}
+
+    private static final String PROFILE_BASE_DIR = "/data/misc/profiles/cur/0";
+    private static final String PROFILE_REF_BASE_DIR = "/data/misc/profiles/ref";
+    private static final String PROFILE_FILE = "primary.prof";
+    private static final String PROFILE_SOURCE_LOCATION = "dexopt/baseline.prof";
+
+    /**
+     * ART may generate an empty profile automatically, and so we use this number to determine a
+     * minimum length/size that is indicative of the profile being non-empty. This is a number of
+     * bytes.
+     */
+    private static final int MIN_MEANINGFUL_LENGTH = 10;
+
+    /**
+     * An object which can be passed to the ProfileInstaller which will receive information
+     * during the installation process which can be used for logging and telemetry.
+     */
+    public interface Diagnostics {
+        /**
+         * The diagnostic method will get called 0 to many times during the installation process,
+         * and is passed a [code] and optionally [data] which provides some information around
+         * the install process.
+         * @param code An int specifying which diagnostic situation has occurred.
+         * @param data Optional data passed in that relates to the code passed.
+         */
+        void diagnostic(@DiagnosticCode int code, @Nullable Object data);
+
+        /**
+         * The result method will get called exactly once per installation, with a [code]
+         * indicating what the result of the installation was.
+         *
+         * @param code An int specifying which result situation has occurred.
+         * @param data Optional data passed in that relates to the code that was passed.
+         */
+        void result(@ResultCode int code, @Nullable Object data);
+    }
+
+    private static final Diagnostics EMPTY_DIAGNOSTICS = new Diagnostics() {
+        @Override
+        public void diagnostic(int code, @Nullable Object data) {
+            // do nothing
+        }
+
+        @Override
+        public void result(int code, @Nullable Object data) {
+            // do nothing
+        }
+    };
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            DIAGNOSTIC_CURRENT_PROFILE_EXISTS,
+            DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST,
+            DIAGNOSTIC_REF_PROFILE_EXISTS,
+            DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST
+    })
+    public @interface DiagnosticCode {}
+
+    /**
+     * Indicates that when tryInstallSync was run, an existing profile was found in the "cur"
+     * directory. The associated [data] passed in for this call will be the size, in bytes, of
+     * the profile that was found.
+     */
+    @DiagnosticCode public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 0;
+
+    /**
+     * Indicates that when tryInstallSync was run, no existing profile was found in the "cur"
+     * directory.
+     */
+    @DiagnosticCode public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 1;
+
+    /**
+     * Indicates that when tryInstallSync was run, an existing profile was found in the "cur"
+     * directory. The associated [data] passed in for this call will be the size, in bytes, of
+     * the profile that was found.
+     */
+    @DiagnosticCode public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 2;
+
+    /**
+     * Indicates that when tryInstallSync was run, no existing profile was found in the "cur"
+     * directory.
+     */
+    @DiagnosticCode public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 3;
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            RESULT_INSTALL_SUCCESS,
+            RESULT_ALREADY_INSTALLED,
+            RESULT_UNSUPPORTED_ART_VERSION,
+            RESULT_NOT_WRITABLE,
+            RESULT_DESIRED_FORMAT_UNSUPPORTED,
+            RESULT_BASELINE_PROFILE_NOT_FOUND,
+            RESULT_IO_EXCEPTION,
+            RESULT_PARSE_EXCEPTION
+    })
+    public @interface ResultCode {}
+
+    /**
+     * Indicates that the profile got installed and written to disk successfully.
+     *
+     * Note that this should happen but is not the only condition that indicates "nothing went
+     * wrong". Several result codes are indicative of expected behavior.
+     */
+    @ResultCode public static final int RESULT_INSTALL_SUCCESS = 0;
+
+    /**
+     * Indicates that no installation occurred because it was determined that the baseline
+     * profile had already been installed previously.
+     */
+    @ResultCode public static final int RESULT_ALREADY_INSTALLED = 1;
+
+    /**
+     * Indicates that the current SDK level is such that installing a profile is not supported by
+     * ART.
+     */
+    @ResultCode public static final int RESULT_UNSUPPORTED_ART_VERSION = 2;
+
+    /**
+     * Indicates that the installation was aborted because the app was found to not have adequate
+     * permissions to write the profile to disk.
+     */
+    @ResultCode public static final int RESULT_NOT_WRITABLE = 3;
+
+    /**
+     * Indicates that the format required by this SDK version is not supported by this version of
+     * the ProfileInstaller library.
+     */
+    @ResultCode public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 4;
+
+    /**
+     * Indicates that no baseline profile was bundled with the APK, and as a result, no
+     * installation could take place.
+     */
+    @ResultCode public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 5;
+
+    /**
+     * Indicates that an IO Exception took place during install. The associated [data] with this
+     * result is the exception.
+     */
+    @ResultCode public static final int RESULT_IO_EXCEPTION = 6;
+
+    /**
+     * Indicates that a parsing exception occurred during install. The associated [data] with
+     * this result is the exception.
+     */
+    @ResultCode public static final int RESULT_PARSE_EXCEPTION = 7;
+
+    private static boolean shouldSkipInstall(
+            @NonNull Diagnostics diagnostics,
+            long baselineLength,
+            boolean curExists,
+            long curLength,
+            boolean refExists,
+            long refLength
+    ) {
+        if (curExists && curLength > MIN_MEANINGFUL_LENGTH) {
+            // There's a non-empty profile sitting in this directory
+            diagnostics.diagnostic(DIAGNOSTIC_CURRENT_PROFILE_EXISTS, null);
+        } else {
+            diagnostics.diagnostic(DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST, null);
+        }
+
+        if (refExists && refLength > MIN_MEANINGFUL_LENGTH) {
+            diagnostics.diagnostic(DIAGNOSTIC_REF_PROFILE_EXISTS, null);
+        } else {
+            diagnostics.diagnostic(DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST, null);
+        }
+
+        if (baselineLength > 0 && baselineLength == curLength) {
+            // If the profiles are exactly the same size, we make the assumption that
+            // they are in fact the same profile. In this case, there is no work for
+            // us to do and we can exit early.
+            diagnostics.result(RESULT_ALREADY_INSTALLED, null);
+            return true;
+        }
+
+        if (baselineLength > 0 && baselineLength == refLength) {
+            // If the profiles are exactly the same size, we make the assumption that
+            // they are in fact the same profile. In this case, there is no work for
+            // us to do and we can exit early.
+            diagnostics.result(RESULT_ALREADY_INSTALLED, null);
+            return true;
+        }
+
+        if (
+                baselineLength > 0 &&
+                        (baselineLength < curLength || baselineLength < refLength)
+        ) {
+            // if the baseline profile is smaller than the current profile or
+            // reference profile, then we assume that it already has the baseline
+            // profile in it. We avoid doing anything in this case as we don't want
+            // to introduce unnecessary work on the app or ART every time the app runs.
+            // TODO: we could do something a bit smarter here to indicate that we've
+            //  already written the profile. For instance, we could save a file marking the
+            //  install and look at that.
+            diagnostics.result(RESULT_ALREADY_INSTALLED, null);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Transcode the source file to an appropriate destination format for this OS version, and
+     * write it to the ART aot directory.
+     *
+     * @param assets the asset manager to read source file from dexopt/baseline.prof
+     * @param packageName package name of the current apk
+     * @param diagnostics The diagnostics object to pass diagnostics to
+     */
+    private static void transcodeAndWrite(
+            @NonNull AssetManager assets,
+            @NonNull String packageName,
+            @NonNull Diagnostics diagnostics
+    ) {
+        byte[] version = desiredVersion();
+        if (version == null) {
+            diagnostics.result(RESULT_UNSUPPORTED_ART_VERSION, null);
+            return;
+        }
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
+            diagnostics.result(RESULT_UNSUPPORTED_ART_VERSION, null);
+            return;
+        }
+        File curProfile = new File(new File(PROFILE_BASE_DIR, packageName), PROFILE_FILE);
+
+        boolean canWrite = curProfile.canWrite();
+        if (!canWrite) {
+            // It's possible that some OEMs might not allow writing to this directory. If this is
+            // the case, there's not really anything we can do, so we should quit before doing
+            // any unnecessary work.
+            diagnostics.result(RESULT_NOT_WRITABLE, null);
+            return;
+        }
+
+        File refProfile = new File(new File(PROFILE_REF_BASE_DIR, packageName), PROFILE_FILE);
+        try (AssetFileDescriptor fd = assets.openFd(PROFILE_SOURCE_LOCATION)) {
+            long baselineLength = fd.getLength();
+            long curLength = curProfile.length();
+            long refLength = refProfile.length();
+            boolean curExists = curProfile.exists();
+            boolean refExists = refProfile.exists();
+
+            try (InputStream is = fd.createInputStream()) {
+                byte[] baselineVersion = ProfileTranscoder.readHeader(is);
+                // TODO: this is assuming that the baseline version is the P format. We should
+                //  consider whether or not we want to also check for "future" formats, and
+                //  assume that if a future format ended up in this file location, that the
+                //  platform probably supports it and go ahead and move it to the cur profile
+                //  location without parsing anything. For now, a "future" format will just fail
+                //  below in the readProfile step.
+                boolean transcodingNeeded = !Arrays.equals(baselineVersion, version);
+
+                // NOTE: If transcoding is needed, then it isn't meaningful to compare the
+                // lengths of the baseline profile with the cur/ref profiles. As a result, we
+                // split logic here.
+                if (transcodingNeeded) {
+                    if (shouldSkipInstall(diagnostics,
+                            baselineLength,
+                            curExists,
+                            curLength,
+                            refExists,
+                            refLength)) {
+                        return;
+                    }
+
+                    try (OutputStream os = new FileOutputStream(curProfile)) {
+                        ProfileTranscoder.writeHeader(os, version);
+                        Encoding.writeAll(is, os);
+                    }
+                } else {
+                    // If transcoding into a different format, we first parse the baseline
+                    // profile and then transcode it into a byte array so we can get the
+                    // resulting length of the profile we want to write to disk. Then, based on
+                    // that size, we determine if we want to actually "install" it or not.
+                    Map<String, DexProfileData> profile =
+                            ProfileTranscoder.readProfile(is, baselineVersion);
+                    byte[] result;
+                    try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+                        ProfileTranscoder.writeHeader(os, version);
+                        boolean success = ProfileTranscoder.transcodeAndWriteBody(
+                                os,
+                                version,
+                                profile
+                        );
+
+                        if (!success) {
+                            diagnostics.result(RESULT_DESIRED_FORMAT_UNSUPPORTED, null);
+                            return;
+                        }
+
+                        result = os.toByteArray();
+                    }
+
+                    long transcodedLength = result.length;
+
+                    if (shouldSkipInstall(diagnostics,
+                            transcodedLength,
+                            curExists,
+                            curLength,
+                            refExists,
+                            refLength)) {
+                        return;
+                    }
+
+                    try (
+                            InputStream bis = new ByteArrayInputStream(result);
+                            OutputStream os = new FileOutputStream(curProfile)
+                    ) {
+                        // result already has the header in it, so we don't write the header
+                        // here like we did above
+                        Encoding.writeAll(bis, os);
+                    }
+                }
+                diagnostics.result(RESULT_INSTALL_SUCCESS, null);
+            }
+        } catch (FileNotFoundException e) {
+            diagnostics.result(RESULT_BASELINE_PROFILE_NOT_FOUND, e);
+        } catch (IOException e) {
+            diagnostics.result(RESULT_IO_EXCEPTION, e);
+        } catch (IllegalStateException e) {
+            diagnostics.result(RESULT_PARSE_EXCEPTION, e);
+        }
+    }
+
+    private static @Nullable byte[] desiredVersion() {
+        // If SDK is pre-N, we don't want to do anything, so return null.
+        if (Build.VERSION.SDK_INT < ProfileVersion.MIN_SUPPORTED_SDK) {
+            return null;
+        }
+
+        switch (Build.VERSION.SDK_INT) {
+            case Build.VERSION_CODES.N_MR1:
+            case Build.VERSION_CODES.N:
+                return ProfileVersion.V001_N;
+
+            case Build.VERSION_CODES.O_MR1:
+            case Build.VERSION_CODES.O:
+                return ProfileVersion.V005_O;
+        }
+
+        // we default back to P+, assuming that this will work for future releases
+        return ProfileVersion.V010_P;
+    }
+
+    /**
+     * Try to install the profile from assets into the ART aot profile directory.
+     *
+     * This should always be called after the first screen is shown to the user, to avoid
+     * delaying application startup to install AOT profiles.
+     *
+     * @param context context to read assets from
+     */
+    @WorkerThread
+    public static void tryInstallSync(@NonNull Context context) {
+        tryInstallSync(context, EMPTY_DIAGNOSTICS);
+    }
+
+    /**
+     * Try to install the profile from assets into the ART aot profile directory.
+     *
+     * This should always be called after the first screen is shown to the user, to avoid
+     * delaying application startup to install AOT profiles.
+     *
+     * @param context context to read assets from
+     * @param diagnostics an object which will receive diagnostic information about the installation
+     */
+    @WorkerThread
+    public static void tryInstallSync(@NonNull Context context, @NonNull Diagnostics diagnostics) {
+        Context appContext = context.getApplicationContext();
+        String packageName = appContext.getPackageName();
+        AssetManager assetManager = appContext.getAssets();
+        transcodeAndWrite(assetManager, packageName, diagnostics);
+    }
+
+    /**
+     * Creates a new thread and calls {@link ProfileInstaller#tryInstallSync(Context)} on it.
+     *
+     * Thread will be destroyed after the call completes.
+     *
+     * Warning: *Never* call this during app initialization as it will create a thread and
+     * start disk read/write immediately.
+     */
+    static void tryInstallInBackground(@NonNull Context context) {
+        Executor executor = new ThreadPoolExecutor(
+                /* corePoolSize = */0,
+                /* maximumPoolSize = */1,
+                /* keepAliveTime = */0,
+                /* unit = */TimeUnit.MILLISECONDS,
+                /* workQueue = */new LinkedBlockingQueue<>()
+        );
+        executor.execute(() -> tryInstallSync(context));
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallerInitializer.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallerInitializer.java
new file mode 100644
index 0000000..c2fbf87
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstallerInitializer.java
@@ -0,0 +1,118 @@
+/*
+ * 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.profileinstaller;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.startup.Initializer;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Startup library initializer that installs an AOT profile several seconds after launch.
+ *
+ * During application startup this will schedule background profile installation several seconds
+ * later. At the scheduled time, a background thread will be created to install the profile.
+ *
+ * You can disable this initializer and call {@link ProfileInstaller#tryInstallSync(Context)}
+ * yourself to control the threading behavior.
+ *
+ * To disable this initializer add the following to your manifest:
+ *
+ * <pre>
+ *     <provider
+ *         android:name="androidx.startup.InitializationProvider"
+ *         android:authorities="${applicationId}.androidx-startup"
+ *         android:exported="false"
+ *         tools:node="merge">
+ *         <meta-data android:name="androidx.profileinstaller.ProfileInstallerInitializer"
+ *                   tools:node="remove" />
+ *     </provider>
+ * </pre>
+ *
+ * If you disable the initializer, ensure that {@link ProfileInstaller#tryInstallSync(Context)}
+ * is called within a few (5-10) seconds of your app starting up.
+ */
+public class ProfileInstallerInitializer
+        implements Initializer<ProfileInstallerInitializer.Result> {
+    private static final int DELAY_MS = 5_000;
+
+    /**
+     *
+     *
+     * @return Result immediately.
+     */
+    @NonNull
+    @Override
+    public Result create(@NonNull Context context) {
+        if (Build.VERSION.SDK_INT < ProfileVersion.MIN_SUPPORTED_SDK) {
+            // If we are below the supported SDK, there is nothing for us to do, so return early.
+            return new Result();
+        }
+
+        // If we made it this far, we are going to try and install the profile in the background.
+        Context appContext = context.getApplicationContext();
+        Handler handler;
+        if (Build.VERSION.SDK_INT >= 28) {
+            // avoid aligning with vsync when available using createAsync API
+            handler = Handler28Impl.createAsync(Looper.getMainLooper());
+        } else {
+            handler = new Handler(Looper.getMainLooper());
+        }
+
+        handler.postDelayed(() -> ProfileInstaller.tryInstallInBackground(appContext), DELAY_MS);
+        return new Result();
+    }
+
+    /**
+     * Initializer has no dependencies.
+     */
+    @NonNull
+    @Override
+    public List<Class<? extends Initializer<?>>> dependencies() {
+        return Collections.emptyList();
+    }
+
+    /**
+     * Empty result class for ProfileInstaller.
+     */
+    public static class Result { }
+
+    @RequiresApi(28)
+    private static class Handler28Impl {
+        private Handler28Impl() {
+            // Non-instantiable.
+        }
+
+        // avoid aligning with vsync when available (API 28+)
+        @DoNotInline
+        public static Handler createAsync(Looper looper) {
+            return Handler.createAsync(looper);
+        }
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java
new file mode 100644
index 0000000..a6f4480
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java
@@ -0,0 +1,437 @@
+/*
+ * 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.profileinstaller;
+
+import static androidx.profileinstaller.Encoding.UINT_16_SIZE;
+import static androidx.profileinstaller.Encoding.bitsToBytes;
+import static androidx.profileinstaller.Encoding.error;
+import static androidx.profileinstaller.Encoding.read;
+import static androidx.profileinstaller.Encoding.readCompressed;
+import static androidx.profileinstaller.Encoding.readString;
+import static androidx.profileinstaller.Encoding.readUInt16;
+import static androidx.profileinstaller.Encoding.readUInt32;
+import static androidx.profileinstaller.Encoding.readUInt8;
+import static androidx.profileinstaller.Encoding.utf8Length;
+import static androidx.profileinstaller.Encoding.writeString;
+import static androidx.profileinstaller.Encoding.writeUInt16;
+import static androidx.profileinstaller.Encoding.writeUInt32;
+import static androidx.profileinstaller.Encoding.writeUInt8;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+
+@RequiresApi(19)
+class ProfileTranscoder {
+    private ProfileTranscoder() {
+    }
+
+    private static final int HOT = 1;
+    private static final int STARTUP = 1 << 1;
+    private static final int POST_STARTUP = 1 << 2;
+    private static final int INLINE_CACHE_MISSING_TYPES_ENCODING = 6;
+    private static final int INLINE_CACHE_MEGAMORPHIC_ENCODING = 7;
+
+    static final byte[] MAGIC = new byte[]{'p', 'r', 'o', '\u0000'};
+
+    static byte[] readHeader(@NonNull InputStream is) throws IOException {
+        byte[] fileMagic = read(is, MAGIC.length);
+        if (!Arrays.equals(MAGIC, fileMagic)) {
+            // If we find a file that doesn't claim to be a profile, something really unexpected
+            // has happened. Fail.
+            throw error("Invalid magic");
+        }
+        return read(is, ProfileVersion.V010_P.length);
+    }
+
+    static void writeHeader(@NonNull OutputStream os, byte[] version) throws IOException {
+        os.write(MAGIC);
+        os.write(version);
+    }
+
+    /**
+     * Transcode (or convert) a binary profile from one format version to another.
+     *
+     * @param os The destination output stream for the binary ART profile to be written to. This
+     *           profile will be encoded in the [desiredVersion] format.
+     * @param desiredVersion The desired version of the ART Profile to be written to [os]
+     * @return A boolean indicating whether or not the profile was successfully written to the
+     * output stream in the desired format.
+     */
+    static boolean transcodeAndWriteBody(
+            @NonNull OutputStream os,
+            @NonNull byte[] desiredVersion,
+            @NonNull Map<String, DexProfileData> data
+    ) throws IOException {
+        if (Arrays.equals(desiredVersion, ProfileVersion.V005_O)) {
+            writeProfileForO(os, data);
+            return true;
+        }
+
+        if (Arrays.equals(desiredVersion, ProfileVersion.V001_N)) {
+            writeProfileForN(os, data);
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Writes the provided [lines] out into a binary profile suitable for N devices. This method
+     * expects that the MAGIC and Version of the profile header have already been written to the
+     * OutputStream.
+     *
+     * This format has the following encoding:
+     *
+     *    magic,version,number_of_lines
+     *    dex_location1,number_of_methods1,number_of_classes1,dex_location_checksum1, \
+     *        method_id11,method_id12...,class_id1,class_id2...
+     *    dex_location2,number_of_methods2,number_of_classes2,dex_location_checksum2, \
+     *        method_id21,method_id22...,,class_id1,class_id2...
+     *    .....
+     */
+    private static void writeProfileForN(
+            @NonNull OutputStream os,
+            @NonNull Map<String, DexProfileData> lines
+    ) throws IOException {
+        writeUInt16(os, lines.size()); // number of dex files
+        for (Map.Entry<String, DexProfileData> entry : lines.entrySet()) {
+            String profileKey = entry.getKey();
+            DexProfileData data = entry.getValue();
+            writeUInt16(os, utf8Length(profileKey));
+            writeUInt16(os, data.methods.size());
+            writeUInt16(os, data.classes.size());
+            writeUInt32(os, data.dexChecksum);
+            writeString(os, profileKey);
+
+            for (int id : data.methods.keySet()) {
+                writeUInt16(os, id);
+            }
+
+            for (int id : data.classes) {
+                writeUInt16(os, id);
+            }
+        }
+    }
+
+    /**
+     * Writes the provided [lines] out into a binary profile suitable for O devices. This method
+     * expects that the MAGIC and Version of the profile header have already been written to the
+     * OutputStream.
+     *
+     * This format has the following encoding:
+     *
+     *    magic,version,number_of_dex_files
+     *    dex_location1,number_of_classes1,methods_region_size,dex_location_checksum1, \
+     *        method_encoding_11,method_encoding_12...,class_id1,class_id2...
+     *    dex_location2,number_of_classes2,methods_region_size,dex_location_checksum2, \
+     *        method_encoding_21,method_encoding_22...,,class_id1,class_id2...
+     *    .....
+     *
+     * The method_encoding is:
+     *    method_id,number_of_inline_caches,inline_cache1,inline_cache2...
+     *
+     * The inline_cache is:
+     *    dex_pc,[M|dex_map_size], dex_profile_index,class_id1,class_id2...,dex_profile_index2,...
+     *    dex_map_size is the number of dex_indices that follows.
+     *       Classes are grouped per their dex files and the line
+     *       `dex_profile_index,class_id1,class_id2...,dex_profile_index2,...` encodes the
+     *       mapping from `dex_profile_index` to the set of classes `class_id1,class_id2...`
+     *    M stands for megamorphic or missing types and it's encoded as either
+     *    the byte [INLINE_CACHE_MEGAMORPHIC_ENCODING] or [INLINE_CACHE_MISSING_TYPES_ENCODING].
+     *    When present, there will be no class ids following.
+     *    .....
+     *
+     * Note that currently we never encode any inline cache data.
+     */
+    private static void writeProfileForO(
+            @NonNull OutputStream os,
+            @NonNull Map<String, DexProfileData> lines
+    ) throws IOException {
+        writeUInt8(os, lines.size()); // number of dex files
+        for (Map.Entry<String, DexProfileData> entry : lines.entrySet()) {
+            String key = entry.getKey();
+            DexProfileData data = entry.getValue();
+            int hotMethodRegionSize = data.methods.size() * (
+                    UINT_16_SIZE + // method id
+                            UINT_16_SIZE);// inline cache size (should always be 0 for us)
+            writeUInt16(os, utf8Length(key));
+            writeUInt16(os, data.classes.size());
+            writeUInt32(os, hotMethodRegionSize);
+            writeUInt32(os, data.dexChecksum);
+            writeString(os, key);
+
+            for (int id : data.methods.keySet()) {
+                writeUInt16(os, id);
+                // 0 for inline cache size, since we never encode any inline cache data.
+                writeUInt16(os, 0);
+            }
+
+            for (int id : data.classes) {
+                writeUInt16(os, id);
+            }
+        }
+    }
+
+    /**
+     * Reads and parses data from the InputStream into an in-memory representation, to later be
+     * written to disk using [writeProfileForO] or [writeProfileForN]. This method expects that
+     * the MAGIC and the VERSION of the InputStream have already been read.
+     *
+     * This method assumes the profile is stored with the [V010_P] encoding.
+     *
+     * This encoding is as follows:
+     *
+     * [profile_header, zipped[[dex_data_header1, dex_data_header2...],[dex_data1,
+     *    dex_data2...]]]
+     *
+     * profile_header:
+     *   magic,version,number_of_dex_files,uncompressed_size_of_zipped_data,compressed_data_size
+     *
+     * dex_data_header:
+     *   dex_location,number_of_classes,methods_region_size,dex_location_checksum,num_method_ids
+     *
+     * dex_data:
+     *   method_encoding_1,method_encoding_2...,class_id1,class_id2...,startup/post startup bitmap.
+     *
+     * The method_encoding is:
+     *    method_id,number_of_inline_caches,inline_cache1,inline_cache2...
+     *
+     * The inline_cache is:
+     *    dex_pc,[M|dex_map_size], dex_profile_index,class_id1,class_id2...,dex_profile_index2,...
+     *    dex_map_size os the number of dex_indices that follows.
+     *       Classes are grouped per their dex files and the line
+     *       `dex_profile_index,class_id1,class_id2...,dex_profile_index2,...` encodes the
+     *       mapping from `dex_profile_index` to the set of classes `class_id1,class_id2...`
+     *    M stands for megamorphic or missing types and it's encoded as either
+     *    the byte [INLINE_CACHE_MEGAMORPHIC_ENCODING] or [INLINE_CACHE_MISSING_TYPES_ENCODING].
+     *    When present, there will be no class ids following.
+     *
+     * @param is The InputStream for the P+ binary profile
+     * @return A map of keys (dex names) to the parsed [DexProfileData] for that dex.
+     */
+    static @NonNull Map<String, DexProfileData> readProfile(
+            @NonNull InputStream is,
+            @NonNull byte[] version
+    ) throws IOException {
+        if (!Arrays.equals(version, ProfileVersion.V010_P)) {
+            throw error("Unsupported version");
+        }
+        int numberOfDexFiles = readUInt8(is);
+        long uncompressedDataSize = readUInt32(is);
+        long compressedDataSize = readUInt32(is);
+
+        // We are done with the header, so everything that follows is the compressed blob. We
+        // uncompress it all and load it into memory
+        byte[] uncompressedData = readCompressed(
+                is,
+                (int) compressedDataSize,
+                (int) uncompressedDataSize
+        );
+        if (is.read() > 0) throw error("Content found after the end of file");
+
+        try (InputStream dataStream = new ByteArrayInputStream(uncompressedData)) {
+            return readUncompressedBody(dataStream, numberOfDexFiles);
+        }
+    }
+
+    /**
+     * Parses the un-zipped blob of data in the P+ profile format. It is assumed that no data has
+     * been read from this blob, and that the InputStream that this method is passed was just
+     * decompressed from the original file.
+     *
+     * @return A map of keys (dex names) to the parsed [DexProfileData] for that dex.
+     */
+    private static @NonNull Map<String, DexProfileData> readUncompressedBody(
+            @NonNull InputStream is,
+            int numberOfDexFiles
+    ) throws IOException {
+        // If the uncompressed profile data stream is empty then we have nothing more to do.
+        if (is.available() == 0) {
+            return new HashMap<>();
+        }
+        // Read the dex file line headers.
+        DexProfileData[] lines = new DexProfileData[numberOfDexFiles];
+        for (int i = 0; i < numberOfDexFiles; i++) {
+            int keySize = readUInt16(is);
+            int classSetSize = readUInt16(is);
+            long hotMethodRegionSize = readUInt32(is);
+            long dexChecksum = readUInt32(is);
+            long numMethodIds = readUInt32(is);
+            String key = readString(is, keySize);
+            lines[i] = new DexProfileData(
+                    key,
+                    dexChecksum,
+                    classSetSize,
+                    (int) hotMethodRegionSize,
+                    (int) numMethodIds,
+                    // NOTE: It is important to use LinkedHashSet/LinkedHashMap here to
+                    // ensure that iteration order matches insertion order
+                    new LinkedHashSet<>(),
+                    new LinkedHashMap<>()
+            );
+        }
+
+        HashMap<String, DexProfileData> result = new HashMap<>(numberOfDexFiles);
+
+        // Load data for each discovered dex file.
+        for (DexProfileData data : lines) {
+            // The hot methods are stored one-by-one with the inline cache information alongside it.
+            readHotMethodRegion(is, data);
+
+            // Then the startup classes are stored
+            readClasses(is, data);
+
+            // In addition to [HOT], the methods can be labeled as [STARTUP] and [POST_STARTUP].
+            // To compress this information better, this information is stored as a bitmap, with
+            // 2-bits per method in the entire dex.
+            readMethodBitmap(is, data);
+
+            // save the parsed data for each dex
+            result.put(data.key, data);
+        }
+
+        return result;
+    }
+
+    private static void readHotMethodRegion(
+            @NonNull InputStream is,
+            @NonNull DexProfileData data
+    ) throws IOException {
+        int expectedBytesAvailableAfterRead = is.available() - data.hotMethodRegionSize;
+        int lastMethodIndex = 0;
+
+        // Read one method at a time until we reach the end of the method region.
+        while (is.available() > expectedBytesAvailableAfterRead) {
+            // The profile stores the first method index, then the remainder are relative to the
+            // previous
+            // value.
+            int diffWithLastMethodDexIndex = readUInt16(is);
+            int methodDexIndex = lastMethodIndex + diffWithLastMethodDexIndex;
+
+            data.methods.put(methodDexIndex, HOT);
+
+            // Read the inline caches.
+            int inlineCacheSize = readUInt16(is);
+            while (inlineCacheSize > 0) {
+                skipInlineCache(is);
+                --inlineCacheSize;
+            }
+            // Update the last method index.
+            lastMethodIndex = methodDexIndex;
+        }
+
+        // Check that we read exactly the amount of bytes specified by the method region size.
+        if (is.available() != expectedBytesAvailableAfterRead) {
+            throw error(
+                    "Read too much data during profile line parse"
+            );
+        }
+    }
+
+    private static void skipInlineCache(@NonNull InputStream is) throws IOException {
+        /* val dexPc = */readUInt16(is);
+        int dexPcMapSize = readUInt8(is);
+
+        // Check for missing type encoding.
+        if (dexPcMapSize == INLINE_CACHE_MISSING_TYPES_ENCODING) {
+            return;
+        }
+        // Check for megamorphic encoding.
+        if (dexPcMapSize == INLINE_CACHE_MEGAMORPHIC_ENCODING) {
+            return;
+        }
+
+        // The inline cache is not missing types and it's not megamorphic. Read the types available
+        // for each dex pc.
+        while (dexPcMapSize > 0) {
+            /* val profileIndex = */readUInt8(is);
+            int numClasses = readUInt8(is);
+            while (numClasses > 0) {
+                /* val classDexIndex = */readUInt16(is);
+                --numClasses;
+            }
+            --dexPcMapSize;
+        }
+    }
+
+    private static void readClasses(
+            @NonNull InputStream is,
+            @NonNull DexProfileData data
+    ) throws IOException {
+        int lastClassIndex = 0;
+        for (int k = 0; k < data.classSetSize; k++) {
+            int diffWithTheLastClassIndex = readUInt16(is);
+            int classDexIndex = lastClassIndex + diffWithTheLastClassIndex;
+            data.classes.add(classDexIndex);
+            lastClassIndex = classDexIndex;
+        }
+    }
+
+    private static void readMethodBitmap(
+            @NonNull InputStream is,
+            @NonNull DexProfileData data
+    ) throws IOException {
+        int methodBitmapStorageSize = bitsToBytes(data.numMethodIds * 2);
+        byte[] methodBitmap = read(is, methodBitmapStorageSize);
+        BitSet bs = BitSet.valueOf(methodBitmap);
+        for (int methodIndex = 0; methodIndex < data.numMethodIds; methodIndex++) {
+            int newFlags = readFlagsFromBitmap(bs, methodIndex, data.numMethodIds);
+            if (newFlags != 0) {
+                Integer current = data.methods.get(methodIndex);
+                if (current == null) current = 0;
+                data.methods.put(methodIndex, current | newFlags);
+            }
+        }
+    }
+
+    private static int readFlagsFromBitmap(@NonNull BitSet bs, int methodIndex, int numMethodIds) {
+        int result = 0;
+        if (bs.get(methodFlagBitmapIndex(STARTUP, methodIndex, numMethodIds))) {
+            result |= STARTUP;
+        }
+        if (bs.get(methodFlagBitmapIndex(POST_STARTUP, methodIndex, numMethodIds))) {
+            result |= POST_STARTUP;
+        }
+        return result;
+    }
+
+    private static int methodFlagBitmapIndex(int flag, int methodIndex, int numMethodIds) {
+        // The format is [startup bitmap][post startup bitmap][AmStartup][...]
+        // This compresses better than ([startup bit][post startup bit])*
+        switch (flag) {
+            case HOT:
+                throw error("HOT methods are not stored in the bitmap");
+            case STARTUP:
+                return methodIndex;
+            case POST_STARTUP:
+                return methodIndex + numMethodIds;
+            default:
+                throw error("Unexpected flag: " + flag);
+        }
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java
new file mode 100644
index 0000000..1572b5f
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java
@@ -0,0 +1,27 @@
+/*
+ * 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.profileinstaller;
+
+import android.os.Build;
+
+class ProfileVersion {
+    private ProfileVersion() {}
+    static final byte[] V010_P = new byte[]{'0', '1', '0', '\u0000'};
+    static final byte[] V005_O = new byte[]{'0', '0', '5', '\u0000'};
+    static final byte[] V001_N = new byte[]{'0', '0', '1', '\u0000'};
+    static final int MIN_SUPPORTED_SDK = Build.VERSION_CODES.N;
+}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/package-info.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/package-info.java
new file mode 100644
index 0000000..83076bf
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/package-info.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+/**
+ * Small runtime library to install profile traces that are bundled in an APK such that art may
+ * use them to ahead of time compile libraries.
+ *
+ * This allows unbundled libraries to achieve similar performance as bundled code without waiting
+ * for just in time compilation.
+ */
+package androidx.profileinstaller;
diff --git a/profileinstaller/profileinstaller/src/test/AndroidManifest.xml b/profileinstaller/profileinstaller/src/test/AndroidManifest.xml
new file mode 100644
index 0000000..43fa506
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?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.profileinstaller.test">
+
+</manifest>
diff --git a/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java b/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java
new file mode 100644
index 0000000..f9ad531
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java
@@ -0,0 +1,119 @@
+/*
+ * 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.profileinstaller;
+
+
+import static androidx.profileinstaller.ProfileTranscoder.MAGIC;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.truth.Truth;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Map;
+
+@RunWith(JUnit4.class)
+public class ProfileTranscoderTests {
+    @Test
+    public void testReadProfile() throws IOException {
+        byte[] version = ProfileVersion.V010_P;
+        File pprof = testFile("baseline-p.prof");
+        try (InputStream is = new FileInputStream(pprof)) {
+            expectBytes(is, MAGIC);
+            expectBytes(is, version);
+            Map<String, DexProfileData> data = ProfileTranscoder.readProfile(is, version);
+            Truth.assertThat(data).hasSize(1);
+            DexProfileData item = data.values().iterator().next();
+            Truth.assertThat(item.dexChecksum).isEqualTo(147004379);
+            Truth.assertThat(item.numMethodIds).isEqualTo(18487);
+            Truth.assertThat(item.hotMethodRegionSize).isEqualTo(140);
+        }
+    }
+
+    @Test
+    public void testTranscodeForN() throws IOException {
+        assertGoldenTranscode(
+                testFile("baseline-p.prof"),
+                testFile("baseline-n.prof"),
+                ProfileVersion.V001_N
+        );
+    }
+
+    @Test
+    public void testTranscodeForO() throws IOException {
+        assertGoldenTranscode(
+                testFile("baseline-p.prof"),
+                testFile("baseline-o.prof"),
+                ProfileVersion.V005_O
+        );
+    }
+
+    @Test
+    public void testTranscodeForP() throws IOException {
+        assertGoldenTranscode(
+                testFile("baseline-p.prof"),
+                testFile("baseline-p.prof"),
+                ProfileVersion.V010_P
+        );
+    }
+
+    private static File testFile(@NonNull String fileName) {
+        return new File("src/test/test-data", fileName);
+    }
+
+    private static void assertGoldenTranscode(
+            @NonNull File input,
+            @NonNull File golden,
+            @NonNull byte[] desiredVersion
+    ) throws IOException {
+        try (
+                InputStream is = new FileInputStream(input);
+                ByteArrayOutputStream os = new ByteArrayOutputStream()
+        ) {
+            byte[] version = ProfileTranscoder.readHeader(is);
+            ProfileTranscoder.writeHeader(os, desiredVersion);
+            if (!Arrays.equals(desiredVersion, ProfileVersion.V010_P)) {
+                Map<String, DexProfileData> data = ProfileTranscoder.readProfile(
+                        is,
+                        version
+                );
+                ProfileTranscoder.transcodeAndWriteBody(os, desiredVersion, data);
+            } else {
+                Encoding.writeAll(is, os);
+            }
+            byte[] goldenBytes = Files.readAllBytes(golden.toPath());
+            byte[] actualBytes = os.toByteArray();
+            Truth.assertThat(actualBytes).isEqualTo(goldenBytes);
+        }
+    }
+
+    private static void expectBytes(@NonNull InputStream is, @NonNull byte[] bytes)
+            throws IOException {
+        byte[] actual = Encoding.read(is, bytes.length);
+        Truth.assertThat(actual).isEqualTo(bytes);
+    }
+}
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-n.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-n.prof
new file mode 100644
index 0000000..bf8d288
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-n.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-o.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-o.prof
new file mode 100644
index 0000000..e76920c
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-o.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-p.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-p.prof
new file mode 100644
index 0000000..61c0e4e
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-p.prof
Binary files differ
diff --git a/recommendation/recommendation/lint-baseline.xml b/recommendation/recommendation/lint-baseline.xml
index 1ef835f..9106d21 100644
--- a/recommendation/recommendation/lint-baseline.xml
+++ b/recommendation/recommendation/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/recyclerview/recyclerview-benchmark/lint-baseline.xml b/recyclerview/recyclerview-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/recyclerview/recyclerview-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/recyclerview/recyclerview-lint/lint-baseline.xml b/recyclerview/recyclerview-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/recyclerview/recyclerview-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/recyclerview/recyclerview-lint/src/test/java/androidx/recyclerview/lint/ApiLintVersionsTest.kt b/recyclerview/recyclerview-lint/src/test/java/androidx/recyclerview/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..c291741
--- /dev/null
+++ b/recyclerview/recyclerview-lint/src/test/java/androidx/recyclerview/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.recyclerview.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = RecyclerViewIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/recyclerview/recyclerview-selection/build.gradle b/recyclerview/recyclerview-selection/build.gradle
index ed62d02..d7fcd32 100644
--- a/recyclerview/recyclerview-selection/build.gradle
+++ b/recyclerview/recyclerview-selection/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    api project(":recyclerview:recyclerview")
+    api("androidx.recyclerview:recyclerview:1.2.0")
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
@@ -33,9 +33,9 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(JUNIT)
 }
 
diff --git a/recyclerview/recyclerview-selection/lint-baseline.xml b/recyclerview/recyclerview-selection/lint-baseline.xml
index 15af4d4..b0dc212 100644
--- a/recyclerview/recyclerview-selection/lint-baseline.xml
+++ b/recyclerview/recyclerview-selection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/GridModelTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/GridModelTest.java
index 249463c..ecbe07f 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/GridModelTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/GridModelTest.java
@@ -32,10 +32,12 @@
 import androidx.test.filters.SmallTest;
 
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -66,6 +68,13 @@
     private Point mSelectionOrigin;
     private Point mSelectionPoint;
 
+    @Before
+    public void setUp() {
+        mModel = null;
+        mHost = null;
+        mLastSelection = new HashSet<>();
+    }
+
     @After
     public void tearDown() {
         mModel = null;
@@ -74,6 +83,16 @@
     }
 
     @Test
+    public void testEmptyGridHost() {
+        initData(0, 5);
+        startSelection(new Point(0, 10));
+        // we mostly don't want a crash here.
+        resizeSelection(new Point(1, 11));
+        assertNoSelection();
+        assertEquals(NOT_SET, mModel.getPositionNearestOrigin());
+    }
+
+    @Test
     public void testSelectionLeftOfItems() {
         initData(20, 5);
         startSelection(new Point(0, 10));
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GridModel.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GridModel.java
index 8453b41..ebcc890 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GridModel.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GridModel.java
@@ -17,6 +17,7 @@
 package androidx.recyclerview.selection;
 
 import static androidx.core.util.Preconditions.checkArgument;
+import static androidx.core.util.Preconditions.checkState;
 
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -145,6 +146,7 @@
 
         mIsActive = true;
         mPointer = mHost.createAbsolutePoint(relativeOrigin);
+
         mRelOrigin = createRelativePoint(mPointer);
         mRelPointer = createRelativePoint(mPointer);
         computeCurrentSelection();
@@ -171,7 +173,11 @@
      */
     void resizeSelection(Point relativePointer) {
         mPointer = mHost.createAbsolutePoint(relativePointer);
-        updateModel();
+        // Should probably never been empty at this point, yet we guard against
+        // known exceptions because wholesome goodness.
+        if (!isEmpty()) {
+            updateModel();
+        }
     }
 
     /**
@@ -191,7 +197,12 @@
         mPointer.x += dx;
         mPointer.y += dy;
         recordVisibleChildren();
-        updateModel();
+
+        // Should probably never been empty at this point, yet we guard against
+        // known exceptions because wholesome goodness.
+        if (!isEmpty()) {
+            updateModel();
+        }
     }
 
     /**
@@ -258,7 +269,9 @@
      * in a selection change and, if it has, notifies listeners of this change.
      */
     private void updateModel() {
+        checkState(!isEmpty());
         RelativePoint old = mRelPointer;
+
         mRelPointer = createRelativePoint(mPointer);
         if (mRelPointer.equals(old)) {
             return;
@@ -590,6 +603,11 @@
     }
 
     RelativePoint createRelativePoint(Point point) {
+        // mColumnBounds and mRowBounds is empty when there are no items in the view.
+        // Clients have to verify items exist before calling this method.
+        checkState(!mColumnBounds.isEmpty(), "Column bounds not established.");
+        checkState(!mRowBounds.isEmpty(), "Row bounds not established.");
+
         return new RelativePoint(
                 new RelativeCoordinate(mColumnBounds, point.x),
                 new RelativeCoordinate(mRowBounds, point.y));
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
index 2bc3987..fe0db3e 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
@@ -394,13 +394,14 @@
     }
 
     /**
-     * Builder is the primary mechanism for create a {@link SelectionTracker} that
+     * Builder is the primary mechanism for creating a {@link SelectionTracker} that
      * can be used with your RecyclerView. Once installed, users will be able to create and
-     * manipulate selection using a variety of intuitive techniques like tap, gesture,
-     * and mouse lasso.
+     * manipulate a selection of items in a RecyclerView instance using a variety of
+     * intuitive techniques like tap, gesture, and mouse-based band selection (aka 'lasso').
      *
      * <p>
      * Building a bare-bones instance:
+     *
      * <pre>SelectionTracker<Uri> tracker = new SelectionTracker.Builder<>(
      *        "my-uri-selection",
      *        recyclerView,
@@ -414,13 +415,12 @@
      * <b>Restricting which items can be selected and limiting selection size</b>
      *
      * <p>
-     * {@link SelectionPredicate} provides a mechanism to restrict which Items can be selected,
-     * to limit the number of items that can be selected, as well as allowing the selection
-     * code to be placed into "single select" mode, which as the name indicates, constrains
-     * the selection size to a single item.
-     *
-     * <p>Configuring the tracker for single single selection support can be done
-     * by supplying {@link SelectionPredicates#createSelectSingleAnything()}.
+     * {@link SelectionPredicate} and
+     * {@link SelectionTracker.Builder#withSelectionPredicate(SelectionPredicate)}
+     * together provide a mechanism for restricting which items can be selected and
+     * limiting selection size. Use {@link SelectionPredicates#createSelectSingleAnything()}
+     * for single-selection, or write your own {@link SelectionPredicate} if other
+     * constraints are required.
      *
      * SelectionTracker<String> tracker = new SelectionTracker.Builder<>(
      *               "my-string-selection",
@@ -438,17 +438,17 @@
      * <p>
      * Support for storage/persistence of selection must be configured and invoked manually
      * owing to its reliance on Activity lifecycle events.
-     * Failure to include support for selection storage would result in the active selection
-     * being lost when the Activity receives a configuration change (e.g. rotation)
-     * or when the application process is destroyed by the OS to reclaim resources.
-     * For this reason {@link StorageStrategy} is a required argument to obtain a {@link Builder}
+     * Failure to include support for selection storage will result in selection
+     * being lost when the Activity receives a configuration change (e.g. rotation),
+     * or when the application is paused or stopped. For this reason
+     * {@link StorageStrategy} is a required argument to obtain a {@link Builder}
      * instance.
      *
      * <p>
      * <b>Key Type</b>
      *
      * <p>
-     * Developers must decide on the key type used to identify selected items.
+     * A developer must decide on the key type used to identify selected items.
      * Support is provided for three types: {@link Parcelable}, {@link String}, and {@link Long}.
      *
      * <p>
@@ -469,6 +469,7 @@
      *
      * See {@link StableIdKeyProvider} for important details and limitations (<i>and a suggestion
      * that you might just want to write your own {@link ItemKeyProvider}. It's easy!</i>)
+     * See the "Gotchas" selection below for details on selection size limits.
      *
      * <p>
      * Usage:
@@ -477,8 +478,6 @@
      * private SelectionTracker<Uri> mTracker;
      *
      * public void onCreate(Bundle savedInstanceState) {
-     * // See above for details on constructing a SelectionTracker instance.
-     *
      * if (savedInstanceState != null) {
      * mTracker.onRestoreInstanceState(savedInstanceState);
      * }
@@ -496,6 +495,29 @@
      *            {@link StorageStrategy#createStringStorage()},
      *            {@link StorageStrategy#createParcelableStorage(Class)},
      *            {@link StorageStrategy#createLongStorage()}
+     *
+     * <p>
+     * <b>Gotchas</b>
+     *
+     * <p>TransactionTooLargeException:
+     *
+     * <p>Many factors affect the maximum number of items that can be persisted when the application
+     * is paused or stopped. Unfortunately that number is not deterministic as it depends on the
+     * size of the key type used for selection, the number of selected items, and external demand
+     * on system resources. For that reason it is best to use the smallest viable key type,
+     * and to enforce a limit on the number of items that can be selected.
+     *
+     * <p>Furthermore the inability to persist a selection during a lifecycle event
+     * will result in a android.os.{@link android.os.TransactionTooLargeException}.
+     * See http://issuetracker.google.com/168706011 for details.
+     *
+     * <p>ItemTouchHelper
+     *
+     * <p>When using {@link SelectionTracker} along side an
+     * {@link androidx.recyclerview.widget.ItemTouchHelper} with the same RecyclerView instance
+     * the SelectionTracker instance must be created and installed before the ItemTouchHelper.
+     * Failure to do so will result in unintended selections during item drag operations,
+     * and possibly other situations.
      */
     public static final class Builder<K> {
 
diff --git a/recyclerview/recyclerview/build.gradle b/recyclerview/recyclerview/build.gradle
index a6fe293..ab0a17a 100644
--- a/recyclerview/recyclerview/build.gradle
+++ b/recyclerview/recyclerview/build.gradle
@@ -19,9 +19,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
     androidTestImplementation(JUNIT)
     androidTestImplementation(KOTLIN_STDLIB)
@@ -36,10 +36,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     sourceSets {
         main.res.srcDirs "res", "res-public"
     }
diff --git a/recyclerview/recyclerview/lint-baseline.xml b/recyclerview/recyclerview/lint-baseline.xml
index 09b78bd..fe668a0 100644
--- a/recyclerview/recyclerview/lint-baseline.xml
+++ b/recyclerview/recyclerview/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -63,7 +63,7 @@
         errorLine2="                             ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="7412"
+            line="7406"
             column="30"/>
     </issue>
 
@@ -74,7 +74,7 @@
         errorLine2="                          ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11779"
+            line="11773"
             column="27"/>
     </issue>
 
@@ -2153,7 +2153,7 @@
         errorLine2="                                    ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="5931"
+            line="5921"
             column="37"/>
     </issue>
 
@@ -2164,7 +2164,7 @@
         errorLine2="                                         ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8151"
+            line="8145"
             column="42"/>
     </issue>
 
@@ -2175,7 +2175,7 @@
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8175"
+            line="8169"
             column="44"/>
     </issue>
 
@@ -2186,7 +2186,7 @@
         errorLine2="                                              ~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8211"
+            line="8205"
             column="47"/>
     </issue>
 
@@ -2197,7 +2197,7 @@
         errorLine2="                                                                     ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8390"
+            line="8384"
             column="70"/>
     </issue>
 
@@ -2208,7 +2208,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8391"
+            line="8385"
             column="17"/>
     </issue>
 
@@ -2219,7 +2219,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8419"
+            line="8413"
             column="17"/>
     </issue>
 
@@ -2230,7 +2230,7 @@
         errorLine2="                                    ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8452"
+            line="8446"
             column="37"/>
     </issue>
 
@@ -2241,7 +2241,7 @@
         errorLine2="                                       ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8470"
+            line="8464"
             column="40"/>
     </issue>
 
@@ -2252,7 +2252,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8491"
+            line="8485"
             column="40"/>
     </issue>
 
@@ -2263,7 +2263,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8498"
+            line="8492"
             column="42"/>
     </issue>
 
@@ -2274,7 +2274,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8525"
+            line="8519"
             column="42"/>
     </issue>
 
@@ -2285,7 +2285,7 @@
         errorLine2="                                                            ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8525"
+            line="8519"
             column="61"/>
     </issue>
 
@@ -2296,7 +2296,7 @@
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8589"
+            line="8583"
             column="38"/>
     </issue>
 
@@ -2307,7 +2307,7 @@
         errorLine2="                                                        ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8589"
+            line="8583"
             column="57"/>
     </issue>
 
@@ -2318,7 +2318,7 @@
         errorLine2="                                      ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8604"
+            line="8598"
             column="39"/>
     </issue>
 
@@ -2329,7 +2329,7 @@
         errorLine2="                        ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8622"
+            line="8616"
             column="25"/>
     </issue>
 
@@ -2340,7 +2340,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8634"
+            line="8628"
             column="42"/>
     </issue>
 
@@ -2351,7 +2351,7 @@
         errorLine2="               ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8651"
+            line="8645"
             column="16"/>
     </issue>
 
@@ -2362,7 +2362,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8651"
+            line="8645"
             column="50"/>
     </issue>
 
@@ -2373,7 +2373,7 @@
         errorLine2="               ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8675"
+            line="8669"
             column="16"/>
     </issue>
 
@@ -2384,7 +2384,7 @@
         errorLine2="                                                 ~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8675"
+            line="8669"
             column="50"/>
     </issue>
 
@@ -2395,7 +2395,7 @@
         errorLine2="                                                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8675"
+            line="8669"
             column="61"/>
     </issue>
 
@@ -2406,7 +2406,7 @@
         errorLine2="                                                ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8692"
+            line="8686"
             column="49"/>
     </issue>
 
@@ -2417,7 +2417,7 @@
         errorLine2="                                                                   ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8692"
+            line="8686"
             column="68"/>
     </issue>
 
@@ -2428,7 +2428,7 @@
         errorLine2="                                              ~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8709"
+            line="8703"
             column="47"/>
     </issue>
 
@@ -2439,7 +2439,7 @@
         errorLine2="                                                                 ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8709"
+            line="8703"
             column="66"/>
     </issue>
 
@@ -2450,7 +2450,7 @@
         errorLine2="                                           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8756"
+            line="8750"
             column="44"/>
     </issue>
 
@@ -2461,7 +2461,7 @@
         errorLine2="                                                                      ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8756"
+            line="8750"
             column="71"/>
     </issue>
 
@@ -2472,7 +2472,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8771"
+            line="8765"
             column="39"/>
     </issue>
 
@@ -2483,7 +2483,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8805"
+            line="8799"
             column="34"/>
     </issue>
 
@@ -2494,7 +2494,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8824"
+            line="8818"
             column="41"/>
     </issue>
 
@@ -2505,7 +2505,7 @@
         errorLine2="                                        ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8842"
+            line="8836"
             column="41"/>
     </issue>
 
@@ -2516,7 +2516,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8853"
+            line="8847"
             column="29"/>
     </issue>
 
@@ -2527,7 +2527,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8865"
+            line="8859"
             column="29"/>
     </issue>
 
@@ -2538,7 +2538,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="8931"
+            line="8925"
             column="32"/>
     </issue>
 
@@ -2549,7 +2549,7 @@
         errorLine2="                                                               ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="9108"
+            line="9102"
             column="64"/>
     </issue>
 
@@ -2560,7 +2560,7 @@
         errorLine2="                                           ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="10590"
+            line="10584"
             column="44"/>
     </issue>
 
@@ -2571,7 +2571,7 @@
         errorLine2="                      ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="10908"
+            line="10902"
             column="23"/>
     </issue>
 
@@ -2582,7 +2582,7 @@
         errorLine2="                              ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11933"
+            line="11927"
             column="31"/>
     </issue>
 
@@ -2593,7 +2593,7 @@
         errorLine2="                              ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11940"
+            line="11934"
             column="31"/>
     </issue>
 
@@ -2604,7 +2604,7 @@
         errorLine2="                              ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11947"
+            line="11941"
             column="31"/>
     </issue>
 
@@ -2615,7 +2615,7 @@
         errorLine2="                                                           ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11953"
+            line="11947"
             column="60"/>
     </issue>
 
@@ -2626,7 +2626,7 @@
         errorLine2="                                                                           ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11953"
+            line="11947"
             column="76"/>
     </issue>
 
@@ -2637,7 +2637,7 @@
         errorLine2="                                                           ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11958"
+            line="11952"
             column="60"/>
     </issue>
 
@@ -2648,7 +2648,7 @@
         errorLine2="                                                                           ~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11958"
+            line="11952"
             column="76"/>
     </issue>
 
@@ -2659,7 +2659,7 @@
         errorLine2="                            ~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11989"
+            line="11983"
             column="29"/>
     </issue>
 
@@ -2670,7 +2670,7 @@
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11989"
+            line="11983"
             column="40"/>
     </issue>
 
@@ -2681,7 +2681,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="11997"
+            line="11991"
             column="29"/>
     </issue>
 
@@ -2692,7 +2692,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12001"
+            line="11995"
             column="29"/>
     </issue>
 
@@ -2703,7 +2703,7 @@
         errorLine2="                            ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12005"
+            line="11999"
             column="29"/>
     </issue>
 
@@ -2714,7 +2714,7 @@
         errorLine2="                                    ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12359"
+            line="12353"
             column="37"/>
     </issue>
 
@@ -2725,7 +2725,7 @@
         errorLine2="               ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12373"
+            line="12367"
             column="16"/>
     </issue>
 
@@ -2736,7 +2736,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12386"
+            line="12380"
             column="48"/>
     </issue>
 
@@ -2747,7 +2747,7 @@
         errorLine2="                                  ~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12738"
+            line="12732"
             column="35"/>
     </issue>
 
@@ -2758,7 +2758,7 @@
         errorLine2="                   ~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12951"
+            line="12945"
             column="20"/>
     </issue>
 
@@ -2769,7 +2769,7 @@
         errorLine2="                                        ~~~~~~">
         <location
             file="src/main/java/androidx/recyclerview/widget/RecyclerView.java"
-            line="12966"
+            line="12960"
             column="41"/>
     </issue>
 
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
index 7938e7c..1f308a1 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
@@ -2693,6 +2693,7 @@
         });
     }
 
+    @FlakyTest(bugId = 187331322)
     @Test
     public void smoothScrollBy_durationOf1_completesAsynchronously() throws Throwable {
         smoothScrollBy_completesAsynchronously(1);
diff --git a/remotecallback/processor/lint-baseline.xml b/remotecallback/processor/lint-baseline.xml
index afb7aad..2b20e46 100644
--- a/remotecallback/processor/lint-baseline.xml
+++ b/remotecallback/processor/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/remotecallback/remotecallback/build.gradle b/remotecallback/remotecallback/build.gradle
index 2c46eb7..a0ad9c0 100644
--- a/remotecallback/remotecallback/build.gradle
+++ b/remotecallback/remotecallback/build.gradle
@@ -32,8 +32,8 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestAnnotationProcessor (project(":remotecallback:remotecallback-processor"))
 }
 
diff --git a/remotecallback/remotecallback/lint-baseline.xml b/remotecallback/remotecallback/lint-baseline.xml
index 801e281..0f06786 100644
--- a/remotecallback/remotecallback/lint-baseline.xml
+++ b/remotecallback/remotecallback/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="LambdaLast"
diff --git a/resourceinspection/resourceinspection-annotation/build.gradle b/resourceinspection/resourceinspection-annotation/build.gradle
index 284c6e1..246d60c 100644
--- a/resourceinspection/resourceinspection-annotation/build.gradle
+++ b/resourceinspection/resourceinspection-annotation/build.gradle
@@ -26,11 +26,6 @@
     implementation("androidx.annotation:annotation:1.1.0")
 }
 
-java {
-    sourceCompatibility = JavaVersion.VERSION_1_7
-    targetCompatibility = JavaVersion.VERSION_1_7
-}
-
 androidx {
     name = "Android Resource Inspection - Annotations"
     type = LibraryType.PUBLISHED_LIBRARY
diff --git a/resourceinspection/resourceinspection-processor/lint-baseline.xml b/resourceinspection/resourceinspection-processor/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/resourceinspection/resourceinspection-processor/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/benchmark/lint-baseline.xml b/room/benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/room/benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/common/api/current.txt b/room/common/api/current.txt
index ab3d354..a7a1d84 100644
--- a/room/common/api/current.txt
+++ b/room/common/api/current.txt
@@ -1,6 +1,12 @@
 // Signature format: 4.0
 package androidx.room {
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract Class<?> spec() default java.lang.Object.class;
+    method public abstract int to();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ColumnInfo {
     method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
     method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
@@ -32,6 +38,7 @@
   }
 
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations() default {};
     method public abstract Class<?>[] entities();
     method public abstract boolean exportSchema() default true;
     method public abstract int version();
@@ -47,6 +54,23 @@
     method public abstract Class<?> entity() default java.lang.Object.class;
   }
 
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteTable {
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface Embedded {
     method public abstract String prefix() default "";
   }
@@ -142,6 +166,9 @@
     method public abstract boolean autoGenerate() default false;
   }
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedAutoMigrationSpec {
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedTypeConverter {
   }
 
@@ -161,6 +188,25 @@
     method public abstract String[] projection() default {};
   }
 
+  @java.lang.annotation.Repeatable(RenameColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface RewriteQueriesToDropUnusedColumns {
   }
 
diff --git a/room/common/api/public_plus_experimental_current.txt b/room/common/api/public_plus_experimental_current.txt
index ab3d354..a7a1d84 100644
--- a/room/common/api/public_plus_experimental_current.txt
+++ b/room/common/api/public_plus_experimental_current.txt
@@ -1,6 +1,12 @@
 // Signature format: 4.0
 package androidx.room {
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract Class<?> spec() default java.lang.Object.class;
+    method public abstract int to();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ColumnInfo {
     method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
     method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
@@ -32,6 +38,7 @@
   }
 
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations() default {};
     method public abstract Class<?>[] entities();
     method public abstract boolean exportSchema() default true;
     method public abstract int version();
@@ -47,6 +54,23 @@
     method public abstract Class<?> entity() default java.lang.Object.class;
   }
 
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteTable {
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface Embedded {
     method public abstract String prefix() default "";
   }
@@ -142,6 +166,9 @@
     method public abstract boolean autoGenerate() default false;
   }
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedAutoMigrationSpec {
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedTypeConverter {
   }
 
@@ -161,6 +188,25 @@
     method public abstract String[] projection() default {};
   }
 
+  @java.lang.annotation.Repeatable(RenameColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface RewriteQueriesToDropUnusedColumns {
   }
 
diff --git a/room/common/api/restricted_current.txt b/room/common/api/restricted_current.txt
index c88fdd3..220d387 100644
--- a/room/common/api/restricted_current.txt
+++ b/room/common/api/restricted_current.txt
@@ -1,6 +1,12 @@
 // Signature format: 4.0
 package androidx.room {
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract Class<?> spec() default java.lang.Object.class;
+    method public abstract int to();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ColumnInfo {
     method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
     method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
@@ -32,6 +38,7 @@
   }
 
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations() default {};
     method public abstract Class<?>[] entities();
     method public abstract boolean exportSchema() default true;
     method public abstract int version();
@@ -47,6 +54,23 @@
     method public abstract Class<?> entity() default java.lang.Object.class;
   }
 
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface DeleteTable {
+    method public abstract String tableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface Embedded {
     method public abstract String prefix() default "";
   }
@@ -142,6 +166,9 @@
     method public abstract boolean autoGenerate() default false;
   }
 
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedAutoMigrationSpec {
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface ProvidedTypeConverter {
   }
 
@@ -161,6 +188,25 @@
     method public abstract String[] projection() default {};
   }
 
+  @java.lang.annotation.Repeatable(RenameColumn.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries.class) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface RewriteQueriesToDropUnusedColumns {
   }
 
diff --git a/room/common/lint-baseline.xml b/room/common/lint-baseline.xml
index 2d192b4..dbe3c4a 100644
--- a/room/common/lint-baseline.xml
+++ b/room/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/room/common/src/main/java/androidx/room/AutoMigration.java b/room/common/src/main/java/androidx/room/AutoMigration.java
index 54361b0..b6bc1b7 100644
--- a/room/common/src/main/java/androidx/room/AutoMigration.java
+++ b/room/common/src/main/java/androidx/room/AutoMigration.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -25,32 +23,97 @@
 
 
 /**
- * Automatic migration strategy for Room databases.
+ * Declares an automatic migration on a Database.
+ * <p>
+ * An automatic migration is a {@link androidx.room.migration.Migration Migration} that is generated
+ * via the use of database schema files at two versions of a {@link androidx.room.RoomDatabase
+ * RoomDatabase}. Room automatically detects changes on the database between these two schemas,
+ * and constructs a {@link androidx.room.migration.Migration Migration} to migrate between the
+ * two versions. In case of ambiguous scenarios (e.g. column/table rename/deletes), additional
+ * information is required, and can be provided via the
+ * {@link androidx.room.migration.AutoMigrationSpec AutoMigrationSpec} property.
+ * <p>
+ * An auto migration must define the 'from' and 'to' versions of the schema for which a migration
+ * implementation will be generated. A class that implements AutoMigrationSpec can be declared in
+ * the {@link androidx.room.migration.AutoMigrationSpec AutoMigrationSpec} property to either
+ * provide more information for ambiguous scenarios or execute callbacks during the migration.
+ * <p>
+ * If there are any column/table renames/deletes between the two versions of the database
+ * provided then it is said that there are ambiguous scenarios in the migration. In
+ * such scenarios then an {@link androidx.room.migration.AutoMigrationSpec AutoMigrationSpec} is
+ * required and the class provided must be annotated with the relevant change annotation(s):
+ * {@link RenameColumn}, {@link RenameTable}, {@link DeleteColumn} or {@link DeleteTable}. When
+ * no ambiguous scenario is present, then the {@link androidx.room.migration.AutoMigrationSpec
+ * AutoMigrationSpec} property is optional.
+ * <p>
+ * If an auto migration is defined for a database, then {@link androidx.room.Database#exportSchema}
+ * must be set to true.
+ * <p>
+ * Example:
+ * <pre>
+ * {@literal @}Database(
+ *      version = MusicDatabase.LATEST_VERSION,
+ *      entities = {
+ *          Song.class,
+ *          Artist.class
+ *      },
+ *      autoMigrations = {
+ *          {@literal @}AutoMigration (
+ *              from = 1,
+ *              to = 2
+ *          ),
+ *         {@literal @}AutoMigration (
+ *              from = 2,
+ *              to = 3,
+ *              spec = MusicDatabase.MyExampleAutoMigration.class
+ *          )
+ *      },
+ *      exportSchema = true
+ * )
+ * public abstract class MusicDatabase extends RoomDatabase {
+ *     static final int LATEST_VERSION = 3;
  *
- * @hide
+ *    {@literal @}DeleteTable(deletedTableName = "Album")
+ *    {@literal @}RenameTable(fromTableName = "Singer", toTableName = "Artist")
+ *    {@literal @}RenameColumn(
+ *          tableName = "Song",
+ *          fromColumnName = "songName",
+ *          toColumnName = "songTitle"
+ *     )
+ *    {@literal @}DeleteColumn(fromTableName = "Song", deletedColumnName = "genre")
+ *     static class MyExampleAutoMigration implements AutoMigrationSpec {
+ *         {@literal @}Override
+ *          default void onPostMigrate({@literal @}NonNull SupportSQLiteDatabase db) {
+ *              // Invoked once auto migration is done
+ *          }
+ *     }
+ * }
+ * </pre>
+ *
+ * @see androidx.room.RoomDatabase RoomDatabase
+ * @see androidx.room.migration.AutoMigrationSpec AutoMigrationSpec
  */
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public @interface AutoMigration {
     /**
-     * Version of the original database schema to migrate from.
+     * Version of the database schema to migrate from.
      *
-     * @return Version number of the original database schema.
+     * @return Version number of the database to migrate from.
      */
     int from();
 
     /**
-     * Version of the new database schema to migrate to.
+     * Version of the database schema to migrate to.
      *
-     * @return Version number of the new database schema.
+     * @return Version number of the database to migrate to.
      */
     int to();
 
     /**
-     * User implemented custom AutoMigration callback interface.
+     * User implemented custom auto migration spec.
      *
-     * @return Null if the user has not implemented a callback
+     * @return The auto migration specification or none if the user has not implemented a spec
      */
-    Class<?> callback() default Object.class;
+    Class<?> spec() default Object.class;
 }
diff --git a/room/common/src/main/java/androidx/room/Database.java b/room/common/src/main/java/androidx/room/Database.java
index e4f9366..e667c8f 100644
--- a/room/common/src/main/java/androidx/room/Database.java
+++ b/room/common/src/main/java/androidx/room/Database.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -57,13 +55,19 @@
  * <p>
  * Room also verifies all of your queries in {@link Dao} classes while the application is being
  * compiled so that if there is a problem in one of the queries, you will be notified instantly.
+ * <p>
+ * To automatically generate a migration between two versions of the database, assuming you have
+ * the relevant schema files, you are recommended to use {@link AutoMigration} annotations. Note
+ * that if an autoMigration is defined in a database, {@code exportSchema} must be {@code true}.
+ *
  * @see Dao
  * @see Entity
+ * @see AutoMigration
  * @see androidx.room.RoomDatabase RoomDatabase
  */
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-public @interface  Database {
+public @interface Database {
     /**
      * The list of entities included in the database. Each entity turns into a table in the
      * database.
@@ -104,13 +108,16 @@
      */
     boolean exportSchema() default true;
 
-
     /**
      * List of AutoMigrations that can be performed on this Database.
      *
+     * See {@link AutoMigration} for example code usage.
+     *
+     * For more complicated cases not covered by {@link AutoMigration}, runtime defined
+     * {@link androidx.room.migration.Migration Migration} added with
+     * {@link androidx.room.RoomDatabase.Builder#addMigrations addMigrations} can still be used.
+     *
      * @return List of AutoMigration annotations.
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     AutoMigration[] autoMigrations() default {};
 }
diff --git a/room/common/src/main/java/androidx/room/DeleteColumn.java b/room/common/src/main/java/androidx/room/DeleteColumn.java
index 854b969..6ef3ef6 100644
--- a/room/common/src/main/java/androidx/room/DeleteColumn.java
+++ b/room/common/src/main/java/androidx/room/DeleteColumn.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
@@ -25,36 +23,33 @@
 import java.lang.annotation.Target;
 
 /**
- * Repeatable annotation to be used by the user in specifying deleted columns in the new versions
- * of one database.
+ * Repeatable annotation declaring the deleted columns in the {@link AutoMigration#to} version of
+ * an auto migration.
  *
- * @hide
+ * @see AutoMigration
  */
 @Repeatable(DeleteColumn.Entries.class)
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public @interface DeleteColumn {
     /**
-     * Name of the table in the previous version of the database the column was deleted from.
+     * Name of the table in the {@link AutoMigration#from} version of the database the column was
+     * deleted from.
      *
      * @return Name of the table
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     String tableName();
 
     /**
-     * Name of the column deleted in the new version of the database.
+     * Name of the column deleted in the {@link AutoMigration#to} version of the database.
      *
      * @return Name of the column.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String deletedColumnName();
+    String columnName();
 
+    /**
+     * Container annotation for the repeatable annotation {@link DeleteColumn}.
+     */
     @Target(ElementType.TYPE)
     @Retention(RetentionPolicy.CLASS)
     @interface Entries {
diff --git a/room/common/src/main/java/androidx/room/DeleteTable.java b/room/common/src/main/java/androidx/room/DeleteTable.java
index a8dd32f..0897f5f 100644
--- a/room/common/src/main/java/androidx/room/DeleteTable.java
+++ b/room/common/src/main/java/androidx/room/DeleteTable.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
@@ -25,26 +23,25 @@
 import java.lang.annotation.Target;
 
 /**
- * Repeatable annotation to be used by the user in specifying deleted tables between the old and
- * new versions of one database.
+ * Repeatable annotation declaring the deleted tables in the {@link AutoMigration#to} version of
+ * an auto migration.
  *
- * @hide
+ * @see AutoMigration
  */
 @Repeatable(DeleteTable.Entries.class)
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public @interface DeleteTable {
     /**
-     * Name of the table in the previous version of the database to be deleted.
+     * Name of the table in the {@link AutoMigration#from} version of the database to be deleted.
      *
      * @return Name of the table.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String deletedTableName();
+    String tableName();
 
+    /**
+     * Container annotation for the repeatable annotation {@link DeleteTable}.
+     */
     @Target(ElementType.TYPE)
     @Retention(RetentionPolicy.CLASS)
     @interface Entries {
diff --git a/room/common/src/main/java/androidx/room/ProvidedAutoMigrationSpec.java b/room/common/src/main/java/androidx/room/ProvidedAutoMigrationSpec.java
new file mode 100644
index 0000000..ee63b76
--- /dev/null
+++ b/room/common/src/main/java/androidx/room/ProvidedAutoMigrationSpec.java
@@ -0,0 +1,35 @@
+/*
+ * 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.room;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marks a class as an auto migration spec that will be provided to Room at runtime.
+ * <p>
+ * An instance of a class annotated with this annotation has to be provided to Room using
+ * {@code Room.databaseBuilder.addAutoMigrationSpec(AutoMigrationSpec)}. Room will verify that
+ * the spec is provided in the builder configuration and if not, an
+ * {@link IllegalArgumentException} will be thrown.
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.CLASS)
+public @interface ProvidedAutoMigrationSpec {
+}
diff --git a/room/common/src/main/java/androidx/room/RenameColumn.java b/room/common/src/main/java/androidx/room/RenameColumn.java
index 8663c6f..9d07032 100644
--- a/room/common/src/main/java/androidx/room/RenameColumn.java
+++ b/room/common/src/main/java/androidx/room/RenameColumn.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
@@ -25,46 +23,41 @@
 import java.lang.annotation.Target;
 
 /**
- * Repeatable annotation to be used by the user in specifying renamed columns between the old and
- * new versions of one database.
+ * Repeatable annotation declaring the renamed columns in the {@link AutoMigration#to} version of
+ * an auto migration.
  *
- * @hide
+ * @see AutoMigration
  */
 @Repeatable(RenameColumn.Entries.class)
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public @interface RenameColumn {
     /**
-     * Name of the table the renamed column is found in.
+     * Name of the table in the {@link AutoMigration#from} version of the database the renamed
+     * column is found in. The name in {@link AutoMigration#from} version is used in case the table
+     * was renamed in the {@link AutoMigration#to} version.
      *
      * @return Name of the table
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     String tableName();
 
     /**
-     * Original name of the column to be renamed from.
+     * Name of the column in the {@link AutoMigration#from} version of the database.
      *
-     * @return Name of the column in the previous version of the database.
-     *
-     * @hide
+     * @return Name of the column.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String originalColumnName();
+    String fromColumnName();
 
     /**
-     * New name of the column to be renamed to.
+     * Name of the column in the {@link AutoMigration#to} version of the database.
      *
-     * @return Name of the column in the new version of the database.
-     *
-     * @hide
+     * @return Name of the column.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String newColumnName();
+    String toColumnName();
 
+    /**
+     * Container annotation for the repeatable annotation {@link RenameColumn}.
+     */
     @Target(ElementType.TYPE)
     @Retention(RetentionPolicy.CLASS)
     @interface Entries {
diff --git a/room/common/src/main/java/androidx/room/RenameTable.java b/room/common/src/main/java/androidx/room/RenameTable.java
index 4599033..b9c9aef 100644
--- a/room/common/src/main/java/androidx/room/RenameTable.java
+++ b/room/common/src/main/java/androidx/room/RenameTable.java
@@ -16,8 +16,6 @@
 
 package androidx.room;
 
-import androidx.annotation.RestrictTo;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Repeatable;
 import java.lang.annotation.Retention;
@@ -26,36 +24,32 @@
 
 
 /**
- * Repeatable annotation to be used by the user in specifying renamed tables between the old and
- * new versions of one database.
+ * Repeatable annotation declaring the renamed tables in the new version of an auto migration.
  *
- * @hide
+ * @see AutoMigration
+ *
  */
 @Repeatable(RenameTable.Entries.class)
 @Target(ElementType.TYPE)
 @Retention(RetentionPolicy.CLASS)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public @interface RenameTable {
     /**
-     * Name of the table in the previous version of the database.
+     * Name of the table in the {@link AutoMigration#from} version of the database.
      *
-     * @return Original name of the table.
-     *
-     * @hide
+     * @return Name of the table to rename from.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String originalTableName();
+    String fromTableName();
 
     /**
-     * Name of the table in the new version of the database.
+     * Name of the table in the {@link AutoMigration#to} version of the database.
      *
-     * @return New name of the table.
-     *
-     * @hide
+     * @return Name of the table to rename to.
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    String newTableName();
+    String toTableName();
 
+    /**
+     * Container annotation for the repeatable annotation {@link RenameTable}.
+     */
     @Target(ElementType.TYPE)
     @Retention(RetentionPolicy.CLASS)
     @interface Entries {
diff --git a/room/compiler-processing-testing/build.gradle b/room/compiler-processing-testing/build.gradle
index e7feb20..9ef5aef 100644
--- a/room/compiler-processing-testing/build.gradle
+++ b/room/compiler-processing-testing/build.gradle
@@ -30,11 +30,11 @@
     implementation("androidx.annotation:annotation:1.1.0")
     api(project(":room:room-compiler-processing"))
     implementation(KOTLIN_STDLIB)
-    implementation(KOTLIN_KSP_API)
+    implementation(libs.kspApi)
     implementation(KOTLIN_STDLIB_JDK8) // KSP defines older version as dependency, force update.
-    implementation(KOTLIN_KSP)
+    implementation(libs.ksp)
     implementation(GOOGLE_COMPILE_TESTING)
-    implementation(KOTLIN_COMPILE_TESTING_KSP)
+    implementation(KOTLIN_COMPILE_TESTING)
     // specify these to match the kotlin compiler version in AndroidX rather than what KSP or KCT
     // uses
     implementation(KOTLIN_COMPILER_EMBEDDABLE)
@@ -66,7 +66,10 @@
     }
 }
 
-tasks.named("compileKotlin").configure {
+tasks.named("sourceJar").configure {
+    dependsOn(writeTestPropsTask)
+}
+tasks.named("processResources").configure {
     dependsOn(writeTestPropsTask)
 }
 // enable opt in only for tests so that we don't create non experimental APIs by mistake
diff --git a/room/compiler-processing-testing/lint-baseline.xml b/room/compiler-processing-testing/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/room/compiler-processing-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
index c2f0594..a179a1c 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
@@ -20,6 +20,7 @@
 import com.google.devtools.ksp.processing.KSPLogger
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.processing.SymbolProcessor
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.google.devtools.ksp.symbol.KSAnnotated
 
 @ExperimentalProcessingApi
@@ -29,6 +30,7 @@
     constructor(handlers: List<(XTestInvocation) -> Unit>) : this(
         SyntheticProcessorImpl(handlers)
     )
+
     private lateinit var options: Map<String, String>
     private lateinit var codeGenerator: CodeGenerator
     private lateinit var logger: KSPLogger
@@ -36,9 +38,8 @@
     override fun finish() {
     }
 
-    override fun init(
+    fun internalInit(
         options: Map<String, String>,
-        kotlinVersion: KotlinVersion,
         codeGenerator: CodeGenerator,
         logger: KSPLogger
     ) {
@@ -64,4 +65,24 @@
         impl.runNextRound(testInvocation)
         return emptyList()
     }
+
+    internal fun asProvider(): SymbolProcessorProvider = Provider(this)
+
+    private class Provider(
+        private val delegate: SyntheticKspProcessor
+    ) : SymbolProcessorProvider {
+        override fun create(
+            options: Map<String, String>,
+            kotlinVersion: KotlinVersion,
+            codeGenerator: CodeGenerator,
+            logger: KSPLogger
+        ): SymbolProcessor {
+            delegate.internalInit(
+                options = options,
+                codeGenerator = codeGenerator,
+                logger = logger
+            )
+            return delegate
+        }
+    }
 }
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
index d355723..64b77f4 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/ProcessorTestExt.kt
@@ -26,10 +26,10 @@
 import androidx.room.compiler.processing.util.runner.TestCompilationParameters
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import com.google.devtools.ksp.processing.SymbolProcessor
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.tschuchort.compiletesting.KotlinCompilation
 import com.tschuchort.compiletesting.kspArgs
-import com.tschuchort.compiletesting.symbolProcessors
+import com.tschuchort.compiletesting.symbolProcessorProviders
 import java.io.ByteArrayOutputStream
 import java.io.File
 import javax.annotation.processing.Processor
@@ -311,14 +311,15 @@
  * @param sources The list of source files to compile
  * @param options The annotation processor arguments
  * @param annotationProcessors The list of Java annotation processors to run with compilation
- * @param symbolProcessors The list of Kotlin symbol processors to run with compilation
+ * @param symbolProcessorProviders The list of Kotlin symbol processor providers to run with
+ * compilation
  * @param javacArguments The command line arguments that will be passed into javac
  */
 fun compileFiles(
     sources: List<Source>,
     options: Map<String, String> = emptyMap(),
     annotationProcessors: List<Processor> = emptyList(),
-    symbolProcessors: List<SymbolProcessor> = emptyList(),
+    symbolProcessorProviders: List<SymbolProcessorProvider> = emptyList(),
     javacArguments: List<String> = emptyList()
 ): File {
     val outputStream = ByteArrayOutputStream()
@@ -329,12 +330,12 @@
     if (annotationProcessors.isNotEmpty()) {
         compilation.kaptArgs.putAll(options)
     }
-    if (symbolProcessors.isNotEmpty()) {
+    if (symbolProcessorProviders.isNotEmpty()) {
         compilation.kspArgs.putAll(options)
     }
     compilation.javacArguments.addAll(javacArguments)
     compilation.annotationProcessors = annotationProcessors
-    compilation.symbolProcessors = symbolProcessors
+    compilation.symbolProcessorProviders = symbolProcessorProviders
     val result = compilation.compile()
     check(result.exitCode == KotlinCompilation.ExitCode.OK) {
         "compilation failed: ${outputStream.toString(Charsets.UTF_8)}"
diff --git a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
index 78308ba..4a2e263 100644
--- a/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
+++ b/room/compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/runner/KspCompilationTestRunner.kt
@@ -27,7 +27,7 @@
 import com.tschuchort.compiletesting.SourceFile
 import com.tschuchort.compiletesting.kspArgs
 import com.tschuchort.compiletesting.kspSourcesDir
-import com.tschuchort.compiletesting.symbolProcessors
+import com.tschuchort.compiletesting.symbolProcessorProviders
 import java.io.ByteArrayOutputStream
 import java.io.File
 import javax.tools.Diagnostic
@@ -59,7 +59,7 @@
             classpaths = params.classpath
         )
         kspCompilation.kspArgs.putAll(params.options)
-        kspCompilation.symbolProcessors = listOf(syntheticKspProcessor)
+        kspCompilation.symbolProcessorProviders = listOf(syntheticKspProcessor.asProvider())
         kspCompilation.compile()
         // ignore KSP result for now because KSP stops compilation, which might create false
         // negatives when java code accesses kotlin code.
diff --git a/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt b/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt
new file mode 100644
index 0000000..a4ff231
--- /dev/null
+++ b/room/compiler-processing-testing/src/main/java/com/tschuchort/compiletesting/KspKotlinCompileTesting.kt
@@ -0,0 +1,214 @@
+/*
+ * 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.
+ */
+
+/**
+ * This file replicates the KSP support in KotlinCompileTesting as a workaround not to wait for
+ * the library to take KSP updates.
+ *
+ * Ideally, this file should either disappear and replaced with the KCT library OR moved to a
+ * real AndroidX library as a replacement for KCT.
+ *
+ * see: https://github.com/tschuchortdev/kotlin-compile-testing/pull/140
+ */
+package com.tschuchort.compiletesting
+
+import com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension
+import com.google.devtools.ksp.KspOptions
+import com.google.devtools.ksp.processing.KSPLogger
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
+import com.google.devtools.ksp.processing.impl.MessageCollectorBasedKSPLogger
+import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
+import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
+import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
+import org.jetbrains.kotlin.cli.jvm.config.JavaSourceRoot
+import org.jetbrains.kotlin.com.intellij.mock.MockProject
+import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
+import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
+import java.io.File
+
+/**
+ * The list of symbol processors for the kotlin compilation.
+ * https://goo.gle/ksp
+ */
+var KotlinCompilation.symbolProcessorProviders: List<SymbolProcessorProvider>
+    get() = getKspRegistrar().providers
+    set(value) {
+        val registrar = getKspRegistrar()
+        registrar.providers = value
+    }
+
+/**
+ * The directory where generated KSP sources are written
+ */
+val KotlinCompilation.kspSourcesDir: File
+    get() = kspWorkingDir.resolve("sources")
+
+/**
+ * Arbitrary arguments to be passed to ksp
+ */
+var KotlinCompilation.kspArgs: MutableMap<String, String>
+    get() = getKspRegistrar().options
+    set(value) {
+        val registrar = getKspRegistrar()
+        registrar.options = value
+    }
+
+/**
+ * Controls for enabling incremental processing logs in KSP.
+ */
+var KotlinCompilation.kspIncrementalLog: Boolean
+    get() = getKspRegistrar().incrementalLog
+    set(value) {
+        val registrar = getKspRegistrar()
+        registrar.incrementalLog = value
+    }
+
+private val KotlinCompilation.kspJavaSourceDir: File
+    get() = kspSourcesDir.resolve("java")
+
+private val KotlinCompilation.kspKotlinSourceDir: File
+    get() = kspSourcesDir.resolve("kotlin")
+
+private val KotlinCompilation.kspResources: File
+    get() = kspSourcesDir.resolve("resources")
+
+/**
+ * The working directory for KSP
+ */
+private val KotlinCompilation.kspWorkingDir: File
+    get() = workingDir.resolve("ksp")
+
+/**
+ * The directory where compiled KSP classes are written
+ */
+// TODO this seems to be ignored by KSP and it is putting classes into regular classes directory
+//  but we still need to provide it in the KSP options builder as it is required
+//  once it works, we should make the property public.
+private val KotlinCompilation.kspClassesDir: File
+    get() = kspWorkingDir.resolve("classes")
+
+/**
+ * The directory where compiled KSP caches are written
+ */
+private val KotlinCompilation.kspCachesDir: File
+    get() = kspWorkingDir.resolve("caches")
+
+/**
+ * Custom subclass of [AbstractKotlinSymbolProcessingExtension] where processors are pre-defined
+ * instead of being
+ * loaded via ServiceLocator.
+ */
+private class KspTestExtension(
+    options: KspOptions,
+    processorProviders: List<SymbolProcessorProvider>,
+    logger: KSPLogger
+) : AbstractKotlinSymbolProcessingExtension(
+    options = options,
+    logger = logger,
+    testMode = false
+) {
+    private val loadedProviders = processorProviders
+
+    override fun loadProviders() = loadedProviders
+}
+
+/**
+ * Registers the [KspTestExtension] to load the given list of processors.
+ */
+private class KspCompileTestingComponentRegistrar(
+    private val compilation: KotlinCompilation
+) : ComponentRegistrar {
+    var providers = emptyList<SymbolProcessorProvider>()
+
+    var options: MutableMap<String, String> = mutableMapOf()
+
+    var incremental: Boolean = false
+    var incrementalLog: Boolean = false
+
+    override fun registerProjectComponents(
+        project: MockProject,
+        configuration: CompilerConfiguration
+    ) {
+        if (providers.isEmpty()) {
+            return
+        }
+        val options = KspOptions.Builder().apply {
+            this.projectBaseDir = compilation.kspWorkingDir
+
+            this.processingOptions.putAll(compilation.kspArgs)
+
+            this.incremental = [email protected]
+            this.incrementalLog = [email protected]
+
+            this.cachesDir = compilation.kspCachesDir.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            this.kspOutputDir = compilation.kspSourcesDir.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            this.classOutputDir = compilation.kspClassesDir.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            this.javaOutputDir = compilation.kspJavaSourceDir.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            this.kotlinOutputDir = compilation.kspKotlinSourceDir.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            this.resourceOutputDir = compilation.kspResources.also {
+                it.deleteRecursively()
+                it.mkdirs()
+            }
+            configuration[CLIConfigurationKeys.CONTENT_ROOTS]
+                ?.filterIsInstance<JavaSourceRoot>()
+                ?.forEach {
+                    this.javaSourceRoots.add(it.file)
+                }
+        }.build()
+
+        // Temporary until friend-paths is fully supported
+        // https://youtrack.jetbrains.com/issue/KT-34102
+        @Suppress("invisible_member")
+        val messageCollectorBasedKSPLogger = MessageCollectorBasedKSPLogger(
+            PrintingMessageCollector(
+                compilation.internalMessageStreamAccess,
+                MessageRenderer.GRADLE_STYLE,
+                compilation.verbose
+            )
+        )
+        val registrar = KspTestExtension(options, providers, messageCollectorBasedKSPLogger)
+        AnalysisHandlerExtension.registerExtension(project, registrar)
+    }
+}
+
+/**
+ * Gets the test registrar from the plugin list or adds if it does not exist.
+ */
+private fun KotlinCompilation.getKspRegistrar(): KspCompileTestingComponentRegistrar {
+    compilerPlugins.firstIsInstanceOrNull<KspCompileTestingComponentRegistrar>()?.let {
+        return it
+    }
+    val kspRegistrar = KspCompileTestingComponentRegistrar(this)
+    compilerPlugins = compilerPlugins + kspRegistrar
+    return kspRegistrar
+}
\ No newline at end of file
diff --git a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt
index 0f9c6a9..87a28e2 100644
--- a/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt
+++ b/room/compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/GeneratedCodeMatchTest.kt
@@ -176,11 +176,11 @@
         val mismatch = SourceFileMismatch(
             expected = Line(
                 pos = 6,
-                content = "val foo: Boolean"
+                content = "public val foo: Boolean"
             ),
             actual = Line(
                 pos = 6,
-                content = "val bar: Boolean"
+                content = "public val bar: Boolean"
             )
         )
         assertThat(result.exceptionOrNull()).hasMessageThat().contains(mismatch.toString())
diff --git a/room/compiler-processing/build.gradle b/room/compiler-processing/build.gradle
index 6f96dda..dbe44c1 100644
--- a/room/compiler-processing/build.gradle
+++ b/room/compiler-processing/build.gradle
@@ -36,14 +36,14 @@
 
     implementation(KOTLIN_METADATA_JVM)
     implementation(INTELLIJ_ANNOTATIONS)
-    implementation(KOTLIN_KSP_API)
+    implementation(libs.kspApi)
     implementation(KOTLIN_STDLIB_JDK8) // KSP defines older version as dependency, force update.
 
     testImplementation(GOOGLE_COMPILE_TESTING)
     testImplementation(JUNIT)
     testImplementation(JSR250)
-    testImplementation(KOTLIN_COMPILE_TESTING_KSP)
-    testImplementation(KOTLIN_KSP)
+    testImplementation(KOTLIN_COMPILE_TESTING)
+    testImplementation(libs.ksp)
     testImplementation(project(":room:room-compiler-processing-testing"))
 }
 
diff --git a/room/compiler-processing/lint-baseline.xml b/room/compiler-processing/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/room/compiler-processing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/MethodCollector.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/MethodCollector.kt
index be23e7b..e3be1a9 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/MethodCollector.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/MethodCollector.kt
@@ -78,7 +78,7 @@
             return false
         }
         // check package
-        return packageName == other.enclosingTypeElement.packageName
+        return packageName == other.requireEnclosingTypeElement().packageName
     }
 }
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
index 2ffba4d..fff671c 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
@@ -23,9 +23,11 @@
  * @see XExecutableElement
  */
 interface XConstructorElement : XExecutableElement {
+    override val enclosingElement: XTypeElement
+
     override val fallbackLocationText: String
         get() = buildString {
-            append(enclosingTypeElement.qualifiedName)
+            append(enclosingElement.qualifiedName)
             append(".<init>")
             append("(")
             append(
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableElement.kt
index e378882..3df684f 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableElement.kt
@@ -23,9 +23,11 @@
  */
 interface XExecutableElement : XHasModifiers, XElement {
     /**
-     * The [XTypeElement] that declared this executable.
+     * The element that declared this executable.
+     *
+     * @see requireEnclosingTypeElement
      */
-    val enclosingTypeElement: XTypeElement
+    val enclosingElement: XElement
     /**
      * The list of parameters that should be passed into this method.
      *
@@ -36,4 +38,13 @@
      * Returns true if this method receives a vararg parameter.
      */
     fun isVarArgs(): Boolean
-}
\ No newline at end of file
+}
+
+/**
+ * Checks the enclosing element is a TypeElement and returns it, otherwise,
+ * throws [IllegalStateException].
+ */
+fun XExecutableElement.requireEnclosingTypeElement(): XTypeElement {
+    return enclosingElement as? XTypeElement
+        ?: error("Required enclosing type element for $this but found $enclosingElement")
+}
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
index a65f3db..bb3701a 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XFieldElement.kt
@@ -21,10 +21,17 @@
  */
 interface XFieldElement : XVariableElement, XHasModifiers {
     /**
-     * The [XTypeElement] that declared this executable.
+     * The element that declared this field.
+     *
+     * @see requireEnclosingTypeElement
      */
-    val enclosingTypeElement: XTypeElement
+    val enclosingElement: XElement
 
     override val fallbackLocationText: String
-        get() = "$name in ${enclosingTypeElement.fallbackLocationText}"
+        get() = "$name in ${enclosingElement.fallbackLocationText}"
+}
+
+fun XFieldElement.requireEnclosingTypeElement(): XTypeElement {
+    return enclosingElement as? XTypeElement
+        ?: error("Required enclosing type element for $this but found $enclosingElement")
 }
\ No newline at end of file
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
index 3845b69..c87c982 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
@@ -41,7 +41,7 @@
 
     override val fallbackLocationText: String
         get() = buildString {
-            append(enclosingTypeElement.qualifiedName)
+            append(enclosingElement.fallbackLocationText)
             append(".")
             append(name)
             append("(")
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacConstructorElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacConstructorElement.kt
index 4145442..b9ca374 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacConstructorElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacConstructorElement.kt
@@ -38,11 +38,11 @@
         }
     }
 
-    override val enclosingTypeElement: XTypeElement by lazy {
+    override val enclosingElement: XTypeElement by lazy {
         element.requireEnclosingType(env)
     }
 
     override val kotlinMetadata: KmConstructor? by lazy {
-        (enclosingTypeElement as? JavacTypeElement)?.kotlinMetadata?.getConstructorMetadata(element)
+        (enclosingElement as? JavacTypeElement)?.kotlinMetadata?.getConstructorMetadata(element)
     }
 }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacFieldElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacFieldElement.kt
index 2ae7beb..dca2f56 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacFieldElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacFieldElement.kt
@@ -32,13 +32,13 @@
     XHasModifiers by JavacHasModifiers(element) {
 
     private val kotlinMetadata: KmProperty? by lazy {
-        (enclosingTypeElement as? JavacTypeElement)?.kotlinMetadata?.getPropertyMetadata(name)
+        (enclosingElement as? JavacTypeElement)?.kotlinMetadata?.getPropertyMetadata(name)
     }
 
     override val kotlinType: KmType?
         get() = kotlinMetadata?.type
 
-    override val enclosingTypeElement: XTypeElement by lazy {
+    override val enclosingElement: XTypeElement by lazy {
         element.requireEnclosingType(env)
     }
 }
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
index 2cfbcda..e4fffe6 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
@@ -48,12 +48,12 @@
     override val name: String
         get() = element.simpleName.toString()
 
-    override val enclosingTypeElement: XTypeElement by lazy {
+    override val enclosingElement: XTypeElement by lazy {
         element.requireEnclosingType(env)
     }
 
     override val kotlinMetadata: KmFunction? by lazy {
-        (enclosingTypeElement as? JavacTypeElement)?.kotlinMetadata?.getFunctionMetadata(element)
+        (enclosingElement as? JavacTypeElement)?.kotlinMetadata?.getFunctionMetadata(element)
     }
 
     override val executableType: JavacMethodType by lazy {
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
index 075f0ea..7a93f35 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
@@ -23,6 +23,7 @@
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSDeclaration
 import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSTypeAlias
 import com.google.devtools.ksp.symbol.KSTypeArgument
 import com.google.devtools.ksp.symbol.KSTypeParameter
 import com.google.devtools.ksp.symbol.KSTypeReference
@@ -56,6 +57,9 @@
  */
 @OptIn(KspExperimental::class)
 internal fun KSDeclaration.typeName(resolver: Resolver): TypeName {
+    if (this is KSTypeAlias) {
+        return this.type.typeName(resolver)
+    }
     // if there is no qualified name, it is a resolution error so just return shared instance
     // KSP may improve that later and if not, we can improve it in Room
     // TODO: https://issuetracker.google.com/issues/168639183
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
index 201cfc7..3d3b83a 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
@@ -46,7 +46,7 @@
         arrayOf(containing, declaration)
     }
 
-    override val enclosingTypeElement: XTypeElement by lazy {
+    override val enclosingElement: XTypeElement by lazy {
         declaration.requireEnclosingTypeElement(env)
     }
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
index dee8141..8955362 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFieldElement.kt
@@ -37,7 +37,7 @@
         arrayOf(declaration, containing)
     }
 
-    override val enclosingTypeElement: XTypeElement by lazy {
+    override val enclosingElement: XTypeElement by lazy {
         declaration.requireEnclosingTypeElement(env)
     }
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
index e07b338..febd6cc 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
@@ -28,6 +28,7 @@
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSClassDeclaration
 import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSTypeAlias
 import com.google.devtools.ksp.symbol.KSTypeArgument
 import com.google.devtools.ksp.symbol.KSTypeParameter
 import com.google.devtools.ksp.symbol.KSTypeReference
@@ -169,8 +170,20 @@
      * decision.
      */
     fun wrap(ksType: KSType, allowPrimitives: Boolean): KspType {
-        val qName = ksType.declaration.qualifiedName?.asString()
         val declaration = ksType.declaration
+        if (declaration is KSTypeAlias) {
+            val actual = wrap(
+                ksType = declaration.type.resolve(),
+                allowPrimitives = allowPrimitives && ksType.nullability == Nullability.NOT_NULL
+            )
+            // if this type is nullable, carry it over
+            return if (ksType.nullability == Nullability.NULLABLE) {
+                actual.makeNullable()
+            } else {
+                actual
+            }
+        }
+        val qName = ksType.declaration.qualifiedName?.asString()
         if (declaration is KSTypeParameter) {
             return KspTypeArgumentType(
                 env = this,
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
index 7495463..91c26a8 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
@@ -54,7 +54,7 @@
         return this
     }
 
-    override fun extendsBound(): XType? {
+    override fun extendsBound(): XType {
         return _extendsBound
     }
 
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
index 2b8c783..9453e19 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/OverrideVarianceResolver.kt
@@ -46,7 +46,7 @@
 ) {
     fun resolve(): XMethodType {
         // Look at the true origin to decide whether we need variance resolution or not.
-        val parentTrueOrigin = (methodType.origin.enclosingTypeElement as? KspTypeElement)
+        val parentTrueOrigin = (methodType.origin.enclosingElement as? KspTypeElement)
             ?.trueOrigin
         if (parentTrueOrigin == Origin.JAVA) {
             return methodType
@@ -96,7 +96,7 @@
             containing = env.wrapClassDeclaration(declaredIn),
             declaration = funDeclaration.findOverridee() ?: funDeclaration
         )
-        val containing = overrideeElm.enclosingTypeElement.type as? KspType ?: return null
+        val containing = overrideeElm.enclosingElement.type as? KspType ?: return null
         return KspMethodType.create(
             env = env,
             origin = overrideeElm,
diff --git a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
index 0cc4857..25613b0 100644
--- a/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
+++ b/room/compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
@@ -67,8 +67,8 @@
 
     final override fun isSuspendFunction() = false
 
-    final override val enclosingTypeElement: XTypeElement
-        get() = this.field.enclosingTypeElement
+    final override val enclosingElement: XTypeElement
+        get() = this.field.enclosingElement
 
     final override fun isVarArgs() = false
 
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt
new file mode 100644
index 0000000..8b864c2
--- /dev/null
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.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.room.compiler.processing
+
+import androidx.room.compiler.processing.util.CONTINUATION_CLASS_NAME
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.className
+import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.getField
+import androidx.room.compiler.processing.util.getMethod
+import androidx.room.compiler.processing.util.runProcessorTest
+import com.google.common.truth.Truth.assertThat
+import com.squareup.javapoet.ParameterizedTypeName
+import com.squareup.javapoet.TypeName
+import com.squareup.javapoet.WildcardTypeName
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class TypeAliasTest {
+    @Test
+    fun kotlinTypeAlias() {
+        fun produceSource(pkg: String) = Source.kotlin(
+            "$pkg/Foo.kt",
+            """
+            package $pkg
+            typealias MyLong = Long
+            class Subject {
+                var prop: MyLong = 1L
+                val nullable: MyLong? = null
+                val inGeneric : List<MyLong> = TODO()
+                suspend fun suspendFun() : MyLong = TODO()
+            }
+            """.trimIndent()
+        )
+        val lib = compileFiles(listOf(produceSource("lib")))
+        runProcessorTest(
+            sources = listOf(produceSource("app")),
+            classpath = listOf(lib)
+        ) { invocation ->
+            listOf("lib", "app").forEach { pkg ->
+                val elm = invocation.processingEnv.requireTypeElement("$pkg.Subject")
+                elm.getField("prop").type.let {
+                    assertThat(it.nullability).isEqualTo(XNullability.NONNULL)
+                    assertThat(it.typeName).isEqualTo(TypeName.LONG)
+                }
+                elm.getField("nullable").type.let {
+                    assertThat(it.nullability).isEqualTo(XNullability.NULLABLE)
+                    assertThat(it.typeName).isEqualTo(TypeName.LONG.box())
+                }
+                elm.getField("inGeneric").type.let {
+                    assertThat(it.nullability).isEqualTo(XNullability.NONNULL)
+                    assertThat(it.typeName).isEqualTo(
+                        ParameterizedTypeName.get(
+                            List::class.className(),
+                            TypeName.LONG.box()
+                        )
+                    )
+                }
+                elm.getMethod("suspendFun").parameters.last().type.let {
+                    assertThat(it.typeName).isEqualTo(
+                        ParameterizedTypeName.get(
+                            CONTINUATION_CLASS_NAME,
+                            WildcardTypeName.supertypeOf(TypeName.LONG.box())
+                        )
+                    )
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
index 6bfd298..7f9c555 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
@@ -25,6 +25,7 @@
 import com.google.devtools.ksp.processing.KSPLogger
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.processing.SymbolProcessor
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.google.devtools.ksp.symbol.ClassKind
 import com.google.devtools.ksp.symbol.KSAnnotated
 import com.google.devtools.ksp.symbol.KSClassDeclaration
@@ -37,7 +38,7 @@
 import com.squareup.javapoet.TypeSpec
 import com.tschuchort.compiletesting.KotlinCompilation
 import com.tschuchort.compiletesting.SourceFile
-import com.tschuchort.compiletesting.symbolProcessors
+import com.tschuchort.compiletesting.symbolProcessorProviders
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
@@ -309,29 +310,25 @@
             }
         }
         var returned: List<KSAnnotated>? = null
-        val processor = object : SymbolProcessor {
-            private lateinit var codeGenerator: CodeGenerator
-            private lateinit var logger: KSPLogger
-
-            override fun init(
+        val processorProvider = object : SymbolProcessorProvider {
+            override fun create(
                 options: Map<String, String>,
                 kotlinVersion: KotlinVersion,
                 codeGenerator: CodeGenerator,
                 logger: KSPLogger
-            ) {
-                this.codeGenerator = codeGenerator
-                this.logger = logger
-            }
-
-            override fun process(resolver: Resolver): List<KSAnnotated> {
-                val env = XProcessingEnv.create(
-                    emptyMap(),
-                    resolver,
-                    codeGenerator,
-                    logger
-                )
-                return processingStep.executeInKsp(env)
-                    .also { returned = it }
+            ): SymbolProcessor {
+                return object : SymbolProcessor {
+                    override fun process(resolver: Resolver): List<KSAnnotated> {
+                        val env = XProcessingEnv.create(
+                            emptyMap(),
+                            resolver,
+                            codeGenerator,
+                            logger
+                        )
+                        return processingStep.executeInKsp(env)
+                            .also { returned = it }
+                    }
+                }
             }
         }
         val main = SourceFile.kotlin(
@@ -348,7 +345,7 @@
         KotlinCompilation().apply {
             workingDir = temporaryFolder.root
             inheritClassPath = true
-            symbolProcessors = listOf(processor)
+            symbolProcessorProviders = listOf(processorProvider)
             sources = listOf(main)
             verbose = false
         }.compile()
diff --git a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
index f6666c4..b173871 100644
--- a/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
+++ b/room/compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspFieldElementTest.kt
@@ -181,8 +181,8 @@
                     )
                 )
 
-            assertThat(t.enclosingTypeElement).isEqualTo(base)
-            assertThat(listOfR.enclosingTypeElement).isEqualTo(base)
+            assertThat(t.enclosingElement).isEqualTo(base)
+            assertThat(listOfR.enclosingElement).isEqualTo(base)
             assertThat(t.asMemberOf(sub.type).typeName).isEqualTo(TypeName.INT.box())
             assertThat(listOfR.asMemberOf(sub.type).typeName)
                 .isEqualTo(
@@ -237,7 +237,7 @@
                     .containsExactlyElementsIn(
                         listOfNotNull(modifier)
                     )
-                assertThat(field.enclosingTypeElement).isEqualTo(element)
+                assertThat(field.enclosingElement).isEqualTo(element)
             }
         }
     }
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 2e448a4..26115ea 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -107,7 +107,7 @@
     implementation(AUTO_COMMON)
     implementation(AUTO_VALUE_ANNOTATIONS)
     implementation(JAVAPOET)
-    implementation(KOTLIN_KSP_API)
+    implementation(libs.kspApi)
     shadowed(ANTLR)
     implementation(XERIAL)
     implementation(KOTLIN_METADATA_JVM)
@@ -234,6 +234,7 @@
     def pomTask = (GenerateMavenPom) project.tasks
             .named("generatePomFileForMavenPublication").get()
     it.pomFile = pomTask.destination
+    it.dependsOn("publishMavenPublicationToMavenRepository")
 }
 
 // make sure we validate published artifacts on the build server.
@@ -241,8 +242,8 @@
 
 tasks.findByName("compileKotlin").dependsOn(generateAntlrTask)
 tasks.findByName("sourceJar").dependsOn(generateAntlrTask)
-tasks.findByName("compileKotlin").dependsOn(":room:room-runtime:jarDebug")
-tasks.findByName("compileKotlin").dependsOn(":sqlite:sqlite:jarDebug")
+tasks.findByName("compileKotlin").dependsOn(":room:room-runtime:jarRelease")
+tasks.findByName("compileKotlin").dependsOn(":sqlite:sqlite:jarRelease")
 
 tasks.withType(KotlinCompile).configureEach {
     kotlinOptions {
diff --git a/room/compiler/lint-baseline.xml b/room/compiler/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/room/compiler/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
index c1f9397..cf32d67 100644
--- a/room/compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/RoomKspProcessor.kt
@@ -21,30 +21,17 @@
 import com.google.devtools.ksp.processing.KSPLogger
 import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.processing.SymbolProcessor
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
 import com.google.devtools.ksp.symbol.KSAnnotated
 
 /**
  * Entry point for processing using KSP.
  */
-class RoomKspProcessor : SymbolProcessor {
-    private lateinit var options: Map<String, String>
-    private lateinit var codeGenerator: CodeGenerator
-    private lateinit var logger: KSPLogger
-
-    override fun finish() {
-    }
-
-    override fun init(
-        options: Map<String, String>,
-        kotlinVersion: KotlinVersion,
-        codeGenerator: CodeGenerator,
-        logger: KSPLogger
-    ) {
-        this.options = options
-        this.codeGenerator = codeGenerator
-        this.logger = logger
-    }
-
+class RoomKspProcessor(
+    private val options: Map<String, String>,
+    private val codeGenerator: CodeGenerator,
+    private val logger: KSPLogger
+) : SymbolProcessor {
     override fun process(resolver: Resolver): List<KSAnnotated> {
         val processingEnv = XProcessingEnv.create(
             options,
@@ -57,4 +44,19 @@
             processingEnv
         )
     }
+
+    class Provider : SymbolProcessorProvider {
+        override fun create(
+            options: Map<String, String>,
+            kotlinVersion: KotlinVersion,
+            codeGenerator: CodeGenerator,
+            logger: KSPLogger
+        ): SymbolProcessor {
+            return RoomKspProcessor(
+                options = options,
+                codeGenerator = codeGenerator,
+                logger = logger
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
index a98a1ce..d57e684 100644
--- a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
@@ -93,9 +93,9 @@
     val CURSOR_UTIL: ClassName =
         ClassName.get("$ROOM_PACKAGE.util", "CursorUtil")
     val MIGRATION: ClassName = ClassName.get("$ROOM_PACKAGE.migration", "Migration")
-    val AUTO_MIGRATION_CALLBACK: ClassName = ClassName.get(
+    val AUTO_MIGRATION_SPEC: ClassName = ClassName.get(
         "$ROOM_PACKAGE.migration",
-        "AutoMigrationCallback"
+        "AutoMigrationSpec"
     )
 }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/AutoMigrationProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/AutoMigrationProcessor.kt
index a6ddb62..94193dd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/AutoMigrationProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/AutoMigrationProcessor.kt
@@ -18,29 +18,28 @@
 
 import androidx.room.DeleteColumn
 import androidx.room.DeleteTable
+import androidx.room.ProvidedAutoMigrationSpec
 import androidx.room.RenameColumn
 import androidx.room.RenameTable
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.ext.RoomTypeNames
 import androidx.room.migration.bundle.DatabaseBundle
-import androidx.room.migration.bundle.SchemaBundle.deserialize
-import androidx.room.processor.ProcessorErrors.AUTOMIGRATION_CALLBACK_MUST_BE_INTERFACE
-import androidx.room.processor.ProcessorErrors.autoMigrationElementMustExtendCallback
+import androidx.room.processor.ProcessorErrors.AUTOMIGRATION_SPEC_MUST_BE_CLASS
+import androidx.room.processor.ProcessorErrors.INNER_CLASS_AUTOMIGRATION_SPEC_MUST_BE_STATIC
+import androidx.room.processor.ProcessorErrors.autoMigrationElementMustImplementSpec
 import androidx.room.processor.ProcessorErrors.autoMigrationToVersionMustBeGreaterThanFrom
 import androidx.room.util.DiffException
 import androidx.room.util.SchemaDiffer
-import androidx.room.vo.AutoMigrationResult
-import java.io.File
+import androidx.room.vo.AutoMigration
 
 // TODO: (b/183435544) Support downgrades in AutoMigrations.
 class AutoMigrationProcessor(
     val element: XTypeElement,
     val context: Context,
-    val from: Int,
-    val to: Int,
-    val callback: XType,
-    val latestDbSchema: DatabaseBundle
+    val spec: XType,
+    val fromSchemaBundle: DatabaseBundle,
+    val toSchemaBundle: DatabaseBundle
 ) {
     /**
      * Retrieves two schemas of the same database provided in the @AutoMigration annotation,
@@ -48,88 +47,91 @@
      *
      * @return the AutoMigrationResult containing the schema changes detected
      */
-    fun process(): AutoMigrationResult? {
-        val callbackElement = callback.typeElement
-        if (!callback.isTypeOf(Any::class)) {
-            if (callbackElement == null) {
-                context.logger.e(element, AUTOMIGRATION_CALLBACK_MUST_BE_INTERFACE)
+    fun process(): AutoMigration? {
+        val isSpecProvided = spec.typeElement?.hasAnnotation(
+            ProvidedAutoMigrationSpec::class
+        ) ?: false
+        val specElement = if (!spec.isTypeOf(Any::class)) {
+            val typeElement = spec.typeElement
+
+            if (typeElement == null || typeElement.isInterface() || typeElement.isAbstract()) {
+                context.logger.e(element, AUTOMIGRATION_SPEC_MUST_BE_CLASS)
                 return null
             }
 
-            if (!callbackElement.isInterface()) {
-                context.logger.e(
-                    callbackElement,
-                    AUTOMIGRATION_CALLBACK_MUST_BE_INTERFACE
+            if (!isSpecProvided) {
+                val constructors = element.getConstructors()
+                context.checker.check(
+                    constructors.isEmpty() || constructors.any { it.parameters.isEmpty() },
+                    element,
+                    ProcessorErrors.AUTOMIGRATION_SPEC_MISSING_NOARG_CONSTRUCTOR
                 )
-                return null
             }
 
-            val extendsMigrationCallback =
-                context.processingEnv.requireType(RoomTypeNames.AUTO_MIGRATION_CALLBACK)
-                    .isAssignableFrom(callback)
-            if (!extendsMigrationCallback) {
+            context.checker.check(
+                typeElement.enclosingTypeElement == null || typeElement.isStatic(),
+                typeElement,
+                INNER_CLASS_AUTOMIGRATION_SPEC_MUST_BE_STATIC
+            )
+
+            val implementsMigrationSpec =
+                context.processingEnv.requireType(RoomTypeNames.AUTO_MIGRATION_SPEC)
+                    .isAssignableFrom(spec)
+            if (!implementsMigrationSpec) {
                 context.logger.e(
-                    callbackElement,
-                    autoMigrationElementMustExtendCallback(callbackElement.className.simpleName())
+                    typeElement,
+                    autoMigrationElementMustImplementSpec(typeElement.className.simpleName())
                 )
                 return null
             }
+            typeElement
+        } else {
+            null
         }
 
-        if (to <= from) {
+        if (toSchemaBundle.version <= fromSchemaBundle.version) {
             context.logger.e(
-                autoMigrationToVersionMustBeGreaterThanFrom(to, from)
+                autoMigrationToVersionMustBeGreaterThanFrom(
+                    toSchemaBundle.version,
+                    fromSchemaBundle.version
+                )
             )
             return null
         }
 
-        val validatedFromSchemaFile = getValidatedSchemaFile(from) ?: return null
-        val fromSchemaBundle = validatedFromSchemaFile.inputStream().use {
-            deserialize(it).database
-        }
-
-        val validatedToSchemaFile = getValidatedSchemaFile(to) ?: return null
-        val toSchemaBundle = if (to == latestDbSchema.version) {
-            latestDbSchema
-        } else {
-            validatedToSchemaFile.inputStream().use {
-                deserialize(it).database
-            }
-        }
-
-        val callbackClassName = callbackElement?.className?.simpleName()
-        val deleteColumnEntries = callbackElement?.let { element ->
+        val specClassName = specElement?.className?.simpleName()
+        val deleteColumnEntries = specElement?.let { element ->
             element.getAnnotations(DeleteColumn::class).map {
-                AutoMigrationResult.DeletedColumn(
+                AutoMigration.DeletedColumn(
                     tableName = it.value.tableName,
-                    columnName = it.value.deletedColumnName
+                    columnName = it.value.columnName
                 )
             }
         } ?: emptyList()
 
-        val deleteTableEntries = callbackElement?.let { element ->
+        val deleteTableEntries = specElement?.let { element ->
             element.getAnnotations(DeleteTable::class).map {
-                AutoMigrationResult.DeletedTable(
-                    deletedTableName = it.value.deletedTableName
+                AutoMigration.DeletedTable(
+                    deletedTableName = it.value.tableName
                 )
             }
         } ?: emptyList()
 
-        val renameTableEntries = callbackElement?.let { element ->
+        val renameTableEntries = specElement?.let { element ->
             element.getAnnotations(RenameTable::class).map {
-                AutoMigrationResult.RenamedTable(
-                    originalTableName = it.value.originalTableName,
-                    newTableName = it.value.newTableName
+                AutoMigration.RenamedTable(
+                    originalTableName = it.value.fromTableName,
+                    newTableName = it.value.toTableName
                 )
             }
         } ?: emptyList()
 
-        val renameColumnEntries = callbackElement?.let { element ->
+        val renameColumnEntries = specElement?.let { element ->
             element.getAnnotations(RenameColumn::class).map {
-                AutoMigrationResult.RenamedColumn(
+                AutoMigration.RenamedColumn(
                     tableName = it.value.tableName,
-                    originalColumnName = it.value.originalColumnName,
-                    newColumnName = it.value.newColumnName
+                    originalColumnName = it.value.fromColumnName,
+                    newColumnName = it.value.toColumnName
                 )
             }
         } ?: emptyList()
@@ -138,7 +140,7 @@
             SchemaDiffer(
                 fromSchemaBundle = fromSchemaBundle,
                 toSchemaBundle = toSchemaBundle,
-                className = callbackClassName,
+                className = specClassName,
                 deleteColumnEntries = deleteColumnEntries,
                 deleteTableEntries = deleteTableEntries,
                 renameTableEntries = renameTableEntries,
@@ -149,30 +151,13 @@
             return null
         }
 
-        return AutoMigrationResult(
+        return AutoMigration(
             element = element,
             from = fromSchemaBundle.version,
             to = toSchemaBundle.version,
-            schemaDiff = schemaDiff
+            schemaDiff = schemaDiff,
+            specElement = specElement,
+            isSpecProvided = isSpecProvided,
         )
     }
-
-    // TODO: (b/180389433) Verify automigration schemas before calling the AutoMigrationProcessor
-    private fun getValidatedSchemaFile(version: Int): File? {
-        val schemaFile = File(
-            context.schemaOutFolder,
-            "${element.className.canonicalName()}/$version.json"
-        )
-        if (!schemaFile.exists()) {
-            context.logger.e(
-                ProcessorErrors.autoMigrationSchemasNotFound(
-                    context.schemaOutFolder.toString(),
-                    "${element.className.canonicalName()}/$version.json"
-                ),
-                element
-            )
-            return null
-        }
-        return schemaFile
-    }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index 76dcc58..de7ea10 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -22,11 +22,16 @@
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
+import androidx.room.compiler.processing.requireEnclosingTypeElement
 import androidx.room.ext.RoomTypeNames
 import androidx.room.migration.bundle.DatabaseBundle
+import androidx.room.migration.bundle.SchemaBundle
+import androidx.room.processor.ProcessorErrors.AUTO_MIGRATION_FOUND_BUT_EXPORT_SCHEMA_OFF
+import androidx.room.processor.ProcessorErrors.AUTO_MIGRATION_SCHEMA_OUT_FOLDER_NULL
+import androidx.room.processor.ProcessorErrors.autoMigrationSchemasMustBeRoomGenerated
+import androidx.room.processor.ProcessorErrors.invalidAutoMigrationSchema
 import androidx.room.verifier.DatabaseVerificationErrors
 import androidx.room.verifier.DatabaseVerifier
-import androidx.room.vo.AutoMigrationResult
 import androidx.room.vo.Dao
 import androidx.room.vo.DaoMethod
 import androidx.room.vo.Database
@@ -36,6 +41,8 @@
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
 import com.squareup.javapoet.TypeName
+import java.io.File
+import java.io.FileInputStream
 import java.util.Locale
 
 class DatabaseProcessor(baseContext: Context, val element: XTypeElement) {
@@ -84,7 +91,7 @@
             it.isAbstract()
         }.filterNot {
             // remove methods that belong to room
-            it.enclosingTypeElement.className == RoomTypeNames.ROOM_DB
+            it.requireEnclosingTypeElement().className == RoomTypeNames.ROOM_DB
         }.mapNotNull { executable ->
             // TODO when we add support for non Dao return types (e.g. database), this code needs
             // to change
@@ -125,29 +132,121 @@
     private fun processAutoMigrations(
         element: XTypeElement,
         latestDbSchema: DatabaseBundle
-    ): List<AutoMigrationResult> {
+    ): List<androidx.room.vo.AutoMigration> {
         val dbAnnotation = element.getAnnotation(androidx.room.Database::class)!!
+
         val autoMigrationList = dbAnnotation
             .getAsAnnotationBoxArray<AutoMigration>("autoMigrations")
-        context.checker.check(
-            autoMigrationList.isEmpty() || dbAnnotation.value.exportSchema,
-            element,
-            ProcessorErrors.AUTO_MIGRATION_FOUND_BUT_EXPORT_SCHEMA_OFF
-        )
+
+        if (autoMigrationList.isNotEmpty()) {
+            if (!dbAnnotation.value.exportSchema) {
+                context.logger.e(
+                    element,
+                    AUTO_MIGRATION_FOUND_BUT_EXPORT_SCHEMA_OFF
+                )
+                return emptyList()
+            }
+            if (context.schemaOutFolder == null) {
+                context.logger.e(
+                    element,
+                    AUTO_MIGRATION_SCHEMA_OUT_FOLDER_NULL
+                )
+                return emptyList()
+            }
+        }
 
         return autoMigrationList.mapNotNull {
+            val schemaOutFolderPath = context.schemaOutFolder!!.absolutePath +
+                File.separator + element.className.canonicalName()
             val autoMigration = it.value
-            AutoMigrationProcessor(
-                element = element,
-                context = context,
-                from = autoMigration.from,
-                to = autoMigration.to,
-                callback = it.getAsType("callback")!!,
-                latestDbSchema = latestDbSchema
-            ).process()
+            val validatedFromSchemaFile = getValidatedSchemaFile(
+                autoMigration.from,
+                schemaOutFolderPath
+            )
+
+            fun deserializeSchemaFile(fileInputStream: FileInputStream, versionNumber: Int): Any {
+                return try {
+                    SchemaBundle.deserialize(fileInputStream).database
+                } catch (th: Throwable) {
+                    invalidAutoMigrationSchema(
+                        "$versionNumber.json",
+                        schemaOutFolderPath
+                    )
+                }
+            }
+
+            if (validatedFromSchemaFile != null) {
+                val fromSchemaBundle = validatedFromSchemaFile.inputStream().use {
+                    deserializeSchemaFile(it, autoMigration.from)
+                }
+                val toSchemaBundle = if (autoMigration.to == latestDbSchema.version) {
+                    latestDbSchema
+                } else {
+                    val validatedToSchemaFile = getValidatedSchemaFile(
+                        autoMigration.to,
+                        schemaOutFolderPath
+                    )
+                    if (validatedToSchemaFile != null) {
+                        validatedToSchemaFile.inputStream().use {
+                            deserializeSchemaFile(it, autoMigration.to)
+                        }
+                    } else {
+                        return@mapNotNull null
+                    }
+                }
+                if (fromSchemaBundle !is DatabaseBundle || toSchemaBundle !is DatabaseBundle) {
+                    context.logger.e(
+                        element,
+                        autoMigrationSchemasMustBeRoomGenerated(
+                            autoMigration.from,
+                            autoMigration.to
+                        )
+                    )
+                    return@mapNotNull null
+                }
+
+                AutoMigrationProcessor(
+                    element = element,
+                    context = context,
+                    spec = it.getAsType("spec")!!,
+                    fromSchemaBundle = fromSchemaBundle,
+                    toSchemaBundle = toSchemaBundle
+                ).process()
+            } else {
+                null
+            }
         }
     }
 
+    private fun getValidatedSchemaFile(version: Int, schemaOutFolderPath: String): File? {
+        val schemaFile = File(
+            context.schemaOutFolder,
+            element.className.canonicalName() + File.separatorChar + "$version.json"
+        )
+        if (!schemaFile.exists()) {
+            context.logger.e(
+                ProcessorErrors.autoMigrationSchemasNotFound(
+                    "$version.json",
+                    schemaOutFolderPath
+                ),
+                element
+            )
+            return null
+        }
+
+        if (schemaFile.length() <= 0) {
+            context.logger.e(
+                ProcessorErrors.autoMigrationSchemaIsEmpty(
+                    "$version.json",
+                    schemaOutFolderPath
+                ),
+                element
+            )
+            return null
+        }
+        return schemaFile
+    }
+
     private fun validateForeignKeys(element: XTypeElement, entities: List<Entity>) {
         val byTableName = entities.associateBy { it.tableName }
         entities.forEach { entity ->
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
index 103e28e..6d9fc0c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
@@ -200,7 +200,7 @@
                 )
                 field?.let { pkField ->
                     PrimaryKey(
-                        declaredIn = pkField.element.enclosingTypeElement,
+                        declaredIn = pkField.element.enclosingElement,
                         fields = Fields(pkField),
                         autoGenerateId = true
                     )
@@ -210,7 +210,7 @@
         val keysFromPrimaryKeyAnnotations = fields.mapNotNull { field ->
             if (field.element.hasAnnotation(androidx.room.PrimaryKey::class)) {
                 PrimaryKey(
-                    declaredIn = field.element.enclosingTypeElement,
+                    declaredIn = field.element.enclosingElement,
                     fields = Fields(field),
                     autoGenerateId = true
                 )
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index f6a8799..7bbb587 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -35,6 +35,7 @@
     private fun String.trim(): String {
         return this.trimIndent().replace("\n", " ")
     }
+
     val MISSING_QUERY_ANNOTATION = "Query methods must be annotated with ${Query::class.java}"
     val MISSING_INSERT_ANNOTATION = "Insertion methods must be annotated with ${Insert::class.java}"
     val MISSING_DELETE_ANNOTATION = "Deletion methods must be annotated with ${Delete::class.java}"
@@ -112,6 +113,7 @@
         "Query for @DatabaseView must be a SELECT."
     val VIEW_QUERY_CANNOT_TAKE_ARGUMENTS =
         "Query for @DatabaseView cannot take any arguments."
+
     fun viewCircularReferenceDetected(views: List<String>): String {
         return "Circular reference detected among views: ${views.joinToString(", ")}"
     }
@@ -216,6 +218,7 @@
 
     private val DUPLICATE_TABLES_OR_VIEWS =
         "The name \"%s\" is used by multiple entities or views: %s"
+
     fun duplicateTableNames(tableName: String, entityNames: List<String>): String {
         return DUPLICATE_TABLES_OR_VIEWS.format(tableName, entityNames.joinToString(", "))
     }
@@ -794,7 +797,7 @@
     }
 
     fun invalidAutoMigrationTypeInDatabaseAnnotation(): String {
-        return "Invalid AutoMigration type: An automigration in the database must be " +
+        return "Invalid AutoMigration type: An auto migration in the database must be " +
             "an @AutoMigration annotation."
     }
 
@@ -809,12 +812,12 @@
         return "Invalid query argument: $typeName. It must be a class or an interface."
     }
 
-    val AUTOMIGRATION_CALLBACK_MUST_BE_INTERFACE = "The @AutoMigration callback " +
-        "type must be an interface."
+    val AUTOMIGRATION_SPEC_MUST_BE_CLASS = "The AutoMigration spec " +
+        "type must be a class."
 
-    fun autoMigrationElementMustExtendCallback(callback: String): String {
-        return "The AutoMigration callback " +
-            "$callback must extend the AutoMigrationCallback interface."
+    fun autoMigrationElementMustImplementSpec(spec: String): String {
+        return "The AutoMigration spec " +
+            "$spec must implement the AutoMigrationSpec interface."
     }
 
     // TODO: (b/180389433) If the files don't exist the getSchemaFile() method should return
@@ -827,9 +830,28 @@
                 " be greater than the From version."
         }
 
-    fun autoMigrationSchemasNotFound(schemaOutFolderPath: String, versionFile: String): String {
-        return "Schemas required for migration are not found at path: " +
-            "$schemaOutFolderPath$versionFile. Cannot generate auto migrations."
+    fun autoMigrationSchemasNotFound(schemaFile: String, schemaOutFolderPath: String): String {
+        return "Schema '$schemaFile' required for migration was not found at the schema out " +
+            "folder: $schemaOutFolderPath. Cannot generate auto migrations."
+    }
+
+    fun autoMigrationSchemaIsEmpty(schemaFile: String, schemaOutFolderPath: String): String {
+        return "Found empty schema file '$schemaFile' required for migration was not found at the" +
+            " schema out folder: $schemaOutFolderPath. Cannot generate auto migrations."
+    }
+
+    fun invalidAutoMigrationSchema(schemaFile: String, schemaOutFolderPath: String): String {
+        return "Found invalid schema file '$schemaFile.json' at the schema out " +
+            "folder: $schemaOutFolderPath. The schema files must be generated by Room. Cannot " +
+            "generate auto migrations."
+    }
+
+    fun autoMigrationSchemasMustBeRoomGenerated(
+        fromFile: Int,
+        toFile: Int
+    ): String {
+        return "Found invalid schema file(s): '$fromFile.json' and $toFile.json'. The schema " +
+            "files must be generated by Room. Cannot generate auto migrations."
     }
 
     fun newNotNullColumnMustHaveDefaultValue(columnName: String): String {
@@ -855,37 +877,33 @@
             AutoMigration Failure in ‘$className’: Column ‘$columnName’ in table ‘$tableName’ has
             been either removed or renamed. Please annotate ‘$className’ with the @RenameColumn
             or @RemoveColumn annotation to specify the change to be performed:
-            1) RENAME: @RenameColumn.Entries(
-                    @RenameColumn(
+            1) RENAME:
+                @RenameColumn(
                         tableName = "$tableName",
-                        originalColumnName = "$columnName",
-                        newColumnName = <NEW_COLUMN_NAME>
-                    )
+                        fromColumnName = "$columnName",
+                        toColumnName = <NEW_COLUMN_NAME>
                 )
-            2) DELETE: @DeleteColumn.Entries(
-                    @DeleteColumn=(
+            2) DELETE:
+                @DeleteColumn=(
                         tableName = "$tableName",
-                        deletedColumnName = "$columnName"
-                    )
+                        columnName = "$columnName"
                 )
             """
         } else {
             """
-            AutoMigration Failure: Please declare an interface extending 'AutoMigrationCallback',
+            AutoMigration Failure: Please declare an interface extending 'AutoMigrationSpec',
             and annotate with the @RenameColumn or @RemoveColumn annotation to specify the
             change to be performed:
-            1) RENAME: @RenameColumn.Entries(
-                    @RenameColumn(
+            1) RENAME:
+                @RenameColumn(
                         tableName = "$tableName",
-                        originalColumnName = "$columnName",
-                        newColumnName = <NEW_COLUMN_NAME>
-                    )
+                        fromColumnName = "$columnName",
+                        toColumnName = <NEW_COLUMN_NAME>
                 )
-            2) DELETE: @DeleteColumn.Entries(
-                    @DeleteColumn=(
+            2) DELETE:
+                @DeleteColumn=(
                         tableName = "$tableName",
-                        deletedColumnName = "$columnName"
-                    )
+                        columnName = "$columnName"
                 )
             """
         }
@@ -901,17 +919,17 @@
             renamed. Please annotate '$className' with the @RenameTable or @RemoveTable
             annotation to specify the change to be performed:
             1) RENAME: @RenameTable.Entries(
-                    @RenameTable(originalTableName = "$tableName", newTableName = <NEW_TABLE_NAME>))
-            2) DELETE: @DeleteTable.Entries(@DeleteTable(deletedTableName = "$tableName"))
+                @RenameTable(fromTableName = "$tableName", toTableName = <NEW_TABLE_NAME>))
+            2) DELETE: @DeleteTable.Entries(@DeleteTable(tableName = "$tableName"))
             """
         } else {
             """
-            AutoMigration Failure: Please declare an interface extending 'AutoMigrationCallback',
+            AutoMigration Failure: Please declare an interface extending 'AutoMigrationSpec',
             and annotate with the @RenameTable or @RemoveTable
             annotation to specify the change to be performed:
             1) RENAME: @RenameTable.Entries(
-                    @RenameTable(originalTableName = "$tableName", newTableName = <NEW_TABLE_NAME>))
-            2) DELETE: @DeleteTable.Entries(@DeleteTable(deletedTableName = "$tableName"))
+                @RenameTable(fromTableName = "$tableName", toTableName = <NEW_TABLE_NAME>))
+            2) DELETE: @DeleteTable.Entries(@DeleteTable(tableName = "$tableName"))
             """
         }
     }
@@ -929,19 +947,29 @@
     fun conflictingRenameTableAnnotationsFound(annotations: String): String {
         return "Conflicting @RenameTable annotations found: [$annotations]"
     }
+
     fun conflictingRenameColumnAnnotationsFound(annotations: String): String {
         return "Conflicting @RenameColumn annotations found: [$annotations]"
     }
 
-    val AUTO_MIGRATION_FOUND_BUT_EXPORT_SCHEMA_OFF = "Cannot create auto-migrations when export " +
+    val AUTO_MIGRATION_FOUND_BUT_EXPORT_SCHEMA_OFF = "Cannot create auto migrations when export " +
         "schema is OFF."
 
+    val AUTO_MIGRATION_SCHEMA_OUT_FOLDER_NULL = "Schema export directory is not provided to the" +
+        " annotation processor so we cannot import the schema. To generate auto migrations, you " +
+        "must provide `room.schemaLocation` annotation processor argument AND set exportSchema to" +
+        " true."
+
     fun tableWithConflictingPrefixFound(tableName: String): String {
         return "The new version of the schema contains '$tableName' a table name" +
             " with the prefix '_new_', which will cause conflicts for auto migrations. Please use" +
             " a different name."
     }
 
-    val FTS_TABLE_NOT_CURRENTLY_SUPPORTED = "Schemas involving FTS tables are not currently " +
-        "supported."
-}
+    val INNER_CLASS_AUTOMIGRATION_SPEC_MUST_BE_STATIC = "An inner class AutoMigrationSpec must be" +
+        " static."
+
+    val AUTOMIGRATION_SPEC_MISSING_NOARG_CONSTRUCTOR = "Classes that are used as " +
+        "AutoMigrationSpec " +
+        "implementations must have no-argument public constructors."
+}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
index 4f18a69..8e1e745 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
@@ -20,6 +20,7 @@
 import androidx.room.parser.SqlParser
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
+import androidx.room.compiler.processing.requireEnclosingTypeElement
 import androidx.room.ext.isNotNone
 import androidx.room.processor.EntityProcessor.Companion.createIndexName
 import androidx.room.processor.EntityProcessor.Companion.extractForeignKeys
@@ -103,13 +104,13 @@
                         )
                     )
                     null
-                } else if (it.element.enclosingTypeElement != element && !inheritSuperIndices) {
+                } else if (it.element.enclosingElement != element && !inheritSuperIndices) {
                     it.indexed = false
                     context.logger.w(
                         Warning.INDEX_FROM_PARENT_FIELD_IS_DROPPED,
                         ProcessorErrors.droppedSuperClassFieldIndex(
                             it.columnName, element.qualifiedName,
-                            it.element.enclosingTypeElement.qualifiedName
+                            it.element.requireEnclosingTypeElement().qualifiedName
                         )
                     )
                     null
@@ -343,7 +344,7 @@
                     null
                 } else {
                     PrimaryKey(
-                        declaredIn = field.element.enclosingTypeElement,
+                        declaredIn = field.element.enclosingElement,
                         fields = Fields(field),
                         autoGenerateId = it.value.autoGenerate
                     )
@@ -389,7 +390,7 @@
         val superPKeys = if (mySuper != null && mySuper.isNotNone()) {
             // my super cannot see my fields so remove them.
             val remainingFields = availableFields.filterNot {
-                it.element.enclosingTypeElement == typeElement
+                it.element.enclosingElement == typeElement
             }
             collectPrimaryKeysFromEntityAnnotations(mySuper.typeElement!!, remainingFields)
         } else {
@@ -409,7 +410,7 @@
                     ProcessorErrors.AUTO_INCREMENT_EMBEDDED_HAS_MULTIPLE_FIELDS
                 )
                 PrimaryKey(
-                    declaredIn = embeddedField.field.element.enclosingTypeElement,
+                    declaredIn = embeddedField.field.element.enclosingElement,
                     fields = embeddedField.pojo.fields,
                     autoGenerateId = it.value.autoGenerate
                 )
diff --git a/room/compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt b/room/compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
index 7a2a4d8..d041082 100644
--- a/room/compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
@@ -17,12 +17,12 @@
 package androidx.room.util
 
 import androidx.room.migration.bundle.DatabaseBundle
+import androidx.room.migration.bundle.DatabaseViewBundle
 import androidx.room.migration.bundle.EntityBundle
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.migration.bundle.ForeignKeyBundle
 import androidx.room.migration.bundle.FtsEntityBundle
 import androidx.room.migration.bundle.IndexBundle
-import androidx.room.processor.ProcessorErrors.FTS_TABLE_NOT_CURRENTLY_SUPPORTED
 import androidx.room.processor.ProcessorErrors.deletedOrRenamedTableFound
 import androidx.room.processor.ProcessorErrors.tableRenameError
 import androidx.room.processor.ProcessorErrors.conflictingRenameColumnAnnotationsFound
@@ -30,7 +30,7 @@
 import androidx.room.processor.ProcessorErrors.newNotNullColumnMustHaveDefaultValue
 import androidx.room.processor.ProcessorErrors.deletedOrRenamedColumnFound
 import androidx.room.processor.ProcessorErrors.tableWithConflictingPrefixFound
-import androidx.room.vo.AutoMigrationResult
+import androidx.room.vo.AutoMigration
 
 /**
  * This exception should be thrown to abandon processing an @AutoMigration.
@@ -44,12 +44,14 @@
  * Contains the changes detected between the two schema versions provided.
  */
 data class SchemaDiffResult(
-    val addedColumns: Map<String, AutoMigrationResult.AddedColumn>,
-    val deletedColumns: List<AutoMigrationResult.DeletedColumn>,
-    val addedTables: Set<AutoMigrationResult.AddedTable>,
+    val addedColumns: Map<String, AutoMigration.AddedColumn>,
+    val deletedColumns: List<AutoMigration.DeletedColumn>,
+    val addedTables: Set<AutoMigration.AddedTable>,
     val renamedTables: Map<String, String>,
-    val complexChangedTables: Map<String, AutoMigrationResult.ComplexChangedTable>,
-    val deletedTables: List<String>
+    val complexChangedTables: Map<String, AutoMigration.ComplexChangedTable>,
+    val deletedTables: List<String>,
+    val fromViews: List<DatabaseViewBundle>,
+    val toViews: List<DatabaseViewBundle>
 )
 
 /**
@@ -61,37 +63,39 @@
  *
  * @param fromSchemaBundle Original database schema to migrate from
  * @param toSchemaBundle New database schema to migrate to
- * @param className Name of the user implemented AutoMigrationCallback interface, if available
+ * @param className Name of the user implemented AutoMigrationSpec interface, if available
  * @param renameColumnEntries List of repeatable annotations specifying column renames
  * @param deleteColumnEntries List of repeatable annotations specifying column deletes
  * @param renameTableEntries List of repeatable annotations specifying table renames
  * @param deleteTableEntries List of repeatable annotations specifying table deletes
  */
-// TODO: (b/181777611) Handle FTS tables
 class SchemaDiffer(
     private val fromSchemaBundle: DatabaseBundle,
     private val toSchemaBundle: DatabaseBundle,
     private val className: String?,
-    private val renameColumnEntries: List<AutoMigrationResult.RenamedColumn>,
-    private val deleteColumnEntries: List<AutoMigrationResult.DeletedColumn>,
-    private val renameTableEntries: List<AutoMigrationResult.RenamedTable>,
-    private val deleteTableEntries: List<AutoMigrationResult.DeletedTable>
+    private val renameColumnEntries: List<AutoMigration.RenamedColumn>,
+    private val deleteColumnEntries: List<AutoMigration.DeletedColumn>,
+    private val renameTableEntries: List<AutoMigration.RenamedTable>,
+    private val deleteTableEntries: List<AutoMigration.DeletedTable>
 ) {
     private val potentiallyDeletedTables = mutableSetOf<String>()
+    // Maps FTS tables in the to version to the name of their content tables in the from version
+    // for easy lookup.
+    private val contentTableToFtsEntities = mutableMapOf<String, MutableList<EntityBundle>>()
 
-    private val addedTables = mutableSetOf<AutoMigrationResult.AddedTable>()
+    private val addedTables = mutableSetOf<AutoMigration.AddedTable>()
     // Any table that has been renamed, but also does not contain any complex changes.
     private val renamedTables = mutableMapOf<String, String>()
 
     // Map of tables with complex changes, keyed by the table name, note that if the table is
     // renamed, the original table name is used as key.
     private val complexChangedTables =
-        mutableMapOf<String, AutoMigrationResult.ComplexChangedTable>()
+        mutableMapOf<String, AutoMigration.ComplexChangedTable>()
     private val deletedTables = deleteTableEntries.map { it.deletedTableName }.toSet()
 
     // Map of columns that have been added in the database, keyed by the column name, note that
     // the table these columns have been added to will not contain any complex schema changes.
-    private val addedColumns = mutableMapOf<String, AutoMigrationResult.AddedColumn>()
+    private val addedColumns = mutableMapOf<String, AutoMigration.AddedColumn>()
     private val deletedColumns = deleteColumnEntries
 
     /**
@@ -107,13 +111,18 @@
         // deleted columns/tables
         fromSchemaBundle.entitiesByTableName.values.forEach { fromTable ->
             val toTable = detectTableLevelChanges(fromTable)
-            if (fromTable is FtsEntityBundle) {
-                diffError(FTS_TABLE_NOT_CURRENTLY_SUPPORTED)
-            }
 
             // Check for column related changes. Since we require toTable to not be null, any
             // deleted tables will be skipped here.
             if (toTable != null) {
+                if (fromTable is FtsEntityBundle &&
+                    fromTable.ftsOptions.contentTable.isNotEmpty()
+                ) {
+                    contentTableToFtsEntities.getOrPut(fromTable.ftsOptions.contentTable) {
+                        mutableListOf()
+                    }.add(fromTable)
+                }
+
                 val fromColumns = fromTable.fieldsByColumnName
                 val processedColumnsInNewVersion = fromColumns.values.mapNotNull { fromColumn ->
                     detectColumnLevelChanges(
@@ -141,19 +150,44 @@
                 )
             )
         }
-
         processDeletedColumns()
+
+        processContentTables()
+
         return SchemaDiffResult(
             addedColumns = addedColumns,
             deletedColumns = deletedColumns,
             addedTables = addedTables,
             renamedTables = renamedTables,
             complexChangedTables = complexChangedTables,
-            deletedTables = deletedTables.toList()
+            deletedTables = deletedTables.toList(),
+            fromViews = fromSchemaBundle.views,
+            toViews = toSchemaBundle.views
         )
     }
 
     /**
+     * Checks if any content tables have been renamed, and if so, marks the FTS table referencing
+     * the content table as a complex changed table.
+     */
+    private fun processContentTables() {
+        renameTableEntries.forEach { renamedTable ->
+            contentTableToFtsEntities[renamedTable.originalTableName]?.filter {
+                !complexChangedTables.containsKey(it.tableName)
+            }?.forEach { ftsTable ->
+                complexChangedTables[ftsTable.tableName] =
+                    AutoMigration.ComplexChangedTable(
+                        tableName = ftsTable.tableName,
+                        tableNameWithNewPrefix = ftsTable.newTableName,
+                        oldVersionEntityBundle = ftsTable,
+                        newVersionEntityBundle = ftsTable,
+                        renamedColumnsMap = mutableMapOf()
+                    )
+            }
+        }
+    }
+
+    /**
      * Detects any changes at the table-level, independent of any changes that may be present at
      * the column-level (e.g. column add/rename/delete).
      *
@@ -168,6 +202,7 @@
         // Check if the table was renamed. If so, check for other complex changes that could
         // be found on the table level. Save the end result to the complex changed tables map.
         val renamedTable = isTableRenamed(fromTable.tableName)
+
         if (renamedTable != null) {
             val toTable = toSchemaBundle.entitiesByTableName[renamedTable.newTableName]
             if (toTable != null) {
@@ -175,13 +210,14 @@
                     fromTable,
                     toTable
                 )
-                if (isComplexChangedTable) {
+                val isFtsEntity = fromTable is FtsEntityBundle
+                if (isComplexChangedTable || isFtsEntity) {
                     if (toSchemaBundle.entitiesByTableName.containsKey(toTable.newTableName)) {
                         diffError(tableWithConflictingPrefixFound(toTable.newTableName))
                     }
                     renamedTables.remove(renamedTable.originalTableName)
                     complexChangedTables[renamedTable.originalTableName] =
-                        AutoMigrationResult.ComplexChangedTable(
+                        AutoMigration.ComplexChangedTable(
                             tableName = toTable.tableName,
                             tableNameWithNewPrefix = toTable.newTableName,
                             oldVersionEntityBundle = fromTable,
@@ -220,7 +256,7 @@
             )
             if (isComplexChangedTable) {
                 complexChangedTables[fromTable.tableName] =
-                    AutoMigrationResult.ComplexChangedTable(
+                    AutoMigration.ComplexChangedTable(
                         tableName = toTable.tableName,
                         tableNameWithNewPrefix = toTable.newTableName,
                         oldVersionEntityBundle = fromTable,
@@ -233,6 +269,8 @@
         if (!isDeletedTable) {
             potentiallyDeletedTables.add(fromTable.tableName)
         }
+
+        // Table was deleted.
         return null
     }
 
@@ -259,13 +297,12 @@
             )
             // Make sure there are no conflicts in the new version of the table with the
             // temporary new table name
-            // TODO: (b/183975119) Use another prefix automatically in these cases
             if (toSchemaBundle.entitiesByTableName.containsKey(toTable.newTableName)) {
                 diffError(tableWithConflictingPrefixFound(toTable.newTableName))
             }
             renamedTables.remove(fromTable.tableName)
             complexChangedTables[fromTable.tableName] =
-                AutoMigrationResult.ComplexChangedTable(
+                AutoMigration.ComplexChangedTable(
                     tableName = fromTable.tableName,
                     tableNameWithNewPrefix = toTable.newTableName,
                     oldVersionEntityBundle = fromTable,
@@ -282,13 +319,12 @@
             if (columnChanged && !complexChangedTables.containsKey(fromTable.tableName)) {
                 // Make sure there are no conflicts in the new version of the table with the
                 // temporary new table name
-                // TODO: (b/183975119) Use another prefix automatically in these cases
                 if (toSchemaBundle.entitiesByTableName.containsKey(toTable.newTableName)) {
                     diffError(tableWithConflictingPrefixFound(toTable.newTableName))
                 }
                 renamedTables.remove(fromTable.tableName)
                 complexChangedTables[fromTable.tableName] =
-                    AutoMigrationResult.ComplexChangedTable(
+                    AutoMigration.ComplexChangedTable(
                         tableName = fromTable.tableName,
                         tableNameWithNewPrefix = toTable.newTableName,
                         oldVersionEntityBundle = fromTable,
@@ -313,6 +349,8 @@
                 )
             )
         }
+
+        // Column was deleted
         return null
     }
 
@@ -329,6 +367,20 @@
         fromTable: EntityBundle,
         toTable: EntityBundle
     ): Boolean {
+        // If we have an FTS table, check if options have changed
+        if (fromTable is FtsEntityBundle &&
+            toTable is FtsEntityBundle &&
+            !fromTable.ftsOptions.isSchemaEqual(toTable.ftsOptions)
+        ) {
+            return true
+        }
+        // Check if the to table or the from table is an FTS table while the other is not.
+        if (fromTable is FtsEntityBundle && !(toTable is FtsEntityBundle) ||
+            toTable is FtsEntityBundle && !(fromTable is FtsEntityBundle)
+        ) {
+            return true
+        }
+
         if (!isForeignKeyBundlesListEqual(fromTable.foreignKeys, toTable.foreignKeys)) {
             return true
         }
@@ -419,7 +471,7 @@
      * @param tableName Name of the table in the original database version
      * @return A RenameTable object if the table has been renamed, otherwise null
      */
-    private fun isTableRenamed(tableName: String): AutoMigrationResult.RenamedTable? {
+    private fun isTableRenamed(tableName: String): AutoMigration.RenamedTable? {
         val annotations = renameTableEntries
         val renamedTableAnnotations = annotations.filter {
             it.originalTableName == tableName
@@ -446,7 +498,7 @@
     private fun isColumnRenamed(
         columnName: String,
         tableName: String
-    ): AutoMigrationResult.RenamedColumn? {
+    ): AutoMigration.RenamedColumn? {
         val annotations = renameColumnEntries
         val renamedColumnAnnotations = annotations.filter {
             it.originalColumnName == columnName && it.tableName == tableName
@@ -484,7 +536,7 @@
 
         if (fromTable == null) {
             // It's a new table
-            addedTables.add(AutoMigrationResult.AddedTable(toTable))
+            addedTables.add(AutoMigration.AddedTable(toTable))
             return
         }
         val fromColumns = fromTable.fieldsByColumnName
@@ -506,7 +558,7 @@
                 // table.
                 if (!complexChangedTables.containsKey(toTable.tableName)) {
                     addedColumns[toColumn.columnName] =
-                        AutoMigrationResult.AddedColumn(
+                        AutoMigration.AddedColumn(
                             toTable.tableName,
                             toColumn
                         )
@@ -528,7 +580,7 @@
             val toTableBundle =
                 toSchemaBundle.entitiesByTableName.getValue(deletedColumn.tableName)
             complexChangedTables[deletedColumn.tableName] =
-                AutoMigrationResult.ComplexChangedTable(
+                AutoMigration.ComplexChangedTable(
                     tableName = deletedColumn.tableName,
                     tableNameWithNewPrefix = fromTableBundle.newTableName,
                     oldVersionEntityBundle = fromTableBundle,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt b/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt
new file mode 100644
index 0000000..cdfa155
--- /dev/null
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt
@@ -0,0 +1,104 @@
+/*
+ * 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.room.vo
+
+import androidx.room.compiler.processing.XTypeElement
+import androidx.room.migration.bundle.EntityBundle
+import androidx.room.migration.bundle.FieldBundle
+import androidx.room.util.SchemaDiffResult
+import com.squareup.javapoet.ClassName
+
+/**
+ * Stores the changes detected in a database schema between the old and new versions.
+ */
+data class AutoMigration(
+    val element: XTypeElement,
+    val from: Int,
+    val to: Int,
+    val specElement: XTypeElement?,
+    val schemaDiff: SchemaDiffResult,
+    val isSpecProvided: Boolean,
+) {
+    val implTypeName: ClassName by lazy {
+        ClassName.get(
+            element.className.packageName(),
+            "${element.className.simpleName()}_AutoMigration_${from}_${to}_Impl"
+        )
+    }
+
+    val specClassName = specElement?.className
+
+    /**
+     * Stores the table name and the relevant field bundle of a column that was added to a
+     * database in a newer version.
+     */
+    data class AddedColumn(val tableName: String, val fieldBundle: FieldBundle)
+
+    /**
+     * Stores the table name, original name, and the new name of a column that was renamed in the
+     * new version of the database.
+     */
+    data class RenamedColumn(
+        val tableName: String,
+        val originalColumnName: String,
+        val newColumnName: String
+    )
+
+    /**
+     * Stores the table name and the column name of a column that was deleted from the database.
+     */
+    data class DeletedColumn(val tableName: String, val columnName: String)
+
+    /**
+     * Stores the table that was added to a database in a newer version.
+     */
+    data class AddedTable(val entityBundle: EntityBundle)
+
+    /**
+     * Stores the table that contains a change in the primary key, foreign key(s) or index(es)
+     * in a newer version, as well as any complex changes and renames on the column-level.
+     *
+     * As it is possible to have a table with only simple (non-complex) changes, which will be
+     * categorized as "AddedColumn" or "DeletedColumn" changes, all other
+     * changes at the table level are categorized as "complex" changes, using the category
+     * "ComplexChangedTable".
+     *
+     * The renamed columns map contains a mapping from the NEW name of the column to the OLD name
+     * of the column.
+     */
+    data class ComplexChangedTable(
+        val tableName: String,
+        val tableNameWithNewPrefix: String,
+        val oldVersionEntityBundle: EntityBundle,
+        val newVersionEntityBundle: EntityBundle,
+        val renamedColumnsMap: MutableMap<String, String>
+    )
+
+    /**
+     * Stores the original name and the new name of a table that was renamed in the
+     * new version of the database.
+     *
+     * This container will only be used for tables that got renamed, but do not have any complex
+     * changes on it, both on the table and column level.
+     */
+    data class RenamedTable(val originalTableName: String, val newTableName: String)
+
+    /**
+     * Stores the name of the table that was deleted from the database.
+     */
+    data class DeletedTable(val deletedTableName: String)
+}
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigrationResult.kt b/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigrationResult.kt
deleted file mode 100644
index 6f5c0a8..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/vo/AutoMigrationResult.kt
+++ /dev/null
@@ -1,100 +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.room.vo
-
-import androidx.room.compiler.processing.XTypeElement
-import androidx.room.migration.bundle.EntityBundle
-import androidx.room.migration.bundle.FieldBundle
-import androidx.room.util.SchemaDiffResult
-import com.squareup.javapoet.ClassName
-
-/**
- * Stores the changes detected in a database schema between the old and new versions.
- */
-data class AutoMigrationResult(
-    val element: XTypeElement,
-    val from: Int?,
-    val to: Int?,
-    val schemaDiff: SchemaDiffResult
-) {
-    val implTypeName: ClassName by lazy {
-        ClassName.get(
-            element.className.packageName(),
-            "AutoMigration_${from}_${to}_Impl"
-        )
-    }
-
-    /**
-     * Stores the table name and the relevant field bundle of a column that was added to a
-     * database in a newer version.
-     */
-    data class AddedColumn(val tableName: String, val fieldBundle: FieldBundle)
-
-    /**
-     * Stores the table name, original name, and the new name of a column that was renamed in the
-     * new version of the database.
-     */
-    data class RenamedColumn(
-        val tableName: String,
-        val originalColumnName: String,
-        val newColumnName: String
-    )
-
-    /**
-     * Stores the table name and the column name of a column that was deleted from the database.
-     */
-    data class DeletedColumn(val tableName: String, val columnName: String)
-
-    /**
-     * Stores the table that was added to a database in a newer version.
-     */
-    data class AddedTable(val entityBundle: EntityBundle)
-
-    /**
-     * Stores the table that contains a change in the primary key, foreign key(s) or index(es)
-     * in a newer version, as well as any complex changes and renames on the column-level.
-     *
-     * As it is possible to have a table with only simple (non-complex) changes, which will be
-     * categorized as "AddedColumn" or "DeletedColumn" changes, all other
-     * changes at the table level are categorized as "complex" changes, using the category
-     * "ComplexChangedTable".
-     *
-     * The renamed columns map contains a mapping from the NEW name of the column to the OLD name
-     * of the column.
-     */
-    data class ComplexChangedTable(
-        val tableName: String,
-        val tableNameWithNewPrefix: String,
-        val oldVersionEntityBundle: EntityBundle,
-        val newVersionEntityBundle: EntityBundle,
-        val renamedColumnsMap: MutableMap<String, String>
-    )
-
-    /**
-     * Stores the original name and the new name of a table that was renamed in the
-     * new version of the database.
-     *
-     * This container will only be used for tables that got renamed, but do not have any complex
-     * changes on it, both on the table and column level.
-     */
-    data class RenamedTable(val originalTableName: String, val newTableName: String)
-
-    /**
-     * Stores the name of the table that was deleted from the database.
-     */
-    data class DeletedTable(val deletedTableName: String)
-}
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
index 6adaa3c..3d5855b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
@@ -21,6 +21,7 @@
 import androidx.room.compiler.processing.XExecutableElement
 import androidx.room.compiler.processing.isConstructor
 import androidx.room.compiler.processing.isMethod
+import androidx.room.compiler.processing.requireEnclosingTypeElement
 import com.squareup.javapoet.CodeBlock
 
 /**
@@ -45,13 +46,15 @@
             element.isConstructor() -> {
                 builder.addStatement(
                     "$L = new $T($L)", outVar,
-                    element.enclosingTypeElement.className, args
+                    element.enclosingElement.className, args
                 )
             }
             element.isMethod() -> {
+                // TODO when we generate Kotlin code, we need to handle not having enclosing
+                //  elements.
                 builder.addStatement(
                     "$L = $T.$L($L)", outVar,
-                    element.enclosingTypeElement.className,
+                    element.requireEnclosingTypeElement().className,
                     element.name, args
                 )
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
index f9d3f27..8afced46d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -17,10 +17,10 @@
 package androidx.room.vo
 
 import androidx.room.RoomMasterTable
-import androidx.room.migration.bundle.DatabaseBundle
-import androidx.room.migration.bundle.SchemaBundle
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
+import androidx.room.migration.bundle.DatabaseBundle
+import androidx.room.migration.bundle.SchemaBundle
 import com.squareup.javapoet.ClassName
 import org.apache.commons.codec.digest.DigestUtils
 import java.io.File
@@ -40,7 +40,7 @@
 ) {
     // This variable will be set once auto-migrations are processed given the DatabaseBundle from
     // this object. This is necessary for tracking the versions involved in the auto-migration.
-    lateinit var autoMigrations: List<AutoMigrationResult>
+    lateinit var autoMigrations: List<AutoMigration>
     val typeName: ClassName by lazy { element.className }
 
     private val implClassName by lazy {
@@ -103,8 +103,21 @@
     fun exportSchema(file: File) {
         val schemaBundle = SchemaBundle(SchemaBundle.LATEST_FORMAT, bundle)
         if (file.exists()) {
-            val existing = file.inputStream().use {
-                SchemaBundle.deserialize(it)
+            val existing = try {
+                file.inputStream().use {
+                    SchemaBundle.deserialize(it)
+                }
+            } catch (th: Throwable) {
+                throw IllegalStateException(
+                    """
+                    Cannot parse existing schema file: ${file.absolutePath}.
+                    If you've modified the file, you might've broken the JSON format, try
+                    deleting the file and re-running the compiler.
+                    If you've not modified the file, please file a bug at
+                    https://issuetracker.google.com/issues/new?component=413107&template=1096568
+                    with a sample app to reproduce the issue.
+                    """.trimIndent()
+                )
             }
             if (existing.isSchemaEqual(schemaBundle)) {
                 return
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
index 254e282..b19107f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
@@ -23,8 +23,11 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.S
 import androidx.room.ext.SupportDbTypeNames
+import androidx.room.ext.T
 import androidx.room.migration.bundle.EntityBundle
-import androidx.room.vo.AutoMigrationResult
+import androidx.room.migration.bundle.FtsEntityBundle
+import androidx.room.vo.AutoMigration
+import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
 import com.squareup.javapoet.TypeName
@@ -34,23 +37,36 @@
 /**
  * Writes the implementation of migrations that were annotated with @AutoMigration.
  */
-// TODO: (b/181777611) Handle FTS tables
 class AutoMigrationWriter(
     private val dbElement: XElement,
-    val autoMigrationResult: AutoMigrationResult
-) : ClassWriter(autoMigrationResult.implTypeName) {
-    private val addedColumns = autoMigrationResult.schemaDiff.addedColumns
-    private val addedTables = autoMigrationResult.schemaDiff.addedTables
-    private val renamedTables = autoMigrationResult.schemaDiff.renamedTables
-    private val complexChangedTables = autoMigrationResult.schemaDiff.complexChangedTables
-    private val deletedTables = autoMigrationResult.schemaDiff.deletedTables
+    val autoMigration: AutoMigration
+) : ClassWriter(autoMigration.implTypeName) {
+    private val addedColumns = autoMigration.schemaDiff.addedColumns
+    private val addedTables = autoMigration.schemaDiff.addedTables
+    private val renamedTables = autoMigration.schemaDiff.renamedTables
+    private val complexChangedTables = autoMigration.schemaDiff.complexChangedTables
+    private val deletedTables = autoMigration.schemaDiff.deletedTables
 
     override fun createTypeSpecBuilder(): TypeSpec.Builder {
-        val builder = TypeSpec.classBuilder(autoMigrationResult.implTypeName)
+        val builder = TypeSpec.classBuilder(autoMigration.implTypeName)
         builder.apply {
             addOriginatingElement(dbElement)
-            addSuperinterface(RoomTypeNames.AUTO_MIGRATION_CALLBACK)
             superclass(RoomTypeNames.MIGRATION)
+
+            if (autoMigration.specClassName != null) {
+                val callbackField =
+                    FieldSpec.builder(
+                        RoomTypeNames.AUTO_MIGRATION_SPEC,
+                        "callback",
+                        Modifier.PRIVATE,
+                        Modifier.FINAL
+                    ).apply {
+                        if (!autoMigration.isSpecProvided) {
+                            initializer("new $T()", autoMigration.specClassName)
+                        }
+                    }
+                builder.addField(callbackField.build())
+            }
             addMethod(createConstructor())
             addMethod(createMigrateMethod())
         }
@@ -65,7 +81,20 @@
     private fun createConstructor(): MethodSpec {
         return MethodSpec.constructorBuilder().apply {
             addModifiers(Modifier.PUBLIC)
-            addStatement("super($L, $L)", autoMigrationResult.from, autoMigrationResult.to)
+            addStatement(
+                "super($L, $L)",
+                autoMigration.from,
+                autoMigration.to
+            )
+            if (autoMigration.isSpecProvided) {
+                addParameter(
+                    ParameterSpec.builder(
+                        RoomTypeNames.AUTO_MIGRATION_SPEC,
+                        "callback"
+                    ).addAnnotation(NonNull::class.java).build()
+                )
+                addStatement("this.callback = callback")
+            }
         }.build()
     }
 
@@ -81,8 +110,10 @@
                 addAnnotation(Override::class.java)
                 addModifiers(Modifier.PUBLIC)
                 returns(TypeName.VOID)
-                addAutoMigrationResultToMigrate(this)
-                addStatement("onPostMigrate(database)")
+                addMigrationStatements(this)
+                if (autoMigration.specClassName != null) {
+                    addStatement("callback.onPostMigrate(database)")
+                }
             }
         return migrateFunctionBuilder.build()
     }
@@ -94,9 +125,33 @@
      *
      * @param migrateBuilder Builder for the migrate() function to be generated
      */
-    private fun addAutoMigrationResultToMigrate(migrateBuilder: MethodSpec.Builder) {
-        addComplexChangeStatements(migrateBuilder)
+    private fun addMigrationStatements(migrateBuilder: MethodSpec.Builder) {
+        addDropViewStatements(migrateBuilder)
         addSimpleChangeStatements(migrateBuilder)
+        addComplexChangeStatements(migrateBuilder)
+        addRecreateViewStatements(migrateBuilder)
+    }
+
+    /**
+     * Adds SQL statements to drop all views of the database in the 'from' version.
+     *
+     * @param migrateBuilder Builder for the migrate() function to be generated
+     */
+    private fun addDropViewStatements(migrateBuilder: MethodSpec.Builder) {
+        autoMigration.schemaDiff.fromViews.forEach { view ->
+            addDatabaseExecuteSqlStatement(migrateBuilder, "DROP VIEW ${view.viewName}")
+        }
+    }
+
+    /**
+     * Adds SQL statements to create all views of the database in the 'to' version.
+     *
+     * @param migrateBuilder Builder for the migrate() function to be generated
+     */
+    private fun addRecreateViewStatements(migrateBuilder: MethodSpec.Builder) {
+        autoMigration.schemaDiff.toViews.forEach { view ->
+            addDatabaseExecuteSqlStatement(migrateBuilder, view.createView())
+        }
     }
 
     /**
@@ -106,7 +161,11 @@
      * @param migrateBuilder Builder for the migrate() function to be generated
      */
     private fun addComplexChangeStatements(migrateBuilder: MethodSpec.Builder) {
-        complexChangedTables.values.forEach {
+        // Create a collection that is sorted such that FTS bundles are handled after the normal
+        // tables have been processed
+        complexChangedTables.values.sortedBy {
+            it.newVersionEntityBundle is FtsEntityBundle
+        }.forEach {
             (
                 _,
                 tableNameWithNewPrefix,
@@ -115,28 +174,82 @@
                 renamedColumnsMap
             ) ->
 
-            addStatementsToCreateNewTable(newEntityBundle, migrateBuilder)
-            addStatementsToContentTransfer(
-                oldEntityBundle.tableName,
-                tableNameWithNewPrefix,
-                oldEntityBundle,
-                newEntityBundle,
-                renamedColumnsMap,
-                migrateBuilder
-            )
-            addStatementsToDropTableAndRenameTempTable(
-                oldEntityBundle.tableName,
-                newEntityBundle.tableName,
-                tableNameWithNewPrefix,
-                migrateBuilder
-            )
-            addStatementsToRecreateIndexes(newEntityBundle, migrateBuilder)
-            if (newEntityBundle.foreignKeys.isNotEmpty()) {
-                addStatementsToCheckForeignKeyConstraint(newEntityBundle.tableName, migrateBuilder)
+            if (oldEntityBundle is FtsEntityBundle &&
+                !oldEntityBundle.ftsOptions.contentTable.isNullOrBlank()
+            ) {
+                addStatementsToMigrateFtsTable(
+                    migrateBuilder,
+                    oldEntityBundle,
+                    newEntityBundle,
+                    renamedColumnsMap
+                )
+            } else {
+                addStatementsToCreateNewTable(newEntityBundle, migrateBuilder)
+                addStatementsToContentTransfer(
+                    oldEntityBundle.tableName,
+                    tableNameWithNewPrefix,
+                    oldEntityBundle,
+                    newEntityBundle,
+                    renamedColumnsMap,
+                    migrateBuilder
+                )
+                addStatementsToDropTableAndRenameTempTable(
+                    oldEntityBundle.tableName,
+                    newEntityBundle.tableName,
+                    tableNameWithNewPrefix,
+                    migrateBuilder
+                )
+                addStatementsToRecreateIndexes(newEntityBundle, migrateBuilder)
+                if (newEntityBundle.foreignKeys.isNotEmpty()) {
+                    addStatementsToCheckForeignKeyConstraint(
+                        newEntityBundle.tableName,
+                        migrateBuilder
+                    )
+                }
             }
         }
     }
 
+    private fun addStatementsToMigrateFtsTable(
+        migrateBuilder: MethodSpec.Builder,
+        oldTable: EntityBundle,
+        newTable: EntityBundle,
+        renamedColumnsMap: MutableMap<String, String>
+    ) {
+        addDatabaseExecuteSqlStatement(migrateBuilder, "DROP TABLE `${oldTable.tableName}`")
+        addDatabaseExecuteSqlStatement(migrateBuilder, newTable.createTable())
+
+        // Transfer contents of the FTS table, using the content table if available.
+        val newColumnSequence = oldTable.fieldsByColumnName.keys.filter {
+            oldTable.fieldsByColumnName.keys.contains(it) ||
+                renamedColumnsMap.containsKey(it)
+        }.toMutableList()
+        val oldColumnSequence = mutableListOf<String>()
+        newColumnSequence.forEach { column ->
+            oldColumnSequence.add(renamedColumnsMap[column] ?: column)
+        }
+        if (oldTable is FtsEntityBundle) {
+            oldColumnSequence.add("rowid")
+            newColumnSequence.add("docid")
+        }
+        val contentTable = (newTable as FtsEntityBundle).ftsOptions.contentTable
+        val selectFromTable = if (contentTable.isEmpty()) {
+            oldTable.tableName
+        } else {
+            contentTable
+        }
+        addDatabaseExecuteSqlStatement(
+            migrateBuilder,
+            buildString {
+                append(
+                    "INSERT INTO `${newTable.tableName}` (${newColumnSequence.joinToString(",")})" +
+                        " SELECT ${oldColumnSequence.joinToString(",")} FROM " +
+                        "`$selectFromTable`",
+                )
+            }
+        )
+    }
+
     /**
      * Adds SQL statements performing schema altering commands directly supported by SQLite
      * (adding tables/columns, renaming tables/columns, dropping tables/columns). These changes
@@ -188,7 +301,7 @@
         val newColumnSequence = newEntityBundle.fieldsByColumnName.keys.filter {
             oldEntityBundle.fieldsByColumnName.keys.contains(it) ||
                 renamedColumnsMap.containsKey(it)
-        }
+        }.toMutableList()
         val oldColumnSequence = mutableListOf<String>()
         newColumnSequence.forEach { column ->
             oldColumnSequence.add(renamedColumnsMap[column] ?: column)
@@ -198,8 +311,10 @@
             migrateBuilder,
             buildString {
                 append(
-                    "INSERT INTO `$tableNameWithNewPrefix` (${newColumnSequence.joinToString(",")
-                    }) SELECT ${oldColumnSequence.joinToString(",")} FROM `$oldTableName`",
+                    "INSERT INTO `$tableNameWithNewPrefix` " +
+                        "(${newColumnSequence.joinToString(",")})" +
+                        " SELECT ${oldColumnSequence.joinToString(",")} FROM " +
+                        "`$oldTableName`",
                 )
             }
         )
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
index c88bb6a..1f75228 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
@@ -27,6 +27,7 @@
 import androidx.room.ext.typeName
 import androidx.room.compiler.processing.MethodSpecHelper
 import androidx.room.compiler.processing.addOriginatingElement
+import androidx.room.ext.W
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.DaoMethod
 import androidx.room.vo.Database
@@ -63,6 +64,7 @@
             addMethod(createCreateInvalidationTracker())
             addMethod(createClearAllTables())
             addMethod(createCreateTypeConvertersMap())
+            addMethod(createCreateAutoMigrationSpecsSet())
             addMethod(getAutoMigrations())
         }
         addDaoImpls(builder)
@@ -124,6 +126,47 @@
         }.build()
     }
 
+    private fun createCreateAutoMigrationSpecsSet(): MethodSpec {
+        val scope = CodeGenScope(this)
+        return MethodSpec.methodBuilder("getRequiredAutoMigrationSpecs").apply {
+            addAnnotation(Override::class.java)
+            addModifiers(PROTECTED)
+            returns(
+                ParameterizedTypeName.get(
+                    CommonTypeNames.SET,
+                    ParameterizedTypeName.get(
+                        ClassName.get(Class::class.java),
+                        WildcardTypeName.subtypeOf(RoomTypeNames.AUTO_MIGRATION_SPEC)
+                    )
+                )
+            )
+            val autoMigrationSpecsVar = scope.getTmpVar("_autoMigrationSpecsSet")
+            val autoMigrationSpecsTypeName = ParameterizedTypeName.get(
+                ClassName.get(HashSet::class.java),
+                ParameterizedTypeName.get(
+                    ClassName.get(Class::class.java),
+                    WildcardTypeName.subtypeOf(RoomTypeNames.AUTO_MIGRATION_SPEC)
+                )
+            )
+            addStatement(
+                "final $T $L = new $T()",
+                autoMigrationSpecsTypeName,
+                autoMigrationSpecsVar,
+                autoMigrationSpecsTypeName
+            )
+            database.autoMigrations.map { autoMigrationResult ->
+                if (autoMigrationResult.isSpecProvided) {
+                    addStatement(
+                        "$L.add($T.class)",
+                        autoMigrationSpecsVar,
+                        autoMigrationResult.specClassName
+                    )
+                }
+            }
+            addStatement("return $L", autoMigrationSpecsVar)
+        }.build()
+    }
+
     private fun createClearAllTables(): MethodSpec {
         val scope = CodeGenScope(this)
         return MethodSpec.methodBuilder("clearAllTables").apply {
@@ -309,13 +352,21 @@
             addModifiers(PROTECTED)
             addAnnotation(Override::class.java)
             returns(ParameterizedTypeName.get(CommonTypeNames.LIST, RoomTypeNames.MIGRATION))
-            val autoMigrationsList = database.autoMigrations.map {
-                CodeBlock.of("new $L()", it.implTypeName)
+            val autoMigrationsList = database.autoMigrations.map { autoMigrationResult ->
+                if (autoMigrationResult.isSpecProvided) {
+                    CodeBlock.of(
+                        "new $T(mAutoMigrationSpecs.get($T.class))",
+                        autoMigrationResult.implTypeName,
+                        autoMigrationResult.specClassName
+                    )
+                } else {
+                    CodeBlock.of("new $T()", autoMigrationResult.implTypeName)
+                }
             }
             addStatement(
-                "return $T.asList( $L )",
+                "return $T.asList($L)",
                 CommonTypeNames.ARRAYS,
-                CodeBlock.join(autoMigrationsList, ",")
+                CodeBlock.join(autoMigrationsList, ",$W")
             )
         }.build()
     }
diff --git a/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessor b/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessor
deleted file mode 100644
index 0dc6d89..0000000
--- a/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessor
+++ /dev/null
@@ -1,17 +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.
-#
-
-androidx.room.RoomKspProcessor
\ No newline at end of file
diff --git a/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
new file mode 100644
index 0000000..c8ff930
--- /dev/null
+++ b/room/compiler/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
@@ -0,0 +1,17 @@
+#
+# 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.
+#
+
+androidx.room.RoomKspProcessor$Provider
\ No newline at end of file
diff --git a/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithDefault.java b/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithDefault.java
index e799cad..530c21b5 100644
--- a/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithDefault.java
+++ b/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithDefault.java
@@ -1,7 +1,7 @@
 package foo.bar;
 
 import androidx.annotation.NonNull;
-import androidx.room.migration.AutoMigrationCallback;
+import androidx.room.migration.AutoMigrationSpec;
 import androidx.room.migration.Migration;
 import androidx.sqlite.db.SupportSQLiteDatabase;
 import java.lang.Override;
@@ -10,14 +10,16 @@
 
 @Generated("androidx.room.RoomProcessor")
 @SuppressWarnings({"unchecked", "deprecation"})
-class AutoMigration_1_2_Impl extends Migration implements AutoMigrationCallback {
-    public AutoMigration_1_2_Impl() {
+class ValidAutoMigrationWithDefault_AutoMigration_1_2_Impl extends Migration {
+    private final AutoMigrationSpec callback = new ValidAutoMigrationWithDefault();
+
+    public ValidAutoMigrationWithDefault_AutoMigration_1_2_Impl() {
         super(1, 2);
     }
 
     @Override
     public void migrate(@NonNull SupportSQLiteDatabase database) {
         database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER NOT NULL DEFAULT 0");
-        onPostMigrate(database);
+        callback.onPostMigrate(database);
     }
 }
diff --git a/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithoutDefault.java b/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithoutDefault.java
index ed2a2a9..b8ab84c 100644
--- a/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithoutDefault.java
+++ b/room/compiler/src/test/data/autoMigrationWriter/output/ValidAutoMigrationWithoutDefault.java
@@ -1,7 +1,7 @@
 package foo.bar;
 
 import androidx.annotation.NonNull;
-import androidx.room.migration.AutoMigrationCallback;
+import androidx.room.migration.AutoMigrationSpec;
 import androidx.room.migration.Migration;
 import androidx.sqlite.db.SupportSQLiteDatabase;
 import java.lang.Override;
@@ -10,14 +10,16 @@
 
 @Generated("androidx.room.RoomProcessor")
 @SuppressWarnings({"unchecked", "deprecation"})
-class AutoMigration_1_2_Impl extends Migration implements AutoMigrationCallback {
-    public AutoMigration_1_2_Impl() {
+class ValidAutoMigrationWithoutDefault_AutoMigration_1_2_Impl extends Migration {
+    private final AutoMigrationSpec callback = new ValidAutoMigrationWithoutDefault();
+
+    public ValidAutoMigrationWithoutDefault_AutoMigration_1_2_Impl() {
         super(1, 2);
     }
 
     @Override
     public void migrate(@NonNull SupportSQLiteDatabase database) {
         database.execSQL("ALTER TABLE `Song` ADD COLUMN `artistId` INTEGER DEFAULT NULL");
-        onPostMigrate(database);
+        callback.onPostMigrate(database);
     }
 }
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index 6b6c6d5..5dd84db 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -5,6 +5,7 @@
 import androidx.room.RoomOpenHelper;
 import androidx.room.RoomOpenHelper.Delegate;
 import androidx.room.RoomOpenHelper.ValidationResult;
+import androidx.room.migration.AutoMigrationSpec;
 import androidx.room.migration.Migration;
 import androidx.room.util.DBUtil;
 import androidx.room.util.TableInfo;
@@ -187,8 +188,14 @@
     }
 
     @Override
+    protected Set<Class<? extends AutoMigrationSpec>> getRequiredAutoMigrationSpecs() {
+        final HashSet<Class<? extends AutoMigrationSpec>> _autoMigrationSpecsSet = new HashSet<Class<? extends AutoMigrationSpec>>();
+        return _autoMigrationSpecsSet;
+    }
+
+    @Override
     protected List<Migration> getAutoMigrations() {
-        return Arrays.asList(  );
+        return Arrays.asList();
     }
 
     @Override
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/AutoMigrationProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/AutoMigrationProcessorTest.kt
index 886bfbd..49148bb 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/AutoMigrationProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/AutoMigrationProcessorTest.kt
@@ -23,62 +23,123 @@
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.migration.bundle.PrimaryKeyBundle
 import androidx.room.migration.bundle.SchemaBundle
-import androidx.room.processor.ProcessorErrors.autoMigrationElementMustExtendCallback
+import androidx.room.processor.ProcessorErrors.AUTOMIGRATION_SPEC_MISSING_NOARG_CONSTRUCTOR
+import androidx.room.processor.ProcessorErrors.INNER_CLASS_AUTOMIGRATION_SPEC_MUST_BE_STATIC
 import androidx.room.testing.context
 import org.junit.Test
 
 class AutoMigrationProcessorTest {
     @Test
-    fun testElementIsInterface() {
+    fun testElementHasNoArgConstructor() {
         val source = Source.java(
             "foo.bar.MyAutoMigration",
             """
             package foo.bar;
-            import androidx.room.AutoMigration;
-            class MyAutoMigration implements AutoMigration {}
+            import androidx.room.migration.AutoMigrationSpec;
+            public class MyAutoMigration {
+                public MyAutoMigration (int x) {}
+            }
             """.trimIndent()
         )
 
         runProcessorTest(listOf(source)) { invocation ->
             AutoMigrationProcessor(
-                invocation.processingEnv.requireTypeElement("foo.bar.MyAutoMigration"),
-                invocation.context,
-                1,
-                2,
-                invocation.processingEnv.requireType("foo.bar.MyAutoMigration"),
-                from.database
+                element = invocation.processingEnv.requireTypeElement(
+                    "foo.bar.MyAutoMigration"
+                ),
+                context = invocation.context,
+                spec = invocation.processingEnv.requireType(
+                    "foo.bar.MyAutoMigration"
+                ),
+                fromSchemaBundle = fromSchemaBundle.database,
+                toSchemaBundle = toSchemaBundle.database
             ).process()
             invocation.assertCompilationResult {
-                hasError(ProcessorErrors.AUTOMIGRATION_CALLBACK_MUST_BE_INTERFACE)
+                hasError(AUTOMIGRATION_SPEC_MISSING_NOARG_CONSTRUCTOR)
             }
         }
     }
 
     @Test
-    fun testInterfaceExtendsAutoMigrationInterface() {
+    fun testElementIsClass() {
         val source = Source.java(
             "foo.bar.MyAutoMigration",
             """
             package foo.bar;
-            import androidx.room.migration.AutoMigrationCallback;
-            import androidx.room.AutoMigration;
-            import androidx.sqlite.db.SupportSQLiteDatabase;
-            interface MyAutoMigration {}
+            import androidx.room.migration.AutoMigrationSpec;
+            public interface MyAutoMigration extends AutoMigrationSpec {}
             """.trimIndent()
         )
 
         runProcessorTest(listOf(source)) { invocation ->
             AutoMigrationProcessor(
-                invocation.processingEnv.requireTypeElement("foo.bar.MyAutoMigration"),
-                invocation.context,
-                1,
-                2,
-                invocation.processingEnv.requireType("foo.bar.MyAutoMigration"),
-                from.database
+                element = invocation.processingEnv.requireTypeElement("foo.bar.MyAutoMigration"),
+                context = invocation.context,
+                spec = invocation.processingEnv.requireType("foo.bar.MyAutoMigration"),
+                fromSchemaBundle = fromSchemaBundle.database,
+                toSchemaBundle = toSchemaBundle.database
+            ).process()
+            invocation.assertCompilationResult {
+                hasError(ProcessorErrors.AUTOMIGRATION_SPEC_MUST_BE_CLASS)
+            }
+        }
+    }
+
+    @Test
+    fun testInnerClassMustBeStatic() {
+        val source = Source.java(
+            "foo.bar.MyAutoMigrationDb",
+            """
+            package foo.bar;
+            import androidx.room.migration.AutoMigrationSpec;
+            public class MyAutoMigrationDb {
+                class MyAutoMigration implements AutoMigrationSpec {}
+            }
+            """.trimIndent()
+        )
+
+        runProcessorTest(listOf(source)) { invocation ->
+            AutoMigrationProcessor(
+                element = invocation.processingEnv.requireTypeElement(
+                    "foo.bar.MyAutoMigrationDb.MyAutoMigration"
+                ),
+                context = invocation.context,
+                spec = invocation.processingEnv.requireType(
+                    "foo.bar.MyAutoMigrationDb.MyAutoMigration"
+                ),
+                fromSchemaBundle = fromSchemaBundle.database,
+                toSchemaBundle = toSchemaBundle.database
+            ).process()
+            invocation.assertCompilationResult {
+                hasError(INNER_CLASS_AUTOMIGRATION_SPEC_MUST_BE_STATIC)
+            }
+        }
+    }
+
+    @Test
+    fun testClassImplementsAutoMigrationSpec() {
+        val source = Source.java(
+            "foo.bar.MyAutoMigration",
+            """
+            package foo.bar;
+            import androidx.room.migration.AutoMigrationSpec;
+            import androidx.room.AutoMigration;
+            import androidx.sqlite.db.SupportSQLiteDatabase;
+            public class MyAutoMigration {}
+            """.trimIndent()
+        )
+
+        runProcessorTest(listOf(source)) { invocation ->
+            AutoMigrationProcessor(
+                element = invocation.processingEnv.requireTypeElement("foo.bar.MyAutoMigration"),
+                context = invocation.context,
+                spec = invocation.processingEnv.requireType("foo.bar.MyAutoMigration"),
+                fromSchemaBundle = fromSchemaBundle.database,
+                toSchemaBundle = toSchemaBundle.database
             ).process()
             invocation.assertCompilationResult {
                 hasError(
-                    autoMigrationElementMustExtendCallback("MyAutoMigration")
+                    ProcessorErrors.autoMigrationElementMustImplementSpec("MyAutoMigration")
                 )
             }
         }
@@ -87,7 +148,7 @@
     /**
      * Schemas for processor testing.
      */
-    val from = SchemaBundle(
+    val fromSchemaBundle = SchemaBundle(
         1,
         DatabaseBundle(
             1,
@@ -132,4 +193,50 @@
             mutableListOf()
         )
     )
+
+    val toSchemaBundle = SchemaBundle(
+        2,
+        DatabaseBundle(
+            2,
+            "",
+            mutableListOf(
+                EntityBundle(
+                    "Song",
+                    "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
+                        "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+                    listOf(
+                        FieldBundle(
+                            "id",
+                            "id",
+                            "INTEGER",
+                            true,
+                            "1"
+                        ),
+                        FieldBundle(
+                            "title",
+                            "title",
+                            "TEXT",
+                            true,
+                            ""
+                        ),
+                        FieldBundle(
+                            "length",
+                            "length",
+                            "INTEGER",
+                            true,
+                            "1"
+                        )
+                    ),
+                    PrimaryKeyBundle(
+                        false,
+                        mutableListOf("id")
+                    ),
+                    mutableListOf(),
+                    mutableListOf()
+                )
+            ),
+            mutableListOf(),
+            mutableListOf()
+        )
+    )
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index baf2464..4d2b5b1 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -29,6 +29,7 @@
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
+import androidx.room.processor.ProcessorErrors.autoMigrationSchemasMustBeRoomGenerated
 import androidx.room.solver.query.result.EntityRowAdapter
 import androidx.room.solver.query.result.PojoRowAdapter
 import androidx.room.testing.context
@@ -47,11 +48,14 @@
 import org.hamcrest.CoreMatchers.notNullValue
 import org.hamcrest.CoreMatchers.sameInstance
 import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Rule
 import org.junit.Test
+import org.junit.rules.TemporaryFolder
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
 import java.io.File
+import java.io.FileOutputStream
 
 @RunWith(JUnit4::class)
 class DatabaseProcessorTest {
@@ -174,14 +178,20 @@
             "foo.bar.MyAutoMigration",
             """
             package foo.bar;
-            import androidx.room.migration.AutoMigrationCallback;
-            import androidx.room.AutoMigration;
+            import androidx.annotation.NonNull;
+            import androidx.room.migration.AutoMigrationSpec;
             import androidx.sqlite.db.SupportSQLiteDatabase;
-            interface MyAutoMigration extends AutoMigrationCallback {}
+            class MyAutoMigration implements AutoMigrationSpec {
+                @Override
+                public void onPostMigrate(@NonNull SupportSQLiteDatabase db) {}
+            }
             """
         )
     }
 
+    @get:Rule
+    var schemaFolder: TemporaryFolder = TemporaryFolder()
+
     @Test
     fun simple() {
         singleDb(
@@ -1214,7 +1224,7 @@
         singleDb(
             """
                 @Database(entities = {User.class}, version = 42, exportSchema = false,
-                autoMigrations = {@AutoMigration(from = 1, to = 2, callback = MyAutoMigration
+                autoMigrations = {@AutoMigration(from = 1, to = 2, spec = MyAutoMigration
                 .class), @AutoMigration(from = 2, to = 3)})
                 public abstract class MyDb extends RoomDatabase {}
                 """,
@@ -1228,6 +1238,137 @@
         }
     }
 
+    @Test
+    fun autoMigrationSchemasNotFound() {
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42, exportSchema = true,
+                autoMigrations = {@AutoMigration(from = 1, to = 2, spec = MyAutoMigration
+                .class)})
+                public abstract class MyDb extends RoomDatabase {}
+                """,
+            USER, AUTOMIGRATION
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorCount(1)
+                hasErrorContaining(
+                    ProcessorErrors.autoMigrationSchemasNotFound(
+                        "1.json",
+                        schemaFolder.root.absolutePath + File.separator + "foo.bar.MyDb"
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
+    fun autoMigrationFromSchemaNotFound() {
+        schemaFolder.newFolder("foo.bar.MyDb")
+        schemaFolder.newFile("foo.bar.MyDb" + File.separator + "2.json")
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42, exportSchema = true,
+                autoMigrations = {@AutoMigration(from = 1, to = 2, spec = MyAutoMigration
+                .class)})
+                public abstract class MyDb extends RoomDatabase {}
+                """,
+            USER, AUTOMIGRATION,
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorCount(1)
+                hasErrorContaining(
+                    ProcessorErrors.autoMigrationSchemasNotFound(
+                        "1.json",
+                        schemaFolder.root.absolutePath + File.separator + "foo.bar.MyDb"
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
+    fun autoMigrationToSchemaNotFound() {
+        schemaFolder.newFolder("foo.bar.MyDb")
+        val createdFile: File = schemaFolder.newFile("foo.bar.MyDb" + File.separator + "1.json")
+        FileOutputStream(createdFile).bufferedWriter().use {
+            it.write("{}")
+        }
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42, exportSchema = true,
+                autoMigrations = {@AutoMigration(from = 1, to = 2, spec = MyAutoMigration
+                .class)})
+                public abstract class MyDb extends RoomDatabase {}
+                """,
+            USER, AUTOMIGRATION
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorCount(1)
+                hasErrorContaining(
+                    ProcessorErrors.autoMigrationSchemasNotFound(
+                        "2.json",
+                        schemaFolder.root.absolutePath + File.separator + "foo.bar.MyDb"
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
+    fun autoMigrationEmptySchemaFiles() {
+        schemaFolder.newFolder("foo.bar.MyDb")
+        schemaFolder.newFile("foo.bar.MyDb" + File.separator + "1.json")
+        schemaFolder.newFile("foo.bar.MyDb" + File.separator + "2.json")
+
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42, exportSchema = true,
+                autoMigrations = {@AutoMigration(from = 1, to = 2, spec = MyAutoMigration
+                .class)})
+                public abstract class MyDb extends RoomDatabase {}
+                """,
+            USER, AUTOMIGRATION,
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorCount(1)
+                hasErrorContaining(
+                    ProcessorErrors.autoMigrationSchemaIsEmpty(
+                        "1.json",
+                        schemaFolder.root.absolutePath + File.separator + "foo.bar.MyDb"
+                    )
+                )
+            }
+        }
+    }
+
+    @Test
+    fun allAutoMigrationSchemasProvidedButNotRoomGenerated() {
+        schemaFolder.newFolder("foo.bar.MyDb")
+        val from: File = schemaFolder.newFile("foo.bar.MyDb" + File.separator + "1.json")
+        val to: File = schemaFolder.newFile("foo.bar.MyDb" + File.separator + "2.json")
+        FileOutputStream(from).bufferedWriter().use {
+            it.write("{}")
+        }
+        FileOutputStream(to).bufferedWriter().use {
+            it.write("{}")
+        }
+        singleDb(
+            """
+                @Database(entities = {User.class}, version = 42, exportSchema = true,
+                autoMigrations = {@AutoMigration(from = 1, to = 2)})
+                public abstract class MyDb extends RoomDatabase {}
+                """,
+            USER, AUTOMIGRATION,
+        ) { _, invocation ->
+            invocation.assertCompilationResult {
+                hasErrorCount(1)
+                hasErrorContaining(
+                    autoMigrationSchemasMustBeRoomGenerated(1, 2)
+                )
+            }
+        }
+    }
+
     private fun resolveDatabaseViews(
         views: Map<String, Set<String>>,
         body: (List<DatabaseView>, XTestInvocation) -> Unit
@@ -1302,7 +1443,10 @@
                     "foo.bar.MyDb",
                     DATABASE_PREFIX + input
                 ),
-            classpath = classpath
+            classpath = classpath,
+            options = mapOf(
+                "room.schemaLocation" to schemaFolder.root.absolutePath
+            )
         ) { invocation ->
             val entity = invocation.roundEnv
                 .getElementsAnnotatedWith(
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index 4b2c808..79f15d2 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -20,8 +20,10 @@
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.compileFiles
 import androidx.room.compiler.processing.util.getSystemClasspathFiles
+import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.processor.ProcessorErrors.RELATION_IN_ENTITY
+import androidx.room.testing.context
 import androidx.room.vo.CallType
 import androidx.room.vo.Field
 import androidx.room.vo.FieldGetter
@@ -2466,4 +2468,29 @@
             }
         }
     }
+
+    @Test
+    fun typeAlias() {
+        val src = Source.kotlin(
+            "Entity.kt",
+            """
+            import androidx.room.*;
+
+            typealias MyLong = Long
+            @Entity(tableName = "par_table")
+            data class Subject(@PrimaryKey @ColumnInfo(name = "my_long") val myLong: MyLong)
+            """.trimIndent()
+        )
+        runProcessorTest(
+            sources = listOf(src)
+        ) { invocation ->
+            val parser = TableEntityProcessor(
+                invocation.context,
+                invocation.processingEnv.requireTypeElement("Subject")
+            )
+            val parsed = parser.process()
+            val field = parsed.primaryKey.fields.first()
+            assertThat(field.typeName).isEqualTo(TypeName.LONG)
+        }
+    }
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index 4e2dcb4..8869c08 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -46,10 +46,12 @@
 import androidx.room.solver.shortcut.binderprovider.GuavaListenableFutureInsertMethodBinderProvider
 import androidx.room.solver.shortcut.binderprovider.RxCallableDeleteOrUpdateMethodBinderProvider
 import androidx.room.solver.shortcut.binderprovider.RxCallableInsertMethodBinderProvider
+import androidx.room.solver.types.BoxedPrimitiveColumnTypeAdapter
 import androidx.room.solver.types.CompositeAdapter
 import androidx.room.solver.types.CompositeTypeConverter
 import androidx.room.solver.types.CustomTypeConverterWrapper
 import androidx.room.solver.types.EnumColumnTypeAdapter
+import androidx.room.solver.types.PrimitiveColumnTypeAdapter
 import androidx.room.solver.types.TypeConverter
 import androidx.room.testing.context
 import com.google.common.truth.Truth.assertThat
@@ -877,6 +879,93 @@
         }
     }
 
+    @Test
+    fun typeAliases() {
+        val source = Source.kotlin(
+            "Foo.kt",
+            """
+            import androidx.room.*
+            typealias MyLongAlias = Long
+            typealias MyNullableLongAlias = Long?
+
+            data class MyClass(val foo:String)
+            typealias MyClassAlias = MyClass
+            typealias MyClassNullableAlias = MyClass?
+
+            object MyConverters {
+                @TypeConverter
+                fun myClassToString(myClass : MyClass): String = TODO()
+                @TypeConverter
+                fun nullableMyClassToString(myClass : MyClass?): String? = TODO()
+            }
+            class Subject {
+                val myLongAlias : MyLongAlias = TODO()
+                val myLongAlias_nullable : MyLongAlias? = TODO()
+                val myNullableLongAlias : MyNullableLongAlias = TODO()
+                val myNullableLongAlias_nullable : MyNullableLongAlias? = TODO()
+                val myClass : MyClass = TODO()
+                val myClassAlias : MyClassAlias = TODO()
+                val myClassAlias_nullable : MyClassAlias? = TODO()
+                val myClassNullableAlias : MyClassNullableAlias = TODO()
+                val myClassNullableAlias_nullable : MyClassNullableAlias = TODO()
+            }
+            """.trimIndent()
+        )
+        runProcessorTest(
+            sources = listOf(source)
+        ) { invocation ->
+            val converters = CustomConverterProcessor(
+                context = invocation.context,
+                element = invocation.processingEnv.requireTypeElement("MyConverters")
+            ).process().map(::CustomTypeConverterWrapper)
+            val typeAdapterStore = TypeAdapterStore.create(
+                context = invocation.context,
+                extras = converters.toTypedArray()
+            )
+            val subject = invocation.processingEnv.requireTypeElement("Subject")
+            val results = subject.getAllFieldsIncludingPrivateSupers().associate { field ->
+                val binder = typeAdapterStore.findStatementValueBinder(
+                    input = field.type,
+                    affinity = null
+                )
+
+                val signature = when (binder) {
+                    null -> null
+                    is PrimitiveColumnTypeAdapter -> "primitive"
+                    is BoxedPrimitiveColumnTypeAdapter -> "boxed"
+                    is CompositeAdapter -> {
+                        when (val converter = binder.intoStatementConverter) {
+                            null -> "composite null"
+                            is CustomTypeConverterWrapper -> converter.custom.methodName
+                            else -> "composite unknown"
+                        }
+                    }
+                    else -> "unknown"
+                }
+                field.name to signature
+            }
+            // see: 187359339. We use nullability for assignments only in KSP
+            val nullableClassAdapter = if (invocation.isKsp) {
+                "nullableMyClassToString"
+            } else {
+                "myClassToString"
+            }
+            assertThat(results).containsExactlyEntriesIn(
+                mapOf(
+                    "myLongAlias" to "primitive",
+                    "myLongAlias_nullable" to "boxed",
+                    "myNullableLongAlias" to "boxed",
+                    "myNullableLongAlias_nullable" to "boxed",
+                    "myClass" to "myClassToString",
+                    "myClassAlias" to "myClassToString",
+                    "myClassAlias_nullable" to nullableClassAdapter,
+                    "myClassNullableAlias" to nullableClassAdapter,
+                    "myClassNullableAlias_nullable" to nullableClassAdapter,
+                )
+            )
+        }
+    }
+
     private fun createIntListToStringBinders(invocation: XTestInvocation): List<TypeConverter> {
         val intType = invocation.processingEnv.requireType(Integer::class)
         val listElement = invocation.processingEnv.requireTypeElement(java.util.List::class)
diff --git a/room/compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt b/room/compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
index c416c40..b83f113 100644
--- a/room/compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
@@ -25,7 +25,7 @@
 import androidx.room.migration.bundle.SchemaBundle
 import androidx.room.processor.ProcessorErrors
 import com.google.common.truth.Truth.assertThat
-import com.ibm.icu.impl.Assert.fail
+import org.junit.Assert.fail
 import org.junit.Test
 
 class SchemaDifferTest {
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
index 9497ce2..9705336 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
@@ -20,7 +20,7 @@
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.util.SchemaDiffResult
-import androidx.room.vo.AutoMigrationResult
+import androidx.room.vo.AutoMigration
 import loadTestSource
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -35,14 +35,14 @@
             "foo.bar.ValidAutoMigrationWithDefault",
             """
             package foo.bar;
-            import androidx.room.migration.AutoMigrationCallback;
+            import androidx.room.migration.AutoMigrationSpec;
             import androidx.sqlite.db.SupportSQLiteDatabase;
-            interface ValidAutoMigrationWithDefault extends AutoMigrationCallback {}
+            public class ValidAutoMigrationWithDefault implements AutoMigrationSpec {}
             """.trimIndent()
         )
 
         runProcessorTest(listOf(source)) { invocation ->
-            val autoMigrationResultWithNewAddedColumn = AutoMigrationResult(
+            val autoMigrationResultWithNewAddedColumn = AutoMigration(
                 element = invocation.processingEnv.requireTypeElement(
                     "foo.bar.ValidAutoMigrationWithDefault"
                 ),
@@ -52,7 +52,7 @@
                     addedColumns = mapOf(
                         Pair(
                             "artistId",
-                            AutoMigrationResult.AddedColumn(
+                            AutoMigration.AddedColumn(
                                 "Song",
                                 FieldBundle(
                                     "artistId",
@@ -68,8 +68,14 @@
                     addedTables = setOf(),
                     complexChangedTables = mapOf(),
                     renamedTables = mapOf(),
-                    deletedTables = listOf()
+                    deletedTables = listOf(),
+                    fromViews = emptyList(),
+                    toViews = emptyList()
                 ),
+                specElement = invocation.processingEnv.requireTypeElement(
+                    "foo.bar.ValidAutoMigrationWithDefault"
+                ),
+                isSpecProvided = false
             )
             AutoMigrationWriter(
                 autoMigrationResultWithNewAddedColumn.element,
@@ -82,7 +88,7 @@
                     loadTestSource(
                         "autoMigrationWriter/output/ValidAutoMigrationWithDefault" +
                             ".java",
-                        "foo.bar.AutoMigration_1_2_Impl"
+                        "foo.bar.ValidAutoMigrationWithDefault_AutoMigration_1_2_Impl"
                     )
                 )
             }
@@ -95,14 +101,14 @@
             "foo.bar.ValidAutoMigrationWithoutDefault",
             """
             package foo.bar;
-            import androidx.room.migration.AutoMigrationCallback;
+            import androidx.room.migration.AutoMigrationSpec;
             import androidx.sqlite.db.SupportSQLiteDatabase;
-            interface ValidAutoMigrationWithoutDefault extends AutoMigrationCallback {}
+            public class ValidAutoMigrationWithoutDefault implements AutoMigrationSpec {}
             """.trimIndent()
         )
 
         runProcessorTest(listOf(source)) { invocation ->
-            val autoMigrationResultWithNewAddedColumn = AutoMigrationResult(
+            val autoMigrationResultWithNewAddedColumn = AutoMigration(
                 element = invocation.processingEnv.requireTypeElement(
                     "foo.bar.ValidAutoMigrationWithoutDefault"
                 ),
@@ -112,7 +118,7 @@
                     addedColumns = mapOf(
                         Pair(
                             "artistId",
-                            AutoMigrationResult.AddedColumn(
+                            AutoMigration.AddedColumn(
                                 "Song",
                                 FieldBundle(
                                     "artistId",
@@ -128,8 +134,14 @@
                     addedTables = setOf(),
                     complexChangedTables = mapOf(),
                     renamedTables = mapOf(),
-                    deletedTables = listOf()
+                    deletedTables = listOf(),
+                    fromViews = emptyList(),
+                    toViews = emptyList()
                 ),
+                specElement = invocation.processingEnv.requireTypeElement(
+                    "foo.bar.ValidAutoMigrationWithoutDefault"
+                ),
+                isSpecProvided = false
             )
             AutoMigrationWriter(
                 autoMigrationResultWithNewAddedColumn.element,
@@ -141,7 +153,7 @@
                 generatedSource(
                     loadTestSource(
                         "autoMigrationWriter/output/ValidAutoMigrationWithoutDefault.java",
-                        "foo.bar.AutoMigration_1_2_Impl"
+                        "foo.bar.ValidAutoMigrationWithoutDefault_AutoMigration_1_2_Impl"
                     )
                 )
             }
diff --git a/room/guava/lint-baseline.xml b/room/guava/lint-baseline.xml
index 0e379ad..0da24db 100644
--- a/room/guava/lint-baseline.xml
+++ b/room/guava/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        cancellationSignal.cancel();"
         errorLine2="                                           ~~~~~~">
         <location
diff --git a/room/integration-tests/autovaluetestapp/build.gradle b/room/integration-tests/autovaluetestapp/build.gradle
index aafd894..01ee90f 100644
--- a/room/integration-tests/autovaluetestapp/build.gradle
+++ b/room/integration-tests/autovaluetestapp/build.gradle
@@ -47,8 +47,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
 
     testImplementation(JUNIT)
 }
diff --git a/room/integration-tests/autovaluetestapp/lint-baseline.xml b/room/integration-tests/autovaluetestapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/room/integration-tests/autovaluetestapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/integration-tests/incremental-annotation-processing/lint-baseline.xml b/room/integration-tests/incremental-annotation-processing/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/room/integration-tests/incremental-annotation-processing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/integration-tests/kotlintestapp/build.gradle b/room/integration-tests/kotlintestapp/build.gradle
index a378d53..ecaa20a 100644
--- a/room/integration-tests/kotlintestapp/build.gradle
+++ b/room/integration-tests/kotlintestapp/build.gradle
@@ -107,6 +107,7 @@
                 project(path: ":room:room-compiler", configuration: "shadowAndImplementation")
         )
     }
+    androidTestImplementation(projectOrArtifact(":lifecycle:lifecycle-livedata-ktx"))
     androidTestImplementation(projectOrArtifact(":arch:core:core-runtime")) // Added for b/155802460
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/room/integration-tests/kotlintestapp/lint-baseline.xml b/room/integration-tests/kotlintestapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/room/integration-tests/kotlintestapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/PagingSourceTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/PagingSourceTest.kt
index 91ff153..b3a0afd 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/PagingSourceTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/PagingSourceTest.kt
@@ -17,6 +17,7 @@
 package androidx.room.integration.kotlintestapp.test
 
 import androidx.paging.AsyncPagingDataDiffer
+import androidx.paging.LoadState
 import androidx.paging.Pager
 import androidx.paging.PagingConfig
 import androidx.paging.PagingData
@@ -39,15 +40,20 @@
 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.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.cancel
 import kotlinx.coroutines.cancelAndJoin
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.distinctUntilChangedBy
+import kotlinx.coroutines.flow.drop
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.mapLatest
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
@@ -71,14 +77,17 @@
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class PagingSourceTest {
-
+    private lateinit var coroutineScope: CoroutineScope
     private lateinit var db: Paging3Db
-    private val itemStore = ItemStore()
+    private lateinit var itemStore: ItemStore
     private val queryExecutor = FilteringExecutor()
     private val mainThreadQueries = mutableListOf<Pair<String, String>>()
 
     @Before
     fun init() {
+        coroutineScope = CoroutineScope(Dispatchers.Main)
+        itemStore = ItemStore(coroutineScope)
+
         val mainThread: Thread = runBlocking(Dispatchers.Main) {
             Thread.currentThread()
         }
@@ -102,8 +111,10 @@
     }
 
     @After
-    fun checkNoMainThreadQueriesHappened() {
+    fun tearDown() {
+        // Check no mainThread queries happened.
         assertThat(mainThreadQueries).isEmpty()
+        coroutineScope.cancel()
     }
 
     @Test
@@ -248,18 +259,13 @@
         runTest {
             itemStore.awaitGeneration(1)
             itemStore.awaitInitialLoad()
-            assertThat(
-                itemStore.peekItems()
-            ).isEmpty()
+            assertThat(itemStore.peekItems()).isEmpty()
+
             val entity = PagingEntity(id = 1, value = "foo")
-            db.dao.insert(
-                entity
-            )
+            db.dao.insert(entity)
             itemStore.awaitGeneration(2)
             itemStore.awaitInitialLoad()
-            assertThat(
-                itemStore.peekItems()
-            ).containsExactly(entity)
+            assertThat(itemStore.peekItems()).containsExactly(entity)
         }
     }
 
@@ -271,7 +277,7 @@
             ),
         block: suspend () -> Unit
     ) {
-        val collection = GlobalScope.launch(Dispatchers.Main) {
+        val collection = coroutineScope.launch(Dispatchers.Main) {
             pager.flow.collectLatest {
                 itemStore.collectFrom(it)
             }
@@ -362,7 +368,7 @@
     /**
      * Our fake adapter that holds the items.
      */
-    private class ItemStore {
+    private class ItemStore(private val coroutineScope: CoroutineScope) {
         // We get a new generation each time list changes. This is used to await certain events
         // happening. Each generation have an id that maps to a paging generation.
         // This value is modified only on the main thread.
@@ -392,6 +398,30 @@
             }
         )
 
+        init {
+            coroutineScope.launch {
+                asyncDiffer.loadStateFlow
+                    .drop(1) // Ignore initial state
+                    .distinctUntilChangedBy { it.source.refresh }
+                    .map { it.source.refresh }
+                    .filter { it is LoadState.NotLoading }
+                    .collect {
+                        val current = generation.value
+                        generation.value = current.copy(
+                            initialLoadCompleted = true,
+                        )
+                    }
+            }
+        }
+
+        private fun incrementGeneration() {
+            val current = generation.value
+            generation.value = current.copy(
+                initialLoadCompleted = false,
+                id = current.id + 1,
+            )
+        }
+
         fun peekItems() = (0 until asyncDiffer.itemCount).map {
             asyncDiffer.peek(it)
         }
@@ -411,14 +441,9 @@
             asyncDiffer.submitData(data)
         }
 
-        private suspend fun incrementGeneration() = withContext(Dispatchers.Main) {
-            val curGenId = generation.value.id
-            generation.value = Generation(curGenId + 1)
-        }
-
         @MainThread
         private fun onDataSetChanged(id: Int) {
-            GlobalScope.launch(Dispatchers.Main) {
+            coroutineScope.launch(Dispatchers.Main) {
                 // deferring this
                 yield()
                 val curGen = generation.value
@@ -525,4 +550,4 @@
     } catch (err: Throwable) {
         throw AssertionError("didn't complete in expected time", err)
     }
-}
\ No newline at end of file
+}
diff --git a/room/integration-tests/noappcompattestapp/lint-baseline.xml b/room/integration-tests/noappcompattestapp/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/room/integration-tests/noappcompattestapp/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index edcd26b..f89faf2 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -114,8 +114,8 @@
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":internal-testutils-truth"))
 
 
diff --git a/room/integration-tests/testapp/lint-baseline.xml b/room/integration-tests/testapp/lint-baseline.xml
index 63245b8..9d71701 100644
--- a/room/integration-tests/testapp/lint-baseline.xml
+++ b/room/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="SyntheticAccessor"
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/1.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/1.json
index 8b7d1c0..0477196 100644
--- a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/1.json
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/1.json
@@ -665,9 +665,169 @@
         },
         "indices": [],
         "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS4",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "Entity13",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS4",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_BEFORE_UPDATE BEFORE UPDATE ON `Entity13` BEGIN DELETE FROM `Entity21` WHERE `docid`=OLD.`rowid`; END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_BEFORE_DELETE BEFORE DELETE ON `Entity13` BEGIN DELETE FROM `Entity21` WHERE `docid`=OLD.`rowid`; END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_AFTER_UPDATE AFTER UPDATE ON `Entity13` BEGIN INSERT INTO `Entity21`(`docid`, `name`, `addedInV1`) VALUES (NEW.`rowid`, NEW.`name`, NEW.`addedInV1`); END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_AFTER_INSERT AFTER INSERT ON `Entity13` BEGIN INSERT INTO `Entity21`(`docid`, `name`, `addedInV1`) VALUES (NEW.`rowid`, NEW.`name`, NEW.`addedInV1`); END"
+        ],
+        "tableName": "Entity21",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS4(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, content=`Entity13`)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS3",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS3",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [],
+        "tableName": "Entity22",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS3(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, matchinfo=fts3)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS3",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS3",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [],
+        "tableName": "Entity23",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS3(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, matchinfo=fts3)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "Entity25",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `entity7Id` INTEGER NOT NULL DEFAULT 1, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "entity7Id",
+            "columnName": "entity7Id",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
       }
     ],
-    "views": [],
+    "views": [
+      {
+        "viewName": "Entity25Detail",
+        "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT Entity25.id, Entity25.name, Entity25.entity7Id, Entity7.name AS userNameAndId FROM Entity25 INNER JOIN Entity7 ON Entity25.entity7Id = Entity7.id"
+      }
+    ],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
       "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4effe9c46eb525253fa7650696035fa5')"
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/2.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/2.json
index a925d683..aa7dd78 100644
--- a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/2.json
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.AutoMigrationDb/2.json
@@ -2,7 +2,7 @@
   "formatVersion": 1,
   "database": {
     "version": 2,
-    "identityHash": "083a4e91debef71d5d900ca2cf0baccf",
+    "identityHash": "24a4a9a632f303b32cc8cfcc1534a1b1",
     "entities": [
       {
         "tableName": "Entity1",
@@ -673,12 +673,218 @@
         },
         "indices": [],
         "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS4",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "Entity13_V2",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS4",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_BEFORE_UPDATE BEFORE UPDATE ON `Entity13_V2` BEGIN DELETE FROM `Entity21` WHERE `docid`=OLD.`rowid`; END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_BEFORE_DELETE BEFORE DELETE ON `Entity13_V2` BEGIN DELETE FROM `Entity21` WHERE `docid`=OLD.`rowid`; END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_AFTER_UPDATE AFTER UPDATE ON `Entity13_V2` BEGIN INSERT INTO `Entity21`(`docid`, `name`, `addedInV1`) VALUES (NEW.`rowid`, NEW.`name`, NEW.`addedInV1`); END",
+          "CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_Entity21_AFTER_INSERT AFTER INSERT ON `Entity13_V2` BEGIN INSERT INTO `Entity21`(`docid`, `name`, `addedInV1`) VALUES (NEW.`rowid`, NEW.`name`, NEW.`addedInV1`); END"
+        ],
+        "tableName": "Entity21",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS4(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, content=`Entity13_V2`)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS4",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS4",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [],
+        "tableName": "Entity22",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS4(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS3",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS4",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [],
+        "tableName": "Entity23",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS3(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, `addedInV2` INTEGER NOT NULL DEFAULT 2)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "addedInV2",
+            "columnName": "addedInV2",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "2"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "ftsVersion": "FTS3",
+        "ftsOptions": {
+          "tokenizer": "simple",
+          "tokenizerArgs": [],
+          "contentTable": "",
+          "languageIdColumnName": "",
+          "matchInfo": "FTS4",
+          "notIndexedColumns": [],
+          "prefixSizes": [],
+          "preferredOrder": "ASC"
+        },
+        "contentSyncTriggers": [],
+        "tableName": "Entity24",
+        "createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS3(`name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1)",
+        "fields": [
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "rowid"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "Entity25",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `entity1Id` INTEGER NOT NULL DEFAULT 1, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "entity1Id",
+            "columnName": "entity1Id",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
       }
     ],
-    "views": [],
+    "views": [
+      {
+        "viewName": "Entity25Detail",
+        "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT Entity25.id, Entity25.name, Entity25.entity1Id, Entity1.name AS userNameAndId FROM Entity25 INNER JOIN Entity1 ON Entity25.entity1Id = Entity1.id"
+      }
+    ],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '083a4e91debef71d5d900ca2cf0baccf')"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '24a4a9a632f303b32cc8cfcc1534a1b1')"
     ]
   }
 }
\ No newline at end of file
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/1.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/1.json
new file mode 100644
index 0000000..a47d59f
--- /dev/null
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/1.json
@@ -0,0 +1,47 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 1,
+    "identityHash": "250b199947a14a67da3f70823e90f8bc",
+    "entities": [
+      {
+        "tableName": "Entity1",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      }
+    ],
+    "views": [],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '250b199947a14a67da3f70823e90f8bc')"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/2.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/2.json
new file mode 100644
index 0000000..96cda7c
--- /dev/null
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.ProvidedAutoMigrationSpecTest.ProvidedAutoMigrationDb/2.json
@@ -0,0 +1,87 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 2,
+    "identityHash": "553bb9e0bb6c2673f0687f76e66f6304",
+    "entities": [
+      {
+        "tableName": "Entity1",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "Entity2",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `addedInV1` INTEGER NOT NULL DEFAULT 1, `addedInV2` INTEGER NOT NULL DEFAULT 2, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "addedInV1",
+            "columnName": "addedInV1",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "addedInV2",
+            "columnName": "addedInV2",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "2"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      }
+    ],
+    "views": [],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '553bb9e0bb6c2673f0687f76e66f6304')"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationDb.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationDb.java
index db63fc3..186befee 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationDb.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationDb.java
@@ -16,23 +16,27 @@
 
 package androidx.room.integration.testapp.migration;
 
-
 import androidx.annotation.NonNull;
 import androidx.room.AutoMigration;
 import androidx.room.ColumnInfo;
 import androidx.room.Dao;
 import androidx.room.Database;
+import androidx.room.DatabaseView;
 import androidx.room.DeleteColumn;
 import androidx.room.DeleteTable;
 import androidx.room.Entity;
 import androidx.room.ForeignKey;
+import androidx.room.Fts3;
+import androidx.room.Fts4;
+import androidx.room.FtsOptions;
 import androidx.room.Index;
 import androidx.room.PrimaryKey;
 import androidx.room.Query;
 import androidx.room.RenameColumn;
 import androidx.room.RenameTable;
 import androidx.room.RoomDatabase;
-import androidx.room.migration.AutoMigrationCallback;
+import androidx.room.migration.AutoMigrationSpec;
+import androidx.sqlite.db.SupportSQLiteDatabase;
 
 import java.util.List;
 
@@ -57,13 +61,21 @@
                 AutoMigrationDb.Entity16.class,
                 AutoMigrationDb.Entity17.class,
                 AutoMigrationDb.Entity19_V2.class,
-                AutoMigrationDb.Entity20_V2.class
+                AutoMigrationDb.Entity20_V2.class,
+                AutoMigrationDb.Entity21.class,
+                AutoMigrationDb.Entity22.class,
+                AutoMigrationDb.Entity23.class,
+                AutoMigrationDb.Entity24.class,
+                AutoMigrationDb.Entity25.class
         },
         autoMigrations = {
                 @AutoMigration(
-                        from = 1, to = 2, callback = AutoMigrationDb.SimpleAutoMigration1.class
+                        from = 1, to = 2, spec = AutoMigrationDb.SimpleAutoMigration1.class
                 )
         },
+        views = {
+                AutoMigrationDb.Entity25Detail.class
+        },
         exportSchema = true
 )
 public abstract class AutoMigrationDb extends RoomDatabase {
@@ -334,23 +346,106 @@
         public int addedInV2;
     }
 
+    /**
+     * The content table of this FTS table has been renamed from Entity13 to Entity13_V2.
+     */
+    @Entity
+    @Fts4(contentEntity = Entity13_V2.class)
+    static class Entity21 {
+        public static final String TABLE_NAME = "Entity21";
+        @PrimaryKey
+        public int rowid;
+        public String name;
+        @ColumnInfo(defaultValue = "1")
+        public int addedInV1;
+    }
+
+    /**
+     * Change the options of the table from FTS3 to FTS4.
+     */
+    @Entity
+    @Fts4(matchInfo = FtsOptions.MatchInfo.FTS4)
+    static class Entity22 {
+        public static final String TABLE_NAME = "Entity22";
+        @PrimaryKey
+        public int rowid;
+        public String name;
+        @ColumnInfo(defaultValue = "1")
+        public int addedInV1;
+    }
+
+    @Entity
+    @Fts3
+    static class Entity23 {
+        public static final String TABLE_NAME = "Entity23";
+        @PrimaryKey
+        public int rowid;
+        public String name;
+        @ColumnInfo(defaultValue = "1")
+        public int addedInV1;
+        @ColumnInfo(defaultValue = "2")
+        public int addedInV2;
+    }
+
+    @Entity
+    @Fts3
+    static class Entity24 {
+        public static final String TABLE_NAME = "Entity24";
+        @PrimaryKey
+        public int rowid;
+        public String name;
+        @ColumnInfo(defaultValue = "1")
+        public int addedInV1;
+    }
+
+    @DatabaseView(
+            "SELECT Entity25.id, Entity25.name, Entity25.entity1Id, Entity1.name AS userNameAndId "
+                    + "FROM Entity25 INNER JOIN Entity1 ON Entity25.entity1Id = Entity1.id ")
+    static class Entity25Detail {
+        public int id;
+        public String name;
+        public String entity1Id;
+    }
+
+    /**
+     * Change the view between versions to use Entity1 instead of Entity7.
+     */
+    @Entity
+    static class Entity25 {
+        public static final String TABLE_NAME = "Entity25";
+        @PrimaryKey
+        public int id;
+        public String name;
+        @ColumnInfo(defaultValue = "1")
+        public int entity1Id;
+    }
+
     @Dao
     interface AutoMigrationDao {
         @Query("SELECT * from Entity1 ORDER BY id ASC")
         List<AutoMigrationDb.Entity1> getAllEntity1s();
     }
 
-    @DeleteTable(deletedTableName = "Entity18")
-    @RenameTable(originalTableName = "Entity19", newTableName = "Entity19_V2")
-    @RenameTable(originalTableName = "Entity20", newTableName = "Entity20_V2")
-    @RenameTable(originalTableName = "Entity13", newTableName = "Entity13_V2")
-    @RenameColumn(tableName = "Entity16", originalColumnName = "addedInV1",
-            newColumnName = "renamedInV2")
-    @RenameColumn(tableName = "Entity17", originalColumnName = "addedInV1",
-            newColumnName = "renamedInV2")
-    @RenameColumn(tableName = "Entity20", originalColumnName = "addedInV1",
-            newColumnName = "renamedInV2")
-    @DeleteColumn(tableName = "Entity15", deletedColumnName = "addedInV1")
-    interface SimpleAutoMigration1 extends AutoMigrationCallback {
+    @DeleteTable(tableName = "Entity18")
+    @RenameTable(fromTableName = "Entity19", toTableName = "Entity19_V2")
+    @RenameTable(fromTableName = "Entity20", toTableName = "Entity20_V2")
+    @RenameTable(fromTableName = "Entity13", toTableName = "Entity13_V2")
+    @RenameColumn(tableName = "Entity16", fromColumnName = "addedInV1",
+            toColumnName = "renamedInV2")
+    @RenameColumn(tableName = "Entity17", fromColumnName = "addedInV1",
+            toColumnName = "renamedInV2")
+    @RenameColumn(tableName = "Entity20", fromColumnName = "addedInV1",
+            toColumnName = "renamedInV2")
+    @DeleteColumn(tableName = "Entity15", columnName = "addedInV1")
+    @RenameColumn(
+            tableName = "Entity25",
+            fromColumnName = "entity7Id",
+            toColumnName = "entity1Id"
+    )
+    static class SimpleAutoMigration1 implements AutoMigrationSpec {
+        @Override
+        public void onPostMigrate(@NonNull SupportSQLiteDatabase db) {
+            // Do something
+        }
     }
 }
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationTest.java
index 7a45a06..fa6fa9d 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/AutoMigrationTest.java
@@ -16,11 +16,16 @@
 
 package androidx.room.integration.testapp.migration;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.fail;
 
+import android.database.sqlite.SQLiteException;
+
+import androidx.annotation.NonNull;
 import androidx.room.Room;
+import androidx.room.migration.Migration;
 import androidx.room.testing.MigrationTestHelper;
 import androidx.sqlite.db.SupportSQLiteDatabase;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -54,6 +59,9 @@
         db.close();
     }
 
+    /**
+     * Tests the case where a non existent auto migration is called.
+     */
     @Test
     public void testBadAutoMigrationInput() throws IOException {
         try (SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1)) {
@@ -85,12 +93,37 @@
         helper.runMigrationsAndValidate(
                 TEST_DB,
                 2,
-                true,
-                autoMigrationDbV2.getAutoGeneratedMigration(1, 2)
+                true
         );
         assertThat(autoMigrationDbV2.dao().getAllEntity1s().size(), is(1));
     }
 
+    /**
+     * Verifies that the user defined migration is selected over using an autoMigration.
+     */
+    @Test
+    public void goFromV1ToV2WithUserDefinedMigration() throws IOException {
+        try (SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1)) {
+            db.execSQL("INSERT INTO Entity1 (id, name) VALUES (1, 'row1')");
+        }
+
+        try {
+            AutoMigrationDb autoMigrationDbV2 = Room.databaseBuilder(
+                    InstrumentationRegistry.getInstrumentation().getTargetContext(),
+                    AutoMigrationDb.class, TEST_DB).addMigrations(MIGRATION_1_2).build();
+            autoMigrationDbV2.getOpenHelper().getWritableDatabase(); // trigger open
+            helper.closeWhenFinished(autoMigrationDbV2);
+
+            helper.runMigrationsAndValidate(
+                    TEST_DB,
+                    2,
+                    true
+            );
+        } catch (SQLiteException exception) {
+            assertThat(exception.getMessage(), containsString("no such table: Entity0"));
+        }
+    }
+
     private AutoMigrationDb getLatestDb() {
         AutoMigrationDb db = Room.databaseBuilder(
                 InstrumentationRegistry.getInstrumentation().getTargetContext(),
@@ -99,4 +132,12 @@
         helper.closeWhenFinished(db);
         return db;
     }
+
+    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
+        @Override
+        public void migrate(@NonNull SupportSQLiteDatabase database) {
+            database.execSQL("ALTER TABLE `Entity0` ADD COLUMN `addedInV2` INTEGER NOT NULL "
+                    + "DEFAULT 2");
+        }
+    };
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/ProvidedAutoMigrationSpecTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/ProvidedAutoMigrationSpecTest.java
new file mode 100644
index 0000000..da5c158
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/ProvidedAutoMigrationSpecTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this 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.room.integration.testapp.migration;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import androidx.annotation.NonNull;
+import androidx.room.AutoMigration;
+import androidx.room.ColumnInfo;
+import androidx.room.Database;
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+import androidx.room.ProvidedAutoMigrationSpec;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.room.migration.AutoMigrationSpec;
+import androidx.room.testing.MigrationTestHelper;
+import androidx.sqlite.db.SupportSQLiteDatabase;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+
+/**
+ * Test custom database migrations.
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class ProvidedAutoMigrationSpecTest {
+    private static final String TEST_DB = "auto-migration-test";
+    private ProvidedAutoMigrationDb.MyProvidedAutoMigration mProvidedSpec =
+            new ProvidedAutoMigrationDb.MyProvidedAutoMigration("Hi");
+
+    @Rule
+    public MigrationTestHelper helper;
+
+    public ProvidedAutoMigrationSpecTest() {
+        helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
+                ProvidedAutoMigrationDb.class.getCanonicalName());
+    }
+
+    @Database(
+            version = ProvidedAutoMigrationDb.LATEST_VERSION,
+            entities = {
+                    ProvidedAutoMigrationDb.Entity1.class,
+                    ProvidedAutoMigrationDb.Entity2.class
+            },
+            autoMigrations = {
+                    @AutoMigration(
+                            from = 1, to = 2, spec =
+                            ProvidedAutoMigrationDb.MyProvidedAutoMigration.class
+                    )
+            },
+            exportSchema = true
+    )
+    public abstract static class ProvidedAutoMigrationDb extends RoomDatabase {
+        static final int LATEST_VERSION = 2;
+
+        /**
+         * No change between versions.
+         */
+        @Entity
+        static class Entity1 {
+            public static final String TABLE_NAME = "Entity1";
+            @PrimaryKey
+            public int id;
+            public String name;
+            @ColumnInfo(defaultValue = "1")
+            public int addedInV1;
+        }
+
+        /**
+         * A new table added.
+         */
+        @Entity
+        static class Entity2 {
+            public static final String TABLE_NAME = "Entity2";
+            @PrimaryKey
+            public int id;
+            public String name;
+            @ColumnInfo(defaultValue = "1")
+            public int addedInV1;
+            @ColumnInfo(defaultValue = "2")
+            public int addedInV2;
+        }
+
+        @ProvidedAutoMigrationSpec
+        static class MyProvidedAutoMigration implements AutoMigrationSpec {
+            private final String mPrefString;
+            public boolean mOnPostMigrateCalled = false;
+
+            MyProvidedAutoMigration(String prefString) {
+                this.mPrefString = prefString;
+            }
+
+            @Override
+            public void onPostMigrate(@NonNull SupportSQLiteDatabase db) {
+                mOnPostMigrateCalled = true;
+            }
+        }
+    }
+
+    // Run this to create the very 1st version of the db.
+    public void createFirstVersion() throws IOException {
+        SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 2);
+        db.close();
+    }
+
+    @Test
+    public void testOnPostMigrate() throws IOException {
+        SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 1);
+        ProvidedAutoMigrationDb autoMigrationDbV2 = getLatestDb();
+        helper.runMigrationsAndValidate(
+                TEST_DB,
+                2,
+                true
+        );
+        assertThat(mProvidedSpec.mOnPostMigrateCalled, is(true));
+    }
+
+    /**
+     * Verifies that the user defined migration is selected over using an autoMigration.
+     */
+    @Test
+    public void testNoSpecProvidedInConfig() {
+        try {
+            ProvidedAutoMigrationDb autoMigrationDbV2 = Room.databaseBuilder(
+                    InstrumentationRegistry.getInstrumentation().getTargetContext(),
+                    ProvidedAutoMigrationDb.class, TEST_DB).build();
+        } catch (IllegalArgumentException exception) {
+            assertThat(
+                    exception.getMessage(),
+                    containsString(
+                            "A required auto migration spec (androidx.room.integration.testapp"
+                                    + ".migration.ProvidedAutoMigrationSpecTest"
+                                    + ".ProvidedAutoMigrationDb.MyProvidedAutoMigration) is "
+                                    + "missing in the database configuration."
+                    )
+            );
+        }
+    }
+
+    private ProvidedAutoMigrationDb getLatestDb() {
+        ProvidedAutoMigrationDb db = Room.databaseBuilder(
+                InstrumentationRegistry.getInstrumentation().getTargetContext(),
+                ProvidedAutoMigrationDb.class, TEST_DB)
+                .addAutoMigrationSpec(mProvidedSpec)
+                .build();
+        db.getOpenHelper().getWritableDatabase(); // trigger open
+        helper.closeWhenFinished(db);
+        return db;
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/InvalidationTrackerBehavioralTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/InvalidationTrackerBehavioralTest.java
new file mode 100644
index 0000000..2aca929
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/InvalidationTrackerBehavioralTest.java
@@ -0,0 +1,268 @@
+/*
+ * 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.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.room.Dao;
+import androidx.room.Database;
+import androidx.room.Entity;
+import androidx.room.Insert;
+import androidx.room.InvalidationTracker;
+import androidx.room.PrimaryKey;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
+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;
+
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Regression test for a situation where an InvalidationTracker callback may intermittently be
+ * invoked too early, too late, or not at all, due to missing transactionality in tracking table
+ * code, when distinct database updates occur in close temporal proximity.
+ */
+@LargeTest
+@FlakyTest(
+        bugId = 154040286,
+        detail = "Behavioral test for potentially intermittent InvalidationTracker problems"
+)
+@RunWith(AndroidJUnit4.class)
+public class InvalidationTrackerBehavioralTest {
+    private ExecutorService mExecutorService;
+
+    @Before
+    public void setup() {
+        mExecutorService = Executors.newSingleThreadExecutor();
+    }
+
+    @After
+    public void tearDown() {
+        mExecutorService.shutdown();
+    }
+
+    @Test
+    public void testInserts_JournalModeTruncate() throws ExecutionException, InterruptedException {
+        testInserts(RoomDatabase.JournalMode.TRUNCATE);
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN)
+    public void testInserts_JournalModeWAL() throws ExecutionException, InterruptedException {
+        testInserts(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING);
+    }
+
+    private void testInserts(RoomDatabase.JournalMode journalMode)
+            throws ExecutionException, InterruptedException {
+        testInserts(journalMode, true);
+        testInserts(journalMode, false);
+    }
+
+    private void testInserts(RoomDatabase.JournalMode journalMode, boolean multiInstance)
+            throws ExecutionException, InterruptedException {
+        final RoomDatabase.Builder<DB> dbBuilder = Room
+                // We need a physical DB to more easily reproduce invalidation callback errors,
+                // and to support enableMultiInstanceInvalidation, which in turn helps reproduce
+                // missed invalidation callbacks
+                .databaseBuilder(ApplicationProvider.getApplicationContext(), DB.class, DB.NAME)
+                .setJournalMode(journalMode);
+        if (multiInstance) {
+            // Helps reproduce missed invalidation callbacks
+            dbBuilder.enableMultiInstanceInvalidation();
+        }
+
+        DB db = dbBuilder.build();
+
+        try {
+            testInserts(db, 30, 0L, 0);
+            testInserts(db, 30, 0L, 10);
+            testInserts(db, 30, 0L, 100);
+            testInserts(db, 30, 0L, 1_000);
+            testInserts(db, 30, 0L, 10_000);
+            testInserts(db, 30, 0L, 100_000);
+            testInserts(db, 30, 1L, 0);
+        } finally {
+            db.close();
+            ApplicationProvider.getApplicationContext().deleteDatabase(DB.NAME);
+        }
+    }
+
+    /**
+     * Uses repetitions within the test to better approximate real-life behavior, rather than
+     * scheduling the whole test for repeated runs from the outside.
+     */
+    private void testInserts(
+            final DB db, final int iterations, final long delayMillis, final int delayNanos
+    ) throws ExecutionException, InterruptedException {
+        final AtomicInteger missedInvalidations = new AtomicInteger();
+        final AtomicInteger spuriousInvalidations = new AtomicInteger();
+
+        // Does not terminate execution as soon as a problem is detected, for simplicity.
+        // Usually there should not be a problem; termination is delayed only when there is a
+        // problem.
+        mExecutorService.submit(new Runnable() {
+            @Nullable
+            volatile CountDownLatch mLatch = null;
+
+            // Releases latch when change notification received, increments
+            // spuriousInvalidations when notification received without a recent change
+            final InvalidationTracker.Observer mInvalidationObserver =
+                    new InvalidationTracker.Observer(Counter2.TABLE_NAME) {
+                        @Override
+                        public void onInvalidated(@NonNull Set<String> tables) {
+                            if (tables.contains(Counter2.TABLE_NAME)) {
+                                // Reading the latch field value is a bit racy,
+                                // but it does not matter:
+                                //
+                                // If we see null here then we're either too early or too late;
+                                // too late means that our long delay was too short, so we'd
+                                // need to adjust it because now the test failed.
+                                // Too early means that we received a spurious invalidation, so
+                                // we need to fail the test.
+                                //
+                                // If we see non-null here instead of null due to a race then
+                                // our long delay was just too short and we'll need to adjust it
+                                // because the test will have failed. latch.countDown() happens
+                                // too late in this case but it has no particular effect.
+                                final CountDownLatch latch = mLatch;
+                                if (latch == null) {
+                                    // Spurious invalidation callback; this might occur due to a
+                                    // large delay beyond the provisioned margin, or due to a
+                                    // bug in the code under test
+                                    spuriousInvalidations.incrementAndGet();
+                                } else {
+                                    latch.countDown();
+                                }
+                            }
+                        }
+                    };
+
+            @Override
+            public void run() {
+                // Ulterior use of this background thread to add the observer, which is not
+                // legal to do from main thread.
+                // To be close to a real use case we only register the observer once,
+                // we do not re-register for each loop iteration.
+                db.getInvalidationTracker().addObserver(mInvalidationObserver);
+
+                try {
+                    // Resets latch and updates missedInvalidations when change notification failed
+                    for (int i = 0; i < iterations; ++i) {
+                        // The Counter1 table exists just to make InvalidationTracker's life more
+                        // difficult, we are not interested in notifications from this one;
+                        // inserts may trigger undefined invalidation callback behavior,
+                        // depending on table update timing
+                        db.counterDao().insert(new Counter1());
+
+                        // Use variable delay to detect different kinds of timing-related problems
+                        try {
+                            Thread.sleep(delayMillis, delayNanos);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+
+                        final CountDownLatch latch = new CountDownLatch(1);
+
+                        db.runInTransaction(() -> {
+                            db.counterDao().insert(new Counter2());
+
+                            // Flag that we have inserted a new value, expect invalidation callback;
+                            // do this as late as possible prior to the end of the transaction;
+                            // this might cause an occasional false negative due to a race,
+                            // where a buggy InvalidationTracker could log successful tracking
+                            // even though the transaction is not completed yet, but it does not
+                            // matter much, as this is an intentionally flaky test; on another run
+                            // it should become apparent that InvalidationTracker is buggy.
+                            mLatch = latch;
+                        });
+
+                        // Use sufficient delay to give invalidation tracker ample time to catch up;
+                        // this would need to be increased if the test had false positives.
+                        try {
+                            if (!latch.await(10L, TimeUnit.SECONDS)) {
+                                // The tracker still has not been called, log an error
+                                missedInvalidations.incrementAndGet();
+                            }
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+
+                        mLatch = null;
+                    }
+                } finally {
+                    db.getInvalidationTracker().removeObserver(mInvalidationObserver);
+                }
+            }
+        }).get();
+
+        assertThat("Missed invalidations on " + iterations + " iterations with delay of " +
+                delayMillis + " ms, " + delayNanos + " ns", missedInvalidations.get(), is(0));
+        assertThat("Spurious invalidations on " + iterations + " iterations with delay of " +
+                delayMillis + " ms, " + delayNanos + " ns", spuriousInvalidations.get(), is(0));
+    }
+
+    @Database(entities = { Counter1.class, Counter2.class }, version = 1, exportSchema = false)
+    abstract static class DB extends RoomDatabase {
+        static final String NAME = "invalidationtrackerbehavioraltest";
+
+        abstract CounterDao counterDao();
+    }
+
+    @Entity(tableName = Counter1.TABLE_NAME)
+    static final class Counter1 {
+        static final String TABLE_NAME = "counter1";
+
+        @PrimaryKey(autoGenerate = true)
+        long value;
+    }
+
+    @Entity(tableName = Counter2.TABLE_NAME)
+    static final class Counter2 {
+        static final String TABLE_NAME = "counter2";
+
+        @PrimaryKey(autoGenerate = true)
+        long value;
+    }
+
+    @Dao
+    abstract static class CounterDao {
+        @Insert
+        abstract void insert(Counter1 entity);
+
+        @Insert
+        abstract void insert(Counter2 entity);
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
index b46e492..54c83ac 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
@@ -262,6 +262,8 @@
         assertTrue(changed2.await(3, TimeUnit.SECONDS));
     }
 
+    // TODO(186405912): broken test
+    @Ignore
     @Test
     public void invalidatedByAnotherProcess() throws Exception {
         bindTestService();
@@ -277,6 +279,8 @@
         assertTrue(changed.await(3, TimeUnit.SECONDS));
     }
 
+    // TODO(186405912): broken test
+    @Ignore
     @Test
     public void invalidateAnotherProcess() throws Exception {
         bindTestService();
diff --git a/room/ktx/lint-baseline.xml b/room/ktx/lint-baseline.xml
index ec57c82..3a6ad8b 100644
--- a/room/ktx/lint-baseline.xml
+++ b/room/ktx/lint-baseline.xml
@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.room.CoroutinesRoom is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.room.CoroutinesRoom is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        cancellationSignal.cancel()"
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/androidx/room/CoroutinesRoom.kt"
-            line="91"
+            line="93"
             column="44"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.room.CoroutinesRoom.Companion is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.room.CoroutinesRoom.Companion is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        cancellationSignal.cancel()"
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/androidx/room/CoroutinesRoom.kt"
-            line="91"
+            line="93"
             column="44"/>
     </issue>
 
diff --git a/room/migration/api/restricted_current.txt b/room/migration/api/restricted_current.txt
index 436687e..d4f4fff 100644
--- a/room/migration/api/restricted_current.txt
+++ b/room/migration/api/restricted_current.txt
@@ -96,7 +96,7 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SchemaBundle {
     ctor public SchemaBundle(int, androidx.room.migration.bundle.DatabaseBundle!);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.room.migration.bundle.SchemaBundle! deserialize(java.io.InputStream!) throws java.io.UnsupportedEncodingException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.room.migration.bundle.SchemaBundle deserialize(java.io.InputStream!) throws java.io.UnsupportedEncodingException;
     method public androidx.room.migration.bundle.DatabaseBundle! getDatabase();
     method public int getFormatVersion();
     method public boolean isSchemaEqual(androidx.room.migration.bundle.SchemaBundle!);
diff --git a/room/migration/lint-baseline.xml b/room/migration/lint-baseline.xml
index dd34c17..5ee09e3 100644
--- a/room/migration/lint-baseline.xml
+++ b/room/migration/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -866,7 +866,7 @@
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="43"
+            line="44"
             column="24"/>
     </issue>
 
@@ -877,7 +877,7 @@
         errorLine2="                                                    ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="43"
+            line="44"
             column="53"/>
     </issue>
 
@@ -888,7 +888,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="44"
+            line="45"
             column="13"/>
     </issue>
 
@@ -899,7 +899,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="51"
+            line="52"
             column="12"/>
     </issue>
 
@@ -910,41 +910,41 @@
         errorLine2="           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="59"
+            line="60"
             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 String create(String tableName) {"
+        errorLine1="    public String getCreateSql(String tableName) {"
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="67"
+            line="68"
             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 String create(String tableName) {"
-        errorLine2="                         ~~~~~~">
+        errorLine1="    public String getCreateSql(String tableName) {"
+        errorLine2="                               ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="67"
-            column="26"/>
+            line="68"
+            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 boolean isSchemaEqual(IndexBundle other) {"
-        errorLine2="                                 ~~~~~~~~~~~">
+        errorLine1="    public String create(@NonNull String tableName) {"
+        errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/room/migration/bundle/IndexBundle.java"
-            line="72"
-            column="34"/>
+            line="76"
+            column="12"/>
     </issue>
 
     <issue
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
index beb2c5e..9a28299 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/SchemaBundle.java
@@ -16,6 +16,7 @@
 
 package androidx.room.migration.bundle;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
 import com.google.gson.Gson;
@@ -80,12 +81,17 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static SchemaBundle deserialize(InputStream fis)
             throws UnsupportedEncodingException {
         InputStreamReader is = new InputStreamReader(fis, CHARSET);
         try {
-            return GSON.fromJson(is, SchemaBundle.class);
+            SchemaBundle result = GSON.fromJson(is, SchemaBundle.class);
+            if (result == null || result.getDatabase() == null) {
+                throw new IllegalStateException("Invalid schema file");
+            }
+            return result;
         } finally {
             safeClose(is);
             safeClose(fis);
diff --git a/room/runtime/api/current.txt b/room/runtime/api/current.txt
index 003bb27..50f212f 100644
--- a/room/runtime/api/current.txt
+++ b/room/runtime/api/current.txt
@@ -6,6 +6,7 @@
     method @Deprecated public boolean isMigrationRequiredFrom(int);
     field public final boolean allowDestructiveMigrationOnDowngrade;
     field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec!> autoMigrationSpecs;
     field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
     field public final android.content.Context context;
     field public final String? copyFromAssetPath;
@@ -71,6 +72,7 @@
   }
 
   public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T!> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec);
     method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
     method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
     method public androidx.room.RoomDatabase.Builder<T!> addTypeConverter(Object);
@@ -127,6 +129,10 @@
 
 package androidx.room.migration {
 
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
   public abstract class Migration {
     ctor public Migration(int, int);
     method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
diff --git a/room/runtime/api/public_plus_experimental_current.txt b/room/runtime/api/public_plus_experimental_current.txt
index fc91b21..758a9f6 100644
--- a/room/runtime/api/public_plus_experimental_current.txt
+++ b/room/runtime/api/public_plus_experimental_current.txt
@@ -6,6 +6,7 @@
     method @Deprecated public boolean isMigrationRequiredFrom(int);
     field public final boolean allowDestructiveMigrationOnDowngrade;
     field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec!> autoMigrationSpecs;
     field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
     field public final android.content.Context context;
     field public final String? copyFromAssetPath;
@@ -75,6 +76,7 @@
   }
 
   public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T!> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec);
     method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
     method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
     method public androidx.room.RoomDatabase.Builder<T!> addTypeConverter(Object);
@@ -132,6 +134,10 @@
 
 package androidx.room.migration {
 
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
   public abstract class Migration {
     ctor public Migration(int, int);
     method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
diff --git a/room/runtime/api/restricted_current.txt b/room/runtime/api/restricted_current.txt
index 7f8f611..14c301a 100644
--- a/room/runtime/api/restricted_current.txt
+++ b/room/runtime/api/restricted_current.txt
@@ -7,11 +7,13 @@
     ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?);
     ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?, java.util.concurrent.Callable<java.io.InputStream!>?);
     ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?, java.util.concurrent.Callable<java.io.InputStream!>?, androidx.room.RoomDatabase.PrepackagedDatabaseCallback?);
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?, java.util.concurrent.Callable<java.io.InputStream!>?, androidx.room.RoomDatabase.PrepackagedDatabaseCallback?, java.util.List<java.lang.Object!>?);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?, java.util.concurrent.Callable<java.io.InputStream!>?, androidx.room.RoomDatabase.PrepackagedDatabaseCallback?, java.util.List<java.lang.Object!>?);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?, java.util.concurrent.Callable<java.io.InputStream!>?, androidx.room.RoomDatabase.PrepackagedDatabaseCallback?, java.util.List<java.lang.Object!>?, java.util.List<androidx.room.migration.AutoMigrationSpec!>?);
     method public boolean isMigrationRequired(int, int);
     method @Deprecated public boolean isMigrationRequiredFrom(int);
     field public final boolean allowDestructiveMigrationOnDowngrade;
     field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec!> autoMigrationSpecs;
     field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
     field public final android.content.Context context;
     field public final String? copyFromAssetPath;
@@ -114,6 +116,7 @@
   }
 
   public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T!> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec);
     method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
     method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
     method public androidx.room.RoomDatabase.Builder<T!> addTypeConverter(Object);
@@ -221,6 +224,10 @@
 
 package androidx.room.migration {
 
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
   public abstract class Migration {
     ctor public Migration(int, int);
     method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
diff --git a/room/runtime/build.gradle b/room/runtime/build.gradle
index 53f0fc8..6985986 100644
--- a/room/runtime/build.gradle
+++ b/room/runtime/build.gradle
@@ -58,8 +58,8 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(KOTLIN_STDLIB)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-truth")) // for assertThrows
     androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
 
@@ -73,7 +73,7 @@
     project.tasks.create(name: "jar${suffix}", type: Jar){
         dependsOn(variant.javaCompileProvider.get())
         from(variant.javaCompileProvider.get().destinationDir)
-        destinationDir(new File(project.buildDir, "libJar"))
+        destinationDirectory.fileValue(new File(project.buildDir, "libJar"))
     }
 }
 
diff --git a/room/runtime/lint-baseline.xml b/room/runtime/lint-baseline.xml
index 2a629e8..11ef36b 100644
--- a/room/runtime/lint-baseline.xml
+++ b/room/runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -57,6 +57,72 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.room.AutoClosingRoomOpenHelper.KeepAliveCursor is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mDelegate.setNotificationUris(cr, uris);"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.java"
+            line="706"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.room.AutoClosingRoomOpenHelper.KeepAliveCursor is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mDelegate.getNotificationUri();"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.java"
+            line="713"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.room.AutoClosingRoomOpenHelper.KeepAliveCursor is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return mDelegate.getNotificationUris();"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.java"
+            line="721"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.room.AutoClosingRoomOpenHelper.KeepAliveCursor is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            mDelegate.setExtras(extras);"
+        errorLine2="                      ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/AutoClosingRoomOpenHelper.java"
+            line="733"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.room.util.DBUtil is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            return new CancellationSignal();"
+        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/util/DBUtil.java"
+            line="168"
+            column="20"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.room.RoomDatabase.JournalMode is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                return activityManager.isLowRamDevice();"
+        errorLine2="                                       ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/room/RoomDatabase.java"
+            line="782"
+            column="40"/>
+    </issue>
+
+    <issue
         id="PrivateConstructorForUtilityClass"
         message="Utility class with non private constructor"
         errorLine1="public class Room {"
@@ -68,35 +134,13 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.room.util.DBUtil is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="            return new CancellationSignal();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/util/DBUtil.java"
-            line="168"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.room.RoomDatabase.JournalMode is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                return activityManager.isLowRamDevice();"
-        errorLine2="                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/RoomDatabase.java"
-            line="673"
-            column="40"/>
-    </issue>
-
-    <issue
         id="LambdaLast"
         message="Functional interface parameters (such as parameter 3, &quot;sqliteOpenHelperFactory&quot;, in androidx.room.DatabaseConfiguration.DatabaseConfiguration) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
         errorLine1="            @Nullable Set&lt;Integer> migrationNotRequiredFrom) {"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="170"
+            line="173"
             column="13"/>
     </issue>
 
@@ -107,7 +151,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="215"
+            line="219"
             column="13"/>
     </issue>
 
@@ -118,7 +162,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="265"
+            line="269"
             column="13"/>
     </issue>
 
@@ -162,7 +206,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="167"
+            line="170"
             column="13"/>
     </issue>
 
@@ -173,7 +217,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="209"
+            line="213"
             column="13"/>
     </issue>
 
@@ -184,7 +228,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/DatabaseConfiguration.java"
-            line="257"
+            line="261"
             column="13"/>
     </issue>
 
@@ -657,7 +701,7 @@
         errorLine2="                                            ~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="527"
+            line="523"
             column="45"/>
     </issue>
 
@@ -668,7 +712,7 @@
         errorLine2="               ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="616"
+            line="612"
             column="16"/>
     </issue>
 
@@ -679,7 +723,7 @@
         errorLine2="                                          ~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="616"
+            line="612"
             column="43"/>
     </issue>
 
@@ -690,7 +734,7 @@
         errorLine2="                                                               ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="616"
+            line="612"
             column="64"/>
     </issue>
 
@@ -701,7 +745,7 @@
         errorLine2="               ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="636"
+            line="632"
             column="16"/>
     </issue>
 
@@ -712,7 +756,7 @@
         errorLine2="                                          ~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="636"
+            line="632"
             column="43"/>
     </issue>
 
@@ -723,7 +767,7 @@
         errorLine2="            ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="637"
+            line="633"
             column="13"/>
     </issue>
 
@@ -734,101 +778,13 @@
         errorLine2="                                                       ~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/InvalidationTracker.java"
-            line="745"
+            line="741"
             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="    protected LimitOffsetDataSource(RoomDatabase db, SupportSQLiteQuery query,"
-        errorLine2="                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="56"
-            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 LimitOffsetDataSource(RoomDatabase db, SupportSQLiteQuery query,"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="56"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 inTransaction, String... tables) {"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="57"
-            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 LimitOffsetDataSource(RoomDatabase db, RoomSQLiteQuery query,"
-        errorLine2="                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="61"
-            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 LimitOffsetDataSource(RoomDatabase db, RoomSQLiteQuery query,"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="61"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 inTransaction, String... tables) {"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="62"
-            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 abstract List&lt;T> convertRows(Cursor cursor);"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="106"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 abstract List&lt;T> convertRows(Cursor cursor);"
-        errorLine2="                                           ~~~~~~">
-        <location
-            file="src/main/java/androidx/room/paging/LimitOffsetDataSource.java"
-            line="106"
-            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 IBinder onBind(Intent intent) {"
         errorLine2="                          ~~~~~~">
         <location
@@ -844,7 +800,7 @@
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/RoomDatabase.java"
-            line="86"
+            line="87"
             column="24"/>
     </issue>
 
@@ -855,7 +811,7 @@
         errorLine2="                                                                ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/RoomDatabase.java"
-            line="298"
+            line="392"
             column="65"/>
     </issue>
 
@@ -866,7 +822,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/RoomDatabase.java"
-            line="456"
+            line="565"
             column="12"/>
     </issue>
 
@@ -877,7 +833,7 @@
         errorLine2="               ~">
         <location
             file="src/main/java/androidx/room/RoomDatabase.java"
-            line="574"
+            line="683"
             column="16"/>
     </issue>
 
@@ -888,7 +844,7 @@
         errorLine2="                                                             ~~~~~~">
         <location
             file="src/main/java/androidx/room/RoomDatabase.java"
-            line="1142"
+            line="1269"
             column="62"/>
     </issue>
 
@@ -1306,7 +1262,7 @@
         errorLine2="                      ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="390"
+            line="391"
             column="23"/>
     </issue>
 
@@ -1317,7 +1273,7 @@
         errorLine2="                                   ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="390"
+            line="391"
             column="36"/>
     </issue>
 
@@ -1328,7 +1284,7 @@
         errorLine2="                      ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="395"
+            line="396"
             column="23"/>
     </issue>
 
@@ -1339,7 +1295,7 @@
         errorLine2="                                   ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="395"
+            line="396"
             column="36"/>
     </issue>
 
@@ -1350,7 +1306,7 @@
         errorLine2="                ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="396"
+            line="397"
             column="17"/>
     </issue>
 
@@ -1361,7 +1317,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="618"
+            line="672"
             column="22"/>
     </issue>
 
@@ -1372,7 +1328,7 @@
         errorLine2="                                                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/util/TableInfo.java"
-            line="618"
+            line="672"
             column="51"/>
     </issue>
 
diff --git a/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java b/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
index d19c0cb..1861836 100644
--- a/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
+++ b/room/runtime/src/main/java/androidx/room/DatabaseConfiguration.java
@@ -22,6 +22,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.room.migration.AutoMigrationSpec;
 import androidx.sqlite.db.SupportSQLiteOpenHelper;
 
 import java.io.File;
@@ -69,6 +70,9 @@
     @NonNull
     public final List<Object> typeConverters;
 
+    @NonNull
+    public final List<AutoMigrationSpec> autoMigrationSpecs;
+
     /**
      * Whether Room should throw an exception for queries run on the main thread.
      */
@@ -133,14 +137,13 @@
     @Nullable
     public final Callable<InputStream> copyFromInputStream;
 
-
     /**
      * Creates a database configuration with the given values.
      *
      * @deprecated Use {@link #DatabaseConfiguration(Context, String,
      * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
      * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
-     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>)}
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
      *
      * @param context The application context.
      * @param name Name of the database, can be null if it is in memory.
@@ -170,7 +173,8 @@
             @Nullable Set<Integer> migrationNotRequiredFrom) {
         this(context, name, sqliteOpenHelperFactory, migrationContainer, callbacks,
                 allowMainThreadQueries, journalMode, queryExecutor, queryExecutor, false,
-                requireMigration, false, migrationNotRequiredFrom, null, null, null, null, null);
+                requireMigration, false, migrationNotRequiredFrom, null, null, null, null, null,
+                null);
     }
 
     /**
@@ -179,7 +183,7 @@
      * @deprecated Use {@link #DatabaseConfiguration(Context, String,
      * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
      * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
-     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>)}
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
      *
      * @param context The application context.
      * @param name Name of the database, can be null if it is in memory.
@@ -216,7 +220,7 @@
         this(context, name, sqliteOpenHelperFactory, migrationContainer, callbacks,
                 allowMainThreadQueries, journalMode, queryExecutor, transactionExecutor,
                 multiInstanceInvalidation, requireMigration, allowDestructiveMigrationOnDowngrade,
-                migrationNotRequiredFrom, null, null, null, null, null);
+                migrationNotRequiredFrom, null, null, null, null, null, null);
     }
 
     /**
@@ -225,7 +229,7 @@
      * @deprecated Use {@link #DatabaseConfiguration(Context, String,
      * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
      * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
-     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>)}
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
      *
      * @param context The application context.
      * @param name Name of the database, can be null if it is in memory.
@@ -266,7 +270,7 @@
         this(context, name, sqliteOpenHelperFactory, migrationContainer, callbacks,
                 allowMainThreadQueries, journalMode, queryExecutor, transactionExecutor,
                 multiInstanceInvalidation, requireMigration, allowDestructiveMigrationOnDowngrade,
-                migrationNotRequiredFrom, copyFromAssetPath, copyFromFile, null, null, null);
+                migrationNotRequiredFrom, copyFromAssetPath, copyFromFile, null, null, null, null);
     }
 
     /**
@@ -275,7 +279,7 @@
      * @deprecated Use {@link #DatabaseConfiguration(Context, String,
      * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
      * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
-     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>)}
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
      *
      * @param context The application context.
      * @param name Name of the database, can be null if it is in memory.
@@ -320,16 +324,16 @@
                 allowMainThreadQueries, journalMode, queryExecutor, transactionExecutor,
                 multiInstanceInvalidation, requireMigration, allowDestructiveMigrationOnDowngrade,
                 migrationNotRequiredFrom, copyFromAssetPath, copyFromFile, copyFromInputStream,
-                null, null);
+                null, null, null);
     }
 
-     /**
-      * Creates a database configuration with the given values.
-      *
-      * @deprecated Use {@link #DatabaseConfiguration(Context, String,
+    /**
+     * Creates a database configuration with the given values.
+     *
+     * @deprecated Use {@link #DatabaseConfiguration(Context, String,
      * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
      * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
-     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>)}
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
      *
      * @param context The application context.
      * @param name Name of the database, can be null if it is in memory.
@@ -377,7 +381,66 @@
                 allowMainThreadQueries, journalMode, queryExecutor, transactionExecutor,
                 multiInstanceInvalidation, requireMigration, allowDestructiveMigrationOnDowngrade,
                 migrationNotRequiredFrom, copyFromAssetPath, copyFromFile, copyFromInputStream,
-                prepackagedDatabaseCallback, null);
+                prepackagedDatabaseCallback, null, null);
+    }
+
+    /**
+     * Creates a database configuration with the given values.
+     *
+     * @deprecated Use {@link #DatabaseConfiguration(Context, String,
+     * SupportSQLiteOpenHelper.Factory, RoomDatabase.MigrationContainer, List, boolean,
+     * RoomDatabase.JournalMode, Executor, Executor, boolean, boolean, boolean, Set, String, File,
+     * Callable, RoomDatabase.PrepackagedDatabaseCallback, List<Object>, List<AutoMigrationSpec>)}
+     *
+     * @param context The application context.
+     * @param name Name of the database, can be null if it is in memory.
+     * @param sqliteOpenHelperFactory The open helper factory to use.
+     * @param migrationContainer The migration container for migrations.
+     * @param callbacks The list of callbacks for database events.
+     * @param allowMainThreadQueries Whether to allow main thread reads/writes or not.
+     * @param journalMode The journal mode. This has to be either TRUNCATE or WRITE_AHEAD_LOGGING.
+     * @param queryExecutor The Executor used to execute asynchronous queries.
+     * @param transactionExecutor The Executor used to execute asynchronous transactions.
+     * @param multiInstanceInvalidation True if Room should perform multi-instance invalidation.
+     * @param requireMigration True if Room should require a valid migration if version changes,
+     * @param allowDestructiveMigrationOnDowngrade True if Room should recreate tables if no
+     *                                             migration is supplied during a downgrade.
+     * @param migrationNotRequiredFrom The collection of schema versions from which migrations
+     *                                 aren't required.
+     * @param copyFromAssetPath The assets path to the pre-packaged database.
+     * @param copyFromFile The pre-packaged database file.
+     * @param copyFromInputStream The callable to get the input stream from which a
+     *                            pre-package database file will be copied from.
+     * @param prepackagedDatabaseCallback The pre-packaged callback.
+     * @param typeConverters The type converters.
+     *
+     * @hide
+     */
+    @Deprecated
+    @SuppressLint("LambdaLast")
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+    public DatabaseConfiguration(@NonNull Context context, @Nullable String name,
+            @NonNull SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory,
+            @NonNull RoomDatabase.MigrationContainer migrationContainer,
+            @Nullable List<RoomDatabase.Callback> callbacks,
+            boolean allowMainThreadQueries,
+            @NonNull RoomDatabase.JournalMode journalMode,
+            @NonNull Executor queryExecutor,
+            @NonNull Executor transactionExecutor,
+            boolean multiInstanceInvalidation,
+            boolean requireMigration,
+            boolean allowDestructiveMigrationOnDowngrade,
+            @Nullable Set<Integer> migrationNotRequiredFrom,
+            @Nullable String copyFromAssetPath,
+            @Nullable File copyFromFile,
+            @Nullable Callable<InputStream> copyFromInputStream,
+            @Nullable RoomDatabase.PrepackagedDatabaseCallback prepackagedDatabaseCallback,
+            @Nullable List<Object> typeConverters) {
+        this(context, name, sqliteOpenHelperFactory, migrationContainer, callbacks,
+                allowMainThreadQueries, journalMode, queryExecutor, transactionExecutor,
+                multiInstanceInvalidation, requireMigration, allowDestructiveMigrationOnDowngrade,
+                migrationNotRequiredFrom, copyFromAssetPath, copyFromFile, copyFromInputStream,
+                prepackagedDatabaseCallback, typeConverters, null);
     }
 
     /**
@@ -404,6 +467,7 @@
      *                            pre-package database file will be copied from.
      * @param prepackagedDatabaseCallback The pre-packaged callback.
      * @param typeConverters The type converters.
+     * @param autoMigrationSpecs The auto migration specs.
      *
      * @hide
      */
@@ -425,7 +489,8 @@
             @Nullable File copyFromFile,
             @Nullable Callable<InputStream> copyFromInputStream,
             @Nullable RoomDatabase.PrepackagedDatabaseCallback prepackagedDatabaseCallback,
-            @Nullable List<Object> typeConverters) {
+            @Nullable List<Object> typeConverters,
+            @Nullable List<AutoMigrationSpec> autoMigrationSpecs) {
         this.sqliteOpenHelperFactory = sqliteOpenHelperFactory;
         this.context = context;
         this.name = name;
@@ -444,6 +509,8 @@
         this.copyFromInputStream = copyFromInputStream;
         this.prepackagedDatabaseCallback = prepackagedDatabaseCallback;
         this.typeConverters = typeConverters == null ? Collections.emptyList() : typeConverters;
+        this.autoMigrationSpecs = autoMigrationSpecs == null
+                ? Collections.emptyList() : autoMigrationSpecs;
     }
 
     /**
diff --git a/room/runtime/src/main/java/androidx/room/InvalidationTracker.java b/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
index 7dda1da..de59d64 100644
--- a/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
+++ b/room/runtime/src/main/java/androidx/room/InvalidationTracker.java
@@ -422,19 +422,15 @@
                     return;
                 }
 
-                if (mDatabase.mWriteAheadLoggingEnabled) {
-                    // This transaction has to be on the underlying DB rather than the RoomDatabase
-                    // in order to avoid a recursive loop after endTransaction.
-                    SupportSQLiteDatabase db = mDatabase.getOpenHelper().getWritableDatabase();
-                    db.beginTransactionNonExclusive();
-                    try {
-                        invalidatedTableIds = checkUpdatedTable();
-                        db.setTransactionSuccessful();
-                    } finally {
-                        db.endTransaction();
-                    }
-                } else {
+                // This transaction has to be on the underlying DB rather than the RoomDatabase
+                // in order to avoid a recursive loop after endTransaction.
+                SupportSQLiteDatabase db = mDatabase.getOpenHelper().getWritableDatabase();
+                db.beginTransactionNonExclusive();
+                try {
                     invalidatedTableIds = checkUpdatedTable();
+                    db.setTransactionSuccessful();
+                } finally {
+                    db.endTransaction();
                 }
             } catch (IllegalStateException | SQLiteException exception) {
                 // may happen if db is closed. just log.
diff --git a/room/runtime/src/main/java/androidx/room/RoomDatabase.java b/room/runtime/src/main/java/androidx/room/RoomDatabase.java
index cd187e2..3c79716 100644
--- a/room/runtime/src/main/java/androidx/room/RoomDatabase.java
+++ b/room/runtime/src/main/java/androidx/room/RoomDatabase.java
@@ -33,6 +33,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.WorkerThread;
 import androidx.arch.core.executor.ArchTaskExecutor;
+import androidx.room.migration.AutoMigrationSpec;
 import androidx.room.migration.Migration;
 import androidx.room.util.SneakyThrow;
 import androidx.sqlite.db.SimpleSQLiteQuery;
@@ -45,7 +46,6 @@
 import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
@@ -100,6 +100,15 @@
     @Deprecated
     protected List<Callback> mCallbacks;
 
+    /**
+     * A map of auto migration spec classes to their provided instance.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @NonNull
+    protected Map<Class<? extends AutoMigrationSpec>, AutoMigrationSpec> mAutoMigrationSpecs;
+
     private final ReentrantReadWriteLock mCloseLock = new ReentrantReadWriteLock();
 
     @Nullable
@@ -151,7 +160,6 @@
     // Updated later to an unmodifiable map when init is called.
     private final Map<Class<?>, Object> mTypeConverters;
 
-
     /**
      * Gets the instance of the given Type Converter.
      *
@@ -175,6 +183,7 @@
     public RoomDatabase() {
         mInvalidationTracker = createInvalidationTracker();
         mTypeConverters = new HashMap<>();
+        mAutoMigrationSpecs = new HashMap<>();
     }
 
     /**
@@ -185,12 +194,45 @@
     @CallSuper
     public void init(@NonNull DatabaseConfiguration configuration) {
         mOpenHelper = createOpenHelper(configuration);
+        Set<Class<? extends AutoMigrationSpec>> requiredAutoMigrationSpecs =
+                getRequiredAutoMigrationSpecs();
+        BitSet usedSpecs = new BitSet();
+        for (Class<? extends AutoMigrationSpec> spec : requiredAutoMigrationSpecs) {
+            int foundIndex = -1;
+            for (int providedIndex = configuration.autoMigrationSpecs.size() - 1;
+                    providedIndex >= 0; providedIndex--
+            ) {
+                Object provided = configuration.autoMigrationSpecs.get(providedIndex);
+                if (spec.isAssignableFrom(provided.getClass())) {
+                    foundIndex = providedIndex;
+                    usedSpecs.set(foundIndex);
+                    break;
+                }
+            }
+            if (foundIndex < 0) {
+                throw new IllegalArgumentException(
+                        "A required auto migration spec (" + spec.getCanonicalName()
+                                + ") is missing in the database configuration.");
+            }
+            mAutoMigrationSpecs.put(spec, configuration.autoMigrationSpecs.get(foundIndex));
+        }
+
+        for (int providedIndex = configuration.autoMigrationSpecs.size() - 1;
+                providedIndex >= 0; providedIndex--) {
+            if (!usedSpecs.get(providedIndex)) {
+                throw new IllegalArgumentException("Unexpected auto migration specs found. "
+                        + "Annotate AutoMigrationSpec implementation with "
+                        + "@ProvidedAutoMigrationSpec annotation or remove this spec from the "
+                        + "builder.");
+            }
+        }
+
         List<Migration> autoMigrations = getAutoMigrations();
         for (Migration autoMigration : autoMigrations) {
             boolean migrationExists = configuration.migrationContainer.getMigrations()
                             .containsKey(autoMigration.startVersion);
             if (!migrationExists) {
-                configuration.migrationContainer.addMigrations(autoMigrations);
+                configuration.migrationContainer.addMigrations(autoMigration);
             }
         }
 
@@ -265,7 +307,6 @@
         }
     }
 
-
     /**
      * Returns a list of {@link Migration} of a database that have been automatically generated.
      *
@@ -273,7 +314,7 @@
      */
     @NonNull
     protected List<Migration> getAutoMigrations() {
-        return Arrays.asList();
+        return Collections.emptyList();
     }
 
     /**
@@ -376,6 +417,21 @@
     }
 
     /**
+     * Returns a Set of required AutoMigrationSpec classes.
+     * <p>
+     * This is implemented by the generated code.
+     *
+     * @return Creates a set that will include all required auto migration specs for this database.
+     *
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    protected Set<Class<? extends AutoMigrationSpec>> getRequiredAutoMigrationSpecs() {
+        return Collections.emptySet();
+    }
+
+    /**
      * Deletes all rows from all the tables that are registered to this database as
      * {@link Database#entities()}.
      * <p>
@@ -743,6 +799,7 @@
         private QueryCallback mQueryCallback;
         private Executor mQueryCallbackExecutor;
         private List<Object> mTypeConverters;
+        private List<AutoMigrationSpec> mAutoMigrationSpecs;
 
         /** The Executor used to run database queries. This should be background-threaded. */
         private Executor mQueryExecutor;
@@ -1015,6 +1072,23 @@
         }
 
         /**
+         * Adds an auto migration spec to the builder.
+         *
+         * @param autoMigrationSpec The auto migration object that is annotated with
+         * {@link AutoMigrationSpec} and is declared in an {@link AutoMigration} annotation.
+         * @return This {@link Builder} instance.
+         */
+        @NonNull
+        @SuppressWarnings("MissingGetterMatchingBuilder")
+        public Builder<T> addAutoMigrationSpec(@NonNull AutoMigrationSpec autoMigrationSpec) {
+            if (mAutoMigrationSpecs == null) {
+                mAutoMigrationSpecs = new ArrayList<>();
+            }
+            mAutoMigrationSpecs.add(autoMigrationSpec);
+            return this;
+        }
+
+        /**
          * Disables the main thread query check for Room.
          * <p>
          * Room ensures that Database is never accessed on the main thread because it may lock the
@@ -1407,7 +1481,8 @@
                             mCopyFromFile,
                             mCopyFromInputStream,
                             mPrepackagedDatabaseCallback,
-                            mTypeConverters);
+                            mTypeConverters,
+                            mAutoMigrationSpecs);
             T db = Room.getGeneratedImplementation(mDatabaseClass, DB_IMPL_SUFFIX);
             db.init(configuration);
             return db;
@@ -1433,6 +1508,12 @@
             }
         }
 
+        /**
+         * Adds the given migrations to the list of available migrations. If 2 migrations have the
+         * same start-end versions, the latter migration overrides the previous one.
+         *
+         * @param migrations List of available migrations.
+         */
         public void addMigrations(@NonNull List<Migration> migrations) {
             for (Migration migration : migrations) {
                 addMigration(migration);
diff --git a/room/runtime/src/main/java/androidx/room/migration/AutoMigrationCallback.java b/room/runtime/src/main/java/androidx/room/migration/AutoMigrationCallback.java
deleted file mode 100644
index f1a04f9..0000000
--- a/room/runtime/src/main/java/androidx/room/migration/AutoMigrationCallback.java
+++ /dev/null
@@ -1,36 +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.room.migration;
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.sqlite.db.SupportSQLiteDatabase;
-
-/**
- * Interface for defining automatic migration strategy for Room databases.
- *
- * @hide
- */
-// TODO: (b/181655460) Complete code usage documentation for this class and the AutoMigration
-//  annotation.
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public interface AutoMigrationCallback {
-
-    /**
-     * Handles any changes the user may want to implement after migration is completed.
-     */
-    default void onPostMigrate(@NonNull SupportSQLiteDatabase db) {}
-}
diff --git a/room/runtime/src/main/java/androidx/room/migration/AutoMigrationSpec.java b/room/runtime/src/main/java/androidx/room/migration/AutoMigrationSpec.java
new file mode 100644
index 0000000..1eea189
--- /dev/null
+++ b/room/runtime/src/main/java/androidx/room/migration/AutoMigrationSpec.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.room.migration;
+import androidx.annotation.NonNull;
+import androidx.room.AutoMigration;
+import androidx.sqlite.db.SupportSQLiteDatabase;
+
+/**
+ * Interface for defining an automatic migration specification for Room databases.
+ * <p>
+ * The methods defined in this interface will be called on a background thread from the executor
+ * set in Room's builder. It is important to note that the methods are all in a transaction when
+ * it is called.
+ *
+ * @see AutoMigration
+ */
+public interface AutoMigrationSpec {
+
+    /**
+     * Invoked after the migration is completed.
+     * @param db The SQLite database.
+     */
+    default void onPostMigrate(@NonNull SupportSQLiteDatabase db) {}
+}
diff --git a/room/rxjava2/lint-baseline.xml b/room/rxjava2/lint-baseline.xml
index 18e25fc..9eaac4a 100644
--- a/room/rxjava2/lint-baseline.xml
+++ b/room/rxjava2/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="PrivateConstructorForUtilityClass"
diff --git a/room/rxjava3/lint-baseline.xml b/room/rxjava3/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/room/rxjava3/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/room/testing/lint-baseline.xml b/room/testing/lint-baseline.xml
index a2b25c6..c419600 100644
--- a/room/testing/lint-baseline.xml
+++ b/room/testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -96,7 +96,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="206"
+            line="207"
             column="12"/>
     </issue>
 
@@ -107,7 +107,7 @@
         errorLine2="                                                          ~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="206"
+            line="207"
             column="59"/>
     </issue>
 
@@ -118,7 +118,7 @@
         errorLine2="                                           ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="207"
+            line="208"
             column="44"/>
     </issue>
 
@@ -129,7 +129,7 @@
         errorLine2="                            ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="258"
+            line="260"
             column="29"/>
     </issue>
 
@@ -140,7 +140,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="285"
+            line="287"
             column="35"/>
     </issue>
 
@@ -151,7 +151,7 @@
         errorLine2="                                  ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/room/testing/MigrationTestHelper.java"
-            line="302"
+            line="304"
             column="35"/>
     </issue>
 
diff --git a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
index fcb1b87..c846037 100644
--- a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
@@ -169,6 +169,7 @@
                 null,
                 null,
                 null,
+                null,
                 null);
         RoomOpenHelper roomOpenHelper = new RoomOpenHelper(configuration,
                 new CreatingDelegate(schemaBundle.getDatabase()),
@@ -232,6 +233,7 @@
                 null,
                 null,
                 null,
+                null,
                 null);
         RoomOpenHelper roomOpenHelper = new RoomOpenHelper(configuration,
                 new MigratingDelegate(schemaBundle.getDatabase(), validateDroppedTables),
diff --git a/samples/Support4Demos/lint-baseline.xml b/samples/Support4Demos/lint-baseline.xml
index 9d520d6..fb0dc9c 100644
--- a/samples/Support4Demos/lint-baseline.xml
+++ b/samples/Support4Demos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="WifiManagerLeak"
@@ -68,6 +68,72 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv4.media.MediaNotificationManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                notificationManager.createNotificationChannel("
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
+            line="117"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv4.media.MediaNotificationManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        new NotificationChannel(NOTIFICATION_CHANNEL_ID, TAG,"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
+            line="118"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv4.media.MediaNotificationManager is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                notificationManager.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
+            line="161"
+            column="37"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class com.example.android.supportv4.widget.SlidingPaneLayoutActivity.FirstLayoutListener is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
+            line="205"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.supportv4.view.WindowInsetsPlayground is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            getWindow().setStatusBarColor(0x80000000);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/view/WindowInsetsPlayground.java"
+            line="72"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.supportv4.view.WindowInsetsPlayground is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            getWindow().setNavigationBarColor(0x80000000);"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/view/WindowInsetsPlayground.java"
+            line="73"
+            column="25"/>
+    </issue>
+
+    <issue
         id="MetadataTagInsideApplicationTag"
         message="Detected &lt;application>-level meta-data tag."
         errorLine1="        &lt;meta-data android:name=&quot;com.google.android.gms.car.notification.SmallIcon&quot;"
@@ -90,72 +156,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv4.media.MediaNotificationManager is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                notificationManager.createNotificationChannel("
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="117"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv4.media.MediaNotificationManager is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        new NotificationChannel(NOTIFICATION_CHANNEL_ID, TAG,"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="118"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv4.media.MediaNotificationManager is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                notificationManager.deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="161"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class com.example.android.supportv4.widget.SlidingPaneLayoutActivity.FirstLayoutListener is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
-        errorLine1="                mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="150"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.supportv4.view.WindowInsetsPlayground is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            getWindow().setStatusBarColor(0x80000000);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/view/WindowInsetsPlayground.java"
-            line="72"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.supportv4.view.WindowInsetsPlayground is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="            getWindow().setNavigationBarColor(0x80000000);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/view/WindowInsetsPlayground.java"
-            line="73"
-            column="25"/>
-    </issue>
-
-    <issue
         id="ObsoleteSdkInt"
         message="This folder configuration (`v11`) is unnecessary; `minSdkVersion` is 14. Merge all the resources in this folder into `values`.">
         <location
@@ -503,7 +503,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="138"
+            line="139"
             column="56"/>
     </issue>
 
@@ -514,7 +514,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="140"
+            line="141"
             column="17"/>
     </issue>
 
@@ -525,7 +525,7 @@
         errorLine2="                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="144"
+            line="145"
             column="21"/>
     </issue>
 
@@ -536,7 +536,7 @@
         errorLine2="                ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="147"
+            line="148"
             column="17"/>
     </issue>
 
@@ -547,7 +547,7 @@
         errorLine2="                           ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="148"
+            line="149"
             column="28"/>
     </issue>
 
@@ -558,7 +558,7 @@
         errorLine2="                ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="148"
+            line="149"
             column="17"/>
     </issue>
 
@@ -569,7 +569,7 @@
         errorLine2="                ~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="151"
+            line="152"
             column="17"/>
     </issue>
 
@@ -580,7 +580,7 @@
         errorLine2="                ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="152"
+            line="153"
             column="17"/>
     </issue>
 
@@ -591,7 +591,7 @@
         errorLine2="                                                    ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="191"
+            line="192"
             column="53"/>
     </issue>
 
@@ -602,7 +602,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="212"
+            line="213"
             column="21"/>
     </issue>
 
@@ -613,7 +613,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="213"
+            line="214"
             column="21"/>
     </issue>
 
@@ -624,7 +624,7 @@
         errorLine2="                              ~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="214"
+            line="215"
             column="31"/>
     </issue>
 
@@ -635,7 +635,7 @@
         errorLine2="                    ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="214"
+            line="215"
             column="21"/>
     </issue>
 
@@ -2164,7 +2164,7 @@
         errorLine2="            ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="233"
+            line="234"
             column="13"/>
     </issue>
 
@@ -2175,7 +2175,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="235"
+            line="236"
             column="41"/>
     </issue>
 
@@ -2186,7 +2186,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="237"
+            line="238"
             column="17"/>
     </issue>
 
@@ -2197,7 +2197,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="245"
+            line="246"
             column="13"/>
     </issue>
 
@@ -2208,7 +2208,7 @@
         errorLine2="                    ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="358"
+            line="360"
             column="21"/>
     </issue>
 
@@ -2219,7 +2219,7 @@
         errorLine2="                                         ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="358"
+            line="360"
             column="42"/>
     </issue>
 
@@ -2230,7 +2230,7 @@
         errorLine2="                                  ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="359"
+            line="361"
             column="35"/>
     </issue>
 
@@ -2241,7 +2241,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/MediaNotificationManager.java"
-            line="363"
+            line="365"
             column="21"/>
     </issue>
 
@@ -2296,7 +2296,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="62"
+            line="63"
             column="56"/>
     </issue>
 
@@ -2307,7 +2307,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="64"
+            line="65"
             column="17"/>
     </issue>
 
@@ -2318,7 +2318,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="68"
+            line="69"
             column="13"/>
     </issue>
 
@@ -2329,7 +2329,7 @@
         errorLine2="                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="69"
+            line="70"
             column="21"/>
     </issue>
 
@@ -2340,7 +2340,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="70"
+            line="71"
             column="34"/>
     </issue>
 
@@ -2351,7 +2351,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="70"
+            line="71"
             column="13"/>
     </issue>
 
@@ -2362,7 +2362,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="71"
+            line="72"
             column="13"/>
     </issue>
 
@@ -2373,7 +2373,7 @@
         errorLine2="                                              ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="71"
+            line="72"
             column="47"/>
     </issue>
 
@@ -2384,7 +2384,7 @@
         errorLine2="                                                                     ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="73"
+            line="74"
             column="70"/>
     </issue>
 
@@ -2395,7 +2395,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="74"
+            line="75"
             column="30"/>
     </issue>
 
@@ -2406,7 +2406,7 @@
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="74"
+            line="75"
             column="13"/>
     </issue>
 
@@ -2417,7 +2417,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="76"
+            line="77"
             column="56"/>
     </issue>
 
@@ -2428,17 +2428,6 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="78"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mQueueAdapter` of class `QueueFragment` requires synthetic accessor"
-        errorLine1="                mQueueAdapter.notifyDataSetInvalidated();"
-        errorLine2="                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
             line="79"
             column="17"/>
     </issue>
@@ -2446,7 +2435,7 @@
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mQueueAdapter` of class `QueueFragment` requires synthetic accessor"
-        errorLine1="                mQueueAdapter.addAll(queue);"
+        errorLine1="                mQueueAdapter.notifyDataSetInvalidated();"
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
@@ -2457,7 +2446,7 @@
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mQueueAdapter` of class `QueueFragment` requires synthetic accessor"
-        errorLine1="                mQueueAdapter.notifyDataSetChanged();"
+        errorLine1="                mQueueAdapter.addAll(queue);"
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
@@ -2467,12 +2456,23 @@
 
     <issue
         id="SyntheticAccessor"
+        message="Access to `private` field `mQueueAdapter` of class `QueueFragment` requires synthetic accessor"
+        errorLine1="                mQueueAdapter.notifyDataSetChanged();"
+        errorLine2="                ~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
+            line="82"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="SyntheticAccessor"
         message="Access to `private` field `mPlaybackState` of class `QueueFragment` requires synthetic accessor"
         errorLine1="            onPlaybackStateChanged(mPlaybackState);"
         errorLine2="                                   ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="83"
+            line="84"
             column="36"/>
     </issue>
 
@@ -2483,7 +2483,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="83"
+            line="84"
             column="13"/>
     </issue>
 
@@ -2494,7 +2494,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="94"
+            line="95"
             column="13"/>
     </issue>
 
@@ -2505,7 +2505,7 @@
         errorLine2="                                                ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="94"
+            line="95"
             column="49"/>
     </issue>
 
@@ -2516,7 +2516,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="95"
+            line="96"
             column="13"/>
     </issue>
 
@@ -2527,7 +2527,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="96"
+            line="97"
             column="13"/>
     </issue>
 
@@ -2538,7 +2538,7 @@
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="116"
+            line="117"
             column="13"/>
     </issue>
 
@@ -2549,7 +2549,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="117"
+            line="118"
             column="13"/>
     </issue>
 
@@ -2560,7 +2560,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="124"
+            line="125"
             column="17"/>
     </issue>
 
@@ -2571,7 +2571,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="125"
+            line="126"
             column="17"/>
     </issue>
 
@@ -2582,7 +2582,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="126"
+            line="127"
             column="17"/>
     </issue>
 
@@ -2593,7 +2593,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="127"
+            line="128"
             column="17"/>
     </issue>
 
@@ -2604,7 +2604,7 @@
         errorLine2="                                                    ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="161"
+            line="162"
             column="53"/>
     </issue>
 
@@ -2615,7 +2615,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="162"
+            line="163"
             column="17"/>
     </issue>
 
@@ -2626,7 +2626,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="254"
+            line="256"
             column="31"/>
     </issue>
 
@@ -2637,7 +2637,7 @@
         errorLine2="                                                     ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="255"
+            line="257"
             column="54"/>
     </issue>
 
@@ -2648,7 +2648,7 @@
         errorLine2="                        ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="262"
+            line="264"
             column="25"/>
     </issue>
 
@@ -2659,7 +2659,7 @@
         errorLine2="                        ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="264"
+            line="266"
             column="25"/>
     </issue>
 
@@ -2670,7 +2670,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="269"
+            line="271"
             column="21"/>
     </issue>
 
@@ -2681,7 +2681,7 @@
         errorLine2="                    ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="272"
+            line="274"
             column="21"/>
     </issue>
 
@@ -2698,160 +2698,6 @@
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` member of class `SliderListener` requires synthetic accessor"
-        errorLine1="        mSlidingLayout.setPanelSlideListener(new SliderListener());"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="83"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ListItemClickListener` requires synthetic accessor"
-        errorLine1="        mList.setOnItemClickListener(new ListItemClickListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="88"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `FirstLayoutListener` requires synthetic accessor"
-        errorLine1="        mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(new FirstLayoutListener());"
-        errorLine2="                                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="93"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContent` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mContent.setText(LoremIpsum.DIALOGUE[position]);"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="117"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBar` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mActionBar.setTitle(LoremIpsum.TITLES[position]);"
-        errorLine2="            ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="118"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSlidingLayout` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mSlidingLayout.closePane();"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="119"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBar` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mActionBar.onPanelOpened();"
-        errorLine2="            ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="129"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBar` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mActionBar.onPanelClosed();"
-        errorLine2="            ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="134"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBar` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            mActionBar.onFirstLayout();"
-        errorLine2="            ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="148"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSlidingLayout` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="                mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="150"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSlidingLayout` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="                mSlidingLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="152"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ActionBarHelper` requires synthetic accessor"
-        errorLine1="            return new ActionBarHelper();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="164"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSlidingLayout` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            if (mSlidingLayout.isSlideable() &amp;&amp; !mSlidingLayout.isOpen()) {"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="216"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSlidingLayout` of class `SlidingPaneLayoutActivity` requires synthetic accessor"
-        errorLine1="            if (mSlidingLayout.isSlideable() &amp;&amp; !mSlidingLayout.isOpen()) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="216"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` member of class `ColorPagerAdapter` requires synthetic accessor"
         errorLine1="        mAdapter = new ColorPagerAdapter();"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3209,7 +3055,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="168"
+            line="169"
             column="19"/>
     </issue>
 
@@ -3220,7 +3066,7 @@
         errorLine2="                                             ~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="168"
+            line="169"
             column="46"/>
     </issue>
 
@@ -3231,7 +3077,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="177"
+            line="178"
             column="12"/>
     </issue>
 
@@ -3242,7 +3088,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="177"
+            line="178"
             column="30"/>
     </issue>
 
@@ -3253,7 +3099,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="177"
+            line="178"
             column="55"/>
     </issue>
 
@@ -3264,7 +3110,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/BrowseFragment.java"
-            line="178"
+            line="179"
             column="13"/>
     </issue>
 
@@ -6212,7 +6058,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="132"
+            line="133"
             column="19"/>
     </issue>
 
@@ -6223,7 +6069,7 @@
         errorLine2="           ~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="137"
+            line="138"
             column="12"/>
     </issue>
 
@@ -6234,7 +6080,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="137"
+            line="138"
             column="30"/>
     </issue>
 
@@ -6245,7 +6091,7 @@
         errorLine2="                                                      ~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="137"
+            line="138"
             column="55"/>
     </issue>
 
@@ -6256,7 +6102,7 @@
         errorLine2="                             ~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/QueueFragment.java"
-            line="138"
+            line="139"
             column="30"/>
     </issue>
 
@@ -6399,7 +6245,7 @@
         errorLine2="                                    ~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/media/utils/ResourceHelper.java"
-            line="36"
+            line="37"
             column="37"/>
     </issue>
 
@@ -6476,7 +6322,7 @@
         errorLine2="                                 ~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/app/SharingSupport.java"
-            line="73"
+            line="74"
             column="34"/>
     </issue>
 
@@ -6487,7 +6333,7 @@
         errorLine2="                                         ~~~~">
         <location
             file="src/main/java/com/example/android/supportv4/app/SharingSupport.java"
-            line="93"
+            line="95"
             column="42"/>
     </issue>
 
@@ -6780,28 +6626,6 @@
     <issue
         id="UnknownNullness"
         message="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 onCreate(Bundle savedInstanceState) {"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="74"
-            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 boolean onOptionsItemSelected(MenuItem item) {"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java"
-            line="97"
-            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 onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
diff --git a/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/WindowInsetsControllerPlayground.kt b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/WindowInsetsControllerPlayground.kt
index b43d49b..fb424b1 100644
--- a/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/WindowInsetsControllerPlayground.kt
+++ b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/WindowInsetsControllerPlayground.kt
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:Suppress("DEPRECATION")
+
 package com.example.android.supportv4.view
 
 import android.animation.Animator
@@ -36,7 +38,6 @@
 import android.widget.ArrayAdapter
 import android.widget.Button
 import android.widget.CheckBox
-import android.widget.LinearLayout
 import android.widget.Spinner
 import android.widget.TextView
 import android.widget.ToggleButton
@@ -49,6 +50,8 @@
 import androidx.core.view.WindowInsetsAnimationControllerCompat
 import androidx.core.view.WindowInsetsCompat
 import androidx.core.view.WindowInsetsCompat.Type.ime
+import androidx.core.view.WindowInsetsCompat.Type.navigationBars
+import androidx.core.view.WindowInsetsCompat.Type.statusBars
 import androidx.core.view.WindowInsetsCompat.Type.systemBars
 import androidx.core.view.WindowInsetsControllerCompat
 import com.example.android.supportv4.R
@@ -71,6 +74,7 @@
     private lateinit var editRow: ViewGroup
     private lateinit var visibility: TextView
     private lateinit var buttonsRow: ViewGroup
+    private lateinit var buttonsRow2: ViewGroup
     private lateinit var fitSystemWindow: CheckBox
     private lateinit var isDecorView: CheckBox
     internal lateinit var info: TextView
@@ -88,6 +92,7 @@
         editRow = findViewById(R.id.editRow)
         visibility = findViewById(R.id.visibility)
         buttonsRow = findViewById(R.id.buttonRow)
+        buttonsRow2 = findViewById(R.id.buttonRow2)
         info = findViewById(R.id.info)
         fitSystemWindow = findViewById(R.id.decorFitsSystemWindows)
         isDecorView = findViewById(R.id.isDecorView)
@@ -109,6 +114,9 @@
             isChecked = false
             setOnCheckedChangeListener { _, isChecked ->
                 WindowCompat.setDecorFitsSystemWindows(window, isChecked)
+                if (isChecked) {
+                    mRoot.setPadding(0, 0, 0, 0)
+                }
             }
         }
 
@@ -118,20 +126,8 @@
         setupTypeSpinner()
         setupHideShowButtons()
         setupAppearanceButtons()
-
-        ViewCompat.setOnApplyWindowInsetsListener(mRoot) { _: View?, insets: WindowInsetsCompat ->
-            val systemBarInsets = insets.getInsets(ime() or systemBars())
-            mRoot.setPadding(
-                systemBarInsets.left,
-                systemBarInsets.top,
-                systemBarInsets.right,
-                systemBarInsets.bottom
-            )
-            visibility.text =
-                "Inset visibility: " + currentType?.let { insets.isVisible(it) }?.toString()
-
-            WindowInsetsCompat.CONSUMED
-        }
+        setupBehaviorSpinner()
+        setupLayoutButton()
 
         setupIMEAnimation()
         setupActionButton()
@@ -167,9 +163,8 @@
         graph.minimumWidth = 300
         graph.minimumHeight = 100
         graph.setBackgroundColor(Color.GRAY)
-        val linearLayout = info.parent as LinearLayout
-        linearLayout.addView(
-            graph, linearLayout.indexOfChild(isDecorView),
+        findViewById<ViewGroup>(R.id.graph_container).addView(
+            graph,
             ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200)
         )
     }
@@ -189,18 +184,9 @@
                     text = name
                     textOn = text
                     textOff = text
-                    setOnClickListener {
-                        isChecked = true
-                        callback(true)
-
-                        it.postDelayed(
-                            {
-                                isChecked = false
-                                callback(false)
-                            },
-                            2000
-                        )
-                    }
+                    setOnCheckedChangeListener { _, isChecked -> callback(isChecked) }
+                    isChecked = true
+                    callback(true)
                 }
             )
         }
@@ -294,7 +280,12 @@
                 insets: WindowInsetsCompat,
                 runningAnimations: List<WindowInsetsAnimationCompat>
             ): WindowInsetsCompat {
-                mTransitions.forEach { it.onProgress() }
+                val systemInsets = insets.getInsets(systemBars())
+                mRoot.setPadding(
+                    systemInsets.left, systemInsets.top, systemInsets.right,
+                    systemInsets.bottom
+                )
+                mTransitions.forEach { it.onProgress(insets) }
                 return insets
             }
 
@@ -329,6 +320,35 @@
         }
     }
 
+    private fun setupLayoutButton() {
+        arrayOf(
+            "STABLE" to View.SYSTEM_UI_FLAG_LAYOUT_STABLE,
+            "STAT" to View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
+            "NAV" to View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+        ).forEach { (name, flag) ->
+            buttonsRow2.addView(
+                ToggleButton(this).apply {
+                    text = name
+                    textOn = text
+                    textOff = text
+                    setOnCheckedChangeListener { _, isChecked ->
+                        val systemUiVisibility = window.decorView.systemUiVisibility
+                        window.decorView.systemUiVisibility =
+                            if (isChecked) systemUiVisibility or flag
+                            else systemUiVisibility and flag.inv()
+                    }
+                    isChecked = false
+                }
+            )
+        }
+        window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and (
+            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+            )
+            .inv()
+    }
+
     private fun createOnTouchListener(): View.OnTouchListener {
         return object : View.OnTouchListener {
             private val mViewConfiguration =
@@ -433,10 +453,11 @@
 
     private fun setupTypeSpinner() {
         val types = mapOf(
-            "IME" to ime(),
-            "Navigation" to WindowInsetsCompat.Type.navigationBars(),
             "System" to systemBars(),
-            "Status" to WindowInsetsCompat.Type.statusBars()
+            "IME" to ime(),
+            "Navigation" to navigationBars(),
+            "Status" to statusBars(),
+            "All" to (systemBars() or ime())
         )
         findViewById<Spinner>(R.id.spn_insets_type).apply {
             adapter = ArrayAdapter(
@@ -461,6 +482,37 @@
         }
     }
 
+    private fun setupBehaviorSpinner() {
+        val types = mapOf(
+            "BY TOUCH" to WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH,
+            "BY SWIPE" to WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE,
+            "TRANSIENT" to WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
+        )
+        findViewById<Spinner>(R.id.spn_behavior).apply {
+            adapter = ArrayAdapter(
+                context, android.R.layout.simple_spinner_dropdown_item,
+                types.keys.toTypedArray()
+            )
+            onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+                override fun onNothingSelected(parent: AdapterView<*>?) {
+                }
+
+                override fun onItemSelected(
+                    parent: AdapterView<*>?,
+                    view: View?,
+                    position: Int,
+                    id: Long
+                ) {
+                    if (parent != null && view != null) {
+                        WindowCompat.getInsetsController(window, view)!!
+                            .systemBarsBehavior = types[selectedItem]!!
+                    }
+                }
+            }
+            setSelection(0)
+        }
+    }
+
     inner class Transition(private val view: View) {
         private var mEndBottom = 0
         private var mStartBottom = 0
@@ -479,13 +531,8 @@
             }
         }
 
-        fun onProgress() {
-            mInsetsAnimation?.let {
-                view.y = (
-                    mStartBottom +
-                        (mEndBottom - mStartBottom) * it.interpolatedFraction - view.height
-                    )
-            }
+        fun onProgress(insets: WindowInsetsCompat) {
+            view.y = (mStartBottom + insets.getInsets(ime() or systemBars()).bottom).toFloat()
             if (debug) {
                 Log.d(TAG, view.y.toString())
                 values.add(view.y)
diff --git a/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
index 0e03ec8..c330ff7 100644
--- a/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
+++ b/samples/Support4Demos/src/main/java/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
@@ -18,8 +18,11 @@
 package com.example.android.supportv4.widget;
 
 import android.annotation.SuppressLint;
+import android.app.ActionBar;
 import android.os.Build;
 import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewTreeObserver;
@@ -98,15 +101,27 @@
     }
 
     @Override
+    public boolean onCreateOptionsMenu(@NonNull Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.sliding_pane_layout_menu, menu);
+        return true;
+    }
+
+    @Override
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
-        /*
-         * The action bar up action should close the detail view if it is
-         * currently open, as the left pane contains content one level up in the navigation
-         * hierarchy.
-         */
-        if (item.getItemId() == android.R.id.home && mSlidingLayout.isOpen()) {
-            mSlidingLayout.closePane();
-            return true;
+        switch (item.getItemId()) {
+            case R.id.lock_mode_unlocked:
+                mSlidingLayout.setLockMode(SlidingPaneLayout.LOCK_MODE_UNLOCKED);
+                return true;
+            case R.id.lock_mode_locked_open:
+                mSlidingLayout.setLockMode(SlidingPaneLayout.LOCK_MODE_LOCKED_OPEN);
+                return true;
+            case R.id.lock_mode_locked_closed:
+                mSlidingLayout.setLockMode(SlidingPaneLayout.LOCK_MODE_LOCKED_CLOSED);
+                return true;
+            case R.id.lock_mode_locked:
+                mSlidingLayout.setLockMode(SlidingPaneLayout.LOCK_MODE_LOCKED);
+                return true;
         }
         return super.onOptionsItemSelected(item);
     }
@@ -204,12 +219,40 @@
     /**
      * Stub action bar helper; this does nothing.
      */
-    static class ActionBarHelper {
-        public void init() {}
-        public void onPanelClosed() {}
-        public void onPanelOpened() {}
-        public void onFirstLayout() {}
-        public void setTitle(CharSequence title) {}
+    private class ActionBarHelper {
+        private final ActionBar mActionBar;
+        private CharSequence mListTitle;
+        private CharSequence mDetailTitle;
+
+        ActionBarHelper() {
+            mActionBar = getActionBar();
+        }
+
+        public void init() {
+            mListTitle = mDetailTitle = getTitle();
+        }
+
+        public void onPanelClosed() {
+            mActionBar.setTitle(mListTitle);
+        }
+
+        public void onPanelOpened() {
+            mActionBar.setTitle(mDetailTitle);
+        }
+
+        public void onFirstLayout() {
+            if (mSlidingLayout.isSlideable() && !mSlidingLayout.isOpen()) {
+                onPanelClosed();
+            } else {
+                onPanelOpened();
+            }
+        }
+
+        public void setTitle(CharSequence title) {
+            mListTitle = title;
+        }
     }
 
+
+
 }
diff --git a/samples/Support4Demos/src/main/res/layout/activity_insets_controller.xml b/samples/Support4Demos/src/main/res/layout/activity_insets_controller.xml
index 0deaab4..fab30e8b 100644
--- a/samples/Support4Demos/src/main/res/layout/activity_insets_controller.xml
+++ b/samples/Support4Demos/src/main/res/layout/activity_insets_controller.xml
@@ -52,37 +52,70 @@
 
     </LinearLayout>
 
-    <CheckBox
-        android:id="@+id/decorFitsSystemWindows"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="setDecorFitsSystemWindows" />
+    <Spinner
+        android:id="@+id/spn_behavior"
+        android:layout_width="match_parent"
+        android:layout_height="50dp" />
 
-    <CheckBox
-        android:id="@+id/isDecorView"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:checked="true"
-        android:text="On Decor View" />
+        android:orientation="horizontal">
 
-    <TextView
-        android:id="@+id/visibility"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="TextView" />
+        <CheckBox
+            android:id="@+id/decorFitsSystemWindows"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="setDecorFitsSystemWindows" />
 
-    <TextView
-        android:id="@+id/info"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="TextView" />
+        <CheckBox
+            android:id="@+id/isDecorView"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:checked="true"
+            android:text="On Decor View" />
+    </LinearLayout>
 
     <LinearLayout
         android:id="@+id/buttonRow"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        tools:layout_height="50dp"
         android:orientation="horizontal" />
 
+    <LinearLayout
+        android:id="@+id/buttonRow2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        tools:layout_height="50dp"
+        android:orientation="horizontal" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/visibility"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="TextView" />
+
+        <TextView
+            android:id="@+id/info"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="TextView" />
+    </LinearLayout>
+
+    <FrameLayout
+        android:id="@+id/graph_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+    </FrameLayout>
+
     <FrameLayout
         android:id="@+id/scrollView"
         android:layout_height="0dp"
diff --git a/samples/Support4Demos/src/main/res/menu/sliding_pane_layout_menu.xml b/samples/Support4Demos/src/main/res/menu/sliding_pane_layout_menu.xml
new file mode 100644
index 0000000..a967f08
--- /dev/null
+++ b/samples/Support4Demos/src/main/res/menu/sliding_pane_layout_menu.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.
+  -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/lock_mode_unlocked"
+        android:title="UNLOCK" />
+    <item android:id="@+id/lock_mode_locked_open"
+        android:title="LOCKED_OPEN" />
+    <item android:id="@+id/lock_mode_locked_closed"
+        android:title="LOCKED_CLOSED" />
+    <item android:id="@+id/lock_mode_locked"
+        android:title="LOCKED" />
+</menu>
\ No newline at end of file
diff --git a/samples/Support7Demos/lint-baseline.xml b/samples/Support7Demos/lint-baseline.xml
index 0c59422..0d0cb79 100644
--- a/samples/Support7Demos/lint-baseline.xml
+++ b/samples/Support7Demos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="OnClick"
@@ -468,6 +468,105 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class com.example.android.supportv7.app.AppCompatDefaultNightModeBootAwareActivity is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        .detectImplicitDirectBoot()"
+        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"
+            line="58"
+            column="26"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class com.example.android.supportv7.widget.selection.fancy.FancySelectionDemoActivity.OnContextClickListener is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (view.showContextMenu(x, y)) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java"
+            line="413"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class com.example.android.supportv7.media.LocalPlayer.SurfaceViewPlayer is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (mPresentation != null &amp;&amp; mPresentation.getDisplay() != presentationDisplay) {"
+        errorLine2="                                                       ~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
+            line="436"
+            column="56"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            NotificationChannel channel = new NotificationChannel("
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/Player.java"
+            line="184"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            channel.setDescription(description);"
+        errorLine2="                    ~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/Player.java"
+            line="186"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    mContext.getSystemService(NotificationManager.class);"
+        errorLine2="                             ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/Player.java"
+            line="190"
+            column="30"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class com.example.android.supportv7.media.Player is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            notificationManager.createNotificationChannel(channel);"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/Player.java"
+            line="191"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.supportv7.media.SampleMediaRouteProvider is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (Build.VERSION.SDK_INT >= 23 &amp;&amp; !Settings.canDrawOverlays(getContext())) {"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java"
+            line="251"
+            column="54"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.supportv7.media.SampleMediaRouterActivity is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        if (Build.VERSION.SDK_INT >= 23 &amp;&amp; !Settings.canDrawOverlays(this)) {"
+        errorLine2="                                                     ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java"
+            line="214"
+            column="54"/>
+    </issue>
+
+    <issue
         id="LongLogTag"
         message="The logging tag can be at most 23 characters, was 25 (SampleMediaRouterActivity)"
         errorLine1="            Log.d(TAG, &quot;onRouteAdded: route=&quot; + route);"
@@ -644,105 +743,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class com.example.android.supportv7.app.AppCompatDefaultNightModeBootAwareActivity is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
-        errorLine1="                        .detectImplicitDirectBoot()"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/app/AppCompatDefaultNightModeBootAwareActivity.java"
-            line="58"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class com.example.android.supportv7.widget.selection.fancy.FancySelectionDemoActivity.OnContextClickListener is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            if (view.showContextMenu(x, y)) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java"
-            line="413"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class com.example.android.supportv7.media.LocalPlayer.SurfaceViewPlayer is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            if (mPresentation != null &amp;&amp; mPresentation.getDisplay() != presentationDisplay) {"
-        errorLine2="                                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/LocalPlayer.java"
-            line="436"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv7.media.Player is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            NotificationChannel channel = new NotificationChannel("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"
-            line="184"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv7.media.Player is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            channel.setDescription(description);"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"
-            line="186"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.supportv7.media.Player is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    mContext.getSystemService(NotificationManager.class);"
-        errorLine2="                             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"
-            line="190"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class com.example.android.supportv7.media.Player is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="            notificationManager.createNotificationChannel(channel);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/Player.java"
-            line="191"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.supportv7.media.SampleMediaRouteProvider is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        if (Build.VERSION.SDK_INT >= 23 &amp;&amp; !Settings.canDrawOverlays(getContext())) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouteProvider.java"
-            line="251"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.supportv7.media.SampleMediaRouterActivity is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        if (Build.VERSION.SDK_INT >= 23 &amp;&amp; !Settings.canDrawOverlays(this)) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/supportv7/media/SampleMediaRouterActivity.java"
-            line="214"
-            column="54"/>
-    </issue>
-
-    <issue
         id="RestrictedApi"
         message="Preconditions.checkArgument can only be called from within the same library group prefix (referenced groupId=`androidx.core` with prefix androidx from groupId=`androidx`)"
         errorLine1="        checkArgument(selectionTracker != null);"
@@ -1229,7 +1229,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"
-            line="143"
+            line="144"
             column="43"/>
     </issue>
 
@@ -1240,7 +1240,7 @@
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"
-            line="144"
+            line="145"
             column="43"/>
     </issue>
 
@@ -1251,7 +1251,7 @@
         errorLine2="                            ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"
-            line="149"
+            line="150"
             column="29"/>
     </issue>
 
@@ -1262,7 +1262,7 @@
         errorLine2="                            ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"
-            line="154"
+            line="155"
             column="29"/>
     </issue>
 
@@ -1273,7 +1273,7 @@
         errorLine2="            ~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/widget/AsyncListUtilActivity.java"
-            line="158"
+            line="159"
             column="13"/>
     </issue>
 
@@ -2582,7 +2582,7 @@
         errorLine2="                                                                      ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/supportv7/graphics/PaletteActivity.java"
-            line="213"
+            line="212"
             column="71"/>
     </issue>
 
diff --git a/samples/SupportAnimationDemos/lint-baseline.xml b/samples/SupportAnimationDemos/lint-baseline.xml
index 7e65ae1..4de8cfb 100644
--- a/samples/SupportAnimationDemos/lint-baseline.xml
+++ b/samples/SupportAnimationDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="SyntheticAccessor"
diff --git a/samples/SupportContentDemos/lint-baseline.xml b/samples/SupportContentDemos/lint-baseline.xml
index 4927872..d485d6b 100644
--- a/samples/SupportContentDemos/lint-baseline.xml
+++ b/samples/SupportContentDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="AppCompatResource"
diff --git a/samples/SupportEmojiDemos/build.gradle b/samples/SupportEmojiDemos/build.gradle
index 1121cfb7..0104831 100644
--- a/samples/SupportEmojiDemos/build.gradle
+++ b/samples/SupportEmojiDemos/build.gradle
@@ -24,9 +24,11 @@
 }
 
 dependencies {
-    implementation(project(":emoji"))
-    implementation(project(":emoji-bundled"))
-    implementation(project(":emoji-appcompat"))
+    implementation(project(":emoji2:emoji2"))
+    implementation(project(":emoji2:emoji2-bundled"))
+    implementation(project(":emoji2:emoji2-views-helper"))
+    implementation(project(":emoji2:emoji2-views"))
+    implementation(project(":appcompat:appcompat"))
 }
 
 android {
diff --git a/samples/SupportEmojiDemos/lint-baseline.xml b/samples/SupportEmojiDemos/lint-baseline.xml
index e833a13..6defb6d 100644
--- a/samples/SupportEmojiDemos/lint-baseline.xml
+++ b/samples/SupportEmojiDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.android.support.text.emoji.ConfigLayout is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.android.support.text.emoji.ConfigLayout is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
         errorLine2="        ~~~~~">
         <location
diff --git a/samples/SupportEmojiDemos/src/main/AndroidManifest.xml b/samples/SupportEmojiDemos/src/main/AndroidManifest.xml
index 5117637..bf5e65c 100755
--- a/samples/SupportEmojiDemos/src/main/AndroidManifest.xml
+++ b/samples/SupportEmojiDemos/src/main/AndroidManifest.xml
@@ -36,6 +36,15 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
+        <provider
+            android:name="androidx.startup.InitializationProvider"
+            android:authorities="${applicationId}.androidx-startup"
+            android:exported="false"
+            tools:node="merge">
+            <meta-data
+                android:name="androidx.emoji2.text.EmojiCompatInitializer"
+                tools:node="remove" />
+        </provider>
 
     </application>
 
diff --git a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java
index ef970f3..ed9df54 100644
--- a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java
+++ b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/Config.java
@@ -23,9 +23,10 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.core.provider.FontRequest;
-import androidx.emoji.bundled.BundledEmojiCompatConfig;
-import androidx.emoji.text.EmojiCompat;
-import androidx.emoji.text.FontRequestEmojiCompatConfig;
+import androidx.emoji2.bundled.BundledEmojiCompatConfig;
+import androidx.emoji2.text.DefaultEmojiCompatConfig;
+import androidx.emoji2.text.EmojiCompat;
+import androidx.emoji2.text.FontRequestEmojiCompatConfig;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -34,30 +35,56 @@
     private static final String TAG = "EmojiDemo";
 
     public static final String PREF_NAME = "emojicompat";
-    public static final String KEY_ENABLED = "enabled";
+    public static final String KEY_SOURCE = "source";
     public static final String KEY_REPLACE_ALL = "replaceAll";
-    public static final String KEY_DOWNLOADABLE = "downloadable";
     public static final String KEY_INDICATOR = "indicator";
     private static Config sInstance;
 
     private SharedPreferences mSharedPref;
     private Context mContext;
-    private boolean mCompatEnabled;
+    private Source mSource;
     private boolean mReplaceAll;
-    private boolean mDownloadable;
     private boolean mIndicator;
 
-    private Set<Listener> mListeners = new HashSet<>();
+    private final Set<Listener> mListeners = new HashSet<>();
 
     private Config() {
     }
 
+    public enum Source {
+        DEFAULT(0), BUNDLED(1), DOWNLOADABLE(2), DISABLED(3);
+
+        private final int mValue;
+
+        Source(int value) {
+            mValue = value;
+        }
+
+        @NonNull
+        public static Source forPosition(int value) {
+            for (Source source : Source.values()) {
+                if (source.getPosition() == value) {
+                    return source;
+                }
+            }
+            return Source.DEFAULT;
+        }
+
+        public int getPosition() {
+            return mValue;
+        }
+
+        public boolean isEnabled() {
+            return this != DISABLED;
+        }
+    }
+
     void init(Context context) {
         this.mContext = context;
         mSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
-        mCompatEnabled = mSharedPref.getBoolean(KEY_ENABLED, false);
         mReplaceAll = mSharedPref.getBoolean(KEY_REPLACE_ALL, false);
-        mDownloadable = mSharedPref.getBoolean(KEY_DOWNLOADABLE, false);
+        int sourcePos = mSharedPref.getInt(KEY_SOURCE, Source.DEFAULT.getPosition());
+        mSource = Source.forPosition(sourcePos);
         mIndicator = mSharedPref.getBoolean(KEY_INDICATOR, false);
         resetEmojiCompat();
     }
@@ -77,15 +104,12 @@
         mListeners.remove(listener);
     }
 
-    void update(boolean compatEnabled, boolean replaceAll, boolean downloadable,
-            boolean indicator) {
-        mCompatEnabled = compatEnabled;
+    void update(@NonNull Source compatSource, boolean replaceAll, boolean indicator) {
+        mSource = compatSource;
         mReplaceAll = replaceAll;
-        mDownloadable = downloadable;
         mIndicator = indicator;
-        mSharedPref.edit().putBoolean(KEY_ENABLED, mCompatEnabled).apply();
+        mSharedPref.edit().putInt(KEY_SOURCE, mSource.getPosition()).apply();
         mSharedPref.edit().putBoolean(KEY_REPLACE_ALL, mReplaceAll).apply();
-        mSharedPref.edit().putBoolean(KEY_DOWNLOADABLE, mDownloadable).apply();
         mSharedPref.edit().putBoolean(KEY_INDICATOR, mIndicator).apply();
         resetEmojiCompat();
         for (Listener listener : mListeners) {
@@ -95,8 +119,18 @@
 
     private void resetEmojiCompat() {
         final EmojiCompat.Config config;
-        if (mCompatEnabled) {
-            if (mDownloadable) {
+        switch (mSource) {
+            case DEFAULT: {
+                EmojiCompat.Config defaultConfig = DefaultEmojiCompatConfig.create(mContext);
+                if (defaultConfig != null) {
+                    config = defaultConfig;
+                } else {
+                    // don't let it be null for simplicity
+                    config = failingConfig();
+                }
+                break;
+            }
+            case DOWNLOADABLE: {
                 final FontRequest fontRequest = new FontRequest(
                         mContext.getString(R.string.provider_authority),
                         mContext.getString(R.string.provider_package),
@@ -104,17 +138,19 @@
                         R.array.com_google_android_gms_fonts_certs);
 
                 config = new FontRequestEmojiCompatConfig(mContext, fontRequest);
-            } else {
-                config = new BundledEmojiCompatConfig(mContext);
+                break;
             }
-        } else {
-            config = new EmojiCompat.Config(new EmojiCompat.MetadataRepoLoader() {
-                @Override
-                public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
-                    loaderCallback.onFailed(new RuntimeException("Disable"));
-                }
-            }) {
-            };
+            case BUNDLED: {
+                config = new BundledEmojiCompatConfig(mContext);
+                break;
+            }
+            case DISABLED: {
+                config = failingConfig();
+                break;
+            }
+            default: {
+                throw new IllegalStateException("Unexpected source");
+            }
         }
 
         config.setReplaceAll(mReplaceAll)
@@ -134,20 +170,36 @@
         EmojiCompat.reset(config);
     }
 
+    private EmojiCompat.Config failingConfig() {
+        return new EmojiCompat.Config(new EmojiCompat.MetadataRepoLoader() {
+            @Override
+            public void load(
+                    @NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
+                loaderCallback.onFailed(new RuntimeException("Disable"));
+            }
+        }) {
+        };
+    }
+
     boolean isCompatEnabled() {
-        return mCompatEnabled;
+        return mSource.isEnabled();
     }
 
     boolean isReplaceAll() {
-        return mCompatEnabled && mReplaceAll;
+        return isCompatEnabled() && mReplaceAll;
     }
 
     boolean isDownloadable() {
-        return mCompatEnabled && mDownloadable;
+        return isCompatEnabled() && mSource == Source.DOWNLOADABLE;
+    }
+
+    @NonNull
+    Source getSource() {
+        return mSource;
     }
 
     boolean isIndicator() {
-        return mCompatEnabled && mIndicator;
+        return isCompatEnabled() && mIndicator;
     }
 
     interface Listener {
diff --git a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java
index 06bcb75..187e9ff 100644
--- a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java
+++ b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/ConfigLayout.java
@@ -20,8 +20,12 @@
 import android.os.Build;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
 import android.widget.CompoundButton;
 import android.widget.LinearLayout;
+import android.widget.Spinner;
 import android.widget.Switch;
 
 import androidx.annotation.RequiresApi;
@@ -30,10 +34,9 @@
  * Layout that includes configuration parameters.
  */
 public class ConfigLayout extends LinearLayout {
-    private Switch mEnableEmojiCompat;
     private Switch mReplaceAll;
-    private Switch mDownloadable;
     private Switch mIndicator;
+    private Spinner mFontSource;
 
     public ConfigLayout(Context context) {
         super(context);
@@ -63,20 +66,6 @@
         setOrientation(VERTICAL);
         LayoutInflater.from(context).inflate(R.layout.layout_config, this, true);
 
-        mEnableEmojiCompat = findViewById(R.id.enable);
-        mEnableEmojiCompat.setChecked(Config.get().isCompatEnabled());
-        mEnableEmojiCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
-                post(new Runnable() {
-                    @Override
-                    public void run() {
-                        fireListener();
-                    }
-                });
-            }
-        });
-
         mReplaceAll = findViewById(R.id.replaceAll);
         mReplaceAll.setChecked(Config.get().isReplaceAll());
         mReplaceAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@@ -91,17 +80,22 @@
             }
         });
 
-        mDownloadable = findViewById(R.id.useDownloadable);
-        mDownloadable.setChecked(Config.get().isDownloadable());
-        mDownloadable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+        mFontSource = findViewById(R.id.fontSource);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context,
+                R.array.sourcesArray, R.layout.spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        mFontSource.setAdapter(adapter);
+        mFontSource.setSelection(Config.get().getSource().getPosition());
+
+        mFontSource.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
-                post(new Runnable() {
-                    @Override
-                    public void run() {
-                        fireListener();
-                    }
-                });
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                fireListener();
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                fireListener();
             }
         });
 
@@ -122,8 +116,18 @@
     }
 
     void fireListener() {
-        Config.get().update(mEnableEmojiCompat.isChecked(), mReplaceAll.isChecked(),
-                mDownloadable.isChecked(), mIndicator.isChecked());
+        int itemPosition = mFontSource.getSelectedItemPosition();
+
+        Config.Source source = Config.Source.DEFAULT;
+        if (itemPosition == 1) {
+            source = Config.Source.BUNDLED;
+        } else if (itemPosition == 2) {
+            source = Config.Source.DOWNLOADABLE;
+        } else if (itemPosition == 3) {
+            source = Config.Source.DISABLED;
+        }
+
+        Config.get().update(source, mReplaceAll.isChecked(), mIndicator.isChecked());
     }
 
 }
diff --git a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java
index eee5621..cd99ee4 100755
--- a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java
+++ b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/CustomTextView.java
@@ -22,7 +22,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatTextView;
-import androidx.emoji.widget.EmojiTextViewHelper;
+import androidx.emoji2.viewshelper.EmojiTextViewHelper;
 
 
 /**
diff --git a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java
index c1cb424..2973a58 100644
--- a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java
+++ b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/MainFragment.java
@@ -22,7 +22,10 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import androidx.emoji.text.EmojiCompat;
+import androidx.appcompat.widget.AppCompatCheckedTextView;
+import androidx.appcompat.widget.AppCompatToggleButton;
+import androidx.appcompat.widget.SwitchCompat;
+import androidx.emoji2.text.EmojiCompat;
 import androidx.fragment.app.Fragment;
 
 /**
@@ -39,10 +42,16 @@
     static final String EMOJI = WOMAN_TECHNOLOGIST + " " + WOMAN_SINGER;
 
     private TextView mEmojiTextView;
+    private TextView mAppcompatTextView;
     private TextView mEmojiEditText;
+    private TextView mAppcompatEditText;
     private TextView mEmojiButton;
+    private TextView mAppcompatButton;
     private TextView mRegularTextView;
     private TextView mCustomTextView;
+    private AppCompatToggleButton mAppCompatToggleButton;
+    private SwitchCompat mSwitchCompat;
+    private AppCompatCheckedTextView mAppCompatCheckedTextView;
 
     final Config.Listener mConfigListener = new Config.Listener() {
         @Override
@@ -63,15 +72,25 @@
 
         // TextView variant provided by EmojiCompat library
         mEmojiTextView = view.findViewById(R.id.emoji_text_view);
+        // TextView from AppCompat
+        mAppcompatTextView = view.findViewById(R.id.appcompat_text_view);
         // EditText variant provided by EmojiCompat library
         mEmojiEditText = view.findViewById(R.id.emoji_edit_text);
+        // EditText from AppCompat
+        mAppcompatEditText = view.findViewById(R.id.appcompat_edit_text);
         // Button variant provided by EmojiCompat library
         mEmojiButton = view.findViewById(R.id.emoji_button);
+        // Button from AppCompat
+        mAppcompatButton = view.findViewById(R.id.appcompat_button);
         // Regular TextView without EmojiCompat support; you have to manually process the text
         mRegularTextView = view.findViewById(R.id.regular_text_view);
         // Custom TextView
         mCustomTextView = view.findViewById(R.id.emoji_custom_text_view);
 
+        mAppCompatToggleButton = view.findViewById(R.id.appcompat_toggle_button);
+        mSwitchCompat = view.findViewById(R.id.switch_compat);
+        mAppCompatCheckedTextView = view.findViewById(R.id.appcompat_checked_text_view);
+
         final TextView emojiListButton = view.findViewById(R.id.emoji_list_button);
         emojiListButton.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -98,15 +117,29 @@
 
     private void init() {
         mEmojiTextView.setText(getString(R.string.emoji_text_view, EMOJI));
+        mAppcompatTextView.setText(getString(R.string.appcompat_text_view, EMOJI));
         mEmojiEditText.setText(getString(R.string.emoji_edit_text, EMOJI));
+        mAppcompatEditText.setText(getString(R.string.appcompat_edit_text, EMOJI));
+
         mEmojiButton.setText(getString(R.string.emoji_button, EMOJI));
+        mAppcompatButton.setText(getString(R.string.appcompat_button, EMOJI));
         mRegularTextView.setText(getString(R.string.regular_text_view, EMOJI));
+        mAppCompatToggleButton.setTextOn(getString(R.string.toggle_on, EMOJI));
+        mAppCompatToggleButton.setTextOff(getString(R.string.toggle_off, EMOJI));
+        mSwitchCompat.setText(getString(R.string.switch_compat, EMOJI));
+        mSwitchCompat.setTextOn("\uD83C\uDF89");
+        mSwitchCompat.setTextOff("⛔");
+        mSwitchCompat.setShowText(true);
+        mSwitchCompat.setEmojiCompatEnabled(true);
+        mAppCompatCheckedTextView.setText(getString(R.string.checked_text_view, EMOJI));
         EmojiCompat.get().registerInitCallback(new EmojiCompat.InitCallback() {
             @Override
             public void onInitialized() {
                 final EmojiCompat compat = EmojiCompat.get();
-                mRegularTextView.setText(
-                        compat.process(getString(R.string.regular_text_view, EMOJI)));
+                if (compat.getLoadState() == EmojiCompat.LOAD_STATE_SUCCEEDED) {
+                    mRegularTextView.setText(
+                            compat.process(getString(R.string.regular_text_view, EMOJI)));
+                }
             }
         });
         mCustomTextView.setText(getString(R.string.custom_text_view, EMOJI));
diff --git a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/sample/GlyphCheckerSample.java b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/sample/GlyphCheckerSample.java
index 3a06d38..6cd8834 100644
--- a/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/sample/GlyphCheckerSample.java
+++ b/samples/SupportEmojiDemos/src/main/java/com/example/android/support/text/emoji/sample/GlyphCheckerSample.java
@@ -21,7 +21,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.core.graphics.PaintCompat;
-import androidx.emoji.text.EmojiCompat;
+import androidx.emoji2.text.EmojiCompat;
 
 class GlyphCheckerSample {
 
diff --git a/samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml b/samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml
index c9e3181..d8c8d7e 100644
--- a/samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml
+++ b/samples/SupportEmojiDemos/src/main/res/layout/fragment_main.xml
@@ -38,26 +38,46 @@
                 android:layout_height="wrap_content"
                 android:layout_marginBottom="@dimen/spacing_small"/>
 
-            <androidx.emoji.widget.EmojiTextView
+            <androidx.emoji2.widget.EmojiTextView
                 android:id="@+id/emoji_text_view"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginBottom="@dimen/spacing_small"/>
 
-            <androidx.emoji.widget.EmojiAppCompatEditText
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/appcompat_text_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="8dp"/>
+
+            <androidx.emoji2.widget.EmojiEditText
                 android:id="@+id/emoji_edit_text"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginBottom="@dimen/spacing_small"
                 android:textSize="@dimen/text_size"/>
 
-            <androidx.emoji.widget.EmojiAppCompatButton
+            <androidx.appcompat.widget.AppCompatEditText
+                android:id="@+id/appcompat_edit_text"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="8dp"
+                android:textSize="20sp" />
+
+            <androidx.emoji2.widget.EmojiButton
                 android:id="@+id/emoji_button"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginBottom="@dimen/spacing_small"
                 android:textSize="@dimen/text_size"/>
 
+            <androidx.appcompat.widget.AppCompatButton
+                android:id="@+id/appcompat_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="8dp"
+                android:textSize="20sp" />
+
             <TextView
                 android:id="@+id/regular_text_view"
                 android:layout_width="match_parent"
@@ -71,7 +91,26 @@
                 android:layout_height="wrap_content"
                 android:textSize="@dimen/text_size"/>
 
-            <androidx.emoji.widget.EmojiAppCompatButton
+            <androidx.appcompat.widget.AppCompatToggleButton
+                android:id="@+id/appcompat_toggle_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                />
+
+            <androidx.appcompat.widget.SwitchCompat
+                android:id="@+id/switch_compat"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                />
+
+            <androidx.appcompat.widget.AppCompatCheckedTextView
+                android:id="@+id/appcompat_checked_text_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:checked="true"
+                />
+
+            <Button
                 android:id="@+id/emoji_list_button"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
diff --git a/samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml b/samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml
index 14a8724..e17e230 100644
--- a/samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml
+++ b/samples/SupportEmojiDemos/src/main/res/layout/layout_config.xml
@@ -25,12 +25,10 @@
         android:layout_height="wrap_content"
         android:orientation="vertical">
 
-        <Switch
-            android:id="@+id/enable"
+        <Spinner
+            android:id="@+id/fontSource"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="EmojiCompat"
-            android:layout_marginBottom="@dimen/spacing_small"/>
+            android:layout_height="wrap_content" />
 
         <Switch
             android:id="@+id/replaceAll"
@@ -40,13 +38,6 @@
             android:layout_marginBottom="@dimen/spacing_small"/>
 
         <Switch
-            android:id="@+id/useDownloadable"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:text="Downloadable"
-            android:layout_marginBottom="@dimen/spacing_small"/>
-
-        <Switch
             android:id="@+id/indicator"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml b/samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml
index dc0fc88..b5e72f0 100644
--- a/samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml
+++ b/samples/SupportEmojiDemos/src/main/res/layout/list_item_emoji.xml
@@ -21,15 +21,17 @@
     android:layout_height="wrap_content"
     android:orientation="horizontal">
 
-    <androidx.emoji.widget.EmojiAppCompatTextView
+    <!-- manually set color so theme alpha is not applied -->
+    <androidx.appcompat.widget.AppCompatTextView
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/emoji"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:lineSpacingMultiplier="1.2"
+        android:textColor="#ff000000"
         android:textSize="24sp"/>
 
-    <androidx.emoji.widget.EmojiAppCompatTextView
+    <androidx.appcompat.widget.AppCompatTextView
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/text"
         android:layout_width="match_parent"
diff --git a/samples/SupportEmojiDemos/src/main/res/layout/spinner_item.xml b/samples/SupportEmojiDemos/src/main/res/layout/spinner_item.xml
new file mode 100644
index 0000000..3c11b0c
--- /dev/null
+++ b/samples/SupportEmojiDemos/src/main/res/layout/spinner_item.xml
@@ -0,0 +1,20 @@
+<?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.
+  -->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
\ No newline at end of file
diff --git a/samples/SupportEmojiDemos/src/main/res/values/sources.xml b/samples/SupportEmojiDemos/src/main/res/values/sources.xml
new file mode 100644
index 0000000..84480ba
--- /dev/null
+++ b/samples/SupportEmojiDemos/src/main/res/values/sources.xml
@@ -0,0 +1,24 @@
+<?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>
+    <string-array name="sourcesArray">
+        <item>Default Config</item>
+        <item>Bundled Font</item>
+        <item>Downloadable Fonts</item>
+        <item>Disabled EmojiCompat</item>
+    </string-array>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportEmojiDemos/src/main/res/values/strings.xml b/samples/SupportEmojiDemos/src/main/res/values/strings.xml
index cddb5f4..9f50be8 100755
--- a/samples/SupportEmojiDemos/src/main/res/values/strings.xml
+++ b/samples/SupportEmojiDemos/src/main/res/values/strings.xml
@@ -21,4 +21,11 @@
     <string name="emoji_button">Emoji Button %s</string>
     <string name="regular_text_view">Regular TextView %s</string>
     <string name="custom_text_view">Custom TextView %s</string>
+    <string name="appcompat_text_view">AppCompatTextView %s</string>
+    <string name="appcompat_edit_text">AppCompatEditText %s</string>
+    <string name="appcompat_button">AppCompatButton %s</string>
+    <string name="toggle_on">On %s</string>
+    <string name="toggle_off">Off %s</string>
+    <string name="switch_compat">SwitchCompat %s</string>
+    <string name="checked_text_view">AppCompatCheckedTextView %s</string>
 </resources>
diff --git a/samples/SupportLeanbackDemos/lint-baseline.xml b/samples/SupportLeanbackDemos/lint-baseline.xml
index 057441d..6190ec0 100644
--- a/samples/SupportLeanbackDemos/lint-baseline.xml
+++ b/samples/SupportLeanbackDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="MissingSuperCall"
@@ -57,6 +57,237 @@
     </issue>
 
     <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="419"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="419"
+            column="51"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                                      ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="419"
+            column="71"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (mPlayer.getPlaybackParams().getSpeed() != NORMAL_SPEED) {"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="705"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            if (mPlayer.getPlaybackParams().getSpeed() != NORMAL_SPEED) {"
+        errorLine2="                                            ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="705"
+            column="45"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="763"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="763"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                              ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="763"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="797"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="797"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                              ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="797"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="840"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="840"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                              ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="840"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="932"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="932"
+            column="43"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class com.example.android.leanback.MediaSessionService is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
+        errorLine2="                                                              ~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
+            line="932"
+            column="63"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        getActivity().enterPictureInPictureMode();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"
+            line="90"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        getActivity().enterPictureInPictureMode();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"
+            line="93"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        getActivity().enterPictureInPictureMode();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java"
+            line="76"
+            column="39"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                        getActivity().enterPictureInPictureMode();"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java"
+            line="79"
+            column="39"/>
+    </issue>
+
+    <issue
         id="LongLogTag"
         message="The logging tag can be at most 23 characters, was 32 (leanback.BrowseAnimationFragment)"
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
@@ -475,237 +706,6 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="419"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="419"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                                      ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="419"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (mPlayer.getPlaybackParams().getSpeed() != NORMAL_SPEED) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="705"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            if (mPlayer.getPlaybackParams().getSpeed() != NORMAL_SPEED) {"
-        errorLine2="                                            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="705"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="763"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="763"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="763"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="797"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="797"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="797"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="840"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="840"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="840"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="932"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="932"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class com.example.android.leanback.MediaSessionService is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="        mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="932"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        getActivity().enterPictureInPictureMode();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"
-            line="90"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        getActivity().enterPictureInPictureMode();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"
-            line="93"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        getActivity().enterPictureInPictureMode();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java"
-            line="76"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class null is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                        getActivity().enterPictureInPictureMode();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java"
-            line="79"
-            column="39"/>
-    </issue>
-
-    <issue
         id="RestrictedApi"
         message="GuidedStepFragment.SLIDE_FROM_BOTTOM can only be accessed from within the same library group prefix (referenced groupId=`androidx.leanback` with prefix androidx from groupId=`androidx`)"
         errorLine1="            setEntranceTransitionType(GuidedStepFragment.SLIDE_FROM_BOTTOM);"
@@ -4188,7 +4188,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="61"
+            line="62"
             column="16"/>
     </issue>
 
@@ -4199,7 +4199,7 @@
         errorLine2="                               ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="61"
+            line="62"
             column="32"/>
     </issue>
 
@@ -4210,7 +4210,7 @@
         errorLine2="                             ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="72"
+            line="74"
             column="30"/>
     </issue>
 
@@ -4221,7 +4221,7 @@
         errorLine2="                                           ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="72"
+            line="74"
             column="44"/>
     </issue>
 
@@ -4232,7 +4232,7 @@
         errorLine2="                      ~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="81"
+            line="83"
             column="23"/>
     </issue>
 
@@ -4243,7 +4243,7 @@
         errorLine2="                                            ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="93"
+            line="95"
             column="45"/>
     </issue>
 
@@ -4254,7 +4254,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="105"
+            line="107"
             column="29"/>
     </issue>
 
@@ -4265,7 +4265,7 @@
         errorLine2="                             ~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="215"
+            line="217"
             column="30"/>
     </issue>
 
@@ -4276,7 +4276,7 @@
         errorLine2="                              ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="228"
+            line="230"
             column="31"/>
     </issue>
 
@@ -4287,7 +4287,7 @@
         errorLine2="                            ~~~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="265"
+            line="267"
             column="29"/>
     </issue>
 
@@ -4298,7 +4298,7 @@
         errorLine2="                           ~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="277"
+            line="279"
             column="28"/>
     </issue>
 
@@ -4309,7 +4309,7 @@
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="277"
+            line="279"
             column="47"/>
     </issue>
 
diff --git a/samples/SupportPreferenceDemos/lint-baseline.xml b/samples/SupportPreferenceDemos/lint-baseline.xml
index 769f226..111db1c 100644
--- a/samples/SupportPreferenceDemos/lint-baseline.xml
+++ b/samples/SupportPreferenceDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="MissingTvBanner"
diff --git a/samples/SupportRemoteCallbackDemos/lint-baseline.xml b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
index 591c21df..02d6453 100644
--- a/samples/SupportRemoteCallbackDemos/lint-baseline.xml
+++ b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnusedResources"
diff --git a/samples/SupportSliceDemos/lint-baseline.xml b/samples/SupportSliceDemos/lint-baseline.xml
index 251550f..def57e7 100644
--- a/samples/SupportSliceDemos/lint-baseline.xml
+++ b/samples/SupportSliceDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnusedResources"
diff --git a/samples/SupportTransitionDemos/lint-baseline.xml b/samples/SupportTransitionDemos/lint-baseline.xml
index 4bbdfe5..6a772d4 100644
--- a/samples/SupportTransitionDemos/lint-baseline.xml
+++ b/samples/SupportTransitionDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="AppCompatResource"
diff --git a/samples/SupportWearDemos/lint-baseline.xml b/samples/SupportWearDemos/lint-baseline.xml
index 94beef0..c67016a 100644
--- a/samples/SupportWearDemos/lint-baseline.xml
+++ b/samples/SupportWearDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="SyntheticAccessor"
diff --git a/savedstate/savedstate-ktx/lint-baseline.xml b/savedstate/savedstate-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/savedstate/savedstate-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/savedstate/savedstate/build.gradle b/savedstate/savedstate/build.gradle
index 84a5b92..df5ca59 100644
--- a/savedstate/savedstate/build.gradle
+++ b/savedstate/savedstate/build.gradle
@@ -10,10 +10,6 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildTypes.all {
         consumerProguardFiles("proguard-rules.pro")
     }
diff --git a/savedstate/savedstate/lint-baseline.xml b/savedstate/savedstate/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/savedstate/savedstate/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/security/crypto/lint-baseline.xml b/security/crypto/lint-baseline.xml
index 08fde6a..c944174 100644
--- a/security/crypto/lint-baseline.xml
+++ b/security/crypto/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mKeyGenParameterSpec != null &amp;&amp; mKeyGenParameterSpec.isUserAuthenticationRequired();"
         errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mKeyGenParameterSpec.getUserAuthenticationValidityDurationSeconds();"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.security.crypto.MasterKey is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.security.crypto.MasterKey is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mKeyGenParameterSpec.isStrongBoxBacked();"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (!mKeyAlias.equals(keyGenParameterSpec.getKeystoreAlias())) {"
         errorLine2="                                                      ~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        + keyGenParameterSpec.getKeystoreAlias());"
         errorLine2="                                              ~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("
         errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)"
         errorLine2="                         ~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .setKeySize(DEFAULT_AES_GCM_MASTER_KEY_SIZE);"
         errorLine2="                         ~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    builder.setUserAuthenticationRequired(true)"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .setUserAuthenticationValidityDurationSeconds("
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        builder.setIsStrongBoxBacked(true);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKey.Builder is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKey.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mKeyGenParameterSpec = builder.build();"
         errorLine2="                                               ~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)"
         errorLine2="                 ~~~~~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setKeySize(KEY_SIZE);"
         errorLine2="                 ~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return builder.build();"
         errorLine2="                       ~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (!MasterKeys.keyExists(keyGenParameterSpec.getKeystoreAlias())) {"
         errorLine2="                                                      ~~~~~~~~~~~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return keyGenParameterSpec.getKeystoreAlias();"
         errorLine2="                                   ~~~~~~~~~~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (spec.getKeySize() != KEY_SIZE) {"
         errorLine2="                 ~~~~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    &quot;invalid key size, want &quot; + KEY_SIZE + &quot; bits got &quot; + spec.getKeySize()"
         errorLine2="                                                                               ~~~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (!Arrays.equals(spec.getBlockModes(), new String[]{KeyProperties.BLOCK_MODE_GCM})) {"
         errorLine2="                                ~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            + Arrays.toString(spec.getBlockModes()));"
         errorLine2="                                                   ~~~~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (spec.getPurposes() != (KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)) {"
         errorLine2="                 ~~~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            + spec.getPurposes());"
         errorLine2="                                   ~~~~~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (!Arrays.equals(spec.getEncryptionPaddings(), new String[]"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            + Arrays.toString(spec.getEncryptionPaddings()));"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (spec.isUserAuthenticationRequired()"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.security.crypto.MasterKeys is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.security.crypto.MasterKeys is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                &amp;&amp; spec.getUserAuthenticationValidityDurationSeconds() &lt; 1) {"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/security/identity-credential/lint-baseline.xml b/security/identity-credential/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/security/identity-credential/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/CreateItemsRequestTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/CreateItemsRequestTest.java
new file mode 100644
index 0000000..e298b98
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/CreateItemsRequestTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.security.identity;
+
+import static org.junit.Assert.assertEquals;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import co.nstant.in.cbor.CborException;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class CreateItemsRequestTest {
+    @Test
+    public void basicRequest() throws CborException {
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.test.ns", Arrays.asList("xyz", "abc"));
+
+        String docType = "org.test.ns";
+        assertEquals("{\n"
+                        + "  'docType' : 'org.test.ns',\n"
+                        + "  'nameSpaces' : {\n"
+                        + "    'org.test.ns' : {\n"
+                        + "      'abc' : false,\n"
+                        + "      'xyz' : false\n"
+                        + "    }\n"
+                        + "  }\n"
+                        + "}",
+                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, docType)));
+    }
+
+    @Test
+    public void multipleNamespaces() throws CborException {
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.test.ns1", Arrays.asList("foo", "bar"));
+        entriesToRequest.put("org.test.ns2", Arrays.asList("xyz", "abc"));
+        String docType = "org.test.ns";
+        assertEquals("{\n"
+                        + "  'docType' : 'org.test.ns',\n"
+                        + "  'nameSpaces' : {\n"
+                        + "    'org.test.ns1' : {\n"
+                        + "      'bar' : false,\n"
+                        + "      'foo' : false\n"
+                        + "    },\n"
+                        + "    'org.test.ns2' : {\n"
+                        + "      'abc' : false,\n"
+                        + "      'xyz' : false\n"
+                        + "    }\n"
+                        + "  }\n"
+                        + "}",
+                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, docType)));
+    }
+
+    @Test
+    public void noDocType() throws CborException {
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.test.ns1", Arrays.asList("foo", "bar"));
+        assertEquals("{\n"
+                        + "  'nameSpaces' : {\n"
+                        + "    'org.test.ns1' : {\n"
+                        + "      'bar' : false,\n"
+                        + "      'foo' : false\n"
+                        + "    }\n"
+                        + "  }\n"
+                        + "}",
+                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, null)));
+    }
+
+    @Test
+    public void empty() throws CborException {
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        assertEquals("{\n"
+                        + "  'nameSpaces' : {}\n"
+                        + "}",
+                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, null)));
+    }
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/DynamicAuthTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/DynamicAuthTest.java
new file mode 100644
index 0000000..85a738c
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/DynamicAuthTest.java
@@ -0,0 +1,733 @@
+/*
+ * 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.security.identity;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import android.content.Context;
+import android.icu.util.Calendar;
+import android.os.SystemClock;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SignatureException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.crypto.SecretKey;
+
+import co.nstant.in.cbor.CborBuilder;
+import co.nstant.in.cbor.CborEncoder;
+import co.nstant.in.cbor.CborException;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class DynamicAuthTest {
+    private static final String TAG = "DynamicAuthTest";
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void checkAuthKey() throws Exception {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        String credentialName = "test";
+
+        store.deleteCredentialByName(credentialName);
+
+        WritableIdentityCredential wc = store.createCredential(credentialName,
+                "org.iso.18013-5.2019.mdl");
+
+        byte[] challenge = "TheChallenge".getBytes();
+        Collection<X509Certificate> certChain = wc.getCredentialKeyCertificateChain(challenge);
+        // Profile 0 (no authentication)
+        AccessControlProfile noAuthProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(0))
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
+        idsNoAuth.add(new AccessControlProfileId(0));
+        String mdlNs = "org.iso.18013-5.2019";
+        PersonalizationData personalizationData =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(noAuthProfile)
+                        .putEntry(mdlNs, "First name", idsNoAuth, Util.cborEncodeString("Alan"))
+                        .putEntry(mdlNs, "Last name", idsNoAuth, Util.cborEncodeString("Turing"))
+                        .build();
+        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
+        byte[] proofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(proofOfProvisioningSignature));
+        byte[] proofOfProvisioningSha256 =
+                MessageDigest.getInstance("SHA256").digest(proofOfProvisioning);
+
+        IdentityCredential credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+        credential.setAvailableAuthenticationKeys(5, 3);
+        assertArrayEquals(
+                new int[]{0, 0, 0, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+
+        Collection<X509Certificate> certificates = null;
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(5, certificates.size());
+
+        X509Certificate cert = (X509Certificate) certificates.toArray()[0];
+
+        //  - serialNumber: INTEGER 1 (fixed value: same on all certs).
+        assertEquals(1, cert.getSerialNumber().intValue());
+
+        //  - issuer: CN shall be set to "Android Identity Credential Key". (fixed value:
+        //    same on all certs)
+        assertEquals("CN=Android Identity Credential Key",
+                cert.getIssuerX500Principal().getName());
+
+        //  - subject: CN shall be set to "Android Identity Credential Authentication Key". (fixed
+        //    value: same on all certs)
+        assertEquals("CN=Android Identity Credential Authentication Key",
+                cert.getSubjectX500Principal().getName());
+
+        //  - validity: should be from current time and one year in the future (365 days).
+        Date now = new Date();
+
+        // Allow for 10 seconds drift to account for the time drift and loss of precision
+        // when encoding into ASN.1
+        //
+        long diffMilliSecs = now.getTime() - cert.getNotBefore().getTime();
+        final long allowDriftMilliSecs = 10 * 1000;
+        assertTrue(-allowDriftMilliSecs <= diffMilliSecs && diffMilliSecs <= allowDriftMilliSecs);
+
+        final long kMilliSecsInOneYear = 365L * 24 * 60 * 60 * 1000;
+        diffMilliSecs =
+                cert.getNotBefore().getTime() + kMilliSecsInOneYear - cert.getNotAfter().getTime();
+        assertTrue(-allowDriftMilliSecs <= diffMilliSecs && diffMilliSecs <= allowDriftMilliSecs);
+
+        // The extension is expected only if - and only if - the underlying hardware
+        // supports updating the credential.
+        //
+        byte[] icExtension = cert.getExtensionValue("1.3.6.1.4.1.11129.2.1.26");
+        if (store.getCapabilities().isUpdateSupported()) {
+            assertNotNull(icExtension);
+            assertArrayEquals(proofOfProvisioningSha256, Util.getPopSha256FromAuthKeyCert(cert));
+        } else {
+            assertNull(icExtension);
+        }
+
+        // ... and we're done. Clean up after ourselves.
+        store.deleteCredentialByName(credentialName);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void dynamicAuthTest() throws Exception {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        String credentialName = "test";
+
+        store.deleteCredentialByName(credentialName);
+        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
+                credentialName);
+
+        IdentityCredential credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+        assertArrayEquals(new int[0], credential.getAuthenticationDataUsageCount());
+
+        credential.setAvailableAuthenticationKeys(5, 3);
+        assertArrayEquals(
+                new int[]{0, 0, 0, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+
+        // Getting data without device authentication should work even in the case where we haven't
+        // provisioned any authentication keys. Check that.
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
+        // no setSessionTranscript() call indicates Device Authentication not requested.
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        byte[] resultCbor = rd.getAuthenticatedData();
+        try {
+            String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
+            assertEquals("{\n"
+                            + "  'org.iso.18013-5.2019' : {\n"
+                            + "    'Last name' : 'Turing',\n"
+                            + "    'First name' : 'Alan'\n"
+                            + "  }\n"
+                            + "}",
+                    pretty);
+        } catch (CborException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        KeyPair readerEphemeralKeyPair = Util.createEphemeralKeyPair();
+
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+
+        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        // Then check that getEntries() throw NoAuthenticationKeyAvailableException (_even_ when
+        // allowing using exhausted keys).
+        try {
+            credential.setSessionTranscript(sessionTranscript);
+            rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+            assertTrue(false);
+        } catch (NoAuthenticationKeyAvailableException e) {
+            // This is the expected path...
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        // Get auth keys needing certification. This should be all of them. Note that
+        // this forces the creation of the authentication keys in the HAL.
+        Collection<X509Certificate> certificates = null;
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(5, certificates.size());
+
+        // Do it one more time to check that an auth key is still pending even
+        // when the corresponding key has been created.
+        Collection<X509Certificate> certificates2 = null;
+        certificates2 = credential.getAuthKeysNeedingCertification();
+        assertArrayEquals(certificates.toArray(), certificates2.toArray());
+
+        // Now set auth data for the *first* key (this is the act of certifying the key) and check
+        // that one less key now needs certification.
+        X509Certificate key0Cert = certificates.iterator().next();
+
+        // Check key0Cert is signed by CredentialKey.
+        try {
+            key0Cert.verify(certChain.iterator().next().getPublicKey());
+        } catch (CertificateException
+                | InvalidKeyException
+                | NoSuchAlgorithmException
+                | NoSuchProviderException
+                | SignatureException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        try {
+            credential.storeStaticAuthenticationData(key0Cert, new byte[]{42, 43, 44});
+            certificates = credential.getAuthKeysNeedingCertification();
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        assertEquals(4, certificates.size());
+
+        // Now certify the *last* key.
+        X509Certificate key4Cert = new ArrayList<X509Certificate>(certificates).get(
+                certificates.size() - 1);
+        try {
+            key4Cert.verify(certChain.iterator().next().getPublicKey());
+        } catch (CertificateException
+                | InvalidKeyException
+                | NoSuchAlgorithmException
+                | NoSuchProviderException
+                | SignatureException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        try {
+            credential.storeStaticAuthenticationData(key4Cert, new byte[]{43, 44, 45});
+            certificates = credential.getAuthKeysNeedingCertification();
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        assertEquals(3, certificates.size());
+
+        // Now that we've provisioned authentication keys, presentation will no longer fail with
+        // NoAuthenticationKeyAvailableException ... So now we can try a sessionTranscript without
+        // the ephemeral public key that was created in the Secure Area and check it fails with
+        // EphemeralPublicKeyNotFoundException instead...
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ByteArrayOutputStream stBaos = new ByteArrayOutputStream();
+        try {
+            new CborEncoder(stBaos).encode(new CborBuilder()
+                    .addArray()
+                    .add(new byte[]{0x01, 0x02})  // The device engagement structure, encoded
+                    .add(new byte[]{0x03, 0x04})  // Reader ephemeral public key, encoded
+                    .end()
+                    .build());
+        } catch (CborException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        /* TODO
+        byte[] wrongSessionTranscript = stBaos.toByteArray();
+        try {
+            credential.setSessionTranscript(wrongSessionTranscript);
+            rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+            assertTrue(false);
+        } catch (EphemeralPublicKeyNotFoundException e) {
+            // This is the expected path...
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        */
+
+        // Now use one of the keys...
+        entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Home address",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height"));
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        credential.setSessionTranscript(sessionTranscript);
+        rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        resultCbor = rd.getAuthenticatedData();
+        try {
+            String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
+            assertEquals("{\n"
+                            + "  'org.iso.18013-5.2019' : {\n"
+                            + "    'Height' : 180,\n"
+                            + "    'Last name' : 'Turing',\n"
+                            + "    'Birth date' : '19120623',\n"
+                            + "    'First name' : 'Alan',\n"
+                            + "    'Cryptanalyst' : true,\n"
+                            + "    'Home address' : 'Maida Vale, London, England',\n"
+                            + "    'Portrait image' : [0x01, 0x02]\n"
+                            + "  }\n"
+                            + "}",
+                    pretty);
+        } catch (CborException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        byte[] deviceAuthentication = Util.cborEncode(new CborBuilder()
+                .addArray()
+                .add("DeviceAuthentication")
+                .add(Util.cborDecode(sessionTranscript))
+                .add("org.iso.18013-5.2019.mdl")
+                .add(Util.cborBuildTaggedByteString(resultCbor))
+                .end()
+                .build().get(0));
+
+        byte[] deviceAuthenticationBytes =
+                Util.cborEncode(Util.cborBuildTaggedByteString((deviceAuthentication)));
+
+        byte[] mac = rd.getMessageAuthenticationCode();
+        byte[] signature = rd.getEcdsaSignature();
+        assertTrue(mac != null || signature != null);
+        if (mac != null) {
+            // Calculate the MAC by deriving the key using ECDH and HKDF.
+            SecretKey eMacKey = Util.calcEMacKeyForReader(
+                    key0Cert.getPublicKey(),
+                    readerEphemeralKeyPair.getPrivate(),
+                    sessionTranscript);
+            byte[] expectedMac = Util.cborEncode(Util.coseMac0(
+                    eMacKey,
+                    new byte[0],                  // payload
+                    deviceAuthenticationBytes));  // detached content
+
+            // Then compare it with what the TA produced.
+            assertArrayEquals(expectedMac, mac);
+        } else {
+            assertTrue(Util.coseSign1CheckSignature(
+                    Util.cborDecode(signature),
+                    deviceAuthenticationBytes,
+                    key0Cert.getPublicKey()));
+        }
+
+        // Check that key0's static auth data is returned and that this
+        // key has an increased use-count.
+        assertArrayEquals(new byte[]{42, 43, 44}, rd.getStaticAuthenticationData());
+        assertArrayEquals(new int[]{1, 0, 0, 0, 0}, credential.getAuthenticationDataUsageCount());
+
+
+        // Now do this one more time.... this time key4 should have been used. Check this by
+        // inspecting use-counts and the static authentication data.
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        credential.setSessionTranscript(sessionTranscript);
+        rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        assertArrayEquals(new byte[]{43, 44, 45}, rd.getStaticAuthenticationData());
+        assertArrayEquals(new int[]{1, 0, 0, 0, 1}, credential.getAuthenticationDataUsageCount());
+
+        deviceAuthentication = Util.cborEncode(new CborBuilder()
+                .addArray()
+                .add("DeviceAuthentication")
+                .add(Util.cborDecode(sessionTranscript))
+                .add("org.iso.18013-5.2019.mdl")
+                .add(Util.cborBuildTaggedByteString(resultCbor))
+                .end()
+                .build().get(0));
+
+        deviceAuthenticationBytes =
+                Util.cborEncode(Util.cborBuildTaggedByteString((deviceAuthentication)));
+
+        // Verify Signature or MAC was made with key4.
+        mac = rd.getMessageAuthenticationCode();
+        signature = rd.getEcdsaSignature();
+        assertTrue(mac != null || signature != null);
+        if (mac != null) {
+            SecretKey eMacKey = Util.calcEMacKeyForReader(
+                    key4Cert.getPublicKey(),
+                    readerEphemeralKeyPair.getPrivate(),
+                    sessionTranscript);
+            byte[] expectedMac = Util.cborEncode(Util.coseMac0(eMacKey,
+                    new byte[0],                 // payload
+                    deviceAuthenticationBytes));  // detached content
+            assertArrayEquals(expectedMac, mac);
+        } else {
+            assertTrue(Util.coseSign1CheckSignature(
+                    Util.cborDecode(signature),
+                    deviceAuthenticationBytes,
+                    key4Cert.getPublicKey()));
+        }
+
+        // And again.... this time key0 should have been used. Check it.
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        credential.setSessionTranscript(sessionTranscript);
+        rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        assertArrayEquals(new byte[]{42, 43, 44}, rd.getStaticAuthenticationData());
+        assertArrayEquals(new int[]{2, 0, 0, 0, 1}, credential.getAuthenticationDataUsageCount());
+
+        // And again.... this time key4 should have been used. Check it.
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        credential.setSessionTranscript(sessionTranscript);
+        rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        assertArrayEquals(new byte[]{43, 44, 45}, rd.getStaticAuthenticationData());
+        assertArrayEquals(new int[]{2, 0, 0, 0, 2}, credential.getAuthenticationDataUsageCount());
+
+        // We configured each key to have three uses only. So we have two more presentations
+        // to go until we run out... first, check that only three keys need certifications
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(3, certificates.size());
+
+        // Then exhaust the two we've already configured.
+        for (int n = 0; n < 2; n++) {
+            credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            ephemeralKeyPair = credential.createEphemeralKeyPair();
+            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+            credential.setSessionTranscript(sessionTranscript);
+            rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+            assertNotNull(rd);
+        }
+        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+
+        // Now we should have five certs needing certification.
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(5, certificates.size());
+
+        // We still have the two keys which have been exhausted.
+        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+
+        // Check that we fail when running out of presentations (and explicitly don't allow
+        // exhausting keys).
+        try {
+            credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            ephemeralKeyPair = credential.createEphemeralKeyPair();
+            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+            credential.setAllowUsingExhaustedKeys(false);
+            credential.setSessionTranscript(sessionTranscript);
+            rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+            assertTrue(false);
+        } catch (IdentityCredentialException e) {
+            assertTrue(e instanceof NoAuthenticationKeyAvailableException);
+        }
+        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+
+        // Now try with allowing using auth keys already exhausted... this should work!
+        try {
+            credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            ephemeralKeyPair = credential.createEphemeralKeyPair();
+            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+            credential.setSessionTranscript(sessionTranscript);
+            rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        assertArrayEquals(new int[]{4, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+
+        // Check that replenishing works...
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(5, certificates.size());
+        X509Certificate keyNewCert = certificates.iterator().next();
+        try {
+            credential.storeStaticAuthenticationData(keyNewCert, new byte[]{10, 11, 12});
+            certificates = credential.getAuthKeysNeedingCertification();
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        assertEquals(4, certificates.size());
+        assertArrayEquals(new int[]{0, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        ephemeralKeyPair = credential.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+        credential.setSessionTranscript(sessionTranscript);
+        rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+        assertArrayEquals(new byte[]{10, 11, 12}, rd.getStaticAuthenticationData());
+        assertArrayEquals(new int[]{1, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
+
+        deviceAuthentication = Util.cborEncode(new CborBuilder()
+                .addArray()
+                .add("DeviceAuthentication")
+                .add(Util.cborDecode(sessionTranscript))
+                .add("org.iso.18013-5.2019.mdl")
+                .add(Util.cborBuildTaggedByteString(resultCbor))
+                .end()
+                .build().get(0));
+
+        deviceAuthenticationBytes =
+                Util.cborEncode(Util.cborBuildTaggedByteString((deviceAuthentication)));
+
+        mac = rd.getMessageAuthenticationCode();
+        signature = rd.getEcdsaSignature();
+        assertTrue(mac != null || signature != null);
+        if (mac != null) {
+            SecretKey eMacKey = Util.calcEMacKeyForReader(
+                    keyNewCert.getPublicKey(),
+                    readerEphemeralKeyPair.getPrivate(),
+                    sessionTranscript);
+            byte[] expectedMac = Util.cborEncode(Util.coseMac0(eMacKey,
+                    new byte[0],                  // payload
+                    deviceAuthenticationBytes));  // detached content
+            assertArrayEquals(expectedMac, rd.getMessageAuthenticationCode());
+        } else {
+            assertTrue(Util.coseSign1CheckSignature(
+                    Util.cborDecode(signature),
+                    deviceAuthenticationBytes,
+                    keyNewCert.getPublicKey()));
+        }
+
+        // ... and we're done. Clean up after ourselves.
+        store.deleteCredentialByName(credentialName);
+    }
+
+    // TODO: test storeStaticAuthenticationData() throwing UnknownAuthenticationKeyException
+    // on an unknown auth key
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void dynamicAuthWithExpirationTest() throws Exception {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+        assumeTrue(store.getCapabilities().isStaticAuthenticationDataExpirationSupported());
+
+        String credentialName = "test";
+
+        store.deleteCredentialByName(credentialName);
+        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
+                credentialName);
+
+        IdentityCredential credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+
+        credential.setAvailableAuthenticationKeys(3, 5);
+
+        Collection<X509Certificate> certificates = null;
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(3, certificates.size());
+
+        // Endorse an auth-key but set expiration to 10 seconds in the future.
+        //
+        Calendar now = Calendar.getInstance();
+        Calendar tenSecondsFromNow = Calendar.getInstance();
+        tenSecondsFromNow.add(Calendar.SECOND, 10);
+        try {
+            X509Certificate key0Cert = certificates.iterator().next();
+            credential.storeStaticAuthenticationData(key0Cert,
+                    tenSecondsFromNow,
+                    new byte[]{52, 53, 44});
+            certificates = credential.getAuthKeysNeedingCertification();
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        assertEquals(2, certificates.size());
+        assertArrayEquals(
+                new int[]{0, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+        // Check that presentation works.
+        try {
+            IdentityCredential tc = store.getCredentialByName(credentialName,
+                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            KeyPair ekp = tc.createEphemeralKeyPair();
+            KeyPair rekp = Util.createEphemeralKeyPair();
+            tc.setReaderEphemeralPublicKey(rekp.getPublic());
+            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
+            Map<String, Collection<String>> etr = new LinkedHashMap<>();
+            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
+            ResultData rd = tc.getEntries(
+                    Util.createItemsRequest(etr, null),
+                    etr,
+                    null);
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertArrayEquals(
+                new int[]{1, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+
+        SystemClock.sleep(11 * 1000);
+
+        certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(3, certificates.size());
+
+        // Check that presentation now fails..
+        try {
+            IdentityCredential tc = store.getCredentialByName(credentialName,
+                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            KeyPair ekp = tc.createEphemeralKeyPair();
+            KeyPair rekp = Util.createEphemeralKeyPair();
+            tc.setReaderEphemeralPublicKey(rekp.getPublic());
+            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
+            Map<String, Collection<String>> etr = new LinkedHashMap<>();
+            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
+            ResultData rd = tc.getEntries(
+                    Util.createItemsRequest(etr, null),
+                    etr,
+                    null);
+            assertTrue(false);
+        } catch (NoAuthenticationKeyAvailableException e) {
+            // This is the expected path...
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertArrayEquals(
+                new int[]{1, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+
+        // Check that it works if we use setAllowUsingExpiredKeys(true)
+        try {
+            IdentityCredential tc = store.getCredentialByName(credentialName,
+                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            tc.setAllowUsingExpiredKeys(true);   // <-- this is the call that makes the difference!
+            KeyPair ekp = tc.createEphemeralKeyPair();
+            KeyPair rekp = Util.createEphemeralKeyPair();
+            tc.setReaderEphemeralPublicKey(rekp.getPublic());
+            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
+            Map<String, Collection<String>> etr = new LinkedHashMap<>();
+            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
+            ResultData rd = tc.getEntries(
+                    Util.createItemsRequest(etr, null),
+                    etr,
+                    null);
+        } catch (IdentityCredentialException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertArrayEquals(
+                new int[]{2, 0, 0},
+                credential.getAuthenticationDataUsageCount());
+
+        // ... and we're done. Clean up after ourselves.
+        store.deleteCredentialByName(credentialName);
+    }
+
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/EphemeralKeyTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/EphemeralKeyTest.java
new file mode 100644
index 0000000..e2288a8
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/EphemeralKeyTest.java
@@ -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.security.identity;
+
+import static junit.framework.TestCase.assertTrue;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.security.keystore.KeyProperties;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.nio.ByteBuffer;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.security.spec.ECGenParameterSpec;
+import java.util.Collection;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyAgreement;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+// TODO: For better coverage, use different ECDH and HKDF implementations in test code.
+@SuppressWarnings("deprecation")
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class EphemeralKeyTest {
+    private static final String TAG = "EphemeralKeyTest";
+
+    @Test
+    public void createEphemeralKey() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        String credentialName = "ephemeralKeyTest";
+        byte[] sessionTranscript = {0x01, 0x02, 0x03};
+
+        store.deleteCredentialByName(credentialName);
+        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
+                credentialName);
+        IdentityCredential credential = store.getCredentialByName(credentialName,
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+
+        // Check we can get both the public and private keys.
+        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
+        assertNotNull(ephemeralKeyPair);
+        assertTrue(ephemeralKeyPair.getPublic().getEncoded().length > 0);
+        assertTrue(ephemeralKeyPair.getPrivate().getEncoded().length > 0);
+
+        TestReader reader = new TestReader(
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256,
+                ephemeralKeyPair.getPublic(),
+                sessionTranscript);
+
+        try {
+            credential.setReaderEphemeralPublicKey(reader.getEphemeralPublicKey());
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+        credential.setSessionTranscript(sessionTranscript);
+
+        // Exchange a couple of messages... this is to test that the nonce/counter
+        // state works as expected.
+        for (int n = 0; n < 5; n++) {
+            // First send a message from the Reader to the Holder...
+            byte[] messageToHolder = ("Hello Holder! (serial=" + n + ")").getBytes();
+            byte[] encryptedMessageToHolder = reader.encryptMessageToHolder(messageToHolder);
+            assertNotEquals(messageToHolder, encryptedMessageToHolder);
+            byte[] decryptedMessageToHolder = credential.decryptMessageFromReader(
+                    encryptedMessageToHolder);
+            assertArrayEquals(messageToHolder, decryptedMessageToHolder);
+
+            // Then from the Holder to the Reader...
+            byte[] messageToReader = ("Hello Reader! (serial=" + n + ")").getBytes();
+            byte[] encryptedMessageToReader = credential.encryptMessageToReader(messageToReader);
+            assertNotEquals(messageToReader, encryptedMessageToReader);
+            byte[] decryptedMessageToReader = reader.decryptMessageFromHolder(
+                    encryptedMessageToReader);
+            assertArrayEquals(messageToReader, decryptedMessageToReader);
+        }
+    }
+
+    static class TestReader {
+
+        @IdentityCredentialStore.Ciphersuite
+        private int mCipherSuite;
+
+        private PublicKey mHolderEphemeralPublicKey;
+        private KeyPair mEphemeralKeyPair;
+        private SecretKey mSKDevice;
+        private SecretKey mSKReader;
+        private int mSKDeviceCounter;
+        private int mSKReaderCounter;
+
+        private SecureRandom mSecureRandom;
+
+        private boolean mRemoteIsReaderDevice;
+
+        // This is basically the reader-side of what needs to happen for encryption/decryption
+        // of messages.. could easily be re-used in an mDL reader application.
+        TestReader(@IdentityCredentialStore.Ciphersuite int cipherSuite,
+                PublicKey holderEphemeralPublicKey,
+                byte[] sessionTranscript) throws IdentityCredentialException {
+            mCipherSuite = cipherSuite;
+            mHolderEphemeralPublicKey = holderEphemeralPublicKey;
+            mSKReaderCounter = 1;
+            mSKDeviceCounter = 1;
+
+            try {
+                KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC);
+                ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime256v1");
+                kpg.initialize(ecSpec);
+                mEphemeralKeyPair = kpg.generateKeyPair();
+            } catch (NoSuchAlgorithmException
+                    | InvalidAlgorithmParameterException e) {
+                e.printStackTrace();
+                throw new IdentityCredentialException("Error generating ephemeral key", e);
+            }
+
+            try {
+                KeyAgreement ka = KeyAgreement.getInstance("ECDH");
+                ka.init(mEphemeralKeyPair.getPrivate());
+                ka.doPhase(mHolderEphemeralPublicKey, true);
+                byte[] sharedSecret = ka.generateSecret();
+
+                byte[] sessionTranscriptBytes =
+                        Util.cborEncode(Util.cborBuildTaggedByteString(sessionTranscript));
+                byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
+
+                byte[] info = new byte[] {'S', 'K', 'D', 'e', 'v', 'i', 'c', 'e'};
+                byte[] derivedKey = Util.computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
+                mSKDevice = new SecretKeySpec(derivedKey, "AES");
+
+                info = new byte[] {'S', 'K', 'R', 'e', 'a', 'd', 'e', 'r'};
+                derivedKey = Util.computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
+                mSKReader = new SecretKeySpec(derivedKey, "AES");
+
+                mSecureRandom = new SecureRandom();
+
+            } catch (InvalidKeyException
+                    | NoSuchAlgorithmException e) {
+                e.printStackTrace();
+                throw new IdentityCredentialException("Error performing key agreement", e);
+            }
+        }
+
+        PublicKey getEphemeralPublicKey() {
+            return mEphemeralKeyPair.getPublic();
+        }
+
+        byte[] encryptMessageToHolder(byte[] messagePlaintext) throws IdentityCredentialException {
+            byte[] messageCiphertext = null;
+            try {
+                ByteBuffer iv = ByteBuffer.allocate(12);
+                iv.putInt(0, 0x00000000);
+                iv.putInt(4, 0x00000000);
+                iv.putInt(8, mSKReaderCounter);
+                Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+                GCMParameterSpec encryptionParameterSpec = new GCMParameterSpec(128, iv.array());
+                cipher.init(Cipher.ENCRYPT_MODE, mSKReader, encryptionParameterSpec);
+                messageCiphertext = cipher.doFinal(messagePlaintext); // This includes the auth tag
+            } catch (BadPaddingException
+                    | IllegalBlockSizeException
+                    | NoSuchPaddingException
+                    | InvalidKeyException
+                    | NoSuchAlgorithmException
+                    | InvalidAlgorithmParameterException e) {
+                e.printStackTrace();
+                throw new IdentityCredentialException("Error encrypting message", e);
+            }
+            mSKReaderCounter += 1;
+            return messageCiphertext;
+        }
+
+        byte[] decryptMessageFromHolder(byte[] messageCiphertext)
+                throws IdentityCredentialException {
+            ByteBuffer iv = ByteBuffer.allocate(12);
+            iv.putInt(0, 0x00000000);
+            iv.putInt(4, 0x00000001);
+            iv.putInt(8, mSKDeviceCounter);
+            byte[] plaintext = null;
+            try {
+                final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+                cipher.init(Cipher.DECRYPT_MODE, mSKDevice, new GCMParameterSpec(128, iv.array()));
+                plaintext = cipher.doFinal(messageCiphertext);
+            } catch (BadPaddingException
+                    | IllegalBlockSizeException
+                    | InvalidAlgorithmParameterException
+                    | InvalidKeyException
+                    | NoSuchAlgorithmException
+                    | NoSuchPaddingException e) {
+                e.printStackTrace();
+                throw new IdentityCredentialException("Error decrypting message", e);
+            }
+            mSKDeviceCounter += 1;
+            return plaintext;
+        }
+    }
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/HkdfTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/HkdfTest.java
new file mode 100644
index 0000000..7eea98f
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/HkdfTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.security.identity;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Random;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class HkdfTest {
+
+    static Random sRandom = new Random();
+
+    /** Encodes a byte array to hex. */
+    static String hexEncode(final byte[] bytes) {
+        String chars = "0123456789abcdef";
+        StringBuilder result = new StringBuilder(2 * bytes.length);
+        for (byte b : bytes) {
+            // convert to unsigned
+            int val = b & 0xff;
+            result.append(chars.charAt(val / 16));
+            result.append(chars.charAt(val % 16));
+        }
+        return result.toString();
+    }
+
+    /** Decodes a hex string to a byte array. */
+    static byte[] hexDecode(String hex) {
+        if (hex.length() % 2 != 0) {
+            throw new IllegalArgumentException("Expected a string of even length");
+        }
+        int size = hex.length() / 2;
+        byte[] result = new byte[size];
+        for (int i = 0; i < size; i++) {
+            int hi = Character.digit(hex.charAt(2 * i), 16);
+            int lo = Character.digit(hex.charAt(2 * i + 1), 16);
+            if ((hi == -1) || (lo == -1)) {
+                throw new IllegalArgumentException("input is not hexadecimal");
+            }
+            result[i] = (byte) (16 * hi + lo);
+        }
+        return result;
+    }
+
+    static byte[] randBytes(int numBytes) {
+        byte[] bytes = new byte[numBytes];
+        sRandom.nextBytes(bytes);
+        return bytes;
+    }
+
+    @Test
+    public void testNullSaltOrInfo() {
+        byte[] ikm = randBytes(20);
+        byte[] info = randBytes(20);
+        int size = 40;
+
+        byte[] hkdfWithNullSalt = Util.computeHkdf("HmacSha256", ikm, null, info, size);
+        byte[] hkdfWithEmptySalt = Util.computeHkdf("HmacSha256", ikm, new byte[0], info, size);
+        assertArrayEquals(hkdfWithNullSalt, hkdfWithEmptySalt);
+
+        byte[] salt = randBytes(20);
+        byte[] hkdfWithNullInfo = Util.computeHkdf("HmacSha256", ikm, salt, null, size);
+        byte[] hkdfWithEmptyInfo = Util.computeHkdf("HmacSha256", ikm, salt, new byte[0], size);
+        assertArrayEquals(hkdfWithNullInfo, hkdfWithEmptyInfo);
+    }
+
+    @Test
+    public void testInvalidCodeSize() {
+        try {
+            Util.computeHkdf("HmacSha256", new byte[0], new byte[0], new byte[0], 32 * 256);
+            fail("Invalid size, should have thrown exception");
+        } catch (RuntimeException expected) {
+
+            // Expected
+        }
+    }
+
+    /**
+     * Tests the implementation against the test vectors from RFC 5869.
+     */
+    @Test
+    public void testVectors() {
+        // Test case 1
+        assertEquals(
+                "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf"
+                + "1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
+                computeHkdfHex("HmacSha256",
+                        "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+                        "000102030405060708090a0b0c",
+                        "f0f1f2f3f4f5f6f7f8f9",
+                        42));
+
+        // Test case 2
+        assertEquals(
+                "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c"
+                        + "59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71"
+                        + "cc30c58179ec3e87c14c01d5c1f3434f1d87",
+                computeHkdfHex("HmacSha256",
+                        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
+                                + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
+                                + "404142434445464748494a4b4c4d4e4f",
+                        "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"
+                                + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f"
+                                + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
+                        "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
+                                + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef"
+                                + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+                        82));
+
+        // Test case 3: salt is empty
+        assertEquals(
+                "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d"
+                        + "9d201395faa4b61a96c8",
+                computeHkdfHex("HmacSha256",
+                        "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", "", "",
+                        42));
+
+        // Test Case 4
+        assertEquals(
+                "085a01ea1b10f36933068b56efa5ad81a4f14b822f"
+                + "5b091568a9cdd4f155fda2c22e422478d305f3f896",
+                computeHkdfHex(
+                        "HmacSha1",
+                        "0b0b0b0b0b0b0b0b0b0b0b",
+                        "000102030405060708090a0b0c",
+                        "f0f1f2f3f4f5f6f7f8f9",
+                        42));
+
+        // Test Case 5
+        assertEquals(
+                "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe"
+                        + "8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e"
+                        + "927336d0441f4c4300e2cff0d0900b52d3b4",
+                computeHkdfHex(
+                        "HmacSha1",
+                        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
+                                + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
+                                + "404142434445464748494a4b4c4d4e4f",
+                        "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"
+                                + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f"
+                                + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
+                        "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
+                                + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef"
+                                + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+                        82));
+
+        // Test Case 6: salt is empty
+        assertEquals(
+                "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0"
+                        + "ea00033de03984d34918",
+                computeHkdfHex("HmacSha1", "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", "", "",
+                        42));
+
+        // Test Case 7
+        assertEquals(
+                "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5"
+                        + "673a081d70cce7acfc48",
+                computeHkdfHex("HmacSha1", "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c", "", "",
+                        42));
+    }
+
+    /**
+     * Test version of Hkdf where all inputs and outputs are hexadecimal.
+     */
+    private String computeHkdfHex(String macAlgorithm, String ikmHex, String saltHex,
+            String infoHex,
+            int size) {
+        return hexEncode(
+                Util.computeHkdf(macAlgorithm, hexDecode(ikmHex), hexDecode(saltHex),
+                        hexDecode(infoHex), size));
+    }
+
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/ProvisioningTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/ProvisioningTest.java
new file mode 100644
index 0000000..2c1a2db
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/ProvisioningTest.java
@@ -0,0 +1,1086 @@
+/*
+ * 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.security.identity;
+
+import static androidx.security.identity.ResultData.STATUS_NOT_IN_REQUEST_MESSAGE;
+import static androidx.security.identity.ResultData.STATUS_NOT_REQUESTED;
+import static androidx.security.identity.ResultData.STATUS_NO_ACCESS_CONTROL_PROFILES;
+import static androidx.security.identity.ResultData.STATUS_NO_SUCH_ENTRY;
+import static androidx.security.identity.ResultData.STATUS_OK;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import android.content.Context;
+import android.util.Log;
+
+import androidx.biometric.BiometricPrompt;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import co.nstant.in.cbor.CborBuilder;
+import co.nstant.in.cbor.CborEncoder;
+import co.nstant.in.cbor.CborException;
+import co.nstant.in.cbor.model.UnicodeString;
+import co.nstant.in.cbor.model.UnsignedInteger;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@SuppressWarnings("deprecation")
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class ProvisioningTest {
+    private static final String TAG = "ProvisioningTest";
+
+    private static byte[] getExampleDrivingPrivilegesCbor() {
+        // As per 7.4.4 of ISO 18013-5, driving privileges are defined with the following CDDL:
+        //
+        // driving_privileges = [
+        //     * driving_privilege
+        // ]
+        //
+        // driving_privilege = {
+        //     vehicle_category_code: tstr ; Vehicle category code as per ISO 18013-2 Annex A
+        //     ? issue_date: #6.0(tstr)    ; Date of issue encoded as full-date per RFC 3339
+        //     ? expiry_date: #6.0(tstr)   ; Date of expiry encoded as full-date per RFC 3339
+        //     ? code: tstr                ; Code as per ISO 18013-2 Annex A
+        //     ? sign: tstr                ; Sign as per ISO 18013-2 Annex A
+        //     ? value: int                ; Value as per ISO 18013-2 Annex A
+        // }
+        //
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            new CborEncoder(baos).encode(new CborBuilder()
+                    .addArray()
+                    .addMap()
+                    .put(new UnicodeString("vehicle_category_code"), new UnicodeString("TODO"))
+                    .put(new UnicodeString("value"), new UnsignedInteger(42))
+                    .end()
+                    .end()
+                    .build());
+        } catch (CborException e) {
+            assertTrue(false);
+        }
+        return baos.toByteArray();
+    }
+
+    static Collection<X509Certificate> createCredential(IdentityCredentialStore store,
+            String credentialName) throws IdentityCredentialException {
+        return createCredentialWithChallenge(store, credentialName, "SomeChallenge".getBytes());
+    }
+
+    static Collection<X509Certificate> createCredentialWithChallenge(IdentityCredentialStore store,
+            String credentialName,
+            byte[] challenge) throws IdentityCredentialException {
+        WritableIdentityCredential wc = null;
+        wc = store.createCredential(credentialName, "org.iso.18013-5.2019.mdl");
+
+        Collection<X509Certificate> certificateChain =
+                wc.getCredentialKeyCertificateChain(challenge);
+        // TODO: inspect cert-chain
+
+        // Profile 0 (no authentication)
+        AccessControlProfile noAuthProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(0))
+                        .setUserAuthenticationRequired(false)
+                        .build();
+
+        byte[] drivingPrivileges = getExampleDrivingPrivilegesCbor();
+
+        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
+        idsNoAuth.add(new AccessControlProfileId(0));
+        Collection<AccessControlProfileId> idsNoAcp = new ArrayList<AccessControlProfileId>();
+        String mdlNs = "org.iso.18013-5.2019";
+        PersonalizationData personalizationData =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(noAuthProfile)
+                        .putEntry(mdlNs, "First name", idsNoAuth, Util.cborEncodeString("Alan"))
+                        .putEntry(mdlNs, "Last name", idsNoAuth, Util.cborEncodeString("Turing"))
+                        .putEntry(mdlNs, "Home address", idsNoAuth,
+                                Util.cborEncodeString("Maida Vale, London, England"))
+                        .putEntry(mdlNs, "Birth date", idsNoAuth, Util.cborEncodeString("19120623"))
+                        .putEntry(mdlNs, "Cryptanalyst", idsNoAuth, Util.cborEncodeBoolean(true))
+                        .putEntry(mdlNs, "Portrait image", idsNoAuth, Util.cborEncodeBytestring(
+                            new byte[]{0x01, 0x02}))
+                        .putEntry(mdlNs, "Height", idsNoAuth, Util.cborEncodeNumber(180))
+                        .putEntry(mdlNs, "Neg Item", idsNoAuth, Util.cborEncodeNumber(-42))
+                        .putEntry(mdlNs, "Int Two Bytes", idsNoAuth, Util.cborEncodeNumber(0x101))
+                        .putEntry(mdlNs, "Int Four Bytes", idsNoAuth,
+                                Util.cborEncodeNumber(0x10001))
+                        .putEntry(mdlNs, "Int Eight Bytes", idsNoAuth,
+                                Util.cborEncodeNumber(0x100000001L))
+                        .putEntry(mdlNs, "driving_privileges", idsNoAuth, drivingPrivileges)
+                        .putEntry(mdlNs, "No Access", idsNoAcp,
+                                Util.cborEncodeString("Cannot be retrieved"))
+                        .build();
+
+        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
+        byte[] proofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(proofOfProvisioningSignature));
+
+        String pretty = "";
+        pretty = Util.cborPrettyPrint(proofOfProvisioning);
+        Log.e(TAG, "pretty: " + pretty);
+        // Checks that order of elements is the order it was added, using the API.
+        assertEquals("[\n"
+                + "  'ProofOfProvisioning',\n"
+                + "  'org.iso.18013-5.2019.mdl',\n"
+                + "  [\n"
+                + "    {\n"
+                + "      'id' : 0\n"
+                + "    }\n"
+                + "  ],\n"
+                + "  {\n"
+                + "    'org.iso.18013-5.2019' : [\n"
+                + "      {\n"
+                + "        'name' : 'First name',\n"
+                + "        'value' : 'Alan',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Last name',\n"
+                + "        'value' : 'Turing',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Home address',\n"
+                + "        'value' : 'Maida Vale, London, England',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Birth date',\n"
+                + "        'value' : '19120623',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Cryptanalyst',\n"
+                + "        'value' : true,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Portrait image',\n"
+                + "        'value' : [0x01, 0x02],\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Height',\n"
+                + "        'value' : 180,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Neg Item',\n"
+                + "        'value' : -42,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Int Two Bytes',\n"
+                + "        'value' : 257,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Int Four Bytes',\n"
+                + "        'value' : 65537,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Int Eight Bytes',\n"
+                + "        'value' : 4294967297,\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'driving_privileges',\n"
+                + "        'value' : [\n"
+                + "          {\n"
+                + "            'value' : 42,\n"
+                + "            'vehicle_category_code' : 'TODO'\n"
+                + "          }\n"
+                + "        ],\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'No Access',\n"
+                + "        'value' : 'Cannot be retrieved',\n"
+                + "        'accessControlProfiles' : []\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  },\n"
+                + "  false\n"
+                + "]", pretty);
+
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(proofOfProvisioningSignature),
+                new byte[0], // Additional data
+                certificateChain.iterator().next().getPublicKey()));
+
+        // TODO: Check challenge is in certificatechain
+
+        // TODO: Check each cert signs the next one
+
+        // TODO: Check bottom cert is the Google well-know cert
+
+        // TODO: need to also get and check SecurityStatement
+
+        return certificateChain;
+    }
+
+    static Collection<X509Certificate> createCredentialMultipleNamespaces(
+            IdentityCredentialStore store,
+            String credentialName) throws IdentityCredentialException {
+        WritableIdentityCredential wc = null;
+        wc = store.createCredential(credentialName, "org.iso.18013-5.2019.mdl");
+
+        Collection<X509Certificate> certificateChain =
+                wc.getCredentialKeyCertificateChain("SomeChallenge".getBytes());
+
+        // Profile 0 (no authentication)
+        AccessControlProfile noAuthProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(0))
+                        .setUserAuthenticationRequired(false)
+                        .build();
+
+        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
+        idsNoAuth.add(new AccessControlProfileId(0));
+        PersonalizationData personalizationData =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(noAuthProfile)
+                        .putEntry("org.example.barfoo", "Bar", idsNoAuth,
+                                Util.cborEncodeString("Foo"))
+                        .putEntry("org.example.barfoo", "Foo", idsNoAuth,
+                                Util.cborEncodeString("Bar"))
+                        .putEntry("org.example.foobar", "Foo", idsNoAuth,
+                                Util.cborEncodeString("Bar"))
+                        .putEntry("org.example.foobar", "Bar", idsNoAuth,
+                                Util.cborEncodeString("Foo"))
+                        .build();
+
+        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
+        byte[] proofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(proofOfProvisioningSignature));
+        String pretty = Util.cborPrettyPrint(proofOfProvisioning);
+        // Checks that order of elements is the order it was added, using the API.
+        assertEquals("[\n"
+                + "  'ProofOfProvisioning',\n"
+                + "  'org.iso.18013-5.2019.mdl',\n"
+                + "  [\n"
+                + "    {\n"
+                + "      'id' : 0\n"
+                + "    }\n"
+                + "  ],\n"
+                + "  {\n"
+                + "    'org.example.barfoo' : [\n"
+                + "      {\n"
+                + "        'name' : 'Bar',\n"
+                + "        'value' : 'Foo',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Foo',\n"
+                + "        'value' : 'Bar',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      }\n"
+                + "    ],\n"
+                + "    'org.example.foobar' : [\n"
+                + "      {\n"
+                + "        'name' : 'Foo',\n"
+                + "        'value' : 'Bar',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Bar',\n"
+                + "        'value' : 'Foo',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  },\n"
+                + "  false\n"
+                + "]", pretty);
+
+        return certificateChain;
+    }
+
+    @Test
+    public void alreadyPersonalized() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        createCredential(store, "test");
+        try {
+            createCredential(store, "test");
+            assertTrue(false);
+        } catch (AlreadyPersonalizedException e) {
+            // The expected path.
+        }
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void nonExistent() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNull(credential);
+    }
+
+    @Test
+    public void defaultStoreSupportsAnyDocumentType() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        String[] supportedDocTypes = store.getSupportedDocTypes();
+        assertEquals(0, supportedDocTypes.length);
+    }
+
+    @Test
+    public void deleteCredentialOld()
+            throws IdentityCredentialException, CborException, CertificateEncodingException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        assertNull(store.deleteCredentialByName("test"));
+        Collection<X509Certificate> certificateChain = createCredential(store, "test");
+
+        // Deleting the credential involves destroying the keys referenced in the returned
+        // certificateChain... so get an encoded blob we can turn into a X509 cert when
+        // checking the deletion receipt below, post-deletion.
+        PublicKey credentialKeyPublic = certificateChain.iterator().next().getPublicKey();
+
+        byte[] proofOfDeletionSignature = store.deleteCredentialByName("test");
+        byte[] proofOfDeletion = Util.coseSign1GetData(Util.cborDecode(proofOfDeletionSignature));
+
+        // Check the returned CBOR is what is expected. Specifically note the challenge
+        // is _not_ included because we're using the old method.
+        String pretty = Util.cborPrettyPrint(proofOfDeletion);
+        assertEquals("['ProofOfDeletion', 'org.iso.18013-5.2019.mdl', false]", pretty);
+
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(proofOfDeletionSignature),
+                new byte[0], // Additional data
+                credentialKeyPublic));
+
+        // Finally, check the credential is gone.
+        assertNull(store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256));
+    }
+
+    @Test
+    public void deleteCredential()
+            throws IdentityCredentialException, CborException, CertificateEncodingException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+        assumeTrue(store.getCapabilities().isDeleteSupported());
+
+        store.deleteCredentialByName("test");
+        assertNull(store.deleteCredentialByName("test"));
+        Collection<X509Certificate> certificateChain = createCredential(store, "test");
+
+        // Deleting the credential involves destroying the keys referenced in the returned
+        // certificateChain... so get an encoded blob we can turn into a X509 cert when
+        // checking the deletion receipt below, post-deletion.
+        PublicKey credentialKeyPublic = certificateChain.iterator().next().getPublicKey();
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+        byte[] proofOfDeletionSignature = credential.delete(new byte[] {0x01, 0x02});
+        byte[] proofOfDeletion = Util.coseSign1GetData(Util.cborDecode(proofOfDeletionSignature));
+
+        // Check the returned CBOR is what is expected. Specifically note the challenge
+        // _is_ included because we're using the new delete() method.
+        String pretty = Util.cborPrettyPrint(proofOfDeletion);
+        assertEquals("['ProofOfDeletion', 'org.iso.18013-5.2019.mdl', [0x01, 0x02], false]",
+                pretty);
+
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(proofOfDeletionSignature),
+                new byte[0], // Additional data
+                credentialKeyPublic));
+
+        // Finally, check the credential is gone.
+        assertNull(store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256));
+    }
+
+    @Test
+    public void proofOfOwnership()
+            throws IdentityCredentialException, CborException, CertificateEncodingException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+        assumeTrue(store.getCapabilities().isProveOwnershipSupported());
+
+        store.deleteCredentialByName("test");
+        assertNull(store.deleteCredentialByName("test"));
+        Collection<X509Certificate> certificateChain = createCredential(store, "test");
+
+        byte[] encodedCredentialCert = certificateChain.iterator().next().getEncoded();
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+
+        byte[] challenge = new byte[]{0x12, 0x22};
+        byte[] proofOfOwnershipSignature = credential.proveOwnership(challenge);
+        byte[] proofOfOwnership = Util.coseSign1GetData(Util.cborDecode(proofOfOwnershipSignature));
+
+        // Check the returned CBOR is what is expected.
+        String pretty = Util.cborPrettyPrint(proofOfOwnership);
+        assertEquals("['ProofOfOwnership', 'org.iso.18013-5.2019.mdl', [0x12, 0x22], false]",
+                pretty);
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(proofOfOwnershipSignature),
+                new byte[0], // Additional data
+                certificateChain.iterator().next().getPublicKey()));
+
+        // Finally, check the credential is still there
+        assertNotNull(store.deleteCredentialByName("test"));
+    }
+
+    @Test
+    public void testProvisionAndRetrieve() throws IdentityCredentialException, CborException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        // Check that the read-back certChain matches the created one.
+        Collection<X509Certificate> readBackCertChain =
+                credential.getCredentialKeyCertificateChain();
+        assertEquals(certChain.size(), readBackCertChain.size());
+        Iterator<X509Certificate> it = readBackCertChain.iterator();
+        for (X509Certificate expectedCert : certChain) {
+            X509Certificate readBackCert = it.next();
+            assertEquals(expectedCert, readBackCert);
+        }
+
+        // Check we can get a CryptoObject (even though it won't get used)
+        BiometricPrompt.CryptoObject cryptoObject = credential.getCryptoObject();
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Home address",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height",
+                        "Neg Item",
+                        "Int Two Bytes",
+                        "Int Eight Bytes",
+                        "Int Four Bytes",
+                        "driving_privileges"));
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        assertEquals(12, rd.getEntryNames("org.iso.18013-5.2019").size());
+
+        String ns = "org.iso.18013-5.2019";
+        assertEquals("Alan", rd.getEntryString(ns, "First name"));
+        assertEquals("Turing", rd.getEntryString(ns, "Last name"));
+        assertEquals("Maida Vale, London, England", rd.getEntryString(ns, "Home address"));
+        assertEquals("19120623", rd.getEntryString(ns, "Birth date"));
+        assertEquals(true, rd.getEntryBoolean(ns, "Cryptanalyst"));
+        assertArrayEquals(new byte[]{0x01, 0x02},
+                rd.getEntryBytestring(ns, "Portrait image"));
+        assertEquals(180, rd.getEntryInteger(ns, "Height"));
+        assertEquals(-42, rd.getEntryInteger(ns, "Neg Item"));
+        assertEquals(0x101, rd.getEntryInteger(ns, "Int Two Bytes"));
+        assertEquals(0x10001, rd.getEntryInteger(ns, "Int Four Bytes"));
+        assertEquals(0x100000001L, rd.getEntryInteger(ns, "Int Eight Bytes"));
+        byte[] drivingPrivileges = getExampleDrivingPrivilegesCbor();
+        assertArrayEquals(drivingPrivileges, rd.getEntry(ns, "driving_privileges"));
+
+        assertEquals("{\n"
+                + "  'org.iso.18013-5.2019' : {\n"
+                + "    'Height' : 180,\n"
+                + "    'Neg Item' : -42,\n"
+                + "    'Last name' : 'Turing',\n"
+                + "    'Birth date' : '19120623',\n"
+                + "    'First name' : 'Alan',\n"
+                + "    'Cryptanalyst' : true,\n"
+                + "    'Home address' : 'Maida Vale, London, England',\n"
+                + "    'Int Two Bytes' : 257,\n"
+                + "    'Int Four Bytes' : 65537,\n"
+                + "    'Portrait image' : [0x01, 0x02],\n"
+                + "    'Int Eight Bytes' : 4294967297,\n"
+                + "    'driving_privileges' : [\n"
+                + "      {\n"
+                + "        'value' : 42,\n"
+                + "        'vehicle_category_code' : 'TODO'\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  }\n"
+                + "}", Util.cborPrettyPrint(Util.canonicalizeCbor(rd.getAuthenticatedData())));
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void testProvisionAndRetrieveMultipleTimes() throws IdentityCredentialException,
+            InvalidKeyException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        // This checks we can do multiple getEntries() calls
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        // We're going to need some authentication keys for this so create some dummy ones.
+        credential.setAvailableAuthenticationKeys(5, 1);
+        Collection<X509Certificate> authKeys = credential.getAuthKeysNeedingCertification();
+        for (X509Certificate authKey : authKeys) {
+            byte[] staticAuthData = new byte[5];
+            credential.storeStaticAuthenticationData(authKey, staticAuthData);
+        }
+
+        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
+        KeyPair readerEphemeralKeyPair = Util.createEphemeralKeyPair();
+        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
+        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
+
+        credential.setSessionTranscript(sessionTranscript);
+        for (int n = 0; n < 3; n++) {
+            ResultData rd = credential.getEntries(
+                    Util.createItemsRequest(entriesToRequest, null),
+                    entriesToRequest,
+                    null);
+            assertEquals("Alan", rd.getEntryString("org.iso.18013-5.2019", "First name"));
+            assertEquals("Turing", rd.getEntryString("org.iso.18013-5.2019", "Last name"));
+            assertTrue(rd.getMessageAuthenticationCode() != null || rd.getEcdsaSignature() != null);
+        }
+
+        // Now try with a different (but still valid) sessionTranscript - this should fail with
+        // a RuntimeException
+        KeyPair otherEphemeralKeyPair = Util.createEphemeralKeyPair();
+        byte[] otherSessionTranscript = Util.buildSessionTranscript(otherEphemeralKeyPair);
+        try {
+            credential.setSessionTranscript(otherSessionTranscript);
+            assertTrue(false);
+        } catch (RuntimeException e) {
+            // This is the expected path...
+        } catch (Exception e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void testProvisionAndRetrieveWithFiltering() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Home address",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height"));
+        Map<String, Collection<String>> entriesToRequestWithoutHomeAddress = new LinkedHashMap<>();
+        entriesToRequestWithoutHomeAddress.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height"));
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequestWithoutHomeAddress,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        assertEquals(6, rd.getEntryNames("org.iso.18013-5.2019").size());
+
+        String ns = "org.iso.18013-5.2019";
+        assertEquals("Alan", rd.getEntryString(ns, "First name"));
+        assertEquals("Turing", rd.getEntryString(ns, "Last name"));
+        assertEquals("19120623", rd.getEntryString(ns, "Birth date"));
+        assertEquals(true, rd.getEntryBoolean(ns, "Cryptanalyst"));
+        assertArrayEquals(new byte[]{0x01, 0x02},
+                rd.getEntryBytestring(ns, "Portrait image"));
+        assertEquals(180, rd.getEntryInteger(ns, "Height"));
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void testProvisionAndRetrieveElementWithNoACP() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("No Access"));
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        assertEquals(1, rd.getEntryNames("org.iso.18013-5.2019").size());
+        assertEquals(0, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
+
+        String ns = "org.iso.18013-5.2019";
+        assertEquals(STATUS_NO_ACCESS_CONTROL_PROFILES, rd.getStatus(ns, "No Access"));
+
+        store.deleteCredentialByName("test");
+    }
+
+    // TODO: Make sure we test retrieving an entry with multiple ACPs and test all four cases:
+    //
+    // - ACP1 bad,  ACP2 bad   -> NOT OK
+    // - ACP1 good, ACP2 bad   -> OK
+    // - ACP1 bad,  ACP2 good  -> OK
+    // - ACP1 good, ACP2 good  -> OK
+    //
+
+    @Test
+    public void testProvisionAndRetrieveWithEntryNotInRequest() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Home address",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height"));
+        Map<String, Collection<String>> entriesToRequestWithoutHomeAddress = new LinkedHashMap<>();
+        entriesToRequestWithoutHomeAddress.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Birth date",
+                        "Cryptanalyst",
+                        "Portrait image",
+                        "Height"));
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequestWithoutHomeAddress, null),
+                entriesToRequest,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        assertEquals(7, rd.getEntryNames("org.iso.18013-5.2019").size());
+        assertEquals(6, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
+
+        String ns = "org.iso.18013-5.2019";
+        assertEquals(STATUS_NOT_IN_REQUEST_MESSAGE, rd.getStatus(ns, "Home address"));
+
+        assertEquals("Alan", rd.getEntryString(ns, "First name"));
+        assertEquals("Turing", rd.getEntryString(ns, "Last name"));
+        assertEquals("19120623", rd.getEntryString(ns, "Birth date"));
+        assertEquals(true, rd.getEntryBoolean(ns, "Cryptanalyst"));
+        assertArrayEquals(new byte[]{0x01, 0x02},
+                rd.getEntryBytestring(ns, "Portrait image"));
+        assertEquals(180, rd.getEntryInteger(ns, "Height"));
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void nonExistentEntries() throws IdentityCredentialException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredential(store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("First name",
+                        "Last name",
+                        "Non-existent Entry"));
+        ResultData rd = credential.getEntries(
+                null,
+                entriesToRequest,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        assertEquals(3, rd.getEntryNames("org.iso.18013-5.2019").size());
+        assertEquals(2, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
+
+        String ns = "org.iso.18013-5.2019";
+
+        assertEquals(STATUS_OK, rd.getStatus(ns, "First name"));
+        assertEquals(STATUS_OK, rd.getStatus(ns, "Last name"));
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-existent Entry"));
+        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
+
+        assertEquals("Alan", rd.getEntryString(ns, "First name"));
+        assertEquals("Turing", rd.getEntryString(ns, "Last name"));
+        assertNull(rd.getEntry(ns, "Non-existent Entry"));
+        assertNull(rd.getEntry(ns, "Entry not even requested"));
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void multipleNamespaces() throws IdentityCredentialException, CborException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        store.deleteCredentialByName("test");
+        Collection<X509Certificate> certChain = createCredentialMultipleNamespaces(
+                store, "test");
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        // Request these in different order than they are stored
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.example.foobar", Arrays.asList("Foo", "Bar", "Non-exist"));
+        entriesToRequest.put("org.example.barfoo", Arrays.asList("Bar", "Non-exist", "Foo"));
+        entriesToRequest.put("org.example.foofoo", Arrays.asList("Bar", "Foo", "Non-exist"));
+
+        ResultData rd = credential.getEntries(
+                null,
+                entriesToRequest,
+                null);
+
+        // We should get the same number of namespaces back, as we requested - even for namespaces
+        // that do not exist in the credential.
+        //
+        // Additionally, each namespace should have exactly the items requested, in the same order.
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 3);
+
+
+        // First requested namespace - org.example.foobar
+        String ns = "org.example.foobar";
+        assertArrayEquals(new String[]{"Foo", "Bar", "Non-exist"}, rd.getEntryNames(ns).toArray());
+        assertArrayEquals(new String[]{"Foo", "Bar"}, rd.getRetrievedEntryNames(ns).toArray());
+
+        assertEquals(STATUS_OK, rd.getStatus(ns, "Foo"));
+        assertEquals(STATUS_OK, rd.getStatus(ns, "Bar"));
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
+        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
+
+        assertEquals("Bar", rd.getEntryString(ns, "Foo"));
+        assertEquals("Foo", rd.getEntryString(ns, "Bar"));
+        assertNull(rd.getEntry(ns, "Non-exist"));
+        assertNull(rd.getEntry(ns, "Entry not even requested"));
+
+        // Second requested namespace - org.example.barfoo
+        ns = "org.example.barfoo";
+        assertArrayEquals(new String[]{"Bar", "Non-exist", "Foo"}, rd.getEntryNames(ns).toArray());
+        assertArrayEquals(new String[]{"Bar", "Foo"}, rd.getRetrievedEntryNames(ns).toArray());
+
+        assertEquals(STATUS_OK, rd.getStatus(ns, "Foo"));
+        assertEquals(STATUS_OK, rd.getStatus(ns, "Bar"));
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
+        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
+
+        assertEquals("Bar", rd.getEntryString(ns, "Foo"));
+        assertEquals("Foo", rd.getEntryString(ns, "Bar"));
+        assertNull(rd.getEntry(ns, "Non-exist"));
+        assertNull(rd.getEntry(ns, "Entry not even requested"));
+
+        // Third requested namespace - org.example.foofoo
+        ns = "org.example.foofoo";
+        assertArrayEquals(new String[]{"Bar", "Foo", "Non-exist"}, rd.getEntryNames(ns).toArray());
+        assertEquals(0, rd.getRetrievedEntryNames(ns).size());
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Foo"));
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Bar"));
+        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
+        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
+
+        // Now check the returned CBOR ... note how it only has entries _and_ namespaces
+        // for data that was returned.
+        //
+        // Importantly, this is unlike the returned ResultData which mirrors one to one the passed
+        // in Map<String,Collection<String>> structure, _including_ ensuring the order is the same
+        // ... (which we - painfully - test for just above.)
+        byte[] resultCbor = rd.getAuthenticatedData();
+        String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
+        assertEquals("{\n"
+                + "  'org.example.barfoo' : {\n"
+                + "    'Bar' : 'Foo',\n"
+                + "    'Foo' : 'Bar'\n"
+                + "  },\n"
+                + "  'org.example.foobar' : {\n"
+                + "    'Bar' : 'Foo',\n"
+                + "    'Foo' : 'Bar'\n"
+                + "  }\n"
+                + "}", pretty);
+
+        store.deleteCredentialByName("test");
+    }
+
+    @Test
+    public void testUpdateCredential()
+            throws IdentityCredentialException, CborException,
+            NoSuchAlgorithmException {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+        assumeTrue(store.getCapabilities().isUpdateSupported());
+
+        // Create the credential...
+        //
+        String credentialName = "test";
+        String exampleDocType = "org.example.myDocType";
+        String exampleNs = "org.example.ns";
+        byte[] challenge = {0x01, 0x02};
+        int acpId = 3;
+        store.deleteCredentialByName(credentialName);
+        WritableIdentityCredential wc = store.createCredential(credentialName, exampleDocType);
+        Collection<X509Certificate> certChain = wc.getCredentialKeyCertificateChain(challenge);
+        AccessControlProfile noAuthProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(acpId))
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
+        idsNoAuth.add(new AccessControlProfileId(acpId));
+        PersonalizationData personalizationData =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(noAuthProfile)
+                        .putEntry(exampleNs, "first_name", idsNoAuth,
+                                Util.cborEncodeString("John"))
+                        .putEntry(exampleNs, "last_name", idsNoAuth,
+                                Util.cborEncodeString("Smith"))
+                        .build();
+        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
+        byte[] proofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(proofOfProvisioningSignature));
+        byte[] proofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
+                proofOfProvisioning);
+        String pretty = Util.cborPrettyPrint(proofOfProvisioning);
+        assertEquals("[\n"
+                + "  'ProofOfProvisioning',\n"
+                + "  '" + exampleDocType + "',\n"
+                + "  [\n"
+                + "    {\n"
+                + "      'id' : " + acpId + "\n"
+                + "    }\n"
+                + "  ],\n"
+                + "  {\n"
+                + "    '" + exampleNs + "' : [\n"
+                + "      {\n"
+                + "        'name' : 'first_name',\n"
+                + "        'value' : 'John',\n"
+                + "        'accessControlProfiles' : [" + acpId + "]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'last_name',\n"
+                + "        'value' : 'Smith',\n"
+                + "        'accessControlProfiles' : [" + acpId + "]\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  },\n"
+                + "  false\n"
+                + "]", pretty);
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(proofOfProvisioningSignature),
+                new byte[0], // Additional data
+                certChain.iterator().next().getPublicKey()));
+
+        IdentityCredential credential = store.getCredentialByName("test",
+                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+
+        // Configure to use 3 auth keys and endorse all of them
+        credential.setAvailableAuthenticationKeys(3, 5);
+        Collection<X509Certificate> certificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(3, certificates.size());
+        for (X509Certificate cert : certificates) {
+            credential.storeStaticAuthenticationData(cert, new byte[]{1, 2});
+            // Check each cert has the correct ProofOfProvisioning SHA-256 in the
+            // ProofOfBinding CBOR stored at OID 1.3.6.1.4.1.11129.2.1.26
+            byte[] popSha256FromCert = Util.getPopSha256FromAuthKeyCert(cert);
+            assertArrayEquals(popSha256FromCert, proofOfProvisioningSha256);
+        }
+        assertEquals(0, credential.getAuthKeysNeedingCertification().size());
+
+        // Update the credential
+        AccessControlProfile updNoAuthProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(31))
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        Collection<AccessControlProfileId> updIds = new ArrayList<AccessControlProfileId>();
+        updIds.add(new AccessControlProfileId(31));
+        String updNs = "org.iso.other_ns";
+        PersonalizationData updPd =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(updNoAuthProfile)
+                        .putEntry(updNs, "first_name", updIds,
+                                Util.cborEncodeString("Lawrence"))
+                        .putEntry(updNs, "last_name", updIds,
+                                Util.cborEncodeString("Waterhouse"))
+                        .build();
+
+        byte[] updProofOfProvisioningSignature = credential.update(updPd);
+
+        // Check the ProofOfProvisioning for the updated data (contents _and_ signature)
+        byte[] updProofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(updProofOfProvisioningSignature));
+        byte[] updProofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
+                updProofOfProvisioning);
+        pretty = Util.cborPrettyPrint(updProofOfProvisioning);
+        assertEquals("[\n"
+                + "  'ProofOfProvisioning',\n"
+                + "  '" + exampleDocType + "',\n"
+                + "  [\n"
+                + "    {\n"
+                + "      'id' : 31\n"
+                + "    }\n"
+                + "  ],\n"
+                + "  {\n"
+                + "    'org.iso.other_ns' : [\n"
+                + "      {\n"
+                + "        'name' : 'first_name',\n"
+                + "        'value' : 'Lawrence',\n"
+                + "        'accessControlProfiles' : [31]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'last_name',\n"
+                + "        'value' : 'Waterhouse',\n"
+                + "        'accessControlProfiles' : [31]\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  },\n"
+                + "  false\n"
+                + "]", pretty);
+        assertTrue(Util.coseSign1CheckSignature(
+                Util.cborDecode(updProofOfProvisioningSignature),
+                new byte[0], // Additional data
+                certChain.iterator().next().getPublicKey()));
+        // Check the returned CredentialKey cert chain from the now updated
+        // IdentityCredential matches the original certificate chain.
+        //
+        Collection<X509Certificate> readBackCertChain =
+                credential.getCredentialKeyCertificateChain();
+        assertEquals(certChain.size(), readBackCertChain.size());
+        Iterator<X509Certificate> it = readBackCertChain.iterator();
+        for (X509Certificate expectedCert : certChain) {
+            X509Certificate readBackCert = it.next();
+            assertEquals(expectedCert, readBackCert);
+        }
+
+        // Check that the credential is still configured to use 3 auth keys and
+        // that they all need replacement... then check and endorse the
+        // replacements
+        Collection<X509Certificate> updCertificates = credential.getAuthKeysNeedingCertification();
+        assertEquals(3, updCertificates.size());
+        for (X509Certificate cert : updCertificates) {
+            credential.storeStaticAuthenticationData(cert, new byte[]{1, 2});
+            // Check each cert has the correct - *updated* - ProofOfProvisioning SHA-256 in the
+            // ProofOfBinding CBOR stored at OID 1.3.6.1.4.1.11129.2.1.25
+            byte[] popSha256FromCert = Util.getPopSha256FromAuthKeyCert(cert);
+            assertArrayEquals(popSha256FromCert, updProofOfProvisioningSha256);
+        }
+        assertEquals(0, credential.getAuthKeysNeedingCertification().size());
+
+        // Check we can read back the updated data and it matches what we
+        // updated it to.
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put(updNs,
+                Arrays.asList("first_name",
+                        "last_name"));
+        ResultData rd = credential.getEntries(
+                Util.createItemsRequest(entriesToRequest, null),
+                entriesToRequest,
+                null);
+
+        Collection<String> resultNamespaces = rd.getNamespaces();
+        assertEquals(resultNamespaces.size(), 1);
+        assertEquals(updNs, resultNamespaces.iterator().next());
+        assertEquals(2, rd.getEntryNames(updNs).size());
+
+        assertEquals("Lawrence", rd.getEntryString(updNs, "first_name"));
+        assertEquals("Waterhouse", rd.getEntryString(updNs, "last_name"));
+
+        store.deleteCredentialByName("test");
+    }
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/ReaderAuthTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/ReaderAuthTest.java
new file mode 100644
index 0000000..63a65fe
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/ReaderAuthTest.java
@@ -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.security.identity;
+
+import static androidx.security.identity.IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256;
+import static androidx.security.identity.ResultData.STATUS_NOT_IN_REQUEST_MESSAGE;
+import static androidx.security.identity.ResultData.STATUS_OK;
+import static androidx.security.identity.ResultData.STATUS_READER_AUTHENTICATION_FAILED;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SignatureException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import co.nstant.in.cbor.CborBuilder;
+import co.nstant.in.cbor.CborException;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class ReaderAuthTest {
+    private static final String TAG = "ReaderAuthTest";
+
+
+    static KeyPair createReaderKey(String readerKeyAlias, boolean createCaKey)
+            throws InvalidAlgorithmParameterException, NoSuchProviderException,
+            NoSuchAlgorithmException {
+        KeyPairGenerator kpg = KeyPairGenerator.getInstance(
+                KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
+        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
+                readerKeyAlias,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512);
+        kpg.initialize(builder.build());
+        return kpg.generateKeyPair();
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void readerAuth()
+            throws IdentityCredentialException, CborException, InvalidAlgorithmParameterException,
+            KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException,
+            NoSuchProviderException, InvalidKeyException, SignatureException {
+
+        // We create two reader keys - 'A' and 'B' - and then generate certificates for each of
+        // them, signed by a third key 'C'. We then provision a document with four elements where
+        // each element is configured to be accessible only by 'A', 'B', ('A' or 'B'), and 'C'
+        // respectively. The names of each element reflect this:
+        //
+        //  - "Accessible by A"
+        //  - "Accessible by B"
+        //  - "Accessible by A or B"
+        //  - "Accessible by C"
+        //
+        // We then try reading from the credential in the following cases
+        //
+        //  - Request signed by A and presenting certChain {certA}
+        //    - this should return the following data elements:
+        //      - "Accessible by A"
+        //      - "Accessible by A or B"
+        //
+        //  - Request signed by A and presenting certChain {certA_SignedBy_certC, certC}
+        //    - this should return the following data elements:
+        //      - "Accessible by A"
+        //      - "Accessible by A or B"
+        //      - "Accessible by C"
+        //
+        //  - Request signed by B and presenting certChain {certB}
+        //    - this should return the following data elements:
+        //      - "Accessible by B"
+        //      - "Accessible by A or B"
+        //
+        //  - Request signed by B and presenting certChain {certB_SignedBy_certC, certC}
+        //    - this should return the following data elements:
+        //      - "Accessible by B"
+        //      - "Accessible by A or B"
+        //      - "Accessible by C"
+        //
+        //  - Reader presenting an invalid certificate chain
+        //
+        // We test all this in the following.
+        //
+
+
+        // Generate keys and certificate chains.
+        KeyPair readerKeyPairA = createReaderKey("readerKeyA", false);
+        KeyPair readerKeyPairB = createReaderKey("readerKeyB", false);
+        KeyPair readerKeyPairC = createReaderKey("readerKeyC", true);
+
+        KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
+        ks.load(null);
+        X509Certificate certA = (X509Certificate) ks.getCertificate("readerKeyA");
+        X509Certificate certB = (X509Certificate) ks.getCertificate("readerKeyB");
+        X509Certificate certA_SignedBy_certC = Util.signPublicKeyWithPrivateKey("readerKeyA",
+                "readerKeyC");
+        X509Certificate certB_SignedBy_certC = Util.signPublicKeyWithPrivateKey("readerKeyB",
+                "readerKeyC");
+        X509Certificate certC = (X509Certificate) ks.getCertificate("readerKeyC");
+
+        Collection<X509Certificate> certChainForA = new ArrayList<>();
+        certChainForA.add(certA);
+        Collection<X509Certificate> certChainForAwithC = new ArrayList<>();
+        certChainForAwithC.add(certA_SignedBy_certC);
+        certChainForAwithC.add(certC);
+
+        Collection<X509Certificate> certChainForB = new ArrayList<>();
+        certChainForB.add(certB);
+        Collection<X509Certificate> certChainForBwithC = new ArrayList<>();
+        certChainForBwithC.add(certB_SignedBy_certC);
+        certChainForBwithC.add(certC);
+
+        // Provision the credential.
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
+
+        String credentialName = "readerAuthTestCredential";
+        store.deleteCredentialByName(credentialName);
+        WritableIdentityCredential wc = store.createCredential(credentialName,
+                "org.iso.18013-5.2019.mdl");
+
+        // Profile 0 (reader A authentication)
+        AccessControlProfile readerAProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(0))
+                        .setReaderCertificate(certA)
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        // Profile 1 (reader B authentication)
+        AccessControlProfile readerBProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(1))
+                        .setReaderCertificate(certB)
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        // Profile 2 (reader C authentication)
+        AccessControlProfile readerCProfile =
+                new AccessControlProfile.Builder(new AccessControlProfileId(2))
+                        .setReaderCertificate(certC)
+                        .setUserAuthenticationRequired(false)
+                        .build();
+        Collection<AccessControlProfileId> idsReaderAuthA =
+                new ArrayList<AccessControlProfileId>();
+        idsReaderAuthA.add(new AccessControlProfileId(0));
+        Collection<AccessControlProfileId> idsReaderAuthB =
+                new ArrayList<AccessControlProfileId>();
+        idsReaderAuthB.add(new AccessControlProfileId(1));
+        Collection<AccessControlProfileId> idsReaderAuthAorB =
+                new ArrayList<AccessControlProfileId>();
+        idsReaderAuthAorB.add(new AccessControlProfileId(0));
+        idsReaderAuthAorB.add(new AccessControlProfileId(1));
+        Collection<AccessControlProfileId> idsReaderAuthC =
+                new ArrayList<AccessControlProfileId>();
+        idsReaderAuthC.add(new AccessControlProfileId(2));
+        String mdlNs = "org.iso.18013-5.2019";
+        PersonalizationData personalizationData =
+                new PersonalizationData.Builder()
+                        .addAccessControlProfile(readerAProfile)
+                        .addAccessControlProfile(readerBProfile)
+                        .addAccessControlProfile(readerCProfile)
+                        .putEntry(mdlNs, "Accessible to A", idsReaderAuthA,
+                                Util.cborEncodeString("foo"))
+                        .putEntry(mdlNs, "Accessible to B", idsReaderAuthB,
+                                Util.cborEncodeString("bar"))
+                        .putEntry(mdlNs, "Accessible to A or B", idsReaderAuthAorB,
+                                Util.cborEncodeString("baz"))
+                        .putEntry(mdlNs, "Accessible to C", idsReaderAuthC,
+                                Util.cborEncodeString("bat"))
+                        .build();
+        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
+        byte[] proofOfProvisioning =
+                Util.coseSign1GetData(Util.cborDecode(proofOfProvisioningSignature));
+
+        String pretty = Util.cborPrettyPrint(proofOfProvisioning);
+        pretty = Util.replaceLine(pretty, 6, "      'readerCertificate' : [] // Removed");
+        pretty = Util.replaceLine(pretty, 10, "      'readerCertificate' : [] // Removed");
+        pretty = Util.replaceLine(pretty, 14, "      'readerCertificate' : [] // Removed");
+        assertEquals("[\n"
+                + "  'ProofOfProvisioning',\n"
+                + "  'org.iso.18013-5.2019.mdl',\n"
+                + "  [\n"
+                + "    {\n"
+                + "      'id' : 0,\n"
+                + "      'readerCertificate' : [] // Removed\n"
+                + "    },\n"
+                + "    {\n"
+                + "      'id' : 1,\n"
+                + "      'readerCertificate' : [] // Removed\n"
+                + "    },\n"
+                + "    {\n"
+                + "      'id' : 2,\n"
+                + "      'readerCertificate' : [] // Removed\n"
+                + "    }\n"
+                + "  ],\n"
+                + "  {\n"
+                + "    'org.iso.18013-5.2019' : [\n"
+                + "      {\n"
+                + "        'name' : 'Accessible to A',\n"
+                + "        'value' : 'foo',\n"
+                + "        'accessControlProfiles' : [0]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Accessible to B',\n"
+                + "        'value' : 'bar',\n"
+                + "        'accessControlProfiles' : [1]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Accessible to A or B',\n"
+                + "        'value' : 'baz',\n"
+                + "        'accessControlProfiles' : [0, 1]\n"
+                + "      },\n"
+                + "      {\n"
+                + "        'name' : 'Accessible to C',\n"
+                + "        'value' : 'bat',\n"
+                + "        'accessControlProfiles' : [2]\n"
+                + "      }\n"
+                + "    ]\n"
+                + "  },\n"
+                + "  false\n"
+                + "]", pretty);
+
+
+        // Get the credential we'll be reading from and provision it with a sufficient number
+        // of dynamic auth keys
+        IdentityCredential credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        assertNotNull(credential);
+        credential.setAvailableAuthenticationKeys(1, 10);
+        Collection<X509Certificate> dynAuthKeyCerts = credential.getAuthKeysNeedingCertification();
+        credential.storeStaticAuthenticationData(dynAuthKeyCerts.iterator().next(), new byte[0]);
+        KeyPair eKeyPair = credential.createEphemeralKeyPair();
+
+        Collection<String> entryNames;
+        Collection<String> resultNamespaces;
+        ResultData rd;
+
+        // Create the request message which will be signed by the reader.
+        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
+        entriesToRequest.put("org.iso.18013-5.2019",
+                Arrays.asList("Accessible to A",
+                        "Accessible to B",
+                        "Accessible to A or B",
+                        "Accessible to C"));
+        byte[] requestMessage = Util.createItemsRequest(entriesToRequest,
+                "org.iso.18013-5.2019.mdl");
+
+        // Signing with A and presenting cert chain {certA}.
+        //
+        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForA, requestMessage,
+                entriesToRequest);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(2, entryNames.size());
+        assertTrue(entryNames.contains("Accessible to A"));
+        assertTrue(entryNames.contains("Accessible to A or B"));
+        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
+        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED, rd.getStatus("org.iso.18013-5.2019",
+                "Accessible to B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED, rd.getStatus("org.iso.18013-5.2019",
+                "Accessible to C"));
+
+        // Signing with A and presenting cert chain {certA} and providing a requestMessage
+        // that doesn't request "Accessible to A or B" in the signed |requestMessage| but
+        // includes it in |entriesToRequest| (which is not signed)... should result
+        // in requesting "Accessible to A or B" failing with NOT_IN_REQUEST_MESSAGE
+        // and "Accessible to B" and "Accessible to C" failing with
+        // READER_AUTHENTICATION_FAILED.
+        //
+        Map<String, Collection<String>> entriesToRequest2 = new LinkedHashMap<>();
+        entriesToRequest2.put("org.iso.18013-5.2019",
+                Arrays.asList("Accessible to A",
+                        "Accessible to B",
+                        "Accessible to C"));
+        byte[] requestMessage2 = Util.createItemsRequest(entriesToRequest2,
+                "org.iso.18013-5.2019.mdl");
+        credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        eKeyPair = credential.createEphemeralKeyPair();
+        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForA,
+                requestMessage2, entriesToRequest);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(1, entryNames.size());
+        assertTrue(entryNames.contains("Accessible to A"));
+        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
+        assertEquals(STATUS_NOT_IN_REQUEST_MESSAGE,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to C"));
+
+        // Signing with A and presenting cert chain {certA_SignedBy_certC, certC}.
+        //
+        credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        eKeyPair = credential.createEphemeralKeyPair();
+        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForAwithC,
+                requestMessage, entriesToRequest);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(3, entryNames.size());
+        assertTrue(entryNames.contains("Accessible to A"));
+        assertTrue(entryNames.contains("Accessible to A or B"));
+        assertTrue(entryNames.contains("Accessible to C"));
+
+        // Signing with B and presenting cert chain {certB}.
+        //
+        credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        eKeyPair = credential.createEphemeralKeyPair();
+        rd = retrieveForReader(credential, eKeyPair, readerKeyPairB, certChainForB, requestMessage,
+                entriesToRequest);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(2, entryNames.size());
+        assertTrue(entryNames.contains("Accessible to B"));
+        assertTrue(entryNames.contains("Accessible to A or B"));
+
+        // Signing with B and presenting cert chain {certB_SignedBy_certC, certC}.
+        //
+        credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        eKeyPair = credential.createEphemeralKeyPair();
+        rd = retrieveForReader(credential, eKeyPair, readerKeyPairB, certChainForBwithC,
+                requestMessage, entriesToRequest);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(3, entryNames.size());
+        assertTrue(entryNames.contains("Accessible to B"));
+        assertTrue(entryNames.contains("Accessible to A or B"));
+        assertTrue(entryNames.contains("Accessible to C"));
+
+        // Signing with B and presenting invalid cert chain {certB, certC} should fail
+        // because certB is not signed by certC.
+        try {
+            credential = store.getCredentialByName(credentialName,
+                    CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+            eKeyPair = credential.createEphemeralKeyPair();
+            Collection<X509Certificate> certChain = new ArrayList<>();
+            certChain.add(certB);
+            certChain.add(certC);
+            retrieveForReader(credential, eKeyPair, readerKeyPairB, certChain, requestMessage,
+                    entriesToRequest);
+            assertTrue(false);
+        } catch (InvalidReaderSignatureException e) {
+            // Do nothing, this is the expected exception...
+        }
+
+        // No request message should result in returning zero data elements - they're
+        // all protected by reader authentication.
+        //
+        credential = store.getCredentialByName(credentialName,
+                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
+        eKeyPair = credential.createEphemeralKeyPair();
+        rd = credential.getEntries(
+                null,
+                entriesToRequest,
+                null);
+        resultNamespaces = rd.getNamespaces();
+        assertEquals(1, resultNamespaces.size());
+        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
+        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
+        assertEquals(0, entryNames.size());
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to B"));
+        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
+                rd.getStatus("org.iso.18013-5.2019", "Accessible to C"));
+    }
+
+    private ResultData retrieveForReader(
+            IdentityCredential credential,
+            KeyPair ephemeralKeyPair,
+            KeyPair readerKeyToSignWith,
+            Collection<X509Certificate> readerCertificateChainToPresent,
+            byte[] requestMessage,
+            Map<String, Collection<String>> entriesToRequest)
+            throws IdentityCredentialException, CborException, InvalidAlgorithmParameterException,
+            KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException,
+            NoSuchProviderException, InvalidKeyException, SignatureException {
+
+        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
+
+        // Finally, create the structure that the reader signs, and sign it.
+
+        byte[] readerAuthentication = Util.cborEncode(new CborBuilder()
+                .addArray()
+                .add("ReaderAuthentication")
+                .add(Util.cborDecode(sessionTranscript))
+                .add(Util.cborBuildTaggedByteString(requestMessage))
+                .end()
+                .build().get(0));
+        byte[] readerAuthenticationBytes =
+                Util.cborEncode(Util.cborBuildTaggedByteString((readerAuthentication)));
+        byte[] readerSignature = Util.cborEncode(
+                Util.coseSign1Sign(readerKeyToSignWith.getPrivate(),
+                null, // payload
+                readerAuthenticationBytes, // detached content
+                readerCertificateChainToPresent)); // certificate-chain
+
+        // Now issue the request.
+        credential.setSessionTranscript(sessionTranscript);
+        ResultData result = credential.getEntries(
+                requestMessage,
+                entriesToRequest,
+                readerSignature);
+        return result;
+    }
+
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/UtilUnitTests.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/UtilUnitTests.java
new file mode 100644
index 0000000..f58cf5c
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/UtilUnitTests.java
@@ -0,0 +1,486 @@
+/*
+ * 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.security.identity;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.icu.util.Calendar;
+import android.icu.util.GregorianCalendar;
+import android.icu.util.TimeZone;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.cert.X509Certificate;
+import java.util.LinkedList;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+import co.nstant.in.cbor.CborBuilder;
+import co.nstant.in.cbor.CborEncoder;
+import co.nstant.in.cbor.CborException;
+import co.nstant.in.cbor.builder.ArrayBuilder;
+import co.nstant.in.cbor.model.ByteString;
+import co.nstant.in.cbor.model.DataItem;
+import co.nstant.in.cbor.model.DoublePrecisionFloat;
+import co.nstant.in.cbor.model.HalfPrecisionFloat;
+import co.nstant.in.cbor.model.NegativeInteger;
+import co.nstant.in.cbor.model.SimpleValue;
+import co.nstant.in.cbor.model.SimpleValueType;
+import co.nstant.in.cbor.model.SinglePrecisionFloat;
+import co.nstant.in.cbor.model.UnicodeString;
+import co.nstant.in.cbor.model.UnsignedInteger;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class UtilUnitTests {
+    @Test
+    public void prettyPrintMultipleCompleteTypes() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .add("text")                // add string
+                .add(1234)                  // add integer
+                .add(new byte[]{0x10})   // add byte array
+                .addArray()                 // add array
+                .add(1)
+                .add("text")
+                .end()
+                .build());
+        assertEquals("'text',\n"
+                + "1234,\n"
+                + "[0x10],\n"
+                + "[1, 'text']", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintString() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new UnicodeString("foobar"));
+        assertEquals("'foobar'", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintBytestring() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new ByteString(new byte[]{1, 2, 33, (byte) 254}));
+        assertEquals("[0x01, 0x02, 0x21, 0xfe]", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintUnsignedInteger() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new UnsignedInteger(42));
+        assertEquals("42", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintNegativeInteger() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new NegativeInteger(-42));
+        assertEquals("-42", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintDouble() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new DoublePrecisionFloat(1.1));
+        assertEquals("1.1", Util.cborPrettyPrint(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new DoublePrecisionFloat(-42.0000000001));
+        assertEquals("-42.0000000001", Util.cborPrettyPrint(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new DoublePrecisionFloat(-5));
+        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintFloat() throws CborException {
+        ByteArrayOutputStream baos;
+
+        // TODO: These two tests yield different results on different devices, disable for now
+        /*
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SinglePrecisionFloat(1.1f));
+        assertEquals("1.100000023841858", Util.cborPrettyPrint(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SinglePrecisionFloat(-42.0001f));
+        assertEquals("-42.000099182128906", Util.cborPrettyPrint(baos.toByteArray()));
+        */
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SinglePrecisionFloat(-5f));
+        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintHalfFloat() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new HalfPrecisionFloat(1.1f));
+        assertEquals("1.099609375", Util.cborPrettyPrint(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new HalfPrecisionFloat(-42.0001f));
+        assertEquals("-42", Util.cborPrettyPrint(baos.toByteArray()));
+
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new HalfPrecisionFloat(-5f));
+        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintFalse() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.FALSE));
+        assertEquals("false", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintTrue() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.TRUE));
+        assertEquals("true", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintNull() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.NULL));
+        assertEquals("null", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintUndefined() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.UNDEFINED));
+        assertEquals("undefined", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintTag() throws CborException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addTag(0)
+                .add("ABC")
+                .build());
+        byte[] data = baos.toByteArray();
+        assertEquals("tag 0 'ABC'", Util.cborPrettyPrint(data));
+    }
+
+    @Test
+    public void prettyPrintArrayNoCompounds() throws CborException {
+        // If an array has no compound elements, no newlines are used.
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addArray()                 // add array
+                .add(1)
+                .add("text")
+                .add(new ByteString(new byte[]{1, 2, 3}))
+                .end()
+                .build());
+        assertEquals("[1, 'text', [0x01, 0x02, 0x03]]", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintArray() throws CborException {
+        // This array contains a compound value so will use newlines
+        CborBuilder array = new CborBuilder();
+        ArrayBuilder<CborBuilder> arrayBuilder = array.addArray();
+        arrayBuilder.add(2);
+        arrayBuilder.add(3);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addArray()                 // add array
+                .add(1)
+                .add("text")
+                .add(new ByteString(new byte[]{1, 2, 3}))
+                .add(array.build().get(0))
+                .end()
+                .build());
+        assertEquals("[\n"
+                + "  1,\n"
+                + "  'text',\n"
+                + "  [0x01, 0x02, 0x03],\n"
+                + "  [2, 3]\n"
+                + "]", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void prettyPrintMap() throws CborException {
+        // If an array has no compound elements, no newlines are used.
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addMap()
+                .put("Foo", 42)
+                .put("Bar", "baz")
+                .put(43, 44)
+                .put(new UnicodeString("bstr"), new ByteString(new byte[]{1, 2, 3}))
+                .put(new ByteString(new byte[]{1, 2, 3}), new UnicodeString("other way"))
+                .end()
+                .build());
+        assertEquals("{\n"
+                + "  43 : 44,\n"
+                + "  [0x01, 0x02, 0x03] : 'other way',\n"
+                + "  'Bar' : 'baz',\n"
+                + "  'Foo' : 42,\n"
+                + "  'bstr' : [0x01, 0x02, 0x03]\n"
+                + "}", Util.cborPrettyPrint(baos.toByteArray()));
+    }
+
+    @Test
+    public void cborEncodeDecode() {
+        // TODO: add better coverage and check specific encoding etc.
+        assertEquals(42, Util.cborDecodeLong(Util.cborEncodeNumber(42)));
+        assertEquals(123456, Util.cborDecodeLong(Util.cborEncodeNumber(123456)));
+        assertFalse(Util.cborDecodeBoolean(Util.cborEncodeBoolean(false)));
+        assertTrue(Util.cborDecodeBoolean(Util.cborEncodeBoolean(true)));
+    }
+
+    @Test
+    public void cborEncodeDecodeCalendar() throws CborException {
+        GregorianCalendar c;
+        byte[] data;
+
+        c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+        c.clear();
+        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
+        data = Util.cborEncodeDateTime(c);
+        assertEquals("tag 0 '2019-07-08T11:51:42Z'", Util.cborPrettyPrint(data));
+        assertEquals("tag 0 '2019-07-08T11:51:42Z'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+        assertEquals(0, c.compareTo(Util.cborDecodeDateTime(data)));
+
+        c = new GregorianCalendar(TimeZone.getTimeZone("GMT-04:00"));
+        c.clear();
+        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
+        data = Util.cborEncodeDateTime(c);
+        assertEquals("tag 0 '2019-07-08T11:51:42-04:00'", Util.cborPrettyPrint(data));
+        assertEquals("tag 0 '2019-07-08T11:51:42-04:00'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+        assertEquals(0, c.compareTo(Util.cborDecodeDateTime(data)));
+
+        c = new GregorianCalendar(TimeZone.getTimeZone("GMT-08:00"));
+        c.clear();
+        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
+        data = Util.cborEncodeDateTime(c);
+        assertEquals("tag 0 '2019-07-08T11:51:42-08:00'", Util.cborPrettyPrint(data));
+        assertEquals("tag 0 '2019-07-08T11:51:42-08:00'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+        assertEquals(0, c.compareTo(Util.cborDecodeDateTime(data)));
+
+        c = new GregorianCalendar(TimeZone.getTimeZone("GMT+04:30"));
+        c.clear();
+        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
+        data = Util.cborEncodeDateTime(c);
+        assertEquals("tag 0 '2019-07-08T11:51:42+04:30'", Util.cborPrettyPrint(data));
+        assertEquals("tag 0 '2019-07-08T11:51:42+04:30'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+        assertEquals(0, c.compareTo(Util.cborDecodeDateTime(data)));
+    }
+
+    @Test
+    public void cborCalendarMilliseconds() throws CborException {
+        Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+        c.clear();
+        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
+        c.set(Calendar.MILLISECOND, 123);
+        byte[] data = Util.cborEncodeDateTime(c);
+        assertEquals("tag 0 '2019-07-08T11:51:42.123Z'", Util.cborPrettyPrint(data));
+        assertEquals("tag 0 '2019-07-08T11:51:42.123Z'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+        assertEquals(0, c.compareTo(Util.cborDecodeDateTime(data)));
+    }
+
+    @Test
+    public void cborCalendarForeign() throws CborException {
+        ByteArrayOutputStream baos;
+        byte[] data;
+
+        // milliseconds, non-standard format
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addTag(0)
+                .add("2019-07-08T11:51:42.25Z")
+                .build());
+        data = baos.toByteArray();
+        assertEquals("tag 0 '2019-07-08T11:51:42.250Z'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+
+        // milliseconds set to 0
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addTag(0)
+                .add("2019-07-08T11:51:42.0Z")
+                .build());
+        data = baos.toByteArray();
+        assertEquals("tag 0 '2019-07-08T11:51:42Z'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+
+        // we only support millisecond-precision
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addTag(0)
+                .add("2019-07-08T11:51:42.9876Z")
+                .build());
+        data = baos.toByteArray();
+        assertEquals("tag 0 '2019-07-08T11:51:42.987Z'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+
+        // milliseconds and timezone
+        baos = new ByteArrayOutputStream();
+        new CborEncoder(baos).encode(new CborBuilder()
+                .addTag(0)
+                .add("2019-07-08T11:51:42.26-11:30")
+                .build());
+        data = baos.toByteArray();
+        assertEquals("tag 0 '2019-07-08T11:51:42.260-11:30'",
+                Util.cborPrettyPrint(Util.cborEncodeDateTime(Util.cborDecodeDateTime(data))));
+    }
+
+    private KeyPair coseGenerateKeyPair() throws Exception {
+        KeyPairGenerator kpg = KeyPairGenerator.getInstance(
+                KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
+        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
+                "coseTestKeyPair",
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512);
+        kpg.initialize(builder.build());
+        return kpg.generateKeyPair();
+    }
+
+    @Test
+    public void coseSignAndVerify() throws Exception {
+        KeyPair keyPair = coseGenerateKeyPair();
+        byte[] data = new byte[]{0x10, 0x11, 0x12, 0x13};
+        byte[] detachedContent = new byte[]{};
+        DataItem sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, null);
+        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
+        assertArrayEquals(data, Util.coseSign1GetData(sig));
+        assertEquals(0, Util.coseSign1GetX5Chain(sig).size());
+    }
+
+    @Test
+    public void coseSignAndVerifyDetachedContent() throws Exception {
+        KeyPair keyPair = coseGenerateKeyPair();
+        byte[] data = new byte[]{};
+        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
+        DataItem sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, null);
+        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
+        assertArrayEquals(data, Util.coseSign1GetData(sig));
+        assertEquals(0, Util.coseSign1GetX5Chain(sig).size());
+    }
+
+    @Test
+    public void coseSignAndVerifySingleCertificate() throws Exception {
+        KeyPair keyPair = coseGenerateKeyPair();
+        byte[] data = new byte[]{};
+        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
+        LinkedList<X509Certificate> certs = new LinkedList<X509Certificate>();
+        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
+        DataItem sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, certs);
+        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
+        assertArrayEquals(data, Util.coseSign1GetData(sig));
+        assertEquals(certs, Util.coseSign1GetX5Chain(sig));
+    }
+
+    @Test
+    public void coseSignAndVerifyMultipleCertificates() throws Exception {
+        KeyPair keyPair = coseGenerateKeyPair();
+        byte[] data = new byte[]{};
+        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
+        LinkedList<X509Certificate> certs = new LinkedList<X509Certificate>();
+        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
+        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
+        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
+        DataItem sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, certs);
+        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
+        assertArrayEquals(data, Util.coseSign1GetData(sig));
+        assertEquals(certs, Util.coseSign1GetX5Chain(sig));
+    }
+
+    @Test
+    public void coseMac0() throws Exception {
+        SecretKey secretKey = new SecretKeySpec(new byte[32], "");
+        byte[] data = new byte[]{0x10, 0x11, 0x12, 0x13};
+        byte[] detachedContent = new byte[]{};
+        DataItem mac = Util.coseMac0(secretKey, data, detachedContent);
+        assertEquals("[\n"
+                + "  [0xa1, 0x01, 0x05],\n"
+                + "  {},\n"
+                + "  [0x10, 0x11, 0x12, 0x13],\n"
+                + "  [0x6c, 0xec, 0xb5, 0x6a, 0xc9, 0x5c, 0xae, 0x3b, 0x41, 0x13, 0xde, 0xa4, "
+                + "0xd8, 0x86, 0x5c, 0x28, 0x2c, 0xd5, 0xa5, 0x13, 0xff, 0x3b, 0xd1, 0xde, 0x70, "
+                + "0x5e, 0xbb, 0xe2, 0x2d, 0x42, 0xbe, 0x53]\n"
+                + "]", Util.cborPrettyPrint(mac));
+    }
+
+    @Test
+    public void coseMac0DetachedContent() throws Exception {
+        SecretKey secretKey = new SecretKeySpec(new byte[32], "");
+        byte[] data = new byte[]{};
+        byte[] detachedContent = new byte[]{0x10, 0x11, 0x12, 0x13};
+        DataItem mac = Util.coseMac0(secretKey, data, detachedContent);
+        // Same HMAC as in coseMac0 test, only difference is that payload is null.
+        assertEquals("[\n"
+                + "  [0xa1, 0x01, 0x05],\n"
+                + "  {},\n"
+                + "  null,\n"
+                + "  [0x6c, 0xec, 0xb5, 0x6a, 0xc9, 0x5c, 0xae, 0x3b, 0x41, 0x13, 0xde, 0xa4, "
+                + "0xd8, 0x86, 0x5c, 0x28, 0x2c, 0xd5, 0xa5, 0x13, 0xff, 0x3b, 0xd1, 0xde, 0x70, "
+                + "0x5e, 0xbb, 0xe2, 0x2d, 0x42, 0xbe, 0x53]\n"
+                + "]", Util.cborPrettyPrint(mac));
+    }
+
+    @Test
+    public void replaceLineTest() {
+        assertEquals("foo",
+                Util.replaceLine("Hello World", 0, "foo"));
+        assertEquals("foo\n",
+                Util.replaceLine("Hello World\n", 0, "foo"));
+        assertEquals("Hello World",
+                Util.replaceLine("Hello World", 1, "foo"));
+        assertEquals("Hello World\n",
+                Util.replaceLine("Hello World\n", 1, "foo"));
+        assertEquals("foo\ntwo\nthree",
+                Util.replaceLine("one\ntwo\nthree", 0, "foo"));
+        assertEquals("one\nfoo\nthree",
+                Util.replaceLine("one\ntwo\nthree", 1, "foo"));
+        assertEquals("one\ntwo\nfoo",
+                Util.replaceLine("one\ntwo\nthree", 2, "foo"));
+        assertEquals("one\ntwo\nfoo",
+                Util.replaceLine("one\ntwo\nthree", -1, "foo"));
+        assertEquals("one\ntwo\nthree\nfoo",
+                Util.replaceLine("one\ntwo\nthree\nfour", -1, "foo"));
+        assertEquals("one\ntwo\nfoo\nfour",
+                Util.replaceLine("one\ntwo\nthree\nfour", -2, "foo"));
+    }
+
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/X509CertificateSigningTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/X509CertificateSigningTest.java
new file mode 100644
index 0000000..09578b2
--- /dev/null
+++ b/security/identity-credential/src/androidTest/java/androidx/security/identity/X509CertificateSigningTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.security.identity;
+
+import static junit.framework.TestCase.assertNotNull;
+import static junit.framework.TestCase.assertTrue;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+
+import android.content.Context;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+import android.util.AtomicFile;
+import android.util.Log;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SignatureException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+@SuppressWarnings("deprecation")
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class X509CertificateSigningTest {
+
+    private static final String TAG = "X509CertificateSigningTest";
+
+    @Test
+    public void testSigning() {
+        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
+
+        String keyToSignAlias = "testKeyToSign";
+        String keyToSignWithAlias = "testKeyToSignWith";
+
+        KeyStore ks = null;
+        try {
+            ks = KeyStore.getInstance("AndroidKeyStore");
+            ks.load(null);
+            ks.deleteEntry(keyToSignAlias);
+            ks.deleteEntry(keyToSignWithAlias);
+            assertFalse(ks.containsAlias(keyToSignAlias));
+            assertFalse(ks.containsAlias(keyToSignWithAlias));
+
+            KeyPairGenerator kpg = KeyPairGenerator.getInstance(
+                    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
+
+            kpg.initialize(new KeyGenParameterSpec.Builder(
+                    keyToSignAlias,
+                    KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512).build());
+            KeyPair keyToSignKeyPair = kpg.generateKeyPair();
+
+            kpg.initialize(new KeyGenParameterSpec.Builder(
+                    keyToSignWithAlias,
+                    KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512).build());
+            KeyPair keyToSignWithKeyPair = kpg.generateKeyPair();
+
+            assertTrue(ks.containsAlias(keyToSignAlias));
+            assertTrue(ks.containsAlias(keyToSignWithAlias));
+
+            X509Certificate cert = Util.signPublicKeyWithPrivateKey(keyToSignAlias,
+                    keyToSignWithAlias);
+            assertNotNull(cert);
+            Log.d(TAG, "Cert:\n--\n" + cert.toString() + "\n--\n");
+
+            String filename = "ic_cert.bin";
+            AtomicFile file = new AtomicFile(appContext.getFileStreamPath(filename));
+            FileOutputStream outputStream = null;
+            try {
+                outputStream = file.startWrite();
+                outputStream.write(cert.getEncoded());
+                outputStream.close();
+                file.finishWrite(outputStream);
+            } catch (IOException e) {
+                if (outputStream != null) {
+                    file.failWrite(outputStream);
+                }
+                e.printStackTrace();
+                assertTrue(false);
+            }
+
+
+            // Check |cert| is for |keyToSignAlias|
+            assertArrayEquals(keyToSignKeyPair.getPublic().getEncoded(),
+                    cert.getPublicKey().getEncoded());
+
+            // Check |cert| was signed by |keyToSignWithAlias|
+            cert.verify(keyToSignWithKeyPair.getPublic());   // Throws if verification fails.
+
+        } catch (IOException
+                | InvalidAlgorithmParameterException
+                | NoSuchAlgorithmException
+                | NoSuchProviderException
+                | KeyStoreException
+                | CertificateException
+                | InvalidKeyException
+                | SignatureException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+
+        //assertTrue(false);
+    }
+
+}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/CreateItemsRequestTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/CreateItemsRequestTest.java
deleted file mode 100644
index 63f2ccc..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/CreateItemsRequestTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import co.nstant.in.cbor.CborException;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class CreateItemsRequestTest {
-    @Test
-    public void basicRequest() throws CborException {
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.test.ns", Arrays.asList("xyz", "abc"));
-
-        String docType = "org.test.ns";
-        assertEquals("{\n"
-                        + "  'docType' : 'org.test.ns',\n"
-                        + "  'nameSpaces' : {\n"
-                        + "    'org.test.ns' : {\n"
-                        + "      'abc' : false,\n"
-                        + "      'xyz' : false\n"
-                        + "    }\n"
-                        + "  }\n"
-                        + "}",
-                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, docType)));
-    }
-
-    @Test
-    public void multipleNamespaces() throws CborException {
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.test.ns1", Arrays.asList("foo", "bar"));
-        entriesToRequest.put("org.test.ns2", Arrays.asList("xyz", "abc"));
-        String docType = "org.test.ns";
-        assertEquals("{\n"
-                        + "  'docType' : 'org.test.ns',\n"
-                        + "  'nameSpaces' : {\n"
-                        + "    'org.test.ns1' : {\n"
-                        + "      'bar' : false,\n"
-                        + "      'foo' : false\n"
-                        + "    },\n"
-                        + "    'org.test.ns2' : {\n"
-                        + "      'abc' : false,\n"
-                        + "      'xyz' : false\n"
-                        + "    }\n"
-                        + "  }\n"
-                        + "}",
-                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, docType)));
-    }
-
-    @Test
-    public void noDocType() throws CborException {
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.test.ns1", Arrays.asList("foo", "bar"));
-        assertEquals("{\n"
-                        + "  'nameSpaces' : {\n"
-                        + "    'org.test.ns1' : {\n"
-                        + "      'bar' : false,\n"
-                        + "      'foo' : false\n"
-                        + "    }\n"
-                        + "  }\n"
-                        + "}",
-                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, null)));
-    }
-
-    @Test
-    public void empty() throws CborException {
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        assertEquals("{\n"
-                        + "  'nameSpaces' : {}\n"
-                        + "}",
-                Util.cborPrettyPrint(Util.createItemsRequest(entriesToRequest, null)));
-    }
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/DynamicAuthTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/DynamicAuthTest.java
deleted file mode 100644
index 039b5d9..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/DynamicAuthTest.java
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.icu.util.Calendar;
-import android.os.SystemClock;
-
-import androidx.security.identity.AccessControlProfile;
-import androidx.security.identity.AccessControlProfileId;
-import androidx.security.identity.EphemeralPublicKeyNotFoundException;
-import androidx.security.identity.IdentityCredential;
-import androidx.security.identity.IdentityCredentialException;
-import androidx.security.identity.IdentityCredentialStore;
-import androidx.security.identity.NoAuthenticationKeyAvailableException;
-import androidx.security.identity.PersonalizationData;
-import androidx.security.identity.ResultData;
-import androidx.security.identity.WritableIdentityCredential;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.ByteArrayOutputStream;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.SignatureException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.crypto.SecretKey;
-
-import co.nstant.in.cbor.CborBuilder;
-import co.nstant.in.cbor.CborEncoder;
-import co.nstant.in.cbor.CborException;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class DynamicAuthTest {
-    private static final String TAG = "DynamicAuthTest";
-
-    @SuppressWarnings("deprecation")
-    @Test
-    public void checkAuthKey() throws Exception {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        String credentialName = "test";
-
-        store.deleteCredentialByName(credentialName);
-
-        WritableIdentityCredential wc = store.createCredential(credentialName,
-                "org.iso.18013-5.2019.mdl");
-
-        byte[] challenge = "TheChallenge".getBytes();
-        Collection<X509Certificate> certChain = wc.getCredentialKeyCertificateChain(challenge);
-        // Profile 0 (no authentication)
-        AccessControlProfile noAuthProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(0))
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
-        idsNoAuth.add(new AccessControlProfileId(0));
-        String mdlNs = "org.iso.18013-5.2019";
-        PersonalizationData personalizationData =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(noAuthProfile)
-                        .putEntry(mdlNs, "First name", idsNoAuth, Util.cborEncodeString("Alan"))
-                        .putEntry(mdlNs, "Last name", idsNoAuth, Util.cborEncodeString("Turing"))
-                        .build();
-        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
-        byte[] proofOfProvisioning = Util.coseSign1GetData(proofOfProvisioningSignature);
-        byte[] proofOfProvisioningSha256 =
-                MessageDigest.getInstance("SHA256").digest(proofOfProvisioning);
-
-        IdentityCredential credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-        credential.setAvailableAuthenticationKeys(5, 3);
-        assertArrayEquals(
-                new int[]{0, 0, 0, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-
-        Collection<X509Certificate> certificates = null;
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(5, certificates.size());
-
-        X509Certificate cert = (X509Certificate) certificates.toArray()[0];
-
-        //  - serialNumber: INTEGER 1 (fixed value: same on all certs).
-        assertEquals(1, cert.getSerialNumber().intValue());
-
-        //  - issuer: CN shall be set to "Android Identity Credential Key". (fixed value:
-        //    same on all certs)
-        assertEquals("CN=Android Identity Credential Key",
-                cert.getIssuerX500Principal().getName());
-
-        //  - subject: CN shall be set to "Android Identity Credential Authentication Key". (fixed
-        //    value: same on all certs)
-        assertEquals("CN=Android Identity Credential Authentication Key",
-                cert.getSubjectX500Principal().getName());
-
-        //  - validity: should be from current time and one year in the future (365 days).
-        Date now = new Date();
-
-        // Allow for 10 seconds drift to account for the time drift and loss of precision
-        // when encoding into ASN.1
-        //
-        long diffMilliSecs = now.getTime() - cert.getNotBefore().getTime();
-        final long allowDriftMilliSecs = 10 * 1000;
-        assertTrue(-allowDriftMilliSecs <= diffMilliSecs && diffMilliSecs <= allowDriftMilliSecs);
-
-        final long kMilliSecsInOneYear = 365L * 24 * 60 * 60 * 1000;
-        diffMilliSecs =
-                cert.getNotBefore().getTime() + kMilliSecsInOneYear - cert.getNotAfter().getTime();
-        assertTrue(-allowDriftMilliSecs <= diffMilliSecs && diffMilliSecs <= allowDriftMilliSecs);
-
-        // The extension is expected only if - and only if - the underlying hardware
-        // supports updating the credential.
-        //
-        byte[] icExtension = cert.getExtensionValue("1.3.6.1.4.1.11129.2.1.26");
-        if (store.getCapabilities().isUpdateSupported()) {
-            assertNotNull(icExtension);
-            assertArrayEquals(proofOfProvisioningSha256, Util.getPopSha256FromAuthKeyCert(cert));
-        } else {
-            assertNull(icExtension);
-        }
-
-        // ... and we're done. Clean up after ourselves.
-        store.deleteCredentialByName(credentialName);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Test
-    public void dynamicAuthTest() throws Exception {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        String credentialName = "test";
-
-        store.deleteCredentialByName(credentialName);
-        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
-                credentialName);
-
-        IdentityCredential credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-        assertArrayEquals(new int[0], credential.getAuthenticationDataUsageCount());
-
-        credential.setAvailableAuthenticationKeys(5, 3);
-        assertArrayEquals(
-                new int[]{0, 0, 0, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-
-        // Getting data without device authentication should work even in the case where we haven't
-        // provisioned any authentication keys. Check that.
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
-        // no setSessionTranscript() call indicates Device Authentication not requested.
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        byte[] resultCbor = rd.getAuthenticatedData();
-        try {
-            String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
-            assertEquals("{\n"
-                            + "  'org.iso.18013-5.2019' : {\n"
-                            + "    'Last name' : 'Turing',\n"
-                            + "    'First name' : 'Alan'\n"
-                            + "  }\n"
-                            + "}",
-                    pretty);
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        KeyPair readerEphemeralKeyPair = Util.createEphemeralKeyPair();
-
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-
-        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        // Then check that getEntries() throw NoAuthenticationKeyAvailableException (_even_ when
-        // allowing using exhausted keys).
-        try {
-            credential.setSessionTranscript(sessionTranscript);
-            rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-            assertTrue(false);
-        } catch (NoAuthenticationKeyAvailableException e) {
-            // This is the expected path...
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // Get auth keys needing certification. This should be all of them. Note that
-        // this forces the creation of the authentication keys in the HAL.
-        Collection<X509Certificate> certificates = null;
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(5, certificates.size());
-
-        // Do it one more time to check that an auth key is still pending even
-        // when the corresponding key has been created.
-        Collection<X509Certificate> certificates2 = null;
-        certificates2 = credential.getAuthKeysNeedingCertification();
-        assertArrayEquals(certificates.toArray(), certificates2.toArray());
-
-        // Now set auth data for the *first* key (this is the act of certifying the key) and check
-        // that one less key now needs certification.
-        X509Certificate key0Cert = certificates.iterator().next();
-
-        // Check key0Cert is signed by CredentialKey.
-        try {
-            key0Cert.verify(certChain.iterator().next().getPublicKey());
-        } catch (CertificateException
-                | InvalidKeyException
-                | NoSuchAlgorithmException
-                | NoSuchProviderException
-                | SignatureException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        try {
-            credential.storeStaticAuthenticationData(key0Cert, new byte[]{42, 43, 44});
-            certificates = credential.getAuthKeysNeedingCertification();
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals(4, certificates.size());
-
-        // Now certify the *last* key.
-        X509Certificate key4Cert = new ArrayList<X509Certificate>(certificates).get(
-                certificates.size() - 1);
-        try {
-            key4Cert.verify(certChain.iterator().next().getPublicKey());
-        } catch (CertificateException
-                | InvalidKeyException
-                | NoSuchAlgorithmException
-                | NoSuchProviderException
-                | SignatureException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        try {
-            credential.storeStaticAuthenticationData(key4Cert, new byte[]{43, 44, 45});
-            certificates = credential.getAuthKeysNeedingCertification();
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals(3, certificates.size());
-
-        // Now that we've provisioned authentication keys, presentation will no longer fail with
-        // NoAuthenticationKeyAvailableException ... So now we can try a sessionTranscript without
-        // the ephemeral public key that was created in the Secure Area and check it fails with
-        // EphemeralPublicKeyNotFoundException instead...
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ByteArrayOutputStream stBaos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(stBaos).encode(new CborBuilder()
-                    .addArray()
-                    .add(new byte[]{0x01, 0x02})  // The device engagement structure, encoded
-                    .add(new byte[]{0x03, 0x04})  // Reader ephemeral public key, encoded
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        byte[] wrongSessionTranscript = stBaos.toByteArray();
-        try {
-            credential.setSessionTranscript(wrongSessionTranscript);
-            rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-            assertTrue(false);
-        } catch (EphemeralPublicKeyNotFoundException e) {
-            // This is the expected path...
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // Now use one of the keys...
-        entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Home address",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height"));
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        credential.setSessionTranscript(sessionTranscript);
-        rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        resultCbor = rd.getAuthenticatedData();
-        try {
-            String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
-            assertEquals("{\n"
-                            + "  'org.iso.18013-5.2019' : {\n"
-                            + "    'Height' : 180,\n"
-                            + "    'Last name' : 'Turing',\n"
-                            + "    'Birth date' : '19120623',\n"
-                            + "    'First name' : 'Alan',\n"
-                            + "    'Cryptanalyst' : true,\n"
-                            + "    'Home address' : 'Maida Vale, London, England',\n"
-                            + "    'Portrait image' : [0x01, 0x02]\n"
-                            + "  }\n"
-                            + "}",
-                    pretty);
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        byte[] deviceAuthenticationCbor = Util.buildDeviceAuthenticationCbor(
-            "org.iso.18013-5.2019.mdl",
-            sessionTranscript,
-            resultCbor);
-
-        byte[] deviceAuthenticationBytes =
-                Util.prependSemanticTagForEncodedCbor(deviceAuthenticationCbor);
-
-        byte[] mac = rd.getMessageAuthenticationCode();
-        byte[] ecdsaSignature = rd.getEcdsaSignature();
-        assertTrue(mac != null || ecdsaSignature != null);
-        if (mac != null) {
-            // Calculate the MAC by deriving the key using ECDH and HKDF.
-            SecretKey eMacKey = Util.calcEMacKeyForReader(
-                    key0Cert.getPublicKey(),
-                    readerEphemeralKeyPair.getPrivate(),
-                    sessionTranscript);
-            byte[] expectedMac = Util.coseMac0(eMacKey,
-                    new byte[0],                 // payload
-                    deviceAuthenticationBytes);  // detached content
-
-            // Then compare it with what the TA produced.
-            assertArrayEquals(expectedMac, mac);
-        } else {
-            assertTrue(Util.coseSign1CheckSignature(
-                    ecdsaSignature,
-                    deviceAuthenticationBytes,
-                    key0Cert.getPublicKey()));
-        }
-
-        // Check that key0's static auth data is returned and that this
-        // key has an increased use-count.
-        assertArrayEquals(new byte[]{42, 43, 44}, rd.getStaticAuthenticationData());
-        assertArrayEquals(new int[]{1, 0, 0, 0, 0}, credential.getAuthenticationDataUsageCount());
-
-
-        // Now do this one more time.... this time key4 should have been used. Check this by
-        // inspecting use-counts and the static authentication data.
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        credential.setSessionTranscript(sessionTranscript);
-        rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        assertArrayEquals(new byte[]{43, 44, 45}, rd.getStaticAuthenticationData());
-        assertArrayEquals(new int[]{1, 0, 0, 0, 1}, credential.getAuthenticationDataUsageCount());
-
-        deviceAuthenticationCbor = Util.buildDeviceAuthenticationCbor(
-                "org.iso.18013-5.2019.mdl",
-                sessionTranscript,
-                resultCbor);
-
-        deviceAuthenticationBytes =
-                Util.prependSemanticTagForEncodedCbor(deviceAuthenticationCbor);
-
-        // Verify Signature or MAC was made with key4.
-        mac = rd.getMessageAuthenticationCode();
-        ecdsaSignature = rd.getEcdsaSignature();
-        assertTrue(mac != null || ecdsaSignature != null);
-        if (mac != null) {
-            SecretKey eMacKey = Util.calcEMacKeyForReader(
-                    key4Cert.getPublicKey(),
-                    readerEphemeralKeyPair.getPrivate(),
-                    sessionTranscript);
-            byte[] expectedMac = Util.coseMac0(eMacKey,
-                    new byte[0],                 // payload
-                    deviceAuthenticationBytes);  // detached content
-            assertArrayEquals(expectedMac, mac);
-        } else {
-            assertTrue(Util.coseSign1CheckSignature(
-                    ecdsaSignature,
-                    deviceAuthenticationBytes,
-                    key4Cert.getPublicKey()));
-        }
-
-        // And again.... this time key0 should have been used. Check it.
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        credential.setSessionTranscript(sessionTranscript);
-        rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        assertArrayEquals(new byte[]{42, 43, 44}, rd.getStaticAuthenticationData());
-        assertArrayEquals(new int[]{2, 0, 0, 0, 1}, credential.getAuthenticationDataUsageCount());
-
-        // And again.... this time key4 should have been used. Check it.
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        credential.setSessionTranscript(sessionTranscript);
-        rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        assertArrayEquals(new byte[]{43, 44, 45}, rd.getStaticAuthenticationData());
-        assertArrayEquals(new int[]{2, 0, 0, 0, 2}, credential.getAuthenticationDataUsageCount());
-
-        // We configured each key to have three uses only. So we have two more presentations
-        // to go until we run out... first, check that only three keys need certifications
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(3, certificates.size());
-
-        // Then exhaust the two we've already configured.
-        for (int n = 0; n < 2; n++) {
-            credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            ephemeralKeyPair = credential.createEphemeralKeyPair();
-            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-            credential.setSessionTranscript(sessionTranscript);
-            rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-            assertNotNull(rd);
-        }
-        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-
-        // Now we should have five certs needing certification.
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(5, certificates.size());
-
-        // We still have the two keys which have been exhausted.
-        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-
-        // Check that we fail when running out of presentations (and explicitly don't allow
-        // exhausting keys).
-        try {
-            credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            ephemeralKeyPair = credential.createEphemeralKeyPair();
-            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-            credential.setAllowUsingExhaustedKeys(false);
-            credential.setSessionTranscript(sessionTranscript);
-            rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-            assertTrue(false);
-        } catch (IdentityCredentialException e) {
-            assertTrue(e instanceof NoAuthenticationKeyAvailableException);
-        }
-        assertArrayEquals(new int[]{3, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-
-        // Now try with allowing using auth keys already exhausted... this should work!
-        try {
-            credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            ephemeralKeyPair = credential.createEphemeralKeyPair();
-            credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-            sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-            credential.setSessionTranscript(sessionTranscript);
-            rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertArrayEquals(new int[]{4, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-
-        // Check that replenishing works...
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(5, certificates.size());
-        X509Certificate keyNewCert = certificates.iterator().next();
-        try {
-            credential.storeStaticAuthenticationData(keyNewCert, new byte[]{10, 11, 12});
-            certificates = credential.getAuthKeysNeedingCertification();
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals(4, certificates.size());
-        assertArrayEquals(new int[]{0, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        ephemeralKeyPair = credential.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-        credential.setSessionTranscript(sessionTranscript);
-        rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-        assertArrayEquals(new byte[]{10, 11, 12}, rd.getStaticAuthenticationData());
-        assertArrayEquals(new int[]{1, 0, 0, 0, 3}, credential.getAuthenticationDataUsageCount());
-
-        deviceAuthenticationCbor = Util.buildDeviceAuthenticationCbor(
-            "org.iso.18013-5.2019.mdl",
-            sessionTranscript,
-            resultCbor);
-
-        deviceAuthenticationBytes =
-                Util.prependSemanticTagForEncodedCbor(deviceAuthenticationCbor);
-
-        mac = rd.getMessageAuthenticationCode();
-        ecdsaSignature = rd.getEcdsaSignature();
-        assertTrue(mac != null || ecdsaSignature != null);
-        if (mac != null) {
-            SecretKey eMacKey = Util.calcEMacKeyForReader(
-                    keyNewCert.getPublicKey(),
-                    readerEphemeralKeyPair.getPrivate(),
-                    sessionTranscript);
-            byte[] expectedMac = Util.coseMac0(eMacKey,
-                    new byte[0],                 // payload
-                    deviceAuthenticationBytes);  // detached content
-            assertArrayEquals(expectedMac, rd.getMessageAuthenticationCode());
-        } else {
-            assertTrue(Util.coseSign1CheckSignature(
-                    ecdsaSignature,
-                    deviceAuthenticationBytes,
-                    keyNewCert.getPublicKey()));
-        }
-
-        // ... and we're done. Clean up after ourselves.
-        store.deleteCredentialByName(credentialName);
-    }
-
-    // TODO: test storeStaticAuthenticationData() throwing UnknownAuthenticationKeyException
-    // on an unknown auth key
-
-    @SuppressWarnings("deprecation")
-    @Test
-    public void dynamicAuthWithExpirationTest() throws Exception {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-        assumeTrue(store.getCapabilities().isStaticAuthenticationDataExpirationSupported());
-
-        String credentialName = "test";
-
-        store.deleteCredentialByName(credentialName);
-        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
-                credentialName);
-
-        IdentityCredential credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-
-        credential.setAvailableAuthenticationKeys(3, 5);
-
-        Collection<X509Certificate> certificates = null;
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(3, certificates.size());
-
-        // Endorse an auth-key but set expiration to 10 seconds in the future.
-        //
-        Calendar now = Calendar.getInstance();
-        Calendar tenSecondsFromNow = Calendar.getInstance();
-        tenSecondsFromNow.add(Calendar.SECOND, 10);
-        try {
-            X509Certificate key0Cert = certificates.iterator().next();
-            credential.storeStaticAuthenticationData(key0Cert,
-                    tenSecondsFromNow,
-                    new byte[]{52, 53, 44});
-            certificates = credential.getAuthKeysNeedingCertification();
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals(2, certificates.size());
-        assertArrayEquals(
-                new int[]{0, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-        // Check that presentation works.
-        try {
-            IdentityCredential tc = store.getCredentialByName(credentialName,
-                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            KeyPair ekp = tc.createEphemeralKeyPair();
-            KeyPair rekp = Util.createEphemeralKeyPair();
-            tc.setReaderEphemeralPublicKey(rekp.getPublic());
-            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
-            Map<String, Collection<String>> etr = new LinkedHashMap<>();
-            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
-            ResultData rd = tc.getEntries(
-                    Util.createItemsRequest(etr, null),
-                    etr,
-                    null);
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertArrayEquals(
-                new int[]{1, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-
-        SystemClock.sleep(11 * 1000);
-
-        certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(3, certificates.size());
-
-        // Check that presentation now fails..
-        try {
-            IdentityCredential tc = store.getCredentialByName(credentialName,
-                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            KeyPair ekp = tc.createEphemeralKeyPair();
-            KeyPair rekp = Util.createEphemeralKeyPair();
-            tc.setReaderEphemeralPublicKey(rekp.getPublic());
-            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
-            Map<String, Collection<String>> etr = new LinkedHashMap<>();
-            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
-            ResultData rd = tc.getEntries(
-                    Util.createItemsRequest(etr, null),
-                    etr,
-                    null);
-            assertTrue(false);
-        } catch (NoAuthenticationKeyAvailableException e) {
-            // This is the expected path...
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertArrayEquals(
-                new int[]{1, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-
-        // Check that it works if we use setAllowUsingExpiredKeys(true)
-        try {
-            IdentityCredential tc = store.getCredentialByName(credentialName,
-                    IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            tc.setAllowUsingExpiredKeys(true);   // <-- this is the call that makes the difference!
-            KeyPair ekp = tc.createEphemeralKeyPair();
-            KeyPair rekp = Util.createEphemeralKeyPair();
-            tc.setReaderEphemeralPublicKey(rekp.getPublic());
-            tc.setSessionTranscript(Util.buildSessionTranscript(ekp));
-            Map<String, Collection<String>> etr = new LinkedHashMap<>();
-            etr.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
-            ResultData rd = tc.getEntries(
-                    Util.createItemsRequest(etr, null),
-                    etr,
-                    null);
-        } catch (IdentityCredentialException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertArrayEquals(
-                new int[]{2, 0, 0},
-                credential.getAuthenticationDataUsageCount());
-
-        // ... and we're done. Clean up after ourselves.
-        store.deleteCredentialByName(credentialName);
-    }
-
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/EphemeralKeyTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/EphemeralKeyTest.java
deleted file mode 100644
index 2d964dc..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/EphemeralKeyTest.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static junit.framework.TestCase.assertTrue;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-
-import android.content.Context;
-import android.security.keystore.KeyProperties;
-
-import androidx.security.identity.IdentityCredential;
-import androidx.security.identity.IdentityCredentialException;
-import androidx.security.identity.IdentityCredentialStore;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.MediumTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.nio.ByteBuffer;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
-import java.security.spec.ECGenParameterSpec;
-import java.util.Collection;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.KeyAgreement;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.GCMParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-// TODO: For better coverage, use different ECDH and HKDF implementations in test code.
-@SuppressWarnings("deprecation")
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class EphemeralKeyTest {
-    private static final String TAG = "EphemeralKeyTest";
-
-    @Test
-    public void createEphemeralKey() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        String credentialName = "ephemeralKeyTest";
-        byte[] sessionTranscript = {0x01, 0x02, 0x03};
-
-        store.deleteCredentialByName(credentialName);
-        Collection<X509Certificate> certChain = ProvisioningTest.createCredential(store,
-                credentialName);
-        IdentityCredential credential = store.getCredentialByName(credentialName,
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-
-        // Check we can get both the public and private keys.
-        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
-        assertNotNull(ephemeralKeyPair);
-        assertTrue(ephemeralKeyPair.getPublic().getEncoded().length > 0);
-        assertTrue(ephemeralKeyPair.getPrivate().getEncoded().length > 0);
-
-        TestReader reader = new TestReader(
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256,
-                ephemeralKeyPair.getPublic(),
-                sessionTranscript);
-
-        try {
-            credential.setReaderEphemeralPublicKey(reader.getEphemeralPublicKey());
-        } catch (InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        credential.setSessionTranscript(sessionTranscript);
-
-        // Exchange a couple of messages... this is to test that the nonce/counter
-        // state works as expected.
-        for (int n = 0; n < 5; n++) {
-            // First send a message from the Reader to the Holder...
-            byte[] messageToHolder = ("Hello Holder! (serial=" + n + ")").getBytes();
-            byte[] encryptedMessageToHolder = reader.encryptMessageToHolder(messageToHolder);
-            assertNotEquals(messageToHolder, encryptedMessageToHolder);
-            byte[] decryptedMessageToHolder = credential.decryptMessageFromReader(
-                    encryptedMessageToHolder);
-            assertArrayEquals(messageToHolder, decryptedMessageToHolder);
-
-            // Then from the Holder to the Reader...
-            byte[] messageToReader = ("Hello Reader! (serial=" + n + ")").getBytes();
-            byte[] encryptedMessageToReader = credential.encryptMessageToReader(messageToReader);
-            assertNotEquals(messageToReader, encryptedMessageToReader);
-            byte[] decryptedMessageToReader = reader.decryptMessageFromHolder(
-                    encryptedMessageToReader);
-            assertArrayEquals(messageToReader, decryptedMessageToReader);
-        }
-    }
-
-    static class TestReader {
-
-        @IdentityCredentialStore.Ciphersuite
-        private int mCipherSuite;
-
-        private PublicKey mHolderEphemeralPublicKey;
-        private KeyPair mEphemeralKeyPair;
-        private SecretKey mSKDevice;
-        private SecretKey mSKReader;
-        private int mSKDeviceCounter;
-        private int mSKReaderCounter;
-
-        private SecureRandom mSecureRandom;
-
-        private boolean mRemoteIsReaderDevice;
-
-        // This is basically the reader-side of what needs to happen for encryption/decryption
-        // of messages.. could easily be re-used in an mDL reader application.
-        TestReader(@IdentityCredentialStore.Ciphersuite int cipherSuite,
-                PublicKey holderEphemeralPublicKey,
-                byte[] sessionTranscript) throws IdentityCredentialException {
-            mCipherSuite = cipherSuite;
-            mHolderEphemeralPublicKey = holderEphemeralPublicKey;
-            mSKReaderCounter = 1;
-            mSKDeviceCounter = 1;
-
-            try {
-                KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC);
-                ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime256v1");
-                kpg.initialize(ecSpec);
-                mEphemeralKeyPair = kpg.generateKeyPair();
-            } catch (NoSuchAlgorithmException
-                    | InvalidAlgorithmParameterException e) {
-                e.printStackTrace();
-                throw new IdentityCredentialException("Error generating ephemeral key", e);
-            }
-
-            try {
-                KeyAgreement ka = KeyAgreement.getInstance("ECDH");
-                ka.init(mEphemeralKeyPair.getPrivate());
-                ka.doPhase(mHolderEphemeralPublicKey, true);
-                byte[] sharedSecret = ka.generateSecret();
-
-                byte[] sessionTranscriptBytes =
-                        Util.prependSemanticTagForEncodedCbor(sessionTranscript);
-                byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
-
-                byte[] info = new byte[] {'S', 'K', 'D', 'e', 'v', 'i', 'c', 'e'};
-                byte[] derivedKey = Util.computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
-                mSKDevice = new SecretKeySpec(derivedKey, "AES");
-
-                info = new byte[] {'S', 'K', 'R', 'e', 'a', 'd', 'e', 'r'};
-                derivedKey = Util.computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
-                mSKReader = new SecretKeySpec(derivedKey, "AES");
-
-                mSecureRandom = new SecureRandom();
-
-            } catch (InvalidKeyException
-                    | NoSuchAlgorithmException e) {
-                e.printStackTrace();
-                throw new IdentityCredentialException("Error performing key agreement", e);
-            }
-        }
-
-        PublicKey getEphemeralPublicKey() {
-            return mEphemeralKeyPair.getPublic();
-        }
-
-        byte[] encryptMessageToHolder(byte[] messagePlaintext) throws IdentityCredentialException {
-            byte[] messageCiphertext = null;
-            try {
-                ByteBuffer iv = ByteBuffer.allocate(12);
-                iv.putInt(0, 0x00000000);
-                iv.putInt(4, 0x00000000);
-                iv.putInt(8, mSKReaderCounter);
-                Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
-                GCMParameterSpec encryptionParameterSpec = new GCMParameterSpec(128, iv.array());
-                cipher.init(Cipher.ENCRYPT_MODE, mSKReader, encryptionParameterSpec);
-                messageCiphertext = cipher.doFinal(messagePlaintext); // This includes the auth tag
-            } catch (BadPaddingException
-                    | IllegalBlockSizeException
-                    | NoSuchPaddingException
-                    | InvalidKeyException
-                    | NoSuchAlgorithmException
-                    | InvalidAlgorithmParameterException e) {
-                e.printStackTrace();
-                throw new IdentityCredentialException("Error encrypting message", e);
-            }
-            mSKReaderCounter += 1;
-            return messageCiphertext;
-        }
-
-        byte[] decryptMessageFromHolder(byte[] messageCiphertext)
-                throws IdentityCredentialException {
-            ByteBuffer iv = ByteBuffer.allocate(12);
-            iv.putInt(0, 0x00000000);
-            iv.putInt(4, 0x00000001);
-            iv.putInt(8, mSKDeviceCounter);
-            byte[] plaintext = null;
-            try {
-                final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
-                cipher.init(Cipher.DECRYPT_MODE, mSKDevice, new GCMParameterSpec(128, iv.array()));
-                plaintext = cipher.doFinal(messageCiphertext);
-            } catch (BadPaddingException
-                    | IllegalBlockSizeException
-                    | InvalidAlgorithmParameterException
-                    | InvalidKeyException
-                    | NoSuchAlgorithmException
-                    | NoSuchPaddingException e) {
-                e.printStackTrace();
-                throw new IdentityCredentialException("Error decrypting message", e);
-            }
-            mSKDeviceCounter += 1;
-            return plaintext;
-        }
-    }
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/HkdfTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/HkdfTest.java
deleted file mode 100644
index ad6d6af1..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/HkdfTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.Random;
-
-/*
- * This is based on https://github.com/google/tink/blob/master/java/src/test/java/com/google
- * /crypto/tink/subtle/HkdfTest.java
- * which is also Copyright (c) Google and licensed under the Apache 2 license.
- */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class HkdfTest {
-
-    static Random sRandom = new Random();
-
-    /** Encodes a byte array to hex. */
-    static String hexEncode(final byte[] bytes) {
-        String chars = "0123456789abcdef";
-        StringBuilder result = new StringBuilder(2 * bytes.length);
-        for (byte b : bytes) {
-            // convert to unsigned
-            int val = b & 0xff;
-            result.append(chars.charAt(val / 16));
-            result.append(chars.charAt(val % 16));
-        }
-        return result.toString();
-    }
-
-    /** Decodes a hex string to a byte array. */
-    static byte[] hexDecode(String hex) {
-        if (hex.length() % 2 != 0) {
-            throw new IllegalArgumentException("Expected a string of even length");
-        }
-        int size = hex.length() / 2;
-        byte[] result = new byte[size];
-        for (int i = 0; i < size; i++) {
-            int hi = Character.digit(hex.charAt(2 * i), 16);
-            int lo = Character.digit(hex.charAt(2 * i + 1), 16);
-            if ((hi == -1) || (lo == -1)) {
-                throw new IllegalArgumentException("input is not hexadecimal");
-            }
-            result[i] = (byte) (16 * hi + lo);
-        }
-        return result;
-    }
-
-    static byte[] randBytes(int numBytes) {
-        byte[] bytes = new byte[numBytes];
-        sRandom.nextBytes(bytes);
-        return bytes;
-    }
-
-    @Test
-    public void testNullSaltOrInfo() {
-        byte[] ikm = randBytes(20);
-        byte[] info = randBytes(20);
-        int size = 40;
-
-        byte[] hkdfWithNullSalt = Util.computeHkdf("HmacSha256", ikm, null, info, size);
-        byte[] hkdfWithEmptySalt = Util.computeHkdf("HmacSha256", ikm, new byte[0], info, size);
-        assertArrayEquals(hkdfWithNullSalt, hkdfWithEmptySalt);
-
-        byte[] salt = randBytes(20);
-        byte[] hkdfWithNullInfo = Util.computeHkdf("HmacSha256", ikm, salt, null, size);
-        byte[] hkdfWithEmptyInfo = Util.computeHkdf("HmacSha256", ikm, salt, new byte[0], size);
-        assertArrayEquals(hkdfWithNullInfo, hkdfWithEmptyInfo);
-    }
-
-    @Test
-    public void testInvalidCodeSize() {
-        try {
-            Util.computeHkdf("HmacSha256", new byte[0], new byte[0], new byte[0], 32 * 256);
-            fail("Invalid size, should have thrown exception");
-        } catch (RuntimeException expected) {
-
-            // Expected
-        }
-    }
-
-    /**
-     * Tests the implementation against the test vectors from RFC 5869.
-     */
-    @Test
-    public void testVectors() {
-        // Test case 1
-        assertEquals(
-                "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf"
-                + "1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
-                computeHkdfHex("HmacSha256",
-                        "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
-                        "000102030405060708090a0b0c",
-                        "f0f1f2f3f4f5f6f7f8f9",
-                        42));
-
-        // Test case 2
-        assertEquals(
-                "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c"
-                        + "59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71"
-                        + "cc30c58179ec3e87c14c01d5c1f3434f1d87",
-                computeHkdfHex("HmacSha256",
-                        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
-                                + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
-                                + "404142434445464748494a4b4c4d4e4f",
-                        "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"
-                                + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f"
-                                + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
-                        "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
-                                + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef"
-                                + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
-                        82));
-
-        // Test case 3: salt is empty
-        assertEquals(
-                "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d"
-                        + "9d201395faa4b61a96c8",
-                computeHkdfHex("HmacSha256",
-                        "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", "", "",
-                        42));
-
-        // Test Case 4
-        assertEquals(
-                "085a01ea1b10f36933068b56efa5ad81a4f14b822f"
-                + "5b091568a9cdd4f155fda2c22e422478d305f3f896",
-                computeHkdfHex(
-                        "HmacSha1",
-                        "0b0b0b0b0b0b0b0b0b0b0b",
-                        "000102030405060708090a0b0c",
-                        "f0f1f2f3f4f5f6f7f8f9",
-                        42));
-
-        // Test Case 5
-        assertEquals(
-                "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe"
-                        + "8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e"
-                        + "927336d0441f4c4300e2cff0d0900b52d3b4",
-                computeHkdfHex(
-                        "HmacSha1",
-                        "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
-                                + "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
-                                + "404142434445464748494a4b4c4d4e4f",
-                        "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f"
-                                + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f"
-                                + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
-                        "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
-                                + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef"
-                                + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
-                        82));
-
-        // Test Case 6: salt is empty
-        assertEquals(
-                "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0"
-                        + "ea00033de03984d34918",
-                computeHkdfHex("HmacSha1", "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", "", "",
-                        42));
-
-        // Test Case 7
-        assertEquals(
-                "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5"
-                        + "673a081d70cce7acfc48",
-                computeHkdfHex("HmacSha1", "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c", "", "",
-                        42));
-    }
-
-    /**
-     * Test version of Hkdf where all inputs and outputs are hexadecimal.
-     */
-    private String computeHkdfHex(String macAlgorithm, String ikmHex, String saltHex,
-            String infoHex,
-            int size) {
-        return hexEncode(
-                Util.computeHkdf(macAlgorithm, hexDecode(ikmHex), hexDecode(saltHex),
-                        hexDecode(infoHex), size));
-    }
-
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ProvisioningTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ProvisioningTest.java
deleted file mode 100644
index 64db9e3..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ProvisioningTest.java
+++ /dev/null
@@ -1,1142 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static androidx.security.identity.ResultData.STATUS_NOT_IN_REQUEST_MESSAGE;
-import static androidx.security.identity.ResultData.STATUS_NOT_REQUESTED;
-import static androidx.security.identity.ResultData.STATUS_NO_ACCESS_CONTROL_PROFILES;
-import static androidx.security.identity.ResultData.STATUS_NO_SUCH_ENTRY;
-import static androidx.security.identity.ResultData.STATUS_OK;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.util.Log;
-
-import androidx.biometric.BiometricPrompt;
-import androidx.security.identity.AccessControlProfile;
-import androidx.security.identity.AccessControlProfileId;
-import androidx.security.identity.AlreadyPersonalizedException;
-import androidx.security.identity.IdentityCredential;
-import androidx.security.identity.IdentityCredentialException;
-import androidx.security.identity.IdentityCredentialStore;
-import androidx.security.identity.PersonalizationData;
-import androidx.security.identity.ResultData;
-import androidx.security.identity.WritableIdentityCredential;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.ByteArrayOutputStream;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import co.nstant.in.cbor.CborBuilder;
-import co.nstant.in.cbor.CborEncoder;
-import co.nstant.in.cbor.CborException;
-import co.nstant.in.cbor.model.UnicodeString;
-import co.nstant.in.cbor.model.UnsignedInteger;
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
- */
-@SuppressWarnings("deprecation")
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class ProvisioningTest {
-    private static final String TAG = "ProvisioningTest";
-
-    private static byte[] getExampleDrivingPrivilegesCbor() {
-        // As per 7.4.4 of ISO 18013-5, driving privileges are defined with the following CDDL:
-        //
-        // driving_privileges = [
-        //     * driving_privilege
-        // ]
-        //
-        // driving_privilege = {
-        //     vehicle_category_code: tstr ; Vehicle category code as per ISO 18013-2 Annex A
-        //     ? issue_date: #6.0(tstr)    ; Date of issue encoded as full-date per RFC 3339
-        //     ? expiry_date: #6.0(tstr)   ; Date of expiry encoded as full-date per RFC 3339
-        //     ? code: tstr                ; Code as per ISO 18013-2 Annex A
-        //     ? sign: tstr                ; Sign as per ISO 18013-2 Annex A
-        //     ? value: int                ; Value as per ISO 18013-2 Annex A
-        // }
-        //
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(new CborBuilder()
-                    .addArray()
-                    .addMap()
-                    .put(new UnicodeString("vehicle_category_code"), new UnicodeString("TODO"))
-                    .put(new UnicodeString("value"), new UnsignedInteger(42))
-                    .end()
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            assertTrue(false);
-        }
-        return baos.toByteArray();
-    }
-
-    static Collection<X509Certificate> createCredential(IdentityCredentialStore store,
-            String credentialName) throws IdentityCredentialException {
-        return createCredentialWithChallenge(store, credentialName, "SomeChallenge".getBytes());
-    }
-
-    static Collection<X509Certificate> createCredentialWithChallenge(IdentityCredentialStore store,
-            String credentialName,
-            byte[] challenge) throws IdentityCredentialException {
-        WritableIdentityCredential wc = null;
-        wc = store.createCredential(credentialName, "org.iso.18013-5.2019.mdl");
-
-        Collection<X509Certificate> certificateChain =
-                wc.getCredentialKeyCertificateChain(challenge);
-        // TODO: inspect cert-chain
-
-        // Profile 0 (no authentication)
-        AccessControlProfile noAuthProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(0))
-                        .setUserAuthenticationRequired(false)
-                        .build();
-
-        byte[] drivingPrivileges = getExampleDrivingPrivilegesCbor();
-
-        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
-        idsNoAuth.add(new AccessControlProfileId(0));
-        Collection<AccessControlProfileId> idsNoAcp = new ArrayList<AccessControlProfileId>();
-        String mdlNs = "org.iso.18013-5.2019";
-        PersonalizationData personalizationData =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(noAuthProfile)
-                        .putEntry(mdlNs, "First name", idsNoAuth, Util.cborEncodeString("Alan"))
-                        .putEntry(mdlNs, "Last name", idsNoAuth, Util.cborEncodeString("Turing"))
-                        .putEntry(mdlNs, "Home address", idsNoAuth,
-                                Util.cborEncodeString("Maida Vale, London, England"))
-                        .putEntry(mdlNs, "Birth date", idsNoAuth, Util.cborEncodeString("19120623"))
-                        .putEntry(mdlNs, "Cryptanalyst", idsNoAuth, Util.cborEncodeBoolean(true))
-                        .putEntry(mdlNs, "Portrait image", idsNoAuth, Util.cborEncodeBytestring(
-                            new byte[]{0x01, 0x02}))
-                        .putEntry(mdlNs, "Height", idsNoAuth, Util.cborEncodeInt(180))
-                        .putEntry(mdlNs, "Neg Item", idsNoAuth, Util.cborEncodeInt(-42))
-                        .putEntry(mdlNs, "Int Two Bytes", idsNoAuth, Util.cborEncodeInt(0x101))
-                        .putEntry(mdlNs, "Int Four Bytes", idsNoAuth, Util.cborEncodeInt(0x10001))
-                        .putEntry(mdlNs, "Int Eight Bytes", idsNoAuth,
-                                Util.cborEncodeInt(0x100000001L))
-                        .putEntry(mdlNs, "driving_privileges", idsNoAuth, drivingPrivileges)
-                        .putEntry(mdlNs, "No Access", idsNoAcp,
-                                Util.cborEncodeString("Cannot be retrieved"))
-                        .build();
-
-        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
-        byte[] proofOfProvisioning = Util.coseSign1GetData(proofOfProvisioningSignature);
-
-        String pretty = "";
-        try {
-            pretty = Util.cborPrettyPrint(proofOfProvisioning);
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        Log.e(TAG, "pretty: " + pretty);
-        // Checks that order of elements is the order it was added, using the API.
-        assertEquals("[\n"
-                + "  'ProofOfProvisioning',\n"
-                + "  'org.iso.18013-5.2019.mdl',\n"
-                + "  [\n"
-                + "    {\n"
-                + "      'id' : 0\n"
-                + "    }\n"
-                + "  ],\n"
-                + "  {\n"
-                + "    'org.iso.18013-5.2019' : [\n"
-                + "      {\n"
-                + "        'name' : 'First name',\n"
-                + "        'value' : 'Alan',\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Last name',\n"
-                + "        'value' : 'Turing',\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Home address',\n"
-                + "        'value' : 'Maida Vale, London, England',\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Birth date',\n"
-                + "        'value' : '19120623',\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Cryptanalyst',\n"
-                + "        'value' : true,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Portrait image',\n"
-                + "        'value' : [0x01, 0x02],\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Height',\n"
-                + "        'value' : 180,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Neg Item',\n"
-                + "        'value' : -42,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Int Two Bytes',\n"
-                + "        'value' : 257,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Int Four Bytes',\n"
-                + "        'value' : 65537,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Int Eight Bytes',\n"
-                + "        'value' : 4294967297,\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'driving_privileges',\n"
-                + "        'value' : [\n"
-                + "          {\n"
-                + "            'value' : 42,\n"
-                + "            'vehicle_category_code' : 'TODO'\n"
-                + "          }\n"
-                + "        ],\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'No Access',\n"
-                + "        'value' : 'Cannot be retrieved',\n"
-                + "        'accessControlProfiles' : []\n"
-                + "      }\n"
-                + "    ]\n"
-                + "  },\n"
-                + "  false\n"
-                + "]", pretty);
-
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    proofOfProvisioningSignature,
-                    new byte[0], // Additional data
-                    certificateChain.iterator().next().getPublicKey()));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // TODO: Check challenge is in certificatechain
-
-        // TODO: Check each cert signs the next one
-
-        // TODO: Check bottom cert is the Google well-know cert
-
-        // TODO: need to also get and check SecurityStatement
-
-        return certificateChain;
-    }
-
-    static Collection<X509Certificate> createCredentialMultipleNamespaces(
-            IdentityCredentialStore store,
-            String credentialName) throws IdentityCredentialException {
-        WritableIdentityCredential wc = null;
-        wc = store.createCredential(credentialName, "org.iso.18013-5.2019.mdl");
-
-        Collection<X509Certificate> certificateChain =
-                wc.getCredentialKeyCertificateChain("SomeChallenge".getBytes());
-
-        // Profile 0 (no authentication)
-        AccessControlProfile noAuthProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(0))
-                        .setUserAuthenticationRequired(false)
-                        .build();
-
-        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
-        idsNoAuth.add(new AccessControlProfileId(0));
-        PersonalizationData personalizationData =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(noAuthProfile)
-                        .putEntry("org.example.barfoo", "Bar", idsNoAuth,
-                                Util.cborEncodeString("Foo"))
-                        .putEntry("org.example.barfoo", "Foo", idsNoAuth,
-                                Util.cborEncodeString("Bar"))
-                        .putEntry("org.example.foobar", "Foo", idsNoAuth,
-                                Util.cborEncodeString("Bar"))
-                        .putEntry("org.example.foobar", "Bar", idsNoAuth,
-                                Util.cborEncodeString("Foo"))
-                        .build();
-
-        try {
-            byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
-            byte[] proofOfProvisioning = Util.coseSign1GetData(proofOfProvisioningSignature);
-            String pretty = Util.cborPrettyPrint(proofOfProvisioning);
-            // Checks that order of elements is the order it was added, using the API.
-            assertEquals("[\n"
-                    + "  'ProofOfProvisioning',\n"
-                    + "  'org.iso.18013-5.2019.mdl',\n"
-                    + "  [\n"
-                    + "    {\n"
-                    + "      'id' : 0\n"
-                    + "    }\n"
-                    + "  ],\n"
-                    + "  {\n"
-                    + "    'org.example.barfoo' : [\n"
-                    + "      {\n"
-                    + "        'name' : 'Bar',\n"
-                    + "        'value' : 'Foo',\n"
-                    + "        'accessControlProfiles' : [0]\n"
-                    + "      },\n"
-                    + "      {\n"
-                    + "        'name' : 'Foo',\n"
-                    + "        'value' : 'Bar',\n"
-                    + "        'accessControlProfiles' : [0]\n"
-                    + "      }\n"
-                    + "    ],\n"
-                    + "    'org.example.foobar' : [\n"
-                    + "      {\n"
-                    + "        'name' : 'Foo',\n"
-                    + "        'value' : 'Bar',\n"
-                    + "        'accessControlProfiles' : [0]\n"
-                    + "      },\n"
-                    + "      {\n"
-                    + "        'name' : 'Bar',\n"
-                    + "        'value' : 'Foo',\n"
-                    + "        'accessControlProfiles' : [0]\n"
-                    + "      }\n"
-                    + "    ]\n"
-                    + "  },\n"
-                    + "  false\n"
-                    + "]", pretty);
-
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        return certificateChain;
-    }
-
-    @Test
-    public void alreadyPersonalized() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        createCredential(store, "test");
-        try {
-            createCredential(store, "test");
-            assertTrue(false);
-        } catch (AlreadyPersonalizedException e) {
-            // The expected path.
-        }
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void nonExistent() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNull(credential);
-    }
-
-    @Test
-    public void defaultStoreSupportsAnyDocumentType() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        String[] supportedDocTypes = store.getSupportedDocTypes();
-        assertEquals(0, supportedDocTypes.length);
-    }
-
-    @Test
-    public void deleteCredentialOld()
-            throws IdentityCredentialException, CborException, CertificateEncodingException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        assertNull(store.deleteCredentialByName("test"));
-        Collection<X509Certificate> certificateChain = createCredential(store, "test");
-
-        // Deleting the credential involves destroying the keys referenced in the returned
-        // certificateChain... so get an encoded blob we can turn into a X509 cert when
-        // checking the deletion receipt below, post-deletion.
-        PublicKey credentialKeyPublic = certificateChain.iterator().next().getPublicKey();
-
-        byte[] proofOfDeletionSignature = store.deleteCredentialByName("test");
-        byte[] proofOfDeletion = Util.coseSign1GetData(proofOfDeletionSignature);
-
-        // Check the returned CBOR is what is expected. Specifically note the challenge
-        // is _not_ included because we're using the old method.
-        String pretty = Util.cborPrettyPrint(proofOfDeletion);
-        assertEquals("['ProofOfDeletion', 'org.iso.18013-5.2019.mdl', false]", pretty);
-
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    proofOfDeletionSignature,
-                    new byte[0], // Additional data
-                    credentialKeyPublic));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // Finally, check the credential is gone.
-        assertNull(store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256));
-    }
-
-    @Test
-    public void deleteCredential()
-            throws IdentityCredentialException, CborException, CertificateEncodingException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-        assumeTrue(store.getCapabilities().isDeleteSupported());
-
-        store.deleteCredentialByName("test");
-        assertNull(store.deleteCredentialByName("test"));
-        Collection<X509Certificate> certificateChain = createCredential(store, "test");
-
-        // Deleting the credential involves destroying the keys referenced in the returned
-        // certificateChain... so get an encoded blob we can turn into a X509 cert when
-        // checking the deletion receipt below, post-deletion.
-        PublicKey credentialKeyPublic = certificateChain.iterator().next().getPublicKey();
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-        byte[] proofOfDeletionSignature = credential.delete(new byte[] {0x01, 0x02});
-        byte[] proofOfDeletion = Util.coseSign1GetData(proofOfDeletionSignature);
-
-        // Check the returned CBOR is what is expected. Specifically note the challenge
-        // _is_ included because we're using the new delete() method.
-        String pretty = Util.cborPrettyPrint(proofOfDeletion);
-        assertEquals("['ProofOfDeletion', 'org.iso.18013-5.2019.mdl', [0x01, 0x02], false]",
-                pretty);
-
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    proofOfDeletionSignature,
-                    new byte[0], // Additional data
-                    credentialKeyPublic));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // Finally, check the credential is gone.
-        assertNull(store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256));
-    }
-
-    @Test
-    public void proofOfOwnership()
-            throws IdentityCredentialException, CborException, CertificateEncodingException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-        assumeTrue(store.getCapabilities().isProveOwnershipSupported());
-
-        store.deleteCredentialByName("test");
-        assertNull(store.deleteCredentialByName("test"));
-        Collection<X509Certificate> certificateChain = createCredential(store, "test");
-
-        byte[] encodedCredentialCert = certificateChain.iterator().next().getEncoded();
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-
-        byte[] challenge = new byte[]{0x12, 0x22};
-        byte[] proofOfOwnershipSignature = credential.proveOwnership(challenge);
-        byte[] proofOfOwnership = Util.coseSign1GetData(proofOfOwnershipSignature);
-
-        // Check the returned CBOR is what is expected.
-        String pretty = Util.cborPrettyPrint(proofOfOwnership);
-        assertEquals("['ProofOfOwnership', 'org.iso.18013-5.2019.mdl', [0x12, 0x22], false]",
-                pretty);
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    proofOfOwnershipSignature,
-                    new byte[0], // Additional data
-                    certificateChain.iterator().next().getPublicKey()));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        // Finally, check the credential is still there
-        assertNotNull(store.deleteCredentialByName("test"));
-    }
-
-    @Test
-    public void testProvisionAndRetrieve() throws IdentityCredentialException, CborException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        // Check that the read-back certChain matches the created one.
-        Collection<X509Certificate> readBackCertChain =
-                credential.getCredentialKeyCertificateChain();
-        assertEquals(certChain.size(), readBackCertChain.size());
-        Iterator<X509Certificate> it = readBackCertChain.iterator();
-        for (X509Certificate expectedCert : certChain) {
-            X509Certificate readBackCert = it.next();
-            assertEquals(expectedCert, readBackCert);
-        }
-
-        // Check we can get a CryptoObject (even though it won't get used)
-        BiometricPrompt.CryptoObject cryptoObject = credential.getCryptoObject();
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Home address",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height",
-                        "Neg Item",
-                        "Int Two Bytes",
-                        "Int Eight Bytes",
-                        "Int Four Bytes",
-                        "driving_privileges"));
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        assertEquals(12, rd.getEntryNames("org.iso.18013-5.2019").size());
-
-        String ns = "org.iso.18013-5.2019";
-        assertEquals("Alan", Util.getStringEntry(rd, ns, "First name"));
-        assertEquals("Turing", Util.getStringEntry(rd, ns, "Last name"));
-        assertEquals("Maida Vale, London, England", Util.getStringEntry(rd, ns, "Home address"));
-        assertEquals("19120623", Util.getStringEntry(rd, ns, "Birth date"));
-        assertEquals(true, Util.getBooleanEntry(rd, ns, "Cryptanalyst"));
-        assertArrayEquals(new byte[]{0x01, 0x02},
-                Util.getBytestringEntry(rd, ns, "Portrait image"));
-        assertEquals(180, Util.getIntegerEntry(rd, ns, "Height"));
-        assertEquals(-42, Util.getIntegerEntry(rd, ns, "Neg Item"));
-        assertEquals(0x101, Util.getIntegerEntry(rd, ns, "Int Two Bytes"));
-        assertEquals(0x10001, Util.getIntegerEntry(rd, ns, "Int Four Bytes"));
-        assertEquals(0x100000001L, Util.getIntegerEntry(rd, ns, "Int Eight Bytes"));
-        byte[] drivingPrivileges = getExampleDrivingPrivilegesCbor();
-        assertArrayEquals(drivingPrivileges, rd.getEntry(ns, "driving_privileges"));
-
-        assertEquals("{\n"
-                + "  'org.iso.18013-5.2019' : {\n"
-                + "    'Height' : 180,\n"
-                + "    'Neg Item' : -42,\n"
-                + "    'Last name' : 'Turing',\n"
-                + "    'Birth date' : '19120623',\n"
-                + "    'First name' : 'Alan',\n"
-                + "    'Cryptanalyst' : true,\n"
-                + "    'Home address' : 'Maida Vale, London, England',\n"
-                + "    'Int Two Bytes' : 257,\n"
-                + "    'Int Four Bytes' : 65537,\n"
-                + "    'Portrait image' : [0x01, 0x02],\n"
-                + "    'Int Eight Bytes' : 4294967297,\n"
-                + "    'driving_privileges' : [\n"
-                + "      {\n"
-                + "        'value' : 42,\n"
-                + "        'vehicle_category_code' : 'TODO'\n"
-                + "      }\n"
-                + "    ]\n"
-                + "  }\n"
-                + "}", Util.cborPrettyPrint(Util.canonicalizeCbor(rd.getAuthenticatedData())));
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void testProvisionAndRetrieveMultipleTimes() throws IdentityCredentialException,
-            InvalidKeyException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        // This checks we can do multiple getEntries() calls
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        // We're going to need some authentication keys for this so create some dummy ones.
-        credential.setAvailableAuthenticationKeys(5, 1);
-        Collection<X509Certificate> authKeys = credential.getAuthKeysNeedingCertification();
-        for (X509Certificate authKey : authKeys) {
-            byte[] staticAuthData = new byte[5];
-            credential.storeStaticAuthenticationData(authKey, staticAuthData);
-        }
-
-        KeyPair ephemeralKeyPair = credential.createEphemeralKeyPair();
-        KeyPair readerEphemeralKeyPair = Util.createEphemeralKeyPair();
-        credential.setReaderEphemeralPublicKey(readerEphemeralKeyPair.getPublic());
-        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("First name", "Last name"));
-
-        credential.setSessionTranscript(sessionTranscript);
-        for (int n = 0; n < 3; n++) {
-            ResultData rd = credential.getEntries(
-                    Util.createItemsRequest(entriesToRequest, null),
-                    entriesToRequest,
-                    null);
-            assertEquals("Alan", Util.getStringEntry(rd, "org.iso.18013-5.2019", "First name"));
-            assertEquals("Turing", Util.getStringEntry(rd, "org.iso.18013-5.2019", "Last name"));
-            assertTrue(rd.getMessageAuthenticationCode() != null || rd.getEcdsaSignature() != null);
-        }
-
-        // Now try with a different (but still valid) sessionTranscript - this should fail with
-        // a RuntimeException
-        KeyPair otherEphemeralKeyPair = Util.createEphemeralKeyPair();
-        byte[] otherSessionTranscript = Util.buildSessionTranscript(otherEphemeralKeyPair);
-        try {
-            credential.setSessionTranscript(otherSessionTranscript);
-            assertTrue(false);
-        } catch (RuntimeException e) {
-            // This is the expected path...
-        } catch (Exception e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void testProvisionAndRetrieveWithFiltering() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Home address",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height"));
-        Map<String, Collection<String>> entriesToRequestWithoutHomeAddress = new LinkedHashMap<>();
-        entriesToRequestWithoutHomeAddress.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height"));
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequestWithoutHomeAddress,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        assertEquals(6, rd.getEntryNames("org.iso.18013-5.2019").size());
-
-        String ns = "org.iso.18013-5.2019";
-        assertEquals("Alan", Util.getStringEntry(rd, ns, "First name"));
-        assertEquals("Turing", Util.getStringEntry(rd, ns, "Last name"));
-        assertEquals("19120623", Util.getStringEntry(rd, ns, "Birth date"));
-        assertEquals(true, Util.getBooleanEntry(rd, ns, "Cryptanalyst"));
-        assertArrayEquals(new byte[]{0x01, 0x02},
-                Util.getBytestringEntry(rd, ns, "Portrait image"));
-        assertEquals(180, Util.getIntegerEntry(rd, ns, "Height"));
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void testProvisionAndRetrieveElementWithNoACP() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019", Arrays.asList("No Access"));
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        assertEquals(1, rd.getEntryNames("org.iso.18013-5.2019").size());
-        assertEquals(0, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
-
-        String ns = "org.iso.18013-5.2019";
-        assertEquals(STATUS_NO_ACCESS_CONTROL_PROFILES, rd.getStatus(ns, "No Access"));
-
-        store.deleteCredentialByName("test");
-    }
-
-    // TODO: Make sure we test retrieving an entry with multiple ACPs and test all four cases:
-    //
-    // - ACP1 bad,  ACP2 bad   -> NOT OK
-    // - ACP1 good, ACP2 bad   -> OK
-    // - ACP1 bad,  ACP2 good  -> OK
-    // - ACP1 good, ACP2 good  -> OK
-    //
-
-    @Test
-    public void testProvisionAndRetrieveWithEntryNotInRequest() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Home address",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height"));
-        Map<String, Collection<String>> entriesToRequestWithoutHomeAddress = new LinkedHashMap<>();
-        entriesToRequestWithoutHomeAddress.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Birth date",
-                        "Cryptanalyst",
-                        "Portrait image",
-                        "Height"));
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequestWithoutHomeAddress, null),
-                entriesToRequest,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        assertEquals(7, rd.getEntryNames("org.iso.18013-5.2019").size());
-        assertEquals(6, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
-
-        String ns = "org.iso.18013-5.2019";
-        assertEquals(STATUS_NOT_IN_REQUEST_MESSAGE, rd.getStatus(ns, "Home address"));
-
-        assertEquals("Alan", Util.getStringEntry(rd, ns, "First name"));
-        assertEquals("Turing", Util.getStringEntry(rd, ns, "Last name"));
-        assertEquals("19120623", Util.getStringEntry(rd, ns, "Birth date"));
-        assertEquals(true, Util.getBooleanEntry(rd, ns, "Cryptanalyst"));
-        assertArrayEquals(new byte[]{0x01, 0x02},
-                Util.getBytestringEntry(rd, ns, "Portrait image"));
-        assertEquals(180, Util.getIntegerEntry(rd, ns, "Height"));
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void nonExistentEntries() throws IdentityCredentialException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredential(store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("First name",
-                        "Last name",
-                        "Non-existent Entry"));
-        ResultData rd = credential.getEntries(
-                null,
-                entriesToRequest,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        assertEquals(3, rd.getEntryNames("org.iso.18013-5.2019").size());
-        assertEquals(2, rd.getRetrievedEntryNames("org.iso.18013-5.2019").size());
-
-        String ns = "org.iso.18013-5.2019";
-
-        assertEquals(STATUS_OK, rd.getStatus(ns, "First name"));
-        assertEquals(STATUS_OK, rd.getStatus(ns, "Last name"));
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-existent Entry"));
-        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
-
-        assertEquals("Alan", Util.getStringEntry(rd, ns, "First name"));
-        assertEquals("Turing", Util.getStringEntry(rd, ns, "Last name"));
-        assertNull(rd.getEntry(ns, "Non-existent Entry"));
-        assertNull(rd.getEntry(ns, "Entry not even requested"));
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void multipleNamespaces() throws IdentityCredentialException, CborException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        store.deleteCredentialByName("test");
-        Collection<X509Certificate> certChain = createCredentialMultipleNamespaces(
-                store, "test");
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        // Request these in different order than they are stored
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.example.foobar", Arrays.asList("Foo", "Bar", "Non-exist"));
-        entriesToRequest.put("org.example.barfoo", Arrays.asList("Bar", "Non-exist", "Foo"));
-        entriesToRequest.put("org.example.foofoo", Arrays.asList("Bar", "Foo", "Non-exist"));
-
-        ResultData rd = credential.getEntries(
-                null,
-                entriesToRequest,
-                null);
-
-        // We should get the same number of namespaces back, as we requested - even for namespaces
-        // that do not exist in the credential.
-        //
-        // Additionally, each namespace should have exactly the items requested, in the same order.
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 3);
-
-
-        // First requested namespace - org.example.foobar
-        String ns = "org.example.foobar";
-        assertArrayEquals(new String[]{"Foo", "Bar", "Non-exist"}, rd.getEntryNames(ns).toArray());
-        assertArrayEquals(new String[]{"Foo", "Bar"}, rd.getRetrievedEntryNames(ns).toArray());
-
-        assertEquals(STATUS_OK, rd.getStatus(ns, "Foo"));
-        assertEquals(STATUS_OK, rd.getStatus(ns, "Bar"));
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
-        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
-
-        assertEquals("Bar", Util.getStringEntry(rd, ns, "Foo"));
-        assertEquals("Foo", Util.getStringEntry(rd, ns, "Bar"));
-        assertNull(rd.getEntry(ns, "Non-exist"));
-        assertNull(rd.getEntry(ns, "Entry not even requested"));
-
-        // Second requested namespace - org.example.barfoo
-        ns = "org.example.barfoo";
-        assertArrayEquals(new String[]{"Bar", "Non-exist", "Foo"}, rd.getEntryNames(ns).toArray());
-        assertArrayEquals(new String[]{"Bar", "Foo"}, rd.getRetrievedEntryNames(ns).toArray());
-
-        assertEquals(STATUS_OK, rd.getStatus(ns, "Foo"));
-        assertEquals(STATUS_OK, rd.getStatus(ns, "Bar"));
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
-        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
-
-        assertEquals("Bar", Util.getStringEntry(rd, ns, "Foo"));
-        assertEquals("Foo", Util.getStringEntry(rd, ns, "Bar"));
-        assertNull(rd.getEntry(ns, "Non-exist"));
-        assertNull(rd.getEntry(ns, "Entry not even requested"));
-
-        // Third requested namespace - org.example.foofoo
-        ns = "org.example.foofoo";
-        assertArrayEquals(new String[]{"Bar", "Foo", "Non-exist"}, rd.getEntryNames(ns).toArray());
-        assertEquals(0, rd.getRetrievedEntryNames(ns).size());
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Foo"));
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Bar"));
-        assertEquals(STATUS_NO_SUCH_ENTRY, rd.getStatus(ns, "Non-exist"));
-        assertEquals(STATUS_NOT_REQUESTED, rd.getStatus(ns, "Entry not even requested"));
-
-        // Now check the returned CBOR ... note how it only has entries _and_ namespaces
-        // for data that was returned.
-        //
-        // Importantly, this is unlike the returned ResultData which mirrors one to one the passed
-        // in Map<String,Collection<String>> structure, _including_ ensuring the order is the same
-        // ... (which we - painfully - test for just above.)
-        byte[] resultCbor = rd.getAuthenticatedData();
-        String pretty = Util.cborPrettyPrint(Util.canonicalizeCbor(resultCbor));
-        assertEquals("{\n"
-                + "  'org.example.barfoo' : {\n"
-                + "    'Bar' : 'Foo',\n"
-                + "    'Foo' : 'Bar'\n"
-                + "  },\n"
-                + "  'org.example.foobar' : {\n"
-                + "    'Bar' : 'Foo',\n"
-                + "    'Foo' : 'Bar'\n"
-                + "  }\n"
-                + "}", pretty);
-
-        store.deleteCredentialByName("test");
-    }
-
-    @Test
-    public void testUpdateCredential()
-            throws IdentityCredentialException, CborException,
-            NoSuchAlgorithmException {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-        assumeTrue(store.getCapabilities().isUpdateSupported());
-
-        // Create the credential...
-        //
-        String credentialName = "test";
-        String exampleDocType = "org.example.myDocType";
-        String exampleNs = "org.example.ns";
-        byte[] challenge = {0x01, 0x02};
-        int acpId = 3;
-        store.deleteCredentialByName(credentialName);
-        WritableIdentityCredential wc = store.createCredential(credentialName, exampleDocType);
-        Collection<X509Certificate> certChain = wc.getCredentialKeyCertificateChain(challenge);
-        AccessControlProfile noAuthProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(acpId))
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        Collection<AccessControlProfileId> idsNoAuth = new ArrayList<AccessControlProfileId>();
-        idsNoAuth.add(new AccessControlProfileId(acpId));
-        PersonalizationData personalizationData =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(noAuthProfile)
-                        .putEntry(exampleNs, "first_name", idsNoAuth,
-                                Util.cborEncodeString("John"))
-                        .putEntry(exampleNs, "last_name", idsNoAuth,
-                                Util.cborEncodeString("Smith"))
-                        .build();
-        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
-        byte[] proofOfProvisioning = Util.coseSign1GetData(proofOfProvisioningSignature);
-        byte[] proofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
-                proofOfProvisioning);
-        String pretty = "";
-        try {
-            pretty = Util.cborPrettyPrint(proofOfProvisioning);
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals("[\n"
-                + "  'ProofOfProvisioning',\n"
-                + "  '" + exampleDocType + "',\n"
-                + "  [\n"
-                + "    {\n"
-                + "      'id' : " + acpId + "\n"
-                + "    }\n"
-                + "  ],\n"
-                + "  {\n"
-                + "    '" + exampleNs + "' : [\n"
-                + "      {\n"
-                + "        'name' : 'first_name',\n"
-                + "        'value' : 'John',\n"
-                + "        'accessControlProfiles' : [" + acpId + "]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'last_name',\n"
-                + "        'value' : 'Smith',\n"
-                + "        'accessControlProfiles' : [" + acpId + "]\n"
-                + "      }\n"
-                + "    ]\n"
-                + "  },\n"
-                + "  false\n"
-                + "]", pretty);
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    proofOfProvisioningSignature,
-                    new byte[0], // Additional data
-                    certChain.iterator().next().getPublicKey()));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        IdentityCredential credential = store.getCredentialByName("test",
-                IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-
-        // Configure to use 3 auth keys and endorse all of them
-        credential.setAvailableAuthenticationKeys(3, 5);
-        Collection<X509Certificate> certificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(3, certificates.size());
-        for (X509Certificate cert : certificates) {
-            credential.storeStaticAuthenticationData(cert, new byte[]{1, 2});
-            // Check each cert has the correct ProofOfProvisioning SHA-256 in the
-            // ProofOfBinding CBOR stored at OID 1.3.6.1.4.1.11129.2.1.26
-            byte[] popSha256FromCert = Util.getPopSha256FromAuthKeyCert(cert);
-            assertArrayEquals(popSha256FromCert, proofOfProvisioningSha256);
-        }
-        assertEquals(0, credential.getAuthKeysNeedingCertification().size());
-
-        // Update the credential
-        AccessControlProfile updNoAuthProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(31))
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        Collection<AccessControlProfileId> updIds = new ArrayList<AccessControlProfileId>();
-        updIds.add(new AccessControlProfileId(31));
-        String updNs = "org.iso.other_ns";
-        PersonalizationData updPd =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(updNoAuthProfile)
-                        .putEntry(updNs, "first_name", updIds,
-                                Util.cborEncodeString("Lawrence"))
-                        .putEntry(updNs, "last_name", updIds,
-                                Util.cborEncodeString("Waterhouse"))
-                        .build();
-
-        byte[] updProofOfProvisioningSignature = credential.update(updPd);
-
-        // Check the ProofOfProvisioning for the updated data (contents _and_ signature)
-        byte[] updProofOfProvisioning = Util.coseSign1GetData(updProofOfProvisioningSignature);
-        byte[] updProofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
-                updProofOfProvisioning);
-        try {
-            pretty = Util.cborPrettyPrint(updProofOfProvisioning);
-        } catch (CborException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        assertEquals("[\n"
-                + "  'ProofOfProvisioning',\n"
-                + "  '" + exampleDocType + "',\n"
-                + "  [\n"
-                + "    {\n"
-                + "      'id' : 31\n"
-                + "    }\n"
-                + "  ],\n"
-                + "  {\n"
-                + "    'org.iso.other_ns' : [\n"
-                + "      {\n"
-                + "        'name' : 'first_name',\n"
-                + "        'value' : 'Lawrence',\n"
-                + "        'accessControlProfiles' : [31]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'last_name',\n"
-                + "        'value' : 'Waterhouse',\n"
-                + "        'accessControlProfiles' : [31]\n"
-                + "      }\n"
-                + "    ]\n"
-                + "  },\n"
-                + "  false\n"
-                + "]", pretty);
-        try {
-            assertTrue(Util.coseSign1CheckSignature(
-                    updProofOfProvisioningSignature,
-                    new byte[0], // Additional data
-                    certChain.iterator().next().getPublicKey()));
-        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-        // Check the returned CredentialKey cert chain from the now updated
-        // IdentityCredential matches the original certificate chain.
-        //
-        Collection<X509Certificate> readBackCertChain =
-                credential.getCredentialKeyCertificateChain();
-        assertEquals(certChain.size(), readBackCertChain.size());
-        Iterator<X509Certificate> it = readBackCertChain.iterator();
-        for (X509Certificate expectedCert : certChain) {
-            X509Certificate readBackCert = it.next();
-            assertEquals(expectedCert, readBackCert);
-        }
-
-        // Check that the credential is still configured to use 3 auth keys and
-        // that they all need replacement... then check and endorse the
-        // replacements
-        Collection<X509Certificate> updCertificates = credential.getAuthKeysNeedingCertification();
-        assertEquals(3, updCertificates.size());
-        for (X509Certificate cert : updCertificates) {
-            credential.storeStaticAuthenticationData(cert, new byte[]{1, 2});
-            // Check each cert has the correct - *updated* - ProofOfProvisioning SHA-256 in the
-            // ProofOfBinding CBOR stored at OID 1.3.6.1.4.1.11129.2.1.25
-            byte[] popSha256FromCert = Util.getPopSha256FromAuthKeyCert(cert);
-            assertArrayEquals(popSha256FromCert, updProofOfProvisioningSha256);
-        }
-        assertEquals(0, credential.getAuthKeysNeedingCertification().size());
-
-        // Check we can read back the updated data and it matches what we
-        // updated it to.
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put(updNs,
-                Arrays.asList("first_name",
-                        "last_name"));
-        ResultData rd = credential.getEntries(
-                Util.createItemsRequest(entriesToRequest, null),
-                entriesToRequest,
-                null);
-
-        Collection<String> resultNamespaces = rd.getNamespaces();
-        assertEquals(resultNamespaces.size(), 1);
-        assertEquals(updNs, resultNamespaces.iterator().next());
-        assertEquals(2, rd.getEntryNames(updNs).size());
-
-        assertEquals("Lawrence", Util.getStringEntry(rd, updNs, "first_name"));
-        assertEquals("Waterhouse", Util.getStringEntry(rd, updNs, "last_name"));
-
-        store.deleteCredentialByName("test");
-    }
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ReaderAuthTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ReaderAuthTest.java
deleted file mode 100644
index f2446c7..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/ReaderAuthTest.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static androidx.security.identity.IdentityCredentialStore.CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256;
-import static androidx.security.identity.ResultData.STATUS_NOT_IN_REQUEST_MESSAGE;
-import static androidx.security.identity.ResultData.STATUS_OK;
-import static androidx.security.identity.ResultData.STATUS_READER_AUTHENTICATION_FAILED;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import android.content.Context;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyProperties;
-
-import androidx.security.identity.AccessControlProfile;
-import androidx.security.identity.AccessControlProfileId;
-import androidx.security.identity.IdentityCredential;
-import androidx.security.identity.IdentityCredentialException;
-import androidx.security.identity.IdentityCredentialStore;
-import androidx.security.identity.InvalidReaderSignatureException;
-import androidx.security.identity.PersonalizationData;
-import androidx.security.identity.ResultData;
-import androidx.security.identity.WritableIdentityCredential;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.IOException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.SignatureException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import co.nstant.in.cbor.CborException;
-
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class ReaderAuthTest {
-    private static final String TAG = "ReaderAuthTest";
-
-
-    static KeyPair createReaderKey(String readerKeyAlias, boolean createCaKey)
-            throws InvalidAlgorithmParameterException, NoSuchProviderException,
-            NoSuchAlgorithmException {
-        KeyPairGenerator kpg = KeyPairGenerator.getInstance(
-                KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
-        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
-                readerKeyAlias,
-                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
-                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512);
-        kpg.initialize(builder.build());
-        return kpg.generateKeyPair();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Test
-    public void readerAuth()
-            throws IdentityCredentialException, CborException, InvalidAlgorithmParameterException,
-            KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException,
-            NoSuchProviderException, InvalidKeyException, SignatureException {
-
-        // We create two reader keys - 'A' and 'B' - and then generate certificates for each of
-        // them, signed by a third key 'C'. We then provision a document with four elements where
-        // each element is configured to be accessible only by 'A', 'B', ('A' or 'B'), and 'C'
-        // respectively. The names of each element reflect this:
-        //
-        //  - "Accessible by A"
-        //  - "Accessible by B"
-        //  - "Accessible by A or B"
-        //  - "Accessible by C"
-        //
-        // We then try reading from the credential in the following cases
-        //
-        //  - Request signed by A and presenting certChain {certA}
-        //    - this should return the following data elements:
-        //      - "Accessible by A"
-        //      - "Accessible by A or B"
-        //
-        //  - Request signed by A and presenting certChain {certA_SignedBy_certC, certC}
-        //    - this should return the following data elements:
-        //      - "Accessible by A"
-        //      - "Accessible by A or B"
-        //      - "Accessible by C"
-        //
-        //  - Request signed by B and presenting certChain {certB}
-        //    - this should return the following data elements:
-        //      - "Accessible by B"
-        //      - "Accessible by A or B"
-        //
-        //  - Request signed by B and presenting certChain {certB_SignedBy_certC, certC}
-        //    - this should return the following data elements:
-        //      - "Accessible by B"
-        //      - "Accessible by A or B"
-        //      - "Accessible by C"
-        //
-        //  - Reader presenting an invalid certificate chain
-        //
-        // We test all this in the following.
-        //
-
-
-        // Generate keys and certificate chains.
-        KeyPair readerKeyPairA = createReaderKey("readerKeyA", false);
-        KeyPair readerKeyPairB = createReaderKey("readerKeyB", false);
-        KeyPair readerKeyPairC = createReaderKey("readerKeyC", true);
-
-        KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
-        ks.load(null);
-        X509Certificate certA = (X509Certificate) ks.getCertificate("readerKeyA");
-        X509Certificate certB = (X509Certificate) ks.getCertificate("readerKeyB");
-        X509Certificate certA_SignedBy_certC = Util.signPublicKeyWithPrivateKey("readerKeyA",
-                "readerKeyC");
-        X509Certificate certB_SignedBy_certC = Util.signPublicKeyWithPrivateKey("readerKeyB",
-                "readerKeyC");
-        X509Certificate certC = (X509Certificate) ks.getCertificate("readerKeyC");
-
-        Collection<X509Certificate> certChainForA = new ArrayList<>();
-        certChainForA.add(certA);
-        Collection<X509Certificate> certChainForAwithC = new ArrayList<>();
-        certChainForAwithC.add(certA_SignedBy_certC);
-        certChainForAwithC.add(certC);
-
-        Collection<X509Certificate> certChainForB = new ArrayList<>();
-        certChainForB.add(certB);
-        Collection<X509Certificate> certChainForBwithC = new ArrayList<>();
-        certChainForBwithC.add(certB_SignedBy_certC);
-        certChainForBwithC.add(certC);
-
-        // Provision the credential.
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-        IdentityCredentialStore store = Util.getIdentityCredentialStore(appContext);
-
-        String credentialName = "readerAuthTestCredential";
-        store.deleteCredentialByName(credentialName);
-        WritableIdentityCredential wc = store.createCredential(credentialName,
-                "org.iso.18013-5.2019.mdl");
-
-        // Profile 0 (reader A authentication)
-        AccessControlProfile readerAProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(0))
-                        .setReaderCertificate(certA)
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        // Profile 1 (reader B authentication)
-        AccessControlProfile readerBProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(1))
-                        .setReaderCertificate(certB)
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        // Profile 2 (reader C authentication)
-        AccessControlProfile readerCProfile =
-                new AccessControlProfile.Builder(new AccessControlProfileId(2))
-                        .setReaderCertificate(certC)
-                        .setUserAuthenticationRequired(false)
-                        .build();
-        Collection<AccessControlProfileId> idsReaderAuthA =
-                new ArrayList<AccessControlProfileId>();
-        idsReaderAuthA.add(new AccessControlProfileId(0));
-        Collection<AccessControlProfileId> idsReaderAuthB =
-                new ArrayList<AccessControlProfileId>();
-        idsReaderAuthB.add(new AccessControlProfileId(1));
-        Collection<AccessControlProfileId> idsReaderAuthAorB =
-                new ArrayList<AccessControlProfileId>();
-        idsReaderAuthAorB.add(new AccessControlProfileId(0));
-        idsReaderAuthAorB.add(new AccessControlProfileId(1));
-        Collection<AccessControlProfileId> idsReaderAuthC =
-                new ArrayList<AccessControlProfileId>();
-        idsReaderAuthC.add(new AccessControlProfileId(2));
-        String mdlNs = "org.iso.18013-5.2019";
-        PersonalizationData personalizationData =
-                new PersonalizationData.Builder()
-                        .addAccessControlProfile(readerAProfile)
-                        .addAccessControlProfile(readerBProfile)
-                        .addAccessControlProfile(readerCProfile)
-                        .putEntry(mdlNs, "Accessible to A", idsReaderAuthA,
-                                Util.cborEncodeString("foo"))
-                        .putEntry(mdlNs, "Accessible to B", idsReaderAuthB,
-                                Util.cborEncodeString("bar"))
-                        .putEntry(mdlNs, "Accessible to A or B", idsReaderAuthAorB,
-                                Util.cborEncodeString("baz"))
-                        .putEntry(mdlNs, "Accessible to C", idsReaderAuthC,
-                                Util.cborEncodeString("bat"))
-                        .build();
-        byte[] proofOfProvisioningSignature = wc.personalize(personalizationData);
-        byte[] proofOfProvisioning = Util.coseSign1GetData(proofOfProvisioningSignature);
-
-        String pretty = Util.cborPrettyPrint(proofOfProvisioning);
-        pretty = Util.replaceLine(pretty, 6, "      'readerCertificate' : [] // Removed");
-        pretty = Util.replaceLine(pretty, 10, "      'readerCertificate' : [] // Removed");
-        pretty = Util.replaceLine(pretty, 14, "      'readerCertificate' : [] // Removed");
-        assertEquals("[\n"
-                + "  'ProofOfProvisioning',\n"
-                + "  'org.iso.18013-5.2019.mdl',\n"
-                + "  [\n"
-                + "    {\n"
-                + "      'id' : 0,\n"
-                + "      'readerCertificate' : [] // Removed\n"
-                + "    },\n"
-                + "    {\n"
-                + "      'id' : 1,\n"
-                + "      'readerCertificate' : [] // Removed\n"
-                + "    },\n"
-                + "    {\n"
-                + "      'id' : 2,\n"
-                + "      'readerCertificate' : [] // Removed\n"
-                + "    }\n"
-                + "  ],\n"
-                + "  {\n"
-                + "    'org.iso.18013-5.2019' : [\n"
-                + "      {\n"
-                + "        'name' : 'Accessible to A',\n"
-                + "        'value' : 'foo',\n"
-                + "        'accessControlProfiles' : [0]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Accessible to B',\n"
-                + "        'value' : 'bar',\n"
-                + "        'accessControlProfiles' : [1]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Accessible to A or B',\n"
-                + "        'value' : 'baz',\n"
-                + "        'accessControlProfiles' : [0, 1]\n"
-                + "      },\n"
-                + "      {\n"
-                + "        'name' : 'Accessible to C',\n"
-                + "        'value' : 'bat',\n"
-                + "        'accessControlProfiles' : [2]\n"
-                + "      }\n"
-                + "    ]\n"
-                + "  },\n"
-                + "  false\n"
-                + "]", pretty);
-
-
-        // Get the credential we'll be reading from and provision it with a sufficient number
-        // of dynamic auth keys
-        IdentityCredential credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        assertNotNull(credential);
-        credential.setAvailableAuthenticationKeys(1, 10);
-        Collection<X509Certificate> dynAuthKeyCerts = credential.getAuthKeysNeedingCertification();
-        credential.storeStaticAuthenticationData(dynAuthKeyCerts.iterator().next(), new byte[0]);
-        KeyPair eKeyPair = credential.createEphemeralKeyPair();
-
-        Collection<String> entryNames;
-        Collection<String> resultNamespaces;
-        ResultData rd;
-
-        // Create the request message which will be signed by the reader.
-        Map<String, Collection<String>> entriesToRequest = new LinkedHashMap<>();
-        entriesToRequest.put("org.iso.18013-5.2019",
-                Arrays.asList("Accessible to A",
-                        "Accessible to B",
-                        "Accessible to A or B",
-                        "Accessible to C"));
-        byte[] requestMessage = Util.createItemsRequest(entriesToRequest,
-                "org.iso.18013-5.2019.mdl");
-
-        // Signing with A and presenting cert chain {certA}.
-        //
-        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForA, requestMessage,
-                entriesToRequest);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(2, entryNames.size());
-        assertTrue(entryNames.contains("Accessible to A"));
-        assertTrue(entryNames.contains("Accessible to A or B"));
-        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
-        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED, rd.getStatus("org.iso.18013-5.2019",
-                "Accessible to B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED, rd.getStatus("org.iso.18013-5.2019",
-                "Accessible to C"));
-
-        // Signing with A and presenting cert chain {certA} and providing a requestMessage
-        // that doesn't request "Accessible to A or B" in the signed |requestMessage| but
-        // includes it in |entriesToRequest| (which is not signed)... should result
-        // in requesting "Accessible to A or B" failing with NOT_IN_REQUEST_MESSAGE
-        // and "Accessible to B" and "Accessible to C" failing with
-        // READER_AUTHENTICATION_FAILED.
-        //
-        Map<String, Collection<String>> entriesToRequest2 = new LinkedHashMap<>();
-        entriesToRequest2.put("org.iso.18013-5.2019",
-                Arrays.asList("Accessible to A",
-                        "Accessible to B",
-                        "Accessible to C"));
-        byte[] requestMessage2 = Util.createItemsRequest(entriesToRequest2,
-                "org.iso.18013-5.2019.mdl");
-        credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        eKeyPair = credential.createEphemeralKeyPair();
-        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForA,
-                requestMessage2, entriesToRequest);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(1, entryNames.size());
-        assertTrue(entryNames.contains("Accessible to A"));
-        assertEquals(STATUS_OK, rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
-        assertEquals(STATUS_NOT_IN_REQUEST_MESSAGE,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to C"));
-
-        // Signing with A and presenting cert chain {certA_SignedBy_certC, certC}.
-        //
-        credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        eKeyPair = credential.createEphemeralKeyPair();
-        rd = retrieveForReader(credential, eKeyPair, readerKeyPairA, certChainForAwithC,
-                requestMessage, entriesToRequest);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(3, entryNames.size());
-        assertTrue(entryNames.contains("Accessible to A"));
-        assertTrue(entryNames.contains("Accessible to A or B"));
-        assertTrue(entryNames.contains("Accessible to C"));
-
-        // Signing with B and presenting cert chain {certB}.
-        //
-        credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        eKeyPair = credential.createEphemeralKeyPair();
-        rd = retrieveForReader(credential, eKeyPair, readerKeyPairB, certChainForB, requestMessage,
-                entriesToRequest);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(2, entryNames.size());
-        assertTrue(entryNames.contains("Accessible to B"));
-        assertTrue(entryNames.contains("Accessible to A or B"));
-
-        // Signing with B and presenting cert chain {certB_SignedBy_certC, certC}.
-        //
-        credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        eKeyPair = credential.createEphemeralKeyPair();
-        rd = retrieveForReader(credential, eKeyPair, readerKeyPairB, certChainForBwithC,
-                requestMessage, entriesToRequest);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(3, entryNames.size());
-        assertTrue(entryNames.contains("Accessible to B"));
-        assertTrue(entryNames.contains("Accessible to A or B"));
-        assertTrue(entryNames.contains("Accessible to C"));
-
-        // Signing with B and presenting invalid cert chain {certB, certC} should fail
-        // because certB is not signed by certC.
-        try {
-            credential = store.getCredentialByName(credentialName,
-                    CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-            eKeyPair = credential.createEphemeralKeyPair();
-            Collection<X509Certificate> certChain = new ArrayList<>();
-            certChain.add(certB);
-            certChain.add(certC);
-            retrieveForReader(credential, eKeyPair, readerKeyPairB, certChain, requestMessage,
-                    entriesToRequest);
-            assertTrue(false);
-        } catch (InvalidReaderSignatureException e) {
-            // Do nothing, this is the expected exception...
-        }
-
-        // No request message should result in returning zero data elements - they're
-        // all protected by reader authentication.
-        //
-        credential = store.getCredentialByName(credentialName,
-                CIPHERSUITE_ECDHE_HKDF_ECDSA_WITH_AES_256_GCM_SHA256);
-        eKeyPair = credential.createEphemeralKeyPair();
-        rd = credential.getEntries(
-                null,
-                entriesToRequest,
-                null);
-        resultNamespaces = rd.getNamespaces();
-        assertEquals(1, resultNamespaces.size());
-        assertEquals("org.iso.18013-5.2019", resultNamespaces.iterator().next());
-        entryNames = rd.getRetrievedEntryNames("org.iso.18013-5.2019");
-        assertEquals(0, entryNames.size());
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to A"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to A or B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to B"));
-        assertEquals(STATUS_READER_AUTHENTICATION_FAILED,
-                rd.getStatus("org.iso.18013-5.2019", "Accessible to C"));
-    }
-
-    private ResultData retrieveForReader(
-            IdentityCredential credential,
-            KeyPair ephemeralKeyPair,
-            KeyPair readerKeyToSignWith,
-            Collection<X509Certificate> readerCertificateChainToPresent,
-            byte[] requestMessage,
-            Map<String, Collection<String>> entriesToRequest)
-            throws IdentityCredentialException, CborException, InvalidAlgorithmParameterException,
-            KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException,
-            NoSuchProviderException, InvalidKeyException, SignatureException {
-
-        byte[] sessionTranscript = Util.buildSessionTranscript(ephemeralKeyPair);
-
-        // Finally, create the structure that the reader signs, and sign it.
-        byte[] readerAuthentication = Util.buildReaderAuthenticationCbor(
-                sessionTranscript,
-                requestMessage);
-        byte[] readerAuthenticationBytes =
-                Util.prependSemanticTagForEncodedCbor(readerAuthentication);
-        byte[] readerSignature = Util.coseSign1Sign(readerKeyToSignWith.getPrivate(),
-                null, // payload
-                readerAuthenticationBytes, // detached content
-                readerCertificateChainToPresent); // certificate-chain
-
-        // Now issue the request.
-        credential.setSessionTranscript(sessionTranscript);
-        ResultData result = credential.getEntries(
-                requestMessage,
-                entriesToRequest,
-                readerSignature);
-        return result;
-    }
-
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/Util.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/Util.java
deleted file mode 100644
index a3ab3af..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/Util.java
+++ /dev/null
@@ -1,1385 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import android.content.Context;
-import android.security.keystore.KeyProperties;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.security.identity.IdentityCredentialStore;
-import androidx.security.identity.ResultData;
-
-import org.bouncycastle.asn1.ASN1InputStream;
-import org.bouncycastle.asn1.ASN1OctetString;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.ECPublicKey;
-import java.security.spec.ECGenParameterSpec;
-import java.security.spec.ECPoint;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Formatter;
-import java.util.GregorianCalendar;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-import javax.crypto.KeyAgreement;
-import javax.crypto.Mac;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
-import co.nstant.in.cbor.CborBuilder;
-import co.nstant.in.cbor.CborDecoder;
-import co.nstant.in.cbor.CborEncoder;
-import co.nstant.in.cbor.CborException;
-import co.nstant.in.cbor.builder.ArrayBuilder;
-import co.nstant.in.cbor.builder.MapBuilder;
-import co.nstant.in.cbor.model.AbstractFloat;
-import co.nstant.in.cbor.model.Array;
-import co.nstant.in.cbor.model.ByteString;
-import co.nstant.in.cbor.model.DataItem;
-import co.nstant.in.cbor.model.DoublePrecisionFloat;
-import co.nstant.in.cbor.model.MajorType;
-import co.nstant.in.cbor.model.NegativeInteger;
-import co.nstant.in.cbor.model.SimpleValue;
-import co.nstant.in.cbor.model.SimpleValueType;
-import co.nstant.in.cbor.model.SpecialType;
-import co.nstant.in.cbor.model.UnicodeString;
-import co.nstant.in.cbor.model.UnsignedInteger;
-
-class Util {
-    private static final String TAG = "Util";
-
-    static IdentityCredentialStore getIdentityCredentialStore(@NonNull Context context) {
-        // We generally want to run all tests against the software implementation since
-        // hardware-based implementations are already tested against CTS and VTS and the bulk
-        // of the code in the Jetpack is the software implementation. This also helps avoid
-        // whatever bugs or flakiness that may exist in hardware implementations.
-        //
-        // Occasionally it's useful for a developer to test that the hardware-backed paths
-        // (HardwareIdentityCredentialStore + friends) work as intended. This can be done by
-        // uncommenting the line below and making sure it runs on a device with the appropriate
-        // hardware support.
-        //
-        // See b/164480361 for more discussion.
-        //
-        //return IdentityCredentialStore.getHardwareInstance(context);
-        return IdentityCredentialStore.getSoftwareInstance(context);
-    }
-
-    static byte[] canonicalizeCbor(byte[] encodedCbor) throws CborException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(encodedCbor);
-        List<DataItem> dataItems = new CborDecoder(bais).decode();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        for (DataItem dataItem : dataItems) {
-            CborEncoder encoder = new CborEncoder(baos);
-            encoder.encode(dataItem);
-        }
-        return baos.toByteArray();
-    }
-
-
-    static String cborPrettyPrint(byte[] encodedBytes) throws CborException {
-        StringBuilder sb = new StringBuilder();
-
-        ByteArrayInputStream bais = new ByteArrayInputStream(encodedBytes);
-        List<DataItem> dataItems = new CborDecoder(bais).decode();
-        int count = 0;
-        for (DataItem dataItem : dataItems) {
-            if (count > 0) {
-                sb.append(",\n");
-            }
-            cborPrettyPrintDataItem(sb, 0, dataItem);
-            count++;
-        }
-
-        return sb.toString();
-    }
-
-    // Returns true iff all elements in |items| are not compound (e.g. an array or a map).
-    static boolean cborAreAllDataItemsNonCompound(List<DataItem> items) {
-        for (DataItem item : items) {
-            switch (item.getMajorType()) {
-                case ARRAY:
-                case MAP:
-                    return false;
-            }
-        }
-        return true;
-    }
-
-    static void cborPrettyPrintDataItem(StringBuilder sb, int indent, DataItem dataItem) {
-        StringBuilder indentBuilder = new StringBuilder();
-        for (int n = 0; n < indent; n++) {
-            indentBuilder.append(' ');
-        }
-        String indentString = indentBuilder.toString();
-
-        if (dataItem.hasTag()) {
-            sb.append(String.format("tag %d ", dataItem.getTag().getValue()));
-        }
-
-        switch (dataItem.getMajorType()) {
-            case INVALID:
-                // TODO: throw
-                sb.append("<invalid>");
-                break;
-            case UNSIGNED_INTEGER: {
-                // Major type 0: an unsigned integer.
-                BigInteger value = ((UnsignedInteger) dataItem).getValue();
-                sb.append(value);
-            }
-            break;
-            case NEGATIVE_INTEGER: {
-                // Major type 1: a negative integer.
-                BigInteger value = ((NegativeInteger) dataItem).getValue();
-                sb.append(value);
-            }
-            break;
-            case BYTE_STRING: {
-                // Major type 2: a byte string.
-                byte[] value = ((ByteString) dataItem).getBytes();
-                sb.append("[");
-                int count = 0;
-                for (byte b : value) {
-                    if (count > 0) {
-                        sb.append(", ");
-                    }
-                    sb.append(String.format("0x%02x", b));
-                    count++;
-                }
-                sb.append("]");
-            }
-            break;
-            case UNICODE_STRING: {
-                // Major type 3: string of Unicode characters that is encoded as UTF-8 [RFC3629].
-                String value = ((UnicodeString) dataItem).getString();
-                // TODO: escape ' in |value|
-                sb.append("'" + value + "'");
-            }
-            break;
-            case ARRAY: {
-                // Major type 4: an array of data items.
-                List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
-                if (items.size() == 0) {
-                    sb.append("[]");
-                } else if (cborAreAllDataItemsNonCompound(items)) {
-                    // The case where everything fits on one line.
-                    sb.append("[");
-                    int count = 0;
-                    for (DataItem item : items) {
-                        cborPrettyPrintDataItem(sb, indent, item);
-                        if (++count < items.size()) {
-                            sb.append(", ");
-                        }
-                    }
-                    sb.append("]");
-                } else {
-                    sb.append("[\n" + indentString);
-                    int count = 0;
-                    for (DataItem item : items) {
-                        sb.append("  ");
-                        cborPrettyPrintDataItem(sb, indent + 2, item);
-                        if (++count < items.size()) {
-                            sb.append(",");
-                        }
-                        sb.append("\n" + indentString);
-                    }
-                    sb.append("]");
-                }
-            }
-            break;
-            case MAP: {
-                // Major type 5: a map of pairs of data items.
-                Collection<DataItem> keys = ((co.nstant.in.cbor.model.Map) dataItem).getKeys();
-                if (keys.size() == 0) {
-                    sb.append("{}");
-                } else {
-                    sb.append("{\n" + indentString);
-                    int count = 0;
-                    for (DataItem key : keys) {
-                        sb.append("  ");
-                        DataItem value = ((co.nstant.in.cbor.model.Map) dataItem).get(key);
-                        cborPrettyPrintDataItem(sb, indent + 2, key);
-                        sb.append(" : ");
-                        cborPrettyPrintDataItem(sb, indent + 2, value);
-                        if (++count < keys.size()) {
-                            sb.append(",");
-                        }
-                        sb.append("\n" + indentString);
-                    }
-                    sb.append("}");
-                }
-            }
-            break;
-            case TAG:
-                // Major type 6: optional semantic tagging of other major types
-                //
-                // We never encounter this one since it's automatically handled via the
-                // DataItem that is tagged.
-                throw new RuntimeException("Semantic tag data item not expected");
-
-            case SPECIAL:
-                // Major type 7: floating point numbers and simple data types that need no
-                // content, as well as the "break" stop code.
-                if (dataItem instanceof SimpleValue) {
-                    switch (((SimpleValue) dataItem).getSimpleValueType()) {
-                        case FALSE:
-                            sb.append("false");
-                            break;
-                        case TRUE:
-                            sb.append("true");
-                            break;
-                        case NULL:
-                            sb.append("null");
-                            break;
-                        case UNDEFINED:
-                            sb.append("undefined");
-                            break;
-                        case RESERVED:
-                            sb.append("reserved");
-                            break;
-                        case UNALLOCATED:
-                            sb.append("unallocated");
-                            break;
-                    }
-                } else if (dataItem instanceof DoublePrecisionFloat) {
-                    DecimalFormat df = new DecimalFormat("0",
-                            DecimalFormatSymbols.getInstance(Locale.ENGLISH));
-                    df.setMaximumFractionDigits(340);
-                    sb.append(df.format(((DoublePrecisionFloat) dataItem).getValue()));
-                } else if (dataItem instanceof AbstractFloat) {
-                    DecimalFormat df = new DecimalFormat("0",
-                            DecimalFormatSymbols.getInstance(Locale.ENGLISH));
-                    df.setMaximumFractionDigits(340);
-                    sb.append(df.format(((AbstractFloat) dataItem).getValue()));
-                } else {
-                    sb.append("break");
-                }
-                break;
-        }
-    }
-
-    public static byte[] encodeCbor(List<DataItem> dataItems) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        CborEncoder encoder = new CborEncoder(baos);
-        try {
-            encoder.encode(dataItems);
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding data", e);
-        }
-        return baos.toByteArray();
-    }
-
-    public static byte[] coseBuildToBeSigned(byte[] encodedProtectedHeaders,
-            byte[] payload,
-            byte[] detachedContent) {
-        CborBuilder sigStructure = new CborBuilder();
-        ArrayBuilder<CborBuilder> array = sigStructure.addArray();
-
-        array.add("Signature1");
-        array.add(encodedProtectedHeaders);
-
-        // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
-        // so external_aad is the empty bstr
-        byte[] emptyExternalAad = new byte[0];
-        array.add(emptyExternalAad);
-
-        // Next field is the payload, independently of how it's transported (RFC
-        // 8152 section 4.4). Since our API specifies only one of |data| and
-        // |detachedContent| can be non-empty, it's simply just the non-empty one.
-        if (payload != null && payload.length > 0) {
-            array.add(payload);
-        } else {
-            array.add(detachedContent);
-        }
-        array.end();
-        return encodeCbor(sigStructure.build());
-    }
-
-    private static final int COSE_LABEL_ALG = 1;
-    private static final int COSE_LABEL_X5CHAIN = 33;  // temporary identifier
-
-    // From "COSE Algorithms" registry
-    private static final int COSE_ALG_ECDSA_256 = -7;
-    private static final int COSE_ALG_HMAC_256_256 = 5;
-
-    private static byte[] signatureDerToCose(byte[] signature) {
-        if (signature.length > 128) {
-            throw new RuntimeException(
-                    "Unexpected length " + signature.length + ", expected less than 128");
-        }
-        if (signature[0] != 0x30) {
-            throw new RuntimeException("Unexpected first byte " + signature[0] + ", expected 0x30");
-        }
-        if ((signature[1] & 0x80) != 0x00) {
-            throw new RuntimeException(
-                    "Unexpected second byte " + signature[1] + ", bit 7 shouldn't be set");
-        }
-        int rOffset = 2;
-        int rSize = signature[rOffset + 1];
-        byte[] rBytes = stripLeadingZeroes(
-                Arrays.copyOfRange(signature, rOffset + 2, rOffset + rSize + 2));
-
-        int sOffset = rOffset + 2 + rSize;
-        int sSize = signature[sOffset + 1];
-        byte[] sBytes = stripLeadingZeroes(
-                Arrays.copyOfRange(signature, sOffset + 2, sOffset + sSize + 2));
-
-        if (rBytes.length > 32) {
-            throw new RuntimeException("rBytes.length is " + rBytes.length + " which is > 32");
-        }
-        if (sBytes.length > 32) {
-            throw new RuntimeException("sBytes.length is " + sBytes.length + " which is > 32");
-        }
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            for (int n = 0; n < 32 - rBytes.length; n++) {
-                baos.write(0x00);
-            }
-            baos.write(rBytes);
-            for (int n = 0; n < 32 - sBytes.length; n++) {
-                baos.write(0x00);
-            }
-            baos.write(sBytes);
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-        return baos.toByteArray();
-    }
-
-    // Adds leading 0x00 if the first encoded byte MSB is set.
-    private static byte[] encodePositiveBigInteger(BigInteger i) {
-        byte[] bytes = i.toByteArray();
-        if ((bytes[0] & 0x80) != 0) {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            try {
-                baos.write(0x00);
-                baos.write(bytes);
-            } catch (IOException e) {
-                e.printStackTrace();
-                throw new RuntimeException("Failed writing data", e);
-            }
-            bytes = baos.toByteArray();
-        }
-        return bytes;
-    }
-
-    private static byte[] signatureCoseToDer(byte[] signature) {
-        if (signature.length != 64) {
-            throw new RuntimeException("signature.length is " + signature.length + ", expected 64");
-        }
-        // r and s are always positive and may use all 256 bits so use the constructor which
-        // parses them as unsigned.
-        BigInteger r = new BigInteger(1, Arrays.copyOfRange(signature, 0, 32));
-        BigInteger s = new BigInteger(1, Arrays.copyOfRange(signature, 32, 64));
-        byte[] rBytes = encodePositiveBigInteger(r);
-        byte[] sBytes = encodePositiveBigInteger(s);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            baos.write(0x30);
-            baos.write(2 + rBytes.length + 2 + sBytes.length);
-            baos.write(0x02);
-            baos.write(rBytes.length);
-            baos.write(rBytes);
-            baos.write(0x02);
-            baos.write(sBytes.length);
-            baos.write(sBytes);
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-        return baos.toByteArray();
-    }
-
-    public static byte[] coseSign1Sign(PrivateKey key,
-            @Nullable byte[] data,
-            byte[] detachedContent,
-            @Nullable Collection<X509Certificate> certificateChain)
-            throws NoSuchAlgorithmException, InvalidKeyException, CertificateEncodingException {
-
-        int dataLen = (data != null ? data.length : 0);
-        int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
-        if (dataLen > 0 && detachedContentLen > 0) {
-            throw new RuntimeException("data and detachedContent cannot both be non-empty");
-        }
-
-        CborBuilder protectedHeaders = new CborBuilder();
-        MapBuilder<CborBuilder> protectedHeadersMap = protectedHeaders.addMap();
-        protectedHeadersMap.put(COSE_LABEL_ALG, COSE_ALG_ECDSA_256);
-        byte[] protectedHeadersBytes = encodeCbor(protectedHeaders.build());
-
-        byte[] toBeSigned = coseBuildToBeSigned(protectedHeadersBytes, data, detachedContent);
-
-        byte[] coseSignature = null;
-        try {
-            Signature s = Signature.getInstance("SHA256withECDSA");
-            s.initSign(key);
-            s.update(toBeSigned);
-            byte[] derSignature = s.sign();
-            coseSignature = signatureDerToCose(derSignature);
-        } catch (SignatureException e) {
-            throw new RuntimeException("Error signing data");
-        }
-
-        CborBuilder builder = new CborBuilder();
-        ArrayBuilder<CborBuilder> array = builder.addArray();
-        array.add(protectedHeadersBytes);
-        MapBuilder<ArrayBuilder<CborBuilder>> unprotectedHeaders = array.addMap();
-        if (certificateChain != null && certificateChain.size() > 0) {
-            if (certificateChain.size() == 1) {
-                X509Certificate cert = certificateChain.iterator().next();
-                unprotectedHeaders.put(COSE_LABEL_X5CHAIN, cert.getEncoded());
-            } else {
-                ArrayBuilder<MapBuilder<ArrayBuilder<CborBuilder>>> x5chainsArray =
-                        unprotectedHeaders.putArray(COSE_LABEL_X5CHAIN);
-                for (X509Certificate cert : certificateChain) {
-                    x5chainsArray.add(cert.getEncoded());
-                }
-            }
-        }
-        if (data == null || data.length == 0) {
-            array.add(new SimpleValue(SimpleValueType.NULL));
-        } else {
-            array.add(data);
-        }
-        array.add(coseSignature);
-
-        return encodeCbor(builder.build());
-    }
-
-    public static boolean coseSign1CheckSignature(byte[] signatureCose1,
-            byte[] detachedContent,
-            PublicKey publicKey) throws NoSuchAlgorithmException, InvalidKeyException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
-        }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
-        if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
-        }
-        if (items.get(0).getMajorType() != MajorType.BYTE_STRING) {
-            throw new RuntimeException("Item 0 (protected headers) is not a byte-string");
-        }
-        byte[] encodedProtectedHeaders = ((co.nstant.in.cbor.model.ByteString) items.get(
-                0)).getBytes();
-        byte[] payload = new byte[0];
-        if (items.get(2).getMajorType() == MajorType.SPECIAL) {
-            if (((co.nstant.in.cbor.model.Special) items.get(2)).getSpecialType()
-                    != SpecialType.SIMPLE_VALUE) {
-                throw new RuntimeException("Item 2 (payload) is a special but not a simple value");
-            }
-            SimpleValue simple = (co.nstant.in.cbor.model.SimpleValue) items.get(2);
-            if (simple.getSimpleValueType() != SimpleValueType.NULL) {
-                throw new RuntimeException("Item 2 (payload) is a simple but not the value null");
-            }
-        } else if (items.get(2).getMajorType() == MajorType.BYTE_STRING) {
-            payload = ((co.nstant.in.cbor.model.ByteString) items.get(2)).getBytes();
-        } else {
-            throw new RuntimeException("Item 2 (payload) is not nil or byte-string");
-        }
-        if (items.get(3).getMajorType() != MajorType.BYTE_STRING) {
-            throw new RuntimeException("Item 3 (signature) is not a byte-string");
-        }
-        byte[] coseSignature = ((co.nstant.in.cbor.model.ByteString) items.get(3)).getBytes();
-
-        byte[] derSignature = signatureCoseToDer(coseSignature);
-
-        int dataLen = payload.length;
-        int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
-        if (dataLen > 0 && detachedContentLen > 0) {
-            throw new RuntimeException("data and detachedContent cannot both be non-empty");
-        }
-
-        byte[] toBeSigned = Util.coseBuildToBeSigned(encodedProtectedHeaders, payload,
-                detachedContent);
-
-        try {
-            Signature verifier = Signature.getInstance("SHA256withECDSA");
-            verifier.initVerify(publicKey);
-            verifier.update(toBeSigned);
-            return verifier.verify(derSignature);
-        } catch (SignatureException e) {
-            throw new RuntimeException("Error verifying signature");
-        }
-    }
-
-    // Returns the empty byte-array if no data is included in the structure.
-    //
-    // Throws RuntimeException if the given bytes aren't valid COSE_Sign1.
-    //
-    public static byte[] coseSign1GetData(byte[] signatureCose1) {
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
-        }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
-        if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
-        }
-        byte[] payload = new byte[0];
-        if (items.get(2).getMajorType() == MajorType.SPECIAL) {
-            if (((co.nstant.in.cbor.model.Special) items.get(2)).getSpecialType()
-                    != SpecialType.SIMPLE_VALUE) {
-                throw new RuntimeException("Item 2 (payload) is a special but not a simple value");
-            }
-            SimpleValue simple = (co.nstant.in.cbor.model.SimpleValue) items.get(2);
-            if (simple.getSimpleValueType() != SimpleValueType.NULL) {
-                throw new RuntimeException("Item 2 (payload) is a simple but not the value null");
-            }
-        } else if (items.get(2).getMajorType() == MajorType.BYTE_STRING) {
-            payload = ((co.nstant.in.cbor.model.ByteString) items.get(2)).getBytes();
-        } else {
-            throw new RuntimeException("Item 2 (payload) is not nil or byte-string");
-        }
-        return payload;
-    }
-
-    // Returns the empty collection if no x5chain is included in the structure.
-    //
-    // Throws RuntimeException if the given bytes aren't valid COSE_Sign1.
-    //
-    public static Collection<X509Certificate> coseSign1GetX5Chain(byte[] signatureCose1)
-            throws CertificateException {
-        LinkedList<X509Certificate> ret = new LinkedList<>();
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
-        }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
-        if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
-        }
-        if (items.get(1).getMajorType() != MajorType.MAP) {
-            throw new RuntimeException("Item 1 (unprocted headers) is not a map");
-        }
-        co.nstant.in.cbor.model.Map map = (co.nstant.in.cbor.model.Map) items.get(1);
-        DataItem x5chainItem = map.get(new UnsignedInteger(COSE_LABEL_X5CHAIN));
-        if (x5chainItem != null) {
-            CertificateFactory factory = CertificateFactory.getInstance("X.509");
-            if (x5chainItem instanceof ByteString) {
-                ByteArrayInputStream certBais = new ByteArrayInputStream(
-                        ((ByteString) x5chainItem).getBytes());
-                ret.add((X509Certificate) factory.generateCertificate(certBais));
-            } else if (x5chainItem instanceof Array) {
-                for (DataItem certItem : ((Array) x5chainItem).getDataItems()) {
-                    if (!(certItem instanceof ByteString)) {
-                        throw new RuntimeException(
-                                "Unexpected type for array item in x5chain value");
-                    }
-                    ByteArrayInputStream certBais = new ByteArrayInputStream(
-                            ((ByteString) certItem).getBytes());
-                    ret.add((X509Certificate) factory.generateCertificate(certBais));
-                }
-            } else {
-                throw new RuntimeException("Unexpected type for x5chain value");
-            }
-        }
-        return ret;
-    }
-
-    public static byte[] coseBuildToBeMACed(byte[] encodedProtectedHeaders,
-            byte[] payload,
-            byte[] detachedContent) {
-        CborBuilder macStructure = new CborBuilder();
-        ArrayBuilder<CborBuilder> array = macStructure.addArray();
-
-        array.add("MAC0");
-        array.add(encodedProtectedHeaders);
-
-        // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
-        // so external_aad is the empty bstr
-        byte[] emptyExternalAad = new byte[0];
-        array.add(emptyExternalAad);
-
-        // Next field is the payload, independently of how it's transported (RFC
-        // 8152 section 4.4). Since our API specifies only one of |data| and
-        // |detachedContent| can be non-empty, it's simply just the non-empty one.
-        if (payload != null && payload.length > 0) {
-            array.add(payload);
-        } else {
-            array.add(detachedContent);
-        }
-
-        return encodeCbor(macStructure.build());
-    }
-
-    public static byte[] coseMac0(SecretKey key,
-            @Nullable byte[] data,
-            byte[] detachedContent)
-            throws NoSuchAlgorithmException, InvalidKeyException, CertificateEncodingException {
-
-        int dataLen = (data != null ? data.length : 0);
-        int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
-        if (dataLen > 0 && detachedContentLen > 0) {
-            throw new RuntimeException("data and detachedContent cannot both be non-empty");
-        }
-
-        CborBuilder protectedHeaders = new CborBuilder();
-        MapBuilder<CborBuilder> protectedHeadersMap = protectedHeaders.addMap();
-        protectedHeadersMap.put(COSE_LABEL_ALG, COSE_ALG_HMAC_256_256);
-        byte[] protectedHeadersBytes = encodeCbor(protectedHeaders.build());
-
-        byte[] toBeMACed = coseBuildToBeMACed(protectedHeadersBytes, data, detachedContent);
-
-        byte[] mac = null;
-        Mac m = Mac.getInstance("HmacSHA256");
-        m.init(key);
-        m.update(toBeMACed);
-        mac = m.doFinal();
-
-        CborBuilder builder = new CborBuilder();
-        ArrayBuilder<CborBuilder> array = builder.addArray();
-        array.add(protectedHeadersBytes);
-        MapBuilder<ArrayBuilder<CborBuilder>> unprotectedHeaders = array.addMap();
-        if (data == null || data.length == 0) {
-            array.add(new SimpleValue(SimpleValueType.NULL));
-        } else {
-            array.add(data);
-        }
-        array.add(mac);
-
-        return encodeCbor(builder.build());
-    }
-
-    public static String replaceLine(String text, int lineNumber, String replacementLine) {
-        String[] lines = text.split("\n");
-        int numLines = lines.length;
-        if (lineNumber < 0) {
-            lineNumber = numLines - (-lineNumber);
-        }
-        StringBuilder sb = new StringBuilder();
-        for (int n = 0; n < numLines; n++) {
-            if (n == lineNumber) {
-                sb.append(replacementLine);
-            } else {
-                sb.append(lines[n]);
-            }
-            // Only add terminating newline if passed-in string ends in a newline.
-            if (n == numLines - 1) {
-                if (text.endsWith(("\n"))) {
-                    sb.append('\n');
-                }
-            } else {
-                sb.append('\n');
-            }
-        }
-        return sb.toString();
-    }
-
-    static byte[] cborEncode(DataItem dataItem) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(dataItem);
-        } catch (CborException e) {
-            // This should never happen and we don't want cborEncode() to throw since that
-            // would complicate all callers. Log it instead.
-            e.printStackTrace();
-            Log.e(TAG, "Error encoding DataItem");
-        }
-        return baos.toByteArray();
-    }
-
-    static byte[] cborEncodeBoolean(boolean value) {
-        return cborEncode(new CborBuilder().add(value).build().get(0));
-    }
-
-    static byte[] cborEncodeBytestring(@NonNull byte[] value) {
-        return cborEncode(new CborBuilder().add(value).build().get(0));
-    }
-
-
-    static byte[] cborEncodeString(@NonNull String value) {
-        return cborEncode(new CborBuilder().add(value).build().get(0));
-    }
-
-    static byte[] cborEncodeInt(long value) {
-        return cborEncode(new CborBuilder().add(value).build().get(0));
-    }
-
-    static String getStringEntry(ResultData data, String namespaceName, String name) {
-        return Util.cborDecodeString(data.getEntry(namespaceName, name));
-    }
-
-    static boolean getBooleanEntry(ResultData data, String namespaceName, String name) {
-        return Util.cborDecodeBoolean(data.getEntry(namespaceName, name));
-    }
-
-    static long getIntegerEntry(ResultData data, String namespaceName, String name) {
-        return Util.cborDecodeInt(data.getEntry(namespaceName, name));
-    }
-
-    static byte[] getBytestringEntry(ResultData data, String namespaceName, String name) {
-        return Util.cborDecodeBytestring(data.getEntry(namespaceName, name));
-    }
-
-    static final int CBOR_SEMANTIC_TAG_ENCODED_CBOR = 24;
-
-    static byte[] cborEncodeCalendar(@NonNull Calendar calendar) {
-        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
-        if (calendar.isSet(Calendar.MILLISECOND) && calendar.get(Calendar.MILLISECOND) != 0) {
-            df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
-        }
-        df.setTimeZone(calendar.getTimeZone());
-        Date val = calendar.getTime();
-        String dateString = df.format(val);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(new CborBuilder()
-                    .addTag(0)
-                    .add(dateString)
-                    .build());
-        } catch (CborException e) {
-            // Should never happen and we don't want to complicate callers by throwing.
-            e.printStackTrace();
-            Log.e(TAG, "Error encoding Calendar");
-        }
-        byte[] data = baos.toByteArray();
-        return data;
-    }
-
-    static DataItem cborToDataItem(byte[] data) {
-        ByteArrayInputStream bais = new ByteArrayInputStream(data);
-        try {
-            List<DataItem> dataItems = new CborDecoder(bais).decode();
-            if (dataItems.size() != 1) {
-                throw new RuntimeException("Expected 1 item, found " + dataItems.size());
-            }
-            return dataItems.get(0);
-        } catch (CborException e) {
-            throw new RuntimeException("Error decoding data", e);
-        }
-    }
-
-    static boolean cborDecodeBoolean(@NonNull byte[] data) {
-        return cborToDataItem(data) == SimpleValue.TRUE;
-    }
-
-    static String cborDecodeString(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.UnicodeString) cborToDataItem(data)).getString();
-    }
-
-    static long cborDecodeInt(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.Number) cborToDataItem(data)).getValue().longValue();
-    }
-
-    static byte[] cborDecodeBytestring(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.ByteString) cborToDataItem(data)).getBytes();
-    }
-
-    static Calendar cborDecodeCalendar(@NonNull byte[] data) {
-        DataItem di = cborToDataItem(data);
-        if (!(di instanceof co.nstant.in.cbor.model.UnicodeString)) {
-            throw new RuntimeException("Passed in data is not a Unicode-string");
-        }
-        if (!di.hasTag() || di.getTag().getValue() != 0) {
-            throw new RuntimeException("Passed in data is not tagged with tag 0");
-        }
-        String dateString = ((co.nstant.in.cbor.model.UnicodeString) di).getString();
-
-        // Manually parse the timezone
-        TimeZone parsedTz = TimeZone.getTimeZone("UTC");
-        if (!dateString.endsWith("Z")) {
-            String timeZoneSubstr = dateString.substring(dateString.length() - 6);
-            parsedTz = TimeZone.getTimeZone("GMT" + timeZoneSubstr);
-        }
-
-        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
-        df.setTimeZone(parsedTz);
-        Date date = null;
-        try {
-            date = df.parse(dateString);
-        } catch (ParseException e) {
-            // Try again, this time without the milliseconds
-            df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
-            df.setTimeZone(parsedTz);
-            try {
-                date = df.parse(dateString);
-            } catch (ParseException e2) {
-                throw new RuntimeException("Error parsing string", e2);
-            }
-        }
-
-        Calendar c = new GregorianCalendar();
-        c.clear();
-        c.setTimeZone(df.getTimeZone());
-        c.setTime(date);
-        return c;
-    }
-
-
-    /*
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1 (0x1)
-    Signature Algorithm: ecdsa-with-SHA256
-        Issuer: CN=fake
-        Validity
-            Not Before: Jan  1 00:00:00 1970 GMT
-            Not After : Jan  1 00:00:00 2048 GMT
-        Subject: CN=fake
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (256 bit)
-                00000000  04 9b 60 70 8a 99 b6 bf  e3 b8 17 02 9e 93 eb 48  |..`p...........H|
-                00000010  23 b9 39 89 d1 00 bf a0  0f d0 2f bd 6b 11 bc d1  |#.9......./.k...|
-                00000020  19 53 54 28 31 00 f5 49  db 31 fb 9f 7d 99 bf 23  |.ST(1..I.1..}..#|
-                00000030  fb 92 04 6b 23 63 55 98  ad 24 d2 68 c4 83 bf 99  |...k#cU..$.h....|
-                00000040  62                                                |b|
-    Signature Algorithm: ecdsa-with-SHA256
-         30:45:02:20:67:ad:d1:34:ed:a5:68:3f:5b:33:ee:b3:18:a2:
-         eb:03:61:74:0f:21:64:4a:a3:2e:82:b3:92:5c:21:0f:88:3f:
-         02:21:00:b7:38:5c:9b:f2:9c:b1:27:86:37:44:df:eb:4a:b2:
-         6c:11:9a:c1:ff:b2:80:95:ce:fc:5f:26:b4:20:6e:9b:0d
-     */
-
-
-    static @NonNull X509Certificate signPublicKeyWithPrivateKey(String keyToSignAlias,
-            String keyToSignWithAlias) {
-
-        KeyStore ks = null;
-        try {
-            ks = KeyStore.getInstance("AndroidKeyStore");
-            ks.load(null);
-
-            /* First note that KeyStore.getCertificate() returns a self-signed X.509 certificate
-             * for the key in question. As per RFC 5280, section 4.1 an X.509 certificate has the
-             * following structure:
-             *
-             *   Certificate  ::=  SEQUENCE  {
-             *        tbsCertificate       TBSCertificate,
-             *        signatureAlgorithm   AlgorithmIdentifier,
-             *        signatureValue       BIT STRING  }
-             *
-             * Conveniently, the X509Certificate class has a getTBSCertificate() method which
-             * returns the tbsCertificate blob. So all we need to do is just sign that and build
-             * signatureAlgorithm and signatureValue and combine it with tbsCertificate. We don't
-             * need a full-blown ASN.1/DER encoder to do this.
-             */
-            X509Certificate selfSignedCert = (X509Certificate) ks.getCertificate(keyToSignAlias);
-            byte[] tbsCertificate = selfSignedCert.getTBSCertificate();
-
-            KeyStore.Entry keyToSignWithEntry = ks.getEntry(keyToSignWithAlias, null);
-            Signature s = Signature.getInstance("SHA256withECDSA");
-            s.initSign(((KeyStore.PrivateKeyEntry) keyToSignWithEntry).getPrivateKey());
-            s.update(tbsCertificate);
-            byte[] signatureValue = s.sign();
-
-            /* The DER encoding for a SEQUENCE of length 128-65536 - the length is updated below.
-             *
-             * We assume - and test for below - that the final length is always going to be in
-             * this range. This is a sound assumption given we're using 256-bit EC keys.
-             */
-            byte[] sequence = new byte[]{
-                    0x30, (byte) 0x82, 0x00, 0x00
-            };
-
-            /* The DER encoding for the ECDSA with SHA-256 signature algorithm:
-             *
-             *   SEQUENCE (1 elem)
-             *      OBJECT IDENTIFIER 1.2.840.10045.4.3.2 ecdsaWithSHA256 (ANSI X9.62 ECDSA
-             *      algorithm with SHA256)
-             */
-            byte[] signatureAlgorithm = new byte[]{
-                    0x30, 0x0a, 0x06, 0x08, 0x2a, (byte) 0x86, 0x48, (byte) 0xce, 0x3d, 0x04, 0x03,
-                    0x02
-            };
-
-            /* The DER encoding for a BIT STRING with one element - the length is updated below.
-             *
-             * We assume the length of signatureValue is always going to be less than 128. This
-             * assumption works since we know ecdsaWithSHA256 signatures are always 69, 70, or
-             * 71 bytes long when DER encoded.
-             */
-            byte[] bitStringForSignature = new byte[]{0x03, 0x00, 0x00};
-
-            // Calculate sequence length and set it in |sequence|.
-            int sequenceLength = tbsCertificate.length
-                    + signatureAlgorithm.length
-                    + bitStringForSignature.length
-                    + signatureValue.length;
-            if (sequenceLength < 128 || sequenceLength > 65535) {
-                throw new Exception("Unexpected sequenceLength " + sequenceLength);
-            }
-            sequence[2] = (byte) (sequenceLength >> 8);
-            sequence[3] = (byte) (sequenceLength & 0xff);
-
-            // Calculate signatureValue length and set it in |bitStringForSignature|.
-            int signatureValueLength = signatureValue.length + 1;
-            if (signatureValueLength >= 128) {
-                throw new Exception("Unexpected signatureValueLength " + signatureValueLength);
-            }
-            bitStringForSignature[1] = (byte) signatureValueLength;
-
-            // Finally concatenate everything together.
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            baos.write(sequence);
-            baos.write(tbsCertificate);
-            baos.write(signatureAlgorithm);
-            baos.write(bitStringForSignature);
-            baos.write(signatureValue);
-            byte[] resultingCertBytes = baos.toByteArray();
-
-            CertificateFactory cf = CertificateFactory.getInstance("X.509");
-            ByteArrayInputStream bais = new ByteArrayInputStream(resultingCertBytes);
-            X509Certificate result = (X509Certificate) cf.generateCertificate(bais);
-            return result;
-        } catch (Exception e) {
-            throw new RuntimeException("Error signing public key with private key", e);
-        }
-    }
-
-    static byte[] prependSemanticTagForEncodedCbor(byte[] encodedCbor) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            ByteString taggedBytestring = new ByteString(encodedCbor);
-            taggedBytestring.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(baos).encode(taggedBytestring);
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding with semantic tag for CBOR encoding", e);
-        }
-        return baos.toByteArray();
-    }
-
-    static byte[] buildDeviceAuthenticationCbor(String docType,
-            byte[] encodedSessionTranscript,
-            byte[] encodedDeviceNameSpaces) {
-        ByteArrayOutputStream daBaos = new ByteArrayOutputStream();
-        try {
-            ByteArrayInputStream bais = new ByteArrayInputStream(encodedSessionTranscript);
-            List<DataItem> dataItems = null;
-            dataItems = new CborDecoder(bais).decode();
-            DataItem sessionTranscript = dataItems.get(0);
-            ByteString deviceNameSpacesBytesItem = new ByteString(encodedDeviceNameSpaces);
-            deviceNameSpacesBytesItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(daBaos).encode(new CborBuilder()
-                    .addArray()
-                    .add("DeviceAuthentication")
-                    .add(sessionTranscript)
-                    .add(docType)
-                    .add(deviceNameSpacesBytesItem)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding DeviceAuthentication", e);
-        }
-        return daBaos.toByteArray();
-    }
-
-    static byte[] buildReaderAuthenticationCbor(
-            byte[] sessionTranscriptBytes,
-            byte[] requestMessageBytes) {
-
-        ByteArrayOutputStream daBaos = new ByteArrayOutputStream();
-        try {
-            ByteArrayInputStream bais = new ByteArrayInputStream(sessionTranscriptBytes);
-            List<DataItem> dataItems = null;
-            dataItems = new CborDecoder(bais).decode();
-            DataItem sessionTranscript = dataItems.get(0);
-            ByteString requestMessageBytesItem = new ByteString(requestMessageBytes);
-            requestMessageBytesItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(daBaos).encode(new CborBuilder()
-                    .addArray()
-                    .add("ReaderAuthentication")
-                    .add(sessionTranscript)
-                    .add(requestMessageBytesItem)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding ReaderAuthentication", e);
-        }
-        return daBaos.toByteArray();
-    }
-
-    static byte[] concatArrays(byte[] a, byte[] b) {
-        byte[] ret = new byte[a.length + b.length];
-        System.arraycopy(a, 0, ret, 0, a.length);
-        System.arraycopy(b, 0, ret, a.length, b.length);
-        return ret;
-    }
-
-    static SecretKey calcEMacKeyForReader(PublicKey authenticationPublicKey,
-            PrivateKey ephemeralReaderPrivateKey,
-            byte[] encodedSessionTranscript) {
-        try {
-            KeyAgreement ka = KeyAgreement.getInstance("ECDH");
-            ka.init(ephemeralReaderPrivateKey);
-            ka.doPhase(authenticationPublicKey, true);
-            byte[] sharedSecret = ka.generateSecret();
-
-            byte[] sessionTranscriptBytes =
-                    Util.prependSemanticTagForEncodedCbor(encodedSessionTranscript);
-            byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
-            byte[] info = new byte[] {'E', 'M', 'a', 'c', 'K', 'e', 'y'};
-            byte[] derivedKey = Util.computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
-            SecretKey secretKey = new SecretKeySpec(derivedKey, "");
-            return secretKey;
-        } catch (InvalidKeyException
-                | NoSuchAlgorithmException e) {
-            throw new RuntimeException("Error performing key agreement", e);
-        }
-    }
-
-    /**
-     * Computes an HKDF.
-     *
-     * This is based on https://github.com/google/tink/blob/master/java/src/main/java/com/google
-     * /crypto/tink/subtle/Hkdf.java
-     * which is also Copyright (c) Google and also licensed under the Apache 2 license.
-     *
-     * @param macAlgorithm the MAC algorithm used for computing the Hkdf. I.e., "HMACSHA1" or
-     *                     "HMACSHA256".
-     * @param ikm          the input keying material.
-     * @param salt         optional salt. A possibly non-secret random value. If no salt is
-     *                     provided (i.e. if
-     *                     salt has length 0) then an array of 0s of the same size as the hash
-     *                     digest is used as salt.
-     * @param info         optional context and application specific information.
-     * @param size         The length of the generated pseudorandom string in bytes. The maximal
-     *                     size is
-     *                     255.DigestSize, where DigestSize is the size of the underlying HMAC.
-     * @return size pseudorandom bytes.
-     */
-    static byte[] computeHkdf(
-            String macAlgorithm, final byte[] ikm, final byte[] salt, final byte[] info, int size) {
-        Mac mac = null;
-        try {
-            mac = Mac.getInstance(macAlgorithm);
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("No such algorithm: " + macAlgorithm, e);
-        }
-        if (size > 255 * mac.getMacLength()) {
-            throw new RuntimeException("size too large");
-        }
-        try {
-            if (salt == null || salt.length == 0) {
-                // According to RFC 5869, Section 2.2 the salt is optional. If no salt is provided
-                // then HKDF uses a salt that is an array of zeros of the same length as the hash
-                // digest.
-                mac.init(new SecretKeySpec(new byte[mac.getMacLength()], macAlgorithm));
-            } else {
-                mac.init(new SecretKeySpec(salt, macAlgorithm));
-            }
-            byte[] prk = mac.doFinal(ikm);
-            byte[] result = new byte[size];
-            int ctr = 1;
-            int pos = 0;
-            mac.init(new SecretKeySpec(prk, macAlgorithm));
-            byte[] digest = new byte[0];
-            while (true) {
-                mac.update(digest);
-                mac.update(info);
-                mac.update((byte) ctr);
-                digest = mac.doFinal();
-                if (pos + digest.length < size) {
-                    System.arraycopy(digest, 0, result, pos, digest.length);
-                    pos += digest.length;
-                    ctr++;
-                } else {
-                    System.arraycopy(digest, 0, result, pos, size - pos);
-                    break;
-                }
-            }
-            return result;
-        } catch (InvalidKeyException e) {
-            throw new RuntimeException("Error MACing", e);
-        }
-    }
-
-    static byte[] stripLeadingZeroes(byte[] value) {
-        int n = 0;
-        while (n < value.length && value[n] == 0) {
-            n++;
-        }
-        int newLen = value.length - n;
-        byte[] ret = new byte[newLen];
-        int m = 0;
-        while (n < value.length) {
-            ret[m++] = value[n++];
-        }
-        return ret;
-    }
-
-    static void hexdump(String name, byte[] data) {
-        int n, m, o;
-        StringBuilder sb = new StringBuilder();
-        Formatter fmt = new Formatter(sb);
-        for (n = 0; n < data.length; n += 16) {
-            fmt.format("%04x  ", n);
-            for (m = 0; m < 16 && n + m < data.length; m++) {
-                fmt.format("%02x ", data[n + m]);
-            }
-            for (o = m; o < 16; o++) {
-                sb.append("   ");
-            }
-            sb.append(" ");
-            for (m = 0; m < 16 && n + m < data.length; m++) {
-                int c = data[n + m] & 0xff;
-                fmt.format("%c", Character.isISOControl(c) ? '.' : c);
-            }
-            sb.append("\n");
-        }
-        sb.append("\n");
-        Log.e(TAG, name + ": dumping " + data.length + " bytes\n" + fmt.toString());
-    }
-
-
-    // This returns a SessionTranscript which satisfy the requirement
-    // that the uncompressed X and Y coordinates of the public key for the
-    // mDL's ephemeral key-pair appear somewhere in the encoded
-    // DeviceEngagement.
-    static byte[] buildSessionTranscript(KeyPair ephemeralKeyPair) {
-        // Make the coordinates appear in an already encoded bstr - this
-        // mimics how the mDL COSE_Key appear as encoded data inside the
-        // encoded DeviceEngagement
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            ECPoint w = ((ECPublicKey) ephemeralKeyPair.getPublic()).getW();
-            // X and Y are always positive so for interop we remove any leading zeroes
-            // inserted by the BigInteger encoder.
-            byte[] x = stripLeadingZeroes(w.getAffineX().toByteArray());
-            byte[] y = stripLeadingZeroes(w.getAffineY().toByteArray());
-            baos.write(new byte[]{42});
-            baos.write(x);
-            baos.write(y);
-            baos.write(new byte[]{43, 44});
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-        byte[] blobWithCoords = baos.toByteArray();
-
-        baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(new CborBuilder()
-                    .addArray()
-                    .add(blobWithCoords)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            e.printStackTrace();
-            return null;
-        }
-        ByteString encodedDeviceEngagementItem = new ByteString(baos.toByteArray());
-        ByteString encodedEReaderKeyItem = new ByteString(cborEncodeString("doesn't matter"));
-        encodedDeviceEngagementItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-        encodedEReaderKeyItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-
-        baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(new CborBuilder()
-                    .addArray()
-                    .add(encodedDeviceEngagementItem)
-                    .add(encodedEReaderKeyItem)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            e.printStackTrace();
-            return null;
-        }
-        return baos.toByteArray();
-    }
-
-    /*
-     * Helper function to create a CBOR data for requesting data items. The IntentToRetain
-     * value will be set to false for all elements.
-     *
-     * <p>The returned CBOR data conforms to the following CDDL schema:</p>
-     *
-     * <pre>
-     *   ItemsRequest = {
-     *     ? "docType" : DocType,
-     *     "nameSpaces" : NameSpaces,
-     *     ? "RequestInfo" : {* tstr => any} ; Additional info the reader wants to provide
-     *   }
-     *
-     *   NameSpaces = {
-     *     + NameSpace => DataElements     ; Requested data elements for each NameSpace
-     *   }
-     *
-     *   DataElements = {
-     *     + DataElement => IntentToRetain
-     *   }
-     *
-     *   DocType = tstr
-     *
-     *   DataElement = tstr
-     *   IntentToRetain = bool
-     *   NameSpace = tstr
-     * </pre>
-     *
-     * @param entriesToRequest       The entries to request, organized as a map of namespace
-     *                               names with each value being a collection of data elements
-     *                               in the given namespace.
-     * @param docType                  The document type or {@code null} if there is no document
-     *                                 type.
-     * @return CBOR data conforming to the CDDL mentioned above.
-     */
-    static @NonNull byte[] createItemsRequest(
-            @NonNull Map<String, Collection<String>> entriesToRequest,
-            @Nullable String docType) {
-        CborBuilder builder = new CborBuilder();
-        MapBuilder<CborBuilder> mapBuilder = builder.addMap();
-        if (docType != null) {
-            mapBuilder.put("docType", docType);
-        }
-
-        MapBuilder<MapBuilder<CborBuilder>> nsMapBuilder = mapBuilder.putMap("nameSpaces");
-        for (String namespaceName : entriesToRequest.keySet()) {
-            Collection<String> entryNames = entriesToRequest.get(namespaceName);
-            MapBuilder<MapBuilder<MapBuilder<CborBuilder>>> entryNameMapBuilder =
-                    nsMapBuilder.putMap(namespaceName);
-            for (String entryName : entryNames) {
-                entryNameMapBuilder.put(entryName, false);
-            }
-        }
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        CborEncoder encoder = new CborEncoder(baos);
-        try {
-            encoder.encode(builder.build());
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding CBOR", e);
-        }
-        return baos.toByteArray();
-    }
-
-    static KeyPair createEphemeralKeyPair() {
-        try {
-            KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC);
-            ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime256v1");
-            kpg.initialize(ecSpec);
-            KeyPair keyPair = kpg.generateKeyPair();
-            return keyPair;
-        } catch (NoSuchAlgorithmException
-                | InvalidAlgorithmParameterException e) {
-            throw new RuntimeException("Error generating ephemeral key-pair", e);
-        }
-    }
-
-
-    static byte[] getPopSha256FromAuthKeyCert(X509Certificate cert) {
-        byte[] octetString = cert.getExtensionValue("1.3.6.1.4.1.11129.2.1.26");
-        if (octetString == null) {
-            return null;
-        }
-        try {
-            ASN1InputStream asn1InputStream = new ASN1InputStream(octetString);
-            byte[] cborBytes = ((ASN1OctetString) asn1InputStream.readObject()).getOctets();
-
-            ByteArrayInputStream bais = new ByteArrayInputStream(cborBytes);
-            List<DataItem> dataItems = new CborDecoder(bais).decode();
-            if (dataItems.size() != 1) {
-                throw new RuntimeException("Expected 1 item, found " + dataItems.size());
-            }
-            if (!(dataItems.get(0) instanceof co.nstant.in.cbor.model.Array)) {
-                throw new RuntimeException("Item is not a map");
-            }
-            co.nstant.in.cbor.model.Array array = (co.nstant.in.cbor.model.Array) dataItems.get(0);
-            List<DataItem> items = array.getDataItems();
-            if (items.size() < 2) {
-                throw new RuntimeException(
-                        "Expected at least 2 array items, found " + items.size());
-            }
-            if (!(items.get(0) instanceof UnicodeString)) {
-                throw new RuntimeException("First array item is not a string");
-            }
-            String id = ((UnicodeString) items.get(0)).getString();
-            if (!id.equals("ProofOfBinding")) {
-                throw new RuntimeException("Expected ProofOfBinding, got " + id);
-            }
-            if (!(items.get(1) instanceof ByteString)) {
-                throw new RuntimeException("Second array item is not a bytestring");
-            }
-            byte[] popSha256 = ((ByteString) items.get(1)).getBytes();
-            if (popSha256.length != 32) {
-                throw new RuntimeException(
-                        "Expected bstr to be 32 bytes, it is " + popSha256.length);
-            }
-            return popSha256;
-        } catch (IOException e) {
-            throw new RuntimeException("Error decoding extension data", e);
-        } catch (CborException e) {
-            throw new RuntimeException("Error decoding data", e);
-        }
-    }
-
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/UtilUnitTests.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/UtilUnitTests.java
deleted file mode 100644
index 72c3222..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/UtilUnitTests.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyProperties;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.MediumTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.ByteArrayOutputStream;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.cert.X509Certificate;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.LinkedList;
-import java.util.TimeZone;
-
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-
-import co.nstant.in.cbor.CborBuilder;
-import co.nstant.in.cbor.CborEncoder;
-import co.nstant.in.cbor.CborException;
-import co.nstant.in.cbor.builder.ArrayBuilder;
-import co.nstant.in.cbor.model.ByteString;
-import co.nstant.in.cbor.model.DoublePrecisionFloat;
-import co.nstant.in.cbor.model.HalfPrecisionFloat;
-import co.nstant.in.cbor.model.NegativeInteger;
-import co.nstant.in.cbor.model.SimpleValue;
-import co.nstant.in.cbor.model.SimpleValueType;
-import co.nstant.in.cbor.model.SinglePrecisionFloat;
-import co.nstant.in.cbor.model.UnicodeString;
-import co.nstant.in.cbor.model.UnsignedInteger;
-
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class UtilUnitTests {
-    @Test
-    public void prettyPrintMultipleCompleteTypes() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .add("text")                // add string
-                .add(1234)                  // add integer
-                .add(new byte[]{0x10})   // add byte array
-                .addArray()                 // add array
-                .add(1)
-                .add("text")
-                .end()
-                .build());
-        assertEquals("'text',\n"
-                + "1234,\n"
-                + "[0x10],\n"
-                + "[1, 'text']", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintString() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new UnicodeString("foobar"));
-        assertEquals("'foobar'", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintBytestring() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new ByteString(new byte[]{1, 2, 33, (byte) 254}));
-        assertEquals("[0x01, 0x02, 0x21, 0xfe]", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintUnsignedInteger() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new UnsignedInteger(42));
-        assertEquals("42", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintNegativeInteger() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new NegativeInteger(-42));
-        assertEquals("-42", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintDouble() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new DoublePrecisionFloat(1.1));
-        assertEquals("1.1", Util.cborPrettyPrint(baos.toByteArray()));
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new DoublePrecisionFloat(-42.0000000001));
-        assertEquals("-42.0000000001", Util.cborPrettyPrint(baos.toByteArray()));
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new DoublePrecisionFloat(-5));
-        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintFloat() throws CborException {
-        ByteArrayOutputStream baos;
-
-        // TODO: These two tests yield different results on different devices, disable for now
-        /*
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SinglePrecisionFloat(1.1f));
-        assertEquals("1.100000023841858", Util.cborPrettyPrint(baos.toByteArray()));
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SinglePrecisionFloat(-42.0001f));
-        assertEquals("-42.000099182128906", Util.cborPrettyPrint(baos.toByteArray()));
-        */
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SinglePrecisionFloat(-5f));
-        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintHalfFloat() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new HalfPrecisionFloat(1.1f));
-        assertEquals("1.099609375", Util.cborPrettyPrint(baos.toByteArray()));
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new HalfPrecisionFloat(-42.0001f));
-        assertEquals("-42", Util.cborPrettyPrint(baos.toByteArray()));
-
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new HalfPrecisionFloat(-5f));
-        assertEquals("-5", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintFalse() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.FALSE));
-        assertEquals("false", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintTrue() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.TRUE));
-        assertEquals("true", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintNull() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.NULL));
-        assertEquals("null", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintUndefined() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new SimpleValue(SimpleValueType.UNDEFINED));
-        assertEquals("undefined", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintTag() throws CborException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addTag(0)
-                .add("ABC")
-                .build());
-        byte[] data = baos.toByteArray();
-        assertEquals("tag 0 'ABC'", Util.cborPrettyPrint(data));
-    }
-
-    @Test
-    public void prettyPrintArrayNoCompounds() throws CborException {
-        // If an array has no compound elements, no newlines are used.
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addArray()                 // add array
-                .add(1)
-                .add("text")
-                .add(new ByteString(new byte[]{1, 2, 3}))
-                .end()
-                .build());
-        assertEquals("[1, 'text', [0x01, 0x02, 0x03]]", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintArray() throws CborException {
-        // This array contains a compound value so will use newlines
-        CborBuilder array = new CborBuilder();
-        ArrayBuilder<CborBuilder> arrayBuilder = array.addArray();
-        arrayBuilder.add(2);
-        arrayBuilder.add(3);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addArray()                 // add array
-                .add(1)
-                .add("text")
-                .add(new ByteString(new byte[]{1, 2, 3}))
-                .add(array.build().get(0))
-                .end()
-                .build());
-        assertEquals("[\n"
-                + "  1,\n"
-                + "  'text',\n"
-                + "  [0x01, 0x02, 0x03],\n"
-                + "  [2, 3]\n"
-                + "]", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void prettyPrintMap() throws CborException {
-        // If an array has no compound elements, no newlines are used.
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addMap()
-                .put("Foo", 42)
-                .put("Bar", "baz")
-                .put(43, 44)
-                .put(new UnicodeString("bstr"), new ByteString(new byte[]{1, 2, 3}))
-                .put(new ByteString(new byte[]{1, 2, 3}), new UnicodeString("other way"))
-                .end()
-                .build());
-        assertEquals("{\n"
-                + "  43 : 44,\n"
-                + "  [0x01, 0x02, 0x03] : 'other way',\n"
-                + "  'Bar' : 'baz',\n"
-                + "  'Foo' : 42,\n"
-                + "  'bstr' : [0x01, 0x02, 0x03]\n"
-                + "}", Util.cborPrettyPrint(baos.toByteArray()));
-    }
-
-    @Test
-    public void cborEncodeDecode() {
-        // TODO: add better coverage and check specific encoding etc.
-        assertEquals(42, Util.cborDecodeInt(Util.cborEncodeInt(42)));
-        assertEquals(123456, Util.cborDecodeInt(Util.cborEncodeInt(123456)));
-        assertFalse(Util.cborDecodeBoolean(Util.cborEncodeBoolean(false)));
-        assertTrue(Util.cborDecodeBoolean(Util.cborEncodeBoolean(true)));
-    }
-
-    @Test
-    public void cborEncodeDecodeCalendar() throws CborException {
-        GregorianCalendar c;
-        byte[] data;
-
-        c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
-        c.clear();
-        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
-        data = Util.cborEncodeCalendar(c);
-        assertEquals("tag 0 '2019-07-08T11:51:42Z'", Util.cborPrettyPrint(data));
-        assertEquals("tag 0 '2019-07-08T11:51:42Z'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-        assertEquals(0, c.compareTo(Util.cborDecodeCalendar(data)));
-
-        c = new GregorianCalendar(TimeZone.getTimeZone("GMT-04:00"));
-        c.clear();
-        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
-        data = Util.cborEncodeCalendar(c);
-        assertEquals("tag 0 '2019-07-08T11:51:42-04:00'", Util.cborPrettyPrint(data));
-        assertEquals("tag 0 '2019-07-08T11:51:42-04:00'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-        assertEquals(0, c.compareTo(Util.cborDecodeCalendar(data)));
-
-        c = new GregorianCalendar(TimeZone.getTimeZone("GMT-08:00"));
-        c.clear();
-        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
-        data = Util.cborEncodeCalendar(c);
-        assertEquals("tag 0 '2019-07-08T11:51:42-08:00'", Util.cborPrettyPrint(data));
-        assertEquals("tag 0 '2019-07-08T11:51:42-08:00'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-        assertEquals(0, c.compareTo(Util.cborDecodeCalendar(data)));
-
-        c = new GregorianCalendar(TimeZone.getTimeZone("GMT+04:30"));
-        c.clear();
-        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
-        data = Util.cborEncodeCalendar(c);
-        assertEquals("tag 0 '2019-07-08T11:51:42+04:30'", Util.cborPrettyPrint(data));
-        assertEquals("tag 0 '2019-07-08T11:51:42+04:30'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-        assertEquals(0, c.compareTo(Util.cborDecodeCalendar(data)));
-    }
-
-    @Test
-    public void cborCalendarMilliseconds() throws CborException {
-        Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
-        c.clear();
-        c.set(2019, Calendar.JULY, 8, 11, 51, 42);
-        c.set(Calendar.MILLISECOND, 123);
-        byte[] data = Util.cborEncodeCalendar(c);
-        assertEquals("tag 0 '2019-07-08T11:51:42.123Z'", Util.cborPrettyPrint(data));
-        assertEquals("tag 0 '2019-07-08T11:51:42.123Z'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-        assertEquals(0, c.compareTo(Util.cborDecodeCalendar(data)));
-    }
-
-    @Test
-    public void cborCalendarForeign() throws CborException {
-        ByteArrayOutputStream baos;
-        byte[] data;
-
-        // milliseconds, non-standard format
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addTag(0)
-                .add("2019-07-08T11:51:42.25Z")
-                .build());
-        data = baos.toByteArray();
-        assertEquals("tag 0 '2019-07-08T11:51:42.250Z'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-
-        // milliseconds set to 0
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addTag(0)
-                .add("2019-07-08T11:51:42.0Z")
-                .build());
-        data = baos.toByteArray();
-        assertEquals("tag 0 '2019-07-08T11:51:42Z'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-
-        // we only support millisecond-precision
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addTag(0)
-                .add("2019-07-08T11:51:42.9876Z")
-                .build());
-        data = baos.toByteArray();
-        assertEquals("tag 0 '2019-07-08T11:51:42.987Z'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-
-        // milliseconds and timezone
-        baos = new ByteArrayOutputStream();
-        new CborEncoder(baos).encode(new CborBuilder()
-                .addTag(0)
-                .add("2019-07-08T11:51:42.26-11:30")
-                .build());
-        data = baos.toByteArray();
-        assertEquals("tag 0 '2019-07-08T11:51:42.260-11:30'",
-                Util.cborPrettyPrint(Util.cborEncodeCalendar(Util.cborDecodeCalendar(data))));
-    }
-
-    private KeyPair coseGenerateKeyPair() throws Exception {
-        KeyPairGenerator kpg = KeyPairGenerator.getInstance(
-                KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
-        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
-                "coseTestKeyPair",
-                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
-                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512);
-        kpg.initialize(builder.build());
-        return kpg.generateKeyPair();
-    }
-
-    @Test
-    public void coseSignAndVerify() throws Exception {
-        KeyPair keyPair = coseGenerateKeyPair();
-        byte[] data = new byte[]{0x10, 0x11, 0x12, 0x13};
-        byte[] detachedContent = new byte[]{};
-        byte[] sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, null);
-        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
-        assertArrayEquals(data, Util.coseSign1GetData(sig));
-        assertEquals(0, Util.coseSign1GetX5Chain(sig).size());
-    }
-
-    @Test
-    public void coseSignAndVerifyDetachedContent() throws Exception {
-        KeyPair keyPair = coseGenerateKeyPair();
-        byte[] data = new byte[]{};
-        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
-        byte[] sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, null);
-        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
-        assertArrayEquals(data, Util.coseSign1GetData(sig));
-        assertEquals(0, Util.coseSign1GetX5Chain(sig).size());
-    }
-
-    @Test
-    public void coseSignAndVerifySingleCertificate() throws Exception {
-        KeyPair keyPair = coseGenerateKeyPair();
-        byte[] data = new byte[]{};
-        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
-        LinkedList<X509Certificate> certs = new LinkedList<X509Certificate>();
-        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
-        byte[] sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, certs);
-        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
-        assertArrayEquals(data, Util.coseSign1GetData(sig));
-        assertEquals(certs, Util.coseSign1GetX5Chain(sig));
-    }
-
-    @Test
-    public void coseSignAndVerifyMultipleCertificates() throws Exception {
-        KeyPair keyPair = coseGenerateKeyPair();
-        byte[] data = new byte[]{};
-        byte[] detachedContent = new byte[]{0x20, 0x21, 0x22, 0x23, 0x24};
-        LinkedList<X509Certificate> certs = new LinkedList<X509Certificate>();
-        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
-        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
-        certs.add(Util.signPublicKeyWithPrivateKey("coseTestKeyPair", "coseTestKeyPair"));
-        byte[] sig = Util.coseSign1Sign(keyPair.getPrivate(), data, detachedContent, certs);
-        assertTrue(Util.coseSign1CheckSignature(sig, detachedContent, keyPair.getPublic()));
-        assertArrayEquals(data, Util.coseSign1GetData(sig));
-        assertEquals(certs, Util.coseSign1GetX5Chain(sig));
-    }
-
-    @Test
-    public void coseMac0() throws Exception {
-        SecretKey secretKey = new SecretKeySpec(new byte[32], "");
-        byte[] data = new byte[]{0x10, 0x11, 0x12, 0x13};
-        byte[] detachedContent = new byte[]{};
-        byte[] mac = Util.coseMac0(secretKey, data, detachedContent);
-        assertEquals("[\n"
-                + "  [0xa1, 0x01, 0x05],\n"
-                + "  {},\n"
-                + "  [0x10, 0x11, 0x12, 0x13],\n"
-                + "  [0x6c, 0xec, 0xb5, 0x6a, 0xc9, 0x5c, 0xae, 0x3b, 0x41, 0x13, 0xde, 0xa4, "
-                + "0xd8, 0x86, 0x5c, 0x28, 0x2c, 0xd5, 0xa5, 0x13, 0xff, 0x3b, 0xd1, 0xde, 0x70, "
-                + "0x5e, 0xbb, 0xe2, 0x2d, 0x42, 0xbe, 0x53]\n"
-                + "]", Util.cborPrettyPrint(mac));
-    }
-
-    @Test
-    public void coseMac0DetachedContent() throws Exception {
-        SecretKey secretKey = new SecretKeySpec(new byte[32], "");
-        byte[] data = new byte[]{};
-        byte[] detachedContent = new byte[]{0x10, 0x11, 0x12, 0x13};
-        byte[] mac = Util.coseMac0(secretKey, data, detachedContent);
-        // Same HMAC as in coseMac0 test, only difference is that payload is null.
-        assertEquals("[\n"
-                + "  [0xa1, 0x01, 0x05],\n"
-                + "  {},\n"
-                + "  null,\n"
-                + "  [0x6c, 0xec, 0xb5, 0x6a, 0xc9, 0x5c, 0xae, 0x3b, 0x41, 0x13, 0xde, 0xa4, "
-                + "0xd8, 0x86, 0x5c, 0x28, 0x2c, 0xd5, 0xa5, 0x13, 0xff, 0x3b, 0xd1, 0xde, 0x70, "
-                + "0x5e, 0xbb, 0xe2, 0x2d, 0x42, 0xbe, 0x53]\n"
-                + "]", Util.cborPrettyPrint(mac));
-    }
-
-    @Test
-    public void replaceLineTest() {
-        assertEquals("foo",
-                Util.replaceLine("Hello World", 0, "foo"));
-        assertEquals("foo\n",
-                Util.replaceLine("Hello World\n", 0, "foo"));
-        assertEquals("Hello World",
-                Util.replaceLine("Hello World", 1, "foo"));
-        assertEquals("Hello World\n",
-                Util.replaceLine("Hello World\n", 1, "foo"));
-        assertEquals("foo\ntwo\nthree",
-                Util.replaceLine("one\ntwo\nthree", 0, "foo"));
-        assertEquals("one\nfoo\nthree",
-                Util.replaceLine("one\ntwo\nthree", 1, "foo"));
-        assertEquals("one\ntwo\nfoo",
-                Util.replaceLine("one\ntwo\nthree", 2, "foo"));
-        assertEquals("one\ntwo\nfoo",
-                Util.replaceLine("one\ntwo\nthree", -1, "foo"));
-        assertEquals("one\ntwo\nthree\nfoo",
-                Util.replaceLine("one\ntwo\nthree\nfour", -1, "foo"));
-        assertEquals("one\ntwo\nfoo\nfour",
-                Util.replaceLine("one\ntwo\nthree\nfour", -2, "foo"));
-    }
-
-}
diff --git a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/X509CertificateSigningTest.java b/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/X509CertificateSigningTest.java
deleted file mode 100644
index 53cbedf..0000000
--- a/security/identity-credential/src/androidTest/java/androidx/security/identity/cts/X509CertificateSigningTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.security.identity.cts;
-
-import static junit.framework.TestCase.assertNotNull;
-import static junit.framework.TestCase.assertTrue;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-
-import android.content.Context;
-import android.security.keystore.KeyGenParameterSpec;
-import android.security.keystore.KeyProperties;
-import android.util.AtomicFile;
-import android.util.Log;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.MediumTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.SignatureException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-
-@SuppressWarnings("deprecation")
-@MediumTest
-@RunWith(AndroidJUnit4.class)
-public class X509CertificateSigningTest {
-
-    private static final String TAG = "X509CertificateSigningTest";
-
-    @Test
-    public void testSigning() {
-        Context appContext = androidx.test.InstrumentationRegistry.getTargetContext();
-
-        String keyToSignAlias = "testKeyToSign";
-        String keyToSignWithAlias = "testKeyToSignWith";
-
-        KeyStore ks = null;
-        try {
-            ks = KeyStore.getInstance("AndroidKeyStore");
-            ks.load(null);
-            ks.deleteEntry(keyToSignAlias);
-            ks.deleteEntry(keyToSignWithAlias);
-            assertFalse(ks.containsAlias(keyToSignAlias));
-            assertFalse(ks.containsAlias(keyToSignWithAlias));
-
-            KeyPairGenerator kpg = KeyPairGenerator.getInstance(
-                    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
-
-            kpg.initialize(new KeyGenParameterSpec.Builder(
-                    keyToSignAlias,
-                    KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
-                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512).build());
-            KeyPair keyToSignKeyPair = kpg.generateKeyPair();
-
-            kpg.initialize(new KeyGenParameterSpec.Builder(
-                    keyToSignWithAlias,
-                    KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
-                    .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512).build());
-            KeyPair keyToSignWithKeyPair = kpg.generateKeyPair();
-
-            assertTrue(ks.containsAlias(keyToSignAlias));
-            assertTrue(ks.containsAlias(keyToSignWithAlias));
-
-            X509Certificate cert = Util.signPublicKeyWithPrivateKey(keyToSignAlias,
-                    keyToSignWithAlias);
-            assertNotNull(cert);
-            Log.d(TAG, "Cert:\n--\n" + cert.toString() + "\n--\n");
-
-            String filename = "ic_cert.bin";
-            AtomicFile file = new AtomicFile(appContext.getFileStreamPath(filename));
-            FileOutputStream outputStream = null;
-            try {
-                outputStream = file.startWrite();
-                outputStream.write(cert.getEncoded());
-                outputStream.close();
-                file.finishWrite(outputStream);
-            } catch (IOException e) {
-                if (outputStream != null) {
-                    file.failWrite(outputStream);
-                }
-                e.printStackTrace();
-                assertTrue(false);
-            }
-
-
-            // Check |cert| is for |keyToSignAlias|
-            assertArrayEquals(keyToSignKeyPair.getPublic().getEncoded(),
-                    cert.getPublicKey().getEncoded());
-
-            // Check |cert| was signed by |keyToSignWithAlias|
-            cert.verify(keyToSignWithKeyPair.getPublic());   // Throws if verification fails.
-
-        } catch (IOException
-                | InvalidAlgorithmParameterException
-                | NoSuchAlgorithmException
-                | NoSuchProviderException
-                | KeyStoreException
-                | CertificateException
-                | InvalidKeyException
-                | SignatureException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-
-        //assertTrue(false);
-    }
-
-}
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/CredentialData.java b/security/identity-credential/src/main/java/androidx/security/identity/CredentialData.java
index 4736163..7ddaf24 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/CredentialData.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/CredentialData.java
@@ -372,10 +372,10 @@
             dtsEncoder.encode(signedDataBuilder.build().get(0));
             byte[] dataToSign = dtsBaos.toByteArray();
 
-            signatureBytes = Util.coseSign1Sign(key,
+            signatureBytes = Util.cborEncode(Util.coseSign1Sign(key,
                     dataToSign,
                     null,
-                    null);
+                    null));
         } catch (NoSuchAlgorithmException
                 | InvalidKeyException
                 | CertificateEncodingException
@@ -404,10 +404,10 @@
             dtsEncoder.encode(signedDataBuilder.build().get(0));
             byte[] dataToSign = dtsBaos.toByteArray();
 
-            signatureBytes = Util.coseSign1Sign(key,
+            signatureBytes = Util.cborEncode(Util.coseSign1Sign(key,
                     dataToSign,
                     null,
-                    null);
+                    null));
         } catch (NoSuchAlgorithmException
                 | InvalidKeyException
                 | CertificateEncodingException
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/HardwareIdentityCredential.java b/security/identity-credential/src/main/java/androidx/security/identity/HardwareIdentityCredential.java
index 6d577ee..3255079 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/HardwareIdentityCredential.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/HardwareIdentityCredential.java
@@ -103,7 +103,7 @@
             byte[] sharedSecret = ka.generateSecret();
 
             byte[] sessionTranscriptBytes =
-                    Util.prependSemanticTagForEncodedCbor(mSessionTranscript);
+                    Util.cborEncode(Util.cborBuildTaggedByteString(mSessionTranscript));
             byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
 
             byte[] info = new byte[] {'S', 'K', 'D', 'e', 'v', 'i', 'c', 'e'};
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/PersonalizationData.java b/security/identity-credential/src/main/java/androidx/security/identity/PersonalizationData.java
index 5da9a81..657d67d 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/PersonalizationData.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/PersonalizationData.java
@@ -207,7 +207,7 @@
         public @NonNull Builder putEntryInteger(@NonNull String namespace, @NonNull String name,
                 @NonNull Collection<AccessControlProfileId> accessControlProfileIds,
                 long value) {
-            return putEntry(namespace, name, accessControlProfileIds, Util.cborEncodeLong(value));
+            return putEntry(namespace, name, accessControlProfileIds, Util.cborEncodeNumber(value));
         }
 
         /**
@@ -255,7 +255,7 @@
                 @NonNull Collection<AccessControlProfileId> accessControlProfileIds,
                 @NonNull Calendar value) {
             return putEntry(namespace, name, accessControlProfileIds,
-                    Util.cborEncodeCalendar(value));
+                    Util.cborEncode(Util.cborBuildDateTime(value)));
         }
 
         /**
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/ResultData.java b/security/identity-credential/src/main/java/androidx/security/identity/ResultData.java
index 74c2c81..60ef9d7 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/ResultData.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/ResultData.java
@@ -261,7 +261,7 @@
         if (value == null) {
             return null;
         }
-        return Util.cborDecodeBytestring(value);
+        return Util.cborDecodeByteString(value);
     }
 
     /**
@@ -317,7 +317,7 @@
         if (value == null) {
             return null;
         }
-        return Util.cborDecodeCalendar(value);
+        return Util.cborDecodeDateTime(value);
     }
 
     /**
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/SoftwareIdentityCredential.java b/security/identity-credential/src/main/java/androidx/security/identity/SoftwareIdentityCredential.java
index 5a534a2..2260baf 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/SoftwareIdentityCredential.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/SoftwareIdentityCredential.java
@@ -237,7 +237,7 @@
             byte[] sharedSecret = ka.generateSecret();
 
             byte[] sessionTranscriptBytes =
-                    Util.prependSemanticTagForEncodedCbor(mSessionTranscript);
+                    Util.cborEncode(Util.cborBuildTaggedByteString(mSessionTranscript));
             byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
 
             byte[] info = new byte[] {'S', 'K', 'D', 'e', 'v', 'i', 'c', 'e'};
@@ -483,11 +483,8 @@
                         "readerSignature non-null but requestMessage was null");
             }
 
-            try {
-                readerCertChain = Util.coseSign1GetX5Chain(readerSignature);
-            } catch (CertificateException e) {
-                throw new InvalidReaderSignatureException("Error getting x5chain element", e);
-            }
+            DataItem readerSignatureItem = Util.cborDecode(readerSignature);
+            readerCertChain = Util.coseSign1GetX5Chain(readerSignatureItem);
             if (readerCertChain.size() < 1) {
                 throw new InvalidReaderSignatureException("No x5chain element in reader signature");
             }
@@ -496,20 +493,21 @@
             }
             PublicKey readerTopmostPublicKey = readerCertChain.iterator().next().getPublicKey();
 
-            byte[] readerAuthentication = Util.buildReaderAuthenticationCbor(
-                    mSessionTranscript,
-                    requestMessage);
+            byte[] readerAuthentication = Util.cborEncode(new CborBuilder()
+                    .addArray()
+                    .add("ReaderAuthentication")
+                    .add(Util.cborDecode(mSessionTranscript))
+                    .add(Util.cborBuildTaggedByteString(requestMessage))
+                    .end()
+                    .build().get(0));
+
             byte[] readerAuthenticationBytes =
-                    Util.prependSemanticTagForEncodedCbor(readerAuthentication);
-            try {
-                if (!Util.coseSign1CheckSignature(
-                        readerSignature,
-                        readerAuthenticationBytes,
-                        readerTopmostPublicKey)) {
-                    throw new InvalidReaderSignatureException("Reader signature check failed");
-                }
-            } catch (NoSuchAlgorithmException | InvalidKeyException e) {
-                throw new InvalidReaderSignatureException("Error checking reader signature", e);
+                    Util.cborEncode(Util.cborBuildTaggedByteString(readerAuthentication));
+            if (!Util.coseSign1CheckSignature(
+                    Util.cborDecode(readerSignature),
+                    readerAuthenticationBytes,
+                    readerTopmostPublicKey)) {
+                throw new InvalidReaderSignatureException("Reader signature check failed");
             }
         }
 
@@ -548,22 +546,26 @@
             ensureAuthKey();
             resultBuilder.setStaticAuthenticationData(mAuthKeyAssociatedData);
 
-            byte[] deviceAuthentication = Util.buildDeviceAuthenticationCbor(
-                    mData.getDocType(),
-                    mSessionTranscript,
-                    authenticatedData);
+            byte[] deviceAuthentication = Util.cborEncode(new CborBuilder()
+                    .addArray()
+                    .add("DeviceAuthentication")
+                    .add(Util.cborDecode(mSessionTranscript))
+                    .add(mData.getDocType())
+                    .add(Util.cborBuildTaggedByteString(authenticatedData))
+                    .end()
+                    .build().get(0));
 
             byte[] deviceAuthenticationBytes =
-                    Util.prependSemanticTagForEncodedCbor(deviceAuthentication);
+                    Util.cborEncode(Util.cborBuildTaggedByteString(deviceAuthentication));
 
             try {
                 Signature authKeySignature = Signature.getInstance("SHA256withECDSA");
                 authKeySignature.initSign(mAuthKey);
                 resultBuilder.setEcdsaSignature(
-                        Util.coseSign1Sign(authKeySignature,
+                        Util.cborEncode(Util.coseSign1Sign(authKeySignature,
                                 null,
                                 deviceAuthenticationBytes,
-                                null));
+                                null)));
             } catch (NoSuchAlgorithmException
                     | InvalidKeyException
                     | CertificateEncodingException e) {
@@ -651,7 +653,7 @@
                 deviceNamespaceBuilder = deviceNameSpacesMapBuilder.putMap(
                         namespaceName);
             }
-            DataItem dataItem = Util.cborToDataItem(value);
+            DataItem dataItem = Util.cborDecode(value);
             deviceNamespaceBuilder.put(new UnicodeString(requestedEntryName), dataItem);
         }
     }
@@ -754,13 +756,13 @@
             int authKeyCount = mData.getAuthKeyCount();
             int authMaxUsesPerKey = mData.getAuthMaxUsesPerKey();
 
-            byte[] encodedBytes =
+            DataItem signature =
                     SoftwareWritableIdentityCredential.buildProofOfProvisioningWithSignature(
                             docType,
                             personalizationData,
                             credentialKey);
 
-            byte[] proofOfProvisioning = Util.coseSign1GetData(encodedBytes);
+            byte[] proofOfProvisioning = Util.coseSign1GetData(signature);
             byte[] proofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
                     proofOfProvisioning);
 
@@ -781,7 +783,7 @@
             //
             mData.setAvailableAuthenticationKeys(authKeyCount, authMaxUsesPerKey);
 
-            return encodedBytes;
+            return Util.cborEncode(signature);
 
         } catch (NoSuchAlgorithmException e) {
             throw new RuntimeException("Error digesting ProofOfProvisioning", e);
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/SoftwareWritableIdentityCredential.java b/security/identity-credential/src/main/java/androidx/security/identity/SoftwareWritableIdentityCredential.java
index 06be98c..5335549 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/SoftwareWritableIdentityCredential.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/SoftwareWritableIdentityCredential.java
@@ -47,6 +47,7 @@
 import co.nstant.in.cbor.CborException;
 import co.nstant.in.cbor.builder.ArrayBuilder;
 import co.nstant.in.cbor.builder.MapBuilder;
+import co.nstant.in.cbor.model.DataItem;
 import co.nstant.in.cbor.model.UnicodeString;
 
 class SoftwareWritableIdentityCredential extends WritableIdentityCredential {
@@ -148,7 +149,7 @@
     }
 
     // Returns COSE_Sign1 with payload set to ProofOfProvisioning
-    static byte[] buildProofOfProvisioningWithSignature(String docType,
+    static DataItem buildProofOfProvisioningWithSignature(String docType,
             PersonalizationData personalizationData,
             PrivateKey key) {
 
@@ -175,14 +176,14 @@
                 .add(dataBuilder.build().get(0))
                 .add(false);
 
-        byte[] signatureBytes;
+        DataItem signature;
         try {
             ByteArrayOutputStream dtsBaos = new ByteArrayOutputStream();
             CborEncoder dtsEncoder = new CborEncoder(dtsBaos);
             dtsEncoder.encode(signedDataBuilder.build().get(0));
             byte[] dataToSign = dtsBaos.toByteArray();
 
-            signatureBytes = Util.coseSign1Sign(key,
+            signature = Util.coseSign1Sign(key,
                     dataToSign,
                     null,
                     null);
@@ -192,7 +193,7 @@
                 | CborException e) {
             throw new RuntimeException("Error building ProofOfProvisioning", e);
         }
-        return signatureBytes;
+        return signature;
     }
 
     @NonNull
@@ -202,11 +203,11 @@
         try {
             ensureCredentialKey(null);
 
-            byte[] encodedBytes = buildProofOfProvisioningWithSignature(mDocType,
+            DataItem signature = buildProofOfProvisioningWithSignature(mDocType,
                     personalizationData,
                     mKeyPair.getPrivate());
 
-            byte[] proofOfProvisioning = Util.coseSign1GetData(encodedBytes);
+            byte[] proofOfProvisioning = Util.coseSign1GetData(signature);
             byte[] proofOfProvisioningSha256 = MessageDigest.getInstance("SHA-256").digest(
                     proofOfProvisioning);
 
@@ -220,7 +221,7 @@
                     proofOfProvisioningSha256,
                     false);
 
-            return encodedBytes;
+            return Util.cborEncode(signature);
         } catch (NoSuchAlgorithmException e) {
             throw new RuntimeException("Error digesting ProofOfProvisioning", e);
         }
diff --git a/security/identity-credential/src/main/java/androidx/security/identity/Util.java b/security/identity-credential/src/main/java/androidx/security/identity/Util.java
index cbe691e..3a62205 100644
--- a/security/identity-credential/src/main/java/androidx/security/identity/Util.java
+++ b/security/identity-credential/src/main/java/androidx/security/identity/Util.java
@@ -16,17 +16,21 @@
 
 package androidx.security.identity;
 
+import android.content.Context;
 import android.icu.text.DateFormat;
 import android.icu.text.SimpleDateFormat;
 import android.icu.util.Calendar;
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
+import android.security.keystore.KeyProperties;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import org.bouncycastle.asn1.ASN1InputStream;
 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.ASN1OctetString;
 import org.bouncycastle.asn1.x500.X500Name;
 import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
 import org.bouncycastle.operator.ContentSigner;
@@ -36,8 +40,12 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigInteger;
+import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
 import java.security.KeyStore;
+import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
 import java.security.PrivateKey;
@@ -48,15 +56,23 @@
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.ECPublicKey;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECPoint;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
+import java.util.Formatter;
 import java.util.List;
 import java.util.Locale;
 
+import javax.crypto.KeyAgreement;
 import javax.crypto.Mac;
+import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
 import co.nstant.in.cbor.CborBuilder;
@@ -65,11 +81,14 @@
 import co.nstant.in.cbor.CborException;
 import co.nstant.in.cbor.builder.ArrayBuilder;
 import co.nstant.in.cbor.builder.MapBuilder;
+import co.nstant.in.cbor.model.AbstractFloat;
 import co.nstant.in.cbor.model.Array;
 import co.nstant.in.cbor.model.ByteString;
 import co.nstant.in.cbor.model.DataItem;
+import co.nstant.in.cbor.model.DoublePrecisionFloat;
 import co.nstant.in.cbor.model.MajorType;
 import co.nstant.in.cbor.model.Map;
+import co.nstant.in.cbor.model.NegativeInteger;
 import co.nstant.in.cbor.model.Number;
 import co.nstant.in.cbor.model.SimpleValue;
 import co.nstant.in.cbor.model.SimpleValueType;
@@ -77,21 +96,70 @@
 import co.nstant.in.cbor.model.UnicodeString;
 import co.nstant.in.cbor.model.UnsignedInteger;
 
+/**
+ * @hide
+ */
 class Util {
     private static final String TAG = "Util";
 
     // Not called.
     private Util() {}
 
-    static byte[] cborEncode(DataItem dataItem) {
+    public static byte[] fromHex(String stringWithHex) {
+        int stringLength = stringWithHex.length();
+        if ((stringLength & 1) != 0) {
+            throw new IllegalArgumentException("Invalid length of hex string");
+        }
+        int numBytes = stringLength / 2;
+        byte[] data = new byte[numBytes];
+        for (int n = 0; n < numBytes; n++) {
+            data[n] = (byte) ((Character.digit(stringWithHex.charAt(n * 2), 16) << 4)
+                    + Character.digit(stringWithHex.charAt(n * 2 + 1), 16));
+        }
+        return data;
+    }
+
+    public static String toHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (int n = 0; n < bytes.length; n++) {
+            byte b = bytes[n];
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+
+    static void hexdump(String name, byte[] data) {
+        int n, m, o;
+        StringBuilder sb = new StringBuilder();
+        Formatter fmt = new Formatter(sb);
+        for (n = 0; n < data.length; n += 16) {
+            fmt.format("%04x  ", n);
+            for (m = 0; m < 16 && n + m < data.length; m++) {
+                fmt.format("%02x ", data[n + m]);
+            }
+            for (o = m; o < 16; o++) {
+                sb.append("   ");
+            }
+            sb.append(" ");
+            for (m = 0; m < 16 && n + m < data.length; m++) {
+                int c = data[n + m] & 0xff;
+                fmt.format("%c", Character.isISOControl(c) ? '.' : c);
+            }
+            sb.append("\n");
+        }
+        sb.append("\n");
+        Log.e(TAG, name + ": dumping " + data.length + " bytes\n" + fmt.toString());
+    }
+
+
+    public static byte[] cborEncode(DataItem dataItem) {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try {
             new CborEncoder(baos).encode(dataItem);
         } catch (CborException e) {
             // This should never happen and we don't want cborEncode() to throw since that
             // would complicate all callers. Log it instead.
-            e.printStackTrace();
-            Log.e(TAG, "Error encoding DataItem");
+            throw new IllegalStateException("Unexpected failure encoding data", e);
         }
         return baos.toByteArray();
     }
@@ -104,7 +172,7 @@
         return cborEncode(new CborBuilder().add(value).build().get(0));
     }
 
-    static byte[] cborEncodeLong(long value) {
+    static byte[] cborEncodeNumber(long value) {
         return cborEncode(new CborBuilder().add(value).build().get(0));
     }
 
@@ -112,7 +180,14 @@
         return cborEncode(new CborBuilder().add(value).build().get(0));
     }
 
-    static byte[] cborEncodeCalendar(@NonNull Calendar calendar) {
+    static byte[] cborEncodeDateTime(@NonNull Calendar calendar) {
+        return cborEncode(cborBuildDateTime(calendar));
+    }
+
+    // Returns #6.0(tstr) where tstr is the ISO 8601 encoding of the
+    // given point in time.
+    //
+    public static DataItem cborBuildDateTime(@NonNull Calendar calendar) {
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
         if (calendar.isSet(Calendar.MILLISECOND) && calendar.get(Calendar.MILLISECOND) != 0) {
             df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
@@ -120,77 +195,72 @@
         df.setTimeZone(calendar.getTimeZone());
         Date val = calendar.getTime();
         String dateString = df.format(val);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            new CborEncoder(baos).encode(new CborBuilder()
-                    .addTag(0)
-                    .add(dateString)
-                    .build());
-        } catch (CborException e) {
-            // Should never happen and we don't want to complicate callers by throwing.
-            e.printStackTrace();
-            Log.e(TAG, "Error encoding Calendar");
-        }
-        byte[] data = baos.toByteArray();
-        return data;
+        DataItem dataItem = new UnicodeString(dateString);
+        dataItem.setTag(0);
+        return dataItem;
     }
 
-    static DataItem cborToDataItem(byte[] data) {
-        ByteArrayInputStream bais = new ByteArrayInputStream(data);
+    public static DataItem cborDecode(byte[] encodedBytes) {
+        ByteArrayInputStream bais = new ByteArrayInputStream(encodedBytes);
+        List<DataItem> dataItems = null;
         try {
-            List<DataItem> dataItems = new CborDecoder(bais).decode();
-            if (dataItems.size() != 1) {
-                throw new RuntimeException("Expected 1 item, found " + dataItems.size());
-            }
-            return dataItems.get(0);
+            dataItems = new CborDecoder(bais).decode();
         } catch (CborException e) {
-            throw new RuntimeException("Error decoding data", e);
+            throw new IllegalArgumentException("Error decoding CBOR", e);
         }
+        if (dataItems.size() != 1) {
+            throw new IllegalArgumentException("Unexpected number of items, expected 1 got "
+                    + dataItems.size());
+        }
+        return dataItems.get(0);
     }
 
     static boolean cborDecodeBoolean(@NonNull byte[] data) {
-        SimpleValue simple = (SimpleValue) cborToDataItem(data);
+        SimpleValue simple = (SimpleValue) cborDecode(data);
         return simple.getSimpleValueType() == SimpleValueType.TRUE;
     }
 
     static String cborDecodeString(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.UnicodeString) cborToDataItem(data)).getString();
+        return ((co.nstant.in.cbor.model.UnicodeString) cborDecode(data)).getString();
     }
 
     static long cborDecodeLong(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.Number) cborToDataItem(data)).getValue().longValue();
+        return ((co.nstant.in.cbor.model.Number) cborDecode(data)).getValue().longValue();
     }
 
-    static byte[] cborDecodeBytestring(@NonNull byte[] data) {
-        return ((co.nstant.in.cbor.model.ByteString) cborToDataItem(data)).getBytes();
+    static byte[] cborDecodeByteString(@NonNull byte[] data) {
+        return ((co.nstant.in.cbor.model.ByteString) cborDecode(data)).getBytes();
     }
 
-    static Calendar cborDecodeCalendar(@NonNull byte[] data) {
-        DataItem di = cborToDataItem(data);
+    static Calendar cborDecodeDateTime(@NonNull byte[] data) {
+        DataItem di = cborDecode(data);
         if (!(di instanceof co.nstant.in.cbor.model.UnicodeString)) {
-            throw new RuntimeException("Passed in data is not a Unicode-string");
+            throw new IllegalArgumentException("Passed in data is not a Unicode-string");
         }
         if (!di.hasTag() || di.getTag().getValue() != 0) {
-            throw new RuntimeException("Passed in data is not tagged with tag 0");
+            throw new IllegalArgumentException("Passed in data is not tagged with tag 0");
         }
         String dateString = ((co.nstant.in.cbor.model.UnicodeString) di).getString();
 
         // Manually parse the timezone
         TimeZone parsedTz = TimeZone.getTimeZone("UTC");
+        java.util.TimeZone parsedTz2 = java.util.TimeZone.getTimeZone("UTC");
         if (!dateString.endsWith("Z")) {
             String timeZoneSubstr = dateString.substring(dateString.length() - 6);
             parsedTz = TimeZone.getTimeZone("GMT" + timeZoneSubstr);
+            parsedTz2 = java.util.TimeZone.getTimeZone("GMT" + timeZoneSubstr);
         }
 
-        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
-        df.setTimeZone(parsedTz);
+        java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS",
+                Locale.US);
+        df.setTimeZone(parsedTz2);
         Date date = null;
         try {
             date = df.parse(dateString);
         } catch (ParseException e) {
             // Try again, this time without the milliseconds
-            df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
-            df.setTimeZone(parsedTz);
+            df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
+            df.setTimeZone(parsedTz2);
             try {
                 date = df.parse(dateString);
             } catch (ParseException e2) {
@@ -200,7 +270,7 @@
 
         Calendar c = new GregorianCalendar();
         c.clear();
-        c.setTimeZone(df.getTimeZone());
+        c.setTimeZone(parsedTz);
         c.setTime(date);
         return c;
     }
@@ -225,7 +295,7 @@
             entryMapBuilder.put("name", entryName);
             entryMapBuilder.put(new UnicodeString("accessControlProfiles"),
                     accessControlProfileIdsBuilder.build().get(0));
-            entryMapBuilder.put(new UnicodeString("value"), cborToDataItem(entryValue));
+            entryMapBuilder.put(new UnicodeString("value"), cborDecode(entryValue));
         }
         return entryBuilder.build().get(0);
     }
@@ -233,7 +303,7 @@
     public static PersonalizationData.NamespaceData namespaceDataFromCbor(String namespaceName,
             DataItem dataItem) {
         if (!(dataItem instanceof Array)) {
-            throw new RuntimeException("Item is not an Array");
+            throw new IllegalArgumentException("Item is not an Array");
         }
         Array array = (Array) dataItem;
 
@@ -241,7 +311,7 @@
 
         for (DataItem item : array.getDataItems()) {
             if (!(item instanceof co.nstant.in.cbor.model.Map)) {
-                throw new RuntimeException("Item is not a map");
+                throw new IllegalArgumentException("Item is not a map");
             }
             co.nstant.in.cbor.model.Map map = (co.nstant.in.cbor.model.Map) item;
 
@@ -266,7 +336,7 @@
 
     public static AccessControlProfile accessControlProfileFromCbor(DataItem item) {
         if (!(item instanceof co.nstant.in.cbor.model.Map)) {
-            throw new RuntimeException("Item is not a map");
+            throw new IllegalArgumentException("Item is not a map");
         }
         Map map = (Map) item;
 
@@ -284,7 +354,7 @@
                 builder.setReaderCertificate((X509Certificate) certFactory.generateCertificate(
                         new ByteArrayInputStream(rcBytes)));
             } catch (CertificateException e) {
-                throw new RuntimeException("Error decoding readerCertificate", e);
+                throw new IllegalArgumentException("Error decoding readerCertificate", e);
             }
         }
 
@@ -310,7 +380,7 @@
             try {
                 mapBuilder.put("readerCertificate", readerCertificate.getEncoded());
             } catch (CertificateEncodingException e) {
-                throw new RuntimeException("Error encoding reader mCertificate", e);
+                throw new IllegalStateException("Error encoding reader mCertificate", e);
             }
         }
         if (accessControlProfile.isUserAuthenticationRequired()) {
@@ -323,15 +393,6 @@
         return cborBuilder.build().get(0);
     }
 
-    static int[] integerCollectionToArray(Collection<Integer> collection) {
-        int[] result = new int[collection.size()];
-        int n = 0;
-        for (int item : collection) {
-            result[n++] = item;
-        }
-        return result;
-    }
-
     static @NonNull X509Certificate generateAuthenticationKeyCert(String authKeyAlias,
             String credentialKeyAlias,
             byte[] proofOfProvisioningSha256) {
@@ -340,7 +401,6 @@
             ks = KeyStore.getInstance("AndroidKeyStore");
             ks.load(null);
 
-            //PublicKey publicKey = (PublicKey) ks.getKey(keyToSignAlias, null);
             X509Certificate selfSignedCert = (X509Certificate) ks.getCertificate(authKeyAlias);
             PublicKey publicKey = selfSignedCert.getPublicKey();
 
@@ -363,14 +423,12 @@
                             publicKey);
 
             if (proofOfProvisioningSha256 != null) {
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                new CborEncoder(baos).encode(new CborBuilder()
+                byte[] encodedProofOfBinding = cborEncode(new CborBuilder()
                         .addArray()
                         .add("ProofOfBinding")
                         .add(proofOfProvisioningSha256)
                         .end()
-                        .build());
-                byte[] encodedProofOfBinding = baos.toByteArray();
+                        .build().get(0));
                 builder.addExtension(new ASN1ObjectIdentifier("1.3.6.1.4.1.11129.2.1.26"), false,
                         encodedProofOfBinding);
             }
@@ -383,7 +441,7 @@
             X509Certificate result = (X509Certificate) cf.generateCertificate(bais);
             return result;
         } catch (Exception e) {
-            throw new RuntimeException("Error signing public key with private key", e);
+            throw new IllegalStateException("Error signing public key with private key", e);
         }
     }
 
@@ -448,10 +506,10 @@
         try {
             mac = Mac.getInstance(macAlgorithm);
         } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("No such algorithm: " + macAlgorithm, e);
+            throw new IllegalStateException("No such algorithm: " + macAlgorithm, e);
         }
         if (size > 255 * mac.getMacLength()) {
-            throw new RuntimeException("size too large");
+            throw new IllegalArgumentException("size too large");
         }
         try {
             if (salt == null || salt.length == 0) {
@@ -484,23 +542,11 @@
             }
             return result;
         } catch (InvalidKeyException e) {
-            throw new RuntimeException("Error MACing", e);
+            throw new IllegalStateException("Error MACing", e);
         }
     }
 
-
-    public static byte[] encodeCbor(List<DataItem> dataItems) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        CborEncoder encoder = new CborEncoder(baos);
-        try {
-            encoder.encode(dataItems);
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding data", e);
-        }
-        return baos.toByteArray();
-    }
-
-    public static byte[] coseBuildToBeSigned(byte[] encodedProtectedHeaders,
+    private static byte[] coseBuildToBeSigned(byte[] encodedProtectedHeaders,
             byte[] payload,
             byte[] detachedContent) {
         CborBuilder sigStructure = new CborBuilder();
@@ -523,7 +569,7 @@
             array.add(detachedContent);
         }
         array.end();
-        return encodeCbor(sigStructure.build());
+        return cborEncode(sigStructure.build().get(0));
     }
 
     private static final int COSE_LABEL_ALG = 1;
@@ -531,18 +577,19 @@
 
     // From "COSE Algorithms" registry
     private static final int COSE_ALG_ECDSA_256 = -7;
-    //private static final int COSE_ALG_HMAC_256_256 = 5;
+    private static final int COSE_ALG_HMAC_256_256 = 5;
 
     private static byte[] signatureDerToCose(byte[] signature) {
         if (signature.length > 128) {
-            throw new RuntimeException(
+            throw new IllegalArgumentException(
                     "Unexpected length " + signature.length + ", expected less than 128");
         }
         if (signature[0] != 0x30) {
-            throw new RuntimeException("Unexpected first byte " + signature[0] + ", expected 0x30");
+            throw new IllegalArgumentException("Unexpected first byte " + signature[0]
+                    + ", expected 0x30");
         }
         if ((signature[1] & 0x80) != 0x00) {
-            throw new RuntimeException(
+            throw new IllegalArgumentException(
                     "Unexpected second byte " + signature[1] + ", bit 7 shouldn't be set");
         }
         int rOffset = 2;
@@ -556,10 +603,12 @@
                 Arrays.copyOfRange(signature, sOffset + 2, sOffset + sSize + 2));
 
         if (rBytes.length > 32) {
-            throw new RuntimeException("rBytes.length is " + rBytes.length + " which is > 32");
+            throw new IllegalArgumentException(
+                    "rBytes.length is " + rBytes.length + " which is > 32");
         }
         if (sBytes.length > 32) {
-            throw new RuntimeException("sBytes.length is " + sBytes.length + " which is > 32");
+            throw new IllegalArgumentException(
+                    "sBytes.length is " + sBytes.length + " which is > 32");
         }
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -588,8 +637,7 @@
                 baos.write(0x00);
                 baos.write(bytes);
             } catch (IOException e) {
-                e.printStackTrace();
-                throw new RuntimeException("Failed writing data", e);
+                throw new IllegalStateException("Failed writing data", e);
             }
             bytes = baos.toByteArray();
         }
@@ -598,7 +646,8 @@
 
     private static byte[] signatureCoseToDer(byte[] signature) {
         if (signature.length != 64) {
-            throw new RuntimeException("signature.length is " + signature.length + ", expected 64");
+            throw new IllegalArgumentException(
+                    "signature.length is " + signature.length + ", expected 64");
         }
         // r and s are always positive and may use all 256 bits so use the constructor which
         // parses them as unsigned.
@@ -623,7 +672,7 @@
         return baos.toByteArray();
     }
 
-    public static byte[] coseSign1Sign(Signature s,
+    public static DataItem coseSign1Sign(Signature s,
             @Nullable byte[] data,
             byte[] detachedContent,
             @Nullable Collection<X509Certificate> certificateChain)
@@ -632,13 +681,13 @@
         int dataLen = (data != null ? data.length : 0);
         int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
         if (dataLen > 0 && detachedContentLen > 0) {
-            throw new RuntimeException("data and detachedContent cannot both be non-empty");
+            throw new IllegalArgumentException("data and detachedContent cannot both be non-empty");
         }
 
         CborBuilder protectedHeaders = new CborBuilder();
         MapBuilder<CborBuilder> protectedHeadersMap = protectedHeaders.addMap();
         protectedHeadersMap.put(COSE_LABEL_ALG, COSE_ALG_ECDSA_256);
-        byte[] protectedHeadersBytes = encodeCbor(protectedHeaders.build());
+        byte[] protectedHeadersBytes = cborEncode(protectedHeaders.build().get(0));
 
         byte[] toBeSigned = coseBuildToBeSigned(protectedHeadersBytes, data, detachedContent);
 
@@ -648,7 +697,7 @@
             byte[] derSignature = s.sign();
             coseSignature = signatureDerToCose(derSignature);
         } catch (SignatureException e) {
-            throw new RuntimeException("Error signing data");
+            throw new IllegalStateException("Error signing data", e);
         }
 
         CborBuilder builder = new CborBuilder();
@@ -674,10 +723,10 @@
         }
         array.add(coseSignature);
 
-        return encodeCbor(builder.build());
+        return builder.build().get(0);
     }
 
-    public static byte[] coseSign1Sign(PrivateKey key,
+    public static DataItem coseSign1Sign(PrivateKey key,
             @Nullable byte[] data,
             byte[] additionalData,
             @Nullable Collection<X509Certificate> certificateChain)
@@ -688,29 +737,17 @@
         return coseSign1Sign(s, data, additionalData, certificateChain);
     }
 
-    public static boolean coseSign1CheckSignature(byte[] signatureCose1,
-            byte[] detachedContent,
-            PublicKey publicKey) throws NoSuchAlgorithmException, InvalidKeyException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
+    public static boolean coseSign1CheckSignature(DataItem coseSign1,
+            byte[] detachedContent, PublicKey publicKey)  {
+        if (coseSign1.getMajorType() != MajorType.ARRAY) {
+            throw new IllegalArgumentException("Data item is not an array");
         }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
+        List<DataItem> items = ((co.nstant.in.cbor.model.Array) coseSign1).getDataItems();
         if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
+            throw new IllegalArgumentException("Expected at least four items in COSE_Sign1 array");
         }
         if (items.get(0).getMajorType() != MajorType.BYTE_STRING) {
-            throw new RuntimeException("Item 0 (protected headers) is not a byte-string");
+            throw new IllegalArgumentException("Item 0 (protected headers) is not a byte-string");
         }
         byte[] encodedProtectedHeaders = ((co.nstant.in.cbor.model.ByteString) items.get(
                 0)).getBytes();
@@ -718,19 +755,21 @@
         if (items.get(2).getMajorType() == MajorType.SPECIAL) {
             if (((co.nstant.in.cbor.model.Special) items.get(2)).getSpecialType()
                     != SpecialType.SIMPLE_VALUE) {
-                throw new RuntimeException("Item 2 (payload) is a special but not a simple value");
+                throw new IllegalArgumentException(
+                        "Item 2 (payload) is a special but not a simple value");
             }
             SimpleValue simple = (co.nstant.in.cbor.model.SimpleValue) items.get(2);
             if (simple.getSimpleValueType() != SimpleValueType.NULL) {
-                throw new RuntimeException("Item 2 (payload) is a simple but not the value null");
+                throw new IllegalArgumentException(
+                        "Item 2 (payload) is a simple but not the value null");
             }
         } else if (items.get(2).getMajorType() == MajorType.BYTE_STRING) {
             payload = ((co.nstant.in.cbor.model.ByteString) items.get(2)).getBytes();
         } else {
-            throw new RuntimeException("Item 2 (payload) is not nil or byte-string");
+            throw new IllegalArgumentException("Item 2 (payload) is not nil or byte-string");
         }
         if (items.get(3).getMajorType() != MajorType.BYTE_STRING) {
-            throw new RuntimeException("Item 3 (signature) is not a byte-string");
+            throw new IllegalArgumentException("Item 3 (signature) is not a byte-string");
         }
         byte[] coseSignature = ((co.nstant.in.cbor.model.ByteString) items.get(3)).getBytes();
 
@@ -739,7 +778,7 @@
         int dataLen = payload.length;
         int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
         if (dataLen > 0 && detachedContentLen > 0) {
-            throw new RuntimeException("data and detachedContent cannot both be non-empty");
+            throw new IllegalArgumentException("data and detachedContent cannot both be non-empty");
         }
 
         byte[] toBeSigned = Util.coseBuildToBeSigned(encodedProtectedHeaders, payload,
@@ -750,11 +789,94 @@
             verifier.initVerify(publicKey);
             verifier.update(toBeSigned);
             return verifier.verify(derSignature);
-        } catch (SignatureException e) {
-            throw new RuntimeException("Error verifying signature");
+        } catch (SignatureException | NoSuchAlgorithmException | InvalidKeyException e) {
+            throw new IllegalStateException("Error verifying signature", e);
         }
     }
 
+    private static byte[] coseBuildToBeMACed(byte[] encodedProtectedHeaders,
+            byte[] payload,
+            byte[] detachedContent) {
+        CborBuilder macStructure = new CborBuilder();
+        ArrayBuilder<CborBuilder> array = macStructure.addArray();
+
+        array.add("MAC0");
+        array.add(encodedProtectedHeaders);
+
+        // We currently don't support Externally Supplied Data (RFC 8152 section 4.3)
+        // so external_aad is the empty bstr
+        byte[] emptyExternalAad = new byte[0];
+        array.add(emptyExternalAad);
+
+        // Next field is the payload, independently of how it's transported (RFC
+        // 8152 section 4.4). Since our API specifies only one of |data| and
+        // |detachedContent| can be non-empty, it's simply just the non-empty one.
+        if (payload != null && payload.length > 0) {
+            array.add(payload);
+        } else {
+            array.add(detachedContent);
+        }
+
+        return cborEncode(macStructure.build().get(0));
+    }
+
+    public static DataItem coseMac0(SecretKey key,
+            @Nullable byte[] data,
+            byte[] detachedContent) {
+
+        int dataLen = (data != null ? data.length : 0);
+        int detachedContentLen = (detachedContent != null ? detachedContent.length : 0);
+        if (dataLen > 0 && detachedContentLen > 0) {
+            throw new IllegalArgumentException("data and detachedContent cannot both be non-empty");
+        }
+
+        CborBuilder protectedHeaders = new CborBuilder();
+        MapBuilder<CborBuilder> protectedHeadersMap = protectedHeaders.addMap();
+        protectedHeadersMap.put(COSE_LABEL_ALG, COSE_ALG_HMAC_256_256);
+        byte[] protectedHeadersBytes = cborEncode(protectedHeaders.build().get(0));
+
+        byte[] toBeMACed = coseBuildToBeMACed(protectedHeadersBytes, data, detachedContent);
+
+        byte[] mac;
+        try {
+            Mac m = Mac.getInstance("HmacSHA256");
+            m.init(key);
+            m.update(toBeMACed);
+            mac = m.doFinal();
+        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+            throw new IllegalStateException("Unexpected error", e);
+        }
+
+        CborBuilder builder = new CborBuilder();
+        ArrayBuilder<CborBuilder> array = builder.addArray();
+        array.add(protectedHeadersBytes);
+        /* MapBuilder<ArrayBuilder<CborBuilder>> unprotectedHeaders = */ array.addMap();
+        if (data == null || data.length == 0) {
+            array.add(new SimpleValue(SimpleValueType.NULL));
+        } else {
+            array.add(data);
+        }
+        array.add(mac);
+
+        return builder.build().get(0);
+    }
+
+    public static byte[] coseMac0GetTag(DataItem coseMac0) {
+        if (!(coseMac0 instanceof Array)) {
+            throw new IllegalArgumentException("coseMac0 is not an array");
+        }
+        List<DataItem> items = ((Array) coseMac0).getDataItems();
+        if (items.size() < 4) {
+            throw new IllegalArgumentException("coseMac0 have less than 4 elements");
+        }
+        DataItem tagItem = items.get(3);
+        if (!(tagItem instanceof ByteString)) {
+            throw new IllegalArgumentException("tag in coseMac0 is not a ByteString");
+        }
+        return ((ByteString) tagItem).getBytes();
+    }
+
+
     // Brute-force but good enough since users will only pass relatively small amounts of data.
     static boolean hasSubByteArray(byte[] haystack, byte[] needle) {
         int n = 0;
@@ -788,164 +910,661 @@
         return ret;
     }
 
-    static byte[] concatArrays(byte[] a, byte[] b) {
-        byte[] ret = new byte[a.length + b.length];
-        System.arraycopy(a, 0, ret, 0, a.length);
-        System.arraycopy(b, 0, ret, a.length, b.length);
-        return ret;
-    }
-
     static final int CBOR_SEMANTIC_TAG_ENCODED_CBOR = 24;
 
-    static byte[] prependSemanticTagForEncodedCbor(byte[] encodedCbor) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            ByteString taggedBytestring = new ByteString(encodedCbor);
-            taggedBytestring.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(baos).encode(taggedBytestring);
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding with semantic tag for CBOR encoding", e);
-        }
-        return baos.toByteArray();
+    // Returns #6.24(bstr) of the given already encoded CBOR
+    //
+    public static @NonNull DataItem cborBuildTaggedByteString(@NonNull byte[] encodedCbor) {
+        DataItem item = new ByteString(encodedCbor);
+        item.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
+        return item;
     }
 
-    static byte[] buildDeviceAuthenticationCbor(String docType,
-            byte[] encodedSessionTranscript,
-            byte[] encodedDeviceNameSpaces) {
-        ByteArrayOutputStream daBaos = new ByteArrayOutputStream();
-        try {
-            ByteArrayInputStream bais = new ByteArrayInputStream(encodedSessionTranscript);
-            DataItem sessionTranscript = new CborDecoder(bais).decode().get(0);
-            ByteString deviceNameSpacesBytesItem = new ByteString(encodedDeviceNameSpaces);
-            deviceNameSpacesBytesItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(daBaos).encode(new CborBuilder()
-                    .addArray()
-                    .add("DeviceAuthentication")
-                    .add(sessionTranscript)
-                    .add(docType)
-                    .add(deviceNameSpacesBytesItem)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding DeviceAuthentication", e);
+    // For a #6.24(bstr), extracts the bytes and decodes it and returns
+    // the decoded CBOR as a DataItem.
+    //
+    public static DataItem cborExtractTaggedAndEncodedCbor(DataItem item) {
+        if (item == null || !(item instanceof ByteString)) {
+            throw new IllegalArgumentException("Item is not a ByteString");
         }
-        return daBaos.toByteArray();
-    }
-
-    static byte[] buildReaderAuthenticationCbor(
-            byte[] sessionTranscriptBytes,
-            byte[] requestMessageBytes) {
-
-        ByteArrayOutputStream daBaos = new ByteArrayOutputStream();
-        try {
-            ByteArrayInputStream bais = new ByteArrayInputStream(sessionTranscriptBytes);
-            DataItem sessionTranscript = new CborDecoder(bais).decode().get(0);
-            ByteString requestMessageBytesItem = new ByteString(requestMessageBytes);
-            requestMessageBytesItem.setTag(CBOR_SEMANTIC_TAG_ENCODED_CBOR);
-            new CborEncoder(daBaos).encode(new CborBuilder()
-                    .addArray()
-                    .add("ReaderAuthentication")
-                    .add(sessionTranscript)
-                    .add(requestMessageBytesItem)
-                    .end()
-                    .build());
-        } catch (CborException e) {
-            throw new RuntimeException("Error encoding ReaderAuthentication", e);
+        if (!item.hasTag() || item.getTag().getValue() != CBOR_SEMANTIC_TAG_ENCODED_CBOR) {
+            throw new IllegalArgumentException("ByteString is not tagged with tag 24");
         }
-        return daBaos.toByteArray();
+        byte[] encodedCbor = ((ByteString) item).getBytes();
+        DataItem embeddedItem = cborDecode(encodedCbor);
+        return embeddedItem;
     }
 
     // Returns the empty byte-array if no data is included in the structure.
     //
-    // Throws RuntimeException if the given bytes aren't valid COSE_Sign1.
-    //
-    public static byte[] coseSign1GetData(byte[] signatureCose1) {
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
+    public static byte[] coseSign1GetData(DataItem coseSign1) {
+        if (coseSign1.getMajorType() != MajorType.ARRAY) {
+            throw new IllegalArgumentException("Data item is not an array");
         }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
+        List<DataItem> items = ((co.nstant.in.cbor.model.Array) coseSign1).getDataItems();
         if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
+            throw new IllegalArgumentException("Expected at least four items in COSE_Sign1 array");
         }
         byte[] payload = new byte[0];
         if (items.get(2).getMajorType() == MajorType.SPECIAL) {
             if (((co.nstant.in.cbor.model.Special) items.get(2)).getSpecialType()
                     != SpecialType.SIMPLE_VALUE) {
-                throw new RuntimeException("Item 2 (payload) is a special but not a simple value");
+                throw new IllegalArgumentException(
+                        "Item 2 (payload) is a special but not a simple value");
             }
             SimpleValue simple = (co.nstant.in.cbor.model.SimpleValue) items.get(2);
             if (simple.getSimpleValueType() != SimpleValueType.NULL) {
-                throw new RuntimeException("Item 2 (payload) is a simple but not the value null");
+                throw new IllegalArgumentException(
+                        "Item 2 (payload) is a simple but not the value null");
             }
         } else if (items.get(2).getMajorType() == MajorType.BYTE_STRING) {
             payload = ((co.nstant.in.cbor.model.ByteString) items.get(2)).getBytes();
         } else {
-            throw new RuntimeException("Item 2 (payload) is not nil or byte-string");
+            throw new IllegalArgumentException("Item 2 (payload) is not nil or byte-string");
         }
         return payload;
     }
 
     // Returns the empty collection if no x5chain is included in the structure.
     //
-    // Throws RuntimeException if the given bytes aren't valid COSE_Sign1.
+    // Throws exception if the given bytes aren't valid COSE_Sign1.
     //
-    public static Collection<X509Certificate> coseSign1GetX5Chain(byte[] signatureCose1)
-            throws CertificateException {
+    public static Collection<X509Certificate> coseSign1GetX5Chain(DataItem coseSign1) {
         ArrayList<X509Certificate> ret = new ArrayList<>();
-        ByteArrayInputStream bais = new ByteArrayInputStream(signatureCose1);
-        List<DataItem> dataItems = null;
-        try {
-            dataItems = new CborDecoder(bais).decode();
-        } catch (CborException e) {
-            throw new RuntimeException("Given signature is not valid CBOR", e);
+        if (coseSign1.getMajorType() != MajorType.ARRAY) {
+            throw new IllegalArgumentException("Data item is not an array");
         }
-        if (dataItems.size() != 1) {
-            throw new RuntimeException("Expected just one data item");
-        }
-        DataItem dataItem = dataItems.get(0);
-        if (dataItem.getMajorType() != MajorType.ARRAY) {
-            throw new RuntimeException("Data item is not an array");
-        }
-        List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
+        List<DataItem> items = ((co.nstant.in.cbor.model.Array) coseSign1).getDataItems();
         if (items.size() < 4) {
-            throw new RuntimeException("Expected at least four items in COSE_Sign1 array");
+            throw new IllegalArgumentException("Expected at least four items in COSE_Sign1 array");
         }
         if (items.get(1).getMajorType() != MajorType.MAP) {
-            throw new RuntimeException("Item 1 (unprotected headers) is not a map");
+            throw new IllegalArgumentException("Item 1 (unprotected headers) is not a map");
         }
         co.nstant.in.cbor.model.Map map = (co.nstant.in.cbor.model.Map) items.get(1);
         DataItem x5chainItem = map.get(new UnsignedInteger(COSE_LABEL_X5CHAIN));
         if (x5chainItem != null) {
-            CertificateFactory factory = CertificateFactory.getInstance("X.509");
-            if (x5chainItem instanceof ByteString) {
-                ByteArrayInputStream certBais = new ByteArrayInputStream(
-                        ((ByteString) x5chainItem).getBytes());
-                ret.add((X509Certificate) factory.generateCertificate(certBais));
-            } else if (x5chainItem instanceof Array) {
-                for (DataItem certItem : ((Array) x5chainItem).getDataItems()) {
-                    if (!(certItem instanceof ByteString)) {
-                        throw new RuntimeException(
-                                "Unexpected type for array item in x5chain value");
-                    }
+            try {
+                CertificateFactory factory = CertificateFactory.getInstance("X.509");
+                if (x5chainItem instanceof ByteString) {
                     ByteArrayInputStream certBais = new ByteArrayInputStream(
-                            ((ByteString) certItem).getBytes());
+                            ((ByteString) x5chainItem).getBytes());
                     ret.add((X509Certificate) factory.generateCertificate(certBais));
+                } else if (x5chainItem instanceof Array) {
+                    for (DataItem certItem : ((Array) x5chainItem).getDataItems()) {
+                        if (!(certItem instanceof ByteString)) {
+                            throw new IllegalArgumentException(
+                                    "Unexpected type for array item in x5chain value");
+                        }
+                        ByteArrayInputStream certBais = new ByteArrayInputStream(
+                                ((ByteString) certItem).getBytes());
+                        ret.add((X509Certificate) factory.generateCertificate(certBais));
+                    }
+                } else {
+                    throw new IllegalArgumentException("Unexpected type for x5chain value");
                 }
-            } else {
-                throw new RuntimeException("Unexpected type for x5chain value");
+            } catch (CertificateException e) {
+                throw new IllegalArgumentException("Unexpected error", e);
             }
         }
         return ret;
     }
+
+    public static SecretKey calcEMacKeyForReader(PublicKey authenticationPublicKey,
+            PrivateKey ephemeralReaderPrivateKey,
+            byte[] encodedSessionTranscript) {
+        try {
+            KeyAgreement ka = KeyAgreement.getInstance("ECDH");
+            ka.init(ephemeralReaderPrivateKey);
+            ka.doPhase(authenticationPublicKey, true);
+            byte[] sharedSecret = ka.generateSecret();
+
+            byte[] sessionTranscriptBytes =
+                    Util.cborEncode(Util.cborBuildTaggedByteString(encodedSessionTranscript));
+
+            byte[] salt = MessageDigest.getInstance("SHA-256").digest(sessionTranscriptBytes);
+            byte[] info = new byte[] {'E', 'M', 'a', 'c', 'K', 'e', 'y'};
+            byte[] derivedKey = computeHkdf("HmacSha256", sharedSecret, salt, info, 32);
+
+            SecretKey secretKey = new SecretKeySpec(derivedKey, "");
+            return secretKey;
+        } catch (InvalidKeyException
+                | NoSuchAlgorithmException e) {
+            throw new IllegalStateException("Error performing key agreement", e);
+        }
+    }
+
+
+    public static String cborPrettyPrint(DataItem dataItem) {
+        StringBuilder sb = new StringBuilder();
+        cborPrettyPrintDataItem(sb, 0, dataItem);
+        return sb.toString();
+    }
+
+    public static String cborPrettyPrint(byte[] encodedBytes) {
+        StringBuilder sb = new StringBuilder();
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(encodedBytes);
+        List<DataItem> dataItems = null;
+        try {
+            dataItems = new CborDecoder(bais).decode();
+        } catch (CborException e) {
+            throw new IllegalStateException(e);
+        }
+        int count = 0;
+        for (DataItem dataItem : dataItems) {
+            if (count > 0) {
+                sb.append(",\n");
+            }
+            cborPrettyPrintDataItem(sb, 0, dataItem);
+            count++;
+        }
+
+        return sb.toString();
+    }
+
+    // Returns true iff all elements in |items| are not compound (e.g. an array or a map).
+    private static boolean cborAreAllDataItemsNonCompound(List<DataItem> items) {
+        for (DataItem item : items) {
+            switch (item.getMajorType()) {
+                case ARRAY:
+                case MAP:
+                    return false;
+                default:
+                    // Do nothing
+                    break;
+            }
+        }
+        return true;
+    }
+
+    private static void cborPrettyPrintDataItem(StringBuilder sb, int indent, DataItem dataItem) {
+        StringBuilder indentBuilder = new StringBuilder();
+        for (int n = 0; n < indent; n++) {
+            indentBuilder.append(' ');
+        }
+        String indentString = indentBuilder.toString();
+
+        if (dataItem.hasTag()) {
+            sb.append(String.format("tag %d ", dataItem.getTag().getValue()));
+        }
+
+        switch (dataItem.getMajorType()) {
+            case INVALID:
+                // TODO: throw
+                sb.append("<invalid>");
+                break;
+            case UNSIGNED_INTEGER: {
+                // Major type 0: an unsigned integer.
+                BigInteger value = ((UnsignedInteger) dataItem).getValue();
+                sb.append(value);
+            }
+            break;
+            case NEGATIVE_INTEGER: {
+                // Major type 1: a negative integer.
+                BigInteger value = ((NegativeInteger) dataItem).getValue();
+                sb.append(value);
+            }
+            break;
+            case BYTE_STRING: {
+                // Major type 2: a byte string.
+                byte[] value = ((ByteString) dataItem).getBytes();
+                sb.append("[");
+                int count = 0;
+                for (byte b : value) {
+                    if (count > 0) {
+                        sb.append(", ");
+                    }
+                    sb.append(String.format("0x%02x", b));
+                    count++;
+                }
+                sb.append("]");
+            }
+            break;
+            case UNICODE_STRING: {
+                // Major type 3: string of Unicode characters that is encoded as UTF-8 [RFC3629].
+                String value = ((UnicodeString) dataItem).getString();
+                // TODO: escape ' in |value|
+                sb.append("'" + value + "'");
+            }
+            break;
+            case ARRAY: {
+                // Major type 4: an array of data items.
+                List<DataItem> items = ((co.nstant.in.cbor.model.Array) dataItem).getDataItems();
+                if (items.size() == 0) {
+                    sb.append("[]");
+                } else if (cborAreAllDataItemsNonCompound(items)) {
+                    // The case where everything fits on one line.
+                    sb.append("[");
+                    int count = 0;
+                    for (DataItem item : items) {
+                        cborPrettyPrintDataItem(sb, indent, item);
+                        if (++count < items.size()) {
+                            sb.append(", ");
+                        }
+                    }
+                    sb.append("]");
+                } else {
+                    sb.append("[\n" + indentString);
+                    int count = 0;
+                    for (DataItem item : items) {
+                        sb.append("  ");
+                        cborPrettyPrintDataItem(sb, indent + 2, item);
+                        if (++count < items.size()) {
+                            sb.append(",");
+                        }
+                        sb.append("\n" + indentString);
+                    }
+                    sb.append("]");
+                }
+            }
+            break;
+            case MAP: {
+                // Major type 5: a map of pairs of data items.
+                Collection<DataItem> keys = ((co.nstant.in.cbor.model.Map) dataItem).getKeys();
+                if (keys.size() == 0) {
+                    sb.append("{}");
+                } else {
+                    sb.append("{\n" + indentString);
+                    int count = 0;
+                    for (DataItem key : keys) {
+                        sb.append("  ");
+                        DataItem value = ((co.nstant.in.cbor.model.Map) dataItem).get(key);
+                        cborPrettyPrintDataItem(sb, indent + 2, key);
+                        sb.append(" : ");
+                        cborPrettyPrintDataItem(sb, indent + 2, value);
+                        if (++count < keys.size()) {
+                            sb.append(",");
+                        }
+                        sb.append("\n" + indentString);
+                    }
+                    sb.append("}");
+                }
+            }
+            break;
+            case TAG:
+                // Major type 6: optional semantic tagging of other major types
+                //
+                // We never encounter this one since it's automatically handled via the
+                // DataItem that is tagged.
+                throw new IllegalStateException("Semantic tag data item not expected");
+
+            case SPECIAL:
+                // Major type 7: floating point numbers and simple data types that need no
+                // content, as well as the "break" stop code.
+                if (dataItem instanceof SimpleValue) {
+                    switch (((SimpleValue) dataItem).getSimpleValueType()) {
+                        case FALSE:
+                            sb.append("false");
+                            break;
+                        case TRUE:
+                            sb.append("true");
+                            break;
+                        case NULL:
+                            sb.append("null");
+                            break;
+                        case UNDEFINED:
+                            sb.append("undefined");
+                            break;
+                        case RESERVED:
+                            sb.append("reserved");
+                            break;
+                        case UNALLOCATED:
+                            sb.append("unallocated");
+                            break;
+                    }
+                } else if (dataItem instanceof DoublePrecisionFloat) {
+                    DecimalFormat df = new DecimalFormat("0",
+                            DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+                    df.setMaximumFractionDigits(340);
+                    sb.append(df.format(((DoublePrecisionFloat) dataItem).getValue()));
+                } else if (dataItem instanceof AbstractFloat) {
+                    DecimalFormat df = new DecimalFormat("0",
+                            DecimalFormatSymbols.getInstance(Locale.ENGLISH));
+                    df.setMaximumFractionDigits(340);
+                    sb.append(df.format(((AbstractFloat) dataItem).getValue()));
+                } else {
+                    sb.append("break");
+                }
+                break;
+        }
+    }
+
+    static byte[] canonicalizeCbor(byte[] encodedCbor) throws CborException {
+        ByteArrayInputStream bais = new ByteArrayInputStream(encodedCbor);
+        List<DataItem> dataItems = new CborDecoder(bais).decode();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        for (DataItem dataItem : dataItems) {
+            CborEncoder encoder = new CborEncoder(baos);
+            encoder.encode(dataItem);
+        }
+        return baos.toByteArray();
+    }
+
+    public static String replaceLine(String text, int lineNumber, String replacementLine) {
+        @SuppressWarnings("StringSplitter")
+        String[] lines = text.split("\n");
+        int numLines = lines.length;
+        if (lineNumber < 0) {
+            lineNumber = numLines - -lineNumber;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int n = 0; n < numLines; n++) {
+            if (n == lineNumber) {
+                sb.append(replacementLine);
+            } else {
+                sb.append(lines[n]);
+            }
+            // Only add terminating newline if passed-in string ends in a newline.
+            if (n == numLines - 1) {
+                if (text.endsWith("\n")) {
+                    sb.append('\n');
+                }
+            } else {
+                sb.append('\n');
+            }
+        }
+        return sb.toString();
+    }
+
+    // This returns a SessionTranscript which satisfy the requirement
+    // that the uncompressed X and Y coordinates of the public key for the
+    // mDL's ephemeral key-pair appear somewhere in the encoded
+    // DeviceEngagement.
+    static byte[] buildSessionTranscript(KeyPair ephemeralKeyPair) {
+        // Make the coordinates appear in an already encoded bstr - this
+        // mimics how the mDL COSE_Key appear as encoded data inside the
+        // encoded DeviceEngagement
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            ECPoint w = ((ECPublicKey) ephemeralKeyPair.getPublic()).getW();
+            // X and Y are always positive so for interop we remove any leading zeroes
+            // inserted by the BigInteger encoder.
+            byte[] x = stripLeadingZeroes(w.getAffineX().toByteArray());
+            byte[] y = stripLeadingZeroes(w.getAffineY().toByteArray());
+            baos.write(new byte[]{42});
+            baos.write(x);
+            baos.write(y);
+            baos.write(new byte[]{43, 44});
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+        byte[] blobWithCoords = baos.toByteArray();
+
+        DataItem encodedDeviceEngagementItem = cborBuildTaggedByteString(
+                cborEncode(new CborBuilder()
+                        .addArray()
+                        .add(blobWithCoords)
+                        .end()
+                        .build().get(0)));
+        DataItem encodedEReaderKeyItem =
+                cborBuildTaggedByteString(Util.cborEncodeString("doesn't matter"));
+
+        baos = new ByteArrayOutputStream();
+        try {
+            new CborEncoder(baos).encode(new CborBuilder()
+                    .addArray()
+                    .add(encodedDeviceEngagementItem)
+                    .add(encodedEReaderKeyItem)
+                    .end()
+                    .build());
+        } catch (CborException e) {
+            e.printStackTrace();
+            return null;
+        }
+        return baos.toByteArray();
+    }
+
+    static IdentityCredentialStore getIdentityCredentialStore(@NonNull Context context) {
+        // We generally want to run all tests against the software implementation since
+        // hardware-based implementations are already tested against CTS and VTS and the bulk
+        // of the code in the Jetpack is the software implementation. This also helps avoid
+        // whatever bugs or flakiness that may exist in hardware implementations.
+        //
+        // Occasionally it's useful for a developer to test that the hardware-backed paths
+        // (HardwareIdentityCredentialStore + friends) work as intended. This can be done by
+        // uncommenting the line below and making sure it runs on a device with the appropriate
+        // hardware support.
+        //
+        // See b/164480361 for more discussion.
+        //
+        //return IdentityCredentialStore.getHardwareInstance(context);
+        return IdentityCredentialStore.getSoftwareInstance(context);
+    }
+
+        /*
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+    Signature Algorithm: ecdsa-with-SHA256
+        Issuer: CN=fake
+        Validity
+            Not Before: Jan  1 00:00:00 1970 GMT
+            Not After : Jan  1 00:00:00 2048 GMT
+        Subject: CN=fake
+        Subject Public Key Info:
+            Public Key Algorithm: id-ecPublicKey
+                Public-Key: (256 bit)
+                00000000  04 9b 60 70 8a 99 b6 bf  e3 b8 17 02 9e 93 eb 48  |..`p...........H|
+                00000010  23 b9 39 89 d1 00 bf a0  0f d0 2f bd 6b 11 bc d1  |#.9......./.k...|
+                00000020  19 53 54 28 31 00 f5 49  db 31 fb 9f 7d 99 bf 23  |.ST(1..I.1..}..#|
+                00000030  fb 92 04 6b 23 63 55 98  ad 24 d2 68 c4 83 bf 99  |...k#cU..$.h....|
+                00000040  62                                                |b|
+    Signature Algorithm: ecdsa-with-SHA256
+         30:45:02:20:67:ad:d1:34:ed:a5:68:3f:5b:33:ee:b3:18:a2:
+         eb:03:61:74:0f:21:64:4a:a3:2e:82:b3:92:5c:21:0f:88:3f:
+         02:21:00:b7:38:5c:9b:f2:9c:b1:27:86:37:44:df:eb:4a:b2:
+         6c:11:9a:c1:ff:b2:80:95:ce:fc:5f:26:b4:20:6e:9b:0d
+     */
+    static @NonNull X509Certificate signPublicKeyWithPrivateKey(String keyToSignAlias,
+            String keyToSignWithAlias) {
+
+        KeyStore ks = null;
+        try {
+            ks = KeyStore.getInstance("AndroidKeyStore");
+            ks.load(null);
+
+            /* First note that KeyStore.getCertificate() returns a self-signed X.509 certificate
+             * for the key in question. As per RFC 5280, section 4.1 an X.509 certificate has the
+             * following structure:
+             *
+             *   Certificate  ::=  SEQUENCE  {
+             *        tbsCertificate       TBSCertificate,
+             *        signatureAlgorithm   AlgorithmIdentifier,
+             *        signatureValue       BIT STRING  }
+             *
+             * Conveniently, the X509Certificate class has a getTBSCertificate() method which
+             * returns the tbsCertificate blob. So all we need to do is just sign that and build
+             * signatureAlgorithm and signatureValue and combine it with tbsCertificate. We don't
+             * need a full-blown ASN.1/DER encoder to do this.
+             */
+            X509Certificate selfSignedCert = (X509Certificate) ks.getCertificate(keyToSignAlias);
+            byte[] tbsCertificate = selfSignedCert.getTBSCertificate();
+
+            KeyStore.Entry keyToSignWithEntry = ks.getEntry(keyToSignWithAlias, null);
+            Signature s = Signature.getInstance("SHA256withECDSA");
+            s.initSign(((KeyStore.PrivateKeyEntry) keyToSignWithEntry).getPrivateKey());
+            s.update(tbsCertificate);
+            byte[] signatureValue = s.sign();
+
+            /* The DER encoding for a SEQUENCE of length 128-65536 - the length is updated below.
+             *
+             * We assume - and test for below - that the final length is always going to be in
+             * this range. This is a sound assumption given we're using 256-bit EC keys.
+             */
+            byte[] sequence = new byte[]{
+                    0x30, (byte) 0x82, 0x00, 0x00
+            };
+
+            /* The DER encoding for the ECDSA with SHA-256 signature algorithm:
+             *
+             *   SEQUENCE (1 elem)
+             *      OBJECT IDENTIFIER 1.2.840.10045.4.3.2 ecdsaWithSHA256 (ANSI X9.62 ECDSA
+             *      algorithm with SHA256)
+             */
+            byte[] signatureAlgorithm = new byte[]{
+                    0x30, 0x0a, 0x06, 0x08, 0x2a, (byte) 0x86, 0x48, (byte) 0xce, 0x3d, 0x04, 0x03,
+                    0x02
+            };
+
+            /* The DER encoding for a BIT STRING with one element - the length is updated below.
+             *
+             * We assume the length of signatureValue is always going to be less than 128. This
+             * assumption works since we know ecdsaWithSHA256 signatures are always 69, 70, or
+             * 71 bytes long when DER encoded.
+             */
+            byte[] bitStringForSignature = new byte[]{0x03, 0x00, 0x00};
+
+            // Calculate sequence length and set it in |sequence|.
+            int sequenceLength = tbsCertificate.length
+                    + signatureAlgorithm.length
+                    + bitStringForSignature.length
+                    + signatureValue.length;
+            if (sequenceLength < 128 || sequenceLength > 65535) {
+                throw new Exception("Unexpected sequenceLength " + sequenceLength);
+            }
+            sequence[2] = (byte) (sequenceLength >> 8);
+            sequence[3] = (byte) (sequenceLength & 0xff);
+
+            // Calculate signatureValue length and set it in |bitStringForSignature|.
+            int signatureValueLength = signatureValue.length + 1;
+            if (signatureValueLength >= 128) {
+                throw new Exception("Unexpected signatureValueLength " + signatureValueLength);
+            }
+            bitStringForSignature[1] = (byte) signatureValueLength;
+
+            // Finally concatenate everything together.
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            baos.write(sequence);
+            baos.write(tbsCertificate);
+            baos.write(signatureAlgorithm);
+            baos.write(bitStringForSignature);
+            baos.write(signatureValue);
+            byte[] resultingCertBytes = baos.toByteArray();
+
+            CertificateFactory cf = CertificateFactory.getInstance("X.509");
+            ByteArrayInputStream bais = new ByteArrayInputStream(resultingCertBytes);
+            X509Certificate result = (X509Certificate) cf.generateCertificate(bais);
+            return result;
+        } catch (Exception e) {
+            throw new IllegalStateException("Error signing public key with private key", e);
+        }
+    }
+
+    /*
+     * Helper function to create a CBOR data for requesting data items. The IntentToRetain
+     * value will be set to false for all elements.
+     *
+     * <p>The returned CBOR data conforms to the following CDDL schema:</p>
+     *
+     * <pre>
+     *   ItemsRequest = {
+     *     ? "docType" : DocType,
+     *     "nameSpaces" : NameSpaces,
+     *     ? "RequestInfo" : {* tstr => any} ; Additional info the reader wants to provide
+     *   }
+     *
+     *   NameSpaces = {
+     *     + NameSpace => DataElements     ; Requested data elements for each NameSpace
+     *   }
+     *
+     *   DataElements = {
+     *     + DataElement => IntentToRetain
+     *   }
+     *
+     *   DocType = tstr
+     *
+     *   DataElement = tstr
+     *   IntentToRetain = bool
+     *   NameSpace = tstr
+     * </pre>
+     *
+     * @param entriesToRequest       The entries to request, organized as a map of namespace
+     *                               names with each value being a collection of data elements
+     *                               in the given namespace.
+     * @param docType                  The document type or {@code null} if there is no document
+     *                                 type.
+     * @return CBOR data conforming to the CDDL mentioned above.
+     */
+    static @NonNull byte[] createItemsRequest(
+            @NonNull java.util.Map<String, Collection<String>> entriesToRequest,
+            @Nullable String docType) {
+        CborBuilder builder = new CborBuilder();
+        MapBuilder<CborBuilder> mapBuilder = builder.addMap();
+        if (docType != null) {
+            mapBuilder.put("docType", docType);
+        }
+
+        MapBuilder<MapBuilder<CborBuilder>> nsMapBuilder = mapBuilder.putMap("nameSpaces");
+        for (String namespaceName : entriesToRequest.keySet()) {
+            Collection<String> entryNames = entriesToRequest.get(namespaceName);
+            MapBuilder<MapBuilder<MapBuilder<CborBuilder>>> entryNameMapBuilder =
+                    nsMapBuilder.putMap(namespaceName);
+            for (String entryName : entryNames) {
+                entryNameMapBuilder.put(entryName, false);
+            }
+        }
+        return cborEncode(builder.build().get(0));
+    }
+
+    static KeyPair createEphemeralKeyPair() {
+        try {
+            KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC);
+            ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime256v1");
+            kpg.initialize(ecSpec);
+            KeyPair keyPair = kpg.generateKeyPair();
+            return keyPair;
+        } catch (NoSuchAlgorithmException
+                | InvalidAlgorithmParameterException e) {
+            throw new IllegalStateException("Error generating ephemeral key-pair", e);
+        }
+    }
+
+    static byte[] getPopSha256FromAuthKeyCert(X509Certificate cert) {
+        byte[] octetString = cert.getExtensionValue("1.3.6.1.4.1.11129.2.1.26");
+        if (octetString == null) {
+            return null;
+        }
+        try {
+            ASN1InputStream asn1InputStream = new ASN1InputStream(octetString);
+            byte[] cborBytes = ((ASN1OctetString) asn1InputStream.readObject()).getOctets();
+
+            ByteArrayInputStream bais = new ByteArrayInputStream(cborBytes);
+            List<DataItem> dataItems = new CborDecoder(bais).decode();
+            if (dataItems.size() != 1) {
+                throw new IllegalArgumentException("Expected 1 item, found " + dataItems.size());
+            }
+            if (!(dataItems.get(0) instanceof Array)) {
+                throw new IllegalArgumentException("Item is not a map");
+            }
+            Array array = (Array) dataItems.get(0);
+            List<DataItem> items = array.getDataItems();
+            if (items.size() < 2) {
+                throw new IllegalArgumentException(
+                        "Expected at least 2 array items, found " + items.size());
+            }
+            if (!(items.get(0) instanceof UnicodeString)) {
+                throw new IllegalArgumentException("First array item is not a string");
+            }
+            String id = ((UnicodeString) items.get(0)).getString();
+            if (!id.equals("ProofOfBinding")) {
+                throw new IllegalArgumentException("Expected ProofOfBinding, got " + id);
+            }
+            if (!(items.get(1) instanceof ByteString)) {
+                throw new IllegalArgumentException("Second array item is not a bytestring");
+            }
+            byte[] popSha256 = ((ByteString) items.get(1)).getBytes();
+            if (popSha256.length != 32) {
+                throw new IllegalArgumentException(
+                        "Expected bstr to be 32 bytes, it is " + popSha256.length);
+            }
+            return popSha256;
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Error decoding extension data", e);
+        } catch (CborException e) {
+            throw new IllegalArgumentException("Error decoding data", e);
+        }
+    }
 }
diff --git a/security/security-app-authenticator/lint-baseline.xml b/security/security-app-authenticator/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/security/security-app-authenticator/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/security/security-biometric/lint-baseline.xml b/security/security-biometric/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/security/security-biometric/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/security/security-crypto-ktx/build.gradle b/security/security-crypto-ktx/build.gradle
index 4911144..12aaa02 100644
--- a/security/security-crypto-ktx/build.gradle
+++ b/security/security-crypto-ktx/build.gradle
@@ -26,7 +26,7 @@
 }
 
 dependencies {
-    api(project(":security:security-crypto"))
+    api("androidx.security:security-crypto:1.1.0-alpha03")
 
     api(KOTLIN_STDLIB)
     androidTestImplementation(JUNIT)
diff --git a/security/security-crypto-ktx/lint-baseline.xml b/security/security-crypto-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/security/security-crypto-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/settings.gradle b/settings.gradle
index 292e53a..183c95f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -10,6 +10,8 @@
 
 rootProject.name = "androidx"
 
+enableFeaturePreview("VERSION_CATALOGS")
+
 boolean isMultiplatformEnabled() {
     def mppParameter = properties.get("androidx.compose.multiplatformEnabled")
     if (mppParameter == null) return false
@@ -63,6 +65,7 @@
                 break
             case "MEDIA":
                 filter.add(BuildType.MEDIA)
+                break
             case "WEAR":
                 filter.add(BuildType.WEAR)
                 break
@@ -216,6 +219,7 @@
 includeProject(":camera:integration-tests:camera-testlib-extensions", "camera/integration-tests/extensionstestlib", [BuildType.MAIN])
 includeProject(":car:app:app", "car/app/app", [BuildType.MAIN])
 includeProject(":car:app:app-activity", "car/app/app-activity", [BuildType.MAIN])
+includeProject(":car:app:app-property", "car/app/app-property", [BuildType.MAIN])
 includeProject(":car:app:app-samples:helloworld-automotive", "car/app/app-samples/helloworld/automotive", [BuildType.MAIN])
 includeProject(":car:app:app-samples:helloworld-common", "car/app/app-samples/helloworld/common", [BuildType.MAIN])
 includeProject(":car:app:app-samples:helloworld-mobile", "car/app/app-samples/helloworld/mobile", [BuildType.MAIN])
@@ -231,6 +235,7 @@
 includeProject(":car:app:app-testing", "car/app/app-testing", [BuildType.MAIN])
 includeProject(":cardview:cardview", "cardview/cardview", [BuildType.MAIN])
 includeProject(":collection:collection", "collection/collection", [BuildType.MAIN])
+includeProject(":collection:collection2", "collection/collection2", [BuildType.MAIN])
 includeProject(":collection:collection-benchmark", "collection/collection-benchmark", [BuildType.MAIN])
 includeProject(":collection:collection-ktx", "collection/collection-ktx", [BuildType.MAIN])
 includeProject(":collection:integration-tests:testapp", "collection/integration-tests/testapp", [BuildType.MAIN])
@@ -282,6 +287,11 @@
 includeProject(":compose:material:material-icons-core", "compose/material/material-icons-core", [BuildType.COMPOSE])
 includeProject(":compose:material:material-icons-core:material-icons-core-samples", "compose/material/material-icons-core/samples", [BuildType.COMPOSE])
 includeProject(":compose:material:material-icons-extended", "compose/material/material-icons-extended", [BuildType.COMPOSE])
+includeProject(":compose:material:material-icons-extended-filled", "compose/material/material-icons-extended/material-icons-extended-filled", [BuildType.COMPOSE])
+includeProject(":compose:material:material-icons-extended-outlined", "compose/material/material-icons-extended/material-icons-extended-outlined", [BuildType.COMPOSE])
+includeProject(":compose:material:material-icons-extended-rounded", "compose/material/material-icons-extended/material-icons-extended-rounded", [BuildType.COMPOSE])
+includeProject(":compose:material:material-icons-extended-sharp", "compose/material/material-icons-extended/material-icons-extended-sharp", [BuildType.COMPOSE])
+includeProject(":compose:material:material-icons-extended-twotone", "compose/material/material-icons-extended/material-icons-extended-twotone", [BuildType.COMPOSE])
 includeProject(":compose:material:material-ripple", "compose/material/material-ripple", [BuildType.COMPOSE])
 includeProject(":compose:material:material:icons:generator", "compose/material/material/icons/generator", [BuildType.COMPOSE])
 includeProject(":compose:material:material:integration-tests:material-demos", "compose/material/material/integration-tests/material-demos", [BuildType.COMPOSE])
@@ -386,11 +396,13 @@
 includeProject(":fragment:fragment-truth", "fragment/fragment-truth", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":fragment:integration-tests:testapp", "fragment/integration-tests/testapp", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":gridlayout:gridlayout", "gridlayout/gridlayout", [BuildType.MAIN])
+includeProject(":health:health-services-client", "health/health-services-client", [BuildType.MAIN])
 includeProject(":heifwriter:heifwriter", "heifwriter/heifwriter", [BuildType.MAIN])
 includeProject(":hilt:hilt-common", "hilt/hilt-common", [BuildType.MAIN])
 includeProject(":hilt:hilt-compiler", "hilt/hilt-compiler", [BuildType.MAIN])
 includeProject(":hilt:hilt-navigation", "hilt/hilt-navigation", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":hilt:hilt-navigation-compose", "hilt/hilt-navigation-compose", [BuildType.COMPOSE])
+includeProject(":hilt:hilt-navigation-compose-samples", "hilt/hilt-navigation-compose/samples", [BuildType.COMPOSE])
 includeProject(":hilt:hilt-navigation-fragment", "hilt/hilt-navigation-fragment", [BuildType.MAIN])
 includeProject(":hilt:hilt-work", "hilt/hilt-work", [BuildType.MAIN])
 includeProject(":hilt:integration-tests:hilt-testapp-viewmodel", "hilt/integration-tests/viewmodelapp", [BuildType.MAIN])
@@ -488,6 +500,8 @@
 includeProject(":preference:preference", "preference/preference", [BuildType.MAIN])
 includeProject(":preference:preference-ktx", "preference/preference-ktx", [BuildType.MAIN])
 includeProject(":print:print", "print/print", [BuildType.MAIN])
+includeProject(":profileinstaller:profileinstaller", "profileinstaller/profileinstaller", [BuildType.MAIN, BuildType.COMPOSE])
+includeProject(":profileinstaller:profileinstaller:integration-tests:testapp", "profileinstaller/profileinstaller/integration-tests/testapp", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":recommendation:recommendation", "recommendation/recommendation", [BuildType.MAIN])
 includeProject(":recyclerview:recyclerview", "recyclerview/recyclerview", [BuildType.MAIN])
 includeProject(":recyclerview:recyclerview-benchmark", "recyclerview/recyclerview-benchmark", [BuildType.MAIN])
@@ -569,6 +583,8 @@
 includeProject(":wear:wear-complications-data", "wear/wear-complications-data", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:wear-complications-provider", "wear/wear-complications-provider", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:wear-complications-provider-samples", "wear/wear-complications-provider/samples", [BuildType.MAIN, BuildType.WEAR])
+includeProject(":wear:compose:compose-foundation", "wear/compose/foundation", [BuildType.COMPOSE])
+includeProject(":wear:compose:compose-material", "wear/compose/material", [BuildType.COMPOSE])
 includeProject(":wear:wear-input", "wear/wear-input", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:wear-input-testing", "wear/wear-input-testing", [BuildType.MAIN, BuildType.WEAR])
 includeProject(":wear:wear-ongoing", "wear/wear-ongoing", [BuildType.MAIN, BuildType.WEAR])
@@ -650,6 +666,7 @@
 includeProject(":internal-testutils-espresso", "testutils/testutils-espresso", [BuildType.MAIN])
 includeProject(":internal-testutils-truth", "testutils/testutils-truth", [BuildType.MAIN, BuildType.FLAN])
 includeProject(":internal-testutils-ktx", "testutils/testutils-ktx", [BuildType.MAIN, BuildType.COMPOSE])
+includeProject(":internal-testutils-macrobenchmark", "testutils/testutils-macrobenchmark", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":internal-testutils-navigation", "testutils/testutils-navigation", [BuildType.MAIN, BuildType.COMPOSE, BuildType.FLAN])
 includeProject(":internal-testutils-paging", "testutils/testutils-paging", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":internal-testutils-gradle-plugin", "testutils/testutils-gradle-plugin", [BuildType.MAIN, BuildType.FLAN])
diff --git a/sharetarget/integration-tests/testapp/lint-baseline.xml b/sharetarget/integration-tests/testapp/lint-baseline.xml
index 633b42b..ca9f621 100644
--- a/sharetarget/integration-tests/testapp/lint-baseline.xml
+++ b/sharetarget/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="SyntheticAccessor"
diff --git a/sharetarget/integration-tests/testapp/src/main/res/values/strings.xml b/sharetarget/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from sharetarget/integration-tests/testapp/src/main/res/values/strings.xml
rename to sharetarget/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/sharetarget/sharetarget/build.gradle b/sharetarget/sharetarget/build.gradle
index 3713624..e911dca 100644
--- a/sharetarget/sharetarget/build.gradle
+++ b/sharetarget/sharetarget/build.gradle
@@ -34,8 +34,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/sharetarget/sharetarget/lint-baseline.xml b/sharetarget/sharetarget/lint-baseline.xml
index 56ed255..f801350 100644
--- a/sharetarget/sharetarget/lint-baseline.xml
+++ b/sharetarget/sharetarget/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/slices/benchmark/build.gradle b/slices/benchmark/build.gradle
index 19510e2..7b04353 100644
--- a/slices/benchmark/build.gradle
+++ b/slices/benchmark/build.gradle
@@ -35,9 +35,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/slices/benchmark/lint-baseline.xml b/slices/benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/slices/benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/slices/builders/ktx/lint-baseline.xml b/slices/builders/ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/slices/builders/ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/slices/builders/lint-baseline.xml b/slices/builders/lint-baseline.xml
index e84e1c3..2c54f970 100644
--- a/slices/builders/lint-baseline.xml
+++ b/slices/builders/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.slice.builders.impl.ListBuilderBasicImpl is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.slice.builders.impl.ListBuilderBasicImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        setTtl(ttl == null ? INFINITY : ttl.toMillis());"
         errorLine2="                                            ~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.slice.builders.impl.ListBuilderImpl is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.slice.builders.impl.ListBuilderImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        setTtl(ttl == null ? INFINITY : ttl.toMillis());"
         errorLine2="                                            ~~~~~~~~">
         <location
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
index a0669c4..90affdb 100644
--- a/slices/core/build.gradle
+++ b/slices/core/build.gradle
@@ -33,8 +33,8 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 
     annotationProcessor (project(":versionedparcelable:versionedparcelable-compiler"))
 }
diff --git a/slices/core/lint-baseline.xml b/slices/core/lint-baseline.xml
index 23f1230..b679aef 100644
--- a/slices/core/lint-baseline.xml
+++ b/slices/core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.slice.compat.CompatPermissionManager.PermissionState is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.slice.compat.CompatPermissionManager.PermissionState is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                if (!Objects.equals(path[i], prefix[i])) {"
         errorLine2="                             ~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.slice.Slice is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.slice.Slice is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return SliceConvert.wrap(context.getSystemService(SliceManager.class)"
         errorLine2="                                         ~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.slice.Slice is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.slice.Slice is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .bindSlice(uri, unwrap(supportedSpecs)), context);"
         errorLine2="                 ~~~~~~~~~">
         <location
@@ -90,13 +90,13 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.slice.compat.SliceProviderCompat.ProviderHolder is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.slice.compat.SliceProviderCompat.ProviderHolder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mProvider.close();"
         errorLine2="                          ~~~~~">
         <location
             file="src/main/java/androidx/slice/compat/SliceProviderCompat.java"
-            line="709"
+            line="710"
             column="27"/>
     </issue>
 
diff --git a/slices/core/src/main/res/values-fa/strings.xml b/slices/core/src/main/res/values-fa/strings.xml
index 7c3fbf9..38a286d 100644
--- a/slices/core/src/main/res/values-fa/strings.xml
+++ b/slices/core/src/main/res/values-fa/strings.xml
@@ -22,6 +22,6 @@
     <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- می‌تواند اطلاعات <xliff:g id="APP">%1$s</xliff:g> را بخواند"</string>
     <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- می‌تواند در <xliff:g id="APP">%1$s</xliff:g> اقدام انجام دهد"</string>
     <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"به <xliff:g id="APP">%1$s</xliff:g> اجازه داده شود تکه‌هایی از برنامه‌ها نشان دهد"</string>
-    <string name="abc_slice_permission_allow" msgid="5024599872061409708">"مجاز"</string>
+    <string name="abc_slice_permission_allow" msgid="5024599872061409708">"مجاز بودن"</string>
     <string name="abc_slice_permission_deny" msgid="3819478292430407705">"مجاز نبودن"</string>
 </resources>
diff --git a/slices/core/src/main/res/values-iw/strings.xml b/slices/core/src/main/res/values-iw/strings.xml
index 3064619..7534117 100644
--- a/slices/core/src/main/res/values-iw/strings.xml
+++ b/slices/core/src/main/res/values-iw/strings.xml
@@ -19,9 +19,9 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slices_permission_request" msgid="3604847235923472451">"<xliff:g id="APP_0">%1$s</xliff:g> רוצה להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
     <string name="abc_slice_permission_title" msgid="4175332421259324948">"האם לאפשר ל-<xliff:g id="APP_0">%1$s</xliff:g> להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>?"</string>
-    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- תהיה לה אפשרות לקרוא מידע מ-<xliff:g id="APP">%1$s</xliff:g>"</string>
+    <string name="abc_slice_permission_text_1" msgid="4525743640399572811">"- תהיה לה אפשרות לקרוא מידע מהאפליקציה <xliff:g id="APP">%1$s</xliff:g>"</string>
     <string name="abc_slice_permission_text_2" msgid="7323565634860251794">"- תהיה לה יכולת לנקוט פעולה בתוך <xliff:g id="APP">%1$s</xliff:g>"</string>
-    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"יש לאשר ל-<xliff:g id="APP">%1$s</xliff:g> להראות חלקים מכל אפליציה שהיא"</string>
+    <string name="abc_slice_permission_checkbox" msgid="5696872682700058611">"יש לאשר לאפליקציית <xliff:g id="APP">%1$s</xliff:g> להציג חלקים מכל אפליקציה שהיא"</string>
     <string name="abc_slice_permission_allow" msgid="5024599872061409708">"אישור"</string>
     <string name="abc_slice_permission_deny" msgid="3819478292430407705">"אני לא מרשה"</string>
 </resources>
diff --git a/slices/remotecallback/build.gradle b/slices/remotecallback/build.gradle
index 2849219..c906165 100644
--- a/slices/remotecallback/build.gradle
+++ b/slices/remotecallback/build.gradle
@@ -34,8 +34,8 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestAnnotationProcessor project(":remotecallback:remotecallback-processor")
 }
 
diff --git a/slices/remotecallback/lint-baseline.xml b/slices/remotecallback/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/slices/remotecallback/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/slices/test/build.gradle b/slices/test/build.gradle
index 28e5a52..351e96a 100644
--- a/slices/test/build.gradle
+++ b/slices/test/build.gradle
@@ -34,9 +34,9 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/slices/test/lint-baseline.xml b/slices/test/lint-baseline.xml
index f9611dc..dbc53ce 100644
--- a/slices/test/lint-baseline.xml
+++ b/slices/test/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index f88be95..48025cc 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -37,9 +37,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/slices/view/lint-baseline.xml b/slices/view/lint-baseline.xml
index 55ea22e..a6913381 100644
--- a/slices/view/lint-baseline.xml
+++ b/slices/view/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -24,30 +24,30 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.slice.widget.ActionRow is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.slice.widget.ActionRow is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (input.getRemoteInput().getAllowFreeFormInput()) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/ActionRow.java"
-            line="161"
+            line="162"
             column="36"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.slice.widget.GridRowView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.slice.widget.GridRowView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mForeground.getBackground().setHotspot(x, y);"
         errorLine2="                                        ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="770"
+            line="818"
             column="41"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class null is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            view.performAccessibilityAction(ACTION_ACCESSIBILITY_FOCUS, null);"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.slice.widget.LocationBasedViewTracker is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.slice.widget.LocationBasedViewTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (child.isAccessibilityFocused()) {"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.slice.widget.RemoteInputView.RemoteEditText is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.slice.widget.RemoteInputView.RemoteEditText is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return isTemporarilyDetached();"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.slice.widget.RemoteInputView.RemoteEditText is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.slice.widget.RemoteInputView.RemoteEditText is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                setBackground(mBackground);"
         errorLine2="                ~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.slice.widget.RemoteInputView.RemoteEditText is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.slice.widget.RemoteInputView.RemoteEditText is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                setBackground(null);"
         errorLine2="                ~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.slice.widget.SliceView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.slice.widget.SliceView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
         errorLine2="        ~~~~~">
         <location
@@ -112,13 +112,13 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.slice.widget.TemplateView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.slice.widget.TemplateView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mForeground.getBackground().setHotspot(x, y);"
         errorLine2="                                        ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="116"
+            line="125"
             column="41"/>
     </issue>
 
@@ -136,149 +136,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public GridContent(SliceItem gridItem, int position) {"
-        errorLine2="                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridContent.java"
-            line="76"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 getHeight(SliceStyle style, SliceViewPolicy policy) {"
-        errorLine2="                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridContent.java"
-            line="255"
-            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 int getHeight(SliceStyle style, SliceViewPolicy policy) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridContent.java"
-            line="255"
-            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 CellContent(SliceItem cellItem) {"
-        errorLine2="                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridContent.java"
-            line="278"
-            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 boolean populate(SliceItem cellItem) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridContent.java"
-            line="285"
-            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 GridRowView(Context context) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="127"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public GridRowView(Context context, AttributeSet attrs) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="131"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public GridRowView(Context context, AttributeSet attrs) {"
-        errorLine2="                                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="131"
-            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 void setSliceItem(SliceContent slice, boolean isHeader, int rowIndex,"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="197"
-            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="            int rowCount, SliceView.OnSliceActionListener observer) {"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="198"
-            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 onClick(View view) {"
-        errorLine2="                        ~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="739"
-            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 boolean onTouch(View view, MotionEvent event) {"
-        errorLine2="                           ~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="760"
-            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 boolean onTouch(View view, MotionEvent event) {"
-        errorLine2="                                      ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/slice/widget/GridRowView.java"
-            line="760"
-            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 ListContent(Context context, @NonNull Slice slice) {"
         errorLine2="                       ~~~~~~~">
         <location
@@ -800,7 +657,7 @@
         errorLine2="                         ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/RowContent.java"
-            line="356"
+            line="360"
             column="26"/>
     </issue>
 
@@ -811,7 +668,7 @@
         errorLine2="                                           ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/RowContent.java"
-            line="356"
+            line="360"
             column="44"/>
     </issue>
 
@@ -866,7 +723,7 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/RowView.java"
-            line="401"
+            line="409"
             column="33"/>
     </issue>
 
@@ -877,7 +734,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/RowView.java"
-            line="1147"
+            line="1155"
             column="35"/>
     </issue>
 
@@ -1108,7 +965,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceAdapter.java"
-            line="350"
+            line="362"
             column="32"/>
     </issue>
 
@@ -1119,7 +976,7 @@
         errorLine2="                            ~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceAdapter.java"
-            line="390"
+            line="402"
             column="29"/>
     </issue>
 
@@ -1130,7 +987,7 @@
         errorLine2="                               ~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceAdapter.java"
-            line="398"
+            line="410"
             column="32"/>
     </issue>
 
@@ -1141,7 +998,7 @@
         errorLine2="                                       ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceAdapter.java"
-            line="398"
+            line="410"
             column="40"/>
     </issue>
 
@@ -1229,7 +1086,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="187"
+            line="186"
             column="40"/>
     </issue>
 
@@ -1240,7 +1097,7 @@
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="195"
+            line="194"
             column="47"/>
     </issue>
 
@@ -1251,7 +1108,7 @@
         errorLine2="                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="204"
+            line="203"
             column="34"/>
     </issue>
 
@@ -1262,7 +1119,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="212"
+            line="211"
             column="35"/>
     </issue>
 
@@ -1273,7 +1130,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="228"
+            line="227"
             column="12"/>
     </issue>
 
@@ -1284,7 +1141,7 @@
         errorLine2="                         ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/SliceChildView.java"
-            line="237"
+            line="236"
             column="26"/>
     </issue>
 
@@ -2054,7 +1911,7 @@
         errorLine2="                                      ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="106"
+            line="115"
             column="39"/>
     </issue>
 
@@ -2065,7 +1922,7 @@
         errorLine2="                          ~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="133"
+            line="142"
             column="27"/>
     </issue>
 
@@ -2076,7 +1933,7 @@
         errorLine2="                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="144"
+            line="153"
             column="34"/>
     </issue>
 
@@ -2087,7 +1944,7 @@
         errorLine2="                                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="153"
+            line="162"
             column="35"/>
     </issue>
 
@@ -2098,7 +1955,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="162"
+            line="171"
             column="12"/>
     </issue>
 
@@ -2109,7 +1966,7 @@
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="181"
+            line="189"
             column="40"/>
     </issue>
 
@@ -2120,7 +1977,7 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="193"
+            line="201"
             column="33"/>
     </issue>
 
@@ -2131,7 +1988,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="202"
+            line="210"
             column="33"/>
     </issue>
 
@@ -2142,7 +1999,7 @@
         errorLine2="                         ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slice/widget/TemplateView.java"
-            line="213"
+            line="221"
             column="26"/>
     </issue>
 
diff --git a/slices/view/src/androidTest/java/androidx/slice/render/RenderTest.java b/slices/view/src/androidTest/java/androidx/slice/render/RenderTest.java
index 13980bb..e41a676 100644
--- a/slices/view/src/androidTest/java/androidx/slice/render/RenderTest.java
+++ b/slices/view/src/androidTest/java/androidx/slice/render/RenderTest.java
@@ -32,6 +32,7 @@
 import androidx.test.rule.ActivityTestRule;
 import androidx.test.rule.GrantPermissionRule;
 
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -56,6 +57,7 @@
     public ActivityTestRule<SliceRenderActivity> mActivityRule =
             new ActivityTestRule<>(SliceRenderActivity.class);
 
+    @Ignore
     @Test
     public void testRender() throws Exception {
         if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && Build.MODEL.contains("Nexus 6P")) {
diff --git a/slices/view/src/androidTest/res/values/strings.xml b/slices/view/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from slices/view/src/androidTest/res/values/strings.xml
rename to slices/view/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/slices/view/src/main/res/values-iw/strings.xml b/slices/view/src/main/res/values-iw/strings.xml
index db052e3..a511a5a 100644
--- a/slices/view/src/main/res/values-iw/strings.xml
+++ b/slices/view/src/main/res/values-iw/strings.xml
@@ -19,13 +19,13 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_slice_more_content" msgid="6405516388971241142">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="abc_slice_more" msgid="1983560225998630901">"עוד"</string>
-    <string name="abc_slice_show_more" msgid="1567717014004692768">"הצג יותר"</string>
-    <string name="abc_slice_updated" msgid="8155085405396453848">"עודכן ב-<xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="abc_slice_show_more" msgid="1567717014004692768">"עוד"</string>
+    <string name="abc_slice_updated" msgid="8155085405396453848">"עדכון אחרון: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <plurals name="abc_slice_duration_min" formatted="false" msgid="6996334305156847955">
       <item quantity="two">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
       <item quantity="many">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
       <item quantity="other">לפני <xliff:g id="ID_2">%d</xliff:g> דק’</item>
-      <item quantity="one">לפני <xliff:g id="ID_1">%d</xliff:g> דק’</item>
+      <item quantity="one">לפני דקה (<xliff:g id="ID_1">%d</xliff:g>)</item>
     </plurals>
     <plurals name="abc_slice_duration_years" formatted="false" msgid="6212691832333991589">
       <item quantity="two">לפני <xliff:g id="ID_2">%d</xliff:g> שנים</item>
diff --git a/slidingpanelayout/slidingpanelayout/build.gradle b/slidingpanelayout/slidingpanelayout/build.gradle
index 86340b6..4ac36e3 100644
--- a/slidingpanelayout/slidingpanelayout/build.gradle
+++ b/slidingpanelayout/slidingpanelayout/build.gradle
@@ -16,7 +16,7 @@
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(TRUTH)
     androidTestImplementation(project(':internal-testutils-runtime'))
diff --git a/slidingpanelayout/slidingpanelayout/lint-baseline.xml b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
index fef803c..6f8643b 100644
--- a/slidingpanelayout/slidingpanelayout/lint-baseline.xml
+++ b/slidingpanelayout/slidingpanelayout/lint-baseline.xml
@@ -1,38 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 onPanelSlide(View panel, float slideOffset) {"
-        errorLine2="                                 ~~~~">
-        <location
-            file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="234"
-            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 onPanelOpened(View panel) {"
-        errorLine2="                                  ~~~~">
-        <location
-            file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="237"
-            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 onPanelClosed(View panel) {"
-        errorLine2="                                  ~~~~">
-        <location
-            file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="240"
-            column="35"/>
-    </issue>
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
@@ -41,7 +8,7 @@
         errorLine2="                                  ~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="751"
+            line="910"
             column="35"/>
     </issue>
 
@@ -52,7 +19,7 @@
         errorLine2="                                              ~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="751"
+            line="910"
             column="47"/>
     </issue>
 
@@ -63,7 +30,7 @@
         errorLine2="                                         ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="759"
+            line="918"
             column="42"/>
     </issue>
 
@@ -74,7 +41,7 @@
         errorLine2="                                ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="819"
+            line="978"
             column="33"/>
     </issue>
 
@@ -85,7 +52,7 @@
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1014"
+            line="1149"
             column="33"/>
     </issue>
 
@@ -96,7 +63,7 @@
         errorLine2="                                               ~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1014"
+            line="1149"
             column="48"/>
     </issue>
 
@@ -107,7 +74,7 @@
         errorLine2="                                  ~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1142"
+            line="1307"
             column="35"/>
     </issue>
 
@@ -118,7 +85,7 @@
         errorLine2="                     ~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1201"
+            line="1366"
             column="22"/>
     </issue>
 
@@ -129,7 +96,7 @@
         errorLine2="                                ~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1270"
+            line="1427"
             column="33"/>
     </issue>
 
@@ -140,7 +107,7 @@
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1302"
+            line="1459"
             column="15"/>
     </issue>
 
@@ -151,7 +118,7 @@
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1307"
+            line="1464"
             column="15"/>
     </issue>
 
@@ -162,7 +129,7 @@
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1307"
+            line="1464"
             column="59"/>
     </issue>
 
@@ -173,7 +140,7 @@
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1314"
+            line="1471"
             column="41"/>
     </issue>
 
@@ -184,7 +151,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1319"
+            line="1476"
             column="12"/>
     </issue>
 
@@ -195,7 +162,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1319"
+            line="1476"
             column="56"/>
     </issue>
 
@@ -206,7 +173,7 @@
         errorLine2="              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1324"
+            line="1481"
             column="15"/>
     </issue>
 
@@ -217,7 +184,7 @@
         errorLine2="                                          ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java"
-            line="1334"
+            line="1492"
             column="43"/>
     </issue>
 
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/FoldTest.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/FoldTest.kt
new file mode 100644
index 0000000..b245d3d
--- /dev/null
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/FoldTest.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.slidingpanelayout.widget
+
+import android.view.View
+import androidx.slidingpanelayout.test.R
+import androidx.slidingpanelayout.widget.helpers.FakeWindowBackend
+import androidx.slidingpanelayout.widget.helpers.TestActivity
+import androidx.slidingpanelayout.widget.helpers.findViewById
+import androidx.slidingpanelayout.widget.helpers.findViewX
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.testutils.withActivity
+import androidx.window.WindowManager
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Test views split on the fold
+ */
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+public class FoldTest {
+
+    @After
+    public fun tearDown() {
+        TestActivity.onActivityCreated = {}
+    }
+
+    /**
+     * Test split views in middle when fold vertically
+     */
+    @Test
+    public fun testFoldVertical() {
+        TestActivity.onActivityCreated = { activity ->
+            activity.setContentView(R.layout.activity_test_fold_layout)
+            val slidingPaneLayout =
+                activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_fold_layout)
+            val foldingFeatureObserver = SlidingPaneLayout.FoldingFeatureObserver(
+                activity,
+                FakeWindowBackend(FakeWindowBackend.FoldAxis.VERTICAL)
+            )
+            slidingPaneLayout.setFoldingFeatureObserver(foldingFeatureObserver)
+        }
+
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            val foldPosition = withActivity {
+                FakeWindowBackend.getFoldPosition(
+                    this,
+                    FakeWindowBackend.FoldAxis.VERTICAL,
+                    0
+                )
+            }
+            assertThat(findViewById(R.id.list_pane).width).isEqualTo(
+                findViewById(
+                    R.id.detail_pane
+                ).width
+            )
+            assertThat(findViewX(R.id.detail_pane)).isEqualTo(foldPosition.left)
+        }
+    }
+
+    /**
+     * Test split views not applicable when fold horizontally.
+     */
+    @Test
+    public fun testFoldHorizontal() {
+        TestActivity.onActivityCreated = { activity ->
+            activity.setContentView(R.layout.activity_test_fold_layout)
+            val slidingPaneLayout =
+                activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_fold_layout)
+            val foldingFeatureObserver = SlidingPaneLayout.FoldingFeatureObserver(
+                activity,
+                FakeWindowBackend(FakeWindowBackend.FoldAxis.HORIZONTAL)
+            )
+            slidingPaneLayout.setFoldingFeatureObserver(foldingFeatureObserver)
+        }
+
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            assertThat(findViewById(R.id.list_pane).width).isLessThan(
+                findViewById(
+                    R.id
+                        .detail_pane
+                ).width
+            )
+            assertThat(findViewX(R.id.list_pane)).isLessThan(findViewX(R.id.detail_pane))
+        }
+    }
+
+    /**
+     * Test split views when fold pane is smaller than required min width
+     */
+    @Test
+    public fun testFoldExceedMinWidth() {
+        val detailViewExtraWidth = 200
+        TestActivity.onActivityCreated = { activity ->
+            activity.setContentView(R.layout.activity_test_fold_layout)
+            val slidingPaneLayout =
+                activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_fold_layout)
+            val foldingFeatureObserver = SlidingPaneLayout.FoldingFeatureObserver(
+                activity,
+                FakeWindowBackend(FakeWindowBackend.FoldAxis.VERTICAL)
+            )
+            slidingPaneLayout.setFoldingFeatureObserver(foldingFeatureObserver)
+            val detailView = activity.findViewById<View>(R.id.detail_pane)
+            val window = WindowManager(activity).getCurrentWindowMetrics().bounds
+            detailView.minimumWidth = window.width() / 2 + detailViewExtraWidth
+        }
+
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            val window = withActivity { WindowManager(this).getCurrentWindowMetrics().bounds }
+            assertThat(findViewById(R.id.detail_pane).width).isEqualTo(window.width())
+        }
+    }
+
+    /**
+     * Test layout updates when unfold a foldable device
+     */
+    @Test
+    public fun testUnfold() {
+        TestActivity.onActivityCreated = { activity ->
+            activity.setContentView(R.layout.activity_test_fold_layout)
+            val slidingPaneLayout =
+                activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_fold_layout)
+            val fakeWindowBackend = FakeWindowBackend(FakeWindowBackend.FoldAxis.VERTICAL)
+            fakeWindowBackend.toggleFoldState(activity)
+            val foldingFeatureObserver = SlidingPaneLayout.FoldingFeatureObserver(
+                activity,
+                fakeWindowBackend
+            )
+            slidingPaneLayout.setFoldingFeatureObserver(foldingFeatureObserver)
+        }
+
+        with(ActivityScenario.launch(TestActivity::class.java)) {
+            assertThat(findViewById(R.id.list_pane).width).isLessThan(
+                findViewById(
+                    R.id
+                        .detail_pane
+                ).width
+            )
+            assertThat(findViewX(R.id.list_pane)).isLessThan(findViewX(R.id.detail_pane))
+        }
+    }
+}
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/LockModeTest.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/LockModeTest.kt
index f9acb62..faf82fa 100644
--- a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/LockModeTest.kt
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/LockModeTest.kt
@@ -22,11 +22,12 @@
 import androidx.slidingpanelayout.widget.SlidingPaneLayout.LOCK_MODE_LOCKED
 import androidx.slidingpanelayout.widget.SlidingPaneLayout.LOCK_MODE_UNLOCKED
 import androidx.slidingpanelayout.widget.helpers.TestActivity
+import androidx.slidingpanelayout.widget.helpers.addWaitForCloseLatch
 import androidx.slidingpanelayout.widget.helpers.addWaitForOpenLatch
-import androidx.slidingpanelayout.widget.helpers.dragLeft
-import androidx.slidingpanelayout.widget.helpers.dragRight
-import androidx.slidingpanelayout.widget.helpers.findViewX
+import androidx.slidingpanelayout.widget.helpers.addWaitForSlideLatch
 import androidx.slidingpanelayout.widget.helpers.openPane
+import androidx.slidingpanelayout.widget.helpers.slideClose
+import androidx.slidingpanelayout.widget.helpers.slideOpen
 import androidx.test.core.app.ActivityScenario
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.assertion.ViewAssertions
@@ -36,7 +37,9 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
+import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
+import org.junit.After
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.util.concurrent.TimeUnit
@@ -48,6 +51,11 @@
 @LargeTest
 public class LockModeTest {
 
+    @After
+    public fun tearDown() {
+        TestActivity.onActivityCreated = {}
+    }
+
     @Test
     public fun testLayoutInflation() {
         with(ActivityScenario.launch(TestActivity::class.java)) {
@@ -58,11 +66,15 @@
                     ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)
                 )
             )
+            val slidingPaneLayout =
+                withActivity { findViewById<SlidingPaneLayout>(R.id.sliding_pane_layout) }
+            assertThat(slidingPaneLayout.isOpen).isFalse()
+            assertThat(slidingPaneLayout.isSlideable).isTrue()
         }
     }
 
     /**
-     * Test users can freely swipe right between list and detail panes when lock mode set to
+     * Test users can swipe right between list and detail panes when lock mode set to
      * LOCK_MODE_UNLOCKED.
      */
     @SdkSuppress(maxSdkVersion = 28) // TODO: Fix flaky test issues on API 30 Cuttlefish devices.
@@ -75,18 +87,19 @@
         }
 
         with(ActivityScenario.launch(TestActivity::class.java)) {
-            val latch = addWaitForOpenLatch(R.id.sliding_pane_layout)
+            val panelOpenCountDownLatch = addWaitForOpenLatch(R.id.sliding_pane_layout)
             onView(withId(R.id.sliding_pane_layout)).perform(openPane())
-            assertThat(latch.await(2, TimeUnit.SECONDS)).isTrue()
-            latch.await(2, TimeUnit.SECONDS)
-            val detailPaneOpenX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragRight())
-            assertThat(findViewX(R.id.detail_pane)).isGreaterThan(detailPaneOpenX)
+            // wait for detail pane open
+            assertThat(panelOpenCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue()
+            val panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideClose())
+            // wait for detail pane sliding
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue()
         }
     }
 
     /**
-     * Test users can freely swipe left between list and detail panes when lock mode set to
+     * Test users can swipe left between list and detail panes when lock mode set to
      * LOCK_MODE_UNLOCKED.
      */
     @SdkSuppress(maxSdkVersion = 28) // TODO: Fix flaky test issues on API 30 Cuttlefish devices.
@@ -99,19 +112,20 @@
         }
 
         with(ActivityScenario.launch(TestActivity::class.java)) {
-            val detailPaneOpenX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragLeft())
-            assertThat(findViewX(R.id.detail_pane)).isLessThan(detailPaneOpenX)
+            val panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideOpen())
+            // wait for detail pane sliding
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue()
         }
     }
 
     /**
-     * Test users cannot swipe from list to detail, but can swipe from detail to list when lock
-     * mode set to LOCK_MODE_LOCKED_OPEN
+     * Test users can swipe to open detail pane in lock mode LOCK_MODE_LOCKED_OPEN when
+     * detail view is in closed state. Otherwise, users cannot swipe it.
      */
     @SdkSuppress(maxSdkVersion = 28) // TODO: Fix flaky test issues on API 30 Cuttlefish devices.
     @Test
-    public fun testCanSlideListToDetailWhenLockModeLockedOpen() {
+    public fun testSwipeWhenLockModeLockedOpen() {
         TestActivity.onActivityCreated = { activity ->
             val slidingPaneLayout =
                 activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_layout)
@@ -119,21 +133,24 @@
         }
 
         with(ActivityScenario.launch(TestActivity::class.java)) {
-            val detailPaneClosedX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragRight())
-            assertThat(findViewX(R.id.detail_pane)).isEqualTo(detailPaneClosedX)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragLeft())
-            assertThat(findViewX(R.id.detail_pane)).isLessThan(detailPaneClosedX)
+            var panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideOpen())
+            // can slide to open
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue()
+            panelSlideCountDownLatch = addWaitForCloseLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideClose())
+            // cannot slide to close
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isFalse()
         }
     }
 
     /**
-     * Test users cannot swipe from detail to list, but can swipe from list to detail when lock
-     * mode set to LOCK_MODE_LOCKED_CLOSED
+     * Test users can swipe to close the detail pane in lock mode LOCK_MODE_LOCKED_CLOSED when
+     * detail view is in open state. Otherwise, users cannot swipe it.
      */
     @SdkSuppress(maxSdkVersion = 28) // TODO: Fix flaky test issues on API 30 Cuttlefish devices.
     @Test
-    public fun testSwipeWhenLockModeClosed() {
+    public fun testSwipeWhenLockModeLockedClosed() {
         TestActivity.onActivityCreated = { activity ->
             val slidingPaneLayout =
                 activity.findViewById<SlidingPaneLayout>(R.id.sliding_pane_layout)
@@ -141,15 +158,17 @@
         }
 
         with(ActivityScenario.launch(TestActivity::class.java)) {
-            var detailPaneClosedX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragLeft())
-            assertThat(findViewX(R.id.detail_pane)).isEqualTo(detailPaneClosedX)
+            var panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideOpen())
+            // cannot slide to open
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isFalse()
             val latch = addWaitForOpenLatch(R.id.sliding_pane_layout)
             onView(withId(R.id.sliding_pane_layout)).perform(openPane())
             assertThat(latch.await(2, TimeUnit.SECONDS)).isTrue()
-            detailPaneClosedX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragRight())
-            assertThat(findViewX(R.id.detail_pane)).isGreaterThan(detailPaneClosedX)
+            panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideClose())
+            // can slide to close
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue()
         }
     }
 
@@ -167,15 +186,17 @@
         }
 
         with(ActivityScenario.launch(TestActivity::class.java)) {
-            val detailPaneClosedX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragLeft())
-            assertThat(findViewX(R.id.detail_pane)).isEqualTo(detailPaneClosedX)
+            var panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideOpen())
+            // cannot slide to open
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isFalse()
             val latch = addWaitForOpenLatch(R.id.sliding_pane_layout)
             onView(withId(R.id.sliding_pane_layout)).perform(openPane())
             assertThat(latch.await(2, TimeUnit.SECONDS)).isTrue()
-            val detailPaneOpenX = findViewX(R.id.detail_pane)
-            onView(withId(R.id.sliding_pane_layout)).perform(dragRight())
-            assertThat(findViewX(R.id.detail_pane)).isEqualTo(detailPaneOpenX)
+            panelSlideCountDownLatch = addWaitForSlideLatch(R.id.sliding_pane_layout)
+            onView(withId(R.id.sliding_pane_layout)).perform(slideClose())
+            // cannot slide to close
+            assertThat(panelSlideCountDownLatch.await(2, TimeUnit.SECONDS)).isFalse()
         }
     }
 }
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/PanelSlideListenerTest.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/PanelSlideListenerTest.kt
index c5ac061..ae1fbcf 100644
--- a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/PanelSlideListenerTest.kt
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/PanelSlideListenerTest.kt
@@ -29,6 +29,7 @@
 import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import org.junit.After
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.util.concurrent.CountDownLatch
@@ -41,6 +42,11 @@
 @LargeTest
 public class PanelSlideListenerTest {
 
+    @After
+    public fun tearDown() {
+        TestActivity.onActivityCreated = {}
+    }
+
     @Test
     public fun testAddPanelSlideListener() {
         with(ActivityScenario.launch(TestActivity::class.java)) {
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/ActivityScenario.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/ActivityScenario.kt
index ddc7ca3..4d54fe3 100644
--- a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/ActivityScenario.kt
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/ActivityScenario.kt
@@ -30,6 +30,10 @@
     return withActivity { findViewById<View>(resId).x }
 }
 
+public inline fun <reified A : Activity> ActivityScenario<A>.findViewById(@IdRes resId: Int): View {
+    return withActivity { findViewById(resId) }
+}
+
 public inline fun <reified A : Activity> ActivityScenario<A>.addWaitForOpenLatch(
     @IdRes resId: Int
 ): CountDownLatch {
@@ -47,3 +51,39 @@
     }
     return latch
 }
+
+public inline fun <reified A : Activity> ActivityScenario<A>.addWaitForCloseLatch(
+    @IdRes resId: Int
+): CountDownLatch {
+    val latch = CountDownLatch(1)
+    withActivity {
+        val slidingPaneLayout = findViewById<SlidingPaneLayout>(resId)
+        slidingPaneLayout.addPanelSlideListener(object : SlidingPaneLayout.PanelSlideListener {
+            override fun onPanelSlide(panel: View, slideOffset: Float) {}
+            override fun onPanelOpened(panel: View) {}
+            override fun onPanelClosed(panel: View) {
+                latch.countDown()
+                slidingPaneLayout.removePanelSlideListener(this)
+            }
+        })
+    }
+    return latch
+}
+
+public inline fun <reified A : Activity> ActivityScenario<A>.addWaitForSlideLatch(
+    @IdRes resId: Int
+): CountDownLatch {
+    val latch = CountDownLatch(1)
+    withActivity {
+        val slidingPaneLayout = findViewById<SlidingPaneLayout>(resId)
+        slidingPaneLayout.addPanelSlideListener(object : SlidingPaneLayout.PanelSlideListener {
+            override fun onPanelSlide(panel: View, slideOffset: Float) {
+                latch.countDown()
+                slidingPaneLayout.removePanelSlideListener(this)
+            }
+            override fun onPanelOpened(panel: View) {}
+            override fun onPanelClosed(panel: View) {}
+        })
+    }
+    return latch
+}
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/Espresso.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/Espresso.kt
index 80b7429..b55f81e 100644
--- a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/Espresso.kt
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/Espresso.kt
@@ -28,10 +28,10 @@
 import androidx.test.espresso.matcher.ViewMatchers
 import org.hamcrest.Matcher
 
-public fun dragRight(): ViewAction? {
+public fun slideClose(): ViewAction? {
     return ViewActions.actionWithAssertions(
         GeneralSwipeAction(
-            Swipe.SLOW,
+            Swipe.FAST,
             GeneralLocation.CENTER_LEFT,
             GeneralLocation.CENTER_RIGHT,
             Press.FINGER
@@ -39,10 +39,10 @@
     )
 }
 
-public fun dragLeft(): ViewAction? {
+public fun slideOpen(): ViewAction? {
     return ViewActions.actionWithAssertions(
         GeneralSwipeAction(
-            Swipe.SLOW,
+            Swipe.FAST,
             GeneralLocation.CENTER_RIGHT,
             GeneralLocation.CENTER_LEFT,
             Press.FINGER
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/FakeWindowBackend.kt b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/FakeWindowBackend.kt
new file mode 100644
index 0000000..b3760de
--- /dev/null
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/java/androidx/slidingpanelayout/widget/helpers/FakeWindowBackend.kt
@@ -0,0 +1,122 @@
+/*
+ * 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.slidingpanelayout.widget.helpers
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.core.util.Consumer
+import androidx.window.DisplayFeature
+import androidx.window.FoldingFeature
+import androidx.window.WindowBackend
+import androidx.window.WindowLayoutInfo
+import androidx.window.WindowManager
+import java.util.concurrent.Executor
+
+/**
+ * A fake window backend for testing. The fake window backend provides a basic implementation
+ * folding in middle to mimic fold/unfold behavior in real world.
+ */
+public class FakeWindowBackend(private val foldAxis: FoldAxis) : WindowBackend {
+    private var foldState = FoldingFeature.STATE_HALF_OPENED
+    private var foldWidth: Int = 0
+    private var windowLayoutInfoCallback: Consumer<WindowLayoutInfo>? = null
+    private var windowLayoutInfoExecutor: Executor? = null
+
+    public enum class FoldAxis {
+        HORIZONTAL,
+        VERTICAL
+    }
+
+    public companion object {
+        public fun getFoldPosition(activity: Activity, foldAxis: FoldAxis, foldWidth: Int): Rect {
+            val windowSize = WindowManager(activity).getCurrentWindowMetrics().bounds
+            return midScreenFold(windowSize, foldAxis, foldWidth)
+        }
+
+        private fun midScreenFold(windowBounds: Rect, foldAxis: FoldAxis, foldWidth: Int): Rect {
+            return when (foldAxis) {
+                FoldAxis.HORIZONTAL -> {
+                    Rect(
+                        0,
+                        windowBounds.height() / 2 - foldWidth / 2,
+                        windowBounds.width(),
+                        windowBounds.height() / 2 + foldWidth / 2
+                    )
+                }
+                FoldAxis.VERTICAL -> {
+                    Rect(
+                        windowBounds.width() / 2 - foldWidth / 2,
+                        0,
+                        windowBounds.width() / 2 + foldWidth / 2,
+                        windowBounds.height()
+                    )
+                }
+            }
+        }
+    }
+
+    override fun registerLayoutChangeCallback(
+        activity: Activity,
+        executor: Executor,
+        callback: Consumer<WindowLayoutInfo>
+    ) {
+        windowLayoutInfoCallback = callback
+        windowLayoutInfoExecutor = executor
+        executor.execute { callback.accept(getWindowLayoutInfo(activity)) }
+    }
+
+    override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
+        windowLayoutInfoCallback = null
+        windowLayoutInfoExecutor = null
+    }
+
+    /**
+     * Set the width of fold
+     */
+    public fun setFoldWidth(width: Int) {
+        foldWidth = width
+    }
+
+    /**
+     * Toggle folding state between [FoldingFeature.STATE_HALF_OPENED] and [FoldingFeature.STATE_FLAT]
+     * Initial state is [FoldingFeature.STATE_HALF_OPENED]
+     */
+    public fun toggleFoldState(activity: Activity) {
+        foldState = if (foldState == FoldingFeature.STATE_HALF_OPENED) {
+            FoldingFeature.STATE_FLAT
+        } else {
+            FoldingFeature.STATE_HALF_OPENED
+        }
+        windowLayoutInfoExecutor?.execute {
+            windowLayoutInfoCallback?.accept(getWindowLayoutInfo(activity))
+        }
+    }
+
+    private fun getWindowLayoutInfo(activity: Activity): WindowLayoutInfo {
+        val windowSize = WindowManager(activity).getCurrentWindowMetrics().bounds
+        val featureRect = midScreenFold(windowSize, foldAxis, foldWidth)
+        val displayFeature = FoldingFeature(featureRect, FoldingFeature.TYPE_FOLD, foldState)
+        if (foldState == FoldingFeature.STATE_FLAT) {
+            assert(!displayFeature.isSeparating)
+        } else {
+            assert(displayFeature.isSeparating)
+        }
+        val featureList = ArrayList<DisplayFeature>()
+        featureList.add(displayFeature)
+        return WindowLayoutInfo.Builder().setDisplayFeatures(featureList).build()
+    }
+}
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/activity_test_fold_layout.xml b/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/activity_test_fold_layout.xml
new file mode 100644
index 0000000..6a0d564
--- /dev/null
+++ b/slidingpanelayout/slidingpanelayout/src/androidTest/res/layout/activity_test_fold_layout.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.
+  -->
+<androidx.slidingpanelayout.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/sliding_pane_fold_layout">
+
+    <TextView
+        android:id="@+id/list_pane"
+        android:layout_width="10dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:layout_gravity="left"
+        android:text="List" />
+
+    <TextView
+        android:id="@+id/detail_pane"
+        android:layout_width="10dp"
+        android:layout_height="match_parent"
+        android:layout_gravity="right"
+        android:layout_weight="2"
+        android:text="Detail" />
+</androidx.slidingpanelayout.widget.SlidingPaneLayout>
\ No newline at end of file
diff --git a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
index c85fea6..024d6964 100644
--- a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
+++ b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
@@ -18,6 +18,7 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.ContextWrapper;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Paint;
@@ -41,6 +42,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.Px;
+import androidx.annotation.VisibleForTesting;
 import androidx.core.content.ContextCompat;
 import androidx.core.graphics.Insets;
 import androidx.core.util.Consumer;
@@ -53,6 +55,7 @@
 import androidx.customview.widget.ViewDragHelper;
 import androidx.window.DisplayFeature;
 import androidx.window.FoldingFeature;
+import androidx.window.WindowBackend;
 import androidx.window.WindowLayoutInfo;
 import androidx.window.WindowManager;
 
@@ -230,6 +233,8 @@
 
     /**
      * Set the lock mode that controls how the user can swipe between the panes.
+     *
+     * @param lockMode The new lock mode for the detail pane.
      */
     public final void setLockMode(@LockMode int lockMode) {
         mLockMode = lockMode;
@@ -326,14 +331,22 @@
         mDragHelper.setMinVelocity(MIN_FLING_VELOCITY * density);
 
         try {
-            mFoldingFeatureObserver = new FoldingFeatureObserver(context);
-            mFoldingFeatureObserver.setOnFoldingFeatureChangeListener(
-                    mOnFoldingFeatureChangeListener);
+            FoldingFeatureObserver foldingFeatureObserver = new FoldingFeatureObserver(context,
+                    null);
+            setFoldingFeatureObserver(foldingFeatureObserver);
         } catch (IllegalArgumentException exception) {
             // Disable fold detection.
         }
     }
 
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    void setFoldingFeatureObserver(
+            FoldingFeatureObserver foldingFeatureObserver) {
+        mFoldingFeatureObserver = foldingFeatureObserver;
+        mFoldingFeatureObserver.setOnFoldingFeatureChangeListener(
+                mOnFoldingFeatureChangeListener);
+    }
+
     /**
      * Set a distance to parallax the lower pane by when the upper pane is in its
      * fully closed state. The lower pane will scroll between this position and
@@ -861,7 +874,15 @@
             final int childBottom = childTop + child.getMeasuredHeight();
             child.layout(childLeft, paddingTop, childRight, childBottom);
 
-            nextXStart += child.getWidth();
+            // If a folding feature separates the content, we use its width as the extra
+            // offset for the next child, in order to avoid rendering the content under it.
+            int nextXOffset = 0;
+            if (mFoldingFeature != null
+                    && mFoldingFeature.getOrientation() == FoldingFeature.ORIENTATION_VERTICAL
+                    && mFoldingFeature.isSeparating()) {
+                nextXOffset = mFoldingFeature.getBounds().width();
+            }
+            nextXStart += child.getWidth() + Math.abs(nextXOffset);
         }
 
         if (mFirstLayout) {
@@ -994,6 +1015,9 @@
     }
 
     private boolean closePane(int initialVelocity) {
+        if (!mCanSlide) {
+            mPreservedOpenState = false;
+        }
         if (mFirstLayout || smoothSlideTo(1.f, initialVelocity)) {
             mPreservedOpenState = false;
             return true;
@@ -1002,6 +1026,9 @@
     }
 
     private boolean openPane(int initialVelocity) {
+        if (!mCanSlide) {
+            mPreservedOpenState = true;
+        }
         if (mFirstLayout || smoothSlideTo(0.f, initialVelocity)) {
             mPreservedOpenState = true;
             return true;
@@ -1456,6 +1483,7 @@
 
         SavedState ss = new SavedState(superState);
         ss.isOpen = isSlideable() ? isOpen() : mPreservedOpenState;
+        ss.mLockMode = mLockMode;
 
         return ss;
     }
@@ -1476,6 +1504,8 @@
             closePane();
         }
         mPreservedOpenState = ss.isOpen;
+
+        setLockMode(ss.mLockMode);
     }
 
     private class DragHelperCallback extends ViewDragHelper.Callback {
@@ -1485,7 +1515,7 @@
 
         @Override
         public boolean tryCaptureView(View child, int pointerId) {
-            if (mIsUnableToDrag) {
+            if (!isDraggable()) {
                 return false;
             }
 
@@ -1547,20 +1577,7 @@
 
         @Override
         public int clampViewPositionHorizontal(View child, int left, int dx) {
-            boolean slidingDetailToList = isLayoutRtlSupport() ? dx > 0 : dx < 0;
             int newLeft = left;
-            if (slidingDetailToList) {
-                if (getLockMode() == LOCK_MODE_LOCKED_CLOSED
-                        || getLockMode() == LOCK_MODE_LOCKED) {
-                    newLeft -= dx;
-                }
-            } else {
-                if (getLockMode() == LOCK_MODE_LOCKED_OPEN
-                        || getLockMode() == LOCK_MODE_LOCKED) {
-                    newLeft -= dx;
-                }
-            }
-
             final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
 
             if (isLayoutRtlSupport()) {
@@ -1585,15 +1602,39 @@
 
         @Override
         public void onEdgeTouched(int edgeFlags, int pointerId) {
+            if (!isDraggable()) {
+                return;
+            }
             mDragHelper.captureChildView(mSlideableView, pointerId);
         }
 
         @Override
         public void onEdgeDragStarted(int edgeFlags, int pointerId) {
+            if (!isDraggable()) {
+                return;
+            }
             mDragHelper.captureChildView(mSlideableView, pointerId);
         }
+
+        private boolean isDraggable() {
+            if (mIsUnableToDrag) {
+                return false;
+            }
+            if (getLockMode() == LOCK_MODE_LOCKED) {
+                return false;
+            }
+            if (isOpen() && getLockMode() == LOCK_MODE_LOCKED_OPEN) {
+                return false;
+            }
+            if (!isOpen() && getLockMode() == LOCK_MODE_LOCKED_CLOSED) {
+                return false;
+            }
+            return true;
+        }
     }
 
+
+
     public static class LayoutParams extends ViewGroup.MarginLayoutParams {
         private static final int[] ATTRS = new int[]{
                 android.R.attr.layout_weight
@@ -1651,6 +1692,7 @@
 
     static class SavedState extends AbsSavedState {
         boolean isOpen;
+        @LockMode int mLockMode;
 
         SavedState(Parcelable superState) {
             super(superState);
@@ -1659,12 +1701,14 @@
         SavedState(Parcel in, ClassLoader loader) {
             super(in, loader);
             isOpen = in.readInt() != 0;
+            mLockMode = in.readInt();
         }
 
         @Override
         public void writeToParcel(Parcel out, int flags) {
             super.writeToParcel(out, flags);
             out.writeInt(isOpen ? 1 : 0);
+            out.writeInt(mLockMode);
         }
 
         public static final Creator<SavedState> CREATOR = new ClassLoaderCreator<SavedState>() {
@@ -1841,7 +1885,8 @@
      * A device folding feature observer is used to notify listener when there is a folding feature
      * change.
      */
-    private static class FoldingFeatureObserver {
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    static class FoldingFeatureObserver {
         /**
          * Interface definition for a callback to be invoked when there is a folding feature change
          */
@@ -1883,8 +1928,15 @@
         private LayoutStateChangeCallback
                 mLayoutStateChangeCallback = new LayoutStateChangeCallback();
 
-        FoldingFeatureObserver(@NonNull Context context) {
-            mWindowManager = new WindowManager(context);
+        /**
+         * Create an instance of a folding feature observer
+         *
+         * @param context A visual context, such as an {@link Activity} or a {@link ContextWrapper}
+         * @param windowBackend A custom implementation of {@link WindowBackend} for testing
+         */
+        FoldingFeatureObserver(@NonNull Context context, @Nullable WindowBackend windowBackend) {
+            mWindowManager = windowBackend == null ? new WindowManager(context) :
+                    new WindowManager(context, windowBackend);
             mExecutor = ContextCompat.getMainExecutor(context);
         }
 
diff --git a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
index 88936d1..850b2d6 100644
--- a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="MissingTestSizeAnnotation"
diff --git a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
index 133d0e7..790c3a4 100644
--- a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="MissingTestSizeAnnotation"
diff --git a/sqlite/sqlite-framework/lint-baseline.xml b/sqlite/sqlite-framework/lint-baseline.xml
index 6a7be88..de5df74 100644
--- a/sqlite/sqlite-framework/lint-baseline.xml
+++ b/sqlite/sqlite-framework/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -35,52 +35,52 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mDelegate.rawQueryWithFactory(new SQLiteDatabase.CursorFactory() {"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java"
-            line="192"
+            line="195"
             column="26"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mDelegate.setForeignKeyConstraintsEnabled(enable);"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java"
-            line="300"
+            line="303"
             column="19"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        mDelegate.disableWriteAheadLogging();"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java"
-            line="311"
+            line="314"
             column="19"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteDatabase is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return mDelegate.isWriteAheadLoggingEnabled();"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java"
-            line="317"
+            line="320"
             column="26"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    File file = new File(mContext.getNoBackupFilesDir(), mName);"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mDelegate.setWriteAheadLoggingEnabled(mWriteAheadLoggingEnabled);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mDelegate.setWriteAheadLoggingEnabled(enabled);"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java
index 0cc817b..c75894e 100644
--- a/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java
+++ b/sqlite/sqlite-framework/src/main/java/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.java
@@ -124,7 +124,7 @@
 
     // Adding @RequiresApi(30) would prevent unbundled implementations from offering this
     // functionality to lower API levels.
-    @SuppressWarnings("UnsafeNewApiCall")
+    @SuppressWarnings("ClassVerificationFailure")
     @Override
     public void execPerConnectionSQL(@NonNull String sql, @Nullable Object[] bindArgs) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
diff --git a/sqlite/sqlite-inspection/build.gradle b/sqlite/sqlite-inspection/build.gradle
index dda866f..22e08ca 100644
--- a/sqlite/sqlite-inspection/build.gradle
+++ b/sqlite/sqlite-inspection/build.gradle
@@ -55,12 +55,6 @@
         // studio pipeline works only starting with Android O
         minSdkVersion 26
     }
-
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-
     sourceSets {
         main.resources.srcDirs += "src/main/proto"
     }
diff --git a/sqlite/sqlite-inspection/lint-baseline.xml b/sqlite/sqlite-inspection/lint-baseline.xml
index 3aafd0c4..55db410 100644
--- a/sqlite/sqlite-inspection/lint-baseline.xml
+++ b/sqlite/sqlite-inspection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/sqlite/sqlite-ktx/lint-baseline.xml b/sqlite/sqlite-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/sqlite/sqlite-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/sqlite/sqlite/build.gradle b/sqlite/sqlite/build.gradle
index c7f6213..ce6519c 100644
--- a/sqlite/sqlite/build.gradle
+++ b/sqlite/sqlite/build.gradle
@@ -38,7 +38,7 @@
     def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
         dependsOn(variant.javaCompileProvider.get())
         from(variant.javaCompileProvider.get().destinationDir)
-        destinationDir(new File(project.buildDir, "libJar"))
+        destinationDirectory.fileValue(new File(project.buildDir, "libJar"))
     }
 }
 
diff --git a/sqlite/sqlite/lint-baseline.xml b/sqlite/sqlite/lint-baseline.xml
index 362ea20..0abbca7 100644
--- a/sqlite/sqlite/lint-baseline.xml
+++ b/sqlite/sqlite/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.sqlite.db.SupportSQLiteOpenHelper.Callback is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.sqlite.db.SupportSQLiteOpenHelper.Callback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    SQLiteDatabase.deleteDatabase(new File(fileName));"
         errorLine2="                                   ~~~~~~~~~~~~~~">
         <location
diff --git a/startup/integration-tests/first-library/build.gradle b/startup/integration-tests/first-library/build.gradle
index 7b408f1..59ce01d 100644
--- a/startup/integration-tests/first-library/build.gradle
+++ b/startup/integration-tests/first-library/build.gradle
@@ -33,7 +33,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     testImplementation(JUNIT)
 }
diff --git a/startup/integration-tests/first-library/lint-baseline.xml b/startup/integration-tests/first-library/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/startup/integration-tests/first-library/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/startup/integration-tests/second-library/build.gradle b/startup/integration-tests/second-library/build.gradle
index 36ee190..760958b 100644
--- a/startup/integration-tests/second-library/build.gradle
+++ b/startup/integration-tests/second-library/build.gradle
@@ -32,7 +32,7 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     testImplementation(JUNIT)
 }
diff --git a/startup/integration-tests/second-library/lint-baseline.xml b/startup/integration-tests/second-library/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/startup/integration-tests/second-library/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/startup/integration-tests/test-app/lint-baseline.xml b/startup/integration-tests/test-app/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/startup/integration-tests/test-app/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/startup/integration-tests/test-app/src/main/res/values/strings.xml b/startup/integration-tests/test-app/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from startup/integration-tests/test-app/src/main/res/values/strings.xml
rename to startup/integration-tests/test-app/src/main/res/values/donottranslate-strings.xml
diff --git a/startup/startup-runtime-lint/lint-baseline.xml b/startup/startup-runtime-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/startup/startup-runtime-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/startup/startup-runtime-lint/src/test/java/androidx/startup/lint/ApiLintVersionsTest.kt b/startup/startup-runtime-lint/src/test/java/androidx/startup/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..4bdf051
--- /dev/null
+++ b/startup/startup-runtime-lint/src/test/java/androidx/startup/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.startup.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = StartupRuntimeIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/startup/startup-runtime/api/1.1.0-beta01.txt b/startup/startup-runtime/api/1.1.0-beta01.txt
new file mode 100644
index 0000000..434ba26
--- /dev/null
+++ b/startup/startup-runtime/api/1.1.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.startup {
+
+  public final class AppInitializer {
+    method public static androidx.startup.AppInitializer getInstance(android.content.Context);
+    method public <T> T initializeComponent(Class<? extends androidx.startup.Initializer<T!>>);
+    method public boolean isEagerlyInitialized(Class<? extends androidx.startup.Initializer<?>>);
+  }
+
+  public class InitializationProvider extends android.content.ContentProvider {
+    ctor public InitializationProvider();
+    method public final int delete(android.net.Uri, String?, String![]?);
+    method public final String? getType(android.net.Uri);
+    method public final android.net.Uri? insert(android.net.Uri, android.content.ContentValues?);
+    method public final boolean onCreate();
+    method public final android.database.Cursor? query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public final int update(android.net.Uri, android.content.ContentValues?, String?, String![]?);
+  }
+
+  public interface Initializer<T> {
+    method public T create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+}
+
diff --git a/startup/startup-runtime/api/public_plus_experimental_1.1.0-beta01.txt b/startup/startup-runtime/api/public_plus_experimental_1.1.0-beta01.txt
new file mode 100644
index 0000000..434ba26
--- /dev/null
+++ b/startup/startup-runtime/api/public_plus_experimental_1.1.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.startup {
+
+  public final class AppInitializer {
+    method public static androidx.startup.AppInitializer getInstance(android.content.Context);
+    method public <T> T initializeComponent(Class<? extends androidx.startup.Initializer<T!>>);
+    method public boolean isEagerlyInitialized(Class<? extends androidx.startup.Initializer<?>>);
+  }
+
+  public class InitializationProvider extends android.content.ContentProvider {
+    ctor public InitializationProvider();
+    method public final int delete(android.net.Uri, String?, String![]?);
+    method public final String? getType(android.net.Uri);
+    method public final android.net.Uri? insert(android.net.Uri, android.content.ContentValues?);
+    method public final boolean onCreate();
+    method public final android.database.Cursor? query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public final int update(android.net.Uri, android.content.ContentValues?, String?, String![]?);
+  }
+
+  public interface Initializer<T> {
+    method public T create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+}
+
diff --git a/startup/startup-runtime/api/res-1.1.0-beta01.txt b/startup/startup-runtime/api/res-1.1.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/startup/startup-runtime/api/res-1.1.0-beta01.txt
diff --git a/startup/startup-runtime/api/restricted_1.1.0-beta01.txt b/startup/startup-runtime/api/restricted_1.1.0-beta01.txt
new file mode 100644
index 0000000..434ba26
--- /dev/null
+++ b/startup/startup-runtime/api/restricted_1.1.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.startup {
+
+  public final class AppInitializer {
+    method public static androidx.startup.AppInitializer getInstance(android.content.Context);
+    method public <T> T initializeComponent(Class<? extends androidx.startup.Initializer<T!>>);
+    method public boolean isEagerlyInitialized(Class<? extends androidx.startup.Initializer<?>>);
+  }
+
+  public class InitializationProvider extends android.content.ContentProvider {
+    ctor public InitializationProvider();
+    method public final int delete(android.net.Uri, String?, String![]?);
+    method public final String? getType(android.net.Uri);
+    method public final android.net.Uri? insert(android.net.Uri, android.content.ContentValues?);
+    method public final boolean onCreate();
+    method public final android.database.Cursor? query(android.net.Uri, String![]?, String?, String![]?, String?);
+    method public final int update(android.net.Uri, android.content.ContentValues?, String?, String![]?);
+  }
+
+  public interface Initializer<T> {
+    method public T create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+}
+
diff --git a/startup/startup-runtime/build.gradle b/startup/startup-runtime/build.gradle
index 75c3825..315f1ee 100644
--- a/startup/startup-runtime/build.gradle
+++ b/startup/startup-runtime/build.gradle
@@ -31,10 +31,6 @@
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
 }
 
 dependencies {
@@ -46,8 +42,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     testImplementation(JUNIT)
 }
 
diff --git a/startup/startup-runtime/lint-baseline.xml b/startup/startup-runtime/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/startup/startup-runtime/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/startup/startup-runtime/proguard-rules.pro b/startup/startup-runtime/proguard-rules.pro
index b1048d8..961a1eb 100644
--- a/startup/startup-runtime/proguard-rules.pro
+++ b/startup/startup-runtime/proguard-rules.pro
@@ -5,4 +5,4 @@
     <init>();
 }
 
--assumenosideeffects class androidx.startup.StartupLogger
+-assumenosideeffects class androidx.startup.StartupLogger { public static <methods>; }
diff --git a/swiperefreshlayout/swiperefreshlayout/build.gradle b/swiperefreshlayout/swiperefreshlayout/build.gradle
index 3eb08fd..94f6bce 100644
--- a/swiperefreshlayout/swiperefreshlayout/build.gradle
+++ b/swiperefreshlayout/swiperefreshlayout/build.gradle
@@ -18,10 +18,10 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":internal-testutils-espresso"))
     androidTestImplementation(project(":internal-testutils-runtime"), {
         exclude group: "androidx.swiperefreshlayout", module: "swiperefreshlayout"
diff --git a/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml b/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
index 8c5a167..86469ac 100644
--- a/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
+++ b/swiperefreshlayout/swiperefreshlayout/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="KotlinPropertyAccess"
diff --git a/testutils/testutils-appcompat/lint-baseline.xml b/testutils/testutils-appcompat/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/testutils/testutils-appcompat/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/testutils/testutils-espresso/build.gradle b/testutils/testutils-espresso/build.gradle
index 0ba77aa..314bef2 100644
--- a/testutils/testutils-espresso/build.gradle
+++ b/testutils/testutils-espresso/build.gradle
@@ -25,7 +25,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
-    implementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    implementation(ESPRESSO_CORE, excludes.espresso)
     implementation(KOTLIN_STDLIB)
 }
 
diff --git a/testutils/testutils-espresso/lint-baseline.xml b/testutils/testutils-espresso/lint-baseline.xml
index 937c8fc..b6893f0 100644
--- a/testutils/testutils-espresso/lint-baseline.xml
+++ b/testutils/testutils-espresso/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="UnknownNullness"
diff --git a/testutils/testutils-gradle-plugin/lint-baseline.xml b/testutils/testutils-gradle-plugin/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/testutils/testutils-gradle-plugin/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/testutils/testutils-macrobenchmark/OWNERS b/testutils/testutils-macrobenchmark/OWNERS
new file mode 100644
index 0000000..bd5d7e4
--- /dev/null
+++ b/testutils/testutils-macrobenchmark/OWNERS
@@ -0,0 +1 @@
[email protected]
\ No newline at end of file
diff --git a/testutils/testutils-macrobenchmark/build.gradle b/testutils/testutils-macrobenchmark/build.gradle
new file mode 100644
index 0000000..d331ce5
--- /dev/null
+++ b/testutils/testutils-macrobenchmark/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+dependencies {
+    implementation(project(":benchmark:benchmark-macro"))
+    implementation(project(":benchmark:benchmark-macro-junit4"))
+
+    implementation(KOTLIN_STDLIB)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 18
+    }
+}
diff --git a/testutils/testutils-macrobenchmark/src/main/AndroidManifest.xml b/testutils/testutils-macrobenchmark/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e78b95a
--- /dev/null
+++ b/testutils/testutils-macrobenchmark/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<manifest package="androidx.testutils"/>
diff --git a/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
new file mode 100644
index 0000000..2ec05dd
--- /dev/null
+++ b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.testutils
+
+import android.content.Intent
+import androidx.annotation.RequiresApi
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.StartupTimingMetric
+import androidx.benchmark.macro.isSupportedWithVmSettings
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+
+@RequiresApi(29)
+fun MacrobenchmarkRule.measureStartup(
+    compilationMode: CompilationMode,
+    startupMode: StartupMode,
+    packageName: String,
+    iterations: Int = 3,
+    setupIntent: Intent.() -> Unit = {}
+) = measureRepeated(
+    packageName = packageName,
+    metrics = listOf(StartupTimingMetric()),
+    compilationMode = compilationMode,
+    iterations = iterations,
+    startupMode = startupMode
+) {
+    pressHome()
+    val intent = Intent()
+    intent.setPackage(packageName)
+    setupIntent(intent)
+    startActivityAndWait(intent)
+}
+
+fun createStartupCompilationParams(
+    startupModes: List<StartupMode> = listOf(StartupMode.HOT, StartupMode.WARM, StartupMode.COLD),
+    compilationModes: List<CompilationMode> = listOf(
+        CompilationMode.None,
+        CompilationMode.Interpreted,
+        CompilationMode.SpeedProfile()
+    )
+): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
+    for (startupMode in startupModes) {
+        for (compilationMode in compilationModes) {
+            // Skip configs that can't run, so they don't clutter Studio benchmark
+            // output with AssumptionViolatedException dumps
+            if (compilationMode.isSupportedWithVmSettings()) {
+                add(arrayOf(startupMode, compilationMode))
+            }
+        }
+    }
+}
+
+fun createCompilationParams(
+    compilationModes: List<CompilationMode> = listOf(
+        CompilationMode.None,
+        CompilationMode.Interpreted,
+        CompilationMode.SpeedProfile()
+    )
+): List<Array<Any>> = mutableListOf<Array<Any>>().apply {
+    for (compilationMode in compilationModes) {
+        // Skip configs that can't run, so they don't clutter Studio benchmark
+        // output with AssumptionViolatedException dumps
+        if (compilationMode.isSupportedWithVmSettings()) {
+            add(arrayOf(compilationMode))
+        }
+    }
+}
\ No newline at end of file
diff --git a/testutils/testutils-mockito/build.gradle b/testutils/testutils-mockito/build.gradle
index ea8a7de..18aaea4 100644
--- a/testutils/testutils-mockito/build.gradle
+++ b/testutils/testutils-mockito/build.gradle
@@ -23,7 +23,7 @@
 }
 
 dependencies {
-    api(MOCKITO_CORE, libs.exclude_bytebuddy)
+    api(MOCKITO_CORE, excludes.bytebuddy)
 
     implementation(KOTLIN_STDLIB)
 }
diff --git a/testutils/testutils-mockito/lint-baseline.xml b/testutils/testutils-mockito/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/testutils/testutils-mockito/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/testutils/testutils-navigation/build.gradle b/testutils/testutils-navigation/build.gradle
index 88f707b..61664a7 100644
--- a/testutils/testutils-navigation/build.gradle
+++ b/testutils/testutils-navigation/build.gradle
@@ -27,8 +27,10 @@
 }
 
 dependencies {
-    api(projectOrArtifact(":navigation:navigation-common-ktx"))
+    api(projectOrArtifact(":navigation:navigation-common"))
 
+    testImplementation(projectOrArtifact(":navigation:navigation-testing"))
+    testImplementation("androidx.arch.core:core-testing:2.1.0")
     testImplementation(JUNIT)
     testImplementation(MOCKITO_CORE)
 
diff --git a/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt b/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
index 198a897..fb2d187 100644
--- a/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
+++ b/testutils/testutils-navigation/src/androidTest/java/androidx/testutils/TestNavigatorDestinationBuilderTest.kt
@@ -43,6 +43,17 @@
     }
 
     @Test
+    fun testRoute() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            test(DESTINATION_ROUTE)
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+    }
+
+    @Test
     fun testWithBody() {
         val graph = provider.navigation(startDestination = DESTINATION_ID) {
             test(DESTINATION_ID) {
@@ -58,7 +69,25 @@
             LABEL, graph[DESTINATION_ID].label
         )
     }
+
+    @Test
+    fun testRouteWithBody() {
+        val graph = provider.navigation(startDestination = DESTINATION_ROUTE) {
+            test(DESTINATION_ROUTE) {
+                label = LABEL
+            }
+        }
+        assertTrue(
+            "Destination should be added to the graph",
+            DESTINATION_ROUTE in graph
+        )
+        assertEquals(
+            "Destination should have label set",
+            LABEL, graph[DESTINATION_ROUTE].label
+        )
+    }
 }
 
 private const val DESTINATION_ID = 1
+private const val DESTINATION_ROUTE = "route"
 private const val LABEL = "Test"
diff --git a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
index d024d0d..a0a1b6c 100644
--- a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
+++ b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigator.kt
@@ -16,50 +16,27 @@
 
 package androidx.testutils
 
-import android.os.Bundle
-
+import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
-import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
 
-import java.util.ArrayDeque
-
 /**
  * A simple Navigator that doesn't actually navigate anywhere, but does dispatch correctly
  */
 @Navigator.Name("test")
 open class TestNavigator : Navigator<TestNavigator.Destination>() {
 
-    val backStack = ArrayDeque<Pair<Destination, Bundle?>>()
+    val backStack: List<NavBackStackEntry>
+        get() = state.backStack.value
 
-    val current
-        get() = backStack.peekLast()
+    val current: NavBackStackEntry
+        get() = backStack.lastOrNull()
             ?: throw IllegalStateException("Nothing on the back stack")
 
     override fun createDestination(): Destination {
         return Destination(this)
     }
 
-    override fun navigate(
-        destination: Destination,
-        args: Bundle?,
-        navOptions: NavOptions?,
-        navigatorExtras: Extras?
-    ) = if (navOptions != null && navOptions.shouldLaunchSingleTop() && !backStack.isEmpty() &&
-        current.first.id == destination.id
-    ) {
-        backStack.pop()
-        backStack.add(destination to args)
-        null
-    } else {
-        backStack.add(destination to args)
-        destination
-    }
-
-    override fun popBackStack(): Boolean {
-        return backStack.pollLast() != null
-    }
-
     /**
      * A simple Test destination
      */
diff --git a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
index bcda994..f8b90e7 100644
--- a/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
+++ b/testutils/testutils-navigation/src/main/java/androidx/testutils/TestNavigatorDestinationBuilder.kt
@@ -32,6 +32,11 @@
 /**
  * Construct a new [TestNavigator.Destination]
  */
+inline fun NavGraphBuilder.test(route: String) = test(route) {}
+
+/**
+ * Construct a new [TestNavigator.Destination]
+ */
 inline fun NavGraphBuilder.test(
     @IdRes id: Int,
     builder: TestNavigatorDestinationBuilder.() -> Unit
@@ -43,10 +48,20 @@
 )
 
 /**
+ * Construct a new [TestNavigator.Destination]
+ */
+inline fun NavGraphBuilder.test(
+    route: String,
+    builder: TestNavigatorDestinationBuilder.() -> Unit
+) = destination(
+    TestNavigatorDestinationBuilder(provider[TestNavigator::class], route).apply(builder)
+)
+
+/**
  * DSL for constructing a new [TestNavigator.Destination]
  */
 @NavDestinationDsl
-class TestNavigatorDestinationBuilder(
-    navigator: TestNavigator,
-    @IdRes id: Int
-) : NavDestinationBuilder<TestNavigator.Destination>(navigator, id)
+class TestNavigatorDestinationBuilder : NavDestinationBuilder<TestNavigator.Destination> {
+    constructor(navigator: TestNavigator, @IdRes id: Int = 0) : super(navigator, id)
+    constructor(navigator: TestNavigator, route: String) : super(navigator, route)
+}
diff --git a/testutils/testutils-navigation/src/test/java/androidx/testutils/TestNavigatorTest.kt b/testutils/testutils-navigation/src/test/java/androidx/testutils/TestNavigatorTest.kt
index a4c9c69..ce8b38d 100644
--- a/testutils/testutils-navigation/src/test/java/androidx/testutils/TestNavigatorTest.kt
+++ b/testutils/testutils-navigation/src/test/java/androidx/testutils/TestNavigatorTest.kt
@@ -17,7 +17,10 @@
 package androidx.testutils
 
 import android.os.Bundle
+import androidx.arch.core.executor.testing.InstantTaskExecutorRule
+import androidx.navigation.testing.TestNavigatorState
 import org.junit.Assert.assertEquals
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -25,25 +28,30 @@
 @RunWith(JUnit4::class)
 class TestNavigatorTest {
 
+    @get:Rule
+    val instantTaskExecutorRule = InstantTaskExecutorRule()
+
     @Test
     fun backStack() {
         val testNavigator = TestNavigator()
+        val state = TestNavigatorState()
+        testNavigator.onAttach(state)
         val destination = testNavigator.createDestination()
         val args = Bundle()
-        testNavigator.navigate(destination, args, null, null)
+        testNavigator.navigate(listOf(state.createBackStackEntry(destination, args)), null, null)
         assertEquals(
             "TestNavigator back stack size is 1 after navigate",
             1,
             testNavigator.backStack.size
         )
-        val (foundDestination, foundArgs) = testNavigator.current
+        val current = testNavigator.current
         assertEquals(
             "last() returns last destination navigated to",
-            destination, foundDestination
+            destination, current.destination
         )
         assertEquals(
             "last() returns arguments Bundle",
-            args, foundArgs
+            args, current.arguments
         )
     }
 }
diff --git a/testutils/testutils-runtime/lint-baseline.xml b/testutils/testutils-runtime/lint-baseline.xml
index 0b60048..a2172e9 100644
--- a/testutils/testutils-runtime/lint-baseline.xml
+++ b/testutils/testutils-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.testutils.LocaleTestUtils is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.testutils.LocaleTestUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                newConfig.setLocales(locales.unwrap() as LocaleList)"
         errorLine2="                          ~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.testutils.LocaleTestUtils is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.testutils.LocaleTestUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                newConfig.setLocale(locales.get(0))"
         errorLine2="                          ~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.fragment.app.StrictFragment is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.fragment.app.StrictFragment is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            check(!requireActivity().isDestroyed)"
         errorLine2="                                     ~~~~~~~~~~~">
         <location
diff --git a/testutils/testutils-truth/lint-baseline.xml b/testutils/testutils-truth/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/testutils/testutils-truth/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/text/text/build.gradle b/text/text/build.gradle
index f29d53b..684036d 100644
--- a/text/text/build.gradle
+++ b/text/text/build.gradle
@@ -41,11 +41,11 @@
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(ESPRESSO_CORE)
     androidTestImplementation(JUNIT)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(MOCKITO_KOTLIN, {
         exclude group: "org.mockito" // to keep control on the mockito version
     })
diff --git a/text/text/lint-baseline.xml b/text/text/lint-baseline.xml
deleted file mode 100644
index 0a690c9..0000000
--- a/text/text/lint-baseline.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="            Builder.obtain(text, start, end, paint, width)"
-        errorLine2="                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="108"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setTextDirection(textDir)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="110"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setAlignment(alignment)"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="111"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setMaxLines(maxLines)"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="112"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setEllipsize(ellipsize)"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="113"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setEllipsizedWidth(ellipsizedWidth)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="114"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setLineSpacing(lineSpacingExtra, lineSpacingMultiplier)"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="115"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
-        errorLine1="                        setJustificationMode(justificationMode)"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="117"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setIncludePad(includePadding)"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="119"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                        setUseLineSpacingFromFallbacks(fallbackLineSpacing)"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="121"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setBreakStrategy(breakStrategy)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="123"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setHyphenationFrequency(hyphenationFrequency)"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="124"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                    setIndents(leftIndents, rightIndents)"
-        errorLine2="                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="125"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.compose.ui.text.android.StaticLayoutFactory is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
-        errorLine1="                }.build()"
-        errorLine2="                  ~~~~~">
-        <location
-            file="src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"
-            line="126"
-            column="19"/>
-    </issue>
-
-</issues>
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
index 6465937..5ece2b5 100644
--- a/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
@@ -132,16 +132,16 @@
     @Test
     fun testParagarphDirection() {
         val layoutHelper = buildLayoutHelper("aa\nאא\ncc")
-        assertThat(layoutHelper.isRTLParagraph(0)).isFalse()
-        assertThat(layoutHelper.isRTLParagraph(1)).isTrue()
-        assertThat(layoutHelper.isRTLParagraph(2)).isFalse()
+        assertThat(layoutHelper.isRtlParagraph(0)).isFalse()
+        assertThat(layoutHelper.isRtlParagraph(1)).isTrue()
+        assertThat(layoutHelper.isRtlParagraph(2)).isFalse()
     }
 
     @Test
     fun testParagarphDirection_case2() {
         val layoutHelper = buildLayoutHelper("אא\nbb\nאא")
-        assertThat(layoutHelper.isRTLParagraph(0)).isTrue()
-        assertThat(layoutHelper.isRTLParagraph(1)).isFalse()
-        assertThat(layoutHelper.isRTLParagraph(2)).isTrue()
+        assertThat(layoutHelper.isRtlParagraph(0)).isTrue()
+        assertThat(layoutHelper.isRtlParagraph(1)).isFalse()
+        assertThat(layoutHelper.isRtlParagraph(2)).isTrue()
     }
 }
\ No newline at end of file
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt
index 015f6a1..2b4571d 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt
@@ -152,9 +152,9 @@
         return downstreamLineNo
     }
 
-    if (lineStart == offset) {
-        return if (upstream) downstreamLineNo - 1 else downstreamLineNo
+    return if (lineStart == offset) {
+        if (upstream) downstreamLineNo - 1 else downstreamLineNo
     } else { // lineEnd == offset
-        return if (upstream) downstreamLineNo else downstreamLineNo + 1
+        if (upstream) downstreamLineNo else downstreamLineNo + 1
     }
 }
\ No newline at end of file
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
index 52b1729..73ed983 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
@@ -105,7 +105,7 @@
         TextUtils.getChars(layout.text, paragraphStart, paragraphEnd, buffer, 0)
 
         val result = if (Bidi.requiresBidi(buffer, 0, paragraphLength)) {
-            val flag = if (isRTLParagraph(paragraphIndex)) {
+            val flag = if (isRtlParagraph(paragraphIndex)) {
                 Bidi.DIRECTION_RIGHT_TO_LEFT
             } else {
                 Bidi.DIRECTION_LEFT_TO_RIGHT
@@ -126,14 +126,14 @@
         paragraphBidi[paragraphIndex] = result
         bidiProcessedParagraphs[paragraphIndex] = true
 
-        if (result != null) {
+        tmpBuffer = if (result != null) {
             // The ownership of buffer is now passed to Bidi object.
             // Release tmpBuffer if we didn't allocated in this time.
-            tmpBuffer = if (buffer === tmpBuffer) null else tmpBuffer
+            if (buffer === tmpBuffer) null else tmpBuffer
         } else {
             // We might allocate larger buffer in this time. Update tmpBuffer with latest one.
             // (the latest buffer may be same as tmpBuffer)
-            tmpBuffer = buffer
+            buffer
         }
         return result
     }
@@ -179,7 +179,7 @@
      * @param paragraphIndex a paragraph index
      * @return true if the paragraph is RTL, otherwise false
      */
-    fun isRTLParagraph(@IntRange(from = 0) paragraphIndex: Int): Boolean {
+    fun isRtlParagraph(@IntRange(from = 0) paragraphIndex: Int): Boolean {
         val lineNumber = layout.getLineForOffset(getParagraphStart(paragraphIndex))
         return layout.getParagraphDirection(lineNumber) == Layout.DIR_RIGHT_TO_LEFT
     }
@@ -229,7 +229,7 @@
         }
 
         val paraNo = getParagraphForOffset(offset)
-        val isParaRtl = isRTLParagraph(paraNo)
+        val isParaRtl = isRtlParagraph(paraNo)
 
         // Use line visible end for creating bidi object since invisible whitespaces should not be
         // considered for location retrieval.
@@ -334,7 +334,7 @@
     private fun lineEndToVisibleEnd(lineEnd: Int): Int {
         var visibleEnd = lineEnd
         while (visibleEnd > 0) {
-            if (isLineEndSpace(layout.text.get(visibleEnd - 1 /* visibleEnd is exclusive */))) {
+            if (isLineEndSpace(layout.text[visibleEnd - 1 /* visibleEnd is exclusive */])) {
                 visibleEnd--
             } else {
                 break
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt
index 65bb944..8773399 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt
@@ -83,7 +83,7 @@
     // 10 is just a random number that limits the size of the candidate list
     val heapSize = 10
     // min heap that will hold [heapSize] many words with max length
-    val longestWordCandidates = PriorityQueue<Pair<Int, Int>>(
+    val longestWordCandidates = PriorityQueue(
         heapSize,
         Comparator<Pair<Int, Int>> { left, right ->
             (left.second - left.first) - (right.second - right.first)
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt b/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
index d80725c..4d005e6 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt
@@ -25,50 +25,26 @@
 import android.util.Log
 import androidx.annotation.FloatRange
 import androidx.annotation.IntRange
+import androidx.annotation.RequiresApi
 import androidx.compose.ui.text.android.LayoutCompat.BreakStrategy
 import androidx.compose.ui.text.android.LayoutCompat.HyphenationFrequency
 import androidx.compose.ui.text.android.LayoutCompat.JustificationMode
 import java.lang.reflect.Constructor
 import java.lang.reflect.InvocationTargetException
 
+private const val TAG = "StaticLayoutFactory"
+
 @OptIn(InternalPlatformTextApi::class)
 internal object StaticLayoutFactory {
-    private const val TAG = "StaticLayoutFactory"
-    private var isInitialized = false
-    private var staticLayoutConstructor: Constructor<StaticLayout>? = null
 
-    private fun obtainStaticLayoutConstructor() {
-        if (isInitialized) return
-        isInitialized = true
-        try {
-            staticLayoutConstructor =
-                StaticLayout::class.java.getConstructor(
-                    CharSequence::class.java,
-                    Int::class.javaPrimitiveType, /* start */
-                    Int::class.javaPrimitiveType, /* end */
-                    TextPaint::class.java,
-                    Int::class.javaPrimitiveType, /* width */
-                    Alignment::class.java,
-                    TextDirectionHeuristic::class.java,
-                    Float::class.javaPrimitiveType, /* lineSpacingMultiplier */
-                    Float::class.javaPrimitiveType, /* lineSpacingExtra */
-                    Boolean::class.javaPrimitiveType, /* includePadding */
-                    TruncateAt::class.java,
-                    Int::class.javaPrimitiveType, /* ellipsizeWidth */
-                    Int::class.javaPrimitiveType /* maxLines */
-                )
-        } catch (e: NoSuchMethodException) {
-            staticLayoutConstructor = null
-            Log.e(TAG, "unable to collect necessary constructor.")
-        }
+    private val delegate: StaticLayoutFactoryImpl = if (Build.VERSION.SDK_INT >= 23) {
+        StaticLayoutFactory23()
+    } else {
+        StaticLayoutFactoryPre21()
     }
 
     /**
      * Builder class for StaticLayout.
-     *
-     * @param text The text to be laid out, optionally with spans
-     * @param paint The base paint used for layout
-     * @param width The width in pixels
      */
     fun create(
         text: CharSequence,
@@ -89,7 +65,7 @@
         @JustificationMode
         justificationMode: Int = LayoutCompat.DEFAULT_JUSTIFICATION_MODE,
         includePadding: Boolean = LayoutCompat.DEFAULT_INCLUDE_PADDING,
-        fallbackLineSpacing: Boolean = LayoutCompat.DEFAULT_FALLBACK_LINE_SPACING,
+        useFallbackLineSpacing: Boolean = LayoutCompat.DEFAULT_FALLBACK_LINE_SPACING,
         @BreakStrategy
         breakStrategy: Int = LayoutCompat.DEFAULT_BREAK_STRATEGY,
         @HyphenationFrequency
@@ -97,83 +73,198 @@
         leftIndents: IntArray? = null,
         rightIndents: IntArray? = null
     ): StaticLayout {
+        return delegate.create(
+            StaticLayoutParams(
+                text = text,
+                start = start,
+                end = end,
+                paint = paint,
+                width = width,
+                textDir = textDir,
+                alignment = alignment,
+                maxLines = maxLines,
+                ellipsize = ellipsize,
+                ellipsizedWidth = ellipsizedWidth,
+                lineSpacingMultiplier = lineSpacingMultiplier,
+                lineSpacingExtra = lineSpacingExtra,
+                justificationMode = justificationMode,
+                includePadding = includePadding,
+                useFallbackLineSpacing = useFallbackLineSpacing,
+                breakStrategy = breakStrategy,
+                hyphenationFrequency = hyphenationFrequency,
+                leftIndents = leftIndents,
+                rightIndents = rightIndents
+            )
+        )
+    }
+}
+
+@OptIn(InternalPlatformTextApi::class)
+private class StaticLayoutParams constructor(
+    val text: CharSequence,
+    val start: Int = 0,
+    val end: Int,
+    val paint: TextPaint,
+    val width: Int,
+    val textDir: TextDirectionHeuristic,
+    val alignment: Alignment,
+    val maxLines: Int,
+    val ellipsize: TruncateAt?,
+    val ellipsizedWidth: Int,
+    val lineSpacingMultiplier: Float,
+    val lineSpacingExtra: Float,
+    val justificationMode: Int,
+    val includePadding: Boolean,
+    val useFallbackLineSpacing: Boolean,
+    val breakStrategy: Int,
+    val hyphenationFrequency: Int,
+    val leftIndents: IntArray?,
+    val rightIndents: IntArray?
+) {
+    init {
         require(start in 0..end)
         require(end in 0..text.length)
         require(maxLines >= 0)
         require(width >= 0)
         require(ellipsizedWidth >= 0)
         require(lineSpacingMultiplier >= 0f)
+    }
+}
 
-        return if (Build.VERSION.SDK_INT >= 23) {
-            Builder.obtain(text, start, end, paint, width)
-                .apply {
-                    setTextDirection(textDir)
-                    setAlignment(alignment)
-                    setMaxLines(maxLines)
-                    setEllipsize(ellipsize)
-                    setEllipsizedWidth(ellipsizedWidth)
-                    setLineSpacing(lineSpacingExtra, lineSpacingMultiplier)
-                    if (Build.VERSION.SDK_INT >= 26) {
-                        setJustificationMode(justificationMode)
-                    }
-                    setIncludePad(includePadding)
-                    if (Build.VERSION.SDK_INT >= 28) {
-                        setUseLineSpacingFromFallbacks(fallbackLineSpacing)
-                    }
-                    setBreakStrategy(breakStrategy)
-                    setHyphenationFrequency(hyphenationFrequency)
-                    setIndents(leftIndents, rightIndents)
-                }.build()
-        } else {
-            // On API 21 to 23, try to call the StaticLayoutConstructor which supports the
-            // textDir and maxLines.
-            obtainStaticLayoutConstructor()
-            staticLayoutConstructor?.let {
-                try {
-                    it.newInstance(
-                        text,
-                        start,
-                        end,
-                        paint,
-                        width,
-                        alignment,
-                        textDir,
-                        lineSpacingMultiplier,
-                        lineSpacingExtra,
-                        includePadding,
-                        ellipsize,
-                        ellipsizedWidth,
-                        maxLines
-                    )
-                } catch (e: IllegalAccessException) {
-                    staticLayoutConstructor = null
-                    Log.e(TAG, "unable to call constructor")
-                    null
-                } catch (e: InstantiationException) {
-                    staticLayoutConstructor = null
-                    Log.e(TAG, "unable to call constructor")
-                    null
-                } catch (e: InvocationTargetException) {
-                    staticLayoutConstructor = null
-                    Log.e(TAG, "unable to call constructor")
-                    null
+private interface StaticLayoutFactoryImpl {
+    fun create(params: StaticLayoutParams): StaticLayout
+}
+
+@RequiresApi(23)
+private class StaticLayoutFactory23 : StaticLayoutFactoryImpl {
+
+    override fun create(params: StaticLayoutParams): StaticLayout {
+        return Builder.obtain(params.text, params.start, params.end, params.paint, params.width)
+            .apply {
+                setTextDirection(params.textDir)
+                setAlignment(params.alignment)
+                setMaxLines(params.maxLines)
+                setEllipsize(params.ellipsize)
+                setEllipsizedWidth(params.ellipsizedWidth)
+                setLineSpacing(params.lineSpacingExtra, params.lineSpacingMultiplier)
+                setIncludePad(params.includePadding)
+                setBreakStrategy(params.breakStrategy)
+                setHyphenationFrequency(params.hyphenationFrequency)
+                setIndents(params.leftIndents, params.rightIndents)
+                if (Build.VERSION.SDK_INT >= 26) {
+                    StaticLayoutFactory26.setJustificationMode(this, params.justificationMode)
                 }
+                if (Build.VERSION.SDK_INT >= 28) {
+                    StaticLayoutFactory28.setUseLineSpacingFromFallbacks(
+                        this,
+                        params.useFallbackLineSpacing
+                    )
+                }
+            }.build()
+    }
+}
+
+@RequiresApi(26)
+private object StaticLayoutFactory26 {
+    fun setJustificationMode(builder: Builder, justificationMode: Int) {
+        builder.setJustificationMode(justificationMode)
+    }
+}
+
+@RequiresApi(28)
+private object StaticLayoutFactory28 {
+    fun setUseLineSpacingFromFallbacks(builder: Builder, useFallbackLineSpacing: Boolean) {
+        builder.setUseLineSpacingFromFallbacks(useFallbackLineSpacing)
+    }
+}
+
+private class StaticLayoutFactoryPre21 : StaticLayoutFactoryImpl {
+
+    companion object {
+        private var isInitialized = false
+        private var staticLayoutConstructor: Constructor<StaticLayout>? = null
+
+        private fun getStaticLayoutConstructor(): Constructor<StaticLayout>? {
+            if (isInitialized) return staticLayoutConstructor
+            isInitialized = true
+            try {
+                staticLayoutConstructor =
+                    StaticLayout::class.java.getConstructor(
+                        CharSequence::class.java,
+                        Int::class.javaPrimitiveType, /* start */
+                        Int::class.javaPrimitiveType, /* end */
+                        TextPaint::class.java,
+                        Int::class.javaPrimitiveType, /* width */
+                        Alignment::class.java,
+                        TextDirectionHeuristic::class.java,
+                        Float::class.javaPrimitiveType, /* lineSpacingMultiplier */
+                        Float::class.javaPrimitiveType, /* lineSpacingExtra */
+                        Boolean::class.javaPrimitiveType, /* includePadding */
+                        TruncateAt::class.java,
+                        Int::class.javaPrimitiveType, /* ellipsizeWidth */
+                        Int::class.javaPrimitiveType /* maxLines */
+                    )
+            } catch (e: NoSuchMethodException) {
+                staticLayoutConstructor = null
+                Log.e(TAG, "unable to collect necessary constructor.")
             }
-                // On API 21 to 23 where it failed to find StaticLayout.Builder, create with
-                // deprecated constructor, textDir and maxLines won't work in this case.
-                ?: @Suppress("DEPRECATION") StaticLayout(
-                    text,
-                    start,
-                    end,
-                    paint,
-                    width,
-                    alignment,
-                    lineSpacingMultiplier,
-                    lineSpacingExtra,
-                    includePadding,
-                    ellipsize,
-                    ellipsizedWidth
-                )
+
+            return staticLayoutConstructor
         }
     }
+
+    override fun create(params: StaticLayoutParams): StaticLayout {
+        // On API 21 to 23, try to call the StaticLayoutConstructor which supports the
+        // textDir and maxLines.
+        val result = getStaticLayoutConstructor()?.let {
+            try {
+                it.newInstance(
+                    params.text,
+                    params.start,
+                    params.end,
+                    params.paint,
+                    params.width,
+                    params.alignment,
+                    params.textDir,
+                    params.lineSpacingMultiplier,
+                    params.lineSpacingExtra,
+                    params.includePadding,
+                    params.ellipsize,
+                    params.ellipsizedWidth,
+                    params.maxLines
+                )
+            } catch (e: IllegalAccessException) {
+                staticLayoutConstructor = null
+                Log.e(TAG, "unable to call constructor")
+                null
+            } catch (e: InstantiationException) {
+                staticLayoutConstructor = null
+                Log.e(TAG, "unable to call constructor")
+                null
+            } catch (e: InvocationTargetException) {
+                staticLayoutConstructor = null
+                Log.e(TAG, "unable to call constructor")
+                null
+            }
+        }
+
+        if (result != null) return result
+
+        // On API 21 to 23 where it failed to find StaticLayout.Builder, create with
+        // deprecated constructor, textDir and maxLines won't work in this case.
+        @Suppress("DEPRECATION")
+        return StaticLayout(
+            params.text,
+            params.start,
+            params.end,
+            params.paint,
+            params.width,
+            params.alignment,
+            params.lineSpacingMultiplier,
+            params.lineSpacingExtra,
+            params.includePadding,
+            params.ellipsize,
+            params.ellipsizedWidth
+        )
+    }
 }
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt b/text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt
index ebaba1e..e5a5e76 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt
@@ -80,7 +80,7 @@
         val iter = CharSequenceCharacterIterator(text, 0, text.length)
 
         val res = mutableListOf(0)
-        breaker.setText(iter)
+        breaker.text = iter
         while (breaker.next() != BreakIterator.DONE) {
             res.add(breaker.current())
         }
@@ -245,7 +245,7 @@
             // Drop trailing space is the line does not end with this word.
             var left = min(startPos, endPos)
             var right = max(startPos, endPos)
-            if (dropSpaces && end != 0 && layout.text.get(end - 1) == ' ') {
+            if (dropSpaces && end != 0 && layout.text[end - 1] == ' ') {
                 val lineEnd = layout.getLineEnd(lineNo)
                 if (lineEnd != end) {
                     if (runRtl) {
@@ -276,7 +276,7 @@
             val layout = layoutHelper.layout
 
             if (dropSpaces && end == start + 1 &&
-                layoutHelper.isLineEndSpace(layout.text.get(start))
+                layoutHelper.isLineEndSpace(layout.text[start])
             )
                 return@lambda
             val lineNo = layout.getLineForOffset(start, false /* downstream */)
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/selection/WordIterator.kt b/text/text/src/main/java/androidx/compose/ui/text/android/selection/WordIterator.kt
index 8be202a..ba93cec 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/selection/WordIterator.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/selection/WordIterator.kt
@@ -117,7 +117,7 @@
 
     /**
      * If `offset` is within a group of punctuation as defined
-     * by [.isPunctuation], returns the index of the first character
+     * by [isPunctuation], returns the index of the first character
      * of that group, otherwise returns BreakIterator.DONE.
      *
      * @param offset the offset to search from.
@@ -134,7 +134,7 @@
 
     /**
      * If `offset` is within a group of punctuation as defined
-     * by [.isPunctuation], returns the index of the last character
+     * by [isPunctuation], returns the index of the last character
      * of that group plus one, otherwise returns BreakIterator.DONE.
      *
      * @param offset the offset to search from.
@@ -151,7 +151,7 @@
 
     /**
      * Indicates if the provided offset is after a punctuation character
-     * as defined by [.isPunctuation].
+     * as defined by [isPunctuation].
      *
      * @param offset the offset to check from.
      * @return Whether the offset is after a punctuation character.
@@ -166,7 +166,7 @@
 
     /**
      * Indicates if the provided offset is at a punctuation character
-     * as defined by [.isPunctuation].
+     * as defined by [isPunctuation].
      *
      * @param offset the offset to check from.
      * @return Whether the offset is at a punctuation character.
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/style/TextDecorationSpan.kt b/text/text/src/main/java/androidx/compose/ui/text/android/style/TextDecorationSpan.kt
new file mode 100644
index 0000000..afa6802
--- /dev/null
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/style/TextDecorationSpan.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.ui.text.android.style
+
+import android.text.TextPaint
+import android.text.style.CharacterStyle
+import androidx.compose.ui.text.android.InternalPlatformTextApi
+
+/**
+ * A span which applies the underline and strike through to the affected text.
+ *
+ * @property isUnderlineText whether to draw the under for the affected text.
+ * @property isStrikethroughText whether to draw strikethrough line for the affected text.
+ * @suppress
+ */
+@InternalPlatformTextApi
+class TextDecorationSpan(
+    val isUnderlineText: Boolean,
+    val isStrikethroughText: Boolean
+) : CharacterStyle() {
+    override fun updateDrawState(textPaint: TextPaint) {
+        textPaint.isUnderlineText = isUnderlineText
+        textPaint.isStrikeThruText = isStrikethroughText
+    }
+}
\ No newline at end of file
diff --git a/textclassifier/integration-tests/testapp/lint-baseline.xml b/textclassifier/integration-tests/testapp/lint-baseline.xml
index b399058..e3669ff 100644
--- a/textclassifier/integration-tests/testapp/lint-baseline.xml
+++ b/textclassifier/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="SyntheticAccessor"
diff --git a/textclassifier/integration-tests/testapp/src/main/res/values/strings.xml b/textclassifier/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from textclassifier/integration-tests/testapp/src/main/res/values/strings.xml
rename to textclassifier/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/textclassifier/textclassifier/build.gradle b/textclassifier/textclassifier/build.gradle
index 392d82b..bc5aabc 100644
--- a/textclassifier/textclassifier/build.gradle
+++ b/textclassifier/textclassifier/build.gradle
@@ -19,9 +19,9 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 android {
diff --git a/textclassifier/textclassifier/lint-baseline.xml b/textclassifier/textclassifier/lint-baseline.xml
index 6b1a409..6e979f7 100644
--- a/textclassifier/textclassifier/lint-baseline.xml
+++ b/textclassifier/textclassifier/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.BundleUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.BundleUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return bundle.deepCopy();"
         errorLine2="                          ~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new android.view.textclassifier.ConversationAction.Builder(getType())"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setAction("
         errorLine2="                 ~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setConfidenceScore(getConfidenceScore())"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setTextReply(getTextReply())"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setExtras(getExtras())"
         errorLine2="                 ~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .build();"
         errorLine2="                 ~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new ConversationAction.Builder(conversationAction.getType())"
         errorLine2="                                                                 ~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        conversationAction.getAction() == null"
         errorLine2="                                           ~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                        conversationAction.getAction()))"
         errorLine2="                                                           ~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setConfidenceScore(conversationAction.getConfidenceScore())"
         errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setTextReply(conversationAction.getTextReply())"
         errorLine2="                                                 ~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationAction is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationAction is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setExtras(conversationAction.getExtras())"
         errorLine2="                                              ~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                conversationActions.getConversationActions().stream()"
         errorLine2="                                                             ~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                conversationActions.getConversationActions().stream()"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .map(ConversationAction::fromPlatform)"
         errorLine2="                         ~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .collect(Collectors.toList()),"
         errorLine2="                         ~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .collect(Collectors.toList()),"
         errorLine2="                                            ~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                conversationActions.getId());"
         errorLine2="                                    ~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new android.view.textclassifier.ConversationActions("
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    getConversationActions().stream()"
         errorLine2="                                             ~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .map(ConversationAction::toPlatform)"
         errorLine2="                         ~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .collect(Collectors.toList()),"
         errorLine2="                         ~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .collect(Collectors.toList()),"
         errorLine2="                                            ~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new android.view.textclassifier.ConversationActions.Message.Builder("
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setText(getText())"
         errorLine2="                     ~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setReferenceTime(ConvertUtils.createZonedDateTimeFromUtc(getReferenceTime()))"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setExtras(getExtras())"
         errorLine2="                     ~~~~~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    Person.fromAndroidPerson(message.getAuthor()))"
         errorLine2="                                                     ~~~~~~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setText(message.getText())"
         errorLine2="                                     ~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setReferenceTime(ConvertUtils.zonedDateTimeToUtcMs(message.getReferenceTime()))"
         errorLine2="                                                                                ~~~~~~~~~~~~~~~~">
         <location
@@ -354,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Message is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Message is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setExtras(message.getExtras())"
         errorLine2="                                       ~~~~~~~~~">
         <location
@@ -365,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    new android.view.textclassifier.ConversationActions.Request.Builder("
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    getConversation().stream()"
         errorLine2="                                      ~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .map(msg -> msg.toPlatform())"
         errorLine2="                             ~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .collect(Collectors.toList()))"
         errorLine2="                             ~~~~~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .collect(Collectors.toList()))"
         errorLine2="                                                ~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setHints(getHints())"
         errorLine2="                     ~~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setExtras(getExtras())"
         errorLine2="                     ~~~~~~~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setTypeConfig(getTypeConfig().toPlatform());"
         errorLine2="                     ~~~~~~~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.setMaxSuggestions(getMaxSuggestions());"
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return builder.build();"
         errorLine2="                           ~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getConversation().stream()"
         errorLine2="                                              ~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getConversation().stream()"
         errorLine2="                            ~~~~~~~~~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .map(Message::fromPlatform)"
         errorLine2="                             ~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .collect(Collectors.toList()))"
         errorLine2="                             ~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            .collect(Collectors.toList()))"
         errorLine2="                                                ~~~~~~">
         <location
@@ -530,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setHints(request.getHints())"
         errorLine2="                                      ~~~~~~~~">
         <location
@@ -541,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setMaxSuggestions(request.getMaxSuggestions())"
         errorLine2="                                               ~~~~~~~~~~~~~~~~~">
         <location
@@ -552,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setExtras(request.getExtras())"
         errorLine2="                                       ~~~~~~~~~">
         <location
@@ -563,8 +563,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.ConversationActions.Request is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.ConversationActions.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            TextClassifier.EntityConfig.fromPlatform(request.getTypeConfig()))"
         errorLine2="                                                                             ~~~~~~~~~~~~~">
         <location
@@ -574,8 +574,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeInMs), ZoneOffset.UTC);"
         errorLine2="                             ~~~~~~~~~">
         <location
@@ -585,8 +585,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeInMs), ZoneOffset.UTC);"
         errorLine2="                                               ~~~~~~~~~~~~">
         <location
@@ -596,8 +596,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final int entityCount = textLink.getEntityCount();"
         errorLine2="                                         ~~~~~~~~~~~~~~">
         <location
@@ -607,8 +607,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            String entity = textLink.getEntity(i);"
         errorLine2="                                     ~~~~~~~~~">
         <location
@@ -618,8 +618,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            floatMap.put(entity, textLink.getConfidenceScore(entity));"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
@@ -629,8 +629,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return zonedDateTime.toInstant().toEpochMilli();"
         errorLine2="                             ~~~~~~~~~">
         <location
@@ -640,8 +640,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.ConvertUtils is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.ConvertUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return zonedDateTime.toInstant().toEpochMilli();"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
@@ -651,8 +651,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getDrawable(R.drawable.ft_avd_tooverflow, mContext.getTheme());"
         errorLine2="                     ~~~~~~~~~~~">
         <location
@@ -662,8 +662,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mArrow.setAutoMirrored(true);"
         errorLine2="                   ~~~~~~~~~~~~~~~">
         <location
@@ -673,8 +673,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getDrawable(R.drawable.ft_avd_toarrow, mContext.getTheme());"
         errorLine2="                     ~~~~~~~~~~~">
         <location
@@ -684,8 +684,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mOverflow.setAutoMirrored(true);"
         errorLine2="                      ~~~~~~~~~~~~~~~">
         <location
@@ -695,8 +695,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getDrawable(R.drawable.ft_avd_toarrow_animation, mContext.getTheme());"
         errorLine2="                     ~~~~~~~~~~~">
         <location
@@ -706,8 +706,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mToArrow.setAutoMirrored(true);"
         errorLine2="                     ~~~~~~~~~~~~~~~">
         <location
@@ -717,8 +717,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getDrawable(R.drawable.ft_avd_tooverflow_animation, mContext.getTheme());"
         errorLine2="                     ~~~~~~~~~~~">
         <location
@@ -728,8 +728,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mToOverflow.setAutoMirrored(true);"
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
@@ -739,8 +739,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int targetWidth = mOverflowPanelSize.getWidth();"
         errorLine2="                                                       ~~~~~~~~">
         <location
@@ -750,8 +750,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int targetHeight = mOverflowPanelSize.getHeight();"
         errorLine2="                                                        ~~~~~~~~~">
         <location
@@ -761,8 +761,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .alpha(0).withLayer()"
         errorLine2="                              ~~~~~~~~~">
         <location
@@ -772,8 +772,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int targetWidth = mMainPanelSize.getWidth();"
         errorLine2="                                                   ~~~~~~~~">
         <location
@@ -783,8 +783,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            final int targetHeight = mMainPanelSize.getHeight();"
         errorLine2="                                                    ~~~~~~~~~">
         <location
@@ -794,8 +794,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .alpha(1).withLayer()"
         errorLine2="                              ~~~~~~~~~">
         <location
@@ -805,8 +805,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .alpha(0).withLayer()"
         errorLine2="                              ~~~~~~~~~">
         <location
@@ -816,8 +816,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mOverflowButton.setX(containerSize.getWidth()"
         errorLine2="                                                       ~~~~~~~~">
         <location
@@ -827,8 +827,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            - mOverflowButtonSize.getWidth());  // align right"
         errorLine2="                                                  ~~~~~~~~">
         <location
@@ -838,8 +838,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            - containerSize.getWidth() - mMarginHorizontal);  // align right"
         errorLine2="                                            ~~~~~~~~">
         <location
@@ -849,8 +849,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mMainPanel.setY(containerSize.getHeight()"
         errorLine2="                                                  ~~~~~~~~~">
         <location
@@ -860,8 +860,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mOverflowButton.setY(containerSize.getHeight()"
         errorLine2="                                                       ~~~~~~~~~">
         <location
@@ -871,8 +871,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            - mOverflowButtonSize.getHeight());  // align bottom"
         errorLine2="                                                  ~~~~~~~~~">
         <location
@@ -882,8 +882,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mOverflowPanel.setY(mOverflowButtonSize.getHeight());  // align bottom"
         errorLine2="                                                            ~~~~~~~~~">
         <location
@@ -893,8 +893,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                - containerSize.getWidth() - mMarginHorizontal);  // align right"
         errorLine2="                                                ~~~~~~~~">
         <location
@@ -904,8 +904,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mOverflowButton.setX(containerSize.getWidth()"
         errorLine2="                                                           ~~~~~~~~">
         <location
@@ -915,8 +915,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                - mOverflowButtonSize.getWidth());  // align right"
         errorLine2="                                                      ~~~~~~~~">
         <location
@@ -926,8 +926,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mOverflowPanel.setX(containerSize.getWidth()"
         errorLine2="                                                          ~~~~~~~~">
         <location
@@ -937,8 +937,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                - mOverflowPanelSize.getWidth());  // align right"
         errorLine2="                                                     ~~~~~~~~">
         <location
@@ -948,8 +948,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                + mOverflowPanelSize.getHeight() - containerSize.getHeight());"
         errorLine2="                                                     ~~~~~~~~~">
         <location
@@ -959,8 +959,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                + mOverflowPanelSize.getHeight() - containerSize.getHeight());"
         errorLine2="                                                                                 ~~~~~~~~~">
         <location
@@ -970,8 +970,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mOverflowPanel.setY(containerSize.getHeight()"
         errorLine2="                                                          ~~~~~~~~~">
         <location
@@ -981,8 +981,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                - mOverflowPanelSize.getHeight());  // align bottom"
         errorLine2="                                                     ~~~~~~~~~">
         <location
@@ -992,8 +992,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        mOverflowPanel.setY(mOverflowButtonSize.getHeight());  // align bottom"
         errorLine2="                                                                ~~~~~~~~~">
         <location
@@ -1003,8 +1003,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                final int maxItemSize = (suggestedHeight - mOverflowButtonSize.getHeight())"
         errorLine2="                                                                               ~~~~~~~~~">
         <location
@@ -1014,8 +1014,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                if (mOverflowPanelSize.getHeight() != newHeight) {"
         errorLine2="                                       ~~~~~~~~~">
         <location
@@ -1025,8 +1025,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mOverflowPanelSize = new Size(mOverflowPanelSize.getWidth(), newHeight);"
         errorLine2="                                         ~~~~~~~~">
         <location
@@ -1036,8 +1036,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mOverflowPanelSize = new Size(mOverflowPanelSize.getWidth(), newHeight);"
         errorLine2="                                                                     ~~~~~~~~">
         <location
@@ -1047,8 +1047,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        final int deltaHeight = mOverflowPanelSize.getHeight() - newHeight;"
         errorLine2="                                                                   ~~~~~~~~~">
         <location
@@ -1058,8 +1058,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                width = Math.max(width, mMainPanelSize.getWidth());"
         errorLine2="                                                       ~~~~~~~~">
         <location
@@ -1069,8 +1069,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                height = Math.max(height, mMainPanelSize.getHeight());"
         errorLine2="                                                         ~~~~~~~~~">
         <location
@@ -1080,8 +1080,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                width = Math.max(width, mOverflowPanelSize.getWidth());"
         errorLine2="                                                           ~~~~~~~~">
         <location
@@ -1091,8 +1091,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                height = Math.max(height, mOverflowPanelSize.getHeight());"
         errorLine2="                                                             ~~~~~~~~~">
         <location
@@ -1102,8 +1102,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .getLayoutDirection();"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1113,8 +1113,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mMainPanel.setPaddingRelative(0, 0, 0, 0);"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1124,8 +1124,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    menuItemButton.setPaddingRelative("
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1135,8 +1135,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            (int) (1.5 * menuItemButton.getPaddingStart()),"
         errorLine2="                                                        ~~~~~~~~~~~~~~~">
         <location
@@ -1146,8 +1146,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            menuItemButton.getPaddingEnd(),"
         errorLine2="                                           ~~~~~~~~~~~~~">
         <location
@@ -1157,8 +1157,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    menuItemButton.setPaddingRelative("
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1168,8 +1168,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            menuItemButton.getPaddingStart(),"
         errorLine2="                                           ~~~~~~~~~~~~~~~">
         <location
@@ -1179,8 +1179,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            (int) (1.5 * menuItemButton.getPaddingEnd()),"
         errorLine2="                                                        ~~~~~~~~~~~~~">
         <location
@@ -1190,8 +1190,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        menuItemButtonWidth &lt;= availableWidth - mOverflowButtonSize.getWidth();"
         errorLine2="                                                                                    ~~~~~~~~">
         <location
@@ -1201,8 +1201,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mMainPanel.setPaddingRelative(0, 0, mOverflowButtonSize.getWidth(), 0);"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1212,8 +1212,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mMainPanel.setPaddingRelative(0, 0, mOverflowButtonSize.getWidth(), 0);"
         errorLine2="                                                                        ~~~~~~~~">
         <location
@@ -1223,8 +1223,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mOverflowPanel.setY(mOverflowButtonSize.getHeight());"
         errorLine2="                                                        ~~~~~~~~~">
         <location
@@ -1234,8 +1234,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            int width = Math.max(getOverflowWidth(), mOverflowButtonSize.getWidth());"
         errorLine2="                                                                         ~~~~~~~~">
         <location
@@ -1245,8 +1245,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mOverflowPanelSize = new Size(width, height);"
         errorLine2="                                 ~~~~~~~~">
         <location
@@ -1256,8 +1256,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mMainPanel.setY(mContentContainer.getHeight() - mMainPanelSize.getHeight());"
         errorLine2="                                                                               ~~~~~~~~~">
         <location
@@ -1267,8 +1267,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mOverflowPanel.setY(mContentContainer.getHeight() - mOverflowPanelSize.getHeight());"
         errorLine2="                                                                                       ~~~~~~~~~">
         <location
@@ -1278,8 +1278,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    + mOverflowButtonSize.getHeight()"
         errorLine2="                                          ~~~~~~~~~">
         <location
@@ -1289,8 +1289,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                int w = mMainPanelSize.getWidth() - mOverflowPanelSize.getWidth();"
         errorLine2="                                       ~~~~~~~~">
         <location
@@ -1300,8 +1300,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                int w = mMainPanelSize.getWidth() - mOverflowPanelSize.getWidth();"
         errorLine2="                                                                       ~~~~~~~~">
         <location
@@ -1311,8 +1311,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                int h = mOverflowPanelSize.getHeight() - mMainPanelSize.getHeight();"
         errorLine2="                                           ~~~~~~~~~">
         <location
@@ -1322,8 +1322,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                int h = mOverflowPanelSize.getHeight() - mMainPanelSize.getHeight();"
         errorLine2="                                                                        ~~~~~~~~~">
         <location
@@ -1333,8 +1333,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                mMainPanelSize.getWidth(),"
         errorLine2="                                               ~~~~~~~~">
         <location
@@ -1344,8 +1344,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                    getItem(position), mOverflowPanelSize.getWidth(), convertView);"
         errorLine2="                                                                          ~~~~~~~~">
         <location
@@ -1355,8 +1355,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new Size(view.getMeasuredWidth(), view.getMeasuredHeight());"
         errorLine2="                   ~~~~~~~~">
         <location
@@ -1366,8 +1366,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setSize(view, size.getWidth(), size.getHeight());"
         errorLine2="                               ~~~~~~~~">
         <location
@@ -1377,8 +1377,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            setSize(view, size.getWidth(), size.getHeight());"
         errorLine2="                                                ~~~~~~~~~">
         <location
@@ -1388,8 +1388,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                setScrollBarDefaultDelayBeforeFade(ViewConfiguration.getScrollDefaultDelay() * 3);"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1399,8 +1399,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                setScrollIndicators(View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM);"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1410,8 +1410,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                int height = mPopup.mOverflowPanelSize.getHeight()"
         errorLine2="                                                       ~~~~~~~~~">
         <location
@@ -1421,8 +1421,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.textclassifier.widget.FloatingToolbar.FloatingToolbarPopup.OverflowPanel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        - mPopup.mOverflowButtonSize.getHeight();"
         errorLine2="                                                     ~~~~~~~~~">
         <location
@@ -1432,8 +1432,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.textclassifier.LegacyTextClassifier.MatchMakerImpl is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.textclassifier.LegacyTextClassifier.MatchMakerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    ? ((UserManager) userManager).getUserRestrictions() : new Bundle();"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1443,8 +1443,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.PlatformTextClassifierWrapper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.PlatformTextClassifierWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mPlatformTextClassifier.suggestSelection("
         errorLine2="                                            ~~~~~~~~~~~~~~~~">
         <location
@@ -1454,8 +1454,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.PlatformTextClassifierWrapper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.PlatformTextClassifierWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mPlatformTextClassifier.classifyText("
         errorLine2="                                            ~~~~~~~~~~~~">
         <location
@@ -1465,8 +1465,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.PlatformTextClassifierWrapper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.PlatformTextClassifierWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TextLinks.fromPlatform(mPlatformTextClassifier.generateLinks("
         errorLine2="                                                                  ~~~~~~~~~~~~~">
         <location
@@ -1476,8 +1476,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.PlatformTextClassifierWrapper is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.PlatformTextClassifierWrapper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mPlatformTextClassifier.suggestConversationActions("
         errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1487,8 +1487,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return android.view.textclassifier.SelectionEvent.createSelectionStartedEvent("
         errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1498,8 +1498,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return android.view.textclassifier.SelectionEvent.createSelectionModifiedEvent("
         errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1509,8 +1509,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return android.view.textclassifier.SelectionEvent.createSelectionModifiedEvent("
         errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1520,8 +1520,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return android.view.textclassifier.SelectionEvent.createSelectionModifiedEvent("
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1531,8 +1531,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return android.view.textclassifier.SelectionEvent.createSelectionActionEvent("
         errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1542,8 +1542,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.SelectionEvent is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.SelectionEvent is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return android.view.textclassifier.SelectionEvent.createSelectionActionEvent("
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1553,8 +1553,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setText(textClassification.getText());"
         errorLine2="                                            ~~~~~~~">
         <location
@@ -1564,8 +1564,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setId(textClassification.getId());"
         errorLine2="                                             ~~~~~">
         <location
@@ -1575,8 +1575,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final int entityCount = textClassification.getEntityCount();"
         errorLine2="                                                   ~~~~~~~~~~~~~~">
         <location
@@ -1586,8 +1586,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            String entity = textClassification.getEntity(i);"
         errorLine2="                                               ~~~~~~~~~">
         <location
@@ -1597,8 +1597,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setEntityType(entity, textClassification.getConfidenceScore(entity));"
         errorLine2="                                                             ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1608,8 +1608,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            List&lt;RemoteAction> actions = textClassification.getActions();"
         errorLine2="                                                            ~~~~~~~~~~">
         <location
@@ -1619,8 +1619,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (textClassification.getIntent() != null"
         errorLine2="                                   ~~~~~~~~~">
         <location
@@ -1630,8 +1630,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    &amp;&amp; !TextUtils.isEmpty(textClassification.getLabel())) {"
         errorLine2="                                                             ~~~~~~~~">
         <location
@@ -1641,8 +1641,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        textClassification.getText().hashCode(),"
         errorLine2="                                           ~~~~~~~">
         <location
@@ -1652,8 +1652,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        textClassification.getIntent(),"
         errorLine2="                                           ~~~~~~~~~">
         <location
@@ -1663,8 +1663,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        Drawable drawable = textClassification.getIcon();"
         errorLine2="                                               ~~~~~~~">
         <location
@@ -1674,8 +1674,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        CharSequence label = textClassification.getLabel();"
         errorLine2="                                                ~~~~~~~~">
         <location
@@ -1685,8 +1685,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            icon = ConvertUtils.createIconFromDrawable(textClassification.getIcon());"
         errorLine2="                                                                          ~~~~~~~">
         <location
@@ -1696,8 +1696,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                new android.view.textclassifier.TextClassification.Builder()"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1707,8 +1707,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        .setText(getText() == null ? null : getText().toString());"
         errorLine2="                         ~~~~~~~">
         <location
@@ -1718,8 +1718,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setId(getId());"
         errorLine2="                    ~~~~~">
         <location
@@ -1729,8 +1729,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setEntityType(entity, getConfidenceScore(entity));"
         errorLine2="                    ~~~~~~~~~~~~~">
         <location
@@ -1740,8 +1740,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.addAction(action.toRemoteAction());"
         errorLine2="                        ~~~~~~~~~">
         <location
@@ -1751,8 +1751,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setLabel(firstAction.getTitle().toString())"
         errorLine2="                    ~~~~~~~~">
         <location
@@ -1762,8 +1762,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setIcon(firstAction.getIcon().loadDrawable(context))"
         errorLine2="                     ~~~~~~~">
         <location
@@ -1773,8 +1773,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setOnClickListener(new View.OnClickListener() {"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -1784,8 +1784,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassification is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassification is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return builder.build();"
         errorLine2="                       ~~~~~">
         <location
@@ -1795,8 +1795,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                            ~~~~~~~">
         <location
@@ -1806,8 +1806,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                                               ~~~~~~~~~~~~~">
         <location
@@ -1817,8 +1817,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                                                                        ~~~~~~~~~~~">
         <location
@@ -1828,8 +1828,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setReferenceTime(ConvertUtils.zonedDateTimeToUtcMs(request.getReferenceTime()))"
         errorLine2="                                                                                ~~~~~~~~~~~~~~~~">
         <location
@@ -1839,8 +1839,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(ConvertUtils.wrapLocalList(request.getDefaultLocales()))"
         errorLine2="                                                                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -1850,8 +1850,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new android.view.textclassifier.TextClassification.Request.Builder("
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1861,8 +1861,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(ConvertUtils.unwrapLocalListCompat(getDefaultLocales()))"
         errorLine2="                     ~~~~~~~~~~~~~~~~~">
         <location
@@ -1872,8 +1872,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setReferenceTime(ConvertUtils.createZonedDateTimeFromUtc(mReferenceTime))"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -1883,8 +1883,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassification.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassification.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -1894,8 +1894,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassificationContext is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassificationContext is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new android.view.textclassifier.TextClassificationContext.Builder("
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1905,8 +1905,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassificationContext is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassificationContext is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPackageName, mWidgetType).setWidgetVersion(mWidgetVersion).build();"
         errorLine2="                                           ~~~~~~~~~~~~~~~~">
         <location
@@ -1916,8 +1916,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassificationContext is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassificationContext is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mPackageName, mWidgetType).setWidgetVersion(mWidgetVersion).build();"
         errorLine2="                                                                            ~~~~~">
         <location
@@ -1927,8 +1927,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextClassificationManager is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextClassificationManager is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        textClassificationManager.setTextClassifier(platformTextClassifier);"
         errorLine2="                                  ~~~~~~~~~~~~~~~~~">
         <location
@@ -1938,8 +1938,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return android.view.textclassifier.TextClassifier.EntityConfig.create("
         errorLine2="                                                                               ~~~~~~">
         <location
@@ -1949,8 +1949,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .createWithExplicitEntityList(new ArrayList&lt;>(entitiesSet));"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1960,8 +1960,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new android.view.textclassifier.TextClassifier.EntityConfig.Builder()"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1971,8 +1971,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setIncludedTypes(mIncludedTypes)"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -1982,8 +1982,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setExcludedTypes(mExcludedTypes)"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -1993,8 +1993,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setHints(mHints)"
         errorLine2="                     ~~~~~~~~">
         <location
@@ -2004,8 +2004,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .includeTypesFromTextClassifier(mIncludeTypesFromTextClassifier)"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2015,8 +2015,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.textclassifier.TextClassifier.EntityConfig is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.textclassifier.TextClassifier.EntityConfig is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -2026,8 +2026,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new android.view.textclassifier.TextLinks.Request.Builder(getText())"
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2037,8 +2037,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(unwrapLocalListCompat(getDefaultLocales()))"
         errorLine2="                     ~~~~~~~~~~~~~~~~~">
         <location
@@ -2048,8 +2048,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setEntityConfig(toPlatformEntityConfig(getEntityConfig()))"
         errorLine2="                     ~~~~~~~~~~~~~~~">
         <location
@@ -2059,8 +2059,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -2070,8 +2070,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new TextLinks.Request.Builder(request.getText())"
         errorLine2="                                                         ~~~~~~~">
         <location
@@ -2081,8 +2081,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(ConvertUtils.wrapLocalList(request.getDefaultLocales()))"
         errorLine2="                                                                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -2092,8 +2092,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                            TextClassifier.EntityConfig.fromPlatform(request.getEntityConfig()))"
         errorLine2="                                                                             ~~~~~~~~~~~~~~~">
         <location
@@ -2103,8 +2103,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.textclassifier.TextLinks.DefaultTextLinkSpan is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.textclassifier.TextLinks.DefaultTextLinkSpan is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return ConvertUtils.wrapLocalList(textView.getTextLocales());"
         errorLine2="                                                           ~~~~~~~~~~~~~~">
         <location
@@ -2114,8 +2114,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.textclassifier.TextLinks.DefaultTextLinkSpan is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class androidx.textclassifier.TextLinks.DefaultTextLinkSpan is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return LocaleListCompat.create(textView.getTextLocale());"
         errorLine2="                                                        ~~~~~~~~~~~~~">
         <location
@@ -2125,8 +2125,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        Collection&lt;android.view.textclassifier.TextLinks.TextLink> links = textLinks.getLinks();"
         errorLine2="                                                                                     ~~~~~~~~">
         <location
@@ -2136,8 +2136,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.addLink(link.getStart(), link.getEnd(),"
         errorLine2="                                 ~~~~~~~~">
         <location
@@ -2147,8 +2147,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.addLink(link.getStart(), link.getEnd(),"
         errorLine2="                                                  ~~~~~~">
         <location
@@ -2158,8 +2158,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                new android.view.textclassifier.TextLinks.Builder((String) getText());"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2169,8 +2169,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.addLink("
         errorLine2="                    ~~~~~~~">
         <location
@@ -2180,8 +2180,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextLinks is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextLinks is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return builder.build();"
         errorLine2="                       ~~~~~">
         <location
@@ -2191,8 +2191,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                textSelection.getSelectionStartIndex(), textSelection.getSelectionEndIndex());"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2202,8 +2202,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                textSelection.getSelectionStartIndex(), textSelection.getSelectionEndIndex());"
         errorLine2="                                                                      ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2213,8 +2213,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setId(textSelection.getId());"
         errorLine2="                                        ~~~~~">
         <location
@@ -2224,8 +2224,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        final int entityCount = textSelection.getEntityCount();"
         errorLine2="                                              ~~~~~~~~~~~~~~">
         <location
@@ -2235,8 +2235,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            String entity = textSelection.getEntity(i);"
         errorLine2="                                          ~~~~~~~~~">
         <location
@@ -2246,8 +2246,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setEntityType(entity, textSelection.getConfidenceScore(entity));"
         errorLine2="                                                        ~~~~~~~~~~~~~~~~~~">
         <location
@@ -2257,8 +2257,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                new android.view.textclassifier.TextSelection.Builder("
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2268,8 +2268,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setId(getId());"
         errorLine2="                    ~~~~~">
         <location
@@ -2279,8 +2279,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setEntityType(entity, getConfidenceScore(entity));"
         errorLine2="                    ~~~~~~~~~~~~~">
         <location
@@ -2290,8 +2290,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.TextSelection is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.TextSelection is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return builder.build();"
         errorLine2="                       ~~~~~">
         <location
@@ -2301,8 +2301,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                            ~~~~~~~">
         <location
@@ -2312,8 +2312,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                                               ~~~~~~~~~~~~~">
         <location
@@ -2323,8 +2323,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getText(), request.getStartIndex(), request.getEndIndex())"
         errorLine2="                                                                        ~~~~~~~~~~~">
         <location
@@ -2334,8 +2334,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(ConvertUtils.wrapLocalList(request.getDefaultLocales()))"
         errorLine2="                                                                          ~~~~~~~~~~~~~~~~~">
         <location
@@ -2345,8 +2345,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new android.view.textclassifier.TextSelection.Request.Builder("
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2356,8 +2356,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setDefaultLocales(ConvertUtils.unwrapLocalListCompat(mDefaultLocales))"
         errorLine2="                     ~~~~~~~~~~~~~~~~~">
         <location
@@ -2367,8 +2367,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.textclassifier.TextSelection.Request is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.textclassifier.TextSelection.Request is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -2378,8 +2378,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.textclassifier.widget.ToolbarController is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.textclassifier.widget.ToolbarController is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                item.setContentDescription(action.getContentDescription());"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2389,8 +2389,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class null is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        textView.getContext().getSystemService(ClipboardManager.class);"
         errorLine2="                                              ~~~~~~~~~~~~~~~~">
         <location
@@ -2400,8 +2400,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.ToolbarController.ActionModeCallback is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.ToolbarController.ActionModeCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (actionMode.getType() == ActionMode.TYPE_FLOATING) {"
         errorLine2="                           ~~~~~~~">
         <location
@@ -2411,8 +2411,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.ToolbarController.ActionModeCallback is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.ToolbarController.ActionModeCallback is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                ((ActionMode.Callback2) mOriginalCallback).onGetContentRect(mode, view, outRect);"
         errorLine2="                                                           ~~~~~~~~~~~~~~~~">
         <location
@@ -2422,8 +2422,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mObserver.addOnWindowFocusChangeListener(mTextViewListener);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2433,8 +2433,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mObserver.addOnWindowAttachListener(mTextViewListener);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2444,8 +2444,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mObserver.removeOnWindowFocusChangeListener(mTextViewListener);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2455,8 +2455,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mObserver.removeOnWindowAttachListener(mTextViewListener);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2466,8 +2466,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mTextView.setCustomInsertionActionModeCallback(mInsertionCallback);"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2477,8 +2477,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (mInsertionCallback == mTextView.getCustomInsertionActionModeCallback()) {"
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2488,8 +2488,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.textclassifier.widget.ToolbarController.OnToolbarDismissListener is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mTextView.setCustomInsertionActionModeCallback("
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/textclassifier/textclassifier/src/main/res/values-iw/strings.xml b/textclassifier/textclassifier/src/main/res/values-iw/strings.xml
index a2bab86..d69c58e 100644
--- a/textclassifier/textclassifier/src/main/res/values-iw/strings.xml
+++ b/textclassifier/textclassifier/src/main/res/values-iw/strings.xml
@@ -19,10 +19,10 @@
     <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="dial_desc" msgid="1195407206406821463">"חיוג למספר הטלפון שנבחר"</string>
     <string name="browse" msgid="4753676368851695348">"פתיחה"</string>
     <string name="browse_desc" msgid="728882176434276995">"‏פתיחה של כתובת ה-URL שנבחרה"</string>
-    <string name="sms" msgid="2214738262605167054">"התכתבות בהודעות"</string>
+    <string name="sms" msgid="2214738262605167054">"שליחת הודעה"</string>
     <string name="sms_desc" msgid="7733202356868441148">"שליחת הודעה למספר הטלפון שנבחר"</string>
     <string name="add_contact" msgid="386263007484061034">"הוספה"</string>
     <string name="add_contact_desc" msgid="1739272501140197425">"הוספה לאנשי הקשר"</string>
diff --git a/textclassifier/textclassifier/src/main/res/values-te/strings.xml b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
index 1585af8..9e55cfd 100644
--- a/textclassifier/textclassifier/src/main/res/values-te/strings.xml
+++ b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
@@ -26,7 +26,7 @@
     <string name="sms_desc" msgid="7733202356868441148">"ఎంచుకున్న ఫోన్ నంబర్‌కి సందేశం పంపుతుంది"</string>
     <string name="add_contact" msgid="386263007484061034">"జోడించు"</string>
     <string name="add_contact_desc" msgid="1739272501140197425">"పరిచయాలకు జోడిస్తుంది"</string>
-    <string name="floating_toolbar_open_overflow_description" msgid="6778458701858708647">"మరిన్ని ఎంపికలు"</string>
+    <string name="floating_toolbar_open_overflow_description" msgid="6778458701858708647">"మరిన్ని ఆప్షన్‌లు"</string>
     <string name="floating_toolbar_close_overflow_description" msgid="3112942430227166657">"అతివ్యాప్తిని మూసివేస్తుంది"</string>
     <string name="abc_share" msgid="37557693057519685">"షేర్ చేయి"</string>
 </resources>
diff --git a/tracing/tracing/lint-baseline.xml b/tracing/tracing/lint-baseline.xml
index 3e52b9c..2c1ddc6 100644
--- a/tracing/tracing/lint-baseline.xml
+++ b/tracing/tracing/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.tracing.Trace is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.tracing.Trace is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return android.os.Trace.isEnabled();"
         errorLine2="                                        ~~~~~~~~~">
         <location
diff --git a/transition/transition-ktx/lint-baseline.xml b/transition/transition-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/transition/transition-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/transition/transition/build.gradle b/transition/transition/build.gradle
index 7a472ef..eb608cb 100644
--- a/transition/transition/build.gradle
+++ b/transition/transition/build.gradle
@@ -23,9 +23,9 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(project(":fragment:fragment"))
     androidTestImplementation("androidx.appcompat:appcompat:1.1.0")
     androidTestImplementation(project(":internal-testutils-runtime"), {
@@ -34,14 +34,9 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
-
     aaptOptions {
         additionalParameters "--no-version-transitions"
     }
diff --git a/transition/transition/lint-baseline.xml b/transition/transition/lint-baseline.xml
index faaf3dd..91f2af8 100644
--- a/transition/transition/lint-baseline.xml
+++ b/transition/transition/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -41,7 +41,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/ViewOverlayApi14.java"
-            line="289"
+            line="290"
             column="21"/>
     </issue>
 
@@ -57,19 +57,8 @@
     </issue>
 
     <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class with non private constructor"
-        errorLine1="    private static class ArrayListManager {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="2379"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.transition.AnimatorUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.transition.AnimatorUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            animator.addPauseListener(listener);"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -79,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.transition.AnimatorUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.transition.AnimatorUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            animator.pause();"
         errorLine2="                     ~~~~~">
         <location
@@ -90,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.transition.AnimatorUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.transition.AnimatorUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            animator.resume();"
         errorLine2="                     ~~~~~~">
         <location
@@ -101,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.CanvasUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                canvas.enableZ();"
         errorLine2="                       ~~~~~~~">
         <location
@@ -112,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.CanvasUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.CanvasUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                canvas.disableZ();"
         errorLine2="                       ~~~~~~~~">
         <location
@@ -123,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.GhostViewHolder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.GhostViewHolder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (view.getZ() != comparedWith.getZ()) {"
         errorLine2="                     ~~~~">
         <location
@@ -134,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.GhostViewHolder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.GhostViewHolder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (view.getZ() != comparedWith.getZ()) {"
         errorLine2="                                            ~~~~">
         <location
@@ -145,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.GhostViewHolder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.GhostViewHolder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return view.getZ() > comparedWith.getZ();"
         errorLine2="                            ~~~~">
         <location
@@ -156,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.GhostViewHolder is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.GhostViewHolder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return view.getZ() > comparedWith.getZ();"
         errorLine2="                                                  ~~~~">
         <location
@@ -167,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ImageViewUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ImageViewUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            view.animateTransform(matrix);"
         errorLine2="                 ~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ImageViewUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ImageViewUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.animateTransform(matrix);"
         errorLine2="                     ~~~~~~~~~~~~~~~~">
         <location
@@ -189,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.ObjectAnimatorUtils is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.ObjectAnimatorUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return ObjectAnimator.ofObject(target, property, null, path);"
         errorLine2="                                  ~~~~~~~~">
         <location
@@ -200,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.transition.PropertyValuesHolderUtils is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.transition.PropertyValuesHolderUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return PropertyValuesHolder.ofObject(property, null, path);"
         errorLine2="                                        ~~~~~~~~">
         <location
@@ -211,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            addToOverlay = !view.isAttachedToWindow();"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
         <location
@@ -222,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            sceneRootIsAttached = sceneRoot == null ? false : sceneRoot.isAttachedToWindow();"
         errorLine2="                                                                        ~~~~~~~~~~~~~~~~~~">
         <location
@@ -233,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            sceneRoot.getOverlay().add(view);"
         errorLine2="                      ~~~~~~~~~~">
         <location
@@ -244,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            sceneRoot.getOverlay().add(view);"
         errorLine2="                                   ~~~">
         <location
@@ -255,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                bitmap = Bitmap.createBitmap(picture);"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
@@ -266,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            sceneRoot.getOverlay().remove(view);"
         errorLine2="                      ~~~~~~~~~~">
         <location
@@ -277,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 18, the call containing class androidx.transition.TransitionUtils is not annotated with @RequiresApi(x) where x is at least 18. Either annotate the containing class with at least @RequiresApi(18) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(18)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 18; however, the containing class androidx.transition.TransitionUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            sceneRoot.getOverlay().remove(view);"
         errorLine2="                                   ~~~~~~">
         <location
@@ -288,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewGroupUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewGroupUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            group.suppressLayout(suppress);"
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
@@ -299,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewGroupUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewGroupUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                group.suppressLayout(suppress);"
         errorLine2="                      ~~~~~~~~~~~~~~">
         <location
@@ -310,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewGroupUtils is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewGroupUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return viewGroup.getChildDrawingOrder(i);"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -321,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi19 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi19 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.setTransitionAlpha(alpha);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -332,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi19 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi19 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                return view.getTransitionAlpha();"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~">
         <location
@@ -343,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi21 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.transformMatrixToGlobal(matrix);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -354,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi21 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.transformMatrixToLocal(matrix);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -365,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi21 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi21 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                view.setAnimationMatrix(matrix);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi22 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi22 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                v.setLeftTopRightBottom(left, top, right, bottom);"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -387,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.transition.ViewUtilsApi23 is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.transition.ViewUtilsApi23 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    view.setTransitionVisibility(visibility);"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -398,6 +387,17 @@
     </issue>
 
     <issue
+        id="PrivateConstructorForUtilityClass"
+        message="Utility class with non private constructor"
+        errorLine1="    private static class ArrayListManager {"
+        errorLine2="                         ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/transition/Transition.java"
+            line="2366"
+            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 long getStartDelay(ViewGroup sceneRoot, Transition transition,"
@@ -1280,66 +1280,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="701"
-            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 createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="701"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            TransitionValuesMaps endValues, ArrayList&lt;TransitionValues> startValuesList,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="702"
-            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="            TransitionValuesMaps endValues, ArrayList&lt;TransitionValues> startValuesList,"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="702"
-            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="            ArrayList&lt;TransitionValues> endValuesList) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/Transition.java"
-            line="703"
-            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 pause(View sceneRoot) {"
         errorLine2="                      ~~~~">
         <location
             file="src/main/java/androidx/transition/Transition.java"
-            line="1715"
+            line="1712"
             column="23"/>
     </issue>
 
@@ -1350,7 +1295,7 @@
         errorLine2="                       ~~~~">
         <location
             file="src/main/java/androidx/transition/Transition.java"
-            line="1747"
+            line="1739"
             column="24"/>
     </issue>
 
@@ -1361,7 +1306,7 @@
         errorLine2="                           ~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/Transition.java"
-            line="1894"
+            line="1881"
             column="28"/>
     </issue>
 
@@ -1372,7 +1317,7 @@
         errorLine2="           ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/Transition.java"
-            line="2214"
+            line="2201"
             column="12"/>
     </issue>
 
@@ -1383,7 +1328,7 @@
         errorLine2="                        ~~~~">
         <location
             file="src/main/java/androidx/transition/Transition.java"
-            line="2437"
+            line="2424"
             column="25"/>
     </issue>
 
@@ -1511,66 +1456,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/TransitionSet.java"
-            line="463"
-            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 createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/TransitionSet.java"
-            line="463"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            TransitionValuesMaps endValues, ArrayList&lt;TransitionValues> startValuesList,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/TransitionSet.java"
-            line="464"
-            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="            TransitionValuesMaps endValues, ArrayList&lt;TransitionValues> startValuesList,"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/TransitionSet.java"
-            line="464"
-            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="            ArrayList&lt;TransitionValues> endValuesList) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/transition/TransitionSet.java"
-            line="465"
-            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 pause(View sceneRoot) {"
         errorLine2="                      ~~~~">
         <location
             file="src/main/java/androidx/transition/TransitionSet.java"
-            line="558"
+            line="554"
             column="23"/>
     </issue>
 
@@ -1581,7 +1471,7 @@
         errorLine2="                       ~~~~">
         <location
             file="src/main/java/androidx/transition/TransitionSet.java"
-            line="569"
+            line="565"
             column="24"/>
     </issue>
 
@@ -1592,7 +1482,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/TransitionSet.java"
-            line="609"
+            line="605"
             column="32"/>
     </issue>
 
@@ -1603,7 +1493,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/TransitionSet.java"
-            line="619"
+            line="615"
             column="38"/>
     </issue>
 
@@ -1614,7 +1504,7 @@
         errorLine2="           ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/transition/TransitionSet.java"
-            line="638"
+            line="634"
             column="12"/>
     </issue>
 
diff --git a/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt b/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
index 7f5a337..1579cd7b 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
+++ b/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
@@ -25,9 +25,9 @@
 import androidx.fragment.app.FragmentManager
 import androidx.fragment.app.FragmentTransaction
 import androidx.fragment.app.TargetTracking
-import androidx.transition.test.R
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.testutils.runOnUiThreadRethrow
+import androidx.transition.test.R
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import java.lang.ref.WeakReference
@@ -43,27 +43,6 @@
 object Reordered : ReorderingAllowed()
 object Ordered : ReorderingAllowed()
 
-sealed class StateManager {
-    abstract fun setup()
-
-    override fun toString(): String = this.javaClass.simpleName
-
-    fun teardown() {
-        // Reset it back to the default
-        FragmentManager.enableNewStateManager(true)
-    }
-}
-object NewStateManager : StateManager() {
-    override fun setup() {
-        FragmentManager.enableNewStateManager(true)
-    }
-}
-object OldStateManager : StateManager() {
-    override fun setup() {
-        FragmentManager.enableNewStateManager(false)
-    }
-}
-
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<out FragmentActivity>.executePendingTransactions(
     fm: FragmentManager = activity.supportFragmentManager
diff --git a/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt b/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
index c45abaf..db5d385 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
+++ b/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
@@ -15,7 +15,6 @@
  */
 package androidx.transition
 
-import android.graphics.Rect
 import android.os.Build
 import android.os.Bundle
 import android.view.View
@@ -50,8 +49,7 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
 class FragmentTransitionTest(
-    private val reorderingAllowed: ReorderingAllowed,
-    private val stateManager: StateManager
+    private val reorderingAllowed: ReorderingAllowed
 ) {
 
     @Suppress("DEPRECATION")
@@ -68,7 +66,6 @@
 
     @Before
     fun setup() {
-        stateManager.setup()
         onBackStackChangedTimes = 0
         fragmentManager = activityRule.activity.supportFragmentManager
         fragmentManager.addOnBackStackChangedListener(onBackStackChangedListener)
@@ -77,7 +74,6 @@
     @After
     fun teardown() {
         fragmentManager.removeOnBackStackChangedListener(onBackStackChangedListener)
-        stateManager.teardown()
     }
 
     // Test that normal view transitions (enter, exit, reenter, return) run with
@@ -130,8 +126,6 @@
     fun removeThenAddBeforeTransitionFinishes() {
         // enter transition
         val fragment = setupInitialFragment()
-        val blue = activityRule.findBlue()
-        val green = activityRule.findGreen()
 
         val view1 = fragment.view
 
@@ -155,23 +149,10 @@
         // back stack
         if (reorderingAllowed is Reordered) {
             assertThat(onBackStackChangedTimes).isEqualTo(2)
-            assertThat(fragment.requireView()).isEqualTo(view1)
         } else {
             assertThat(onBackStackChangedTimes).isEqualTo(3)
-            if (stateManager is NewStateManager) {
-                // When using FragmentStateManager, the transition gets cancelled and the
-                // Fragment  does not go all the way through to destroying the view before
-                // coming back up, so the view instances will still match
-                assertThat(fragment.requireView()).isEqualTo(view1)
-            } else {
-                // If reorder is not allowed we will get the exit Transition
-                fragment.waitForTransition()
-                fragment.exitTransition.verifyAndClearTransition {
-                    exitingViews += listOf(green, blue)
-                }
-                assertThat(fragment.requireView()).isNotEqualTo(view1)
-            }
         }
+        assertThat(fragment.requireView()).isEqualTo(view1)
         verifyNoOtherTransitions(fragment)
     }
     @Test
@@ -860,7 +841,6 @@
 
         val startBlue = activityRule.findBlue()
         val startGreen = activityRule.findGreen()
-        val startBlueBounds = startBlue.boundsOnScreen
 
         fragmentManager.beginTransaction()
             .addSharedElement(startBlue, "fooSquare")
@@ -876,21 +856,8 @@
         val endBlue = activityRule.findBlue()
         val endGreen = activityRule.findGreen()
 
-        // FragmentStateManager is able to build the correct transition
-        // whether you use reordering or not
-        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
-            fragment1.exitTransition.verifyAndClearTransition {
-                exitingViews += listOf(startGreen, startBlue)
-            }
-        } else {
-            fragment1.exitTransition.verifyAndClearTransition {
-                epicenter = startBlueBounds
-                exitingViews += startGreen
-            }
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startBlueBounds
-                exitingViews += startBlue
-            }
+        fragment1.exitTransition.verifyAndClearTransition {
+            exitingViews += listOf(startGreen, startBlue)
         }
         verifyNoOtherTransitions(fragment1)
 
@@ -1030,16 +997,10 @@
         if (reorderingAllowed is Reordered) {
             // reordering allowed fragment3 to get a transition so we should wait for it to finish
             fragment3.waitForTransition()
-            if (stateManager is NewStateManager) {
-                // When using the NewStateManager, the last operation sets the direction.
-                // In this case, the forward direction since we did a replace() after the pop
-                fragment2.exitTransition.verifyAndClearTransition {
-                    exitingViews += listOf(midGreen, midBlue)
-                }
-            } else {
-                fragment2.returnTransition.verifyAndClearTransition {
-                    exitingViews += listOf(midGreen, midBlue)
-                }
+            // The last operation (in this case a replace()) sets the direction of
+            // the transition, so the popped fragment runs its exit transition
+            fragment2.exitTransition.verifyAndClearTransition {
+                exitingViews += listOf(midGreen, midBlue)
             }
             val endGreen = activityRule.findGreen()
             val endBlue = activityRule.findBlue()
@@ -1094,30 +1055,18 @@
             val endGreen = activityRule.findGreen()
             val endBlue = activityRule.findBlue()
             val endGreenBounds = endGreen.boundsOnScreen
-
-            if (stateManager is NewStateManager) {
-                // When using the NewStateManager, the last operation sets the direction.
-                // In this case, the forward direction since we did a replace() after the pop
-                fragment1.exitTransition.verifyAndClearTransition {
-                    epicenter = endGreenBounds
-                    exitingViews += startGreen
-                }
-            } else {
-                fragment1.returnTransition.verifyAndClearTransition {
-                    exitingViews += startGreen
-                }
+            // The last operation (in this case a replace()) sets the direction of
+            // the transition, so the popped fragment runs its exit transition
+            fragment1.exitTransition.verifyAndClearTransition {
+                epicenter = endGreenBounds
+                exitingViews += startGreen
             }
             fragment2.enterTransition.verifyAndClearTransition {
                 epicenter = startGreenBounds
                 enteringViews += endGreen
             }
             fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = if (stateManager is NewStateManager) {
-                    endGreenBounds
-                } else {
-                    // In this case, we can't find an epicenter
-                    Rect()
-                }
+                epicenter = endGreenBounds
                 exitingViews += startBlue
                 enteringViews += endBlue
             }
@@ -1156,20 +1105,10 @@
         val midRed = activityRule.findRed()
         val midGreenBounds = midGreen.boundsOnScreen
 
-        // FragmentStateManager is able to build the correct transition
-        // whether you use reordering or not
-        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startGreenBounds
-                exitingViews += startGreen
-                enteringViews += midGreen
-            }
-        } else {
-            fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = startGreenBounds
-                exitingViews += listOf(startGreen, startBlue)
-                enteringViews += midGreen
-            }
+        fragment2.sharedElementEnter.verifyAndClearTransition {
+            epicenter = startGreenBounds
+            exitingViews += startGreen
+            enteringViews += midGreen
         }
         fragment2.enterTransition.verifyAndClearTransition {
             epicenter = midGreenBounds
@@ -1535,18 +1474,8 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
-        fun data() = mutableListOf<Array<Any>>().apply {
-            arrayOf(
-                Ordered,
-                Reordered
-            ).forEach { ordering ->
-                // Run the test with the new state manager
-                add(arrayOf(ordering, NewStateManager))
-                // Run the test with the old state manager
-                add(arrayOf(ordering, OldStateManager))
-            }
-        }
+        @Parameterized.Parameters(name = "ordering={0}")
+        fun data() = arrayOf(Ordered, Reordered)
     }
 }
 
diff --git a/transition/transition/src/androidTest/java/androidx/transition/MultipleRootsTest.java b/transition/transition/src/androidTest/java/androidx/transition/MultipleRootsTest.java
new file mode 100644
index 0000000..131351b
--- /dev/null
+++ b/transition/transition/src/androidTest/java/androidx/transition/MultipleRootsTest.java
@@ -0,0 +1,280 @@
+/*
+ * 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.transition;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.annotation.NonNull;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+import androidx.transition.test.R;
+
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class MultipleRootsTest {
+
+    static class Views {
+        LinearLayout mColumn;
+        LinearLayout mRow1;
+        LinearLayout mRow2;
+        View mRed;
+        View mGreen;
+        View mBlue;
+    }
+
+    private ActivityScenario<TransitionActivity> prepareScenario(final Views views) {
+        final ActivityScenario<TransitionActivity> scenario =
+                ActivityScenario.launch(TransitionActivity.class);
+
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                final ViewGroup root = activity.getRoot();
+
+                final LayoutInflater layoutInflater = activity.getLayoutInflater();
+                final View layout = layoutInflater.inflate(R.layout.multiple_roots, root, false);
+                root.addView(
+                        layout,
+                        LinearLayout.LayoutParams.MATCH_PARENT,
+                        LinearLayout.LayoutParams.MATCH_PARENT
+                );
+            }
+        });
+
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                views.mColumn = activity.findViewById(R.id.column);
+                views.mRow1 = activity.findViewById(R.id.row_1);
+                views.mRow2 = activity.findViewById(R.id.row_2);
+                views.mRed = activity.findViewById(R.id.red);
+                views.mGreen = activity.findViewById(R.id.green);
+                views.mBlue = activity.findViewById(R.id.blue);
+
+                assertThat(views.mColumn).isNotNull();
+                assertThat(views.mRow1).isNotNull();
+                assertThat(views.mRow2).isNotNull();
+                assertThat(views.mRed).isNotNull();
+                assertThat(views.mGreen).isNotNull();
+                assertThat(views.mBlue).isNotNull();
+            }
+        });
+
+        return scenario;
+    }
+
+    @Test
+    public void nested_innerFirst() {
+        final Views views = new Views();
+        final ActivityScenario<TransitionActivity> scenario = prepareScenario(views);
+
+        final Transition.TransitionListener innerListener =
+                mock(Transition.TransitionListener.class);
+        final Transition.TransitionListener outerListener =
+                mock(Transition.TransitionListener.class);
+
+        final Fade innerTransition = new Fade();
+        innerTransition.setDuration(300);
+        innerTransition.addListener(innerListener);
+        final Fade outerTransition = new Fade();
+        outerTransition.setDuration(50);
+        outerTransition.addListener(outerListener);
+
+        // Run a transition on the inner ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mRow1, innerTransition);
+                views.mRed.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(innerListener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        // Run a transition on the outer ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mColumn, outerTransition);
+                views.mBlue.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(outerListener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        verify(innerListener, timeout(3000)).onTransitionEnd(any(Transition.class));
+        verify(outerListener, timeout(3000)).onTransitionEnd(any(Transition.class));
+
+        scenario.close();
+    }
+
+    @Test
+    public void nested_outerFirst() {
+        final Views views = new Views();
+        final ActivityScenario<TransitionActivity> scenario = prepareScenario(views);
+
+        final Transition.TransitionListener innerListener =
+                mock(Transition.TransitionListener.class);
+        final Transition.TransitionListener outerListener =
+                mock(Transition.TransitionListener.class);
+
+        final Fade outerTransition = new Fade();
+        outerTransition.setDuration(300);
+        outerTransition.addListener(outerListener);
+        final Fade innerTransition = new Fade();
+        innerTransition.setDuration(50);
+        innerTransition.addListener(innerListener);
+
+        // Run a transition on the outer ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mColumn, outerTransition);
+                views.mBlue.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(outerListener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        // Run a transition on the inner ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mRow1, innerTransition);
+                views.mRed.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(innerListener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        verify(innerListener, timeout(3000)).onTransitionEnd(any(Transition.class));
+        verify(outerListener, timeout(3000)).onTransitionEnd(any(Transition.class));
+
+        scenario.close();
+    }
+
+    @Test
+    public void adjacent() {
+        final Views views = new Views();
+        final ActivityScenario<TransitionActivity> scenario = prepareScenario(views);
+
+        final Transition.TransitionListener row1Listener =
+                mock(Transition.TransitionListener.class);
+        final Transition.TransitionListener row2Listener =
+                mock(Transition.TransitionListener.class);
+
+        final Fade row1Transition = new Fade();
+        row1Transition.setDuration(300);
+        row1Transition.addListener(row1Listener);
+        final Fade row2Transition = new Fade();
+        row2Transition.setDuration(50);
+        row2Transition.addListener(row2Listener);
+
+        // Run a transition on the first ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mRow1, row1Transition);
+                views.mRed.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(row1Listener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        // Run a transition on the second ViewGroup.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mRow2, row2Transition);
+                views.mBlue.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(row2Listener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        verify(row2Listener, timeout(3000)).onTransitionEnd(any(Transition.class));
+        verify(row1Listener, timeout(3000)).onTransitionEnd(any(Transition.class));
+
+        scenario.close();
+    }
+
+    @Test
+    public void adjacent_subsequence() {
+        final Views views = new Views();
+        final ActivityScenario<TransitionActivity> scenario = prepareScenario(views);
+
+        // For Row 1, we run a subsequent transition at the end of the first transition.
+        final Transition.TransitionListener row1SecondListener =
+                mock(Transition.TransitionListener.class);
+        final Fade row1SecondTransition = new Fade();
+        row1SecondTransition.setDuration(250);
+        row1SecondTransition.addListener(row1SecondListener);
+
+        // The first transition for row 1.
+        final Fade row1FirstTransition = new Fade();
+        row1FirstTransition.setDuration(150);
+        final Transition.TransitionListener row2FirstListener = new TransitionListenerAdapter() {
+            @Override
+            public void onTransitionEnd(@NonNull @NotNull Transition transition) {
+                TransitionManager.beginDelayedTransition(views.mRow1, row1SecondTransition);
+                views.mRed.setVisibility(View.VISIBLE);
+            }
+        };
+        row1FirstTransition.addListener(row2FirstListener);
+
+        // Only one transition for row 2.
+        final Transition.TransitionListener row2Listener =
+                mock(Transition.TransitionListener.class);
+        final Slide row2Transition = new Slide();
+        row2Transition.setDuration(300);
+        row2Transition.addListener(row2Listener);
+
+        // Run the transitions at the same time.
+        scenario.onActivity(new ActivityScenario.ActivityAction<TransitionActivity>() {
+            @Override
+            public void perform(TransitionActivity activity) {
+                TransitionManager.beginDelayedTransition(views.mRow1, row1FirstTransition);
+                views.mRed.setVisibility(View.INVISIBLE);
+                TransitionManager.beginDelayedTransition(views.mRow2, row2Transition);
+                views.mBlue.setVisibility(View.INVISIBLE);
+            }
+        });
+
+        verify(row1SecondListener, timeout(3000)).onTransitionStart(any(Transition.class));
+        verify(row2Listener, timeout(3000)).onTransitionStart(any(Transition.class));
+
+        verify(row1SecondListener, timeout(3000)).onTransitionEnd(any(Transition.class));
+        verify(row2Listener, timeout(3000)).onTransitionEnd(any(Transition.class));
+
+        scenario.close();
+    }
+}
diff --git a/transition/transition/src/androidTest/res/layout/multiple_roots.xml b/transition/transition/src/androidTest/res/layout/multiple_roots.xml
new file mode 100644
index 0000000..0a61952
--- /dev/null
+++ b/transition/transition/src/androidTest/res/layout/multiple_roots.xml
@@ -0,0 +1,56 @@
+<?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:id="@+id/column"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/row_1"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <View
+            android:id="@+id/red"
+            android:layout_width="64dp"
+            android:layout_height="64dp"
+            android:background="#f00"
+            android:orientation="horizontal" />
+
+        <View
+            android:id="@+id/green"
+            android:layout_width="64dp"
+            android:layout_height="64dp"
+            android:background="#0f0" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/row_2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <View
+            android:id="@+id/blue"
+            android:layout_width="64dp"
+            android:layout_height="64dp"
+            android:background="#00f" />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/transition/transition/src/androidTest/res/values/strings.xml b/transition/transition/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from transition/transition/src/androidTest/res/values/strings.xml
rename to transition/transition/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/transition/transition/src/main/java/androidx/transition/Transition.java b/transition/transition/src/main/java/androidx/transition/Transition.java
index 2760b78..70a455d 100644
--- a/transition/transition/src/main/java/androidx/transition/Transition.java
+++ b/transition/transition/src/main/java/androidx/transition/Transition.java
@@ -1711,15 +1711,10 @@
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public void pause(View sceneRoot) {
         if (!mEnded) {
-            ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
-            int numOldAnims = runningAnimators.size();
-            WindowIdImpl windowId = ViewUtils.getWindowId(sceneRoot);
-            for (int i = numOldAnims - 1; i >= 0; i--) {
-                AnimationInfo info = runningAnimators.valueAt(i);
-                if (info.mView != null && windowId.equals(info.mWindowId)) {
-                    Animator anim = runningAnimators.keyAt(i);
-                    AnimatorUtils.pause(anim);
-                }
+            int numAnimators = mCurrentAnimators.size();
+            for (int i = numAnimators - 1; i >= 0; i--) {
+                Animator animator = mCurrentAnimators.get(i);
+                AnimatorUtils.pause(animator);
             }
             if (mListeners != null && mListeners.size() > 0) {
                 @SuppressWarnings("unchecked") ArrayList<TransitionListener> tmpListeners =
@@ -1744,15 +1739,10 @@
     public void resume(View sceneRoot) {
         if (mPaused) {
             if (!mEnded) {
-                ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
-                int numOldAnims = runningAnimators.size();
-                WindowIdImpl windowId = ViewUtils.getWindowId(sceneRoot);
-                for (int i = numOldAnims - 1; i >= 0; i--) {
-                    AnimationInfo info = runningAnimators.valueAt(i);
-                    if (info.mView != null && windowId.equals(info.mWindowId)) {
-                        Animator anim = runningAnimators.keyAt(i);
-                        AnimatorUtils.resume(anim);
-                    }
+                int numAnimators = mCurrentAnimators.size();
+                for (int i = numAnimators - 1; i >= 0; i--) {
+                    Animator animator = mCurrentAnimators.get(i);
+                    AnimatorUtils.resume(animator);
                 }
                 if (mListeners != null && mListeners.size() > 0) {
                     @SuppressWarnings("unchecked") ArrayList<TransitionListener> tmpListeners =
diff --git a/tv-provider/tv-provider/lint-baseline.xml b/tv-provider/tv-provider/lint-baseline.xml
index 6cc188e..d9c3813b 100644
--- a/tv-provider/tv-provider/lint-baseline.xml
+++ b/tv-provider/tv-provider/lint-baseline.xml
@@ -1,20 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class with non private constructor"
-        errorLine1="public class ChannelLogoUtils {"
-        errorLine2="             ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/ChannelLogoUtils.java"
-            line="42"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TvContract.buildRecordedProgramUri(recordedProgramId);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TvContract.isChannelUri(uri);"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
@@ -35,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TvContract.isChannelUriForTunerInput(uri);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TvContract.isChannelUriForPassthroughInput(uri);"
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return TvContract.isProgramUri(uri);"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
@@ -68,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.tvprovider.media.tv.TvContractCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.tvprovider.media.tv.TvContractCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            TvContract.requestChannelBrowsable(context, channelId);"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -79,6 +68,17 @@
     </issue>
 
     <issue
+        id="PrivateConstructorForUtilityClass"
+        message="Utility class with non private constructor"
+        errorLine1="public class ChannelLogoUtils {"
+        errorLine2="             ~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/tvprovider/media/tv/ChannelLogoUtils.java"
+            line="43"
+            column="14"/>
+    </issue>
+
+    <issue
         id="UnknownNullness"
         message="Unknown 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 getInternalProviderId() {"
@@ -2259,17 +2259,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 Bitmap loadChannelLogo(@NonNull Context context, long channelId) {"
-        errorLine2="                  ~~~~~~">
-        <location
-            file="src/main/java/androidx/tvprovider/media/tv/ChannelLogoUtils.java"
-            line="155"
-            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 &lt;T> T[] concatAll(T[] first, T[]... rest) {"
         errorLine2="                      ~~~">
         <location
@@ -2725,7 +2714,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java"
-            line="191"
+            line="192"
             column="12"/>
     </issue>
 
@@ -2736,7 +2725,7 @@
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/tvprovider/media/tv/PreviewChannelHelper.java"
-            line="349"
+            line="350"
             column="15"/>
     </issue>
 
diff --git a/ui/ui-animation-tooling-internal/api/1.0.0-beta06.txt b/ui/ui-animation-tooling-internal/api/1.0.0-beta06.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/1.0.0-beta06.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/ui/ui-animation-tooling-internal/api/1.0.0-beta07.txt b/ui/ui-animation-tooling-internal/api/1.0.0-beta07.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/1.0.0-beta07.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta06.txt b/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta06.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta06.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta07.txt b/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta07.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/public_plus_experimental_1.0.0-beta07.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta06.txt b/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta06.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta06.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta07.txt b/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta07.txt
new file mode 100644
index 0000000..f54cae5f
--- /dev/null
+++ b/ui/ui-animation-tooling-internal/api/restricted_1.0.0-beta07.txt
@@ -0,0 +1,32 @@
+// 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 TRANSITION_ANIMATION;
+  }
+
+}
+
diff --git a/vectordrawable/integration-tests/testapp/lint-baseline.xml b/vectordrawable/integration-tests/testapp/lint-baseline.xml
index 29609c1..b41ff71 100644
--- a/vectordrawable/integration-tests/testapp/lint-baseline.xml
+++ b/vectordrawable/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="NewApi"
@@ -337,7 +337,7 @@
         errorLine1="    &lt;string name=&quot;triangle&quot;> &quot;M300,70 l 0,-70 70,70 0,0   -70,70z&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="20"
             column="13"/>
     </issue>
@@ -348,7 +348,7 @@
         errorLine1="    &lt;string name=&quot;rectangle&quot;>&quot;M300,70 l 0,-70 70,0  0,140 -70,0 z&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="21"
             column="13"/>
     </issue>
@@ -359,7 +359,7 @@
         errorLine1="    &lt;string name=&quot;rectangle2&quot;>&quot;M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="22"
             column="13"/>
     </issue>
@@ -370,7 +370,7 @@
         errorLine1="    &lt;string name=&quot;equal2&quot;>    &quot;M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="23"
             column="13"/>
     </issue>
@@ -381,7 +381,7 @@
         errorLine1="    &lt;string name=&quot;round_box&quot;>&quot;m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="24"
             column="13"/>
     </issue>
@@ -392,7 +392,7 @@
         errorLine1="    &lt;string name=&quot;heart&quot;>    &quot;m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5&quot;&lt;/string>"
         errorLine2="            ~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
+            file="src/main/res/values/donottranslate-strings.xml"
             line="25"
             column="13"/>
     </issue>
diff --git a/vectordrawable/integration-tests/testapp/src/main/res/values/strings.xml b/vectordrawable/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from vectordrawable/integration-tests/testapp/src/main/res/values/strings.xml
rename to vectordrawable/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/vectordrawable/vectordrawable-animated/build.gradle b/vectordrawable/vectordrawable-animated/build.gradle
index 57a3bf7..e0a2582 100644
--- a/vectordrawable/vectordrawable-animated/build.gradle
+++ b/vectordrawable/vectordrawable-animated/build.gradle
@@ -17,23 +17,17 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     defaultConfig {
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
-
     aaptOptions {
         additionalParameters("--no-version-vectors")
     }
-
     buildTypes.all {
         consumerProguardFiles("proguard-rules.pro")
     }
diff --git a/vectordrawable/vectordrawable-animated/lint-baseline.xml b/vectordrawable/vectordrawable-animated/lint-baseline.xml
index 22e3467..dae6dac 100644
--- a/vectordrawable/vectordrawable-animated/lint-baseline.xml
+++ b/vectordrawable/vectordrawable-animated/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return dr.unregisterAnimationCallback(callback.getPlatformCallback());"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        avd.registerAnimationCallback(callback.getPlatformCallback());"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((AnimatedVectorDrawable) mDelegateDrawable).clearAnimationCallbacks();"
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            ((AnimatedVectorDrawable) dr).clearAnimationCallbacks();"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/vectordrawable/vectordrawable-seekable/build.gradle b/vectordrawable/vectordrawable-seekable/build.gradle
index 7ac21aa..b40844f 100644
--- a/vectordrawable/vectordrawable-seekable/build.gradle
+++ b/vectordrawable/vectordrawable-seekable/build.gradle
@@ -18,7 +18,7 @@
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
     androidTestImplementation(TRUTH)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
     androidTestImplementation(project(":core:core-animation-testing"))
 }
 
diff --git a/vectordrawable/vectordrawable-seekable/lint-baseline.xml b/vectordrawable/vectordrawable-seekable/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/vectordrawable/vectordrawable-seekable/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/vectordrawable/vectordrawable/build.gradle b/vectordrawable/vectordrawable/build.gradle
index 0e0aaf1..9805e43 100644
--- a/vectordrawable/vectordrawable/build.gradle
+++ b/vectordrawable/vectordrawable/build.gradle
@@ -20,15 +20,10 @@
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     defaultConfig {
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
-
     aaptOptions {
         additionalParameters "--no-version-vectors"
     }
diff --git a/vectordrawable/vectordrawable/lint-baseline.xml b/vectordrawable/vectordrawable/lint-baseline.xml
index 51c5fb4..cebac91 100644
--- a/vectordrawable/vectordrawable/lint-baseline.xml
+++ b/vectordrawable/vectordrawable/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="LambdaLast"
diff --git a/vectordrawable/vectordrawable/src/androidTest/res/values/strings.xml b/vectordrawable/vectordrawable/src/androidTest/res/values/donottranslate-strings.xml
similarity index 100%
rename from vectordrawable/vectordrawable/src/androidTest/res/values/strings.xml
rename to vectordrawable/vectordrawable/src/androidTest/res/values/donottranslate-strings.xml
diff --git a/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml b/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
index bc94e91..0a058be 100644
--- a/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
+++ b/versionedparcelable/versionedparcelable-compiler/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/versionedparcelable/versionedparcelable/build.gradle b/versionedparcelable/versionedparcelable/build.gradle
index f4fd9d2..0358e3f 100644
--- a/versionedparcelable/versionedparcelable/build.gradle
+++ b/versionedparcelable/versionedparcelable/build.gradle
@@ -32,17 +32,13 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
     androidTestImplementation(TRUTH)
     androidTestAnnotationProcessor project(":versionedparcelable:versionedparcelable-compiler")
 }
 
 android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/versionedparcelable/versionedparcelable/lint-baseline.xml b/versionedparcelable/versionedparcelable/lint-baseline.xml
index 61f84f7..92eccb0 100644
--- a/versionedparcelable/versionedparcelable/lint-baseline.xml
+++ b/versionedparcelable/versionedparcelable/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -8,7 +8,7 @@
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="1567"
+            line="1615"
             column="24"/>
     </issue>
 
@@ -19,84 +19,85 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="1592"
+            line="1642"
             column="13"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            writeInt(val.getWidth());"
         errorLine2="                         ~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="518"
+            line="537"
             column="26"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            writeInt(val.getHeight());"
         errorLine2="                         ~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="519"
+            line="538"
             column="26"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            writeFloat(val.getWidth());"
         errorLine2="                           ~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="532"
+            line="551"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            writeFloat(val.getHeight());"
         errorLine2="                           ~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="533"
+            line="552"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new Size(width, height);"
         errorLine2="                   ~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="1263"
+            line="1291"
             column="20"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.versionedparcelable.VersionedParcel is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.versionedparcelable.VersionedParcel is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return new SizeF(width, height);"
         errorLine2="                   ~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="1279"
+            line="1308"
             column="20"/>
     </issue>
 
     <issue
         id="LambdaLast"
         message="Functional interface parameters (such as parameter 1, &quot;val&quot;, in androidx.versionedparcelable.VersionedParcel.writeStrongInterface) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
-        errorLine1="    public void writeStrongInterface(IInterface val, int fieldId) {"
-        errorLine2="                                                     ~~~~~~~~~~~">
+        errorLine1="    public void writeStrongInterface(@Nullable IInterface val, int fieldId) {"
+        errorLine2="                                                               ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/versionedparcelable/VersionedParcel.java"
-            line="276"
-            column="54"/>
+            line="290"
+            column="64"/>
     </issue>
-</issues>
\ No newline at end of file
+
+</issues>
diff --git a/viewpager/viewpager/build.gradle b/viewpager/viewpager/build.gradle
index 7194986..5665f87 100644
--- a/viewpager/viewpager/build.gradle
+++ b/viewpager/viewpager/build.gradle
@@ -8,13 +8,6 @@
     id("com.android.library")
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-}
-
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.core:core:1.3.0-beta01")
@@ -24,9 +17,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 }
 
 androidx {
diff --git a/viewpager/viewpager/lint-baseline.xml b/viewpager/viewpager/lint-baseline.xml
index 85e4788..90974b3 100644
--- a/viewpager/viewpager/lint-baseline.xml
+++ b/viewpager/viewpager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="LambdaLast"
diff --git a/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java b/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
index 76b4a6b..1e1e827 100644
--- a/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
+++ b/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
@@ -2441,7 +2441,7 @@
 
                 canvas.rotate(270);
                 canvas.translate(-height + getPaddingTop(), mFirstOffset * width);
-                mLeftEdge.setSize(height, width);
+                mLeftEdge.setSize(/* width= */height, /* height= */width);
                 needsInvalidate |= mLeftEdge.draw(canvas);
                 canvas.restoreToCount(restoreCount);
             }
@@ -2452,7 +2452,7 @@
 
                 canvas.rotate(90);
                 canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width);
-                mRightEdge.setSize(height, width);
+                mRightEdge.setSize(/* width= */height, /* height= */width);
                 needsInvalidate |= mRightEdge.draw(canvas);
                 canvas.restoreToCount(restoreCount);
             }
diff --git a/viewpager2/integration-tests/testapp/build.gradle b/viewpager2/integration-tests/testapp/build.gradle
index 49792b8..676d328 100644
--- a/viewpager2/integration-tests/testapp/build.gradle
+++ b/viewpager2/integration-tests/testapp/build.gradle
@@ -36,7 +36,7 @@
 dependencies {
     api(KOTLIN_STDLIB)
     implementation(project(":viewpager2:viewpager2"))
-    implementation("androidx.activity:activity-ktx:1.1.0")
+    implementation("androidx.activity:activity-ktx:1.2.0")
     implementation(MATERIAL) {
         exclude group: "androidx.viewpager2", module: "viewpager2"
     }
diff --git a/viewpager2/integration-tests/testapp/lint-baseline.xml b/viewpager2/integration-tests/testapp/lint-baseline.xml
index 84332bc..4a9e0bef 100644
--- a/viewpager2/integration-tests/testapp/lint-baseline.xml
+++ b/viewpager2/integration-tests/testapp/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class null is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        textDirection = View.TEXT_DIRECTION_LOCALE"
         errorLine2="                        ~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class null is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 17; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        textDirection = View.TEXT_DIRECTION_LOCALE"
         errorLine2="                        ~~~~~~~~~~~~~">
         <location
diff --git a/viewpager2/integration-tests/testapp/src/main/res/values/strings.xml b/viewpager2/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from viewpager2/integration-tests/testapp/src/main/res/values/strings.xml
rename to viewpager2/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/viewpager2/viewpager2/build.gradle b/viewpager2/viewpager2/build.gradle
index 313262f..8ac831b 100644
--- a/viewpager2/viewpager2/build.gradle
+++ b/viewpager2/viewpager2/build.gradle
@@ -36,9 +36,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(project(":internal-testutils-espresso"))
     androidTestImplementation(project(":internal-testutils-appcompat"), {
         exclude group: "androidx.viewpager2", module: "viewpager2"
@@ -51,16 +51,6 @@
     androidTestImplementation(KOTLIN_STDLIB)
 }
 
-android {
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-    defaultConfig {
-        minSdkVersion 14
-    }
-}
-
 androidx {
     name = "AndroidX Widget ViewPager2"
     publish = Publish.SNAPSHOT_AND_RELEASE
diff --git a/viewpager2/viewpager2/lint-baseline.xml b/viewpager2/viewpager2/lint-baseline.xml
index f98e079..1056cc1 100644
--- a/viewpager2/viewpager2/lint-baseline.xml
+++ b/viewpager2/viewpager2/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
         errorLine2="        ~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.viewpager2.widget.ViewPager2.SavedState is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.viewpager2.widget.ViewPager2.SavedState is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            super(source, loader);"
         errorLine2="            ~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (applied.isConsumed()) {"
         errorLine2="                    ~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mRecyclerView.getChildAt(i).dispatchApplyWindowInsets(new WindowInsets(applied));"
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mRecyclerView.getChildAt(i).dispatchApplyWindowInsets(new WindowInsets(applied));"
         errorLine2="                                                                  ~~~~~~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 20, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 20. Either annotate the containing class with at least @RequiresApi(20) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(20)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 20; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return insets.consumeSystemWindowInsets().consumeStableInsets();"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.viewpager2.widget.ViewPager2 is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.viewpager2.widget.ViewPager2 is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return insets.consumeSystemWindowInsets().consumeStableInsets();"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/wear/compose/foundation/build.gradle b/wear/compose/foundation/build.gradle
new file mode 100644
index 0000000..ad3829e
--- /dev/null
+++ b/wear/compose/foundation/build.gradle
@@ -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.
+ */
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+import androidx.build.RunApiTasks
+import androidx.build.AndroidXUiPlugin
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project, false)
+
+dependencies {
+    kotlinPlugin(project(":compose:compiler:compiler"))
+
+    implementation(KOTLIN_STDLIB)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 25
+    }
+    buildTypes.all {
+        consumerProguardFiles "proguard-rules.pro"
+    }
+    // Use Robolectric 4.+
+    testOptions.unitTests.includeAndroidResources = true
+}
+
+androidx {
+    name = "Android Wear Compose Foundation"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.WEAR_COMPOSE
+    mavenVersion = LibraryVersions.WEAR_COMPOSE
+    inceptionYear = "2021"
+    description = "WearOS Compose Foundation Library. This library makes it easier for developers" +
+            "to write Jetpack Compose applications for Wearable devices by providing " +
+            "functionality to support wearable specific devices sizes, shapes and navigation " +
+            "gestures. It builds upon the Jetpack Compose libraries."
+    targetsJavaConsumers = false
+    runApiTasks = new RunApiTasks.No("API tracking disabled while the package is empty")
+}
diff --git a/wear/compose/foundation/src/androidMain/AndroidManifest.xml b/wear/compose/foundation/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..55fe1cd
--- /dev/null
+++ b/wear/compose/foundation/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest package="androidx.wear.compose.foundation" />
diff --git a/wear/compose/material/build.gradle b/wear/compose/material/build.gradle
new file mode 100644
index 0000000..62cbb74
--- /dev/null
+++ b/wear/compose/material/build.gradle
@@ -0,0 +1,68 @@
+/*
+ * 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.LibraryType
+import androidx.build.LibraryVersions
+import androidx.build.RunApiTasks
+import androidx.build.AndroidXUiPlugin
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXUiPlugin")
+    id("org.jetbrains.kotlin.android")
+}
+
+AndroidXUiPlugin.applyAndConfigureKotlinPlugin(project, false)
+
+dependencies {
+    kotlinPlugin(project(":compose:compiler:compiler"))
+
+    api(project(":compose:foundation:foundation"))
+    api(project(":compose:ui:ui"))
+    api(project(":compose:ui:ui-text"))
+    api(project(":compose:runtime:runtime"))
+
+    implementation(KOTLIN_STDLIB)
+    implementation(project(":compose:material:material"))
+    implementation(project(":compose:material:material-ripple"))
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 25
+    }
+    buildTypes.all {
+        consumerProguardFiles "proguard-rules.pro"
+    }
+    // Use Robolectric 4.+
+    testOptions.unitTests.includeAndroidResources = true
+}
+
+androidx {
+    name = "Android Wear Compose Material"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.WEAR_COMPOSE
+    mavenVersion = LibraryVersions.WEAR_COMPOSE
+    inceptionYear = "2021"
+    description = "WearOS Compose Material Library. This library makes it easier for developers " +
+            "to write Jetpack Compose applications for Wearable devices that implement Wear " +
+            "Material Design UX guidelines and specifications. It builds upon the Jetpack Compose" +
+            " libraries."
+    targetsJavaConsumers = false
+    runApiTasks = new RunApiTasks.No("API tracking disabled while the package is empty")
+}
diff --git a/wear/compose/material/src/androidMain/AndroidManifest.xml b/wear/compose/material/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..bcb362e
--- /dev/null
+++ b/wear/compose/material/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2021 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<manifest package="androidx.wear.compose.material" />
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Colors.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Colors.kt
new file mode 100644
index 0000000..892fed5
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Colors.kt
@@ -0,0 +1,170 @@
+/*
+ * 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.Composable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.takeOrElse
+
+@Stable
+public class Colors(
+    primary: Color = Color(0xFFAECBFA),
+    primaryVariant: Color = Color(0xFF669DF6),
+    secondary: Color = Color(0xFFFDE293),
+    secondaryVariant: Color = Color(0xFF594F33),
+    error: Color = Color(0xFFEE675C),
+) {
+    public var primary: Color by mutableStateOf(primary, structuralEqualityPolicy())
+        internal set
+    public var primaryVariant: Color by mutableStateOf(primaryVariant, structuralEqualityPolicy())
+        internal set
+    public var secondary: Color by mutableStateOf(secondary, structuralEqualityPolicy())
+        internal set
+    public var secondaryVariant: Color by mutableStateOf(
+        secondaryVariant,
+        structuralEqualityPolicy()
+    )
+        internal set
+    public val background: Color = Color.Black
+    public val surface: Color = Color(0xFF202124)
+    public var error: Color by mutableStateOf(error, structuralEqualityPolicy())
+        internal set
+    public val onPrimary: Color = Color(0xFF202124)
+    public val onSecondary: Color = Color(0xFF202124)
+    public val onBackground: Color = Color.White
+    public val onSurface: Color = Color.White
+    public val onSurfaceVariant: Color = Color(0xFFDADCE0)
+    public val onSurfaceVariant2: Color = Color(0xFFBDC1C6)
+    public val onError: Color = Color(0xFF202124)
+
+    /**
+     * Returns a copy of this Colors, optionally overriding some of the values.
+     */
+    public fun copy(
+        primary: Color = this.primary,
+        primaryVariant: Color = this.primaryVariant,
+        secondary: Color = this.secondary,
+        secondaryVariant: Color = this.secondaryVariant,
+        error: Color = this.error,
+    ): Colors = Colors(
+        primary,
+        primaryVariant,
+        secondary,
+        secondaryVariant,
+        error,
+    )
+
+    override fun toString(): String {
+        return "Colors(" +
+            "primary=$primary, " +
+            "primaryVariant=$primaryVariant, " +
+            "secondary=$secondary, " +
+            "secondaryVariant=$secondaryVariant, " +
+            "background=$background, " +
+            "surface=$surface, " +
+            "error=$error, " +
+            "onPrimary=$onPrimary, " +
+            "onSecondary=$onSecondary, " +
+            "onBackground=$onBackground, " +
+            "onSurface=$onSurface, " +
+            "onSurfaceVariant=$onSurfaceVariant, " +
+            "onSurfaceVariant2=$onSurfaceVariant2, " +
+            "onError=$onError" +
+            ")"
+    }
+}
+
+/**
+ * The Material color system contains pairs of colors that are typically used for the background
+ * and content color inside a component. For example, a [Button] typically uses `primary` for its
+ * background, and `onPrimary` for the color of its content (usually text or iconography).
+ *
+ * This function tries to match the provided [backgroundColor] to a 'background' color in this
+ * [Colors], and then will return the corresponding color used for content. For example, when
+ * [backgroundColor] is [Colors.primary], this will return [Colors.onPrimary].
+ *
+ * If [backgroundColor] does not match a background color in the theme, this will return
+ * [Color.Unspecified].
+ *
+ * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
+ * the theme's [Colors], then returns [Color.Unspecified].
+ *
+ * @see contentColorFor
+ */
+fun Colors.contentColorFor(backgroundColor: Color): Color {
+    return when (backgroundColor) {
+        primary -> onPrimary
+        primaryVariant -> onPrimary
+        secondary -> onSecondary
+        secondaryVariant -> onSecondary
+        background -> onBackground
+        surface -> onSurface
+        error -> onError
+        else -> Color.Unspecified
+    }
+}
+
+/**
+ * The Material color system contains pairs of colors that are typically used for the background
+ * and content color inside a component. For example, a [Button] typically uses `primary` for its
+ * background, and `onPrimary` for the color of its content (usually text or iconography).
+ *
+ * This function tries to match the provided [backgroundColor] to a 'background' color in this
+ * [Colors], and then will return the corresponding color used for content. For example, when
+ * [backgroundColor] is [Colors.primary], this will return [Colors.onPrimary].
+ *
+ * If [backgroundColor] does not match a background color in the theme, this will return
+ * the current value of [LocalContentColor] as a best-effort color.
+ *
+ * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
+ * the theme's [Colors], then returns the current value of [LocalContentColor].
+ *
+ * @see Colors.contentColorFor
+ */
+@Composable
+@ReadOnlyComposable
+public fun contentColorFor(backgroundColor: Color) =
+    MaterialTheme.colors.contentColorFor(backgroundColor).takeOrElse { LocalContentColor.current }
+
+/**
+ * Updates the internal values of the given [Colors] with values from the [other] [Colors]. This
+ * allows efficiently updating a subset of [Colors], without recomposing every composable that
+ * consumes values from [LocalColors].
+ *
+ * Because [Colors] is very wide-reaching, and used by many expensive composables in the
+ * hierarchy, providing a new value to [LocalColors] causes every composable consuming
+ * [LocalColors] to recompose, which is prohibitively expensive in cases such as animating one
+ * color in the theme. Instead, [Colors] is internally backed by [mutableStateOf], and this
+ * function mutates the internal state of [this] to match values in [other]. This means that any
+ * changes will mutate the internal state of [this], and only cause composables that are reading
+ * the specific changed value to recompose.
+ */
+internal fun Colors.updateColorsFrom(other: Colors) {
+    primary = other.primary
+    primaryVariant = other.primaryVariant
+    secondary = other.secondary
+    secondaryVariant = other.secondaryVariant
+    error = other.error
+}
+
+internal val LocalColors = staticCompositionLocalOf<Colors> { Colors() }
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentAlpha.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentAlpha.kt
new file mode 100644
index 0000000..fc29f92
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentAlpha.kt
@@ -0,0 +1,124 @@
+/*
+ * 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.Composable
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.ui.graphics.luminance
+
+/**
+ * Default alpha levels used by Material components.
+ *
+ * See [LocalContentAlpha].
+ */
+object ContentAlpha {
+    /**
+     * A high level of content alpha, used to represent high emphasis text such as input text in a
+     * selected [TextField].
+     */
+    val high: Float
+        @Composable
+        get() = contentAlpha(
+            highContrastAlpha = HighContrastContentAlpha.high,
+            lowContrastAlpha = LowContrastContentAlpha.high
+        )
+
+    /**
+     * A medium level of content alpha, used to represent medium emphasis text such as
+     * placeholder text in a [TextField].
+     */
+    val medium: Float
+        @Composable
+        get() = contentAlpha(
+            highContrastAlpha = HighContrastContentAlpha.medium,
+            lowContrastAlpha = LowContrastContentAlpha.medium
+        )
+
+    /**
+     * A low level of content alpha used to represent disabled components, such as text in a
+     * disabled [Button].
+     */
+    val disabled: Float
+        @Composable
+        get() = contentAlpha(
+            highContrastAlpha = HighContrastContentAlpha.disabled,
+            lowContrastAlpha = LowContrastContentAlpha.disabled
+        )
+
+    /**
+     * This default implementation uses separate alpha levels depending on the luminance of the
+     * incoming color, and whether the theme is light or dark. This is to ensure correct contrast
+     * and accessibility on all surfaces.
+     *
+     * See [HighContrastContentAlpha] and [LowContrastContentAlpha] for what the levels are
+     * used for, and under what circumstances.
+     */
+    @Composable
+    private fun contentAlpha(
+        /*@FloatRange(from = 0.0, to = 1.0)*/
+        highContrastAlpha: Float,
+        /*@FloatRange(from = 0.0, to = 1.0)*/
+        lowContrastAlpha: Float
+    ): Float {
+        val contentColor = LocalContentColor.current
+        return if (contentColor.luminance() < 0.5) highContrastAlpha else lowContrastAlpha
+    }
+}
+
+/**
+ * CompositionLocal containing the preferred content alpha for a given position in the hierarchy.
+ * This alpha is used for text and iconography ([Text] and [Icon]) to emphasize / de-emphasize
+ * different parts of a component. See the Material guide on
+ * [Text Legibility](https://material.io/design/color/text-legibility.html) for more information on
+ * alpha levels used by text and iconography.
+ *
+ * See [ContentAlpha] for the default levels used by most Material components.
+ *
+ * [MaterialTheme] sets this to [ContentAlpha.high] by default, as this is the default alpha for
+ * body text.
+ *
+ */
+val LocalContentAlpha = compositionLocalOf { 1f }
+
+/**
+ * Alpha levels for high luminance content in light theme, or low luminance content in dark theme.
+ *
+ * This content will typically be placed on colored surfaces, so it is important that the
+ * contrast here is higher to meet accessibility standards, and increase legibility.
+ *
+ * These levels are typically used for text / iconography in primary colored tabs /
+ * bottom navigation / etc.
+ */
+private object HighContrastContentAlpha {
+    const val high: Float = 1.00f
+    const val medium: Float = 0.74f
+    const val disabled: Float = 0.38f
+}
+
+/**
+ * Alpha levels for low luminance content in light theme, or high luminance content in dark theme.
+ *
+ * This content will typically be placed on grayscale surfaces, so the contrast here can be lower
+ * without sacrificing accessibility and legibility.
+ *
+ * These levels are typically used for body text on the main surface (white in light theme, grey
+ * in dark theme) and text / iconography in surface colored tabs / bottom navigation / etc.
+ */
+private object LowContrastContentAlpha {
+    const val high: Float = 0.87f
+    const val medium: Float = 0.60f
+    const val disabled: Float = 0.38f
+}
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentColor.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentColor.kt
new file mode 100644
index 0000000..a3d369b
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/ContentColor.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.wear.compose.material
+
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.ui.graphics.Color
+
+/**
+ * CompositionLocal containing the preferred content color for a given position in the hierarchy.
+ * This typically represents the `on` color for a color in [Colors]. For example, if the background
+ * color is [Colors.surface], this color is typically set to [Colors.onSurface].
+ *
+ * This color should be used for any typography / iconography, to ensure that the color of these
+ * adjusts when the background color changes. For example, on a dark background, text should be
+ * light, and on a light background, text should be dark.
+ *
+ * Defaults to [Color.White] if no color has been explicitly set.
+ */
+val LocalContentColor = compositionLocalOf { Color.White }
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTextSelectionColors.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTextSelectionColors.kt
new file mode 100644
index 0000000..2838258
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTextSelectionColors.kt
@@ -0,0 +1,239 @@
+/*
+ * 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.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.compositeOver
+import androidx.compose.ui.graphics.luminance
+import androidx.compose.ui.graphics.takeOrElse
+import androidx.compose.foundation.text.selection.TextSelectionColors
+import kotlin.math.max
+import kotlin.math.min
+
+/**
+ * Remembers a [TextSelectionColors] based on [colors]. The handle color will be [Colors.primary]
+ * and the background color will be [Colors.primary] with alpha applied.
+ *
+ * See [calculateSelectionBackgroundColor].
+ */
+@Composable
+internal fun rememberTextSelectionColors(colors: Colors): TextSelectionColors {
+    val primaryColor = colors.primary
+    val backgroundColor = colors.background
+    // Test with ContentAlpha.medium to ensure that the selection background is accessible in the
+    // 'worst case' scenario. We explicitly don't test with ContentAlpha.disabled, as disabled
+    // text shouldn't be selectable / is noted as disabled for accessibility purposes.
+    val textColorWithLowestAlpha = colors.contentColorFor(backgroundColor)
+        .takeOrElse {
+            LocalContentColor.current
+        }.copy(
+            alpha = ContentAlpha.medium
+        )
+    return remember(primaryColor, backgroundColor, textColorWithLowestAlpha) {
+        TextSelectionColors(
+            handleColor = colors.primary,
+            backgroundColor = calculateSelectionBackgroundColor(
+                selectionColor = primaryColor,
+                textColor = textColorWithLowestAlpha,
+                backgroundColor = backgroundColor
+            )
+        )
+    }
+}
+
+/**
+ * Best-effort calculates a color (with alpha) for the selection background that (if possible)
+ * will have at least [DesiredContrastRatio] with [textColor], when the selection background
+ * is on top of [backgroundColor].
+ *
+ * Since this is a minimum contrast ratio, [textColor] should have the lowest alpha that
+ * may be applied to content so we can ensure that the selection background color is accessible
+ * in that worst-case scenario for contrast.
+ *
+ * @param selectionColor the 'raw' (without alpha) selection color that we should search alpha for
+ * @param textColor the color of text with minimal alpha applied to test for contrast with
+ * @param backgroundColor the color of the background that the selection color will typically be
+ * placed against
+ *
+ * @return a resulting [selectionColor] with alpha applied that results in acceptable contrast
+ * (if possible with the values for [selectionColor], [textColor] and [backgroundColor]).
+ */
+/*@VisibleForTesting*/
+internal fun calculateSelectionBackgroundColor(
+    selectionColor: Color,
+    textColor: Color,
+    backgroundColor: Color
+): Color {
+    val maximumContrastRatio = calculateContrastRatio(
+        selectionColor = selectionColor,
+        selectionColorAlpha = DefaultSelectionBackgroundAlpha,
+        textColor = textColor,
+        backgroundColor = backgroundColor
+    )
+
+    val minimumContrastRatio = calculateContrastRatio(
+        selectionColor = selectionColor,
+        selectionColorAlpha = MinimumSelectionBackgroundAlpha,
+        textColor = textColor,
+        backgroundColor = backgroundColor
+    )
+
+    val alpha = when {
+        // If the default alpha has enough contrast, use that
+        maximumContrastRatio >= DesiredContrastRatio -> DefaultSelectionBackgroundAlpha
+        // If the minimum alpha still does not have enough contrast, just use the minimum and return
+        minimumContrastRatio < DesiredContrastRatio -> MinimumSelectionBackgroundAlpha
+        else -> binarySearchForAccessibleSelectionColorAlpha(
+            selectionColor = selectionColor,
+            textColor = textColor,
+            backgroundColor = backgroundColor
+        )
+    }
+
+    return selectionColor.copy(alpha = alpha)
+}
+
+/**
+ * Binary searches for the highest alpha for selection color that results in a contrast ratio at
+ * least equal to and within 1% of [DesiredContrastRatio].
+ *
+ * The resulting alpha will be within the range of [MinimumSelectionBackgroundAlpha] and
+ * [DefaultSelectionBackgroundAlpha] - since not all values for [selectionColor], [textColor] and
+ * [backgroundColor] can be guaranteed to produce an accessible contrast ratio, this is a
+ * best-effort attempt and [MinimumSelectionBackgroundAlpha] might still not produce an
+ * accessible contrast ratio. In this case developers are encouraged to manually choose a
+ * different color for selection that _is_ accessible with their chosen content and background
+ * colors.
+ *
+ * Caps the number of attempts at 7 for performance and to avoid infinite searching when there is
+ * no value that results in an accessible contrast ratio. Because alpha is limited to [0,1], 7
+ * steps results in a precision of ~0.01, since log2(1/0.01) ≈ 7.
+ *
+ * Note: binary searching here is chosen since it is not possible to 'solve' for alpha, since the
+ * transformation from color -> contrast ratio is not linear (the gamma exponent for sRGB colors
+ * is 2.4). We can approximate this to 2, but this results in not that accurate solutions, and we
+ * need to guarantee that they are at least above [DesiredContrastRatio] - falling just below is
+ * not an acceptable result.
+ *
+ * @param selectionColor the 'raw' (without alpha) selection color that we should search alpha for
+ * @param textColor the color of text with minimal alpha applied to test for contrast with
+ * @param backgroundColor the color of the background that the selection color will typically be
+ * placed against
+ */
+private fun binarySearchForAccessibleSelectionColorAlpha(
+    selectionColor: Color,
+    textColor: Color,
+    backgroundColor: Color
+): Float {
+    var attempts = 0
+    val maxAttempts = 7
+
+    var lowAlpha = MinimumSelectionBackgroundAlpha
+    var alpha = DefaultSelectionBackgroundAlpha
+    var highAlpha = DefaultSelectionBackgroundAlpha
+
+    while (attempts < maxAttempts) {
+        val contrastRatio = calculateContrastRatio(
+            selectionColor = selectionColor,
+            selectionColorAlpha = alpha,
+            textColor = textColor,
+            backgroundColor = backgroundColor
+        )
+
+        // Percentage error of the calculated contrast compared to the actual contrast. Positive
+        // numbers here mean we have higher contrast than needed.
+        val percentageError = (contrastRatio / DesiredContrastRatio) - 1f
+        when {
+            // Contrast is at most 1% above the guideline, return
+            percentageError in 0f..0.01f -> break
+            // Contrast too low, decrease alpha
+            percentageError < 0f -> highAlpha = alpha
+            // Contrast higher than required, increase alpha
+            else -> lowAlpha = alpha
+        }
+        alpha = (highAlpha + lowAlpha) / 2f
+        attempts++
+    }
+
+    return alpha
+}
+
+/**
+ * Calculates the contrast ratio of [textColor] against [selectionColor] with
+ * [selectionColorAlpha], all on top of [backgroundColor].
+ *
+ * Both the [selectionColor] and [textColor] will be composited to handle transparency.
+ *
+ * @param selectionColor the 'raw' (without alpha) selection color that we should search alpha for
+ * @param selectionColorAlpha the alpha for [selectionColor] to test contrast with
+ * @param textColor the color of text with minimal alpha applied to test for contrast with
+ * @param backgroundColor the color of the background that the selection color will typically be
+ * placed against
+ *
+ * @return the contrast ratio as a value between 1 and 21. See [calculateContrastRatio]
+ */
+private fun calculateContrastRatio(
+    selectionColor: Color,
+    selectionColorAlpha: Float,
+    textColor: Color,
+    backgroundColor: Color
+): Float {
+    val compositeBackground = selectionColor.copy(alpha = selectionColorAlpha)
+        .compositeOver(backgroundColor)
+    val compositeTextColor = textColor.compositeOver(compositeBackground)
+    return calculateContrastRatio(compositeTextColor, compositeBackground)
+}
+
+/**
+ * Calculates the contrast ratio of [foreground] against [background], returning a value between
+ * 1 and 21. (1:1 and 21:1 ratios).
+ *
+ * Formula taken from [WCAG 2.0](https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html#contrast-ratiodef)
+ *
+ * Note: [foreground] and [background] *must* be opaque. See [Color.compositeOver] to pre-composite
+ * a translucent foreground over the background.
+ *
+ * @return the contrast ratio as a value between 1 and 21. See [calculateContrastRatio]
+ */
+/*@VisibleForTesting*/
+internal fun calculateContrastRatio(foreground: Color, background: Color): Float {
+    val foregroundLuminance = foreground.luminance() + 0.05f
+    val backgroundLuminance = background.luminance() + 0.05f
+
+    return max(foregroundLuminance, backgroundLuminance) /
+        min(foregroundLuminance, backgroundLuminance)
+}
+
+/**
+ * Default selection background alpha - we will try and use this if it is accessible and produces
+ * the correct contrast ratio.
+ */
+private const val DefaultSelectionBackgroundAlpha = 0.4f
+
+/**
+ * Not all combinations of text color and selection color will have a reasonable alpha that
+ * produces a contrast ratio of at least [DesiredContrastRatio] - in this case just pick a low
+ * but still visible alpha so at least the contrast ratio is as good as it can be - this is
+ * preferable to crashing at runtime.
+ */
+private const val MinimumSelectionBackgroundAlpha = DefaultSelectionBackgroundAlpha / 2f
+
+/**
+ * Material and WCAG 2.0 sc 1.4.3 minimum contrast for AA text
+ */
+private const val DesiredContrastRatio = 4.5f
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt
new file mode 100644
index 0000000..f92126e
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/MaterialTheme.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.foundation.LocalIndication
+import androidx.compose.foundation.text.selection.LocalTextSelectionColors
+import androidx.compose.material.ripple.LocalRippleTheme
+import androidx.compose.material.ripple.RippleTheme
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.ReadOnlyComposable
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.text.TextStyle
+
+// TODO: Provide references to the Wear material design specs.
+/**
+ * MaterialTheme defines the styling principles from the WearOS Material design specification
+ * which extends the Material design specification.
+ *
+ * Wear Material components from package/sub-packages in [androidx.wear.compose.material] use values
+ * provided here when retrieving default values.
+ *
+ * It defines colors as specified in the [Wear Material Color theme spec](https://),
+ * typography defined in the [Wear Material Type Scale spec](https://),
+ * and shapes defined in the [Wear Shape scheme](https://).
+ *
+ * All values may be set by providing this component with the [colors][Colors],
+ * [typography][Typography], and [shapes][Shapes] attributes. Use this to configure the
+ * overall theme of elements within this MaterialTheme.
+ *
+ * Any values that are not set will inherit the current value from the theme, falling back to the
+ * defaults if there is no parent MaterialTheme. This allows using a MaterialTheme at the
+ * top of your application, and then separate MaterialTheme(s) for different screens / parts of
+ * your UI, overriding only the parts of the theme definition that need to change.
+ *
+ * @param colors A complete definition of the Wear Material Color theme for this hierarchy
+ * @param typography A set of text styles to be used as this hierarchy's typography system
+ * @param shapes A set of shapes to be used by the components in this hierarchy
+ */
+@Composable
+public fun MaterialTheme(
+    colors: Colors = MaterialTheme.colors,
+    typography: Typography = MaterialTheme.typography,
+    shapes: Shapes = MaterialTheme.shapes,
+    content: @Composable () -> Unit
+) {
+    val rememberedColors = remember {
+        // Explicitly creating a new object here so we don't mutate the initial [colors]
+        // provided, and overwrite the values set in it.
+        colors.copy()
+    }.apply { updateColorsFrom(colors) }
+    val rippleIndication = rememberRipple()
+    val selectionColors = rememberTextSelectionColors(rememberedColors)
+    CompositionLocalProvider(
+        LocalColors provides rememberedColors,
+        LocalShapes provides shapes,
+        LocalTypography provides typography,
+        LocalContentAlpha provides ContentAlpha.high,
+        LocalIndication provides rippleIndication,
+        LocalRippleTheme provides MaterialRippleTheme,
+        LocalTextSelectionColors provides selectionColors,
+
+    ) {
+        ProvideTextStyle(value = typography.body1, content = content)
+    }
+}
+
+public object MaterialTheme {
+    public val colors: Colors
+        @ReadOnlyComposable
+        @Composable
+        get() = LocalColors.current
+
+    public val typography: Typography
+        @ReadOnlyComposable
+        @Composable
+        get() = LocalTypography.current
+
+    public val shapes: Shapes
+        @ReadOnlyComposable
+        @Composable
+        get() = LocalShapes.current
+}
+
+@Immutable
+private object MaterialRippleTheme : RippleTheme {
+    @Composable
+    override fun defaultColor() = RippleTheme.defaultRippleColor(
+        contentColor = LocalContentColor.current,
+        lightTheme = false
+    )
+
+    @Composable
+    override fun rippleAlpha() = RippleTheme.defaultRippleAlpha(
+        contentColor = LocalContentColor.current,
+        lightTheme = false
+    )
+}
+
+/**
+ * CompositionLocal containing the preferred [TextStyle] that will be used by [Text] components by
+ * default. To set the value for this CompositionLocal, see [ProvideTextStyle] which will merge any
+ * missing [TextStyle] properties with the existing [TextStyle] set in this CompositionLocal.
+ *
+ * @see ProvideTextStyle
+ */
+val LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }
+
+// TODO: b/156598010 remove this and replace with fold definition on the backing CompositionLocal
+/**
+ * This function is used to set the current value of [LocalTextStyle], merging the given style
+ * with the current style values for any missing attributes. Any [Text] components included in
+ * this component's [content] will be styled with this style unless styled explicitly.
+ *
+ * @see LocalTextStyle
+ */
+@Composable
+fun ProvideTextStyle(value: TextStyle, content: @Composable () -> Unit) {
+    val mergedStyle = LocalTextStyle.current.merge(value)
+    CompositionLocalProvider(LocalTextStyle provides mergedStyle, content = content)
+}
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Shapes.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Shapes.kt
new file mode 100644
index 0000000..4248dfb
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Shapes.kt
@@ -0,0 +1,83 @@
+/*
+ * 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.foundation.shape.CornerBasedShape
+import androidx.compose.foundation.shape.CornerSize
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.unit.dp
+
+/**
+ * Components are grouped into shape categories based on common features. These categories provide a
+ * way to change multiple component values at once, by changing the category’s values.
+ *
+ */
+@Immutable
+public class Shapes(
+    /**
+     * Buttons and Chips use this shape
+     */
+    val small: CornerBasedShape = RoundedCornerShape(corner = CornerSize(50)),
+
+    val medium: CornerBasedShape = RoundedCornerShape(4.dp),
+    /**
+     * Cards use this shape
+     */
+    val large: CornerBasedShape = RoundedCornerShape(24.dp),
+) {
+
+    /**
+     * Returns a copy of this Shapes, optionally overriding some of the values.
+     */
+    public fun copy(
+        small: CornerBasedShape = this.small,
+        medium: CornerBasedShape = this.medium,
+        large: CornerBasedShape = this.large,
+    ): Shapes = Shapes(
+        small = small,
+        medium = medium,
+        large = large,
+    )
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is Shapes) return false
+
+        if (small != other.small) return false
+        if (medium != other.medium) return false
+        if (large != other.large) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = small.hashCode()
+        result = 31 * result + medium.hashCode()
+        result = 31 * result + large.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "Shapes(small=$small, medium=$medium, large=$large)"
+    }
+}
+
+/**
+ * CompositionLocal used to specify the default shapes for the surfaces.
+ */
+internal val LocalShapes = staticCompositionLocalOf { Shapes() }
diff --git a/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Typography.kt b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Typography.kt
new file mode 100644
index 0000000..e222efa
--- /dev/null
+++ b/wear/compose/material/src/androidMain/kotlin/androidx/wear/compose/material/Typography.kt
@@ -0,0 +1,242 @@
+/*
+ * 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.Immutable
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+/**
+ * Class holding typography definitions as defined by the Wear Material typography specification.
+ *
+ * @property display1 display1 is the largest headline, reserved for short, important text or
+ * numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
+ * script style. These unconventional font designs have details and intricacy that help attract the
+ * eye.Ø
+ *
+ * @property display2 display2 is the second largest headline, reserved for short, important text or
+ * numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
+ * script style. These unconventional font designs have details and intricacy that help attract the
+ * eye.
+ *
+ * @property display3 display3 is the third largest headline, reserved for short, important text or
+ * numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
+ * script style. These unconventional font designs have details and intricacy that help attract the
+ * eye.
+ *
+ * @property title1 title1 is the largest title, and is typically reserved for medium-emphasis text
+ * that is shorter in length. Serif or sans serif typefaces work well for subtitles.
+ *
+ * @property title2 title2 is the medium title, and is typically reserved for medium-emphasis text
+ * that is shorter in length. Serif or sans serif typefaces work well for subtitles.
+ *
+ * @property title3 title3 is the smallest title, and is typically reserved for medium-emphasis text
+ * that is shorter in length. Serif or sans serif typefaces work well for subtitles.
+ *
+ * @property body1 body1 is the largest body, and is typically used for long-form writing as it
+ * works well for small text sizes. For longer sections of text, a serif or sans serif typeface is
+ * recommended.
+ *
+ * @property body2 body2 is the smallest body, and is typically used for long-form writing as it
+ * works well for small text sizes. For longer sections of text, a serif or sans serif typeface is
+ * recommended.
+ *
+ * @property button button text is a call to action used in different types of buttons (such as
+ * text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is typically
+ * sans serif, using all caps text.
+ *
+ * @property caption1 caption1 is one of the smallest font sizes. It is used sparingly to annotate
+ * imagery or to introduce a headline.
+ *
+ * @property caption2 caption2 is one of the smallest font sizes. It is used sparingly to annotate
+ * imagery or to introduce a headline.
+ */
+@Immutable
+public class Typography internal constructor (
+    val display1: TextStyle,
+    val display2: TextStyle,
+    val display3: TextStyle,
+    val title1: TextStyle,
+    val title2: TextStyle,
+    val title3: TextStyle,
+    val body1: TextStyle,
+    val body2: TextStyle,
+    val button: TextStyle,
+    val caption1: TextStyle,
+    val caption2: TextStyle,
+) {
+    constructor (
+        defaultFontFamily: FontFamily = FontFamily.Default,
+        display1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 50.sp,
+            letterSpacing = 0.2.sp
+        ),
+        display2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 40.sp,
+            letterSpacing = 0.5.sp
+        ),
+        display3: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 30.sp,
+            letterSpacing = 0.5.sp
+        ),
+        title1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 24.sp,
+            letterSpacing = 0.sp
+        ),
+        title2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 20.sp,
+            letterSpacing = 0.2.sp
+        ),
+        title3: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 16.sp,
+            letterSpacing = 0.2.sp
+        ),
+        body1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            letterSpacing = 0.sp
+        ),
+        body2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Normal,
+            fontSize = 14.sp,
+            letterSpacing = 0.25.sp
+        ),
+        button: TextStyle = TextStyle(
+            fontWeight = FontWeight.Bold,
+            fontSize = 14.sp,
+            letterSpacing = 0.sp
+        ),
+        caption1: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 14.sp,
+            letterSpacing = 0.sp
+        ),
+        caption2: TextStyle = TextStyle(
+            fontWeight = FontWeight.Medium,
+            fontSize = 12.sp,
+            letterSpacing = 0.sp
+        )
+    ) : this(
+        display1 = display1.withDefaultFontFamily(defaultFontFamily),
+        display2 = display2.withDefaultFontFamily(defaultFontFamily),
+        display3 = display3.withDefaultFontFamily(defaultFontFamily),
+        title1 = title1.withDefaultFontFamily(defaultFontFamily),
+        title2 = title2.withDefaultFontFamily(defaultFontFamily),
+        title3 = title3.withDefaultFontFamily(defaultFontFamily),
+        body1 = body1.withDefaultFontFamily(defaultFontFamily),
+        body2 = body2.withDefaultFontFamily(defaultFontFamily),
+        button = button.withDefaultFontFamily(defaultFontFamily),
+        caption1 = caption1.withDefaultFontFamily(defaultFontFamily),
+        caption2 = caption2.withDefaultFontFamily(defaultFontFamily),
+    )
+
+    /**
+     * Returns a copy of this Typography, optionally overriding some of the values.
+     */
+    public fun copy(
+        display1: TextStyle = this.display1,
+        display2: TextStyle = this.display2,
+        display3: TextStyle = this.display3,
+        title1: TextStyle = this.title1,
+        title2: TextStyle = this.title2,
+        title3: TextStyle = this.title3,
+        body1: TextStyle = this.body1,
+        body2: TextStyle = this.body2,
+        button: TextStyle = this.button,
+        caption1: TextStyle = this.caption1,
+        caption2: TextStyle = this.caption2,
+    ): Typography = Typography(
+        display1,
+        display2,
+        display3,
+        title1,
+        title2,
+        title3,
+        body1,
+        body2,
+        button,
+        caption1,
+        caption2
+    )
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is Typography) return false
+
+        if (display1 != other.display1) return false
+        if (display2 != other.display2) return false
+        if (display3 != other.display3) return false
+        if (title1 != other.title1) return false
+        if (title2 != other.title2) return false
+        if (title3 != other.title3) return false
+        if (body1 != other.body1) return false
+        if (body2 != other.body2) return false
+        if (button != other.button) return false
+        if (caption1 != other.caption1) return false
+        if (caption2 != other.caption2) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = display1.hashCode()
+        result = 31 * result + display2.hashCode()
+        result = 31 * result + display3.hashCode()
+        result = 31 * result + title1.hashCode()
+        result = 31 * result + title2.hashCode()
+        result = 31 * result + title3.hashCode()
+        result = 31 * result + body1.hashCode()
+        result = 31 * result + body2.hashCode()
+        result = 31 * result + button.hashCode()
+        result = 31 * result + caption1.hashCode()
+        result = 31 * result + caption2.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "Typography(display1=$display1, display2=$display2, display3=$display3, " +
+            "title1=$title1, title2=$title2, title3=$title3, body1=$body1, body2=$body2, " +
+            "button=$button, caption1=$caption1, caption2=$caption2)"
+    }
+}
+
+/**
+ * @return [this] if there is a [FontFamily] defined, otherwise copies [this] with [default] as
+ * the [FontFamily].
+ */
+private fun TextStyle.withDefaultFontFamily(default: FontFamily): TextStyle {
+    return if (fontFamily != null) this else copy(fontFamily = default)
+}
+
+/**
+ * This Ambient holds on to the current definition of typography for this application as described
+ * by the Wear Material spec. You can read the values in it when creating custom components that
+ * want to use Wear Material types, as well as override the values when you want to re-style a part
+ * of your hierarchy. Material components related to text such as [Button] will use this Ambient
+ * to set values with which to style children text components.
+ *
+ * To access values within this ambient, use [MaterialTheme.typography].
+ */
+internal val LocalTypography = staticCompositionLocalOf { Typography() }
diff --git a/wear/tiles/tiles-proto/build.gradle b/wear/tiles/tiles-proto/build.gradle
index f9ab9c2..29d9e29 100644
--- a/wear/tiles/tiles-proto/build.gradle
+++ b/wear/tiles/tiles-proto/build.gradle
@@ -14,19 +14,13 @@
  * limitations under the License.
  */
 
-buildscript {
-    dependencies {
-        classpath SHADOW_PLUGIN
-    }
-}
-
 import androidx.build.LibraryVersions
 import androidx.build.RunApiTasks
 
 import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.Publish
-import com.github.jengelman.gradle.plugins.shadow.transformers.DontIncludeResourceTransformer
+import androidx.build.shadow.AndroidXDontIncludeResourceTransformer
 
 plugins {
     id("AndroidXPlugin")
@@ -67,7 +61,8 @@
     // library is included from two different downstream libraries. exclude("*.proto") (or
     // **/*.proto etc etc) doesn't exclude the ones from PROTOBUF_LITE, so take a more heavy handed
     // approach and use a transformer to strip those files.
-    transform(DontIncludeResourceTransformer.class) {
+    // TODO: move back to DontIncludeResourceTransformer.class once Shadow plugin version >6.1.0
+    transform(AndroidXDontIncludeResourceTransformer.class) {
         resource = ".proto"
     }
 }
@@ -95,6 +90,12 @@
     // for more information.
     generateProtoTasks {
         all().each { task ->
+            project.tasks.named("sourceJar").configure {
+                it.dependsOn(task)
+            }
+            project.tasks.named("runErrorProne").configure {
+                it.dependsOn(task)
+            }
             task.builtins {
                 java {
                     option 'lite'
diff --git a/wear/tiles/tiles-proto/lint-baseline.xml b/wear/tiles/tiles-proto/lint-baseline.xml
index f610889..2999513 100644
--- a/wear/tiles/tiles-proto/lint-baseline.xml
+++ b/wear/tiles/tiles-proto/lint-baseline.xml
@@ -15,7 +15,7 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    java.lang.String getPackageName();"
+        errorLine1="    java.lang.String getValue();"
         errorLine2="    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
@@ -37,33 +37,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    java.lang.String getClassName();"
-        errorLine2="    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="44"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    com.google.protobuf.ByteString"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="54"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.lang.String getPackageName() {"
+        errorLine1="    public java.lang.String getValue() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="84"
+            line="61"
             column="12"/>
     </issue>
 
@@ -74,40 +52,18 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="96"
+            line="73"
             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 java.lang.String getClassName() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="157"
-            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 com.google.protobuf.ByteString"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="170"
-            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 static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="222"
+            line="122"
             column="19"/>
     </issue>
 
@@ -118,18 +74,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="223"
+            line="123"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="228"
+            line="128"
             column="19"/>
     </issue>
 
@@ -140,7 +96,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="229"
+            line="129"
             column="9"/>
     </issue>
 
@@ -151,18 +107,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="230"
+            line="130"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="235"
+            line="135"
             column="19"/>
     </issue>
 
@@ -173,18 +129,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="236"
+            line="136"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="241"
+            line="141"
             column="19"/>
     </issue>
 
@@ -195,7 +151,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="242"
+            line="142"
             column="9"/>
     </issue>
 
@@ -206,40 +162,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="243"
+            line="143"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="248"
+            line="148"
             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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(byte[] data)"
-        errorLine2="                                                                                  ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom(byte[] data)"
+        errorLine2="                                                                                     ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="248"
-            column="83"/>
+            line="148"
+            column="86"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="253"
+            line="153"
             column="19"/>
     </issue>
 
@@ -250,7 +206,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="254"
+            line="154"
             column="9"/>
     </issue>
 
@@ -261,40 +217,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="255"
+            line="155"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="260"
+            line="160"
             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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                     ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="260"
-            column="83"/>
+            line="160"
+            column="86"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="265"
+            line="165"
             column="19"/>
     </issue>
 
@@ -305,7 +261,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="266"
+            line="166"
             column="9"/>
     </issue>
 
@@ -316,40 +272,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="267"
+            line="167"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="272"
+            line="172"
             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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                              ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="272"
-            column="92"/>
+            line="172"
+            column="95"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="276"
+            line="176"
             column="19"/>
     </issue>
 
@@ -360,7 +316,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="277"
+            line="177"
             column="9"/>
     </issue>
 
@@ -371,18 +327,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="278"
+            line="178"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="282"
+            line="182"
             column="19"/>
     </issue>
 
@@ -393,18 +349,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="283"
+            line="183"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="288"
+            line="188"
             column="19"/>
     </issue>
 
@@ -415,7 +371,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="289"
+            line="189"
             column="9"/>
     </issue>
 
@@ -426,7 +382,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="290"
+            line="190"
             column="9"/>
     </issue>
 
@@ -437,40 +393,40 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="296"
+            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="    public static Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidActivity prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="299"
+            line="199"
             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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidActivity prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="299"
+            line="199"
             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 java.lang.String getPackageName() {"
+        errorLine1="      public java.lang.String getValue() {"
         errorLine2="             ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="330"
+            line="230"
             column="14"/>
     </issue>
 
@@ -481,18 +437,18 @@
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="342"
+            line="242"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setPackageName("
+        errorLine1="      public Builder setValue("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="355"
+            line="255"
             column="14"/>
     </issue>
 
@@ -503,29 +459,29 @@
         errorLine2="          ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="356"
+            line="256"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearPackageName() {"
+        errorLine1="      public Builder clearValue() {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="369"
+            line="269"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setPackageNameBytes("
+        errorLine1="      public Builder setValueBytes("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="383"
+            line="283"
             column="14"/>
     </issue>
 
@@ -536,84 +492,7 @@
         errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="384"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public java.lang.String getClassName() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="400"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public com.google.protobuf.ByteString"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="413"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setClassName("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="427"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.String value) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="428"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearClassName() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="442"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setClassNameBytes("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="457"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          com.google.protobuf.ByteString value) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="458"
+            line="284"
             column="11"/>
     </issue>
 
@@ -624,7 +503,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="468"
+            line="294"
             column="21"/>
     </issue>
 
@@ -635,7 +514,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="469"
+            line="295"
             column="9"/>
     </issue>
 
@@ -646,7 +525,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="470"
+            line="296"
             column="9"/>
     </issue>
 
@@ -657,62 +536,40 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="470"
+            line="296"
             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 static androidx.wear.tiles.proto.ActionProto.AndroidActivity getDefaultInstance() {"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidStringExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="353"
+            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 com.google.protobuf.Parser&lt;AndroidStringExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="359"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="529"
-            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 com.google.protobuf.Parser&lt;AndroidActivity> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="535"
-            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="    androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="561"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="600"
-            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 static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="661"
+            line="430"
             column="19"/>
     </issue>
 
@@ -723,18 +580,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="662"
+            line="431"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="667"
+            line="436"
             column="19"/>
     </issue>
 
@@ -745,7 +602,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="668"
+            line="437"
             column="9"/>
     </issue>
 
@@ -756,18 +613,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="669"
+            line="438"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="674"
+            line="443"
             column="19"/>
     </issue>
 
@@ -778,18 +635,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="675"
+            line="444"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="680"
+            line="449"
             column="19"/>
     </issue>
 
@@ -800,7 +657,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="681"
+            line="450"
             column="9"/>
     </issue>
 
@@ -811,40 +668,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="682"
+            line="451"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="687"
+            line="456"
             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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(byte[] data)"
-        errorLine2="                                                                               ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom(byte[] data)"
+        errorLine2="                                                                                  ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="687"
-            column="80"/>
+            line="456"
+            column="83"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="692"
+            line="461"
             column="19"/>
     </issue>
 
@@ -855,7 +712,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="693"
+            line="462"
             column="9"/>
     </issue>
 
@@ -866,40 +723,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="694"
+            line="463"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="699"
+            line="468"
             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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                               ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="699"
-            column="80"/>
+            line="468"
+            column="83"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="704"
+            line="473"
             column="19"/>
     </issue>
 
@@ -910,7 +767,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="705"
+            line="474"
             column="9"/>
     </issue>
 
@@ -921,37 +778,268 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="706"
+            line="475"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="711"
+            line="480"
             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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="711"
-            column="89"/>
+            line="480"
+            column="92"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="484"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="485"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="486"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="490"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="491"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="496"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="497"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="498"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="504"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="507"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="507"
+            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 Builder setValue(int value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="550"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="563"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="573"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="574"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="575"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="575"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidIntExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="632"
+            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 com.google.protobuf.Parser&lt;AndroidIntExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="638"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="709"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="710"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
             line="715"
@@ -961,7 +1049,7 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.io.InputStream input,"
+        errorLine1="        java.nio.ByteBuffer data,"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
@@ -983,52 +1071,41 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="721"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
             line="722"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="727"
             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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="728"
+            line="723"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="728"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
             line="729"
@@ -1038,8 +1115,19 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="730"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
             line="735"
@@ -1049,341 +1137,22 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LaunchAction prototype) {"
-        errorLine2="                  ~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom(byte[] data)"
+        errorLine2="                                                                                   ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="738"
-            column="19"/>
+            line="735"
+            column="84"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LaunchAction prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="738"
-            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 androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="781"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="791"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="791"
-            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 Builder setAndroidActivity("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="803"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidActivity.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="804"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="816"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="816"
-            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 Builder clearAndroidActivity() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="828"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="837"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="838"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="839"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="839"
-            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 static androidx.wear.tiles.proto.ActionProto.LaunchAction getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="896"
-            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 com.google.protobuf.Parser&lt;LaunchAction> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="902"
-            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="    androidx.wear.tiles.proto.StateProto.State getRequestState();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="930"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.StateProto.State getRequestState() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="969"
-            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 static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1034"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1035"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1040"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1041"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1042"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1047"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1048"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1053"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1054"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1055"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1060"
-            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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(byte[] data)"
-        errorLine2="                                                                             ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1060"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1065"
+            line="740"
             column="19"/>
     </issue>
 
@@ -1394,7 +1163,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1066"
+            line="741"
             column="9"/>
     </issue>
 
@@ -1405,40 +1174,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1067"
+            line="742"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1072"
+            line="747"
             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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1072"
-            column="78"/>
+            line="747"
+            column="84"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1077"
+            line="752"
             column="19"/>
     </issue>
 
@@ -1449,7 +1218,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1078"
+            line="753"
             column="9"/>
     </issue>
 
@@ -1460,40 +1229,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1079"
+            line="754"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1084"
+            line="759"
             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 androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1084"
-            column="87"/>
+            line="759"
+            column="93"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1088"
+            line="763"
             column="19"/>
     </issue>
 
@@ -1504,7 +1273,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1089"
+            line="764"
             column="9"/>
     </issue>
 
@@ -1515,18 +1284,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1090"
+            line="765"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1094"
+            line="769"
             column="19"/>
     </issue>
 
@@ -1537,18 +1306,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1095"
+            line="770"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1100"
+            line="775"
             column="19"/>
     </issue>
 
@@ -1559,7 +1328,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1101"
+            line="776"
             column="9"/>
     </issue>
 
@@ -1570,7 +1339,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1102"
+            line="777"
             column="9"/>
     </issue>
 
@@ -1581,645 +1350,40 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1108"
+            line="783"
             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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LoadAction prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1111"
+            line="786"
             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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LoadAction prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1111"
+            line="786"
             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 androidx.wear.tiles.proto.StateProto.State getRequestState() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1154"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
+        errorLine1="      public Builder setValue(long value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1165"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1165"
-            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 Builder setRequestState("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1178"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.StateProto.State.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1179"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1192"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1192"
-            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 Builder clearRequestState() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1205"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1214"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1215"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1216"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1216"
-            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 static androidx.wear.tiles.proto.ActionProto.LoadAction getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1273"
-            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 com.google.protobuf.Parser&lt;LoadAction> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1279"
-            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="    androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1297"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1308"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.ActionProto.Action.ValueCase getValueCase();"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1310"
-            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 static ValueCase valueOf(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1340"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 ValueCase forNumber(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1344"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ValueCase"
-        errorLine2="           ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1358"
-            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 androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1381"
-            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 androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1443"
-            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1493"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1494"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1499"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1500"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1501"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1506"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1507"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1512"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1513"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1514"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1519"
-            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 androidx.wear.tiles.proto.ActionProto.Action parseFrom(byte[] data)"
-        errorLine2="                                                                         ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1519"
-            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1524"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1525"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1526"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1531"
-            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 androidx.wear.tiles.proto.ActionProto.Action parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1531"
-            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1536"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1537"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1538"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1543"
-            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 androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1543"
-            column="83"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1547"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1548"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1549"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1553"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1554"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1559"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1560"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1561"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1567"
-            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.Action prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1570"
-            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.Action prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1570"
-            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 ValueCase"
-        errorLine2="             ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1592"
+            line="829"
             column="14"/>
     </issue>
 
@@ -2230,183 +1394,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1597"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1615"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1621"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1621"
-            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 Builder setLaunchAction("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1629"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ActionProto.LaunchAction.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1630"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1638"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1638"
-            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 Builder clearLaunchAction() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1646"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1663"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1669"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1669"
-            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 Builder setLoadAction("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1677"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ActionProto.LoadAction.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1678"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1686"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1686"
-            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 Builder clearLoadAction() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1694"
+            line="842"
             column="14"/>
     </issue>
 
@@ -2417,7 +1405,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1704"
+            line="852"
             column="21"/>
     </issue>
 
@@ -2428,7 +1416,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1705"
+            line="853"
             column="9"/>
     </issue>
 
@@ -2439,7 +1427,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1706"
+            line="854"
             column="9"/>
     </issue>
 
@@ -2450,7 +1438,4770 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1706"
+            line="854"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidLongExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="911"
+            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 com.google.protobuf.Parser&lt;AndroidLongExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="917"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="988"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="989"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="994"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="995"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="996"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1001"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1002"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1007"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1008"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1009"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1014"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom(byte[] data)"
+        errorLine2="                                                                                     ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1014"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1019"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1020"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1021"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1026"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                     ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1026"
+            column="86"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1031"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1032"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1033"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1038"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                              ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1038"
+            column="95"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1042"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1043"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1044"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1048"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1049"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1054"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1055"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1056"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1062"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1065"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1065"
+            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 Builder setValue(double value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1108"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1121"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1131"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1132"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1133"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1133"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1190"
+            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 com.google.protobuf.Parser&lt;AndroidDoubleExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1196"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1267"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1268"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1273"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1274"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1275"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1280"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1281"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1286"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1287"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1288"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1293"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom(byte[] data)"
+        errorLine2="                                                                                      ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1293"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1298"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1299"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1300"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1305"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1305"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1310"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1311"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1312"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1317"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1317"
+            column="96"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1321"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1322"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1323"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1327"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1328"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1333"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1334"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1335"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1341"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1344"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1344"
+            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 Builder setValue(boolean value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1387"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1400"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1410"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1411"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1412"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1412"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1469"
+            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 com.google.protobuf.Parser&lt;AndroidBooleanExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1475"
+            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="    androidx.wear.tiles.proto.ActionProto.AndroidStringExtra getStringVal();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1493"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidIntExtra getIntVal();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1504"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidLongExtra getLongVal();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1515"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra getDoubleVal();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1526"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra getBooleanVal();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1537"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.ActionProto.AndroidExtra.InnerCase getInnerCase();"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1539"
+            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 static InnerCase valueOf(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1574"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 InnerCase forNumber(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1578"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public InnerCase"
+        errorLine2="           ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1595"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidStringExtra getStringVal() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1618"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidIntExtra getIntVal() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1680"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidLongExtra getLongVal() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1742"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra getDoubleVal() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1804"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra getBooleanVal() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1866"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1916"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1917"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1922"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1923"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1924"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1929"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1930"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1935"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1936"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1937"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1942"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom(byte[] data)"
+        errorLine2="                                                                               ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1942"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1947"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1948"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1949"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1954"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1954"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1959"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1960"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1961"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1966"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1966"
+            column="89"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidExtra parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1970"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1971"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1972"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1976"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1977"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidExtra parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1982"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1983"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1984"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1990"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidExtra prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1993"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidExtra prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="1993"
+            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 InnerCase"
+        errorLine2="             ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2017"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearInner() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2022"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidStringExtra getStringVal() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2040"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setStringVal(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2046"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setStringVal(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2046"
+            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 Builder setStringVal("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2054"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidStringExtra.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2055"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeStringVal(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2063"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeStringVal(androidx.wear.tiles.proto.ActionProto.AndroidStringExtra value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2063"
+            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 Builder clearStringVal() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2071"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidIntExtra getIntVal() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2088"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setIntVal(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2094"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setIntVal(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2094"
+            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 Builder setIntVal("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2102"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidIntExtra.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2103"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeIntVal(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2111"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeIntVal(androidx.wear.tiles.proto.ActionProto.AndroidIntExtra value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2111"
+            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 Builder clearIntVal() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2119"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidLongExtra getLongVal() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2136"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLongVal(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2142"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLongVal(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2142"
+            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 Builder setLongVal("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2150"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidLongExtra.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2151"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLongVal(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2159"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLongVal(androidx.wear.tiles.proto.ActionProto.AndroidLongExtra value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2159"
+            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 Builder clearLongVal() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2167"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra getDoubleVal() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2184"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setDoubleVal(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2190"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setDoubleVal(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2190"
+            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 Builder setDoubleVal("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2198"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2199"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeDoubleVal(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2207"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeDoubleVal(androidx.wear.tiles.proto.ActionProto.AndroidDoubleExtra value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2207"
+            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 Builder clearDoubleVal() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2215"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra getBooleanVal() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2232"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setBooleanVal(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2238"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setBooleanVal(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2238"
+            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 Builder setBooleanVal("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2246"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2247"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeBooleanVal(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2255"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeBooleanVal(androidx.wear.tiles.proto.ActionProto.AndroidBooleanExtra value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2255"
+            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 Builder clearBooleanVal() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2263"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2273"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2274"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2275"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2275"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidExtra getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2339"
+            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 com.google.protobuf.Parser&lt;AndroidExtra> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2345"
+            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="    java.lang.String getPackageName();"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2362"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    com.google.protobuf.ByteString"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2371"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    java.lang.String getClassName();"
+        errorLine2="    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2383"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    com.google.protobuf.ByteString"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2393"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.String key);"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2412"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra>"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2417"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra>"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2426"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrDefault("
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2436"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.String key,"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2437"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        androidx.wear.tiles.proto.ActionProto.AndroidExtra defaultValue);"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2438"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrThrow("
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2447"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.String key);"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2448"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.lang.String getPackageName() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2477"
+            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 com.google.protobuf.ByteString"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2489"
+            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 java.lang.String getClassName() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2550"
+            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 com.google.protobuf.ByteString"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2563"
+            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="        java.lang.String key) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2655"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra> getKeyToExtra() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2664"
+            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 java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra> getKeyToExtraMap() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2676"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrDefault("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2689"
+            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="        java.lang.String key,"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2690"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        androidx.wear.tiles.proto.ActionProto.AndroidExtra defaultValue) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2691"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrThrow("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2706"
+            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="        java.lang.String key) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2707"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2728"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2729"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2734"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2735"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2736"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2741"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2742"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2747"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2748"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2749"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2754"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(byte[] data)"
+        errorLine2="                                                                                  ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2754"
+            column="83"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2759"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2760"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2761"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2766"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2766"
+            column="83"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2771"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2772"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2773"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2778"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2778"
+            column="92"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.AndroidActivity parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2782"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2783"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2784"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2788"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2789"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.AndroidActivity parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2794"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2795"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2796"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2802"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidActivity prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2805"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.AndroidActivity prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2805"
+            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 java.lang.String getPackageName() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2836"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public com.google.protobuf.ByteString"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2848"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setPackageName("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2861"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String value) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2862"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearPackageName() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2875"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setPackageNameBytes("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2889"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          com.google.protobuf.ByteString value) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2890"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public java.lang.String getClassName() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2906"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public com.google.protobuf.ByteString"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2919"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setClassName("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2933"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String value) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2934"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearClassName() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2948"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setClassNameBytes("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2963"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          com.google.protobuf.ByteString value) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2964"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String key) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2985"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearKeyToExtra() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="2990"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeKeyToExtra("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3003"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String key) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3004"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra> getKeyToExtra() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3015"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra> getKeyToExtraMap() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3026"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrDefault("
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3039"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String key,"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3040"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidExtra defaultValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3041"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.AndroidExtra getKeyToExtraOrThrow("
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3056"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String key) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3057"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder putKeyToExtra("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3073"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.String key,"
+        errorLine2="          ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3074"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidExtra value) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3075"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder putAllKeyToExtra("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3089"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.util.Map&lt;java.lang.String, androidx.wear.tiles.proto.ActionProto.AndroidExtra> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3090"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3100"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3101"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3102"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3102"
+            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 static androidx.wear.tiles.proto.ActionProto.AndroidActivity getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3163"
+            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 com.google.protobuf.Parser&lt;AndroidActivity> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3169"
+            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="    androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3195"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3234"
+            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 static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3295"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3296"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3301"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3302"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3303"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3308"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3309"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3314"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3315"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3316"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3321"
+            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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(byte[] data)"
+        errorLine2="                                                                               ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3321"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3326"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3327"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3328"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3333"
+            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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3333"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3338"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3339"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3340"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3345"
+            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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3345"
+            column="89"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LaunchAction parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3349"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3350"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3351"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3355"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3356"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LaunchAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3361"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3362"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3363"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3369"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LaunchAction prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3372"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LaunchAction prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3372"
+            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 androidx.wear.tiles.proto.ActionProto.AndroidActivity getAndroidActivity() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3415"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3425"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3425"
+            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 Builder setAndroidActivity("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3437"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.AndroidActivity.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3438"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3450"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAndroidActivity(androidx.wear.tiles.proto.ActionProto.AndroidActivity value) {"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3450"
+            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 Builder clearAndroidActivity() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3462"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3471"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3472"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3473"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3473"
+            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 static androidx.wear.tiles.proto.ActionProto.LaunchAction getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3530"
+            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 com.google.protobuf.Parser&lt;LaunchAction> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3536"
+            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="    androidx.wear.tiles.proto.StateProto.State getRequestState();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3564"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.StateProto.State getRequestState() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3603"
+            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 static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3668"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3669"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3674"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3675"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3676"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3681"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3682"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3687"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3688"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3689"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3694"
+            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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(byte[] data)"
+        errorLine2="                                                                             ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3694"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3699"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3700"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3701"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3706"
+            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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3706"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3711"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3712"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3713"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3718"
+            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 androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3718"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.LoadAction parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3722"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3723"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3724"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3728"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3729"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.LoadAction parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3734"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3735"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3736"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3742"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LoadAction prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3745"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.LoadAction prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3745"
+            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 androidx.wear.tiles.proto.StateProto.State getRequestState() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3788"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3799"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3799"
+            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 Builder setRequestState("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3812"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.StateProto.State.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3813"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3826"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRequestState(androidx.wear.tiles.proto.StateProto.State value) {"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3826"
+            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 Builder clearRequestState() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3839"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3848"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3849"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3850"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3850"
+            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 static androidx.wear.tiles.proto.ActionProto.LoadAction getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3907"
+            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 com.google.protobuf.Parser&lt;LoadAction> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3913"
+            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="    androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3931"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3942"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.ActionProto.Action.ValueCase getValueCase();"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3944"
+            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 static ValueCase valueOf(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3974"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 ValueCase forNumber(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3978"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public ValueCase"
+        errorLine2="           ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="3992"
+            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 androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4015"
+            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 androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4077"
+            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4127"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4128"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4133"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4134"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4135"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4140"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4141"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4146"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4147"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4148"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4153"
+            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 androidx.wear.tiles.proto.ActionProto.Action parseFrom(byte[] data)"
+        errorLine2="                                                                         ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4153"
+            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4158"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4159"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4160"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4165"
+            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 androidx.wear.tiles.proto.ActionProto.Action parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4165"
+            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 static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4170"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4171"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4172"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4177"
+            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 androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4177"
+            column="83"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.ActionProto.Action parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4181"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4182"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4183"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4187"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4188"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.ActionProto.Action parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4193"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4194"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4195"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4201"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.Action prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4204"
+            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 Builder newBuilder(androidx.wear.tiles.proto.ActionProto.Action prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4204"
+            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 ValueCase"
+        errorLine2="             ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4226"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4231"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.LaunchAction getLaunchAction() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4249"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4255"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4255"
+            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 Builder setLaunchAction("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4263"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.LaunchAction.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4264"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4272"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLaunchAction(androidx.wear.tiles.proto.ActionProto.LaunchAction value) {"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4272"
+            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 Builder clearLaunchAction() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4280"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ActionProto.LoadAction getLoadAction() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4297"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4303"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4303"
+            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 Builder setLoadAction("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4311"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ActionProto.LoadAction.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4312"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4320"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLoadAction(androidx.wear.tiles.proto.ActionProto.LoadAction value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4320"
+            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 Builder clearLoadAction() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4328"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4338"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4339"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4340"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
+            line="4340"
             column="32"/>
     </issue>
 
@@ -2461,7 +6212,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1767"
+            line="4401"
             column="19"/>
     </issue>
 
@@ -2472,7 +6223,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/ActionProto.java"
-            line="1773"
+            line="4407"
             column="19"/>
     </issue>
 
@@ -11008,7 +14759,7 @@
         errorLine2="                  ~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="412"
+            line="428"
             column="19"/>
     </issue>
 
@@ -11019,7 +14770,7 @@
         errorLine2="                  ~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="416"
+            line="432"
             column="19"/>
     </issue>
 
@@ -11030,7 +14781,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="425"
+            line="442"
             column="19"/>
     </issue>
 
@@ -11041,7 +14792,95 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="438"
+            line="455"
+            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 FontVariant valueOf(int value) {"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="556"
+            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 FontVariant forNumber(int value) {"
+        errorLine2="                  ~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="560"
+            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 com.google.protobuf.Internal.EnumLiteMap&lt;FontVariant>"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="569"
+            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 com.google.protobuf.Internal.EnumVerifier "
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="582"
+            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 SpanVerticalAlignment valueOf(int value) {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="693"
+            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 SpanVerticalAlignment forNumber(int value) {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="697"
+            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 com.google.protobuf.Internal.EnumLiteMap&lt;SpanVerticalAlignment>"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="706"
+            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 com.google.protobuf.Internal.EnumVerifier "
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="719"
             column="19"/>
     </issue>
 
@@ -11052,7 +14891,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="558"
+            line="839"
             column="19"/>
     </issue>
 
@@ -11063,7 +14902,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="562"
+            line="843"
             column="19"/>
     </issue>
 
@@ -11074,7 +14913,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="572"
+            line="853"
             column="19"/>
     </issue>
 
@@ -11085,7 +14924,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="585"
+            line="866"
             column="19"/>
     </issue>
 
@@ -11096,7 +14935,7 @@
         errorLine2="                  ~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="691"
+            line="971"
             column="19"/>
     </issue>
 
@@ -11107,7 +14946,7 @@
         errorLine2="                  ~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="695"
+            line="975"
             column="19"/>
     </issue>
 
@@ -11118,7 +14957,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="704"
+            line="984"
             column="19"/>
     </issue>
 
@@ -11129,7 +14968,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="717"
+            line="997"
             column="19"/>
     </issue>
 
@@ -11140,7 +14979,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="858"
+            line="1138"
             column="19"/>
     </issue>
 
@@ -11151,7 +14990,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="862"
+            line="1142"
             column="19"/>
     </issue>
 
@@ -11162,7 +15001,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="872"
+            line="1152"
             column="19"/>
     </issue>
 
@@ -11173,7 +15012,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="885"
+            line="1165"
             column="19"/>
     </issue>
 
@@ -11184,7 +15023,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1020"
+            line="1300"
             column="19"/>
     </issue>
 
@@ -11195,7 +15034,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1024"
+            line="1304"
             column="19"/>
     </issue>
 
@@ -11206,7 +15045,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1034"
+            line="1314"
             column="19"/>
     </issue>
 
@@ -11217,7 +15056,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1047"
+            line="1327"
             column="19"/>
     </issue>
 
@@ -11228,7 +15067,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1091"
+            line="1371"
             column="5"/>
     </issue>
 
@@ -11239,7 +15078,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1130"
+            line="1410"
             column="12"/>
     </issue>
 
@@ -11250,7 +15089,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1172"
+            line="1452"
             column="19"/>
     </issue>
 
@@ -11261,7 +15100,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1173"
+            line="1453"
             column="9"/>
     </issue>
 
@@ -11272,7 +15111,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1178"
+            line="1458"
             column="19"/>
     </issue>
 
@@ -11283,7 +15122,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1179"
+            line="1459"
             column="9"/>
     </issue>
 
@@ -11294,7 +15133,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1180"
+            line="1460"
             column="9"/>
     </issue>
 
@@ -11305,7 +15144,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1185"
+            line="1465"
             column="19"/>
     </issue>
 
@@ -11316,7 +15155,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1186"
+            line="1466"
             column="9"/>
     </issue>
 
@@ -11327,7 +15166,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1191"
+            line="1471"
             column="19"/>
     </issue>
 
@@ -11338,7 +15177,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1192"
+            line="1472"
             column="9"/>
     </issue>
 
@@ -11349,7 +15188,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1193"
+            line="1473"
             column="9"/>
     </issue>
 
@@ -11360,7 +15199,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1198"
+            line="1478"
             column="19"/>
     </issue>
 
@@ -11371,7 +15210,7 @@
         errorLine2="                                                                                                 ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1198"
+            line="1478"
             column="98"/>
     </issue>
 
@@ -11382,7 +15221,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1203"
+            line="1483"
             column="19"/>
     </issue>
 
@@ -11393,7 +15232,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1204"
+            line="1484"
             column="9"/>
     </issue>
 
@@ -11404,7 +15243,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1205"
+            line="1485"
             column="9"/>
     </issue>
 
@@ -11415,7 +15254,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1210"
+            line="1490"
             column="19"/>
     </issue>
 
@@ -11426,7 +15265,7 @@
         errorLine2="                                                                                                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1210"
+            line="1490"
             column="98"/>
     </issue>
 
@@ -11437,7 +15276,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1215"
+            line="1495"
             column="19"/>
     </issue>
 
@@ -11448,7 +15287,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1216"
+            line="1496"
             column="9"/>
     </issue>
 
@@ -11459,7 +15298,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1217"
+            line="1497"
             column="9"/>
     </issue>
 
@@ -11470,7 +15309,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1222"
+            line="1502"
             column="19"/>
     </issue>
 
@@ -11481,7 +15320,7 @@
         errorLine2="                                                                                                          ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1222"
+            line="1502"
             column="107"/>
     </issue>
 
@@ -11492,7 +15331,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1226"
+            line="1506"
             column="19"/>
     </issue>
 
@@ -11503,7 +15342,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1227"
+            line="1507"
             column="9"/>
     </issue>
 
@@ -11514,7 +15353,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1228"
+            line="1508"
             column="9"/>
     </issue>
 
@@ -11525,7 +15364,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1232"
+            line="1512"
             column="19"/>
     </issue>
 
@@ -11536,7 +15375,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1233"
+            line="1513"
             column="9"/>
     </issue>
 
@@ -11547,7 +15386,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1238"
+            line="1518"
             column="19"/>
     </issue>
 
@@ -11558,7 +15397,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1239"
+            line="1519"
             column="9"/>
     </issue>
 
@@ -11569,7 +15408,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1240"
+            line="1520"
             column="9"/>
     </issue>
 
@@ -11580,7 +15419,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1246"
+            line="1526"
             column="19"/>
     </issue>
 
@@ -11591,7 +15430,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1249"
+            line="1529"
             column="19"/>
     </issue>
 
@@ -11602,7 +15441,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1249"
+            line="1529"
             column="38"/>
     </issue>
 
@@ -11613,7 +15452,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1292"
+            line="1572"
             column="14"/>
     </issue>
 
@@ -11624,7 +15463,7 @@
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1306"
+            line="1586"
             column="14"/>
     </issue>
 
@@ -11635,7 +15474,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1318"
+            line="1598"
             column="14"/>
     </issue>
 
@@ -11646,7 +15485,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1318"
+            line="1598"
             column="31"/>
     </issue>
 
@@ -11657,7 +15496,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1331"
+            line="1611"
             column="14"/>
     </issue>
 
@@ -11668,7 +15507,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1341"
+            line="1621"
             column="21"/>
     </issue>
 
@@ -11679,7 +15518,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1342"
+            line="1622"
             column="9"/>
     </issue>
 
@@ -11690,7 +15529,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1343"
+            line="1623"
             column="9"/>
     </issue>
 
@@ -11701,7 +15540,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1343"
+            line="1623"
             column="32"/>
     </issue>
 
@@ -11712,7 +15551,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1400"
+            line="1680"
             column="19"/>
     </issue>
 
@@ -11723,7 +15562,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1406"
+            line="1686"
             column="19"/>
     </issue>
 
@@ -11734,7 +15573,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1432"
+            line="1712"
             column="5"/>
     </issue>
 
@@ -11745,7 +15584,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1471"
+            line="1751"
             column="12"/>
     </issue>
 
@@ -11756,7 +15595,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1513"
+            line="1793"
             column="19"/>
     </issue>
 
@@ -11767,7 +15606,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1514"
+            line="1794"
             column="9"/>
     </issue>
 
@@ -11778,7 +15617,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1519"
+            line="1799"
             column="19"/>
     </issue>
 
@@ -11789,7 +15628,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1520"
+            line="1800"
             column="9"/>
     </issue>
 
@@ -11800,7 +15639,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1521"
+            line="1801"
             column="9"/>
     </issue>
 
@@ -11811,7 +15650,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1526"
+            line="1806"
             column="19"/>
     </issue>
 
@@ -11822,7 +15661,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1527"
+            line="1807"
             column="9"/>
     </issue>
 
@@ -11833,7 +15672,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1532"
+            line="1812"
             column="19"/>
     </issue>
 
@@ -11844,7 +15683,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1533"
+            line="1813"
             column="9"/>
     </issue>
 
@@ -11855,7 +15694,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1534"
+            line="1814"
             column="9"/>
     </issue>
 
@@ -11866,7 +15705,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1539"
+            line="1819"
             column="19"/>
     </issue>
 
@@ -11877,7 +15716,7 @@
         errorLine2="                                                                                               ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1539"
+            line="1819"
             column="96"/>
     </issue>
 
@@ -11888,7 +15727,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1544"
+            line="1824"
             column="19"/>
     </issue>
 
@@ -11899,7 +15738,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1545"
+            line="1825"
             column="9"/>
     </issue>
 
@@ -11910,7 +15749,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1546"
+            line="1826"
             column="9"/>
     </issue>
 
@@ -11921,7 +15760,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1551"
+            line="1831"
             column="19"/>
     </issue>
 
@@ -11932,7 +15771,7 @@
         errorLine2="                                                                                               ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1551"
+            line="1831"
             column="96"/>
     </issue>
 
@@ -11943,7 +15782,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1556"
+            line="1836"
             column="19"/>
     </issue>
 
@@ -11954,7 +15793,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1557"
+            line="1837"
             column="9"/>
     </issue>
 
@@ -11965,7 +15804,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1558"
+            line="1838"
             column="9"/>
     </issue>
 
@@ -11976,7 +15815,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1563"
+            line="1843"
             column="19"/>
     </issue>
 
@@ -11987,7 +15826,7 @@
         errorLine2="                                                                                                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1563"
+            line="1843"
             column="105"/>
     </issue>
 
@@ -11998,7 +15837,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1567"
+            line="1847"
             column="19"/>
     </issue>
 
@@ -12009,7 +15848,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1568"
+            line="1848"
             column="9"/>
     </issue>
 
@@ -12020,7 +15859,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1569"
+            line="1849"
             column="9"/>
     </issue>
 
@@ -12031,7 +15870,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1573"
+            line="1853"
             column="19"/>
     </issue>
 
@@ -12042,7 +15881,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1574"
+            line="1854"
             column="9"/>
     </issue>
 
@@ -12053,7 +15892,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1579"
+            line="1859"
             column="19"/>
     </issue>
 
@@ -12064,7 +15903,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1580"
+            line="1860"
             column="9"/>
     </issue>
 
@@ -12075,7 +15914,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1581"
+            line="1861"
             column="9"/>
     </issue>
 
@@ -12086,7 +15925,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1587"
+            line="1867"
             column="19"/>
     </issue>
 
@@ -12097,7 +15936,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1590"
+            line="1870"
             column="19"/>
     </issue>
 
@@ -12108,7 +15947,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1590"
+            line="1870"
             column="38"/>
     </issue>
 
@@ -12119,7 +15958,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1633"
+            line="1913"
             column="14"/>
     </issue>
 
@@ -12130,7 +15969,7 @@
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1647"
+            line="1927"
             column="14"/>
     </issue>
 
@@ -12141,7 +15980,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1659"
+            line="1939"
             column="14"/>
     </issue>
 
@@ -12152,7 +15991,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1659"
+            line="1939"
             column="31"/>
     </issue>
 
@@ -12163,7 +16002,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1672"
+            line="1952"
             column="14"/>
     </issue>
 
@@ -12174,7 +16013,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1682"
+            line="1962"
             column="21"/>
     </issue>
 
@@ -12185,7 +16024,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1683"
+            line="1963"
             column="9"/>
     </issue>
 
@@ -12196,7 +16035,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1684"
+            line="1964"
             column="9"/>
     </issue>
 
@@ -12207,7 +16046,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1684"
+            line="1964"
             column="32"/>
     </issue>
 
@@ -12218,7 +16057,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1741"
+            line="2021"
             column="19"/>
     </issue>
 
@@ -12229,7 +16068,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1747"
+            line="2027"
             column="19"/>
     </issue>
 
@@ -12240,7 +16079,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1773"
+            line="2053"
             column="5"/>
     </issue>
 
@@ -12251,7 +16090,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1812"
+            line="2092"
             column="12"/>
     </issue>
 
@@ -12262,7 +16101,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1854"
+            line="2134"
             column="19"/>
     </issue>
 
@@ -12273,7 +16112,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1855"
+            line="2135"
             column="9"/>
     </issue>
 
@@ -12284,7 +16123,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1860"
+            line="2140"
             column="19"/>
     </issue>
 
@@ -12295,7 +16134,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1861"
+            line="2141"
             column="9"/>
     </issue>
 
@@ -12306,7 +16145,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1862"
+            line="2142"
             column="9"/>
     </issue>
 
@@ -12317,7 +16156,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1867"
+            line="2147"
             column="19"/>
     </issue>
 
@@ -12328,7 +16167,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1868"
+            line="2148"
             column="9"/>
     </issue>
 
@@ -12339,7 +16178,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1873"
+            line="2153"
             column="19"/>
     </issue>
 
@@ -12350,7 +16189,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1874"
+            line="2154"
             column="9"/>
     </issue>
 
@@ -12361,7 +16200,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1875"
+            line="2155"
             column="9"/>
     </issue>
 
@@ -12372,7 +16211,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1880"
+            line="2160"
             column="19"/>
     </issue>
 
@@ -12383,7 +16222,7 @@
         errorLine2="                                                                                        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1880"
+            line="2160"
             column="89"/>
     </issue>
 
@@ -12394,7 +16233,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1885"
+            line="2165"
             column="19"/>
     </issue>
 
@@ -12405,7 +16244,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1886"
+            line="2166"
             column="9"/>
     </issue>
 
@@ -12416,7 +16255,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1887"
+            line="2167"
             column="9"/>
     </issue>
 
@@ -12427,7 +16266,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1892"
+            line="2172"
             column="19"/>
     </issue>
 
@@ -12438,7 +16277,7 @@
         errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1892"
+            line="2172"
             column="89"/>
     </issue>
 
@@ -12449,7 +16288,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1897"
+            line="2177"
             column="19"/>
     </issue>
 
@@ -12460,7 +16299,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1898"
+            line="2178"
             column="9"/>
     </issue>
 
@@ -12471,7 +16310,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1899"
+            line="2179"
             column="9"/>
     </issue>
 
@@ -12482,7 +16321,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1904"
+            line="2184"
             column="19"/>
     </issue>
 
@@ -12493,7 +16332,7 @@
         errorLine2="                                                                                                 ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1904"
+            line="2184"
             column="98"/>
     </issue>
 
@@ -12504,7 +16343,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1908"
+            line="2188"
             column="19"/>
     </issue>
 
@@ -12515,7 +16354,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1909"
+            line="2189"
             column="9"/>
     </issue>
 
@@ -12526,7 +16365,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1910"
+            line="2190"
             column="9"/>
     </issue>
 
@@ -12537,7 +16376,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1914"
+            line="2194"
             column="19"/>
     </issue>
 
@@ -12548,7 +16387,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1915"
+            line="2195"
             column="9"/>
     </issue>
 
@@ -12559,7 +16398,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1920"
+            line="2200"
             column="19"/>
     </issue>
 
@@ -12570,7 +16409,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1921"
+            line="2201"
             column="9"/>
     </issue>
 
@@ -12581,7 +16420,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1922"
+            line="2202"
             column="9"/>
     </issue>
 
@@ -12592,7 +16431,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1928"
+            line="2208"
             column="19"/>
     </issue>
 
@@ -12603,7 +16442,7 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1931"
+            line="2211"
             column="19"/>
     </issue>
 
@@ -12614,7 +16453,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1931"
+            line="2211"
             column="38"/>
     </issue>
 
@@ -12625,7 +16464,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1974"
+            line="2254"
             column="14"/>
     </issue>
 
@@ -12636,7 +16475,7 @@
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="1988"
+            line="2268"
             column="14"/>
     </issue>
 
@@ -12647,7 +16486,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2000"
+            line="2280"
             column="14"/>
     </issue>
 
@@ -12658,7 +16497,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2000"
+            line="2280"
             column="31"/>
     </issue>
 
@@ -12669,7 +16508,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2013"
+            line="2293"
             column="14"/>
     </issue>
 
@@ -12680,7 +16519,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2023"
+            line="2303"
             column="21"/>
     </issue>
 
@@ -12691,7 +16530,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2024"
+            line="2304"
             column="9"/>
     </issue>
 
@@ -12702,7 +16541,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2025"
+            line="2305"
             column="9"/>
     </issue>
 
@@ -12713,7 +16552,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2025"
+            line="2305"
             column="32"/>
     </issue>
 
@@ -12724,7 +16563,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2082"
+            line="2362"
             column="19"/>
     </issue>
 
@@ -12735,150 +16574,40 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2088"
+            line="2368"
             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="    androidx.wear.tiles.proto.DimensionProto.SpProp getSize();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontVariant getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2116"
+            line="2394"
             column="5"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getItalic();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.FontVariant getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2137"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2158"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ColorProto.ColorProp getColor();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2177"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2200"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2223"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.SpProp getSize() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2262"
+            line="2433"
             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 androidx.wear.tiles.proto.TypesProto.BoolProp getItalic() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2350"
-            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 androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2438"
-            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 androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2524"
-            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 androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2610"
-            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 androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2704"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2773"
+            line="2475"
             column="19"/>
     </issue>
 
@@ -12889,18 +16618,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2774"
+            line="2476"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2779"
+            line="2481"
             column="19"/>
     </issue>
 
@@ -12911,7 +16640,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2780"
+            line="2482"
             column="9"/>
     </issue>
 
@@ -12922,18 +16651,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2781"
+            line="2483"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2786"
+            line="2488"
             column="19"/>
     </issue>
 
@@ -12944,18 +16673,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2787"
+            line="2489"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2792"
+            line="2494"
             column="19"/>
     </issue>
 
@@ -12966,7 +16695,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2793"
+            line="2495"
             column="9"/>
     </issue>
 
@@ -12977,40 +16706,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2794"
+            line="2496"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2799"
+            line="2501"
             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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(byte[] data)"
-        errorLine2="                                                                                   ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom(byte[] data)"
+        errorLine2="                                                                                         ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2799"
-            column="84"/>
+            line="2501"
+            column="90"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2804"
+            line="2506"
             column="19"/>
     </issue>
 
@@ -13021,7 +16750,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2805"
+            line="2507"
             column="9"/>
     </issue>
 
@@ -13032,40 +16761,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2806"
+            line="2508"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2811"
+            line="2513"
             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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2811"
-            column="84"/>
+            line="2513"
+            column="90"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2816"
+            line="2518"
             column="19"/>
     </issue>
 
@@ -13076,7 +16805,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2817"
+            line="2519"
             column="9"/>
     </issue>
 
@@ -13087,40 +16816,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2818"
+            line="2520"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2823"
+            line="2525"
             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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                  ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2823"
-            column="93"/>
+            line="2525"
+            column="99"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2827"
+            line="2529"
             column="19"/>
     </issue>
 
@@ -13131,7 +16860,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2828"
+            line="2530"
             column="9"/>
     </issue>
 
@@ -13142,18 +16871,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2829"
+            line="2531"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2833"
+            line="2535"
             column="19"/>
     </issue>
 
@@ -13164,18 +16893,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2834"
+            line="2536"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2839"
+            line="2541"
             column="19"/>
     </issue>
 
@@ -13186,7 +16915,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2840"
+            line="2542"
             column="9"/>
     </issue>
 
@@ -13197,7 +16926,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2841"
+            line="2543"
             column="9"/>
     </issue>
 
@@ -13208,1008 +16937,29 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2847"
+            line="2549"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontStyle prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2850"
+            line="2552"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontStyle prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2850"
-            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 androidx.wear.tiles.proto.DimensionProto.SpProp getSize() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2893"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2904"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2904"
-            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 Builder setSize("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2917"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2918"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2931"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2931"
-            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 Builder clearSize() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2944"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getItalic() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2970"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2981"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2981"
-            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 Builder setItalic("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2994"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.BoolProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="2995"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3008"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3008"
-            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 Builder clearItalic() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3021"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3047"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3058"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3058"
-            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 Builder setUnderline("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3071"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.BoolProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3072"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3085"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3085"
-            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 Builder clearUnderline() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3098"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3122"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3132"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3132"
-            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 Builder setColor("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3144"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ColorProto.ColorProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3145"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3157"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3157"
-            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 Builder clearColor() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3169"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3197"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3209"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3209"
-            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 Builder setWeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3223"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3224"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3238"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3238"
-            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 Builder clearWeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3252"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3280"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3292"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3292"
-            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 Builder setLetterSpacing("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3306"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.EmProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3307"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3321"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3321"
-            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 Builder clearLetterSpacing() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3335"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3344"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3345"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3346"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3346"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.FontStyle getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3409"
-            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 com.google.protobuf.Parser&lt;FontStyle> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3415"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3441"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3480"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3522"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3523"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3528"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3529"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3530"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3535"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3536"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3541"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3542"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3543"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3548"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(byte[] data)"
-        errorLine2="                                                                                           ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3548"
-            column="92"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3553"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3554"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3555"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3560"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3560"
-            column="92"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3565"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3566"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3567"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3572"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3572"
-            column="101"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3576"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3577"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3578"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3582"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3583"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3588"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3589"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3590"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3596"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3599"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3599"
+            line="2552"
             column="38"/>
     </issue>
 
@@ -14220,40 +16970,40 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3642"
+            line="2595"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontVariant getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3656"
+            line="2609"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextAlignment value) {"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.FontVariant value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3668"
+            line="2621"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextAlignment value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.FontVariant value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3668"
+            line="2621"
             column="31"/>
     </issue>
 
@@ -14264,7 +17014,7 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3681"
+            line="2634"
             column="14"/>
     </issue>
 
@@ -14275,7 +17025,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3691"
+            line="2644"
             column="21"/>
     </issue>
 
@@ -14286,7 +17036,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3692"
+            line="2645"
             column="9"/>
     </issue>
 
@@ -14297,7 +17047,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3693"
+            line="2646"
             column="9"/>
     </issue>
 
@@ -14308,62 +17058,62 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3693"
+            line="2646"
             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 static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3750"
+            line="2703"
             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 com.google.protobuf.Parser&lt;TextAlignmentProp> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static com.google.protobuf.Parser&lt;FontVariantProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3756"
+            line="2709"
             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="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignment getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3782"
+            line="2735"
             column="5"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignment getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3821"
+            line="2774"
             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 static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3863"
+            line="2816"
             column="19"/>
     </issue>
 
@@ -14374,18 +17124,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3864"
+            line="2817"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3869"
+            line="2822"
             column="19"/>
     </issue>
 
@@ -14396,7 +17146,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3870"
+            line="2823"
             column="9"/>
     </issue>
 
@@ -14407,18 +17157,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3871"
+            line="2824"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3876"
+            line="2829"
             column="19"/>
     </issue>
 
@@ -14429,18 +17179,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3877"
+            line="2830"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3882"
+            line="2835"
             column="19"/>
     </issue>
 
@@ -14451,7 +17201,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3883"
+            line="2836"
             column="9"/>
     </issue>
 
@@ -14462,40 +17212,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3884"
+            line="2837"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3889"
+            line="2842"
             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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(byte[] data)"
-        errorLine2="                                                                                          ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom(byte[] data)"
+        errorLine2="                                                                                                   ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3889"
-            column="91"/>
+            line="2842"
+            column="100"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3894"
+            line="2847"
             column="19"/>
     </issue>
 
@@ -14506,7 +17256,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3895"
+            line="2848"
             column="9"/>
     </issue>
 
@@ -14517,6 +17267,688 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2849"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2854"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2854"
+            column="100"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2859"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2860"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2861"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2866"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2866"
+            column="109"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2870"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2871"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2872"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2876"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2877"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2882"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2883"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2884"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2890"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2893"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2893"
+            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 Builder setValueValue(int value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2936"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignment getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2950"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignment value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2962"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignment value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2962"
+            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 Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2975"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2985"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2986"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2987"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="2987"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3044"
+            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 com.google.protobuf.Parser&lt;SpanVerticalAlignmentProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3050"
+            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="    androidx.wear.tiles.proto.DimensionProto.SpProp getSize();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3078"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getItalic();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3099"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3120"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ColorProto.ColorProp getColor();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3139"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3162"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3185"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp getVariant();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3208"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.SpProp getSize() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3247"
+            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 androidx.wear.tiles.proto.TypesProto.BoolProp getItalic() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3335"
+            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 androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3423"
+            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 androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3509"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3595"
+            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 androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3689"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp getVariant() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3783"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3852"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3853"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3858"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3859"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3860"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3865"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3866"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3871"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3872"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3873"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3878"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(byte[] data)"
+        errorLine2="                                                                                   ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3878"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3883"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3884"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3885"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3890"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3890"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3895"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
             line="3896"
             column="9"/>
     </issue>
@@ -14524,30 +17956,41 @@
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3901"
+            line="3897"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3902"
             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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3901"
-            column="91"/>
+            line="3902"
+            column="93"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
             line="3906"
@@ -14579,66 +18022,11 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3913"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3913"
-            column="100"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3917"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3918"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3919"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3923"
+            line="3912"
             column="19"/>
     </issue>
 
@@ -14649,18 +18037,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3924"
+            line="3913"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3929"
+            line="3918"
             column="19"/>
     </issue>
 
@@ -14671,7 +18059,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3930"
+            line="3919"
             column="9"/>
     </issue>
 
@@ -14682,7 +18070,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3931"
+            line="3920"
             column="9"/>
     </issue>
 
@@ -14693,36 +18081,47 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3937"
+            line="3926"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontStyle prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3940"
+            line="3929"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.FontStyle prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="3940"
+            line="3929"
             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 Builder setValueValue(int value) {"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpProp getSize() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3972"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
@@ -14733,15213 +18132,110 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3983"
+            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 Builder setSize("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="3996"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
             line="3997"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextOverflow value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4009"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextOverflow value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4009"
-            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 Builder clearValue() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4022"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4032"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4033"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4034"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4034"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4091"
-            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 com.google.protobuf.Parser&lt;TextOverflowProp> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4097"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4123"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4162"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4204"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4205"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4210"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4211"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4212"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4217"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4218"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4223"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4224"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4225"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4230"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(byte[] data)"
-        errorLine2="                                                                                           ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4230"
-            column="92"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4235"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4236"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4237"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4242"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4242"
-            column="92"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4247"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4248"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4249"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4254"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4254"
-            column="101"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4258"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4259"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4260"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4264"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4265"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4270"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4271"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4272"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4278"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4281"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4281"
-            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 Builder setValueValue(int value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4324"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4338"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4350"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4350"
-            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 Builder clearValue() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4363"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4373"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4374"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4375"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4375"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4432"
-            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 com.google.protobuf.Parser&lt;ArcAnchorTypeProp> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4438"
-            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4464"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4485"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4504"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4525"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4552"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4579"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4602"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4639"
-            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4723"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4809"
-            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 androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4893"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="4987"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5093"
-            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 androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5195"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5264"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5265"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5270"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5271"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5272"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5277"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5278"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5283"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5284"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5285"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5290"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(byte[] data)"
-        errorLine2="                                                                              ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5290"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5295"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5296"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5297"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5302"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5302"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5307"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5308"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5309"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5314"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5314"
-            column="88"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5318"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5319"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5320"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5324"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5325"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5330"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5331"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5332"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5338"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Text prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5341"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Text prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5341"
-            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5382"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5392"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5392"
-            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 Builder setText("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5404"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5405"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine1="      public Builder mergeSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5417"
+            line="4010"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine1="      public Builder mergeSize(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5417"
+            line="4010"
             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 Builder clearText() {  copyOnWrite();"
+        errorLine1="      public Builder clearSize() {  copyOnWrite();"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5429"
+            line="4023"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5455"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5466"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5466"
-            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 Builder setFontStyle("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5479"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5480"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5493"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5493"
-            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 Builder clearFontStyle() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5506"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5530"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5540"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5540"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5552"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5553"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5565"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5565"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5577"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5603"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5614"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5614"
-            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 Builder setMaxLines("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5627"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.Int32Prop.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5628"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5641"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5641"
-            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 Builder clearMaxLines() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5654"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5686"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5700"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5700"
-            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 Builder setMultilineAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5716"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5717"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5733"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5733"
-            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 Builder clearMultilineAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5749"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5781"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5795"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5795"
-            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 Builder setOverflow("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5811"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5812"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5828"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5828"
-            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 Builder clearOverflow() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5844"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5872"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5884"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5884"
-            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 Builder setLineHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5898"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5899"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5913"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5913"
-            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 Builder clearLineHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5927"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5936"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5937"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5938"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="5938"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Text getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6002"
-            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 com.google.protobuf.Parser&lt;Text> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6008"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6026"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6057"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6087"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6088"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6093"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6094"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6095"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6100"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6101"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6106"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6107"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6108"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6113"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(byte[] data)"
-        errorLine2="                                                                                              ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6113"
-            column="95"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6118"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6119"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6120"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6125"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                              ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6125"
-            column="95"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6130"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6131"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6132"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6137"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6137"
-            column="104"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6141"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6142"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6143"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6147"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6148"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6153"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6154"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6155"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6161"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6164"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6164"
-            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 Builder setValueValue(int value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6199"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6209"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6217"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6217"
-            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 Builder clearValue() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6226"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6236"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6237"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6238"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6238"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6295"
-            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 com.google.protobuf.Parser&lt;ContentScaleModeProp> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6301"
-            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="    androidx.wear.tiles.proto.TypesProto.StringProp getResourceId();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6329"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6348"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6367"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6390"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6409"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6452"
-            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 androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6538"
-            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 androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6620"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6706"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6796"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6857"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6858"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6863"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6864"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6865"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6870"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6871"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6876"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6877"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6878"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6883"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(byte[] data)"
-        errorLine2="                                                                               ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6883"
-            column="80"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6888"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6889"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6890"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6895"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                               ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6895"
-            column="80"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6900"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6901"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6902"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6907"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6907"
-            column="89"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6911"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6912"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6913"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6917"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6918"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6923"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6924"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6925"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6931"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Image prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6934"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Image prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6934"
-            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 androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6981"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6992"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="6992"
-            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 Builder setResourceId("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7005"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7006"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7019"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7019"
-            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 Builder clearResourceId() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7032"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7056"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7066"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7066"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7078"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ImageDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7079"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7091"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7091"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7103"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7127"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7137"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7137"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7149"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ImageDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7150"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7162"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7162"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7174"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7202"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7214"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7214"
-            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 Builder setContentScaleMode("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7228"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7229"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7243"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7243"
-            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 Builder clearContentScaleMode() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7257"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7281"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7291"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7291"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7303"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7304"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7316"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7316"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7328"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7337"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7338"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7339"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7339"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Image getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7401"
-            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 com.google.protobuf.Parser&lt;Image> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7407"
-            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="    androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7437"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7456"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7475"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7516"
-            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 androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7606"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7688"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7749"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7750"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7755"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7756"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7757"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7762"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7763"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7768"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7769"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7770"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7775"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(byte[] data)"
-        errorLine2="                                                                                ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7775"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7780"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7781"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7782"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7787"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7787"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7792"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7793"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7794"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7799"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7799"
-            column="90"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7803"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7804"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7805"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7809"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7810"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7815"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7816"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7817"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7823"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spacer prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7826"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spacer prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7826"
-            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 androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7871"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7883"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7883"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7897"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpacerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7898"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7912"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7912"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7926"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7950"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7960"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7960"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7972"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpacerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7973"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7985"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7985"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="7997"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8021"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8031"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8031"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8043"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8044"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8056"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8056"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8068"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8077"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8078"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8079"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8079"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Spacer getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8139"
-            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 com.google.protobuf.Parser&lt;Spacer> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8145"
-            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8161"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8170"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8199"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8220"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8241"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8262"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8281"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8310"
-            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8320"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8343"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8353"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8502"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8590"
-            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8678"
-            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8766"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8852"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8913"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8914"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8919"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8920"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8921"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8926"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8927"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8932"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8933"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8934"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8939"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(byte[] data)"
-        errorLine2="                                                                             ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8939"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8944"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8945"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8946"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8951"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8951"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8956"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8957"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8958"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8963"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8963"
-            column="87"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8967"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8968"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8969"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8973"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8974"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8979"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8980"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8981"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8987"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Box prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8990"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Box prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="8990"
-            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9022"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9044"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9054"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9055"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9067"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9068"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9080"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9080"
-            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 Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9092"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9093"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9105"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9106"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9118"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9119"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addAllContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9131"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9132"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearContents() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9144"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder removeContents(int index) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9156"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9183"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9194"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9194"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9207"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9208"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9221"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9221"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9234"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9260"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9271"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9271"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9284"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9285"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9298"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9298"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9311"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9337"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9348"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9348"
-            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 Builder setHorizontalAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9361"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9362"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9375"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9375"
-            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 Builder clearHorizontalAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9388"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9414"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9425"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9425"
-            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 Builder setVerticalAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9438"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9439"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9452"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9452"
-            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 Builder clearVerticalAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9465"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9489"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9499"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9499"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9511"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9512"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9524"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9524"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9536"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9545"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9546"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9547"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9547"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Box getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9611"
-            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 com.google.protobuf.Parser&lt;Box> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9617"
-            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9643"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9664"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9683"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9722"
-            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9806"
-            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 androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9892"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9953"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9954"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9959"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9960"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9961"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9966"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9967"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9972"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9973"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9974"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9979"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(byte[] data)"
-        errorLine2="                                                                                  ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9979"
-            column="83"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9984"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9985"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9986"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9991"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9991"
-            column="83"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9996"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9997"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="9998"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10003"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10003"
-            column="92"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10007"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10008"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10009"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10013"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10014"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10019"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10020"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10021"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10027"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanText prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10030"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanText prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10030"
-            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10073"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10083"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10083"
-            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 Builder setText("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10095"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10096"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10108"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10108"
-            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 Builder clearText() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10120"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10146"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10157"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10157"
-            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 Builder setFontStyle("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10170"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10171"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10184"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10184"
-            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 Builder clearFontStyle() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10197"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10221"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10231"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10231"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10243"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.SpanModifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10244"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10256"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10256"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10268"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10277"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10278"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10279"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10279"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanText getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10339"
-            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 com.google.protobuf.Parser&lt;SpanText> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10345"
-            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="    androidx.wear.tiles.proto.TypesProto.StringProp getResourceId();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10373"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10392"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10411"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10430"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10469"
-            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 androidx.wear.tiles.proto.DimensionProto.DpProp getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10555"
-            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 androidx.wear.tiles.proto.DimensionProto.DpProp getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10637"
-            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 androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10719"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10780"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10781"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10786"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10787"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10788"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10793"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10794"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10799"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10800"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10801"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10806"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(byte[] data)"
-        errorLine2="                                                                                   ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10806"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10811"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10812"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10813"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10818"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10818"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10823"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10824"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10825"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10830"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10830"
-            column="93"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10834"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10835"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10836"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10840"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10841"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10846"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10847"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10848"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10854"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanImage prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10857"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanImage prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10857"
-            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 androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10900"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10911"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10911"
-            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 Builder setResourceId("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10924"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10925"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10938"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10938"
-            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 Builder clearResourceId() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10951"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10975"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10985"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10985"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10997"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="10998"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11010"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11010"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11022"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11046"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11056"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11056"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11068"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11069"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11081"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11081"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11093"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11117"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11127"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11127"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11139"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.SpanModifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11140"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11152"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11152"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11164"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11173"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11174"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11175"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11175"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanImage getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11236"
-            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 com.google.protobuf.Parser&lt;SpanImage> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11242"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.SpanText getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11260"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11271"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.Span.InnerCase getInnerCase();"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11273"
-            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 static InnerCase valueOf(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11305"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 InnerCase forNumber(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11309"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InnerCase"
-        errorLine2="           ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11323"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11346"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11408"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11458"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11459"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11464"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11465"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11466"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11471"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11472"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11477"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11478"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11479"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11484"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(byte[] data)"
-        errorLine2="                                                                              ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11484"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11489"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11490"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11491"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11496"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11496"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11501"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11502"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11503"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11508"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11508"
-            column="88"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11512"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11513"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11514"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11518"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11519"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11524"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11525"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11526"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11532"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Span prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11535"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Span prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11535"
-            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 InnerCase"
-        errorLine2="             ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11559"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearInner() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11564"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanText getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11582"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11588"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11588"
-            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 Builder setText("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11596"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.SpanText.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11597"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11605"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11605"
-            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 Builder clearText() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11613"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11630"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11636"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11636"
-            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 Builder setImage("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11644"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.SpanImage.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11645"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11653"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11653"
-            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 Builder clearImage() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11661"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11671"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11672"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11673"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11673"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Span getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11734"
-            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 com.google.protobuf.Parser&lt;Span> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11740"
-            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> "
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11756"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11765"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11792"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11815"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11844"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11873"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11900"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> getSpansList() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11931"
-            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.SpanOrBuilder> "
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11941"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11964"
-            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 androidx.wear.tiles.proto.LayoutElementProto.SpanOrBuilder getSpansOrBuilder("
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="11974"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12121"
-            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 androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12207"
-            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12307"
-            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12419"
-            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 androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12529"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12606"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12607"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12612"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12613"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12614"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12619"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12620"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12625"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12626"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12627"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12632"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(byte[] data)"
-        errorLine2="                                                                                   ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12632"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12637"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12638"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12639"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12644"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12644"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12649"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12650"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12651"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12656"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12656"
-            column="93"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12660"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12661"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12662"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12666"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12667"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12672"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12673"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12674"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12680"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spannable prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12683"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spannable prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12683"
-            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> getSpansList() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12717"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12739"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12749"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12750"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12762"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12763"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addSpans(androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12775"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addSpans(androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12775"
-            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 Builder addSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12787"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12788"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12800"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12801"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12813"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12814"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addAllSpans("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12826"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.Span> values) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12827"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearSpans() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12839"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder removeSpans(int index) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12851"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12876"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12886"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12886"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12898"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12899"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12911"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12911"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12923"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12951"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12963"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12963"
-            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 Builder setMaxLines("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12977"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.Int32Prop.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12978"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12992"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="12992"
-            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 Builder clearMaxLines() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13006"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13040"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13055"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13055"
-            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 Builder setMultilineAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13072"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13073"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13090"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13090"
-            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 Builder clearMultilineAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13107"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13141"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13156"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13156"
-            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 Builder setOverflow("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13173"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13174"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13191"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13191"
-            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 Builder clearOverflow() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13208"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13240"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13254"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13254"
-            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 Builder setLineSpacing("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13270"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13271"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13287"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13287"
-            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 Builder clearLineSpacing() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13303"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13312"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13313"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13314"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13314"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Spannable getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13378"
-            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 com.google.protobuf.Parser&lt;Spannable> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13384"
-            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13400"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13409"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13440"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13461"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13482"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13501"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13534"
-            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13544"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13567"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13577"
-            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13728"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13820"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13908"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="13994"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14055"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14056"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14061"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14062"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14063"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14068"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14069"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14074"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14075"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14076"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14081"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(byte[] data)"
-        errorLine2="                                                                                ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14081"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14086"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14087"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14088"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14093"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14093"
-            column="81"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14098"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14099"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14100"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14105"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14105"
-            column="90"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14109"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14110"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14111"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14115"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14116"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14121"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14122"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14123"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14129"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Column prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14132"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Column prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14132"
-            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14168"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14190"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14200"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14201"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14213"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14214"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14226"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14226"
-            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 Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14238"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14239"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14251"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14252"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14264"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14265"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addAllContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14277"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14278"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearContents() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14290"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder removeContents(int index) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14302"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14331"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14343"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14343"
-            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 Builder setHorizontalAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14357"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14358"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14372"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14372"
-            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 Builder clearHorizontalAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14386"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14412"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14423"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14423"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14436"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14437"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14450"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14450"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14463"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14489"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14500"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14500"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14513"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14514"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14527"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14527"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14540"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14564"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14574"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14574"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14586"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14587"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14599"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14599"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14611"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14620"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14621"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14622"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14622"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Column getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14685"
-            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 com.google.protobuf.Parser&lt;Column> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14691"
-            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14707"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14716"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14747"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14768"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14789"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14808"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14841"
-            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14851"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14874"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="14884"
-            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15035"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15127"
-            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15215"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15301"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15362"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15363"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15368"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15369"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15370"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15375"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15376"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15381"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15382"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15383"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15388"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(byte[] data)"
-        errorLine2="                                                                             ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15388"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15393"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15394"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15395"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15400"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15400"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15405"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15406"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15407"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15412"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15412"
-            column="87"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15416"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15417"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15418"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15422"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15423"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15428"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15429"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15430"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15436"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Row prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15439"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Row prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15439"
-            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15475"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15497"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15507"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15508"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15520"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15521"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15533"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15533"
-            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 Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15545"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15546"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15558"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15559"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15571"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15572"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addAllContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15584"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15585"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearContents() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15597"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder removeContents(int index) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15609"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15638"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15650"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15650"
-            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 Builder setVerticalAlignment("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15664"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15665"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15679"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15679"
-            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 Builder clearVerticalAlignment() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15693"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15719"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15730"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15730"
-            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 Builder setWidth("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15743"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15744"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15757"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15757"
-            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 Builder clearWidth() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15770"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15796"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15807"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15807"
-            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 Builder setHeight("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15820"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15821"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15834"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15834"
-            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 Builder clearHeight() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15847"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15871"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15881"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15881"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15893"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15894"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15906"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15906"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15918"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15927"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15928"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15929"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15929"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Row getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15992"
-            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 com.google.protobuf.Parser&lt;Row> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="15998"
-            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> "
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16014"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index);"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16023"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16060"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16083"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16110"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16129"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> getContentsList() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16159"
-            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElementOrBuilder> "
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16169"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16192"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElementOrBuilder getContentsOrBuilder("
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16202"
-            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16359"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16465"
-            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16563"
-            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16661"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16722"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16723"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16728"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16729"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16730"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16735"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16736"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16741"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16742"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16743"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16748"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(byte[] data)"
-        errorLine2="                                                                             ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16748"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16753"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16754"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16755"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16760"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16760"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16765"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16766"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16767"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16772"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16772"
-            column="87"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16776"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16777"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16778"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16782"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16783"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16788"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16789"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16790"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16796"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Arc prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16799"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Arc prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16799"
-            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> getContentsList() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16832"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index) {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16854"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16864"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16865"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16877"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16878"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16890"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16890"
-            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 Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16902"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16903"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16915"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16916"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16928"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
-        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16929"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder addAllContents("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16941"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> values) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16942"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearContents() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16954"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder removeContents(int index) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="16966"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17001"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17016"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17016"
-            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 Builder setAnchorAngle("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17033"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17034"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17051"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17051"
-            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 Builder clearAnchorAngle() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17068"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17096"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17108"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17108"
-            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 Builder setAnchorType("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17122"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17123"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17137"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17137"
-            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 Builder clearAnchorType() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17151"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17183"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17197"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17197"
-            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 Builder setVerticalAlign("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17213"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17214"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17230"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17230"
-            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 Builder clearVerticalAlign() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17246"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17270"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17280"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17280"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17292"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17293"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17305"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17305"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17317"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17326"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17327"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17328"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17328"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.Arc getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17391"
-            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 com.google.protobuf.Parser&lt;Arc> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17397"
-            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17423"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17444"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17463"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17500"
-            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17584"
-            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17670"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17731"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17732"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17737"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17738"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17739"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17744"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17745"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17750"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17751"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17752"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17757"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(byte[] data)"
-        errorLine2="                                                                                 ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17757"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17762"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17763"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17764"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17769"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17769"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17774"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17775"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17776"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17781"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17781"
-            column="91"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17785"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17786"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17787"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17791"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17792"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17797"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17798"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17799"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17805"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcText prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17808"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcText prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17808"
-            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17849"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17859"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17859"
-            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 Builder setText("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17871"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17872"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17884"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17884"
-            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 Builder clearText() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17896"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17922"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17933"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17933"
-            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 Builder setFontStyle("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17946"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17947"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17960"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17960"
-            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 Builder clearFontStyle() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17973"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="17997"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18007"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18007"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18019"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18020"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18032"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18032"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18044"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18053"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18054"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18055"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18055"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcText getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18115"
-            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 com.google.protobuf.Parser&lt;ArcText> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18121"
-            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="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18147"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getThickness();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18166"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ColorProto.ColorProp getColor();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18185"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18204"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18241"
-            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 androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18323"
-            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 androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18405"
-            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18487"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18548"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18549"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18554"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18555"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18556"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18561"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18562"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18567"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18568"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18569"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18574"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(byte[] data)"
-        errorLine2="                                                                                 ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18574"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18579"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18580"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18581"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18586"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18586"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18591"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18592"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18593"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18598"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18598"
-            column="91"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18602"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18603"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18604"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18608"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18609"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18614"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18615"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18616"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18622"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLine prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18625"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLine prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18625"
-            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18666"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18676"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18676"
-            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 Builder setLength("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18688"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18689"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18701"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18701"
-            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 Builder clearLength() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18713"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18737"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18747"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18747"
-            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 Builder setThickness("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18759"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18760"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18772"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18772"
-            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 Builder clearThickness() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18784"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18808"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18818"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18818"
-            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 Builder setColor("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18830"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ColorProto.ColorProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18831"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18843"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18843"
-            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 Builder clearColor() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18855"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18879"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18889"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18889"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18901"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18902"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18914"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18914"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18926"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18935"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18936"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18937"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18937"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLine getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="18998"
-            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 com.google.protobuf.Parser&lt;ArcLine> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19004"
-            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="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19030"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getThickness();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19049"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19068"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19105"
-            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 androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19187"
-            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19269"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19330"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19331"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19336"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19337"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19338"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19343"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19344"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19349"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19350"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19351"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19356"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(byte[] data)"
-        errorLine2="                                                                                   ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19356"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19361"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19362"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19363"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19368"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19368"
-            column="84"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19373"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19374"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19375"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19380"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19380"
-            column="93"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19384"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19385"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19386"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19390"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19391"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19396"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19397"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19398"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19404"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19407"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19407"
-            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19448"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19458"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19458"
-            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 Builder setLength("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19470"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19471"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19483"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19483"
-            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 Builder clearLength() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19495"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19519"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19529"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19529"
-            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 Builder setThickness("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19541"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19542"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19554"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19554"
-            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 Builder clearThickness() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19566"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19590"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19600"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19600"
-            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 Builder setModifiers("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19612"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19613"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19625"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19625"
-            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 Builder clearModifiers() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19637"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19646"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19647"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19648"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19648"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19708"
-            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 com.google.protobuf.Parser&lt;ArcSpacer> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19714"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19740"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19771"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19808"
-            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 androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19902"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19987"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19988"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19993"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19994"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="19995"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20000"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20001"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20006"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20007"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20008"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20013"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(byte[] data)"
-        errorLine2="                                                                                    ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20013"
-            column="85"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20018"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20019"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20020"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20025"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20025"
-            column="85"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20030"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20031"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20032"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20037"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20037"
-            column="94"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20041"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20042"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20043"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20047"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20048"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20053"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20054"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20055"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20061"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20064"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20064"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20105"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20115"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20115"
-            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 Builder setContent("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20127"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20128"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20140"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20140"
-            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 Builder clearContent() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20152"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents() {"
+        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getItalic() {"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20188"
+            line="4049"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine1="      public Builder setItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20204"
+            line="4060"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20204"
-            column="40"/>
+            line="4060"
+            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 Builder setRotateContents("
+        errorLine1="      public Builder setItalic("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20222"
+            line="4073"
             column="14"/>
     </issue>
 
@@ -29950,1415 +18246,480 @@
         errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20223"
+            line="4074"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine1="      public Builder mergeItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20241"
+            line="4087"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder mergeItalic(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20241"
-            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 Builder clearRotateContents() {  copyOnWrite();"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20259"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="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 final java.lang.Object dynamicMethod("
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20268"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20269"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="        ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20270"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20270"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20328"
-            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 com.google.protobuf.Parser&lt;ArcAdapter> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20334"
-            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="    androidx.wear.tiles.proto.LayoutElementProto.Column getColumn();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20352"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Row getRow();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20363"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Box getBox();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20374"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20385"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Text getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20396"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Image getImage();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20407"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Arc getArc();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20418"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20429"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.InnerCase getInnerCase();"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20431"
-            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 static InnerCase valueOf(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20468"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 InnerCase forNumber(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20472"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InnerCase"
-        errorLine2="           ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20492"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Column getColumn() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20515"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Row getRow() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20577"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Box getBox() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20639"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20701"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Text getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20763"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Image getImage() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20825"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Arc getArc() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20887"
-            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20949"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="20999"
-            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="        java.nio.ByteBuffer data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21000"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21005"
-            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="        java.nio.ByteBuffer data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21006"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21007"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21012"
-            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="        com.google.protobuf.ByteString data)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21013"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21018"
-            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="        com.google.protobuf.ByteString data,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21019"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21020"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21025"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(byte[] data)"
-        errorLine2="                                                                                       ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21025"
-            column="88"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21030"
-            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="        byte[] data,"
-        errorLine2="        ~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21031"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21032"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21037"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21037"
-            column="88"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21042"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21043"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21044"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21049"
-            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21049"
-            column="97"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21053"
-            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="        java.io.InputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21054"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21055"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21059"
-            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="        com.google.protobuf.CodedInputStream input)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21060"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21065"
-            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="        com.google.protobuf.CodedInputStream input,"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21066"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21067"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static Builder newBuilder() {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21073"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement prototype) {"
-        errorLine2="                  ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21076"
-            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21076"
-            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 InnerCase"
-        errorLine2="             ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21099"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearInner() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21104"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Column getColumn() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21122"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21128"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21128"
-            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 Builder setColumn("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21136"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Column.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21137"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21145"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21145"
+            line="4087"
             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 Builder clearColumn() {"
+        errorLine1="      public Builder clearItalic() {  copyOnWrite();"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21153"
+            line="4100"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Row getRow() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getUnderline() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21170"
+            line="4126"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
+        errorLine1="      public Builder setUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21176"
+            line="4137"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21176"
-            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 Builder setRow("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21184"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Row.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21185"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21193"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21193"
-            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 Builder clearRow() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21201"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Box getBox() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21218"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21224"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21224"
-            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 Builder setBox("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21232"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Box.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21233"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21241"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21241"
-            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 Builder clearBox() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21249"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21266"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21272"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21272"
-            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 Builder setSpacer("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21280"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Spacer.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21281"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21289"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21289"
-            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 Builder clearSpacer() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21297"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Text getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21314"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21320"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21320"
-            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 Builder setText("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21328"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Text.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21329"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21337"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21337"
-            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 Builder clearText() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21345"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Image getImage() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21362"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21368"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21368"
-            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 Builder setImage("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21376"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Image.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21377"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21385"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21385"
-            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 Builder clearImage() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21393"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Arc getArc() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21410"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21416"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21416"
-            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 Builder setArc("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21424"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Arc.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21425"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21433"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21433"
-            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 Builder clearArc() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21441"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21458"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21464"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21464"
+            line="4137"
             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 Builder setSpannable("
+        errorLine1="      public Builder setUnderline("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21472"
+            line="4150"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Spannable.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.BoolProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21473"
+            line="4151"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
+        errorLine1="      public Builder mergeUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21481"
+            line="4164"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder mergeUnderline(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21481"
+            line="4164"
             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 Builder clearSpannable() {"
+        errorLine1="      public Builder clearUnderline() {  copyOnWrite();"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21489"
+            line="4177"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4201"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4211"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4211"
+            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 Builder setColor("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4223"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ColorProto.ColorProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4224"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4236"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4236"
+            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 Builder clearColor() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4248"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp getWeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4276"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4288"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4288"
+            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 Builder setWeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4302"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4303"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4317"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWeight(androidx.wear.tiles.proto.LayoutElementProto.FontWeightProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4317"
+            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 Builder clearWeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4331"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.EmProp getLetterSpacing() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4359"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4371"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4371"
+            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 Builder setLetterSpacing("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4385"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.EmProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4386"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4400"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLetterSpacing(androidx.wear.tiles.proto.DimensionProto.EmProp value) {"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4400"
+            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 Builder clearLetterSpacing() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4414"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp getVariant() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4442"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVariant(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4454"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVariant(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4454"
+            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 Builder setVariant("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4468"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4469"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVariant(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4483"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVariant(androidx.wear.tiles.proto.LayoutElementProto.FontVariantProp value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4483"
+            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 Builder clearVariant() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4497"
             column="14"/>
     </issue>
 
@@ -31369,7 +18730,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21499"
+            line="4506"
             column="21"/>
     </issue>
 
@@ -31380,7 +18741,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21500"
+            line="4507"
             column="9"/>
     </issue>
 
@@ -31391,7 +18752,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21501"
+            line="4508"
             column="9"/>
     </issue>
 
@@ -31402,172 +18763,62 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21501"
+            line="4508"
             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 static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.FontStyle getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21568"
+            line="4572"
             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 com.google.protobuf.Parser&lt;LayoutElement> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static com.google.protobuf.Parser&lt;FontStyle> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21574"
+            line="4578"
             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="    androidx.wear.tiles.proto.LayoutElementProto.ArcText getText();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21592"
+            line="4604"
             column="5"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21603"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21614"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21625"
-            column="5"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.InnerCase getInnerCase();"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21627"
+            line="4643"
             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 static InnerCase valueOf(int value) {"
-        errorLine2="                    ~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21660"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown 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 InnerCase forNumber(int value) {"
-        errorLine2="                    ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21664"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InnerCase"
-        errorLine2="           ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21680"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText getText() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21703"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21765"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21827"
-            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21889"
-            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21939"
+            line="4685"
             column="19"/>
     </issue>
 
@@ -31578,18 +18829,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21940"
+            line="4686"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21945"
+            line="4691"
             column="19"/>
     </issue>
 
@@ -31600,7 +18851,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21946"
+            line="4692"
             column="9"/>
     </issue>
 
@@ -31611,18 +18862,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21947"
+            line="4693"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21952"
+            line="4698"
             column="19"/>
     </issue>
 
@@ -31633,18 +18884,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21953"
+            line="4699"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21958"
+            line="4704"
             column="19"/>
     </issue>
 
@@ -31655,7 +18906,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21959"
+            line="4705"
             column="9"/>
     </issue>
 
@@ -31666,40 +18917,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21960"
+            line="4706"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21965"
+            line="4711"
             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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(byte[] data)"
-        errorLine2="                                                                                          ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(byte[] data)"
+        errorLine2="                                                                                           ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21965"
-            column="91"/>
+            line="4711"
+            column="92"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21970"
+            line="4716"
             column="19"/>
     </issue>
 
@@ -31710,7 +18961,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21971"
+            line="4717"
             column="9"/>
     </issue>
 
@@ -31721,40 +18972,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21972"
+            line="4718"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21977"
+            line="4723"
             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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21977"
-            column="91"/>
+            line="4723"
+            column="92"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21982"
+            line="4728"
             column="19"/>
     </issue>
 
@@ -31765,7 +19016,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21983"
+            line="4729"
             column="9"/>
     </issue>
 
@@ -31776,40 +19027,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21984"
+            line="4730"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21989"
+            line="4735"
             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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                    ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21989"
-            column="100"/>
+            line="4735"
+            column="101"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21993"
+            line="4739"
             column="19"/>
     </issue>
 
@@ -31820,7 +19071,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21994"
+            line="4740"
             column="9"/>
     </issue>
 
@@ -31831,18 +19082,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21995"
+            line="4741"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="21999"
+            line="4745"
             column="19"/>
     </issue>
 
@@ -31853,18 +19104,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22000"
+            line="4746"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22005"
+            line="4751"
             column="19"/>
     </issue>
 
@@ -31875,7 +19126,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22006"
+            line="4752"
             column="9"/>
     </issue>
 
@@ -31886,7 +19137,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22007"
+            line="4753"
             column="9"/>
     </issue>
 
@@ -31897,84 +19148,1712 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22013"
+            line="4759"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22016"
+            line="4762"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22016"
+            line="4762"
             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 InnerCase"
-        errorLine2="             ~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22039"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder clearInner() {"
+        errorLine1="      public Builder setValueValue(int value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22044"
+            line="4805"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcText getText() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextAlignment getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22062"
+            line="4819"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextAlignment value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22068"
+            line="4831"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextAlignment value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22068"
+            line="4831"
+            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 Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4844"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4854"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4855"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4856"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4856"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4913"
+            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 com.google.protobuf.Parser&lt;TextAlignmentProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4919"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4945"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="4984"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5026"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5027"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5032"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5033"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5034"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5039"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5040"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5045"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5046"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5047"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5052"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(byte[] data)"
+        errorLine2="                                                                                          ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5052"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5057"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5058"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5059"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5064"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5064"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5069"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5070"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5071"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5076"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5076"
+            column="100"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5080"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5081"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5082"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5086"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5087"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5092"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5093"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5094"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5100"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5103"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5103"
+            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 Builder setValueValue(int value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5146"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflow getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5160"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextOverflow value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5172"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.TextOverflow value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5172"
+            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 Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5185"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5195"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5196"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5197"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5197"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5254"
+            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 com.google.protobuf.Parser&lt;TextOverflowProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5260"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5286"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5325"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5367"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5368"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5373"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5374"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5375"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5380"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5381"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5386"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5387"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5388"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5393"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(byte[] data)"
+        errorLine2="                                                                                           ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5393"
+            column="92"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5398"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5399"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5400"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5405"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5405"
+            column="92"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5410"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5411"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5412"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5417"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                    ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5417"
+            column="101"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5421"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5422"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5423"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5427"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5428"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5433"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5434"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5435"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5441"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5444"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5444"
+            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 Builder setValueValue(int value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5487"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5501"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5513"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorType value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5513"
+            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 Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5526"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5536"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5537"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5538"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5538"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5595"
+            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 com.google.protobuf.Parser&lt;ArcAnchorTypeProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5601"
+            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5627"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5648"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5667"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5688"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5715"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5742"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5765"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5802"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5886"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="5972"
+            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 androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6056"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6150"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6256"
+            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 androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6358"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6427"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6428"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6433"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6434"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6435"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6440"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6441"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6446"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6447"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6448"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6453"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(byte[] data)"
+        errorLine2="                                                                              ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6453"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6458"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6459"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6460"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6465"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6465"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6470"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6471"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6472"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6477"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6477"
+            column="88"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Text parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6481"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6482"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6483"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6487"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6488"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6493"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6494"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6495"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6501"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Text prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6504"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Text prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6504"
+            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6545"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6555"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6555"
             column="30"/>
     </issue>
 
@@ -31985,315 +20864,579 @@
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22076"
+            line="6567"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcText.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22077"
+            line="6568"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22085"
+            line="6580"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22085"
+            line="6580"
             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 Builder clearText() {"
+        errorLine1="      public Builder clearText() {  copyOnWrite();"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22093"
+            line="6592"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22110"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22116"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22116"
-            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 Builder setLine("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22124"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcLine.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22125"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22133"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22133"
-            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 Builder clearLine() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22141"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer() {"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22158"
+            line="6618"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22164"
+            line="6629"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22164"
-            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 Builder setSpacer("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22172"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22173"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22181"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22181"
-            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 Builder clearSpacer() {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22189"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter() {"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22206"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22212"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22212"
-            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 Builder setAdapter("
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22220"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter.Builder builderForValue) {"
-        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22221"
-            column="11"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
-        errorLine2="             ~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22229"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22229"
+            line="6629"
             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 Builder clearAdapter() {"
+        errorLine1="      public Builder setFontStyle("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22237"
+            line="6642"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6643"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6656"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6656"
+            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 Builder clearFontStyle() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6669"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6693"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6703"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6703"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6715"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6716"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6728"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6728"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6740"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6766"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6777"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6777"
+            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 Builder setMaxLines("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6790"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.Int32Prop.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6791"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6804"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6804"
+            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 Builder clearMaxLines() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6817"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp getMultilineAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6849"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6863"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6863"
+            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 Builder setMultilineAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6879"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6880"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6896"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp value) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6896"
+            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 Builder clearMultilineAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6912"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6944"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6958"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6958"
+            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 Builder setOverflow("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6974"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6975"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6991"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="6991"
+            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 Builder clearOverflow() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7007"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpProp getLineHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7035"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7047"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7047"
+            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 Builder setLineHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7061"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7062"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7076"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLineHeight(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7076"
+            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 Builder clearLineHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7090"
             column="14"/>
     </issue>
 
@@ -32304,7 +21447,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22247"
+            line="7099"
             column="21"/>
     </issue>
 
@@ -32315,7 +21458,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22248"
+            line="7100"
             column="9"/>
     </issue>
 
@@ -32326,7 +21469,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22249"
+            line="7101"
             column="9"/>
     </issue>
 
@@ -32337,62 +21480,62 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22249"
+            line="7101"
             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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getDefaultInstance() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Text getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22312"
+            line="7165"
             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 com.google.protobuf.Parser&lt;ArcLayoutElement> parser() {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static com.google.protobuf.Parser&lt;Text> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22318"
+            line="7171"
             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="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot();"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22344"
+            line="7189"
             column="5"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22381"
+            line="7220"
             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 static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22442"
+            line="7250"
             column="19"/>
     </issue>
 
@@ -32403,18 +21546,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22443"
+            line="7251"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22448"
+            line="7256"
             column="19"/>
     </issue>
 
@@ -32425,7 +21568,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22449"
+            line="7257"
             column="9"/>
     </issue>
 
@@ -32436,18 +21579,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22450"
+            line="7258"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22455"
+            line="7263"
             column="19"/>
     </issue>
 
@@ -32458,18 +21601,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22456"
+            line="7264"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22461"
+            line="7269"
             column="19"/>
     </issue>
 
@@ -32480,7 +21623,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22462"
+            line="7270"
             column="9"/>
     </issue>
 
@@ -32491,40 +21634,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22463"
+            line="7271"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(byte[] data)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22468"
+            line="7276"
             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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(byte[] data)"
-        errorLine2="                                                                                ~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(byte[] data)"
+        errorLine2="                                                                                              ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22468"
-            column="81"/>
+            line="7276"
+            column="95"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22473"
+            line="7281"
             column="19"/>
     </issue>
 
@@ -32535,7 +21678,7 @@
         errorLine2="        ~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22474"
+            line="7282"
             column="9"/>
     </issue>
 
@@ -32546,40 +21689,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22475"
+            line="7283"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22480"
+            line="7288"
             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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(java.io.InputStream input)"
-        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                              ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22480"
-            column="81"/>
+            line="7288"
+            column="95"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22485"
+            line="7293"
             column="19"/>
     </issue>
 
@@ -32590,7 +21733,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22486"
+            line="7294"
             column="9"/>
     </issue>
 
@@ -32601,40 +21744,40 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22487"
+            line="7295"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22492"
+            line="7300"
             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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom(java.io.InputStream input)"
-        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                       ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22492"
-            column="90"/>
+            line="7300"
+            column="104"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22496"
+            line="7304"
             column="19"/>
     </issue>
 
@@ -32645,7 +21788,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22497"
+            line="7305"
             column="9"/>
     </issue>
 
@@ -32656,18 +21799,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22498"
+            line="7306"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22502"
+            line="7310"
             column="19"/>
     </issue>
 
@@ -32678,18 +21821,18 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22503"
+            line="7311"
             column="9"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22508"
+            line="7316"
             column="19"/>
     </issue>
 
@@ -32700,7 +21843,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22509"
+            line="7317"
             column="9"/>
     </issue>
 
@@ -32711,7 +21854,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22510"
+            line="7318"
             column="9"/>
     </issue>
 
@@ -32722,73 +21865,2548 @@
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22516"
+            line="7324"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Layout prototype) {"
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp prototype) {"
         errorLine2="                  ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22519"
+            line="7327"
             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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Layout prototype) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    public static Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22519"
+            line="7327"
             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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot() {"
+        errorLine1="      public Builder setValueValue(int value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7362"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode getValue() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7372"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7380"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setValue(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7380"
+            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 Builder clearValue() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7389"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7399"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7400"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7401"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7401"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7458"
+            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 com.google.protobuf.Parser&lt;ContentScaleModeProp> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7464"
+            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="    androidx.wear.tiles.proto.TypesProto.StringProp getResourceId();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7492"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7511"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7530"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7553"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7572"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7615"
+            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 androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7701"
+            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 androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7783"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7869"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="7959"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8020"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8021"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8026"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8027"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8028"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8033"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8034"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8039"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8040"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8041"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8046"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(byte[] data)"
+        errorLine2="                                                                               ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8046"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8051"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8052"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8053"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8058"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                               ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8058"
+            column="80"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8063"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8064"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8065"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8070"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8070"
+            column="89"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Image parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8074"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8075"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8076"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8080"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8081"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Image parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8086"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8087"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8088"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8094"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Image prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8097"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Image prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8097"
+            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 androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8144"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8155"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8155"
+            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 Builder setResourceId("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8168"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8169"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8182"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8182"
+            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 Builder clearResourceId() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8195"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ImageDimension getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8219"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8229"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8229"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8241"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ImageDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8242"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8254"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8254"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8266"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ImageDimension getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8290"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8300"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8300"
+            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 Builder setHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8312"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ImageDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8313"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8325"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ImageDimension value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8325"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8337"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp getContentScaleMode() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8365"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8377"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8377"
+            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 Builder setContentScaleMode("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8391"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8392"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8406"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeContentScaleMode(androidx.wear.tiles.proto.LayoutElementProto.ContentScaleModeProp value) {"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8406"
+            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 Builder clearContentScaleMode() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8420"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8444"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8454"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8454"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8466"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8467"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8479"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8479"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8491"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8500"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8501"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8502"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8502"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Image getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8564"
+            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 com.google.protobuf.Parser&lt;Image> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8570"
+            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="    androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8600"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8619"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8638"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8679"
+            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 androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8769"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8851"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8912"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8913"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8918"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8919"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8920"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8925"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8926"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8931"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8932"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8933"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8938"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(byte[] data)"
+        errorLine2="                                                                                ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8938"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8943"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8944"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8945"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8950"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8950"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8955"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8956"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8957"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8962"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8962"
+            column="90"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spacer parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8966"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8967"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8968"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8972"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8973"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8978"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8979"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8980"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8986"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spacer prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8989"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spacer prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="8989"
+            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 androidx.wear.tiles.proto.DimensionProto.SpacerDimension getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9034"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9046"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9046"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9060"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpacerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9061"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9075"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9075"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9089"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpacerDimension getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9113"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9123"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9123"
+            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 Builder setHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9135"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpacerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9136"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9148"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.SpacerDimension value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9148"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9160"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9184"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9194"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9194"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9206"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9207"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9219"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9219"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9231"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9240"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9241"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9242"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9242"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Spacer getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9302"
+            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 com.google.protobuf.Parser&lt;Spacer> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9308"
+            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9324"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9333"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9362"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9383"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9404"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9425"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9444"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9473"
+            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9483"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9506"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9516"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9665"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9753"
+            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9841"
+            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="9929"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10015"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10076"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10077"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10082"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10083"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10084"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10089"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10090"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10095"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10096"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10097"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10102"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(byte[] data)"
+        errorLine2="                                                                             ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10102"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10107"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10108"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10109"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10114"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10114"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10119"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10120"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10121"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10126"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10126"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Box parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10130"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10131"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10132"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10136"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10137"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Box parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10142"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10143"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10144"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10150"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Box prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10153"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Box prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10153"
+            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10185"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22560"
+            line="10207"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine1="      public Builder setContents("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22570"
+            line="10217"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="          int index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22570"
-            column="30"/>
+            line="10218"
+            column="22"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder setRoot("
+        errorLine1="      public Builder setContents("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22582"
+            line="10230"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10231"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10243"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10243"
+            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 Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10255"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10256"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10268"
             column="14"/>
     </issue>
 
@@ -32799,40 +24417,513 @@
         errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22583"
+            line="10269"
             column="11"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine1="      public Builder addContents("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22595"
+            line="10281"
             column="14"/>
     </issue>
 
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="      public Builder mergeRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="          int index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22595"
+            line="10282"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addAllContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10294"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10295"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearContents() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10307"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeContents(int index) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10319"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10346"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10357"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10357"
             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 Builder clearRoot() {  copyOnWrite();"
+        errorLine1="      public Builder setHeight("
         errorLine2="             ~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22607"
+            line="10370"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10371"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10384"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10384"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10397"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10423"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10434"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10434"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10447"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10448"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10461"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10461"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10474"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10500"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10511"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10511"
+            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 Builder setHorizontalAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10524"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10525"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10538"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10538"
+            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 Builder clearHorizontalAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10551"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10577"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10588"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10588"
+            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 Builder setVerticalAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10601"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10602"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10615"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10615"
+            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 Builder clearVerticalAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10628"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10652"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10662"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10662"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10674"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10675"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10687"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10687"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10699"
             column="14"/>
     </issue>
 
@@ -32843,7 +24934,7 @@
         errorLine2="                    ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22616"
+            line="10708"
             column="21"/>
     </issue>
 
@@ -32854,7 +24945,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22617"
+            line="10709"
             column="9"/>
     </issue>
 
@@ -32865,7 +24956,7 @@
         errorLine2="        ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22618"
+            line="10710"
             column="9"/>
     </issue>
 
@@ -32876,7 +24967,12987 @@
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22618"
+            line="10710"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Box getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10774"
+            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 com.google.protobuf.Parser&lt;Box> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10780"
+            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10806"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10827"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10846"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10885"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="10969"
+            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 androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11055"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11116"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11117"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11122"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11123"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11124"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11129"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11130"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11135"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11136"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11137"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11142"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(byte[] data)"
+        errorLine2="                                                                                  ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11142"
+            column="83"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11147"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11148"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11149"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11154"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                  ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11154"
+            column="83"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11159"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11160"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11161"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11166"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                           ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11166"
+            column="92"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanText parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11170"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11171"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11172"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11176"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11177"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11182"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11183"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11184"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11190"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanText prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11193"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanText prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11193"
+            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11236"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11246"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11246"
+            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 Builder setText("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11258"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11259"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11271"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11271"
+            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 Builder clearText() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11283"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11309"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11320"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11320"
+            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 Builder setFontStyle("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11333"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11334"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11347"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11347"
+            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 Builder clearFontStyle() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11360"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11384"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11394"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11394"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11406"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.SpanModifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11407"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11419"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11419"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11431"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11440"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11441"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11442"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11442"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanText getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11502"
+            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 com.google.protobuf.Parser&lt;SpanText> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11508"
+            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="    androidx.wear.tiles.proto.TypesProto.StringProp getResourceId();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11536"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11555"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11574"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11593"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp getAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11614"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11653"
+            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 androidx.wear.tiles.proto.DimensionProto.DpProp getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11739"
+            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 androidx.wear.tiles.proto.DimensionProto.DpProp getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11821"
+            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 androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11903"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp getAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="11987"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12052"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12053"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12058"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12059"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12060"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12065"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12066"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12071"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12072"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12073"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12078"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(byte[] data)"
+        errorLine2="                                                                                   ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12078"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12083"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12084"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12085"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12090"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12090"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12095"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12096"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12097"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12102"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12102"
+            column="93"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12106"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12107"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12108"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12112"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12113"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.SpanImage parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12118"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12119"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12120"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12126"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanImage prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12129"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.SpanImage prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12129"
+            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 androidx.wear.tiles.proto.TypesProto.StringProp getResourceId() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12172"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12183"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12183"
+            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 Builder setResourceId("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12196"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12197"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12210"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeResourceId(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12210"
+            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 Builder clearResourceId() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12223"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12247"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12257"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12257"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12269"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12270"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12282"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12282"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12294"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12318"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12328"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12328"
+            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 Builder setHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12340"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12341"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12353"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12353"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12365"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.SpanModifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12389"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12399"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12399"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12411"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.SpanModifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12412"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12424"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.SpanModifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12424"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12436"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp getAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12462"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAlignment(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12473"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAlignment(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12473"
+            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 Builder setAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12486"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12487"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAlignment(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12500"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAlignment(androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12500"
+            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 Builder clearAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12513"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12522"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12523"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12524"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12524"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.SpanImage getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12586"
+            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 com.google.protobuf.Parser&lt;SpanImage> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12592"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.SpanText getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12610"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12621"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.Span.InnerCase getInnerCase();"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12623"
+            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 static InnerCase valueOf(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12655"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 InnerCase forNumber(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12659"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public InnerCase"
+        errorLine2="           ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12673"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanText getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12696"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12758"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12808"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12809"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12814"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12815"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12816"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12821"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12822"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12827"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12828"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12829"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12834"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(byte[] data)"
+        errorLine2="                                                                              ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12834"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12839"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12840"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12841"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12846"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                              ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12846"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12851"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12852"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12853"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12858"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12858"
+            column="88"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Span parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12862"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12863"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12864"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12868"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12869"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Span parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12874"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12875"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12876"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12882"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Span prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12885"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Span prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12885"
+            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 InnerCase"
+        errorLine2="             ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12909"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearInner() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12914"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanText getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12932"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12938"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12938"
+            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 Builder setText("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12946"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.SpanText.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12947"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12955"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.SpanText value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12955"
+            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 Builder clearText() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12963"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.SpanImage getImage() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12980"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12986"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12986"
+            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 Builder setImage("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12994"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.SpanImage.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="12995"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13003"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.SpanImage value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13003"
+            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 Builder clearImage() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13011"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13021"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13022"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13023"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13023"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Span getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13084"
+            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 com.google.protobuf.Parser&lt;Span> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13090"
+            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> "
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13106"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index);"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13115"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13142"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13165"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13194"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13223"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13250"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> getSpansList() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13281"
+            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.SpanOrBuilder> "
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13291"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index) {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13314"
+            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 androidx.wear.tiles.proto.LayoutElementProto.SpanOrBuilder getSpansOrBuilder("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13324"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13471"
+            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 androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13557"
+            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13657"
+            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 androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13769"
+            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 androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13879"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13956"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13957"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13962"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13963"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13964"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13969"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13970"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13975"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13976"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13977"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13982"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(byte[] data)"
+        errorLine2="                                                                                   ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13982"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13987"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13988"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13989"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13994"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13994"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="13999"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14000"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14001"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14006"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14006"
+            column="93"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Spannable parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14010"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14011"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14012"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14016"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14017"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Spannable parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14022"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14023"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14024"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14030"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spannable prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14033"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Spannable prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14033"
+            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.Span> getSpansList() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14067"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Span getSpans(int index) {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14089"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14099"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14100"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14112"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14113"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addSpans(androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14125"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addSpans(androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14125"
+            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 Builder addSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14137"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14138"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14150"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14151"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14163"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.Span.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14164"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addAllSpans("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14176"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.Span> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14177"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearSpans() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14189"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeSpans(int index) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14201"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14226"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14236"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14236"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14248"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14249"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14261"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14261"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14273"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.TypesProto.Int32Prop getMaxLines() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14301"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14313"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14313"
+            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 Builder setMaxLines("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14327"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.Int32Prop.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14328"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14342"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMaxLines(androidx.wear.tiles.proto.TypesProto.Int32Prop value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14342"
+            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 Builder clearMaxLines() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14356"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getMultilineAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14390"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14405"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14405"
+            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 Builder setMultilineAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14422"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14423"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14440"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeMultilineAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14440"
+            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 Builder clearMultilineAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14457"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp getOverflow() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14491"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14506"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14506"
+            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 Builder setOverflow("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14523"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14524"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14541"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeOverflow(androidx.wear.tiles.proto.LayoutElementProto.TextOverflowProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14541"
+            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 Builder clearOverflow() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14558"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.SpProp getLineSpacing() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14590"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14604"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14604"
+            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 Builder setLineSpacing("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14620"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.SpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14621"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14637"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLineSpacing(androidx.wear.tiles.proto.DimensionProto.SpProp value) {"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14637"
+            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 Builder clearLineSpacing() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14653"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14662"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14663"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14664"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14664"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Spannable getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14728"
+            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 com.google.protobuf.Parser&lt;Spannable> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14734"
+            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14750"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14759"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14790"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14811"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14832"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14851"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14884"
+            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14894"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14917"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="14927"
+            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 androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15078"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15170"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15258"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15344"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15405"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15406"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15411"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15412"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15413"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15418"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15419"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15424"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15425"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15426"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15431"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(byte[] data)"
+        errorLine2="                                                                                ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15431"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15436"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15437"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15438"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15443"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15443"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15448"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15449"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15450"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15455"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15455"
+            column="90"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Column parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15459"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15460"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15461"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15465"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15466"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Column parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15471"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15472"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15473"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15479"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Column prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15482"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Column prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15482"
+            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15518"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15540"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15550"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15551"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15563"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15564"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15576"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15576"
+            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 Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15588"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15589"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15601"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15602"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15614"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15615"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addAllContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15627"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15628"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearContents() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15640"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeContents(int index) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15652"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp getHorizontalAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15681"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15693"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15693"
+            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 Builder setHorizontalAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15707"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15708"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15722"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHorizontalAlignment(androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp value) {"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15722"
+            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 Builder clearHorizontalAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15736"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15762"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15773"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15773"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15786"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15787"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15800"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15800"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15813"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15839"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15850"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15850"
+            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 Builder setHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15863"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15864"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15877"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15877"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15890"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15914"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15924"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15924"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15936"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15937"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15949"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15949"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15961"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15970"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15971"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15972"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="15972"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Column getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16035"
+            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 com.google.protobuf.Parser&lt;Column> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16041"
+            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> "
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16057"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index);"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16066"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16097"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16118"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16139"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16158"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16191"
+            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder> "
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16201"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16224"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElementOrBuilder getContentsOrBuilder("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16234"
+            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16385"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16477"
+            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 androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16565"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16651"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16712"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16713"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16718"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16719"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16720"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16725"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16726"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16731"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16732"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16733"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16738"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(byte[] data)"
+        errorLine2="                                                                             ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16738"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16743"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16744"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16745"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16750"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16750"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16755"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16756"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16757"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16762"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16762"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Row parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16766"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16767"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16768"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16772"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16773"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Row parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16778"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16779"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16780"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16786"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Row prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16789"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Row prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16789"
+            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> getContentsList() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16825"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContents(int index) {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16847"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16857"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16858"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16870"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16871"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16883"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16883"
+            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 Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16895"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16896"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16908"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16909"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16921"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16922"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addAllContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16934"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.LayoutElement> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16935"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearContents() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16947"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeContents(int index) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16959"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlignment() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="16988"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17000"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17000"
+            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 Builder setVerticalAlignment("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17014"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17015"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17029"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlignment(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17029"
+            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 Builder clearVerticalAlignment() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17043"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getWidth() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17069"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17080"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17080"
+            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 Builder setWidth("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17093"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17094"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17107"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeWidth(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17107"
+            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 Builder clearWidth() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17120"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.ContainerDimension getHeight() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17146"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17157"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17157"
+            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 Builder setHeight("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17170"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.ContainerDimension.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17171"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17184"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeHeight(androidx.wear.tiles.proto.DimensionProto.ContainerDimension value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17184"
+            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 Builder clearHeight() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17197"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17221"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17231"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17231"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17243"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17244"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17256"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17256"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17268"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17277"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17278"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17279"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17279"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Row getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17342"
+            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 com.google.protobuf.Parser&lt;Row> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17348"
+            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="    java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> "
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17364"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index);"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17373"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17410"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17431"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17458"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17477"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> getContentsList() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17507"
+            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 java.util.List&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElementOrBuilder> "
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17517"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index) {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17540"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElementOrBuilder getContentsOrBuilder("
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17550"
+            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17707"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17811"
+            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 androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="17905"
+            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 androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18003"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18064"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18065"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18070"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18071"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18072"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18077"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18078"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18083"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18084"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18085"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18090"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(byte[] data)"
+        errorLine2="                                                                             ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18090"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18095"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18096"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18097"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18102"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18102"
+            column="78"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18107"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18108"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18109"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18114"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                      ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18114"
+            column="87"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Arc parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18118"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18119"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18120"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18124"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18125"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Arc parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18130"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18131"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18132"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18138"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Arc prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18141"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Arc prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18141"
+            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 java.util.List&lt;androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> getContentsList() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18174"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getContents(int index) {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18196"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18206"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18207"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18219"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18220"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18232"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18232"
+            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 Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18244"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement value) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18245"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18257"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18258"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18270"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 index, androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.Builder builderForValue) {"
+        errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18271"
+            column="22"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder addAllContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18283"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          java.lang.Iterable&lt;? extends androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement> values) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18284"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearContents() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18296"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder removeContents(int index) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18308"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DegreesProp getAnchorAngle() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18343"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18358"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18358"
+            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 Builder setAnchorAngle("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18375"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18376"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18393"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAnchorAngle(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18393"
+            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 Builder clearAnchorAngle() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18410"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp getAnchorType() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18436"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18447"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18447"
+            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 Builder setAnchorType("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18460"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18461"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18474"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAnchorType(androidx.wear.tiles.proto.LayoutElementProto.ArcAnchorTypeProp value) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18474"
+            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 Builder clearAnchorType() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18487"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp getVerticalAlign() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18519"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18533"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18533"
+            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 Builder setVerticalAlign("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18549"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18550"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18566"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeVerticalAlign(androidx.wear.tiles.proto.LayoutElementProto.VerticalAlignmentProp value) {"
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18566"
+            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 Builder clearVerticalAlign() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18582"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.Modifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18606"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18616"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18616"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18628"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.Modifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18629"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18641"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.Modifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18641"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18653"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18662"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18663"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18664"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18664"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Arc getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18727"
+            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 com.google.protobuf.Parser&lt;Arc> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18733"
+            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="    androidx.wear.tiles.proto.TypesProto.StringProp getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18759"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18780"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18799"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18836"
+            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 androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="18920"
+            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19006"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19067"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19068"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19073"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19074"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19075"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19080"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19081"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19086"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19087"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19088"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19093"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(byte[] data)"
+        errorLine2="                                                                                 ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19093"
+            column="82"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19098"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19099"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19100"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19105"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19105"
+            column="82"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19110"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19111"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19112"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19117"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19117"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcText parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19121"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19122"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19123"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19127"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19128"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcText parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19133"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19134"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19135"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19141"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcText prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19144"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcText prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19144"
+            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 androidx.wear.tiles.proto.TypesProto.StringProp getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19185"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19195"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19195"
+            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 Builder setText("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19207"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.StringProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19208"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19220"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.TypesProto.StringProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19220"
+            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 Builder clearText() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19232"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.FontStyle getFontStyle() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19258"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19269"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19269"
+            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 Builder setFontStyle("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19282"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.FontStyle.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19283"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19296"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeFontStyle(androidx.wear.tiles.proto.LayoutElementProto.FontStyle value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19296"
+            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 Builder clearFontStyle() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19309"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19333"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19343"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19343"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19355"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19356"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19368"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19368"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19380"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19389"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19390"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19391"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19391"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcText getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19451"
+            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 com.google.protobuf.Parser&lt;ArcText> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19457"
+            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="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19483"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getThickness();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19502"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ColorProto.ColorProp getColor();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19521"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19540"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19577"
+            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 androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19659"
+            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 androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19741"
+            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19823"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19884"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19885"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19890"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19891"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19892"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19897"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19898"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19903"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19904"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19905"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19910"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(byte[] data)"
+        errorLine2="                                                                                 ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19910"
+            column="82"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19915"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19916"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19917"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19922"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                 ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19922"
+            column="82"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19927"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19928"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19929"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19934"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19934"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19938"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19939"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19940"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19944"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19945"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLine parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19950"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19951"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19952"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19958"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLine prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19961"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLine prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="19961"
+            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20002"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20012"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20012"
+            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 Builder setLength("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20024"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20025"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20037"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20037"
+            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 Builder clearLength() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20049"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20073"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20083"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20083"
+            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 Builder setThickness("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20095"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20096"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20108"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20108"
+            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 Builder clearThickness() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20120"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ColorProto.ColorProp getColor() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20144"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20154"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20154"
+            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 Builder setColor("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20166"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ColorProto.ColorProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20167"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20179"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColor(androidx.wear.tiles.proto.ColorProto.ColorProp value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20179"
+            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 Builder clearColor() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20191"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20215"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20225"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20225"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20237"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20238"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20250"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20250"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20262"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20271"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20272"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20273"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20273"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLine getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20334"
+            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 com.google.protobuf.Parser&lt;ArcLine> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20340"
+            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="    androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20366"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.DimensionProto.DpProp getThickness();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20385"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20404"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20441"
+            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 androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20523"
+            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 androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20605"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20666"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20667"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20672"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20673"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20674"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20679"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20680"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20685"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20686"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20687"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20692"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(byte[] data)"
+        errorLine2="                                                                                   ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20692"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20697"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20698"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20699"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20704"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20704"
+            column="84"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20709"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20710"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20711"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20716"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                            ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20716"
+            column="93"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20720"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20721"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20722"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20726"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20727"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20732"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20733"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20734"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20740"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20743"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20743"
+            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 androidx.wear.tiles.proto.DimensionProto.DegreesProp getLength() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20784"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20794"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20794"
+            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 Builder setLength("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20806"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DegreesProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20807"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20819"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLength(androidx.wear.tiles.proto.DimensionProto.DegreesProp value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20819"
+            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 Builder clearLength() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20831"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.DimensionProto.DpProp getThickness() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20855"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20865"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20865"
+            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 Builder setThickness("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20877"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.DimensionProto.DpProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20878"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20890"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeThickness(androidx.wear.tiles.proto.DimensionProto.DpProp value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20890"
+            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 Builder clearThickness() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20902"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.ModifiersProto.ArcModifiers getModifiers() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20926"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20936"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20936"
+            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 Builder setModifiers("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20948"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.ModifiersProto.ArcModifiers.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20949"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20961"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeModifiers(androidx.wear.tiles.proto.ModifiersProto.ArcModifiers value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20961"
+            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 Builder clearModifiers() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20973"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20982"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20983"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20984"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="20984"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21044"
+            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 com.google.protobuf.Parser&lt;ArcSpacer> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21050"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21076"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21107"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21144"
+            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 androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21238"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21323"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21324"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21329"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21330"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21331"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21336"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21337"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21342"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21343"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21344"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21349"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(byte[] data)"
+        errorLine2="                                                                                    ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21349"
+            column="85"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21354"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21355"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21356"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21361"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                    ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21361"
+            column="85"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21366"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21367"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21368"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21373"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                             ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21373"
+            column="94"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21377"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21378"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21379"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21383"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21384"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21389"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21390"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21391"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21397"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21400"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21400"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getContent() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21441"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21451"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21451"
+            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 Builder setContent("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21463"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21464"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21476"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeContent(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21476"
+            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 Builder clearContent() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21488"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.TypesProto.BoolProp getRotateContents() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21524"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21540"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21540"
+            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 Builder setRotateContents("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21558"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.TypesProto.BoolProp.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21559"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21577"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRotateContents(androidx.wear.tiles.proto.TypesProto.BoolProp value) {"
+        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21577"
+            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 Builder clearRotateContents() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21595"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21604"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21605"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21606"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21606"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21664"
+            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 com.google.protobuf.Parser&lt;ArcAdapter> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21670"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.Column getColumn();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21688"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Row getRow();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21699"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Box getBox();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21710"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21721"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Text getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21732"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Image getImage();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21743"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Arc getArc();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21754"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21765"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.InnerCase getInnerCase();"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21767"
+            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 static InnerCase valueOf(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21804"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 InnerCase forNumber(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21808"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public InnerCase"
+        errorLine2="           ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21828"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Column getColumn() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21851"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Row getRow() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21913"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Box getBox() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="21975"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22037"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Text getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22099"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Image getImage() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22161"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Arc getArc() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22223"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22285"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22335"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22336"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22341"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22342"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22343"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22348"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22349"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22354"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22355"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22356"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22361"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(byte[] data)"
+        errorLine2="                                                                                       ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22361"
+            column="88"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22366"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22367"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22368"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22373"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                       ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22373"
+            column="88"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22378"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22379"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22380"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22385"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22385"
+            column="97"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22389"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22390"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22391"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22395"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22396"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22401"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22402"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22403"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22409"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22412"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22412"
+            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 InnerCase"
+        errorLine2="             ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22435"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearInner() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22440"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Column getColumn() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22458"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22464"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22464"
+            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 Builder setColumn("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22472"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Column.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22473"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22481"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeColumn(androidx.wear.tiles.proto.LayoutElementProto.Column value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22481"
+            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 Builder clearColumn() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22489"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Row getRow() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22506"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22512"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22512"
+            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 Builder setRow("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22520"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Row.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22521"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22529"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRow(androidx.wear.tiles.proto.LayoutElementProto.Row value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22529"
+            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 Builder clearRow() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22537"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Box getBox() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22554"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22560"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22560"
+            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 Builder setBox("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22568"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Box.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22569"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22577"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeBox(androidx.wear.tiles.proto.LayoutElementProto.Box value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22577"
+            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 Builder clearBox() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22585"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Spacer getSpacer() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22602"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22608"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22608"
+            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 Builder setSpacer("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22616"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Spacer.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22617"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22625"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.Spacer value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22625"
+            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 Builder clearSpacer() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22633"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Text getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22650"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22656"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22656"
+            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 Builder setText("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22664"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Text.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22665"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22673"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.Text value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22673"
+            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 Builder clearText() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22681"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Image getImage() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22698"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22704"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22704"
+            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 Builder setImage("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22712"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Image.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22713"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22721"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeImage(androidx.wear.tiles.proto.LayoutElementProto.Image value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22721"
+            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 Builder clearImage() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22729"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Arc getArc() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22746"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22752"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22752"
+            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 Builder setArc("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22760"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Arc.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22761"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22769"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeArc(androidx.wear.tiles.proto.LayoutElementProto.Arc value) {"
+        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22769"
+            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 Builder clearArc() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22777"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.Spannable getSpannable() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22794"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22800"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22800"
+            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 Builder setSpannable("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22808"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.Spannable.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22809"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22817"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpannable(androidx.wear.tiles.proto.LayoutElementProto.Spannable value) {"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22817"
+            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 Builder clearSpannable() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22825"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22835"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22836"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22837"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22837"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22904"
+            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 com.google.protobuf.Parser&lt;LayoutElement> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22910"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.ArcText getText();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22928"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22939"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22950"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22961"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement.InnerCase getInnerCase();"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22963"
+            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 static InnerCase valueOf(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="22996"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 InnerCase forNumber(int value) {"
+        errorLine2="                    ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23000"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public InnerCase"
+        errorLine2="           ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23016"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcText getText() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23039"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23101"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23163"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23225"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23275"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23276"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23281"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23282"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23283"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23288"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23289"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23294"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23295"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23296"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23301"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(byte[] data)"
+        errorLine2="                                                                                          ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23301"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23306"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23307"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23308"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23313"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                          ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23313"
+            column="91"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23318"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23319"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23320"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23325"
+            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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                                   ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23325"
+            column="100"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23329"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23330"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23331"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23335"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23336"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23341"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23342"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23343"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23349"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23352"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23352"
+            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 InnerCase"
+        errorLine2="             ~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23375"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder clearInner() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23380"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcText getText() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23398"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23404"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23404"
+            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 Builder setText("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23412"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcText.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23413"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23421"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeText(androidx.wear.tiles.proto.LayoutElementProto.ArcText value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23421"
+            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 Builder clearText() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23429"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcLine getLine() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23446"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23452"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23452"
+            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 Builder setLine("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23460"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcLine.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23461"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23469"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeLine(androidx.wear.tiles.proto.LayoutElementProto.ArcLine value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23469"
+            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 Builder clearLine() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23477"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer getSpacer() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23494"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23500"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23500"
+            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 Builder setSpacer("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23508"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23509"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23517"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeSpacer(androidx.wear.tiles.proto.LayoutElementProto.ArcSpacer value) {"
+        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23517"
+            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 Builder clearSpacer() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23525"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter getAdapter() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23542"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23548"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23548"
+            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 Builder setAdapter("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23556"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23557"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23565"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeAdapter(androidx.wear.tiles.proto.LayoutElementProto.ArcAdapter value) {"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23565"
+            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 Builder clearAdapter() {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23573"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23583"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23584"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23585"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23585"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.ArcLayoutElement getDefaultInstance() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23648"
+            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 com.google.protobuf.Parser&lt;ArcLayoutElement> parser() {"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23654"
+            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="    androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot();"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23680"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot() {"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23717"
+            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 static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23778"
+            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="        java.nio.ByteBuffer data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23779"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23784"
+            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="        java.nio.ByteBuffer data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23785"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23786"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23791"
+            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="        com.google.protobuf.ByteString data)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23792"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23797"
+            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="        com.google.protobuf.ByteString data,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23798"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23799"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(byte[] data)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23804"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(byte[] data)"
+        errorLine2="                                                                                ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23804"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23809"
+            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="        byte[] data,"
+        errorLine2="        ~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23810"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23811"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23816"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom(java.io.InputStream input)"
+        errorLine2="                                                                                ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23816"
+            column="81"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23821"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23822"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23823"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23828"
+            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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom(java.io.InputStream input)"
+        errorLine2="                                                                                         ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23828"
+            column="90"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown 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 androidx.wear.tiles.proto.LayoutElementProto.Layout parseDelimitedFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23832"
+            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="        java.io.InputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23833"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23834"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23838"
+            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="        com.google.protobuf.CodedInputStream input)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23839"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static androidx.wear.tiles.proto.LayoutElementProto.Layout parseFrom("
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23844"
+            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="        com.google.protobuf.CodedInputStream input,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23845"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.ExtensionRegistryLite extensionRegistry)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23846"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="    public static Builder newBuilder() {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23852"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Layout prototype) {"
+        errorLine2="                  ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23855"
+            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 Builder newBuilder(androidx.wear.tiles.proto.LayoutElementProto.Layout prototype) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23855"
+            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 androidx.wear.tiles.proto.LayoutElementProto.LayoutElement getRoot() {"
+        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23896"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23906"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder setRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23906"
+            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 Builder setRoot("
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23918"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="          androidx.wear.tiles.proto.LayoutElementProto.LayoutElement.Builder builderForValue) {"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23919"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23931"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="      public Builder mergeRoot(androidx.wear.tiles.proto.LayoutElementProto.LayoutElement value) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23931"
+            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 Builder clearRoot() {  copyOnWrite();"
+        errorLine2="             ~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23943"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="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 final java.lang.Object dynamicMethod("
+        errorLine2="                    ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23952"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23953"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="        ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23954"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        errorLine1="        java.lang.Object arg0, java.lang.Object arg1) {"
+        errorLine2="                               ~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
+            line="23954"
             column="32"/>
     </issue>
 
@@ -32887,7 +37958,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22675"
+            line="24011"
             column="19"/>
     </issue>
 
@@ -32898,7 +37969,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../../../../out/androidx/wear/tiles/tiles-proto/build/generated/source/proto/main/java/androidx/wear/tiles/proto/LayoutElementProto.java"
-            line="22681"
+            line="24017"
             column="19"/>
     </issue>
 
diff --git a/wear/tiles/tiles-proto/src/main/java/androidx/wear/tiles/proto/package-info.java b/wear/tiles/tiles-proto/src/main/java/androidx/wear/tiles/proto/package-info.java
index 619d56d..4086b13 100644
--- a/wear/tiles/tiles-proto/src/main/java/androidx/wear/tiles/proto/package-info.java
+++ b/wear/tiles/tiles-proto/src/main/java/androidx/wear/tiles/proto/package-info.java
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-/**
- * @hide
- */
+/** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 package androidx.wear.tiles.proto;
 
diff --git a/wear/tiles/tiles-proto/src/main/proto/action.proto b/wear/tiles/tiles-proto/src/main/proto/action.proto
index 65078297..454a83c 100644
--- a/wear/tiles/tiles-proto/src/main/proto/action.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/action.proto
@@ -8,6 +8,49 @@
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "ActionProto";
 
+// A string value that can be added to an Android intent's extras.
+message AndroidStringExtra {
+  // The value.
+  string value = 1;
+}
+
+// An integer value that can be added to an Android intent's extras.
+message AndroidIntExtra {
+  // The value.
+  int32 value = 1;
+}
+
+// A long value that can be added to an Android intent's extras.
+message AndroidLongExtra {
+  // The value.
+  int64 value = 1;
+}
+
+// A double value that can be added to an Android intent's extras.
+message AndroidDoubleExtra {
+  // The value.
+  double value = 1;
+}
+
+// A boolean value that can be added to an Android intent's extras.
+message AndroidBooleanExtra {
+  // The value.
+  bool value = 1;
+}
+
+// An item that can be included in the extras of an intent that will be sent to
+// an Android activity. Supports types in android.os.PersistableBundle,
+// excluding arrays.
+message AndroidExtra {
+  oneof inner {
+    AndroidStringExtra string_val = 1;
+    AndroidIntExtra int_val = 2;
+    AndroidLongExtra long_val = 3;
+    AndroidDoubleExtra double_val = 4;
+    AndroidBooleanExtra boolean_val = 5;
+  }
+}
+
 // A launch action to send an intent to an Android activity.
 message AndroidActivity {
   // The package name to send the intent to, for example, "com.google.weather".
@@ -16,6 +59,9 @@
   // The fully qualified class name (including the package) to send the intent
   // to, for example, "com.google.weather.WeatherOverviewActivity".
   string class_name = 2;
+
+  // The extras to be included in the intent.
+  map<string, AndroidExtra> key_to_extra = 3;
 }
 
 // An action used to launch another activity on the system. This can hold
diff --git a/wear/tiles/tiles-proto/src/main/proto/dimension.proto b/wear/tiles/tiles-proto/src/main/proto/dimension.proto
index 4537950..a9ff32b 100644
--- a/wear/tiles/tiles-proto/src/main/proto/dimension.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/dimension.proto
@@ -3,7 +3,6 @@
 
 package androidx.wear.tiles.proto;
 
-
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "DimensionProto";
 
diff --git a/wear/tiles/tiles-proto/src/main/proto/events.proto b/wear/tiles/tiles-proto/src/main/proto/events.proto
index 39c5fc1..2859a2e 100644
--- a/wear/tiles/tiles-proto/src/main/proto/events.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/events.proto
@@ -3,7 +3,6 @@
 
 package androidx.wear.tiles.proto;
 
-
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "EventProto";
 
diff --git a/wear/tiles/tiles-proto/src/main/proto/layout.proto b/wear/tiles/tiles-proto/src/main/proto/layout.proto
index b5b9f15..008344f 100644
--- a/wear/tiles/tiles-proto/src/main/proto/layout.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/layout.proto
@@ -70,6 +70,9 @@
   // Normal font weight.
   FONT_WEIGHT_NORMAL = 400;
 
+  // Medium font weight.
+  FONT_WEIGHT_MEDIUM = 500;
+
   // Bold font weight.
   FONT_WEIGHT_BOLD = 700;
 }
@@ -80,6 +83,49 @@
   FontWeight value = 1;
 }
 
+// The variant of a font. Some renderers may use different fonts for title and
+// body text, which can be selected using this field.
+enum FontVariant {
+  // Font variant is undefined.
+  FONT_VARIANT_UNDEFINED = 0;
+
+  // Font variant suited for title text.
+  FONT_VARIANT_TITLE = 1;
+
+  // Font variant suited for body text.
+  FONT_VARIANT_BODY = 2;
+}
+
+// An extensible FontVariant property.
+message FontVariantProp {
+  // The value.
+  FontVariant value = 1;
+}
+
+// The alignment of a SpanImage within the line height of the surrounding
+// Spannable.
+enum SpanVerticalAlignment {
+  // Alignment is undefined.
+  SPAN_VALIGN_UNDEFINED = 0;
+
+  // Align to the bottom of the line (descent of the largest text in this line).
+  // If there is no text in the line containing this image, this will align to
+  // the bottom of the line, where the line height is defined as the height of
+  // the largest image in the line.
+  SPAN_VALIGN_BOTTOM = 1;
+
+  // Align to the baseline of the text. Note that if the line in the Spannable
+  // which contains this image does not contain any text, the effects of using
+  // this alignment are undefined.
+  SPAN_VALIGN_TEXT_BASELINE = 2;
+}
+
+// An extensible SpanVerticalAlignment property.
+message SpanVerticalAlignmentProp {
+  // The value.
+  SpanVerticalAlignment value = 1;
+}
+
 // The styling of a font (e.g. font size, and metrics).
 message FontStyle {
   // The size of the font, in scaled pixels (sp). If not specified, defaults to
@@ -106,6 +152,11 @@
   // letters while negative numbers tighten the space. If not specified,
   // defaults to 0.
   EmProp letter_spacing = 6;
+
+  // The variant of a font. Some renderers may use different fonts for title and
+  // body text, which can be selected using this field. If not specified,
+  // defaults to "body".
+  FontVariantProp variant = 7;
 }
 
 // Alignment of a text element.
@@ -133,8 +184,6 @@
 
 // How text that will not fit inside the bounds of a Text element will be
 // handled.
-//
-// TODO(b/175536688): Rename this to align with Spannable
 enum TextOverflow {
   // Overflow behavior is undefined.
   TEXT_OVERFLOW_UNDEFINED = 0;
@@ -263,6 +312,7 @@
 
 // An extensible ContentScaleMode property.
 message ContentScaleModeProp {
+  // The value
   ContentScaleMode value = 1;
 }
 
@@ -362,6 +412,10 @@
 
   // Modifiers for this element.
   SpanModifiers modifiers = 4;
+
+  // Alignment of this image within the line height of the surrounding
+  // Spannable. If undefined, defaults to SPAN_VALIGN_BOTTOM.
+  SpanVerticalAlignmentProp alignment = 5;
 }
 
 // A single Span. Each Span forms part of a larger Spannable widget. At the
@@ -490,9 +544,8 @@
   // degrees), and values >360 will be be placed at X mod 360 degrees.
   DegreesProp anchor_angle = 2;
 
-  // How to align the contents of this container relative to anchor_angle. See
-  // the descriptions of options in ArcAnchorType for more information. If not
-  // defined, defaults to ARC_ANCHOR_CENTER.
+  // How to align the contents of this container relative to anchor_angle. If
+  // not defined, defaults to ARC_ANCHOR_CENTER.
   ArcAnchorTypeProp anchor_type = 3;
 
   // Vertical alignment of elements within the arc. If the Arc's thickness is
diff --git a/wear/tiles/tiles-proto/src/main/proto/modifiers.proto b/wear/tiles/tiles-proto/src/main/proto/modifiers.proto
index 0cc03fe..609f0d6 100644
--- a/wear/tiles/tiles-proto/src/main/proto/modifiers.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/modifiers.proto
@@ -100,7 +100,7 @@
   // Draws a border around the modified element.
   Border border = 4;
 
-  // Adds a background (with optional corner radius) to the modified element.
+  // Adds a background (with corner radius) to the modified element.
   Background background = 5;
 }
 
diff --git a/wear/tiles/tiles-proto/src/main/proto/requests.proto b/wear/tiles/tiles-proto/src/main/proto/requests.proto
index 17e9522..9fcdfa0 100644
--- a/wear/tiles/tiles-proto/src/main/proto/requests.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/requests.proto
@@ -22,7 +22,8 @@
 // Parameters passed to a Tile provider when the renderer is requesting a
 // specific resource version.
 message ResourcesRequest {
-  // The version of the resources being fetched
+  // The version of the resources being fetched. This is the same as the
+  // requested resource version, passed in Tile.
   string version = 1;
 
   // Requested resource IDs. If not specified, all resources for the given
diff --git a/wear/tiles/tiles-proto/src/main/proto/resources.proto b/wear/tiles/tiles-proto/src/main/proto/resources.proto
index 4407bae..eb4d8af 100644
--- a/wear/tiles/tiles-proto/src/main/proto/resources.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/resources.proto
@@ -3,7 +3,6 @@
 
 package androidx.wear.tiles.proto;
 
-
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "ResourceProto";
 
@@ -50,7 +49,7 @@
 // to what it thinks is appropriate.
 message ImageResource {
   // An image resource that maps to an Android drawable by resource ID.
-  AndroidImageResourceByResId android_resource_by_resid = 1;
+  AndroidImageResourceByResId android_resource_by_res_id = 1;
 
   // An image resource that contains the image data inline.
   InlineImageResource inline_resource = 2;
@@ -65,7 +64,8 @@
   // to separately fetch the resources.
   //
   // This value must match the version of the resources required by the tile
-  // for the tile to render successfully.
+  // for the tile to render successfully, and must match the resource version
+  // specified in ResourcesRequest which triggered this request.
   string version = 1;
 
   // A map of resource_ids to images, which can be used by layouts.
diff --git a/wear/tiles/tiles-proto/src/main/proto/state.proto b/wear/tiles/tiles-proto/src/main/proto/state.proto
index fb8755d..749d051 100644
--- a/wear/tiles/tiles-proto/src/main/proto/state.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/state.proto
@@ -3,7 +3,6 @@
 
 package androidx.wear.tiles.proto;
 
-
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "StateProto";
 
diff --git a/wear/tiles/tiles-proto/src/main/proto/tile.proto b/wear/tiles/tiles-proto/src/main/proto/tile.proto
index 1bbded9..fb41af4 100644
--- a/wear/tiles/tiles-proto/src/main/proto/tile.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/tile.proto
@@ -12,7 +12,10 @@
 // A holder for a tile. This specifies the resources to use for this delivery
 // of the tile, and the timeline for the tile.
 message Tile {
-  // The resource version required for these tiles.
+  // The resource version required for these tiles. This can be any developer-defined
+  // string; it is only used to cache resources, and is passed in
+  // ResourcesRequest if the system does not have a copy of the specified
+  // resource version.
   string resources_version = 1;
 
   // The tiles to show in the carousel, along with their validity periods.
@@ -26,5 +29,12 @@
   // your tile at some point in the future after this interval has lapsed. A
   // value of 0 here signifies that auto-refreshes should not be used (i.e. you
   // will manually request updates via TileProviderService#getRequester).
+  //
+  // This mechanism should not be used to update your tile more frequently than
+  // once a minute, and the system may throttle your updates if you request
+  // updates faster than this interval. This interval is also inexact; the
+  // system will generally update your tile if it is on-screen, or about to be
+  // on-screen, although this is not guaranteed due to system-level
+  // optimizations.
   uint64 freshness_interval_millis = 4;
 }
diff --git a/wear/tiles/tiles-proto/src/main/proto/version.proto b/wear/tiles/tiles-proto/src/main/proto/version.proto
index 7d509fe..869841a 100644
--- a/wear/tiles/tiles-proto/src/main/proto/version.proto
+++ b/wear/tiles/tiles-proto/src/main/proto/version.proto
@@ -3,7 +3,6 @@
 
 package androidx.wear.tiles.proto;
 
-
 option java_package = "androidx.wear.tiles.proto";
 option java_outer_classname = "VersionProto";
 
diff --git a/wear/tiles/tiles-renderer/api/current.txt b/wear/tiles/tiles-renderer/api/current.txt
index 014a5a0..ba8b269 100644
--- a/wear/tiles/tiles-renderer/api/current.txt
+++ b/wear/tiles/tiles-renderer/api/current.txt
@@ -1,10 +1,10 @@
 // Signature format: 4.0
 package androidx.wear.tiles.manager {
 
-  public final class TileManager implements java.lang.AutoCloseable {
-    ctor public TileManager(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
+  public final class TileClient implements java.lang.AutoCloseable {
+    ctor public TileClient(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
     method @MainThread public void close();
-    method @MainThread public void create();
+    method @MainThread public void connect();
   }
 
 }
@@ -28,13 +28,13 @@
   public final class TilesTimelineCache {
     ctor public TilesTimelineCache(androidx.wear.tiles.builders.TimelineBuilders.Timeline);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findClosestTimelineEntry(long);
-    method public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
+    method @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findTimelineEntryForTime(long);
   }
 
-  public class TilesTimelineManager {
+  public class TilesTimelineManager implements java.lang.AutoCloseable {
     ctor public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.tiles.builders.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.Listener);
-    method public void deInit();
+    method public void close();
     method public void init();
   }
 
diff --git a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
index 014a5a0..ba8b269 100644
--- a/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-renderer/api/public_plus_experimental_current.txt
@@ -1,10 +1,10 @@
 // Signature format: 4.0
 package androidx.wear.tiles.manager {
 
-  public final class TileManager implements java.lang.AutoCloseable {
-    ctor public TileManager(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
+  public final class TileClient implements java.lang.AutoCloseable {
+    ctor public TileClient(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
     method @MainThread public void close();
-    method @MainThread public void create();
+    method @MainThread public void connect();
   }
 
 }
@@ -28,13 +28,13 @@
   public final class TilesTimelineCache {
     ctor public TilesTimelineCache(androidx.wear.tiles.builders.TimelineBuilders.Timeline);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findClosestTimelineEntry(long);
-    method public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
+    method @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findTimelineEntryForTime(long);
   }
 
-  public class TilesTimelineManager {
+  public class TilesTimelineManager implements java.lang.AutoCloseable {
     ctor public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.tiles.builders.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.Listener);
-    method public void deInit();
+    method public void close();
     method public void init();
   }
 
diff --git a/wear/tiles/tiles-renderer/api/restricted_current.txt b/wear/tiles/tiles-renderer/api/restricted_current.txt
index 014a5a0..ba8b269 100644
--- a/wear/tiles/tiles-renderer/api/restricted_current.txt
+++ b/wear/tiles/tiles-renderer/api/restricted_current.txt
@@ -1,10 +1,10 @@
 // Signature format: 4.0
 package androidx.wear.tiles.manager {
 
-  public final class TileManager implements java.lang.AutoCloseable {
-    ctor public TileManager(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
+  public final class TileClient implements java.lang.AutoCloseable {
+    ctor public TileClient(android.content.Context context, android.content.ComponentName component, android.view.ViewGroup parentView);
     method @MainThread public void close();
-    method @MainThread public void create();
+    method @MainThread public void connect();
   }
 
 }
@@ -28,13 +28,13 @@
   public final class TilesTimelineCache {
     ctor public TilesTimelineCache(androidx.wear.tiles.builders.TimelineBuilders.Timeline);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findClosestTimelineEntry(long);
-    method public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
+    method @MainThread public long findCurrentTimelineEntryExpiry(androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry, long);
     method @MainThread public androidx.wear.tiles.builders.TimelineBuilders.TimelineEntry? findTimelineEntryForTime(long);
   }
 
-  public class TilesTimelineManager {
+  public class TilesTimelineManager implements java.lang.AutoCloseable {
     ctor public TilesTimelineManager(android.app.AlarmManager, androidx.wear.tiles.timeline.TilesTimelineManager.Clock, androidx.wear.tiles.builders.TimelineBuilders.Timeline, int, java.util.concurrent.Executor, androidx.wear.tiles.timeline.TilesTimelineManager.Listener);
-    method public void deInit();
+    method public void close();
     method public void init();
   }
 
diff --git a/wear/tiles/tiles-renderer/build.gradle b/wear/tiles/tiles-renderer/build.gradle
index b65ef4c..622d6c7 100644
--- a/wear/tiles/tiles-renderer/build.gradle
+++ b/wear/tiles/tiles-renderer/build.gradle
@@ -32,7 +32,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api(GUAVA_LISTENABLE_FUTURE)
-    implementation 'androidx.annotation:annotation:1.2.0-alpha01'
+
     implementation "androidx.concurrent:concurrent-futures:1.1.0"
     implementation "androidx.core:core:1.3.2"
     implementation(project(":wear:tiles:tiles"))
@@ -64,6 +64,10 @@
         minSdkVersion 26
     }
 
+    buildTypes.all {
+        consumerProguardFiles "proguard-rules.pro"
+    }
+
     // Use Robolectric 4.+
     testOptions.unitTests.includeAndroidResources = true
 
diff --git a/wear/tiles/tiles-renderer/proguard-rules.pro b/wear/tiles/tiles-renderer/proguard-rules.pro
new file mode 100644
index 0000000..23e141a
--- /dev/null
+++ b/wear/tiles/tiles-renderer/proguard-rules.pro
@@ -0,0 +1,20 @@
+#  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.
+
+# libproto uses reflection to deserialize a Proto, which Proguard can't accurately detect.
+# Keep all the class members of any generated messages to ensure we can deserialize properly inside
+# these classes.
+-keepclassmembers class * extends androidx.wear.tiles.protobuf.GeneratedMessageLite {
+  <fields>;
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
index 5fb0cfb..90053ee 100644
--- a/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
+++ b/wear/tiles/tiles-renderer/src/androidTest/java/androidx/wear/tiles/renderer/test/TileRendererGoldenTest.java
@@ -170,14 +170,14 @@
                 .putIdToImage(
                         "android",
                         ImageResource.newBuilder()
-                                .setAndroidResourceByResid(
+                                .setAndroidResourceByResId(
                                         AndroidImageResourceByResId.newBuilder()
                                                 .setResourceId(R.drawable.android_24dp))
                                 .build())
                 .putIdToImage(
                         "android_withbg_120dp",
                         ImageResource.newBuilder()
-                                .setAndroidResourceByResid(
+                                .setAndroidResourceByResId(
                                         AndroidImageResourceByResId.newBuilder()
                                                 .setResourceId(R.mipmap.android_withbg_120dp))
                                 .build())
@@ -194,14 +194,14 @@
                 .putIdToImage(
                         "broken_image",
                         ImageResource.newBuilder()
-                                .setAndroidResourceByResid(
+                                .setAndroidResourceByResId(
                                         AndroidImageResourceByResId.newBuilder()
                                                 .setResourceId(R.drawable.broken_drawable))
                                 .build())
                 .putIdToImage(
                         "missing_image",
                         ImageResource.newBuilder()
-                                .setAndroidResourceByResid(
+                                .setAndroidResourceByResId(
                                         AndroidImageResourceByResId.newBuilder().setResourceId(-1))
                                 .build())
                 .build();
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileClient.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileClient.kt
new file mode 100644
index 0000000..cc45d89
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileClient.kt
@@ -0,0 +1,219 @@
+/*
+ * 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.tiles.manager
+
+import android.app.AlarmManager
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.SystemClock
+import android.util.DisplayMetrics
+import android.view.Gravity
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.annotation.MainThread
+import androidx.core.content.ContextCompat
+import androidx.wear.tiles.builders.LayoutElementBuilders
+import androidx.wear.tiles.builders.ResourceBuilders
+import androidx.wear.tiles.builders.TimelineBuilders
+import androidx.wear.tiles.connection.TilesConnection
+import androidx.wear.tiles.proto.DeviceParametersProto
+import androidx.wear.tiles.proto.RequestProto
+import androidx.wear.tiles.proto.StateProto
+import androidx.wear.tiles.renderer.TileRenderer
+import androidx.wear.tiles.timeline.TilesTimelineManager
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.util.concurrent.Executors
+
+/**
+ * UI client for a single tile. This handles binding to a Tile Provider, and inflating the given
+ * tile contents into the provided parentView. This also handles requested updates, re-fetching the
+ * tile on-demand.
+ *
+ * After creation, you should call {@link #connect} to connect and start the initial fetch.
+ * Likewise, when the owning activity is destroyed, you should call {@link #close} to disconnect
+ * and release resources.
+ */
+public class TileClient(
+    private val context: Context,
+    component: ComponentName,
+    private val parentView: ViewGroup
+) : AutoCloseable {
+    private companion object {
+        private const val ACTION_REQUEST_TILE_UPDATE =
+            "androidx.wear.tiles.action.REQUEST_TILE_UPDATE"
+    }
+
+    private val job = Job()
+    private val coroutineScope = CoroutineScope(Dispatchers.Main + job)
+
+    private val tilesConnection = TilesConnection(
+        context = context,
+        componentName = component,
+        coroutineScope = coroutineScope,
+        coroutineDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
+    )
+
+    private var timelineManager: TilesTimelineManager? = null
+    private var tileResources: ResourceBuilders.Resources? = null
+    private val updateScheduler = UpdateScheduler(
+        context.getSystemService(AlarmManager::class.java),
+        SystemClock::elapsedRealtime
+    )
+
+    private val updateReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent?) {
+            updateScheduler.updateNow(false)
+        }
+    }
+
+    private var isRunning = false
+
+    /**
+     * Initialize this {@link TileManager}. This will cause the {@link TileManager} to connect to
+     * the tile provider and request the first tile. It will also trigger any requested updates.
+     */
+    @MainThread
+    public fun connect() {
+        if (isRunning) {
+            return
+        }
+
+        coroutineScope.launch { requestTile() }
+        updateScheduler.enableUpdates()
+        updateScheduler.setUpdateReceiver {
+            coroutineScope.launch { requestTile() }
+        }
+        registerBroadcastReceiver()
+
+        isRunning = true
+    }
+
+    /**
+     * Shut down this {@link TileManager}. This will cancel any scheduled updates, and close the
+     * connection with the tile provider.
+     */
+    @MainThread
+    override fun close() {
+        if (!isRunning) {
+            // Technically not needed, as the below code should be idempotent anyway.
+            return
+        }
+
+        context.unregisterReceiver(updateReceiver)
+        job.cancel()
+        updateScheduler.disableUpdates()
+        timelineManager?.close()
+        timelineManager = null
+        isRunning = false
+    }
+
+    private suspend fun requestTile(
+        state: StateProto.State? = StateProto.State.getDefaultInstance()
+    ) = coroutineScope {
+        withContext(Dispatchers.Main) {
+            val tileRequest = RequestProto.TileRequest
+                .newBuilder()
+                .setState(state)
+                .setDeviceParameters(buildDeviceParameters())
+                .build()
+
+            val tile = tilesConnection.tileRequest(tileRequest)
+            val tileProto = tile.toProto()
+
+            if (tileProto.resourcesVersion.isNotEmpty() && tileProto.resourcesVersion
+                != tileResources?.toProto()?.version
+            ) {
+                val resourcesRequest = RequestProto.ResourcesRequest
+                    .newBuilder()
+                    .setVersion(tileProto.resourcesVersion)
+                    .setDeviceParameters(buildDeviceParameters())
+                    .build()
+
+                tileResources = tilesConnection.resourcesRequest(resourcesRequest)
+            }
+
+            timelineManager?.apply {
+                close()
+            }
+
+            val localTimelineManager = TilesTimelineManager(
+                context.getSystemService(AlarmManager::class.java),
+                System::currentTimeMillis,
+                TimelineBuilders.Timeline.fromProto(tile.toProto().timeline),
+                0,
+                ContextCompat.getMainExecutor(context),
+                { _, layout -> updateContents(layout) }
+            )
+            timelineManager = localTimelineManager
+
+            val freshnessInterval = tile.toProto().freshnessIntervalMillis
+            if (freshnessInterval > 0) {
+                updateScheduler.scheduleUpdateAtTime(freshnessInterval)
+            }
+
+            // Last check; only init this if we haven't been cancelled.
+            if (isActive) {
+                localTimelineManager.init()
+            }
+        }
+    }
+
+    private fun updateContents(layout: LayoutElementBuilders.Layout) {
+        parentView.removeAllViews()
+
+        val renderer = TileRenderer(
+            context,
+            layout,
+            tileResources!!,
+            ContextCompat.getMainExecutor(context),
+            { state -> coroutineScope.launch { requestTile(state.toProto()) } }
+        )
+        renderer.inflate(parentView)?.apply {
+            (layoutParams as FrameLayout.LayoutParams).gravity = Gravity.CENTER
+        }
+    }
+
+    private fun registerBroadcastReceiver() {
+        val i = IntentFilter(Companion.ACTION_REQUEST_TILE_UPDATE)
+        context.registerReceiver(updateReceiver, i)
+    }
+
+    private fun buildDeviceParameters(): DeviceParametersProto.DeviceParameters? {
+        val displayMetrics: DisplayMetrics = context.resources.displayMetrics
+        val isScreenRound: Boolean = context.resources.configuration.isScreenRound
+        return DeviceParametersProto.DeviceParameters.newBuilder()
+            .setScreenWidthDp(Math.round(displayMetrics.widthPixels / displayMetrics.density))
+            .setScreenHeightDp(Math.round(displayMetrics.heightPixels / displayMetrics.density))
+            .setScreenDensity(displayMetrics.density)
+            .setScreenShape(
+                if (isScreenRound) DeviceParametersProto.ScreenShape.SCREEN_SHAPE_ROUND
+                else DeviceParametersProto.ScreenShape.SCREEN_SHAPE_RECT
+            )
+            .setDevicePlatform(DeviceParametersProto.DevicePlatform.DEVICE_PLATFORM_WEAR_OS)
+            .build()
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileManager.kt b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileManager.kt
deleted file mode 100644
index 51095fd..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/manager/TileManager.kt
+++ /dev/null
@@ -1,214 +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.wear.tiles.manager
-
-import android.app.AlarmManager
-import android.content.BroadcastReceiver
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.os.SystemClock
-import android.util.DisplayMetrics
-import android.view.Gravity
-import android.view.ViewGroup
-import android.widget.FrameLayout
-import androidx.annotation.MainThread
-import androidx.core.content.ContextCompat
-import androidx.wear.tiles.ViewerTileUpdateRequester
-import androidx.wear.tiles.builders.LayoutElementBuilders
-import androidx.wear.tiles.builders.ResourceBuilders
-import androidx.wear.tiles.builders.TimelineBuilders
-import androidx.wear.tiles.connection.TilesConnection
-import androidx.wear.tiles.proto.DeviceParametersProto
-import androidx.wear.tiles.proto.RequestProto
-import androidx.wear.tiles.proto.StateProto
-import androidx.wear.tiles.renderer.TileRenderer
-import androidx.wear.tiles.timeline.TilesTimelineManager
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.asCoroutineDispatcher
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.isActive
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-import java.util.concurrent.Executors
-
-/**
- * UI manager for a single tile. This handles binding to a Tile Provider, and inflating the given
- * tile contents into the provided parentView. This also handles requested updates, re-fetching the
- * tile on-demand.
- *
- * After creation, you should call {@link #create} to start the initial fetch. Likewise, when the
- * owning activity is destroyed, you should call {@link #close} to shut the manager down.
- */
-public class TileManager(
-    private val context: Context,
-    component: ComponentName,
-    private val parentView: ViewGroup
-) : AutoCloseable {
-    private val job = Job()
-    private val coroutineScope = CoroutineScope(Dispatchers.Main + job)
-
-    private val tilesConnection = TilesConnection(
-        context = context,
-        componentName = component,
-        coroutineScope = coroutineScope,
-        coroutineDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
-    )
-
-    private var timelineManager: TilesTimelineManager? = null
-    private var tileResources: ResourceBuilders.Resources? = null
-    private val updateScheduler = UpdateScheduler(
-        context.getSystemService(AlarmManager::class.java),
-        SystemClock::elapsedRealtime
-    )
-
-    private val updateReceiver = object : BroadcastReceiver() {
-        override fun onReceive(context: Context?, intent: Intent?) {
-            updateScheduler.updateNow(false)
-        }
-    }
-
-    private var isRunning = false
-
-    /**
-     * Initialize this {@link TileManager}. This will cause the {@link TileManager} to connect to
-     * the tile provider and request the first tile. It will also trigger any requested updates.
-     */
-    @MainThread
-    public fun create() {
-        if (isRunning) {
-            return
-        }
-
-        coroutineScope.launch { requestTile() }
-        updateScheduler.enableUpdates()
-        updateScheduler.setUpdateReceiver {
-            coroutineScope.launch { requestTile() }
-        }
-        registerBroadcastReceiver()
-
-        isRunning = true
-    }
-
-    /**
-     * Shut down this {@link TileManager}. This will cancel any scheduled updates, and close the
-     * connection with the tile provider.
-     */
-    @MainThread
-    override fun close() {
-        if (!isRunning) {
-            // Technically not needed, as the below code should be idempotent anyway.
-            return
-        }
-
-        context.unregisterReceiver(updateReceiver)
-        job.cancel()
-        updateScheduler.disableUpdates()
-        timelineManager?.deInit()
-        timelineManager = null
-        isRunning = false
-    }
-
-    private suspend fun requestTile(
-        state: StateProto.State? = StateProto.State.getDefaultInstance()
-    ) = coroutineScope {
-        withContext(Dispatchers.Main) {
-            val tileRequest = RequestProto.TileRequest
-                .newBuilder()
-                .setState(state)
-                .setDeviceParameters(buildDeviceParameters())
-                .build()
-
-            val tile = tilesConnection.tileRequest(tileRequest)
-            val tileProto = tile.toProto()
-
-            if (tileProto.resourcesVersion.isNotEmpty() && tileProto.resourcesVersion
-                != tileResources?.toProto()?.version
-            ) {
-                val resourcesRequest = RequestProto.ResourcesRequest
-                    .newBuilder()
-                    .setVersion(tileProto.resourcesVersion)
-                    .setDeviceParameters(buildDeviceParameters())
-                    .build()
-
-                tileResources = tilesConnection.resourcesRequest(resourcesRequest)
-            }
-
-            timelineManager?.apply {
-                deInit()
-            }
-
-            val localTimelineManager = TilesTimelineManager(
-                context.getSystemService(AlarmManager::class.java),
-                System::currentTimeMillis,
-                TimelineBuilders.Timeline.fromProto(tile.toProto().timeline),
-                0,
-                ContextCompat.getMainExecutor(context),
-                { _, layout -> updateContents(layout) }
-            )
-            timelineManager = localTimelineManager
-
-            val freshnessInterval = tile.toProto().freshnessIntervalMillis
-            if (freshnessInterval > 0) {
-                updateScheduler.scheduleUpdateAtTime(freshnessInterval)
-            }
-
-            // Last check; only init this if we haven't been cancelled.
-            if (isActive) {
-                localTimelineManager.init()
-            }
-        }
-    }
-
-    private fun updateContents(layout: LayoutElementBuilders.Layout) {
-        parentView.removeAllViews()
-
-        val renderer = TileRenderer(
-            context,
-            layout,
-            tileResources!!,
-            ContextCompat.getMainExecutor(context),
-            { state -> coroutineScope.launch { requestTile(state.toProto()) } }
-        )
-        renderer.inflate(parentView)?.apply {
-            (layoutParams as FrameLayout.LayoutParams).gravity = Gravity.CENTER
-        }
-    }
-
-    private fun registerBroadcastReceiver() {
-        val i = IntentFilter(ViewerTileUpdateRequester.ACTION_REQUEST_TILE_UPDATE)
-        context.registerReceiver(updateReceiver, i)
-    }
-
-    private fun buildDeviceParameters(): DeviceParametersProto.DeviceParameters? {
-        val displayMetrics: DisplayMetrics = context.resources.displayMetrics
-        val isScreenRound: Boolean = context.resources.configuration.isScreenRound
-        return DeviceParametersProto.DeviceParameters.newBuilder()
-            .setScreenWidthDp(Math.round(displayMetrics.widthPixels / displayMetrics.density))
-            .setScreenHeightDp(Math.round(displayMetrics.heightPixels / displayMetrics.density))
-            .setScreenDensity(displayMetrics.density)
-            .setScreenShape(
-                if (isScreenRound) DeviceParametersProto.ScreenShape.SCREEN_SHAPE_ROUND
-                else DeviceParametersProto.ScreenShape.SCREEN_SHAPE_RECT
-            )
-            .setDevicePlatform(DeviceParametersProto.DevicePlatform.DEVICE_PLATFORM_WEAR_OS)
-            .build()
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
index e77e338..12f864d 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
@@ -26,7 +26,7 @@
 import androidx.wear.tiles.builders.LayoutElementBuilders;
 import androidx.wear.tiles.builders.ResourceBuilders;
 import androidx.wear.tiles.builders.StateBuilders;
-import androidx.wear.tiles.renderer.internal.StandardResourceAccessors;
+import androidx.wear.tiles.renderer.internal.StandardResourceResolvers;
 import androidx.wear.tiles.renderer.internal.TileRendererInternal;
 
 import java.util.concurrent.Executor;
@@ -93,13 +93,15 @@
             @NonNull ResourceBuilders.Resources resources,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
-        this.mRenderer = new TileRendererInternal(
-                appContext,
-                layout.toProto(),
-                StandardResourceAccessors.forLocalApp(appContext, resources).build(),
-                tilesTheme,
-                loadActionExecutor,
-                (s) -> loadActionListener.onClick(StateBuilders.State.fromProto(s)));
+        this.mRenderer =
+                new TileRendererInternal(
+                        appContext,
+                        layout.toProto(),
+                        StandardResourceResolvers.forLocalApp(resources.toProto(), appContext)
+                                .build(),
+                        tilesTheme,
+                        loadActionExecutor,
+                        (s) -> loadActionListener.onClick(StateBuilders.State.fromProto(s)));
     }
 
     /**
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/AndroidResourceAccessor.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/AndroidResourceAccessor.java
deleted file mode 100644
index 2f46f99..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/AndroidResourceAccessor.java
+++ /dev/null
@@ -1,60 +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.wear.tiles.renderer.internal;
-
-import android.annotation.SuppressLint;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.concurrent.futures.ResolvableFuture;
-import androidx.wear.tiles.proto.ResourceProto.AndroidImageResourceByResId;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Resource accessor for Android resources.
- */
-public class AndroidResourceAccessor
-        implements ResourceAccessors.AndroidImageResourceByResIdAccessor {
-    private final Resources mAndroidResources;
-
-    /**
-     * Constructor.
-     *
-     * @param androidResources An Android Resources instance for the tile provider's package. This
-     *     is normally obtained from {@code PackageManager#getResourcesForApplication}.
-     */
-    public AndroidResourceAccessor(@NonNull Resources androidResources) {
-        this.mAndroidResources = androidResources;
-    }
-
-    @Override
-    @NonNull
-    @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
-    public ListenableFuture<Drawable> getDrawable(@NonNull AndroidImageResourceByResId resource) {
-        ResolvableFuture<Drawable> future = ResolvableFuture.create();
-        try {
-            future.set(mAndroidResources.getDrawable(resource.getResourceId(), null));
-        } catch (NotFoundException e) {
-            future.setException(e);
-        }
-
-        return future;
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/CustomTypefaceSpan.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/CustomTypefaceSpan.java
new file mode 100644
index 0000000..17a475e5
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/CustomTypefaceSpan.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.wear.tiles.renderer.internal;
+
+import android.graphics.Typeface;
+import android.text.TextPaint;
+import android.text.style.MetricAffectingSpan;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Stripped down version of TypefaceSpan, which can accept a Typeface argument on API levels under
+ * 28.
+ */
+public class CustomTypefaceSpan extends MetricAffectingSpan {
+    private final Typeface mTypeface;
+
+    public CustomTypefaceSpan(@NonNull Typeface typeface) {
+        mTypeface = typeface;
+    }
+
+    @Override
+    public void updateMeasureState(@NonNull TextPaint textPaint) {
+        textPaint.setTypeface(mTypeface);
+    }
+
+    @Override
+    public void updateDrawState(@NonNull TextPaint tp) {
+        tp.setTypeface(mTypeface);
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java
new file mode 100644
index 0000000..c3ab842
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultAndroidImageResourceByResIdResolver.java
@@ -0,0 +1,59 @@
+/*
+ * 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.tiles.renderer.internal;
+
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+import androidx.wear.tiles.proto.ResourceProto.AndroidImageResourceByResId;
+import androidx.wear.tiles.renderer.internal.ResourceResolvers.AndroidImageResourceByResIdResolver;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/** Resource resolver for Android resources. */
+public class DefaultAndroidImageResourceByResIdResolver
+        implements AndroidImageResourceByResIdResolver {
+    private final Resources mAndroidResources;
+
+    /**
+     * Constructor.
+     *
+     * @param androidResources An Android Resources instance for the tile provider's package. This
+     *     is normally obtained from {@code PackageManager#getResourcesForApplication}.
+     */
+    public DefaultAndroidImageResourceByResIdResolver(@NonNull Resources androidResources) {
+        this.mAndroidResources = androidResources;
+    }
+
+    @NonNull
+    @Override
+    public Drawable getDrawableOrThrow(@NonNull AndroidImageResourceByResId resource) {
+        return mAndroidResources.getDrawable(resource.getResourceId(), /* theme= */ null);
+    }
+
+    @Override
+    @NonNull
+    public ListenableFuture<Drawable> getDrawable(@NonNull AndroidImageResourceByResId resource) {
+        try {
+            return ResourceResolvers.createImmediateFuture(getDrawableOrThrow(resource));
+        } catch (NotFoundException ex) {
+            return ResourceResolvers.createFailedFuture(ex);
+        }
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java
new file mode 100644
index 0000000..b31a850
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/DefaultInlineImageResourceResolver.java
@@ -0,0 +1,127 @@
+/*
+ * 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.tiles.renderer.internal;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.wear.tiles.proto.ResourceProto.ImageFormat;
+import androidx.wear.tiles.proto.ResourceProto.InlineImageResource;
+import androidx.wear.tiles.renderer.internal.ResourceResolvers.InlineImageResourceResolver;
+import androidx.wear.tiles.renderer.internal.ResourceResolvers.ResourceAccessException;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.nio.ByteBuffer;
+
+/** Resource resolver for inline resources. */
+public class DefaultInlineImageResourceResolver implements InlineImageResourceResolver {
+    private static final int RGB565_BYTES_PER_PX = 2;
+
+    private final Context mAppContext;
+
+    /** Constructor. */
+    public DefaultInlineImageResourceResolver(@NonNull Context appContext) {
+        this.mAppContext = appContext;
+    }
+
+    @NonNull
+    @Override
+    public Drawable getDrawableOrThrow(@NonNull InlineImageResource inlineImage)
+            throws ResourceAccessException {
+        @Nullable Bitmap bitmap = null;
+
+        if (inlineImage.getFormat() == ImageFormat.IMAGE_FORMAT_RGB_565) {
+            bitmap = loadRawBitmap(inlineImage);
+        } else if (inlineImage.getFormat() == ImageFormat.IMAGE_FORMAT_UNDEFINED) {
+            bitmap = loadStructuredBitmap(inlineImage);
+        }
+
+        if (bitmap == null) {
+            throw new ResourceAccessException("Unsupported image format in image resource.");
+        }
+
+        // The app Context is correct here, as it's just used for display density, so it doesn't
+        // depend
+        // on anything from the provider app.
+        return new BitmapDrawable(mAppContext.getResources(), bitmap);
+    }
+
+    @Override
+    @NonNull
+    public ListenableFuture<Drawable> getDrawable(@NonNull InlineImageResource inlineImage) {
+        try {
+            return ResourceResolvers.createImmediateFuture(getDrawableOrThrow(inlineImage));
+        } catch (ResourceAccessException | RuntimeException ex) {
+            return ResourceResolvers.createFailedFuture(ex);
+        }
+    }
+
+    @Nullable
+    private static Config imageFormatToBitmapConfig(ImageFormat imageFormat) {
+        switch (imageFormat) {
+            case IMAGE_FORMAT_RGB_565:
+                return Config.RGB_565;
+            case IMAGE_FORMAT_UNDEFINED:
+            case UNRECOGNIZED:
+                return null;
+        }
+
+        return null;
+    }
+
+    @NonNull
+    private Bitmap loadRawBitmap(@NonNull InlineImageResource inlineImage)
+            throws ResourceAccessException {
+        Config config = imageFormatToBitmapConfig(inlineImage.getFormat());
+
+        // Only handles RGB_565 for now
+        if (config != Config.RGB_565) {
+            throw new ResourceAccessException("Unknown image format in image resource.");
+        }
+
+        int widthPx = inlineImage.getWidthPx();
+        int heightPx = inlineImage.getHeightPx();
+
+        int expectedDataSize = widthPx * heightPx * RGB565_BYTES_PER_PX;
+        if (inlineImage.getData().size() != expectedDataSize) {
+            throw new ResourceAccessException(
+                    "Mismatch between image data size and dimensions in image resource.");
+        }
+
+        Bitmap bitmap = Bitmap.createBitmap(widthPx, heightPx, config);
+        bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(inlineImage.getData().toByteArray()));
+
+        return bitmap;
+    }
+
+    @NonNull
+    private Bitmap loadStructuredBitmap(@NonNull InlineImageResource inlineImage) {
+        Bitmap bitmap =
+                BitmapFactory.decodeByteArray(
+                        inlineImage.getData().toByteArray(), 0, inlineImage.getData().size());
+
+        return Bitmap.createScaledBitmap(
+                bitmap, inlineImage.getWidthPx(), inlineImage.getHeightPx(), /* filter= */ true);
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/InlineResourceAccessor.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/InlineResourceAccessor.java
deleted file mode 100644
index 6a6964c..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/InlineResourceAccessor.java
+++ /dev/null
@@ -1,97 +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.wear.tiles.renderer.internal;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.concurrent.futures.ResolvableFuture;
-import androidx.wear.tiles.proto.ResourceProto.ImageFormat;
-import androidx.wear.tiles.proto.ResourceProto.InlineImageResource;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.nio.ByteBuffer;
-
-/**
- * Resource accessor for inline resources.
- */
-public class InlineResourceAccessor implements ResourceAccessors.InlineImageResourceAccessor {
-    private static final int RGB565_BYTES_PER_PX = 2;
-
-    private final Context mAppContext;
-
-    /** Constructor. */
-    public InlineResourceAccessor(@NonNull Context appContext) {
-        this.mAppContext = appContext;
-    }
-
-    @Nullable
-    private static Config imageFormatToBitmapConfig(ImageFormat imageFormat) {
-        switch (imageFormat) {
-            case IMAGE_FORMAT_RGB_565:
-                return Config.RGB_565;
-            case IMAGE_FORMAT_UNDEFINED:
-            case UNRECOGNIZED:
-                return null;
-        }
-
-        return null;
-    }
-
-    @Override
-    @NonNull
-    @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
-    public ListenableFuture<Drawable> getDrawable(@NonNull InlineImageResource inlineImage) {
-        Config config = imageFormatToBitmapConfig(inlineImage.getFormat());
-        ResolvableFuture<Drawable> future = ResolvableFuture.create();
-
-        // Only handles RGB_565 for now
-        if (config != Config.RGB_565) {
-            future.setException(
-                    new ResourceAccessors.ResourceAccessException(
-                            "Unknown image format in image resource."));
-            return future;
-        }
-
-        int widthPx = inlineImage.getWidthPx();
-        int heightPx = inlineImage.getHeightPx();
-
-        int expectedDataSize = widthPx * heightPx * RGB565_BYTES_PER_PX;
-        if (inlineImage.getData().size() != expectedDataSize) {
-            future.setException(
-                    new ResourceAccessors.ResourceAccessException(
-                            "Mismatch between image data size and dimensions in image resource."));
-            return future;
-        }
-
-        Bitmap bitmap = Bitmap.createBitmap(widthPx, heightPx, config);
-        bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(inlineImage.getData().toByteArray()));
-
-        // The app Context is correct here, as it's just used for display density, so it doesn't
-        // depend
-        // on anything from the provider app.
-        future.set(new BitmapDrawable(mAppContext.getResources(), bitmap));
-        return future;
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/LetterSpacingSpan.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/LetterSpacingSpan.java
index 642be88..902fb6c 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/LetterSpacingSpan.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/LetterSpacingSpan.java
@@ -21,10 +21,9 @@
 
 import androidx.annotation.NonNull;
 
-/**
- * LetterSpacingSpan class used to apply custom spacing between letters.
- */
+/** LetterSpacingSpan class used to apply custom spacing between letters. */
 public class LetterSpacingSpan extends MetricAffectingSpan {
+
     private final float mLetterSpacingEm;
 
     /** @param letterSpacingEm letter-spacing for text. */
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
index 2623851..44586ce 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/RatioViewWrapper.java
@@ -63,7 +63,9 @@
     }
 
     public RatioViewWrapper(
-            @NonNull Context context, @Nullable AttributeSet attributeSet, int defStyleAttr) {
+            @NonNull Context context,
+            @Nullable AttributeSet attributeSet,
+            @AttrRes int defStyleAttr) {
         this(context, attributeSet, defStyleAttr, 0);
     }
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceAccessors.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceAccessors.java
deleted file mode 100644
index b420042..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceAccessors.java
+++ /dev/null
@@ -1,153 +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.wear.tiles.renderer.internal;
-
-import android.annotation.SuppressLint;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.concurrent.futures.ResolvableFuture;
-import androidx.wear.tiles.proto.ResourceProto;
-import androidx.wear.tiles.proto.ResourceProto.AndroidImageResourceByResId;
-import androidx.wear.tiles.proto.ResourceProto.InlineImageResource;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Class for accessing resources. Delegates the actual work to different types of accessor classes,
- * and allows each type of accessor to be configured individually, as well as instantiation from
- * common accessor implementations.
- */
-public class ResourceAccessors {
-    private final ResourceProto.Resources mProtoResources;
-
-    @Nullable
-    private final AndroidImageResourceByResIdAccessor mAndroidImageResourceByResIdAccessor;
-
-    @Nullable private final InlineImageResourceAccessor mInlineImageResourceAccessor;
-
-    ResourceAccessors(
-            ResourceProto.Resources protoResources,
-            @Nullable AndroidImageResourceByResIdAccessor androidImageResourceByResIdAccessor,
-            @Nullable InlineImageResourceAccessor inlineImageResourceAccessor) {
-        this.mProtoResources = protoResources;
-        this.mAndroidImageResourceByResIdAccessor = androidImageResourceByResIdAccessor;
-        this.mInlineImageResourceAccessor = inlineImageResourceAccessor;
-    }
-
-    /** Exception thrown when accessing resources. */
-    public static final class ResourceAccessException extends Exception {
-        public ResourceAccessException(@NonNull String description) {
-            super(description);
-        }
-
-        public ResourceAccessException(@NonNull String description, @NonNull Exception cause) {
-            super(description, cause);
-        }
-    }
-
-    /** Interface that can provide a Drawable for an AndroidImageResourceByResId */
-    public interface AndroidImageResourceByResIdAccessor {
-        /** Get the drawable as specified by {@code resource}. */
-        @NonNull
-        ListenableFuture<Drawable> getDrawable(@NonNull AndroidImageResourceByResId resource);
-    }
-
-    /** Interface that can provide a Drawable for an InlineImageResource */
-    public interface InlineImageResourceAccessor {
-        /** Get the drawable as specified by {@code resource}. */
-        @NonNull
-        ListenableFuture<Drawable> getDrawable(@NonNull InlineImageResource resource);
-    }
-
-    /** Get an empty builder to build {@link ResourceAccessors} with. */
-    @NonNull
-    public static Builder builder(@NonNull ResourceProto.Resources protoResources) {
-        return new Builder(protoResources);
-    }
-
-    /** Get the drawable corresponding to the given resource ID. */
-    @NonNull
-    @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
-    public ListenableFuture<Drawable> getDrawable(@NonNull String protoResourceId) {
-        ResolvableFuture<Drawable> errorFuture = ResolvableFuture.create();
-        ResourceProto.ImageResource imageResource =
-                mProtoResources.getIdToImageMap().get(protoResourceId);
-
-        if (imageResource == null) {
-            errorFuture.setException(
-                    new IllegalArgumentException(
-                            "Resource " + protoResourceId + " is not defined in resources bundle"));
-            return errorFuture;
-        }
-
-        if (imageResource.hasAndroidResourceByResid()
-                && mAndroidImageResourceByResIdAccessor != null) {
-            AndroidImageResourceByResIdAccessor accessor = mAndroidImageResourceByResIdAccessor;
-            return accessor.getDrawable(imageResource.getAndroidResourceByResid());
-        }
-
-        if (imageResource.hasInlineResource() && mInlineImageResourceAccessor != null) {
-            InlineImageResourceAccessor accessor = mInlineImageResourceAccessor;
-            return accessor.getDrawable(imageResource.getInlineResource());
-        }
-
-        errorFuture.setException(
-                new IllegalArgumentException(
-                        new ResourceAccessException("Can't find accessor for image resource.")));
-        return errorFuture;
-    }
-
-    /** Builder for ResourceProviders */
-    public static final class Builder {
-        private final ResourceProto.Resources mProtoResources;
-        @Nullable private AndroidImageResourceByResIdAccessor mAndroidImageResourceByResIdAccessor;
-        @Nullable private InlineImageResourceAccessor mInlineImageResourceAccessor;
-
-        Builder(ResourceProto.Resources protoResources) {
-            this.mProtoResources = protoResources;
-        }
-
-        /** Set the resource loader for {@link AndroidImageResourceByResIdAccessor} resources. */
-        @NonNull
-        @SuppressLint("MissingGetterMatchingBuilder")
-        public Builder setAndroidImageResourceByResIdAccessor(
-                @NonNull AndroidImageResourceByResIdAccessor accessor) {
-            mAndroidImageResourceByResIdAccessor = accessor;
-            return this;
-        }
-
-        /** Set the resource loader for {@link InlineImageResourceAccessor} resources. */
-        @NonNull
-        @SuppressLint("MissingGetterMatchingBuilder")
-        public Builder setInlineImageResourceAccessor(
-                @NonNull InlineImageResourceAccessor accessor) {
-            mInlineImageResourceAccessor = accessor;
-            return this;
-        }
-
-        /** Build a {@link ResourceAccessors} instance. */
-        @NonNull
-        public ResourceAccessors build() {
-            return new ResourceAccessors(
-                    mProtoResources,
-                    mAndroidImageResourceByResIdAccessor,
-                    mInlineImageResourceAccessor);
-        }
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
new file mode 100644
index 0000000..0d63cdd
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/ResourceResolvers.java
@@ -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.wear.tiles.renderer.internal;
+
+import android.annotation.SuppressLint;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.concurrent.futures.ResolvableFuture;
+import androidx.wear.tiles.proto.ResourceProto;
+import androidx.wear.tiles.proto.ResourceProto.AndroidImageResourceByResId;
+import androidx.wear.tiles.proto.ResourceProto.InlineImageResource;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Class for resolving resources. Delegates the actual work to different types of resolver classes,
+ * and allows each type of resolver to be configured individually, as well as instantiation from
+ * common resolver implementations.
+ */
+public class ResourceResolvers {
+    private final ResourceProto.Resources mProtoResources;
+
+    @Nullable
+    private final AndroidImageResourceByResIdResolver mAndroidImageResourceByResIdResolver;
+
+    @Nullable private final InlineImageResourceResolver mInlineImageResourceResolver;
+
+    ResourceResolvers(
+            @NonNull ResourceProto.Resources protoResources,
+            @Nullable AndroidImageResourceByResIdResolver androidImageResourceByResIdResolver,
+            @Nullable InlineImageResourceResolver inlineImageResourceResolver) {
+        this.mProtoResources = protoResources;
+        this.mAndroidImageResourceByResIdResolver = androidImageResourceByResIdResolver;
+        this.mInlineImageResourceResolver = inlineImageResourceResolver;
+    }
+
+    /** Exception thrown when accessing resources. */
+    public static final class ResourceAccessException extends Exception {
+        public ResourceAccessException(@NonNull String description) {
+            super(description);
+        }
+
+        public ResourceAccessException(@NonNull String description, @NonNull Exception cause) {
+            super(description, cause);
+        }
+    }
+
+    /** Interface that can provide a Drawable for an AndroidImageResourceByResId */
+    public interface AndroidImageResourceByResIdResolver {
+        /**
+         * Should immediately return the drawable specified by {@code resource}.
+         *
+         * @throws ResourceAccessException If the drawable cannot be found, or has to be loaded
+         *     asynchronously.
+         */
+        @NonNull
+        Drawable getDrawableOrThrow(@NonNull AndroidImageResourceByResId resource)
+                throws ResourceAccessException;
+
+        /** Get the drawable as specified by {@code resource}. */
+        @NonNull
+        ListenableFuture<Drawable> getDrawable(@NonNull AndroidImageResourceByResId resource);
+    }
+
+    /** Interface that can provide a Drawable for an InlineImageResource */
+    public interface InlineImageResourceResolver {
+        /**
+         * Should immediately return the drawable specified by {@code resource}.
+         *
+         * @throws ResourceAccessException If the drawable cannot be found, or has to be loaded
+         *     asynchronously.
+         */
+        @NonNull
+        Drawable getDrawableOrThrow(@NonNull InlineImageResource resource)
+                throws ResourceAccessException;
+
+        /** Get the drawable as specified by {@code resource}. */
+        @NonNull
+        ListenableFuture<Drawable> getDrawable(@NonNull InlineImageResource resource);
+    }
+
+    /** Get an empty builder to build {@link ResourceResolvers} with. */
+    @NonNull
+    public static Builder builder(@NonNull ResourceProto.Resources protoResources) {
+        return new Builder(protoResources);
+    }
+
+    /** Get the drawable corresponding to the given resource ID. */
+    @NonNull
+    public ListenableFuture<Drawable> getDrawable(@NonNull String protoResourceId) {
+        ResourceProto.ImageResource imageResource =
+                mProtoResources.getIdToImageMap().get(protoResourceId);
+
+        if (imageResource == null) {
+            return createFailedFuture(
+                    new IllegalArgumentException(
+                            "Resource " + protoResourceId + " is not defined in resources bundle"));
+        }
+
+        if (imageResource.hasAndroidResourceByResId()
+                && mAndroidImageResourceByResIdResolver != null) {
+            AndroidImageResourceByResIdResolver resolver = mAndroidImageResourceByResIdResolver;
+            return resolver.getDrawable(imageResource.getAndroidResourceByResId());
+        }
+
+        if (imageResource.hasInlineResource() && mInlineImageResourceResolver != null) {
+            InlineImageResourceResolver resolver = mInlineImageResourceResolver;
+            return resolver.getDrawable(imageResource.getInlineResource());
+        }
+
+        return createFailedFuture(
+                new ResourceAccessException(
+                        "Can't find resolver for image resource " + protoResourceId));
+    }
+
+    @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
+    static <T> ListenableFuture<T> createImmediateFuture(@NonNull T value) {
+        ResolvableFuture<T> future = ResolvableFuture.create();
+        future.set(value);
+        return future;
+    }
+
+    @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
+    static <T> ListenableFuture<T> createFailedFuture(@NonNull Throwable throwable) {
+        ResolvableFuture<T> errorFuture = ResolvableFuture.create();
+        errorFuture.setException(throwable);
+        return errorFuture;
+    }
+
+    /** Builder for ResourceProviders */
+    public static final class Builder {
+        @NonNull private final ResourceProto.Resources mProtoResources;
+        @Nullable private AndroidImageResourceByResIdResolver mAndroidImageResourceByResIdResolver;
+        @Nullable private InlineImageResourceResolver mInlineImageResourceResolver;
+
+        Builder(@NonNull ResourceProto.Resources protoResources) {
+            this.mProtoResources = protoResources;
+        }
+
+        /** Set the resource loader for {@link AndroidImageResourceByResIdResolver} resources. */
+        @NonNull
+        @SuppressLint("MissingGetterMatchingBuilder")
+        public Builder setAndroidImageResourceByResIdResolver(
+                @NonNull AndroidImageResourceByResIdResolver resolver) {
+            mAndroidImageResourceByResIdResolver = resolver;
+            return this;
+        }
+
+        /** Set the resource loader for {@link InlineImageResourceResolver} resources. */
+        @NonNull
+        @SuppressLint("MissingGetterMatchingBuilder")
+        public Builder setInlineImageResourceResolver(
+                @NonNull InlineImageResourceResolver resolver) {
+            mInlineImageResourceResolver = resolver;
+            return this;
+        }
+
+        /** Build a {@link ResourceResolvers} instance. */
+        @NonNull
+        public ResourceResolvers build() {
+            return new ResourceResolvers(
+                    mProtoResources,
+                    mAndroidImageResourceByResIdResolver,
+                    mInlineImageResourceResolver);
+        }
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceAccessors.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceAccessors.java
deleted file mode 100644
index dad88b8..0000000
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceAccessors.java
+++ /dev/null
@@ -1,69 +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.wear.tiles.renderer.internal;
-
-import android.content.Context;
-import android.content.res.Resources;
-
-import androidx.annotation.NonNull;
-import androidx.wear.tiles.builders.ResourceBuilders;
-
-/** Utility class to get ResourceAccessors populated with standard options. */
-public class StandardResourceAccessors {
-    private StandardResourceAccessors() {}
-
-    /**
-     * Get a builder pre-populated with accessors for the resources of the app hosting the renderer.
-     *
-     * <p>Use {@code setFooAccessor} calls to change the pre-populated ones or add others.
-     *
-     * @param appContext Context for the app that both owns the resources and displays the layout.
-     * @param tileResources Resources for the current layout.
-     */
-    @NonNull
-    public static ResourceAccessors.Builder forLocalApp(
-            @NonNull Context appContext, @NonNull ResourceBuilders.Resources tileResources) {
-        AndroidResourceAccessor androidResourceAccessor =
-                new AndroidResourceAccessor(appContext.getResources());
-        InlineResourceAccessor inlineResourceAccessor = new InlineResourceAccessor(appContext);
-        return ResourceAccessors.builder(tileResources.toProto())
-                .setAndroidImageResourceByResIdAccessor(androidResourceAccessor)
-                .setInlineImageResourceAccessor(inlineResourceAccessor);
-    }
-
-    /**
-     * Get a builder pre-populated with accessors for the resources of a tile provider service.
-     *
-     * <p>Use {@code setFooAccessor} calls to change the pre-populated ones or add others.
-     *
-     * @param hostAppContext Context for the app hosting the renderer displaying the layout.
-     * @param tileResources Resources for the current layout.
-     * @param serviceAndroidResources Android resources from the service.
-     */
-    @NonNull
-    public static ResourceAccessors.Builder forRemoteService(
-            @NonNull Context hostAppContext,
-            @NonNull ResourceBuilders.Resources tileResources,
-            @NonNull Resources serviceAndroidResources) {
-        AndroidResourceAccessor androidResourceAccessor =
-                new AndroidResourceAccessor(serviceAndroidResources);
-        InlineResourceAccessor inlineResourceAccessor = new InlineResourceAccessor(hostAppContext);
-        return ResourceAccessors.builder(tileResources.toProto())
-                .setAndroidImageResourceByResIdAccessor(androidResourceAccessor)
-                .setInlineImageResourceAccessor(inlineResourceAccessor);
-    }
-}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.java
new file mode 100644
index 0000000..95acaf7
--- /dev/null
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/StandardResourceResolvers.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.wear.tiles.renderer.internal;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import androidx.annotation.NonNull;
+import androidx.wear.tiles.proto.ResourceProto;
+
+/** Utility class to get {@link ResourceResolvers} populated with standard options. */
+public class StandardResourceResolvers {
+    private StandardResourceResolvers() {}
+
+    /**
+     * Get a builder pre-populated with resolvers for the resources of the app hosting the renderer.
+     *
+     * <p>Use {@code setFooResolver} calls to change the pre-populated ones or add others.
+     *
+     * @param protoResources ProtoLayout resources for the current layout.
+     * @param appContext Context for the app that both owns the resources and displays the layout.
+     */
+    @NonNull
+    public static ResourceResolvers.Builder forLocalApp(
+            @NonNull ResourceProto.Resources protoResources, @NonNull Context appContext) {
+        DefaultAndroidImageResourceByResIdResolver androidResourceResolver =
+                new DefaultAndroidImageResourceByResIdResolver(appContext.getResources());
+
+        DefaultInlineImageResourceResolver inlineResourceResolver =
+                new DefaultInlineImageResourceResolver(appContext);
+        return ResourceResolvers.builder(protoResources)
+                .setAndroidImageResourceByResIdResolver(androidResourceResolver)
+                .setInlineImageResourceResolver(inlineResourceResolver);
+    }
+
+    /**
+     * Get a builder pre-populated with resolvers for the resources of a {@link
+     * androidx.wear.tiles.TileProviderService}, hosted within another app on the device.
+     *
+     * <p>Use {@code setFooAccessor} calls to change the pre-populated ones or add others.
+     *
+     * @param protoResources ProtoLayout resources for the current layout.
+     * @param servicePackageName Package name for the service that owns the resources.
+     * @param serviceAndroidResources Android resources from the service.
+     * @param hostAppContext Context for the app hosting the renderer displaying the layout.
+     */
+    @NonNull
+    public static ResourceResolvers.Builder forRemoteService(
+            @NonNull ResourceProto.Resources protoResources,
+            @NonNull String servicePackageName,
+            @NonNull Resources serviceAndroidResources,
+            @NonNull Context hostAppContext) {
+        DefaultAndroidImageResourceByResIdResolver androidResourceResolver =
+                new DefaultAndroidImageResourceByResIdResolver(serviceAndroidResources);
+
+        DefaultInlineImageResourceResolver inlineResourceResolver =
+                new DefaultInlineImageResourceResolver(hostAppContext);
+        return ResourceResolvers.builder(protoResources)
+                .setAndroidImageResourceByResIdResolver(androidResourceResolver)
+                .setInlineImageResourceResolver(inlineResourceResolver);
+    }
+}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
index 1637bca..d4e64f6 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/TileRendererInternal.java
@@ -16,13 +16,20 @@
 
 package androidx.wear.tiles.renderer.internal;
 
+import static androidx.core.util.Preconditions.checkNotNull;
+
 import static java.lang.Math.max;
 import static java.lang.Math.round;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
+import android.graphics.Rect;
 import android.graphics.Typeface;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
@@ -60,6 +67,7 @@
 import androidx.wear.tiles.TileProviderService;
 import androidx.wear.tiles.proto.ActionProto.Action;
 import androidx.wear.tiles.proto.ActionProto.AndroidActivity;
+import androidx.wear.tiles.proto.ActionProto.AndroidExtra;
 import androidx.wear.tiles.proto.ActionProto.LaunchAction;
 import androidx.wear.tiles.proto.ActionProto.LoadAction;
 import androidx.wear.tiles.proto.DimensionProto.ContainerDimension;
@@ -68,6 +76,7 @@
 import androidx.wear.tiles.proto.DimensionProto.ExpandedDimensionProp;
 import androidx.wear.tiles.proto.DimensionProto.ImageDimension;
 import androidx.wear.tiles.proto.DimensionProto.ProportionalDimensionProp;
+import androidx.wear.tiles.proto.DimensionProto.SpProp;
 import androidx.wear.tiles.proto.DimensionProto.SpacerDimension;
 import androidx.wear.tiles.proto.DimensionProto.WrappedDimensionProp;
 import androidx.wear.tiles.proto.LayoutElementProto.Arc;
@@ -80,6 +89,7 @@
 import androidx.wear.tiles.proto.LayoutElementProto.Column;
 import androidx.wear.tiles.proto.LayoutElementProto.ContentScaleMode;
 import androidx.wear.tiles.proto.LayoutElementProto.FontStyle;
+import androidx.wear.tiles.proto.LayoutElementProto.FontVariant;
 import androidx.wear.tiles.proto.LayoutElementProto.HorizontalAlignmentProp;
 import androidx.wear.tiles.proto.LayoutElementProto.Image;
 import androidx.wear.tiles.proto.LayoutElementProto.Layout;
@@ -89,6 +99,7 @@
 import androidx.wear.tiles.proto.LayoutElementProto.Span;
 import androidx.wear.tiles.proto.LayoutElementProto.SpanImage;
 import androidx.wear.tiles.proto.LayoutElementProto.SpanText;
+import androidx.wear.tiles.proto.LayoutElementProto.SpanVerticalAlignmentProp;
 import androidx.wear.tiles.proto.LayoutElementProto.Spannable;
 import androidx.wear.tiles.proto.LayoutElementProto.Text;
 import androidx.wear.tiles.proto.LayoutElementProto.TextAlignmentProp;
@@ -103,22 +114,25 @@
 import androidx.wear.tiles.proto.ModifiersProto.SpanModifiers;
 import androidx.wear.tiles.proto.StateProto.State;
 import androidx.wear.tiles.renderer.R;
+import androidx.wear.tiles.renderer.internal.WearArcLayout.ArcLayoutWidget;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import java.lang.ref.WeakReference;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 
 /**
- * Renderer for Wear Tiles.
+ * Renderer for Tiles.
  *
- * <p>This variant uses Android views to represent the contents of the Wear Tile.
+ * <p>This variant uses Android views to represent the contents of the Tile.
  */
 public final class TileRendererInternal {
 
-    private static final String TAG = "TileRenderer";
+    private static final String TAG = "TileRendererInternal";
 
     private static final int HALIGN_DEFAULT_GRAVITY = Gravity.CENTER_HORIZONTAL;
     private static final int VALIGN_DEFAULT_GRAVITY = Gravity.CENTER_VERTICAL;
@@ -128,6 +142,8 @@
     @WearArcLayout.LayoutParams.VerticalAlignment
     private static final int ARC_VALIGN_DEFAULT = WearArcLayout.LayoutParams.VALIGN_CENTER;
 
+    private static final int SPAN_VALIGN_DEFAULT = ImageSpan.ALIGN_BOTTOM;
+
     // This is pretty badly named; TruncateAt specifies where to place the ellipsis (or whether to
     // marquee). Disabling truncation with null actually disables the _ellipsis_, but text will
     // still be truncated.
@@ -148,13 +164,15 @@
     // White
     private static final int LINE_COLOR_DEFAULT = 0xFFFFFFFF;
 
-    // Need to be package private so that TilesClickableSpan can see them.
     final Context mAppContext;
-    final LoadActionListener mLoadActionListener;
-    final Executor mLoadActionExecutor;
+    private final Layout mLayoutProto;
+    private final ResourceResolvers mResourceResolvers;
 
-    private final Layout mLayout;
-    private final ResourceAccessors mResourceAccessors;
+    private final FontSet mTitleFontSet;
+    private final FontSet mBodyFontSet;
+
+    final Executor mLoadActionExecutor;
+    final LoadActionListener mLoadActionListener;
 
     /**
      * Listener for clicks on Clickable objects that have an Action to (re)load the contents of a
@@ -175,19 +193,20 @@
      *
      * @param appContext The application context.
      * @param layout The portion of the Tile to render.
-     * @param resourceAccessors Accessors for the resources used for rendering this Tile.
+     * @param resourceResolvers Resolvers for the resources used for rendering this Prototile.
+     * @param loadActionExecutor Executor to dispatch loadActionListener on.
      * @param loadActionListener Listener for clicks that will cause the contents to be reloaded.
      */
     public TileRendererInternal(
             @NonNull Context appContext,
             @NonNull Layout layout,
-            @NonNull ResourceAccessors resourceAccessors,
+            @NonNull ResourceResolvers resourceResolvers,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
         this(
                 appContext,
                 layout,
-                resourceAccessors,
+                resourceResolvers,
                 /* tilesTheme= */ 0,
                 loadActionExecutor,
                 loadActionListener);
@@ -198,15 +217,16 @@
      *
      * @param appContext The application context.
      * @param layout The portion of the Tile to render.
-     * @param resourceAccessors Accessors for the resources used for rendering this Tile.
-     * @param tilesTheme The theme to use for this Tile instance. This can be used to customise
+     * @param resourceResolvers Resolvers for the resources used for rendering this Prototile.
+     * @param tilesTheme The theme to use for this Tiles instance. This can be used to customise
      *     things like the default font family. Pass 0 to use the default theme.
+     * @param loadActionExecutor Executor to dispatch loadActionListener on.
      * @param loadActionListener Listener for clicks that will cause the contents to be reloaded.
      */
     public TileRendererInternal(
             @NonNull Context appContext,
             @NonNull Layout layout,
-            @NonNull ResourceAccessors resourceAccessors,
+            @NonNull ResourceResolvers resourceResolvers,
             @StyleRes int tilesTheme,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
@@ -214,11 +234,19 @@
             tilesTheme = R.style.TilesBaseTheme;
         }
 
+        TypedArray a = appContext.obtainStyledAttributes(tilesTheme, R.styleable.TilesTheme);
+
+        this.mTitleFontSet =
+                new FontSet(appContext, a.getResourceId(R.styleable.TilesTheme_tilesTitleFont, -1));
+        this.mBodyFontSet =
+                new FontSet(appContext, a.getResourceId(R.styleable.TilesTheme_tilesBodyFont, -1));
+        a.recycle();
+
         this.mAppContext = new ContextThemeWrapper(appContext, tilesTheme);
-        this.mLayout = layout;
-        this.mResourceAccessors = resourceAccessors;
-        this.mLoadActionListener = loadActionListener;
+        this.mLayoutProto = layout;
+        this.mResourceResolvers = resourceResolvers;
         this.mLoadActionExecutor = loadActionExecutor;
+        this.mLoadActionListener = loadActionListener;
     }
 
     private int safeDpToPx(DpProp dpProp) {
@@ -238,6 +266,17 @@
         return (float) dividend / divisor;
     }
 
+    private static Rect getSourceBounds(View v) {
+        final int[] pos = new int[2];
+        v.getLocationOnScreen(pos);
+
+        return new Rect(
+                /* left= */ pos[0],
+                /* top= */ pos[1],
+                /* right= */ pos[0] + v.getWidth(),
+                /* bottom= */ pos[1] + v.getHeight());
+    }
+
     /**
      * Generates a generic LayoutParameters for use by all components. This just defaults to setting
      * the width/height to WRAP_CONTENT.
@@ -258,14 +297,14 @@
         // containers, but a little trickier in rows and columns on Android.
         //
         // A Row (LinearLayout) supports this with width=0 and weight>0. After doing a layout pass,
-        // it will assign all remaining space to elements with width=0 and weight>0, biased by
-        // the weight. This causes problems if there are two (or more) "expand" elements in a
-        // row, which is itself set to WRAP_CONTENTS, and one of those elements has a measured
-        // width (e.g. Text). In that case, the LinearLayout will measure the text, then ensure
-        // that all elements with a weight set have their widths set according to the weight. For
-        // us, that means that _all_ elements with expand=true will size themselves to the same
-        // width as the Text, pushing out the bounds of the parent row. This happens on columns
-        // too, but of course regarding height.
+        // it will assign all remaining space to elements with width=0 and weight>0, biased by the
+        // weight. This causes problems if there are two (or more) "expand" elements in a row,
+        // which is itself set to WRAP_CONTENTS, and one of those elements has a measured width
+        // (e.g. Text). In that case, the LinearLayout will measure the text, then ensure that
+        // all elements with a weight set have their widths set according to the weight. For us,
+        // that means that _all_ elements with expand=true will size themselves to the same width
+        // as the Text, pushing out the bounds of the parent row. This happens on columns too,
+        // but of course regarding height.
         //
         // To get around this, if an element with expand=true is added to a row that is WRAP_CONTENT
         // (e.g. a row with no explicit width, that is not expanded), we ignore the expand=true, and
@@ -312,7 +351,7 @@
             ContainerDimension width,
             ContainerDimension height) {
         if (parent instanceof LinearLayout) {
-            // LinearLayouts have a bunch of messy caveats in Tile when their children can be
+            // LinearLayouts have a bunch of messy caveats in Tiles when their children can be
             // expanded; factor that case out to keep this clean.
             return updateLayoutParamsInLinearLayout(
                     (LinearLayout) parent, layoutParams, width, height);
@@ -393,17 +432,38 @@
         return IMAGE_DEFAULT_SCALE_TYPE;
     }
 
+    private static int spanVerticalAlignmentToImgSpanAlignment(
+            SpanVerticalAlignmentProp alignment) {
+        switch (alignment.getValue()) {
+            case SPAN_VALIGN_TEXT_BASELINE:
+                return ImageSpan.ALIGN_BASELINE;
+            case SPAN_VALIGN_BOTTOM:
+                return ImageSpan.ALIGN_BOTTOM;
+            case SPAN_VALIGN_UNDEFINED:
+            case UNRECOGNIZED:
+                return SPAN_VALIGN_DEFAULT;
+        }
+
+        return SPAN_VALIGN_DEFAULT;
+    }
+
+    /**
+     * Whether a font style is bold or not (has weight > 700). Note that this check is required,
+     * even if you are using an explicitly bold font (e.g. Roboto-Bold), as Typeface still needs to
+     * bold bit set to render properly.
+     */
     private static boolean isBold(FontStyle fontStyle) {
         // Although this method could be a simple equality check against FONT_WEIGHT_BOLD, we list
         // all current cases here so that this will become a compile time error as soon as a new
         // FontWeight value is added to the schema. If this fails to build, then this means that
         // an int typeface style is no longer enough to represent all FontWeight values and a
-        // customizable, per-weight text style must be introduced to TileRenderer to handle this.
-        // See b/176980535
+        // customizable, per-weight text style must be introduced to TileRendererInternal to
+        // handle this. See b/176980535
         switch (fontStyle.getWeight().getValue()) {
             case FONT_WEIGHT_BOLD:
                 return true;
             case FONT_WEIGHT_NORMAL:
+            case FONT_WEIGHT_MEDIUM:
             case FONT_WEIGHT_UNDEFINED:
             case UNRECOGNIZED:
                 return false;
@@ -412,6 +472,27 @@
         return false;
     }
 
+    private Typeface fontStyleToTypeface(FontStyle fontStyle) {
+        FontSet fonts = mBodyFontSet;
+
+        if (fontStyle.getVariant().getValue() == FontVariant.FONT_VARIANT_TITLE) {
+            fonts = mTitleFontSet;
+        }
+
+        switch (fontStyle.getWeight().getValue()) {
+            case FONT_WEIGHT_BOLD:
+                return fonts.mBoldFont;
+            case FONT_WEIGHT_MEDIUM:
+                return fonts.mMediumFont;
+            case FONT_WEIGHT_NORMAL:
+            case FONT_WEIGHT_UNDEFINED:
+            case UNRECOGNIZED:
+                return fonts.mNormalFont;
+        }
+
+        return fonts.mNormalFont;
+    }
+
     private static int fontStyleToTypefaceStyle(FontStyle fontStyle) {
         final boolean isBold = isBold(fontStyle);
         final boolean isItalic = fontStyle.getItalic().getValue();
@@ -428,29 +509,34 @@
     }
 
     @SuppressWarnings("nullness")
-    private static Typeface createTypeface(
-            FontStyle fontStyle, @Nullable Typeface currentTypeface) {
-        return Typeface.create(currentTypeface, fontStyleToTypefaceStyle(fontStyle));
+    private Typeface createTypeface(FontStyle fontStyle) {
+        return Typeface.create(fontStyleToTypeface(fontStyle), fontStyleToTypefaceStyle(fontStyle));
     }
 
     private static MetricAffectingSpan createTypefaceSpan(FontStyle fontStyle) {
         return new StyleSpan(fontStyleToTypefaceStyle(fontStyle));
     }
 
-    private static boolean hasDefaultTypeface(FontStyle fontStyle) {
+    /**
+     * Returns whether or not the default style bits in Typeface can be used, or if we need to add
+     * bold/italic flags there.
+     */
+    private static boolean hasDefaultTypefaceStyle(FontStyle fontStyle) {
         return !fontStyle.getItalic().getValue() && !isBold(fontStyle);
     }
 
-    private static void applyFontStyle(FontStyle style, TextView textView) {
-        Typeface currentTypeface = textView.getTypeface();
+    private float toPx(SpProp spField) {
+        return TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_SP,
+                spField.getValue(),
+                mAppContext.getResources().getDisplayMetrics());
+    }
 
-        if (!hasDefaultTypeface(style)) {
-            // Need to supply typefaceStyle when creating the typeface (will select specialist
-            // bold/italic typefaces), *and* when setting the typeface (will set synthetic
-            // bold/italic flags in Paint if they're not supported by the given typeface).
-            textView.setTypeface(
-                    createTypeface(style, currentTypeface), fontStyleToTypefaceStyle(style));
-        }
+    private void applyFontStyle(FontStyle style, TextView textView) {
+        // Need to supply typefaceStyle when creating the typeface (will select specialist
+        // bold/italic typefaces), *and* when setting the typeface (will set synthetic
+        // bold/italic flags in Paint if they're not supported by the given typeface).
+        textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
 
         int currentPaintFlags = textView.getPaintFlags();
 
@@ -474,6 +560,28 @@
         textView.setTextColor(extractTextColorArgb(style));
     }
 
+    private void applyFontStyle(FontStyle style, WearCurvedTextView textView) {
+        // Need to supply typefaceStyle when creating the typeface (will select specialist
+        // bold/italic typefaces), *and* when setting the typeface (will set synthetic
+        // bold/italic flags in Paint if they're not supported by the given typeface).
+        textView.setTypeface(createTypeface(style), fontStyleToTypefaceStyle(style));
+
+        int currentPaintFlags = textView.getPaintFlags();
+
+        // Remove the bits we're setting
+        currentPaintFlags &= ~Paint.UNDERLINE_TEXT_FLAG;
+
+        if (style.hasUnderline() && style.getUnderline().getValue()) {
+            currentPaintFlags |= Paint.UNDERLINE_TEXT_FLAG;
+        }
+
+        textView.setPaintFlags(currentPaintFlags);
+
+        if (style.hasSize()) {
+            textView.setTextSize(toPx(style.getSize()));
+        }
+    }
+
     private void applyClickable(View view, Clickable clickable) {
         view.setTag(clickable.getId());
 
@@ -487,7 +595,12 @@
                     hasAction = true;
                     view.setOnClickListener(
                             v -> {
-                                if (i.resolveActivity(mAppContext.getPackageManager()) != null) {
+                                i.setSourceBounds(getSourceBounds(view));
+                                ActivityInfo ai =
+                                        i.resolveActivityInfo(
+                                                mAppContext.getPackageManager(), /* flags= */ 0);
+
+                                if (ai != null && ai.exported) {
                                     mAppContext.startActivity(i);
                                 }
                             });
@@ -497,10 +610,14 @@
                 hasAction = true;
                 view.setOnClickListener(
                         v ->
-                                mLoadActionListener.onClick(
-                                        buildState(
-                                                clickable.getOnClick().getLoadAction(),
-                                                clickable.getId())));
+                                mLoadActionExecutor.execute(
+                                        () ->
+                                                mLoadActionListener.onClick(
+                                                        buildState(
+                                                                clickable
+                                                                        .getOnClick()
+                                                                        .getLoadAction(),
+                                                                clickable.getId()))));
                 break;
             case VALUE_NOT_SET:
                 break;
@@ -599,7 +716,7 @@
     // the instance also extends View (as it should). Instead, just take a View in and rename
     // this, and check that it's an ArcLayoutWidget internally.
     private View applyModifiersToArcLayoutView(View view, ArcModifiers modifiers) {
-        if (!(view instanceof WearArcLayout.ArcLayoutWidget)) {
+        if (!(view instanceof ArcLayoutWidget)) {
             Log.e(
                     TAG,
                     "applyModifiersToArcLayoutView should only be called with an ArcLayoutWidget");
@@ -617,37 +734,6 @@
         return view;
     }
 
-    private void applyFontStyle(FontStyle style, WearCurvedTextView textView) {
-        Typeface currentTypeface = textView.getTypeface();
-
-        if (!hasDefaultTypeface(style)) {
-            // Need to supply typefaceStyle when creating the typeface (will select specialist
-            // bold/italic typefaces), *and* when setting the typeface (will set synthetic
-            // bold/italic flags in Paint if they're not supported by the given typeface).
-            textView.setTypeface(
-                    createTypeface(style, currentTypeface), fontStyleToTypefaceStyle(style));
-        }
-
-        int currentPaintFlags = textView.getPaintFlags();
-
-        // Remove the bits we're setting
-        currentPaintFlags &= ~Paint.UNDERLINE_TEXT_FLAG;
-
-        if (style.hasUnderline() && style.getUnderline().getValue()) {
-            currentPaintFlags |= Paint.UNDERLINE_TEXT_FLAG;
-        }
-
-        textView.setPaintFlags(currentPaintFlags);
-
-        if (style.hasSize()) {
-            textView.setTextSize(
-                    TypedValue.applyDimension(
-                            TypedValue.COMPLEX_UNIT_SP,
-                            style.getSize().getValue(),
-                            mAppContext.getResources().getDisplayMetrics()));
-        }
-    }
-
     private static int textAlignToAndroidGravity(TextAlignmentProp alignment) {
         switch (alignment.getValue()) {
             case TEXT_ALIGN_START:
@@ -725,7 +811,7 @@
      * {@link LaunchAction}.
      */
     @Nullable
-    static Intent buildLaunchActionIntent(
+    public static Intent buildLaunchActionIntent(
             @NonNull LaunchAction launchAction, @NonNull String clickableId) {
         if (launchAction.hasAndroidActivity()) {
             AndroidActivity activity = launchAction.getAndroidActivity();
@@ -737,6 +823,20 @@
                 i.putExtra(TileProviderService.EXTRA_CLICKABLE_ID, clickableId);
             }
 
+            for (Map.Entry<String, AndroidExtra> entry : activity.getKeyToExtraMap().entrySet()) {
+                if (entry.getValue().hasStringVal()) {
+                    i.putExtra(entry.getKey(), entry.getValue().getStringVal().getValue());
+                } else if (entry.getValue().hasIntVal()) {
+                    i.putExtra(entry.getKey(), entry.getValue().getIntVal().getValue());
+                } else if (entry.getValue().hasLongVal()) {
+                    i.putExtra(entry.getKey(), entry.getValue().getLongVal().getValue());
+                } else if (entry.getValue().hasDoubleVal()) {
+                    i.putExtra(entry.getKey(), entry.getValue().getDoubleVal().getValue());
+                } else if (entry.getValue().hasBooleanVal()) {
+                    i.putExtra(entry.getKey(), entry.getValue().getBooleanVal().getValue());
+                }
+            }
+
             return i;
         }
 
@@ -893,7 +993,7 @@
 
     private View inflateText(ViewGroup parent, Text text) {
         TextView textView =
-                new TextView(mAppContext, /* attrs= */ null, R.attr.tilesTextAppearance);
+                new TextView(mAppContext, /* attrs= */ null, R.attr.tilesFallbackTextAppearance);
 
         LayoutParams layoutParams = generateDefaultLayoutParams();
 
@@ -917,14 +1017,10 @@
         }
 
         if (text.hasLineHeight()) {
-            float lineHeight =
-                    TypedValue.applyDimension(
-                            TypedValue.COMPLEX_UNIT_SP,
-                            text.getLineHeight().getValue(),
-                            mAppContext.getResources().getDisplayMetrics());
-            final float fontHeight = textView.getPaint().getFontSpacing();
-            if (lineHeight != fontHeight) {
-                textView.setLineSpacing(lineHeight - fontHeight, 1f);
+            float lineHeightPx = toPx(text.getLineHeight());
+            final float fontHeightPx = textView.getPaint().getFontSpacing();
+            if (lineHeightPx != fontHeightPx) {
+                textView.setLineSpacing(lineHeightPx - fontHeightPx, 1f);
             }
         }
 
@@ -940,7 +1036,8 @@
 
     private View inflateArcText(ViewGroup parent, ArcText text) {
         WearCurvedTextView textView =
-                new WearCurvedTextView(mAppContext, /* attrs= */ null, R.attr.tilesTextAppearance);
+                new WearCurvedTextView(
+                        mAppContext, /* attrs= */ null, R.attr.tilesFallbackTextAppearance);
 
         LayoutParams layoutParams = generateDefaultLayoutParams();
         layoutParams.width = LayoutParams.MATCH_PARENT;
@@ -1031,7 +1128,7 @@
         // Both dimensions can't be ratios.
         if (image.getWidth().getInnerCase() == ImageDimension.InnerCase.PROPORTIONAL_DIMENSION
                 && image.getHeight().getInnerCase()
-                == ImageDimension.InnerCase.PROPORTIONAL_DIMENSION) {
+                        == ImageDimension.InnerCase.PROPORTIONAL_DIMENSION) {
             Log.w(TAG, "Both width and height were proportional for image " + protoResId);
             return null;
         }
@@ -1087,7 +1184,7 @@
 
         parent.addView(wrappedView, ratioWrapperLayoutParams);
 
-        ListenableFuture<Drawable> drawableFuture = mResourceAccessors.getDrawable(protoResId);
+        ListenableFuture<Drawable> drawableFuture = mResourceResolvers.getDrawable(protoResId);
         if (drawableFuture.isDone()) {
             // If the future is done, immediately draw.
             setImageDrawable(imageView, drawableFuture, protoResId);
@@ -1180,17 +1277,16 @@
     private void applyStylesToSpan(
             SpannableStringBuilder builder, int start, int end, FontStyle fontStyle) {
         if (fontStyle.hasSize()) {
-            float fontSize =
-                    TypedValue.applyDimension(
-                            TypedValue.COMPLEX_UNIT_SP,
-                            fontStyle.getSize().getValue(),
-                            mAppContext.getResources().getDisplayMetrics());
-
-            AbsoluteSizeSpan span = new AbsoluteSizeSpan(round(fontSize));
+            AbsoluteSizeSpan span = new AbsoluteSizeSpan(round(toPx(fontStyle.getSize())));
             builder.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
         }
 
-        if (!hasDefaultTypeface(fontStyle)) {
+        if (fontStyle.hasWeight() || fontStyle.hasVariant()) {
+            CustomTypefaceSpan span = new CustomTypefaceSpan(fontStyleToTypeface(fontStyle));
+            builder.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
+        }
+
+        if (!hasDefaultTypefaceStyle(fontStyle)) {
             MetricAffectingSpan span = createTypefaceSpan(fontStyle);
             builder.setSpan(span, start, end, Spanned.SPAN_MARK_MARK);
         }
@@ -1244,7 +1340,7 @@
             return builder;
         }
 
-        ListenableFuture<Drawable> drawableFuture = mResourceAccessors.getDrawable(protoResId);
+        ListenableFuture<Drawable> drawableFuture = mResourceResolvers.getDrawable(protoResId);
         if (drawableFuture.isDone()) {
             // If the future is done, immediately add drawable to builder.
             try {
@@ -1260,7 +1356,8 @@
             // If the future is not done, add an empty drawable to builder as a placeholder.
             Drawable emptyDrawable = new ColorDrawable(Color.TRANSPARENT);
             int startInclusive = builder.length();
-            ImageSpan emptyDrawableSpan = appendSpanDrawable(builder, emptyDrawable, protoImage);
+            FixedImageSpan emptyDrawableSpan =
+                    appendSpanDrawable(builder, emptyDrawable, protoImage);
             int endExclusive = builder.length();
 
             // When the future is done, replace the empty drawable with the received one.
@@ -1282,14 +1379,21 @@
         return builder;
     }
 
-    private ImageSpan appendSpanDrawable(
+    private FixedImageSpan appendSpanDrawable(
             SpannableStringBuilder builder, Drawable drawable, SpanImage protoImage) {
         drawable.setBounds(
                 0, 0, safeDpToPx(protoImage.getWidth()), safeDpToPx(protoImage.getHeight()));
-        ImageSpan imgSpan = new ImageSpan(drawable);
+        FixedImageSpan imgSpan =
+                new FixedImageSpan(
+                        drawable,
+                        spanVerticalAlignmentToImgSpanAlignment(protoImage.getAlignment()));
 
         int startPos = builder.length();
-        builder.append(" ", imgSpan, Spanned.SPAN_MARK_MARK);
+
+        // Note, we need to replace a real character, not a space. Spaces at the end of a line are
+        // trimmed, which means that some image spans can be removed from the Span if they end up
+        // being located at the end of a line.
+        builder.append("A", imgSpan, Spanned.SPAN_MARK_MARK);
         int endPos = builder.length();
 
         applyModifiersToSpan(builder, startPos, endPos, protoImage.getModifiers());
@@ -1310,7 +1414,10 @@
             Drawable drawable = drawableFuture.get();
             drawable.setBounds(
                     0, 0, safeDpToPx(protoImage.getWidth()), safeDpToPx(protoImage.getHeight()));
-            ImageSpan imgSpan = new ImageSpan(drawable);
+            FixedImageSpan imgSpan =
+                    new FixedImageSpan(
+                            drawable,
+                            spanVerticalAlignmentToImgSpanAlignment(protoImage.getAlignment()));
             builder.setSpan(
                     imgSpan,
                     startInclusive,
@@ -1322,7 +1429,9 @@
     }
 
     private View inflateSpannable(ViewGroup parent, Spannable spannable) {
-        TextView tv = new TextView(mAppContext, /* attrs= */ null, R.attr.tilesTextAppearance);
+        TextView tv =
+                new TextView(mAppContext, /* attrs= */ null, R.attr.tilesFallbackTextAppearance);
+
         LayoutParams layoutParams = generateDefaultLayoutParams();
 
         SpannableStringBuilder builder = new SpannableStringBuilder();
@@ -1353,12 +1462,7 @@
         }
 
         if (spannable.hasLineSpacing()) {
-            float lineSpacing =
-                    TypedValue.applyDimension(
-                            TypedValue.COMPLEX_UNIT_SP,
-                            spannable.getLineSpacing().getValue(),
-                            mAppContext.getResources().getDisplayMetrics());
-            tv.setLineSpacing(lineSpacing, 1f);
+            tv.setLineSpacing(toPx(spannable.getLineSpacing()), 1f);
         }
 
         tv.setText(builder);
@@ -1565,7 +1669,7 @@
     @Nullable
     public View inflate(@NonNull ViewGroup parent) {
         // Go!
-        return inflateLayoutElement(parent, mLayout.getRoot());
+        return inflateLayoutElement(parent, mLayoutProto.getRoot());
     }
 
     private static void applyGravityToFrameLayoutChildren(FrameLayout parent, int gravity) {
@@ -1594,7 +1698,7 @@
     private class TilesClickableSpan extends ClickableSpan {
         private final Clickable mClickable;
 
-        TilesClickableSpan(Clickable clickable) {
+        TilesClickableSpan(@NonNull Clickable clickable) {
             this.mClickable = clickable;
         }
 
@@ -1618,7 +1722,6 @@
                                     mLoadActionListener.onClick(
                                             buildState(
                                                     action.getLoadAction(), mClickable.getId())));
-
                     break;
                 case VALUE_NOT_SET:
                     break;
@@ -1630,4 +1733,102 @@
             // Don't change the underlying text appearance.
         }
     }
+
+    // Android's normal ImageSpan (well, DynamicDrawableSpan) applies baseline alignment incorrectly
+    // in some cases. It incorrectly assumes that the difference between the bottom (as passed to
+    // draw) and baseline of the text is always equal to the font descent, when that doesn't always
+    // hold. Instead, the "y" parameter is the Y coordinate of the baseline, so base the baseline
+    // alignment on that rather than "bottom".
+    private static class FixedImageSpan extends ImageSpan {
+        private WeakReference<Drawable> mDrawableRef;
+
+        FixedImageSpan(@NonNull Drawable drawable) {
+            super(drawable);
+        }
+
+        FixedImageSpan(@NonNull Drawable drawable, int verticalAlignment) {
+            super(drawable, verticalAlignment);
+        }
+
+        @Override
+        public void draw(
+                @androidx.annotation.NonNull Canvas canvas,
+                CharSequence text,
+                int start,
+                int end,
+                float x,
+                int top,
+                int y,
+                int bottom,
+                @androidx.annotation.NonNull Paint paint) {
+            Drawable b = getCachedDrawable();
+            canvas.save();
+
+            int transY = bottom - b.getBounds().bottom;
+            if (mVerticalAlignment == ALIGN_BASELINE) {
+                transY = y - b.getBounds().bottom;
+            } else if (mVerticalAlignment == ALIGN_CENTER) {
+                transY = (bottom - top) / 2 - b.getBounds().height() / 2;
+            }
+
+            canvas.translate(x, transY);
+            b.draw(canvas);
+            canvas.restore();
+        }
+
+        private Drawable getCachedDrawable() {
+            WeakReference<Drawable> wr = mDrawableRef;
+            Drawable d = null;
+
+            if (wr != null) {
+                d = wr.get();
+            }
+
+            if (d == null) {
+                d = getDrawable();
+                mDrawableRef = new WeakReference<>(d);
+            }
+
+            return d;
+        }
+    }
+
+    /** Holder for different weights of the same font variant. */
+    private static class FontSet {
+        final Typeface mNormalFont;
+        final Typeface mMediumFont;
+        final Typeface mBoldFont;
+
+        FontSet(@NonNull Context appContext, int style) {
+            TypedArray a = appContext.obtainStyledAttributes(style, R.styleable.TilesFontSet);
+
+            this.mNormalFont = loadTypeface(a, R.styleable.TilesFontSet_tilesNormalFont);
+            this.mMediumFont = loadTypeface(a, R.styleable.TilesFontSet_tilesMediumFont);
+            this.mBoldFont = loadTypeface(a, R.styleable.TilesFontSet_tilesBoldFont);
+
+            a.recycle();
+        }
+
+        @SuppressLint("RestrictedApi") // TODO(b/183006740): Remove when prefix check is fixed.
+        private static Typeface loadTypeface(TypedArray array, int styleableResId) {
+            // Resources are a little nasty; we can't just check if resType =
+            // TypedValue.TYPE_REFERENCE, because it never is (if you use @font/foo inside of
+            // styles.xml, the value will be a string of the form res/font/foo.ttf). Instead, see
+            // if there's a resource ID at all, and use that, otherwise assume it's a well known
+            // font family.
+            int resType = array.getType(styleableResId);
+
+            if (array.getResourceId(styleableResId, -1) != -1
+                    && array.getFont(styleableResId) != null) {
+                return checkNotNull(array.getFont(styleableResId));
+            } else if (resType == TypedValue.TYPE_STRING
+                    && array.getString(styleableResId) != null) {
+                // Load the normal typeface; we customise this into BOLD/ITALIC later on.
+                return Typeface.create(
+                        checkNotNull(array.getString(styleableResId)), Typeface.NORMAL);
+            } else {
+                throw new IllegalArgumentException("Unknown resource value type " + resType);
+            }
+        }
+    }
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java
index 5173a09..e3dec57 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearArcLayout.java
@@ -31,10 +31,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.AttrRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.annotation.StyleRes;
 import androidx.annotation.UiThread;
 import androidx.wear.tiles.renderer.R;
 
@@ -73,7 +75,9 @@
  * will lay itself out along the arc.
  */
 // TODO(b/174649543): Replace this with the actual androidx.wear.widget.WearArcLayout when
-// we've reconciled the two.
+// the next stable release of it is ready.
+// TODO(b/177464637): Resolve RestrictToUsage suppression.
+@SuppressWarnings("RestrictToUsage")
 @UiThread
 public class WearArcLayout extends ViewGroup {
 
@@ -117,7 +121,7 @@
          * @hide
          */
         @Retention(RetentionPolicy.SOURCE)
-        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         @IntDef({VALIGN_OUTER, VALIGN_CENTER, VALIGN_INNER})
         public @interface VerticalAlignment {}
 
@@ -144,7 +148,7 @@
          * @param context the application environment
          * @param attrs the set of attributes from which to extract the layout parameters' values
          */
-        public LayoutParams(@NonNull Context context, @Nullable AttributeSet attrs) {
+        public LayoutParams(@NonNull Context context, @NonNull AttributeSet attrs) {
             super(context, attrs);
 
             TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.WearArcLayout_Layout);
@@ -209,7 +213,7 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @IntDef({ANCHOR_START, ANCHOR_CENTER, ANCHOR_END})
     public @interface AnchorType {}
 
@@ -263,15 +267,16 @@
         this(context, attrs, 0);
     }
 
-    public WearArcLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+    public WearArcLayout(
+            @NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
     public WearArcLayout(
             @NonNull Context context,
             @Nullable AttributeSet attrs,
-            int defStyleAttr,
-            int defStyleRes) {
+            @AttrRes int defStyleAttr,
+            @StyleRes int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a =
@@ -681,13 +686,13 @@
 
     @Override
     @NonNull
-    public LayoutParams generateLayoutParams(@NonNull AttributeSet attrs) {
+    public ViewGroup.LayoutParams generateLayoutParams(@NonNull AttributeSet attrs) {
         return new LayoutParams(getContext(), attrs);
     }
 
     @Override
     @NonNull
-    protected LayoutParams generateDefaultLayoutParams() {
+    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
         return new LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
     }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java
index da1d4b8..242d853 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/internal/WearCurvedTextView.java
@@ -53,7 +53,7 @@
  * concatenate multiple curved texts, also layout together with other widgets such as icons.
  */
 // TODO(b/174649543): Replace this with the actual androidx.wear.widget.WearCurvedTextView when
-// we've reconciled the two.
+// the next stable release of it is ready.
 public final class WearCurvedTextView extends View implements WearArcLayout.ArcLayoutWidget {
     private static final float UNSET_ANCHOR_DEGREE = -1f;
     private static final int UNSET_ANCHOR_TYPE = -1;
@@ -145,7 +145,7 @@
 
         // read the other supported TextView attributes
         if (a.hasValue(R.styleable.WearCurvedTextView_android_text)) {
-            mText = a.getString(R.styleable.WearCurvedTextView_android_text);
+            mText = nullToEmpty(a.getString(R.styleable.WearCurvedTextView_android_text));
         }
 
         int textEllipsize = a.getInt(R.styleable.WearCurvedTextView_android_ellipsize, 0);
@@ -564,7 +564,7 @@
         // setFontFeatureSettings does accept null, but is not annotated as such. Empty string does
         // the
         // same thing though.
-        mPaint.setFontFeatureSettings(attributes.mFontFeatureSettings);
+        mPaint.setFontFeatureSettings(nullToEmpty(attributes.mFontFeatureSettings));
         mFontFeatureSettings = attributes.mFontFeatureSettings;
         if (Build.VERSION.SDK_INT >= 26 && attributes.mFontVariationSettings != null) {
             Api26Impl.paintSetFontVariationSettings(mPaint, attributes.mFontVariationSettings);
@@ -726,7 +726,7 @@
 
     /** sets the text to be rendered */
     public void setText(@Nullable String value) {
-        mText = value == null ? "" : value;
+        mText = nullToEmpty(value);
         doUpdate();
     }
 
@@ -915,6 +915,15 @@
         }
     }
 
+    @NonNull
+    private String nullToEmpty(@Nullable String str) {
+        if (str == null) {
+            return "";
+        } else {
+            return str;
+        }
+    }
+
     /** Nested class to avoid verification errors for methods induces in API level 26 */
     @RequiresApi(26)
     private static class Api26Impl {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
index 829af88..a3bf2e1 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
@@ -92,6 +92,7 @@
      * @return The time in millis that {@code entry} should be considered to be expired. This value
      *     will be {@link Long#MAX_VALUE} if {@code entry} does not expire.
      */
+    @MainThread
     public long findCurrentTimelineEntryExpiry(
             @NonNull TimelineBuilders.TimelineEntry entry, long fromTimeMillis) {
         return mCache.findCurrentTimelineEntryExpiry(entry.toProto(), fromTimeMillis);
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
index 7246d0d..643dc18 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
@@ -32,7 +32,7 @@
  * <p>This handles the dispatching of single Tile layouts from a full timeline. It will set the
  * correct alarms to detect when a layout should be updated, and dispatch it to its listener.
  */
-public class TilesTimelineManager {
+public class TilesTimelineManager implements AutoCloseable {
     @VisibleForTesting
     static final long MIN_TILE_UPDATE_DELAY_MILLIS =
             TilesTimelineManagerInternal.MIN_TILE_UPDATE_DELAY_MILLIS;
@@ -73,17 +73,18 @@
             @NonNull TimelineBuilders.Timeline timeline,
             int token,
             @NonNull Executor listenerExecutor,
-            @NonNull Listener listener
-    ) {
-        mManager = new TilesTimelineManagerInternal(
-                alarmManager,
-                () -> clock.getCurrentTimeMillis(),
-                timeline.toProto(),
-                token,
-                listenerExecutor,
-                (t, entry) -> listener.onLayoutUpdate(t,
-                        LayoutElementBuilders.Layout.fromProto(entry.getLayout()))
-        );
+            @NonNull Listener listener) {
+        mManager =
+                new TilesTimelineManagerInternal(
+                        alarmManager,
+                        () -> clock.getCurrentTimeMillis(),
+                        timeline.toProto(),
+                        token,
+                        listenerExecutor,
+                        (t, entry) ->
+                                listener.onLayoutUpdate(
+                                        t,
+                                        LayoutElementBuilders.Layout.fromProto(entry.getLayout())));
     }
 
     /**
@@ -95,7 +96,8 @@
     }
 
     /** Tears down this Timeline Manager. This will ensure any set alarms are cleared up. */
-    public void deInit() {
-        mManager.deInit();
+    @Override
+    public void close() {
+        mManager.close();
     }
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
index b7e8029..f1cbf3b 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
@@ -22,11 +22,10 @@
 import androidx.wear.tiles.proto.TimelineProto.TimeInterval;
 import androidx.wear.tiles.proto.TimelineProto.Timeline;
 import androidx.wear.tiles.proto.TimelineProto.TimelineEntry;
-import androidx.wear.tiles.timeline.TilesTimelineCache;
 
 /**
- * Timeline cache for Wear Tiles. This will take in a full timeline, and return the appropriate
- * entry for the given time from {@code findTimelineEntryForTime}.
+ * Timeline cache for Tiles. This will take in a full timeline, and return the appropriate entry for
+ * the given time from {@code findTimelineEntryForTime}.
  */
 public final class TilesTimelineCacheInternal {
     private final Timeline mTimeline;
@@ -82,10 +81,10 @@
     }
 
     /**
-     * A (very) inexact version of {@link TilesTimelineCache#findTimelineEntryForTime(long)} which
-     * finds the closest timeline entry to the current time, regardless of validity. This should
-     * only used as a fallback if {@code findTimelineEntryForTime} fails, so it can attempt to at
-     * least show something.
+     * A (very) inexact version of {@link TilesTimelineCacheInternal#findTimelineEntryForTime(long)}
+     * which finds the closest timeline entry to the current time, regardless of validity. This
+     * should only used as a fallback if {@code findTimelineEntryForTime} fails, so it can attempt
+     * to at least show something.
      *
      * <p>By this point, we're technically in an error state, so just show _something_. Note that
      * calling this if {@code findTimelineEntryForTime} returns a valid entry is invalid, and may
@@ -147,16 +146,15 @@
      * @return The time in millis that {@code entry} should be considered to be expired. This value
      *     will be {@link Long#MAX_VALUE} if {@code entry} does not expire.
      */
-    public long findCurrentTimelineEntryExpiry(
-            @NonNull TimelineEntry entry, long fromTimeMillis) {
+    @MainThread
+    public long findCurrentTimelineEntryExpiry(@NonNull TimelineEntry entry, long fromTimeMillis) {
         long currentSmallestExpiry = Long.MAX_VALUE;
         long entryValidityLength = Long.MAX_VALUE;
 
         if (entry.hasValidity() && entry.getValidity().getEndMillis() > fromTimeMillis) {
             currentSmallestExpiry = entry.getValidity().getEndMillis();
             entryValidityLength =
-                    entry.getValidity().getEndMillis()
-                            - entry.getValidity().getStartMillis();
+                    entry.getValidity().getEndMillis() - entry.getValidity().getStartMillis();
         }
 
         // Search for the starting edge of an overlapping period (i.e. one with startTime between
@@ -186,7 +184,7 @@
             if (entry.hasValidity()) {
                 if (nextEntryValidity.getStartMillis() > entry.getValidity().getEndMillis()
                         || nextEntryValidity.getStartMillis()
-                        < entry.getValidity().getStartMillis()) {
+                                < entry.getValidity().getStartMillis()) {
                     continue;
                 }
             }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
index abf1505..31fb68f 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
@@ -17,6 +17,7 @@
 package androidx.wear.tiles.timeline.internal;
 
 import static java.lang.Math.max;
+import static java.util.concurrent.TimeUnit.MINUTES;
 
 import android.app.AlarmManager;
 import android.app.AlarmManager.OnAlarmListener;
@@ -24,26 +25,23 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.wear.tiles.proto.TimelineProto;
+import androidx.wear.tiles.proto.TimelineProto.Timeline;
+import androidx.wear.tiles.proto.TimelineProto.TimelineEntry;
 
 import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
 
 /**
- * Manager for a single Wear Tiles timeline.
+ * Manager for a single Tiles timeline.
  *
- * <p>This handles the dispatching of single Tile layouts from a full timeline. It will set the
+ * <p>This handles the dispatching of single Tiles layouts from a full timeline. It will set the
  * correct alarms to detect when a layout should be updated, and dispatch it to its listener.
  */
-public class TilesTimelineManagerInternal {
+public class TilesTimelineManagerInternal implements AutoCloseable {
     // 1 minute min delay between tiles.
-    @VisibleForTesting
-    public static final long MIN_TILE_UPDATE_DELAY_MILLIS = TimeUnit.MINUTES.toMillis(1);
+    public static final long MIN_TILE_UPDATE_DELAY_MILLIS = MINUTES.toMillis(1);
 
     /** Interface so this manager can retrieve the current time. */
     public interface Clock {
-        /** Get the current wall-clock time in millis. */
         long getCurrentTimeMillis();
     }
 
@@ -53,10 +51,10 @@
         /**
          * Called when a timeline has a new layout to be displayed.
          *
-         * @param token The token originally passed to {@link TilesTimelineManagerInternal}.
-         * @param entry The new timeline entry to use.
+         * @param token The token originally passed to TilesTimelineManagerInternal.
+         * @param entry The new layout entry to use.
          */
-        void onLayoutUpdate(int token, @NonNull TimelineProto.TimelineEntry entry);
+        void onLayoutUpdate(int token, @NonNull TimelineEntry entry);
     }
 
     private static final String TAG = "TimelineManager";
@@ -77,12 +75,13 @@
      *     This should be synchronized to the same clock as used by {@code alarmManager}
      * @param timeline The Tiles timeline to use.
      * @param token A token, which will be passed to {@code listener}'s callback.
+     * @param listenerExecutor The {@link Executor} to dispatch listener's calls on.
      * @param listener A listener instance, called when a new timeline entry is available.
      */
     public TilesTimelineManagerInternal(
             @NonNull AlarmManager alarmManager,
             @NonNull Clock clock,
-            @NonNull TimelineProto.Timeline timeline,
+            @NonNull Timeline timeline,
             int token,
             @NonNull Executor listenerExecutor,
             @NonNull Listener listener) {
@@ -90,8 +89,8 @@
         this.mClock = clock;
         this.mCache = new TilesTimelineCacheInternal(timeline);
         this.mToken = token;
-        this.mListenerExecutor = listenerExecutor;
         this.mListener = listener;
+        this.mListenerExecutor = listenerExecutor;
     }
 
     /**
@@ -103,7 +102,8 @@
     }
 
     /** Tears down this Timeline Manager. This will ensure any set alarms are cleared up. */
-    public void deInit() {
+    @Override
+    public void close() {
         if (mAlarmListener != null) {
             mAlarmManager.cancel(mAlarmListener);
             mAlarmListener = null;
@@ -117,7 +117,7 @@
         }
 
         long now = mClock.getCurrentTimeMillis();
-        TimelineProto.TimelineEntry entry = mCache.findTimelineEntryForTime(now);
+        TimelineEntry entry = mCache.findTimelineEntryForTime(now);
 
         if (entry == null) {
             Log.d(TAG, "Could not find absolute timeline entry for time " + now);
@@ -154,7 +154,7 @@
                     AlarmManager.RTC, expiryTime, TAG, mAlarmListener, /* targetHandler= */ null);
         }
 
-        final TimelineProto.TimelineEntry entryToDispatch = entry;
+        final TimelineEntry entryToDispatch = entry;
         mListenerExecutor.execute(() -> mListener.onLayoutUpdate(mToken, entryToDispatch));
     }
 }
diff --git a/wear/tiles/tiles-renderer/src/main/res/values-sw210dp-round/styles.xml b/wear/tiles/tiles-renderer/src/main/res/values-sw210dp-round/styles.xml
index 250df58..e15d346 100644
--- a/wear/tiles/tiles-renderer/src/main/res/values-sw210dp-round/styles.xml
+++ b/wear/tiles/tiles-renderer/src/main/res/values-sw210dp-round/styles.xml
@@ -1,5 +1,5 @@
 <resources>
-  <style name="TilesDefaultTextAppearance">
+  <style name="TilesFallbackTextAppearance">
     <!-- Note that many properties are non-overridable, as they are explicitly
          set by inflateText (e.g. bold, italic, size etc).  -->
     <item name="android:fontFamily">sans-serif</item>
diff --git a/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml b/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
index 2d6aeb8..81f80a1 100644
--- a/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
+++ b/wear/tiles/tiles-renderer/src/main/res/values/attrs.xml
@@ -2,9 +2,6 @@
 <resources>
   <attr name="anchorAngleDegrees" format="float"/>
 
-  <attr name="sweepAngleDegrees" format="float" />
-  <attr name="thickness" format="dimension" />
-
   <attr name="anchorPosition" format="enum">
     <enum name="start" value="0" />
     <enum name="center" value="1" />
@@ -12,6 +9,8 @@
   </attr>
 
   <attr name="clockwise" format="boolean"/>
+  <attr name="sweepAngleDegrees" format="float" />
+  <attr name="thickness" format="dimension" />
 
   <declare-styleable name="WearCurvedTextView">
     <!-- supported TextView attributes -->
@@ -38,10 +37,7 @@
   <declare-styleable name="TextAppearance">
     <!-- Text color. -->
     <attr name="android:textColor" />
-    <!--
-      Size of the text. Recommended dimension type for text is "sp" for scaled-pixels
-      (example: 15sp).
-      -->
+    <!-- Size of the text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp). -->
     <attr name="android:textSize" />
     <!-- Style (normal, bold, italic, bold|italic) for the text. -->
     <attr name="android:textStyle" />
@@ -90,8 +86,27 @@
     <attr name="thickness" />
   </declare-styleable>
 
+  <declare-styleable name="TilesFontSet">
+    <!-- We need to list the different fonts here too. The "proper" way to do
+         this would be to have multiple TextAppearance entries for each one,
+         which specifies a typeface or a weight. That works for normal Text, but
+         can't work for Spannables as there's no Span which applies
+         TextAppearance properly (TextAppearanceSpan doesn't work with weight).
+
+         Instead, just list the fonts here, and we'll go and put them into a
+         Typeface inside the renderer.
+
+         Note that the regular font should also be set in the TextAppearance
+         above, as this drives the defaults for some elements (Spannable). -->
+    <attr name="tilesNormalFont" format="reference|string" />
+    <attr name="tilesMediumFont" format="reference|string" />
+    <attr name="tilesBoldFont" format="reference|string" />
+  </declare-styleable>
+
   <!-- Tiles theme attributes. -->
   <declare-styleable name="TilesTheme">
-    <attr name="tilesTextAppearance" format="reference" />
+    <attr name="tilesFallbackTextAppearance" format="reference" />
+    <attr name="tilesTitleFont" format="reference" />
+    <attr name="tilesBodyFont" format="reference" />
   </declare-styleable>
 </resources>
diff --git a/wear/tiles/tiles-renderer/src/main/res/values/styles.xml b/wear/tiles/tiles-renderer/src/main/res/values/styles.xml
index 31b73c9..c0f82c290 100644
--- a/wear/tiles/tiles-renderer/src/main/res/values/styles.xml
+++ b/wear/tiles/tiles-renderer/src/main/res/values/styles.xml
@@ -1,12 +1,20 @@
 <resources>
-  <style name="TilesDefaultTextAppearance">
+  <style name="TilesFallbackTextAppearance">
     <!-- Note that many properties are non-overridable, as they are explicitly
          set by inflateText (e.g. bold, italic, size etc).  -->
     <item name="android:fontFamily">sans-serif</item>
     <item name="android:textSize">16sp</item>
   </style>
 
+  <style name="TilesBaseFont">
+    <item name="tilesNormalFont">sans-serif</item>
+    <item name="tilesMediumFont">sans-serif-medium</item>
+    <item name="tilesBoldFont">sans-serif</item>
+  </style>
+
   <style name="TilesBaseTheme">
-    <item name="tilesTextAppearance">@style/TilesDefaultTextAppearance</item>
+    <item name="tilesFallbackTextAppearance">@style/TilesFallbackTextAppearance</item>
+    <item name="tilesTitleFont">@style/TilesBaseFont</item>
+    <item name="tilesBodyFont">@style/TilesBaseFont</item>
   </style>
 </resources>
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
index 552d4ce..3fe68ae 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
@@ -95,7 +95,8 @@
         // 1m before cutover
         expectTimelineEntryEqual(
                 timelineCache.findTimelineEntryForTime(
-                        cutoverMillis - Duration.ofMinutes(1).toMillis()), entry1);
+                        cutoverMillis - Duration.ofMinutes(1).toMillis()),
+                entry1);
 
         // Cutover
         expectTimelineEntryEqual(timelineCache.findTimelineEntryForTime(cutoverMillis), entry2);
@@ -105,7 +106,8 @@
         // 1m after
         expectTimelineEntryEqual(
                 timelineCache.findTimelineEntryForTime(
-                        cutoverMillis + Duration.ofMinutes(1).toMillis()), entry2);
+                        cutoverMillis + Duration.ofMinutes(1).toMillis()),
+                entry2);
     }
 
     @Test
@@ -492,13 +494,16 @@
         // And after the end, should pick entry2
         expectTimelineEntryEqual(
                 timelineCache.findTimelineEntryForTime(
-                        entry2EndMillis + Duration.ofMinutes(1).toMillis()), null);
+                        entry2EndMillis + Duration.ofMinutes(1).toMillis()),
+                null);
         expectTimelineEntryEqual(
                 timelineCache.findClosestTimelineEntry(
-                        entry2EndMillis + Duration.ofMinutes(1).toMillis()), entry2);
+                        entry2EndMillis + Duration.ofMinutes(1).toMillis()),
+                entry2);
 
-        expect.that(timelineCache.findCurrentTimelineEntryExpiry(
-                entry1, entry2EndMillis + Duration.ofMinutes(1).toMillis()))
+        expect.that(
+                        timelineCache.findCurrentTimelineEntryExpiry(
+                                entry1, entry2EndMillis + Duration.ofMinutes(1).toMillis()))
                 .isEqualTo(Long.MAX_VALUE);
     }
 
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
index 682c53a..25a6b60 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineManagerTest.java
@@ -81,7 +81,7 @@
     @After
     public void tearDown() {
         if (mTimelineManager != null) {
-            mTimelineManager.deInit();
+            mTimelineManager.close();
         }
     }
 
@@ -218,7 +218,7 @@
         shadowOf(getMainLooper()).idle();
 
         // Alarms should be set (as verified in previous test)
-        mTimelineManager.deInit();
+        mTimelineManager.close();
 
         verifyNoAlarmsSet();
     }
diff --git a/wear/tiles/tiles/api/current.txt b/wear/tiles/tiles/api/current.txt
index 7efc41a..708ea18 100644
--- a/wear/tiles/tiles/api/current.txt
+++ b/wear/tiles/tiles/api/current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.tiles {
 
-  public class SysUiTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public SysUiTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_BIND_UPDATE_REQUESTER = "androidx.wear.tiles.action.BIND_UPDATE_REQUESTER";
-  }
-
   public abstract class TileProviderService extends android.app.Service {
     ctor public TileProviderService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
@@ -23,13 +17,7 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends android.app.Service>);
-  }
-
-  public class ViewerTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public ViewerTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_REQUEST_TILE_UPDATE = "androidx.wear.tiles.action.REQUEST_TILE_UPDATE";
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
   }
 
 }
@@ -37,6 +25,11 @@
 package androidx.wear.tiles.builders {
 
   public final class ActionBuilders {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra longExtra(long);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
 
   public static interface ActionBuilders.Action {
@@ -51,11 +44,65 @@
   }
 
   public static final class ActionBuilders.AndroidActivity.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra);
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity build();
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setClassName(String);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setPackageName(String);
   }
 
+  public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidBooleanExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
+  }
+
+  public static interface ActionBuilders.AndroidExtra {
+  }
+
+  public static interface ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidExtra build();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder setValue(int);
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder setValue(long);
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder setValue(String);
+  }
+
   public static final class ActionBuilders.LaunchAction implements androidx.wear.tiles.builders.ActionBuilders.Action {
     method public static androidx.wear.tiles.builders.ActionBuilders.LaunchAction.Builder builder();
   }
@@ -190,6 +237,9 @@
     field public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
     field public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
     field public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
+    field public static final int FONT_VARIANT_BODY = 2; // 0x2
+    field public static final int FONT_VARIANT_TITLE = 1; // 0x1
+    field public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
     field public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
@@ -199,6 +249,9 @@
     field public static final int HALIGN_RIGHT = 3; // 0x3
     field public static final int HALIGN_START = 4; // 0x4
     field public static final int HALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -342,18 +395,29 @@
   }
 
   public static class LayoutElementBuilders.FontStyles {
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
-    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
   }
 
   public static final class LayoutElementBuilders.Image implements androidx.wear.tiles.builders.LayoutElementBuilders.LayoutElement {
@@ -433,6 +497,7 @@
 
   public static final class LayoutElementBuilders.SpanImage.Builder implements androidx.wear.tiles.builders.LayoutElementBuilders.Span.Builder {
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage build();
+    method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.tiles.builders.ModifiersBuilders.SpanModifiers);
@@ -574,6 +639,8 @@
 
   public static final class ModifiersBuilders.Padding.Builder {
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding build();
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
@@ -624,8 +691,8 @@
 
   public static final class ResourceBuilders.ImageResource.Builder {
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource build();
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource.Builder);
   }
@@ -740,19 +807,15 @@
   }
 
   public static class EventReaders.TileAddEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileEnterEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileLeaveEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileRemoveEvent {
-    method public int getTileId();
   }
 
   public class RequestReaders {
@@ -761,14 +824,12 @@
   public static class RequestReaders.ResourcesRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public java.util.List<java.lang.String!> getResourceIds();
-    method public int getTileId();
     method public String getVersion();
   }
 
   public static class RequestReaders.TileRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public androidx.wear.tiles.builders.StateBuilders.State getState();
-    method public int getTileId();
   }
 
 }
diff --git a/wear/tiles/tiles/api/public_plus_experimental_current.txt b/wear/tiles/tiles/api/public_plus_experimental_current.txt
index 7efc41a..4d017ea9 100644
--- a/wear/tiles/tiles/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles/api/public_plus_experimental_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.tiles {
 
-  public class SysUiTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public SysUiTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_BIND_UPDATE_REQUESTER = "androidx.wear.tiles.action.BIND_UPDATE_REQUESTER";
-  }
-
   public abstract class TileProviderService extends android.app.Service {
     ctor public TileProviderService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
@@ -23,13 +17,10 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends android.app.Service>);
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
   }
 
-  public class ViewerTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public ViewerTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_REQUEST_TILE_UPDATE = "androidx.wear.tiles.action.REQUEST_TILE_UPDATE";
+  @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) public @interface TilesExperimental {
   }
 
 }
@@ -37,6 +28,11 @@
 package androidx.wear.tiles.builders {
 
   public final class ActionBuilders {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra longExtra(long);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
 
   public static interface ActionBuilders.Action {
@@ -51,11 +47,65 @@
   }
 
   public static final class ActionBuilders.AndroidActivity.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra);
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity build();
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setClassName(String);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setPackageName(String);
   }
 
+  public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidBooleanExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
+  }
+
+  public static interface ActionBuilders.AndroidExtra {
+  }
+
+  public static interface ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidExtra build();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder setValue(int);
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder setValue(long);
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder setValue(String);
+  }
+
   public static final class ActionBuilders.LaunchAction implements androidx.wear.tiles.builders.ActionBuilders.Action {
     method public static androidx.wear.tiles.builders.ActionBuilders.LaunchAction.Builder builder();
   }
@@ -190,7 +240,11 @@
     field public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
     field public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
     field public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
+    field public static final int FONT_VARIANT_BODY = 2; // 0x2
+    field public static final int FONT_VARIANT_TITLE = 1; // 0x1
+    field public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
     field public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
+    field @androidx.wear.tiles.TilesExperimental public static final int FONT_WEIGHT_MEDIUM = 500; // 0x1f4
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
     field public static final int HALIGN_CENTER = 2; // 0x2
@@ -199,6 +253,9 @@
     field public static final int HALIGN_RIGHT = 3; // 0x3
     field public static final int HALIGN_START = 4; // 0x4
     field public static final int HALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -338,22 +395,34 @@
     method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.tiles.builders.DimensionBuilders.SpProp);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder setSize(androidx.wear.tiles.builders.DimensionBuilders.SpProp.Builder);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder setUnderline(boolean);
+    method @androidx.wear.tiles.TilesExperimental public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder setVariant(int);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder setWeight(int);
   }
 
   public static class LayoutElementBuilders.FontStyles {
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
-    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
   }
 
   public static final class LayoutElementBuilders.Image implements androidx.wear.tiles.builders.LayoutElementBuilders.LayoutElement {
@@ -433,6 +502,7 @@
 
   public static final class LayoutElementBuilders.SpanImage.Builder implements androidx.wear.tiles.builders.LayoutElementBuilders.Span.Builder {
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage build();
+    method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.tiles.builders.ModifiersBuilders.SpanModifiers);
@@ -574,6 +644,8 @@
 
   public static final class ModifiersBuilders.Padding.Builder {
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding build();
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
@@ -624,8 +696,8 @@
 
   public static final class ResourceBuilders.ImageResource.Builder {
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource build();
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource.Builder);
   }
@@ -740,19 +812,15 @@
   }
 
   public static class EventReaders.TileAddEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileEnterEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileLeaveEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileRemoveEvent {
-    method public int getTileId();
   }
 
   public class RequestReaders {
@@ -761,14 +829,12 @@
   public static class RequestReaders.ResourcesRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public java.util.List<java.lang.String!> getResourceIds();
-    method public int getTileId();
     method public String getVersion();
   }
 
   public static class RequestReaders.TileRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public androidx.wear.tiles.builders.StateBuilders.State getState();
-    method public int getTileId();
   }
 
 }
diff --git a/wear/tiles/tiles/api/restricted_current.txt b/wear/tiles/tiles/api/restricted_current.txt
index 7efc41a..708ea18 100644
--- a/wear/tiles/tiles/api/restricted_current.txt
+++ b/wear/tiles/tiles/api/restricted_current.txt
@@ -1,12 +1,6 @@
 // Signature format: 4.0
 package androidx.wear.tiles {
 
-  public class SysUiTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public SysUiTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_BIND_UPDATE_REQUESTER = "androidx.wear.tiles.action.BIND_UPDATE_REQUESTER";
-  }
-
   public abstract class TileProviderService extends android.app.Service {
     ctor public TileProviderService();
     method public static androidx.wear.tiles.TileUpdateRequester getUpdater(android.content.Context);
@@ -23,13 +17,7 @@
   }
 
   public interface TileUpdateRequester {
-    method public void requestUpdate(Class<? extends android.app.Service>);
-  }
-
-  public class ViewerTileUpdateRequester implements androidx.wear.tiles.TileUpdateRequester {
-    ctor public ViewerTileUpdateRequester(android.content.Context);
-    method public void requestUpdate(Class<? extends android.app.Service>);
-    field public static final String ACTION_REQUEST_TILE_UPDATE = "androidx.wear.tiles.action.REQUEST_TILE_UPDATE";
+    method public void requestUpdate(Class<? extends androidx.wear.tiles.TileProviderService>);
   }
 
 }
@@ -37,6 +25,11 @@
 package androidx.wear.tiles.builders {
 
   public final class ActionBuilders {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra booleanExtra(boolean);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra doubleExtra(double);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra intExtra(int);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra longExtra(long);
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra stringExtra(String);
   }
 
   public static interface ActionBuilders.Action {
@@ -51,11 +44,65 @@
   }
 
   public static final class ActionBuilders.AndroidActivity.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra);
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder addKeyToExtraMapping(String, androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity build();
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setClassName(String);
     method public androidx.wear.tiles.builders.ActionBuilders.AndroidActivity.Builder setPackageName(String);
   }
 
+  public static final class ActionBuilders.AndroidBooleanExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidBooleanExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidBooleanExtra.Builder setValue(boolean);
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidDoubleExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidDoubleExtra.Builder setValue(double);
+  }
+
+  public static interface ActionBuilders.AndroidExtra {
+  }
+
+  public static interface ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidExtra build();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidIntExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidIntExtra.Builder setValue(int);
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidLongExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidLongExtra.Builder setValue(long);
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra {
+    method public static androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder builder();
+  }
+
+  public static final class ActionBuilders.AndroidStringExtra.Builder implements androidx.wear.tiles.builders.ActionBuilders.AndroidExtra.Builder {
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra build();
+    method public androidx.wear.tiles.builders.ActionBuilders.AndroidStringExtra.Builder setValue(String);
+  }
+
   public static final class ActionBuilders.LaunchAction implements androidx.wear.tiles.builders.ActionBuilders.Action {
     method public static androidx.wear.tiles.builders.ActionBuilders.LaunchAction.Builder builder();
   }
@@ -190,6 +237,9 @@
     field public static final int CONTENT_SCALE_MODE_FILL_BOUNDS = 3; // 0x3
     field public static final int CONTENT_SCALE_MODE_FIT = 1; // 0x1
     field public static final int CONTENT_SCALE_MODE_UNDEFINED = 0; // 0x0
+    field public static final int FONT_VARIANT_BODY = 2; // 0x2
+    field public static final int FONT_VARIANT_TITLE = 1; // 0x1
+    field public static final int FONT_VARIANT_UNDEFINED = 0; // 0x0
     field public static final int FONT_WEIGHT_BOLD = 700; // 0x2bc
     field public static final int FONT_WEIGHT_NORMAL = 400; // 0x190
     field public static final int FONT_WEIGHT_UNDEFINED = 0; // 0x0
@@ -199,6 +249,9 @@
     field public static final int HALIGN_RIGHT = 3; // 0x3
     field public static final int HALIGN_START = 4; // 0x4
     field public static final int HALIGN_UNDEFINED = 0; // 0x0
+    field public static final int SPAN_VALIGN_BOTTOM = 1; // 0x1
+    field public static final int SPAN_VALIGN_TEXT_BASELINE = 2; // 0x2
+    field public static final int SPAN_VALIGN_UNDEFINED = 0; // 0x0
     field public static final int TEXT_ALIGN_CENTER = 2; // 0x2
     field public static final int TEXT_ALIGN_END = 3; // 0x3
     field public static final int TEXT_ALIGN_START = 1; // 0x1
@@ -342,18 +395,29 @@
   }
 
   public static class LayoutElementBuilders.FontStyles {
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
-    method public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
-    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder body2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder button(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder caption2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder display3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title1(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title2(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3();
+    method public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyle.Builder title3(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
+    method @Deprecated public static androidx.wear.tiles.builders.LayoutElementBuilders.FontStyles withDeviceParameters(androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters);
   }
 
   public static final class LayoutElementBuilders.Image implements androidx.wear.tiles.builders.LayoutElementBuilders.LayoutElement {
@@ -433,6 +497,7 @@
 
   public static final class LayoutElementBuilders.SpanImage.Builder implements androidx.wear.tiles.builders.LayoutElementBuilders.Span.Builder {
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage build();
+    method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setAlignment(int);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setHeight(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.LayoutElementBuilders.SpanImage.Builder setModifiers(androidx.wear.tiles.builders.ModifiersBuilders.SpanModifiers);
@@ -574,6 +639,8 @@
 
   public static final class ModifiersBuilders.Padding.Builder {
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding build();
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
+    method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setAll(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setBottom(androidx.wear.tiles.builders.DimensionBuilders.DpProp.Builder);
     method public androidx.wear.tiles.builders.ModifiersBuilders.Padding.Builder setEnd(androidx.wear.tiles.builders.DimensionBuilders.DpProp);
@@ -624,8 +691,8 @@
 
   public static final class ResourceBuilders.ImageResource.Builder {
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource build();
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
-    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResid(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId);
+    method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setAndroidResourceByResId(androidx.wear.tiles.builders.ResourceBuilders.AndroidImageResourceByResId.Builder);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource);
     method public androidx.wear.tiles.builders.ResourceBuilders.ImageResource.Builder setInlineResource(androidx.wear.tiles.builders.ResourceBuilders.InlineImageResource.Builder);
   }
@@ -740,19 +807,15 @@
   }
 
   public static class EventReaders.TileAddEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileEnterEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileLeaveEvent {
-    method public int getTileId();
   }
 
   public static class EventReaders.TileRemoveEvent {
-    method public int getTileId();
   }
 
   public class RequestReaders {
@@ -761,14 +824,12 @@
   public static class RequestReaders.ResourcesRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public java.util.List<java.lang.String!> getResourceIds();
-    method public int getTileId();
     method public String getVersion();
   }
 
   public static class RequestReaders.TileRequest {
     method public androidx.wear.tiles.readers.DeviceParametersReaders.DeviceParameters getDeviceParameters();
     method public androidx.wear.tiles.builders.StateBuilders.State getState();
-    method public int getTileId();
   }
 
 }
diff --git a/wear/tiles/tiles/build.gradle b/wear/tiles/tiles/build.gradle
index 6023a84..1856407 100644
--- a/wear/tiles/tiles/build.gradle
+++ b/wear/tiles/tiles/build.gradle
@@ -29,14 +29,17 @@
     api("androidx.annotation:annotation:1.1.0")
     api(GUAVA_LISTENABLE_FUTURE)
 
-    implementation 'androidx.annotation:annotation:1.2.0-alpha01'
+    implementation("androidx.annotation:annotation-experimental:1.1.0")
     implementation(project(path: ":wear:tiles:tiles-proto", configuration: "shadow"))
 
+    compileOnly(KOTLIN_STDLIB) // For annotation-experimental
+
     testImplementation(ANDROIDX_TEST_EXT_JUNIT)
     testImplementation(ANDROIDX_TEST_EXT_TRUTH)
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_RUNNER)
     testImplementation(ANDROIDX_TEST_RULES)
+    testImplementation("androidx.concurrent:concurrent-futures:1.1.0")
     testImplementation(ROBOLECTRIC)
     testImplementation(MOCKITO_CORE)
 }
@@ -48,6 +51,9 @@
     buildFeatures {
         aidl = true
     }
+    buildTypes.all {
+        consumerProguardFiles "proguard-rules.pro"
+    }
 
     // Use Robolectric 4.+
     testOptions.unitTests.includeAndroidResources = true
diff --git a/wear/tiles/tiles/lint-baseline.xml b/wear/tiles/tiles/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/tiles/tiles/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/tiles/tiles/proguard-rules.pro b/wear/tiles/tiles/proguard-rules.pro
new file mode 100644
index 0000000..23e141a
--- /dev/null
+++ b/wear/tiles/tiles/proguard-rules.pro
@@ -0,0 +1,20 @@
+#  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.
+
+# libproto uses reflection to deserialize a Proto, which Proguard can't accurately detect.
+# Keep all the class members of any generated messages to ensure we can deserialize properly inside
+# these classes.
+-keepclassmembers class * extends androidx.wear.tiles.protobuf.GeneratedMessageLite {
+  <fields>;
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/ResourcesCallback.aidl b/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/ResourcesCallback.aidl
index e247877..54fd2a1 100644
--- a/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/ResourcesCallback.aidl
+++ b/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/ResourcesCallback.aidl
@@ -25,13 +25,12 @@
   * by standard proto version compatibility in the underlying payload. Any significant changes to
   * this interface will be handled by instead adding new calls into TileProvider.
   *
-  *
   * @hide
   */
 interface ResourcesCallback {
     /**
       * Pass a new resource bundle to the system. This should be called in
-      * response to a request from ProtoTileProvider.onResourcesRequest.
+      * response to a request from TileProvider.onResourcesRequest.
       */
     oneway void updateResources(in ResourcesData resourcesData) = 0;
 }
diff --git a/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/TileCallback.aidl b/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/TileCallback.aidl
index f7aff63..3b8a1da 100644
--- a/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/TileCallback.aidl
+++ b/wear/tiles/tiles/src/main/aidl/androidx/wear/tiles/TileCallback.aidl
@@ -25,13 +25,12 @@
   * by standard proto version compatibility in the underlying payload. Any significant changes to
   * this interface will be handled by instead adding new calls into TileProvider.
   *
-  *
   * @hide
   */
 interface TileCallback {
     /**
       * Pass a new tile timeline to the system. This should be called in
-      * response to a request from ProtoTileProvider.onTileRequest.
+      * response to a request from TileProvider.onTileRequest.
       */
     oneway void updateTileData(in TileData tileData) = 0;
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
index c2353e0..c97773d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
@@ -16,8 +16,6 @@
 
 package androidx.wear.tiles;
 
-import android.app.Service;
-
 import androidx.annotation.NonNull;
 
 import java.util.List;
@@ -25,8 +23,8 @@
 /**
  * Tile update requester which uses multiple underlying update requesters.
  *
- * This can be used to dispatch a tile update request to both the viewer classes and to SysUI at the
- * same time.
+ * <p>This can be used to dispatch a tile update request to both the viewer classes and to SysUI at
+ * the same time.
  */
 class CompositeTileUpdateRequester implements TileUpdateRequester {
     private final List<TileUpdateRequester> mUpdateRequesters;
@@ -36,7 +34,7 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends Service> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
         for (TileUpdateRequester requester : mUpdateRequesters) {
             requester.requestUpdate(tileProvider);
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
index 4d4e466..3c498d7 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
@@ -33,8 +33,8 @@
  *
  * @hide
  */
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @SuppressWarnings("AndroidApiChecker") // Uses java.util.function.Function
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public abstract class ProtoParcelable implements Parcelable {
     private final byte[] mContents;
     private final int mVersion;
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
index 9a18c62..0b20526 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' Resources class, to be parceled and transferred to Wear.
+ * Holder for Tiles' Resources class, to be parceled and transferred to Wear.
  *
  * <p>All this does is to serialize Resources as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
index 814c492..331026a 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' ResourceRequest class, to be parceled and transferred to Wear.
+ * Holder for Tiles' ResourceRequest class, to be parceled and transferred to a Tile Provider.
  *
  * <p>All this does is to serialize ResourceRequest as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
index 6e2c156..3965e0e7 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
@@ -40,7 +40,7 @@
 
 /** Variant of {@link TileUpdateRequester} which requests an update from the Wear SysUI app. */
 // TODO(b/173688156): Renovate this whole class, and especially work around all the locks.
-public class SysUiTileUpdateRequester implements TileUpdateRequester {
+class SysUiTileUpdateRequester implements TileUpdateRequester {
     private static final String TAG = "HTUpdateRequester";
 
     private static final String DEFAULT_TARGET_SYSUI = "com.google.android.wearable.app";
@@ -64,7 +64,7 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends Service> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
         synchronized (mLock) {
             mPendingServices.add(tileProvider);
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
index 0f1fa74..f54e03e 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' TileAddEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a tile provider.
  *
  * <p>All this does is to serialize TileAddEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
index 324d86c..c0c2891 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' Tile class, to be parceled and transferred to Wear.
+ * Holder for Tiles' Tile class, to be parceled and transferred to Wear.
  *
  * <p>All this does is to serialize Tile as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
index 8b13a32..99e0dbc 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' TileEnterEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a tile provider.
  *
  * <p>All this does is to serialize TileEnterEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
index df3a592..bbc7ae6 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' TileLeaveEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileLeaveEvent class, to be parceled and transferred to a tile provider.
  *
  * <p>All this does is to serialize TileLeaveEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
index 10dfabc..27bb1a1 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileProviderService.java
@@ -79,8 +79,11 @@
     public static final String METADATA_PREVIEW_KEY = "androidx.wear.tiles.PREVIEW";
 
     /**
-     * Called when the system is requesting a new timeline from this Tile Provider. Note that this
-     * may be called from a background thread.
+     * Called when the system is requesting a new timeline from this Tile Provider. The returned
+     * future must complete after at most 10 seconds from the moment this method is called (exact
+     * timeout length subject to change).
+     *
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
      * @param requestParams Parameters about the request. See {@link TileRequest} for more info.
      */
@@ -89,11 +92,14 @@
     protected abstract ListenableFuture<Tile> onTileRequest(@NonNull TileRequest requestParams);
 
     /**
-     * Called when the system is requesting a resource bundle from this Tile Provider. Note that
-     * this may be called from a background thread.
+     * Called when the system is requesting a resource bundle from this Tile Provider. The returned
+     * future must complete after at most 10 seconds from the moment this method is called (exact
+     * timeout length subject to change).
+     *
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
      *
      * @param requestParams Parameters about the request. See {@link ResourcesRequest} for more
-     *                      info.
+     *     info.
      */
     @MainThread
     @NonNull
@@ -101,41 +107,41 @@
             @NonNull ResourcesRequest requestParams);
 
     /**
-     * Called when a tile provided by this Tile Provider is added to the carousel. Note that this
-     * may be called from a background thread.
+     * Called when a tile provided by this Tile Provider is added to the carousel.
      *
-     * @param requestParams Parameters about the request. See {@link TileAddEvent} for more
-     *     info.
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
+     *
+     * @param requestParams Parameters about the request. See {@link TileAddEvent} for more info.
      */
     @MainThread
     protected void onTileAddEvent(@NonNull TileAddEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider is removed from the carousel. Note that
-     * this may be called from a background thread.
+     * Called when a tile provided by this Tile Provider is removed from the carousel.
      *
-     * @param requestParams Parameters about the request. See {@link TileRemoveEvent} for more
-     *     info.
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
+     *
+     * @param requestParams Parameters about the request. See {@link TileRemoveEvent} for more info.
      */
     @MainThread
     protected void onTileRemoveEvent(@NonNull TileRemoveEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider becomes into view, on screen. Note that
-     * this may be called from a background thread.
+     * Called when a tile provided by this Tile Provider becomes into view, on screen.
      *
-     * @param requestParams Parameters about the request. See {@link TileEnterEvent} for more
-     *     info.
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
+     *
+     * @param requestParams Parameters about the request. See {@link TileEnterEvent} for more info.
      */
     @MainThread
     protected void onTileEnterEvent(@NonNull TileEnterEvent requestParams) {}
 
     /**
-     * Called when a tile provided by this Tile Provider goes out of view, on screen. Note that this
-     * may be called from a background thread.
+     * Called when a tile provided by this Tile Provider goes out of view, on screen.
      *
-     * @param requestParams Parameters about the request. See {@link TileLeaveEvent} for more
-     *     info.
+     * <p>Note that this is called from your app's main thread, which is usually also the UI thread.
+     *
+     * @param requestParams Parameters about the request. See {@link TileLeaveEvent} for more info.
      */
     @MainThread
     protected void onTileLeaveEvent(@NonNull TileLeaveEvent requestParams) {}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
index 784150b..904c86e 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' TileRemoveEvent class, to be parceled and transferred to a tile provider.
+ * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a tile provider.
  *
  * <p>All this does is to serialize TileRemoveEvent as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
index f912fc1..8e2b2f6 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
@@ -20,7 +20,7 @@
 import androidx.annotation.RestrictTo;
 
 /**
- * Holder for ProtoTiles' TileRequest class, to be parceled and transferred to Wear.
+ * Holder for Tiles' TileRequest class, to be parceled and transferred to a Tile Provider.
  *
  * <p>All this does is to serialize TileRequest as a protobuf and transmit it.
  *
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
index 4d868ae..02e3640 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
@@ -16,8 +16,6 @@
 
 package androidx.wear.tiles;
 
-import android.app.Service;
-
 import androidx.annotation.NonNull;
 
 /**
@@ -26,5 +24,5 @@
  */
 public interface TileUpdateRequester {
     /** Notify the Tile Renderer that it should fetch a new Timeline from this Tile Provider. */
-    void requestUpdate(@NonNull Class<? extends Service> tileProvider);
+    void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider);
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TilesExperimental.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TilesExperimental.java
new file mode 100644
index 0000000..1457427
--- /dev/null
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TilesExperimental.java
@@ -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.wear.tiles;
+
+import androidx.annotation.RequiresOptIn;
+import androidx.annotation.RequiresOptIn.Level;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that this API surface is experimental. It may change without warning, and it may not
+ * render correctly on all tile renderers.
+ */
+@RequiresOptIn(level = Level.ERROR)
+@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
+public @interface TilesExperimental {}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
index 7872222..6ac26b7 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
@@ -16,17 +16,16 @@
 
 package androidx.wear.tiles;
 
-import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
 
 import androidx.annotation.NonNull;
 
 /**
- * {@link TileUpdateRequester} which notifies the viewer app that it should fetch a new version
- * of the Timeline.
+ * {@link TileUpdateRequester} which notifies the viewer that it should fetch a new version of the
+ * Timeline.
  */
-public class ViewerTileUpdateRequester implements TileUpdateRequester {
+class ViewerTileUpdateRequester implements TileUpdateRequester {
     /**
      * The intent action used so a Tile Provider can request that the platform fetches a new
      * Timeline from it.
@@ -41,7 +40,7 @@
     }
 
     @Override
-    public void requestUpdate(@NonNull Class<? extends Service> tileProvider) {
+    public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
         mContext.sendBroadcast(buildUpdateIntent(mContext.getPackageName()));
     }
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ActionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ActionBuilders.java
index 81f94ab..aa76027 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ActionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ActionBuilders.java
@@ -28,6 +28,383 @@
 public final class ActionBuilders {
     private ActionBuilders() {}
 
+    /** Shortcut for building an {@link AndroidStringExtra}. */
+    @NonNull
+    public static AndroidStringExtra stringExtra(@NonNull String value) {
+        return AndroidStringExtra.builder().setValue(value).build();
+    }
+
+    /** Shortcut for building an {@link AndroidIntExtra}. */
+    @NonNull
+    public static AndroidIntExtra intExtra(int value) {
+        return AndroidIntExtra.builder().setValue(value).build();
+    }
+
+    /** Shortcut for building an {@link AndroidLongExtra}. */
+    @NonNull
+    public static AndroidLongExtra longExtra(long value) {
+        return AndroidLongExtra.builder().setValue(value).build();
+    }
+
+    /** Shortcut for building an {@link AndroidDoubleExtra}. */
+    @NonNull
+    public static AndroidDoubleExtra doubleExtra(double value) {
+        return AndroidDoubleExtra.builder().setValue(value).build();
+    }
+
+    /** Shortcut for building an {@link AndroidBooleanExtra}. */
+    @NonNull
+    public static AndroidBooleanExtra booleanExtra(boolean value) {
+        return AndroidBooleanExtra.builder().setValue(value).build();
+    }
+
+    /** A string value that can be added to an Android intent's extras. */
+    public static final class AndroidStringExtra implements AndroidExtra {
+        private final ActionProto.AndroidStringExtra mImpl;
+
+        private AndroidStringExtra(ActionProto.AndroidStringExtra impl) {
+            this.mImpl = impl;
+        }
+
+        /** Returns a new {@link Builder}. */
+        @NonNull
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public static AndroidStringExtra fromProto(@NonNull ActionProto.AndroidStringExtra proto) {
+            return new AndroidStringExtra(proto);
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidStringExtra toProto() {
+            return mImpl;
+        }
+
+        /** @hide */
+        @Override
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ActionProto.AndroidExtra toAndroidExtraProto() {
+            return ActionProto.AndroidExtra.newBuilder().setStringVal(mImpl).build();
+        }
+
+        /** Builder for {@link AndroidStringExtra}. */
+        public static final class Builder implements AndroidExtra.Builder {
+            private final ActionProto.AndroidStringExtra.Builder mImpl =
+                    ActionProto.AndroidStringExtra.newBuilder();
+
+            Builder() {}
+
+            /** Sets the value. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setValue(@NonNull String value) {
+                mImpl.setValue(value);
+                return this;
+            }
+
+            @Override
+            @NonNull
+            public AndroidStringExtra build() {
+                return AndroidStringExtra.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /** An integer value that can be added to an Android intent's extras. */
+    public static final class AndroidIntExtra implements AndroidExtra {
+        private final ActionProto.AndroidIntExtra mImpl;
+
+        private AndroidIntExtra(ActionProto.AndroidIntExtra impl) {
+            this.mImpl = impl;
+        }
+
+        /** Returns a new {@link Builder}. */
+        @NonNull
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public static AndroidIntExtra fromProto(@NonNull ActionProto.AndroidIntExtra proto) {
+            return new AndroidIntExtra(proto);
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidIntExtra toProto() {
+            return mImpl;
+        }
+
+        /** @hide */
+        @Override
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ActionProto.AndroidExtra toAndroidExtraProto() {
+            return ActionProto.AndroidExtra.newBuilder().setIntVal(mImpl).build();
+        }
+
+        /** Builder for {@link AndroidIntExtra}. */
+        public static final class Builder implements AndroidExtra.Builder {
+            private final ActionProto.AndroidIntExtra.Builder mImpl =
+                    ActionProto.AndroidIntExtra.newBuilder();
+
+            Builder() {}
+
+            /** Sets the value. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setValue(int value) {
+                mImpl.setValue(value);
+                return this;
+            }
+
+            @Override
+            @NonNull
+            public AndroidIntExtra build() {
+                return AndroidIntExtra.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /** A long value that can be added to an Android intent's extras. */
+    public static final class AndroidLongExtra implements AndroidExtra {
+        private final ActionProto.AndroidLongExtra mImpl;
+
+        private AndroidLongExtra(ActionProto.AndroidLongExtra impl) {
+            this.mImpl = impl;
+        }
+
+        /** Returns a new {@link Builder}. */
+        @NonNull
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public static AndroidLongExtra fromProto(@NonNull ActionProto.AndroidLongExtra proto) {
+            return new AndroidLongExtra(proto);
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidLongExtra toProto() {
+            return mImpl;
+        }
+
+        /** @hide */
+        @Override
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ActionProto.AndroidExtra toAndroidExtraProto() {
+            return ActionProto.AndroidExtra.newBuilder().setLongVal(mImpl).build();
+        }
+
+        /** Builder for {@link AndroidLongExtra}. */
+        public static final class Builder implements AndroidExtra.Builder {
+            private final ActionProto.AndroidLongExtra.Builder mImpl =
+                    ActionProto.AndroidLongExtra.newBuilder();
+
+            Builder() {}
+
+            /** Sets the value. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setValue(long value) {
+                mImpl.setValue(value);
+                return this;
+            }
+
+            @Override
+            @NonNull
+            public AndroidLongExtra build() {
+                return AndroidLongExtra.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /** A double value that can be added to an Android intent's extras. */
+    public static final class AndroidDoubleExtra implements AndroidExtra {
+        private final ActionProto.AndroidDoubleExtra mImpl;
+
+        private AndroidDoubleExtra(ActionProto.AndroidDoubleExtra impl) {
+            this.mImpl = impl;
+        }
+
+        /** Returns a new {@link Builder}. */
+        @NonNull
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public static AndroidDoubleExtra fromProto(@NonNull ActionProto.AndroidDoubleExtra proto) {
+            return new AndroidDoubleExtra(proto);
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidDoubleExtra toProto() {
+            return mImpl;
+        }
+
+        /** @hide */
+        @Override
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ActionProto.AndroidExtra toAndroidExtraProto() {
+            return ActionProto.AndroidExtra.newBuilder().setDoubleVal(mImpl).build();
+        }
+
+        /** Builder for {@link AndroidDoubleExtra}. */
+        public static final class Builder implements AndroidExtra.Builder {
+            private final ActionProto.AndroidDoubleExtra.Builder mImpl =
+                    ActionProto.AndroidDoubleExtra.newBuilder();
+
+            Builder() {}
+
+            /** Sets the value. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setValue(double value) {
+                mImpl.setValue(value);
+                return this;
+            }
+
+            @Override
+            @NonNull
+            public AndroidDoubleExtra build() {
+                return AndroidDoubleExtra.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /** A boolean value that can be added to an Android intent's extras. */
+    public static final class AndroidBooleanExtra implements AndroidExtra {
+        private final ActionProto.AndroidBooleanExtra mImpl;
+
+        private AndroidBooleanExtra(ActionProto.AndroidBooleanExtra impl) {
+            this.mImpl = impl;
+        }
+
+        /** Returns a new {@link Builder}. */
+        @NonNull
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public static AndroidBooleanExtra fromProto(
+                @NonNull ActionProto.AndroidBooleanExtra proto) {
+            return new AndroidBooleanExtra(proto);
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidBooleanExtra toProto() {
+            return mImpl;
+        }
+
+        /** @hide */
+        @Override
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public ActionProto.AndroidExtra toAndroidExtraProto() {
+            return ActionProto.AndroidExtra.newBuilder().setBooleanVal(mImpl).build();
+        }
+
+        /** Builder for {@link AndroidBooleanExtra}. */
+        public static final class Builder implements AndroidExtra.Builder {
+            private final ActionProto.AndroidBooleanExtra.Builder mImpl =
+                    ActionProto.AndroidBooleanExtra.newBuilder();
+
+            Builder() {}
+
+            /** Sets the value. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setValue(boolean value) {
+                mImpl.setValue(value);
+                return this;
+            }
+
+            @Override
+            @NonNull
+            public AndroidBooleanExtra build() {
+                return AndroidBooleanExtra.fromProto(mImpl.build());
+            }
+        }
+    }
+
+    /**
+     * Interface defining an item that can be included in the extras of an intent that will be sent
+     * to an Android activity. Supports types in android.os.PersistableBundle, excluding arrays.
+     */
+    public interface AndroidExtra {
+        /**
+         * Get the protocol buffer representation of this object.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        ActionProto.AndroidExtra toAndroidExtraProto();
+
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static AndroidExtra fromAndroidExtraProto(@NonNull ActionProto.AndroidExtra proto) {
+            if (proto.hasStringVal()) {
+                return AndroidStringExtra.fromProto(proto.getStringVal());
+            }
+            if (proto.hasIntVal()) {
+                return AndroidIntExtra.fromProto(proto.getIntVal());
+            }
+            if (proto.hasLongVal()) {
+                return AndroidLongExtra.fromProto(proto.getLongVal());
+            }
+            if (proto.hasDoubleVal()) {
+                return AndroidDoubleExtra.fromProto(proto.getDoubleVal());
+            }
+            if (proto.hasBooleanVal()) {
+                return AndroidBooleanExtra.fromProto(proto.getBooleanVal());
+            }
+            throw new IllegalStateException("Proto was not a recognised instance of AndroidExtra");
+        }
+
+        /** Builder to create {@link AndroidExtra} objects. */
+        @SuppressLint("StaticFinalBuilder")
+        interface Builder {
+
+            /** Builds an instance with values accumulated in this Builder. */
+            @NonNull
+            AndroidExtra build();
+        }
+    }
+
     /** A launch action to send an intent to an Android activity. */
     public static final class AndroidActivity {
         private final ActionProto.AndroidActivity mImpl;
@@ -82,6 +459,23 @@
                 return this;
             }
 
+            /** Adds an entry into the extras to be included in the intent. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder addKeyToExtraMapping(@NonNull String key, @NonNull AndroidExtra extra) {
+                mImpl.putKeyToExtra(key, extra.toAndroidExtraProto());
+                return this;
+            }
+
+            /** Adds an entry into the extras to be included in the intent. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder addKeyToExtraMapping(
+                    @NonNull String key, @NonNull AndroidExtra.Builder extraBuilder) {
+                mImpl.putKeyToExtra(key, extraBuilder.build().toAndroidExtraProto());
+                return this;
+            }
+
             /** Builds an instance from accumulated values. */
             @NonNull
             public AndroidActivity build() {
@@ -248,6 +642,24 @@
         @NonNull
         ActionProto.Action toActionProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static Action fromActionProto(@NonNull ActionProto.Action proto) {
+            if (proto.hasLaunchAction()) {
+                return LaunchAction.fromProto(proto.getLaunchAction());
+            }
+            if (proto.hasLoadAction()) {
+                return LoadAction.fromProto(proto.getLoadAction());
+            }
+            throw new IllegalStateException("Proto was not a recognised instance of Action");
+        }
+
         /** Builder to create {@link Action} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/DimensionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/DimensionBuilders.java
index 2cff2b5..ac0d7fa 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/DimensionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/DimensionBuilders.java
@@ -518,6 +518,29 @@
         @NonNull
         DimensionProto.ContainerDimension toContainerDimensionProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static ContainerDimension fromContainerDimensionProto(
+                @NonNull DimensionProto.ContainerDimension proto) {
+            if (proto.hasLinearDimension()) {
+                return DpProp.fromProto(proto.getLinearDimension());
+            }
+            if (proto.hasExpandedDimension()) {
+                return ExpandedDimensionProp.fromProto(proto.getExpandedDimension());
+            }
+            if (proto.hasWrappedDimension()) {
+                return WrappedDimensionProp.fromProto(proto.getWrappedDimension());
+            }
+            throw new IllegalStateException(
+                    "Proto was not a recognised instance of ContainerDimension");
+        }
+
         /** Builder to create {@link ContainerDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
@@ -539,6 +562,29 @@
         @NonNull
         DimensionProto.ImageDimension toImageDimensionProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static ImageDimension fromImageDimensionProto(
+                @NonNull DimensionProto.ImageDimension proto) {
+            if (proto.hasLinearDimension()) {
+                return DpProp.fromProto(proto.getLinearDimension());
+            }
+            if (proto.hasExpandedDimension()) {
+                return ExpandedDimensionProp.fromProto(proto.getExpandedDimension());
+            }
+            if (proto.hasProportionalDimension()) {
+                return ProportionalDimensionProp.fromProto(proto.getProportionalDimension());
+            }
+            throw new IllegalStateException(
+                    "Proto was not a recognised instance of ImageDimension");
+        }
+
         /** Builder to create {@link ImageDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
@@ -560,6 +606,23 @@
         @NonNull
         DimensionProto.SpacerDimension toSpacerDimensionProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static SpacerDimension fromSpacerDimensionProto(
+                @NonNull DimensionProto.SpacerDimension proto) {
+            if (proto.hasLinearDimension()) {
+                return DpProp.fromProto(proto.getLinearDimension());
+            }
+            throw new IllegalStateException(
+                    "Proto was not a recognised instance of SpacerDimension");
+        }
+
         /** Builder to create {@link SpacerDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/LayoutElementBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/LayoutElementBuilders.java
index 3f1f665..3d53863 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/LayoutElementBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/LayoutElementBuilders.java
@@ -21,8 +21,10 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
+import androidx.wear.tiles.TilesExperimental;
 import androidx.wear.tiles.builders.ColorBuilders.ColorProp;
 import androidx.wear.tiles.builders.DimensionBuilders.ContainerDimension;
 import androidx.wear.tiles.builders.DimensionBuilders.DegreesProp;
@@ -104,8 +106,9 @@
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef({FONT_WEIGHT_UNDEFINED, FONT_WEIGHT_NORMAL, FONT_WEIGHT_BOLD})
+    @IntDef({FONT_WEIGHT_UNDEFINED, FONT_WEIGHT_NORMAL, FONT_WEIGHT_MEDIUM, FONT_WEIGHT_BOLD})
     @Retention(RetentionPolicy.SOURCE)
+    @OptIn(markerClass = TilesExperimental.class)
     public @interface FontWeight {}
 
     /** Font weight is undefined. */
@@ -114,10 +117,61 @@
     /** Normal font weight. */
     public static final int FONT_WEIGHT_NORMAL = 400;
 
+    /** Medium font weight. */
+    @TilesExperimental public static final int FONT_WEIGHT_MEDIUM = 500;
+
     /** Bold font weight. */
     public static final int FONT_WEIGHT_BOLD = 700;
 
     /**
+     * The variant of a font. Some renderers may use different fonts for title and body text, which
+     * can be selected using this field.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({FONT_VARIANT_UNDEFINED, FONT_VARIANT_TITLE, FONT_VARIANT_BODY})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FontVariant {}
+
+    /** Font variant is undefined. */
+    public static final int FONT_VARIANT_UNDEFINED = 0;
+
+    /** Font variant suited for title text. */
+    public static final int FONT_VARIANT_TITLE = 1;
+
+    /** Font variant suited for body text. */
+    public static final int FONT_VARIANT_BODY = 2;
+
+    /**
+     * The alignment of a {@link SpanImage} within the line height of the surrounding {@link
+     * Spannable}.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({SPAN_VALIGN_UNDEFINED, SPAN_VALIGN_BOTTOM, SPAN_VALIGN_TEXT_BASELINE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SpanVerticalAlignment {}
+
+    /** Alignment is undefined. */
+    public static final int SPAN_VALIGN_UNDEFINED = 0;
+
+    /**
+     * Align to the bottom of the line (descent of the largest text in this line). If there is no
+     * text in the line containing this image, this will align to the bottom of the line, where the
+     * line height is defined as the height of the largest image in the line.
+     */
+    public static final int SPAN_VALIGN_BOTTOM = 1;
+
+    /**
+     * Align to the baseline of the text. Note that if the line in the {@link Spannable} which
+     * contains this image does not contain any text, the effects of using this alignment are
+     * undefined.
+     */
+    public static final int SPAN_VALIGN_TEXT_BASELINE = 2;
+
+    /**
      * Alignment of a text element.
      *
      * @hide
@@ -392,6 +446,20 @@
                 return this;
             }
 
+            /**
+             * Sets the variant of a font. Some renderers may use different fonts for title and body
+             * text, which can be selected using this field. If not specified, defaults to "body".
+             */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @TilesExperimental
+            @NonNull
+            public Builder setVariant(@FontVariant int variant) {
+                mImpl.setVariant(
+                        LayoutElementProto.FontVariantProp.newBuilder()
+                                .setValue(LayoutElementProto.FontVariant.forNumber(variant)));
+                return this;
+            }
+
             /** Builds an instance from accumulated values. */
             @NonNull
             public FontStyle build() {
@@ -1203,6 +1271,21 @@
                 return this;
             }
 
+            /**
+             * Sets alignment of this image within the line height of the surrounding {@link
+             * Spannable}. If undefined, defaults to SPAN_VALIGN_BOTTOM.
+             */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setAlignment(@SpanVerticalAlignment int alignment) {
+                mImpl.setAlignment(
+                        LayoutElementProto.SpanVerticalAlignmentProp.newBuilder()
+                                .setValue(
+                                        LayoutElementProto.SpanVerticalAlignment.forNumber(
+                                                alignment)));
+                return this;
+            }
+
             @Override
             @NonNull
             public SpanImage build() {
@@ -1226,6 +1309,24 @@
         @NonNull
         LayoutElementProto.Span toSpanProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static Span fromSpanProto(@NonNull LayoutElementProto.Span proto) {
+            if (proto.hasText()) {
+                return SpanText.fromProto(proto.getText());
+            }
+            if (proto.hasImage()) {
+                return SpanImage.fromProto(proto.getImage());
+            }
+            throw new IllegalStateException("Proto was not a recognised instance of Span");
+        }
+
         /** Builder to create {@link Span} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
@@ -2296,6 +2397,43 @@
         @NonNull
         LayoutElementProto.LayoutElement toLayoutElementProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static LayoutElement fromLayoutElementProto(
+                @NonNull LayoutElementProto.LayoutElement proto) {
+            if (proto.hasColumn()) {
+                return Column.fromProto(proto.getColumn());
+            }
+            if (proto.hasRow()) {
+                return Row.fromProto(proto.getRow());
+            }
+            if (proto.hasBox()) {
+                return Box.fromProto(proto.getBox());
+            }
+            if (proto.hasSpacer()) {
+                return Spacer.fromProto(proto.getSpacer());
+            }
+            if (proto.hasText()) {
+                return Text.fromProto(proto.getText());
+            }
+            if (proto.hasImage()) {
+                return Image.fromProto(proto.getImage());
+            }
+            if (proto.hasArc()) {
+                return Arc.fromProto(proto.getArc());
+            }
+            if (proto.hasSpannable()) {
+                return Spannable.fromProto(proto.getSpannable());
+            }
+            throw new IllegalStateException("Proto was not a recognised instance of LayoutElement");
+        }
+
         /** Builder to create {@link LayoutElement} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
@@ -2320,6 +2458,32 @@
         @NonNull
         LayoutElementProto.ArcLayoutElement toArcLayoutElementProto();
 
+        /**
+         * Return an instance of one of this object's subtypes, from the protocol buffer
+         * representation.
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        static ArcLayoutElement fromArcLayoutElementProto(
+                @NonNull LayoutElementProto.ArcLayoutElement proto) {
+            if (proto.hasText()) {
+                return ArcText.fromProto(proto.getText());
+            }
+            if (proto.hasLine()) {
+                return ArcLine.fromProto(proto.getLine());
+            }
+            if (proto.hasSpacer()) {
+                return ArcSpacer.fromProto(proto.getSpacer());
+            }
+            if (proto.hasAdapter()) {
+                return ArcAdapter.fromProto(proto.getAdapter());
+            }
+            throw new IllegalStateException(
+                    "Proto was not a recognised instance of ArcLayoutElement");
+        }
+
         /** Builder to create {@link ArcLayoutElement} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
@@ -2393,102 +2557,231 @@
     public static class FontStyles {
         private static final int LARGE_SCREEN_WIDTH_DP = 210;
 
-        private final int mScreenWidthDp;
+        private final DeviceParameters mDeviceParameters;
 
-        private FontStyles(int screenWidthDp) {
-            this.mScreenWidthDp = screenWidthDp;
+        private FontStyles(DeviceParameters deviceParameters) {
+            this.mDeviceParameters = deviceParameters;
         }
 
-        private boolean isLargeScreen() {
-            return mScreenWidthDp >= LARGE_SCREEN_WIDTH_DP;
+        private static boolean isLargeScreen(@NonNull DeviceParameters deviceParameters) {
+            return deviceParameters.getScreenWidthDp() >= LARGE_SCREEN_WIDTH_DP;
         }
 
         /**
          * Create a FontStyles instance, using the given device parameters to determine font sizes.
+         *
+         * @deprecated Use static functions, accepting a {@link DeviceParameters} instance instead
+         *     (e.g. {@link FontStyles#display1(DeviceParameters)}).
          */
+        @Deprecated
         @NonNull
         public static FontStyles withDeviceParameters(@NonNull DeviceParameters deviceParameters) {
-            return new FontStyles(deviceParameters.getScreenWidthDp());
+            return new FontStyles(deviceParameters);
+        }
+
+        /**
+         * Font style for large display text.
+         *
+         * @deprecated Use {@link FontStyles#display1(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder display1() {
+            return display1(mDeviceParameters);
+        }
+
+        /**
+         * Font style for medium display text.
+         *
+         * @deprecated Use {@link FontStyles#display2(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder display2() {
+            return display2(mDeviceParameters);
+        }
+
+        /**
+         * Font style for small display text.
+         *
+         * @deprecated Use {@link FontStyles#display3(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder display3() {
+            return display3(mDeviceParameters);
+        }
+
+        /**
+         * Font style for large title text.
+         *
+         * @deprecated Use {@link FontStyles#title1(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder title1() {
+            return title1(mDeviceParameters);
+        }
+
+        /**
+         * Font style for medium title text.
+         *
+         * @deprecated Use {@link FontStyles#title2(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder title2() {
+            return title2(mDeviceParameters);
+        }
+
+        /**
+         * Font style for small title text.
+         *
+         * @deprecated Use {@link FontStyles#title3(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder title3() {
+            return title3(mDeviceParameters);
+        }
+
+        /**
+         * Font style for large body text.
+         *
+         * @deprecated Use {@link FontStyles#body1(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder body1() {
+            return body1(mDeviceParameters);
+        }
+
+        /**
+         * Font style for medium body text.
+         *
+         * @deprecated Use {@link FontStyles#body2(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder body2() {
+            return body2(mDeviceParameters);
+        }
+
+        /**
+         * Font style for button text.
+         *
+         * @deprecated Use {@link FontStyles#button(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder button() {
+            return button(mDeviceParameters);
+        }
+
+        /**
+         * Font style for large caption text.
+         *
+         * @deprecated Use {@link FontStyles#caption1(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder caption1() {
+            return caption1(mDeviceParameters);
+        }
+
+        /**
+         * Font style for medium caption text.
+         *
+         * @deprecated Use {@link FontStyles#caption2(DeviceParameters)} instead.
+         */
+        @Deprecated
+        @NonNull
+        public FontStyle.Builder caption2() {
+            return caption2(mDeviceParameters);
         }
 
         /** Font style for large display text. */
         @NonNull
-        public FontStyle.Builder display1() {
+        public static FontStyle.Builder display1(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 54 : 50));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 54 : 50));
         }
 
         /** Font style for medium display text. */
         @NonNull
-        public FontStyle.Builder display2() {
+        public static FontStyle.Builder display2(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 44 : 40));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 44 : 40));
         }
 
         /** Font style for small display text. */
         @NonNull
-        public FontStyle.Builder display3() {
+        public static FontStyle.Builder display3(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 34 : 30));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 34 : 30));
         }
 
         /** Font style for large title text. */
         @NonNull
-        public FontStyle.Builder title1() {
+        public static FontStyle.Builder title1(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 26 : 24));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 26 : 24));
         }
 
         /** Font style for medium title text. */
         @NonNull
-        public FontStyle.Builder title2() {
+        public static FontStyle.Builder title2(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 22 : 20));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 22 : 20));
         }
 
         /** Font style for small title text. */
         @NonNull
-        public FontStyle.Builder title3() {
+        public static FontStyle.Builder title3(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 18 : 16));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
         }
 
         /** Font style for large body text. */
         @NonNull
-        public FontStyle.Builder body1() {
-            return FontStyle.builder().setSize(DimensionBuilders.sp(isLargeScreen() ? 18 : 16));
+        public static FontStyle.Builder body1(@NonNull DeviceParameters deviceParameters) {
+            return FontStyle.builder()
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
         }
 
         /** Font style for medium body text. */
         @NonNull
-        public FontStyle.Builder body2() {
-            return FontStyle.builder().setSize(DimensionBuilders.sp(isLargeScreen() ? 16 : 14));
+        public static FontStyle.Builder body2(@NonNull DeviceParameters deviceParameters) {
+            return FontStyle.builder()
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for button text. */
         @NonNull
-        public FontStyle.Builder button() {
+        public static FontStyle.Builder button(@NonNull DeviceParameters deviceParameters) {
             return FontStyle.builder()
                     .setWeight(FONT_WEIGHT_BOLD)
-                    .setSize(DimensionBuilders.sp(isLargeScreen() ? 16 : 14));
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for large caption text. */
         @NonNull
-        public FontStyle.Builder caption1() {
-            return FontStyle.builder().setSize(DimensionBuilders.sp(isLargeScreen() ? 16 : 14));
+        public static FontStyle.Builder caption1(@NonNull DeviceParameters deviceParameters) {
+            return FontStyle.builder()
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for medium caption text. */
         @NonNull
-        public FontStyle.Builder caption2() {
-            return FontStyle.builder().setSize(DimensionBuilders.sp(isLargeScreen() ? 14 : 12));
+        public static FontStyle.Builder caption2(@NonNull DeviceParameters deviceParameters) {
+            return FontStyle.builder()
+                    .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 14 : 12));
         }
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ModifiersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ModifiersBuilders.java
index 25c24de..abb9b04 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ModifiersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ModifiersBuilders.java
@@ -287,6 +287,23 @@
                 return this;
             }
 
+            /** Sets the padding for all sides of the content, in DP. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setAll(@NonNull DpProp value) {
+                return setStart(value).setEnd(value).setTop(value).setBottom(value);
+            }
+
+            /** Sets the padding for all sides of the content, in DP. */
+            @SuppressLint("MissingGetterMatchingBuilder")
+            @NonNull
+            public Builder setAll(@NonNull DpProp.Builder valueBuilder) {
+                return setStart(valueBuilder)
+                        .setEnd(valueBuilder)
+                        .setTop(valueBuilder)
+                        .setBottom(valueBuilder);
+            }
+
             /** Builds an instance from accumulated values. */
             @NonNull
             public Padding build() {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ResourceBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ResourceBuilders.java
index 16abf2d..e2d8230 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ResourceBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/ResourceBuilders.java
@@ -241,18 +241,18 @@
             /** Sets an image resource that maps to an Android drawable by resource ID. */
             @SuppressLint("MissingGetterMatchingBuilder")
             @NonNull
-            public Builder setAndroidResourceByResid(
-                    @NonNull AndroidImageResourceByResId androidResourceByResid) {
-                mImpl.setAndroidResourceByResid(androidResourceByResid.toProto());
+            public Builder setAndroidResourceByResId(
+                    @NonNull AndroidImageResourceByResId androidResourceByResId) {
+                mImpl.setAndroidResourceByResId(androidResourceByResId.toProto());
                 return this;
             }
 
             /** Sets an image resource that maps to an Android drawable by resource ID. */
             @SuppressLint("MissingGetterMatchingBuilder")
             @NonNull
-            public Builder setAndroidResourceByResid(
-                    @NonNull AndroidImageResourceByResId.Builder androidResourceByResidBuilder) {
-                mImpl.setAndroidResourceByResid(androidResourceByResidBuilder.build().toProto());
+            public Builder setAndroidResourceByResId(
+                    @NonNull AndroidImageResourceByResId.Builder androidResourceByResIdBuilder) {
+                mImpl.setAndroidResourceByResId(androidResourceByResIdBuilder.build().toProto());
                 return this;
             }
 
@@ -324,7 +324,8 @@
              * the resources.
              *
              * <p>This value must match the version of the resources required by the tile for the
-             * tile to render successfully.
+             * tile to render successfully, and must match the resource version specified in
+             * ResourcesRequest which triggered this request.
              */
             @SuppressLint("MissingGetterMatchingBuilder")
             @NonNull
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TileBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TileBuilders.java
index ff5b034..847aacd 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TileBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TileBuilders.java
@@ -66,8 +66,12 @@
 
             Builder() {}
 
-            /** Sets the resource version required for these tiles. */
             @SuppressLint("MissingGetterMatchingBuilder")
+            /**
+             * Sets the resource version required for these tiles. This can be any developer-defined
+             * string; it is only used to cache resources, and is passed in ResourcesRequest if the
+             * system does not have a copy of the specified resource version.
+             */
             @NonNull
             public Builder setResourcesVersion(@NonNull String resourcesVersion) {
                 mImpl.setResourcesVersion(resourcesVersion);
@@ -96,6 +100,12 @@
              * point in the future after this interval has lapsed. A value of 0 here signifies that
              * auto-refreshes should not be used (i.e. you will manually request updates via
              * TileProviderService#getRequester).
+             *
+             * <p>This mechanism should not be used to update your tile more frequently than once a
+             * minute, and the system may throttle your updates if you request updates faster than
+             * this interval. This interval is also inexact; the system will generally update your
+             * tile if it is on-screen, or about to be on-screen, although this is not guaranteed
+             * due to system-level optimizations.
              */
             @SuppressLint("MissingGetterMatchingBuilder")
             @NonNull
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TimelineBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TimelineBuilders.java
index e312d4b..accfa10 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TimelineBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/builders/TimelineBuilders.java
@@ -184,7 +184,7 @@
     public static final class Timeline {
         private final TimelineProto.Timeline mImpl;
 
-        Timeline(TimelineProto.Timeline impl) {
+        private Timeline(TimelineProto.Timeline impl) {
             this.mImpl = impl;
         }
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
index 2ae5a0a..f015db7 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/EventReaders.java
@@ -33,6 +33,7 @@
 
     /** Reader for Tile add event parameters. */
     public static class TileAddEvent {
+        @SuppressWarnings("UnusedVariable")
         private final EventProto.TileAddEvent mProto;
 
         private TileAddEvent(@NonNull EventProto.TileAddEvent proto) {
@@ -57,15 +58,11 @@
                         "Passed TileAddEventData did not contain a valid proto payload", ex);
             }
         }
-
-        /** Get the tile ID of the tile added to the carousel. */
-        public int getTileId() {
-            return mProto.getTileId();
-        }
     }
 
     /** Reader for Tile remove event parameters. */
     public static class TileRemoveEvent {
+        @SuppressWarnings("UnusedVariable")
         private final EventProto.TileRemoveEvent mProto;
 
         private TileRemoveEvent(@NonNull EventProto.TileRemoveEvent proto) {
@@ -90,15 +87,11 @@
                         "Passed TileRemoveEventData did not contain a valid proto payload", ex);
             }
         }
-
-        /** Get the tile ID of the tile removed from the carousel. */
-        public int getTileId() {
-            return mProto.getTileId();
-        }
     }
 
     /** Reader for Tile enter event parameters. */
     public static class TileEnterEvent {
+        @SuppressWarnings("UnusedVariable")
         private final EventProto.TileEnterEvent mProto;
 
         private TileEnterEvent(@NonNull EventProto.TileEnterEvent proto) {
@@ -123,15 +116,11 @@
                         "Passed TileEnterEventData did not contain a valid proto payload", ex);
             }
         }
-
-        /** Get the tile ID of the tile that was entered. */
-        public int getTileId() {
-            return mProto.getTileId();
-        }
     }
 
     /** Reader for a Tile leave event parameters. */
     public static class TileLeaveEvent {
+        @SuppressWarnings("UnusedVariable")
         private final EventProto.TileLeaveEvent mProto;
 
         private TileLeaveEvent(@NonNull EventProto.TileLeaveEvent proto) {
@@ -156,10 +145,5 @@
                         "Passed TileLeaveEventData did not contain a valid proto payload", ex);
             }
         }
-
-        /** Get the tile ID of the tile that was left. */
-        public int getTileId() {
-            return mProto.getTileId();
-        }
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
index d3a50de6..4b2d024 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/readers/RequestReaders.java
@@ -36,6 +36,7 @@
     /** Reader for Tile request parameters. */
     public static class TileRequest {
         private final RequestProto.TileRequest mProto;
+        @SuppressWarnings("UnusedVariable")
         private final int mTileId;
 
         private TileRequest(RequestProto.TileRequest proto, int tileId) {
@@ -55,10 +56,6 @@
             return new DeviceParameters(mProto.getDeviceParameters());
         }
 
-        public int getTileId() {
-            return mTileId;
-        }
-
         /** @hide */
         @RestrictTo(Scope.LIBRARY)
         @NonNull
@@ -78,6 +75,7 @@
     /** Reader for resource request parameters. */
     public static class ResourcesRequest {
         private final RequestProto.ResourcesRequest mProto;
+        @SuppressWarnings("UnusedVariable")
         private final int mTileId;
 
         private ResourcesRequest(@NonNull RequestProto.ResourcesRequest proto, int tileId) {
@@ -101,10 +99,6 @@
             }
         }
 
-        public int getTileId() {
-            return mTileId;
-        }
-
         /** Get the requested resource version. */
         @NonNull
         public String getVersion() {
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
index 1cba4ad..15aa6a4 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
@@ -18,12 +18,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.concurrent.futures.ResolvableFuture;
+import androidx.wear.tiles.builders.ResourceBuilders;
+import androidx.wear.tiles.builders.TileBuilders;
+import androidx.wear.tiles.readers.RequestReaders;
+
+import com.google.common.util.concurrent.ListenableFuture;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -46,8 +51,9 @@
         mFakeUpdateRequester1 = new FakeUpdateRequester();
         mFakeUpdateRequester2 = new FakeUpdateRequester();
 
-        mCompositeTileUpdateRequesterUnderTest = new CompositeTileUpdateRequester(
-                List.of(mFakeUpdateRequester1, mFakeUpdateRequester2));
+        mCompositeTileUpdateRequesterUnderTest =
+                new CompositeTileUpdateRequester(
+                        List.of(mFakeUpdateRequester1, mFakeUpdateRequester2));
     }
 
     @Test
@@ -59,16 +65,33 @@
     }
 
     private class FakeUpdateRequester implements TileUpdateRequester {
-        @Nullable Class<? extends Service> mCalledService = null;
+        @Nullable Class<? extends TileProviderService> mCalledService = null;
 
         @Override
-        public void requestUpdate(
-                @NonNull Class<? extends Service> tileProvider) {
+        public void requestUpdate(@NonNull Class<? extends TileProviderService> tileProvider) {
             this.mCalledService = tileProvider;
         }
     }
 
-    private class FakeService extends Service {
+    private class FakeService extends TileProviderService {
+        @NonNull
+        @Override
+        protected ListenableFuture<TileBuilders.Tile> onTileRequest(
+                @NonNull RequestReaders.TileRequest requestParams) {
+            ResolvableFuture<TileBuilders.Tile> f = ResolvableFuture.create();
+            f.set(null);
+            return f;
+        }
+
+        @NonNull
+        @Override
+        protected ListenableFuture<ResourceBuilders.Resources> onResourcesRequest(
+                @NonNull RequestReaders.ResourcesRequest requestParams) {
+            ResolvableFuture<ResourceBuilders.Resources> f = ResolvableFuture.create();
+            f.set(null);
+            return f;
+        }
+
         @Nullable
         @Override
         public IBinder onBind(Intent intent) {
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
index b9b7c3a..b297695 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileProviderServiceTest.java
@@ -139,78 +139,74 @@
     @Test
     public void tileProvider_onTileAdd() throws Exception {
         EventProto.TileAddEvent addRequest =
-                EventProto.TileAddEvent.newBuilder().setTileId(TILE_ID).build();
+                EventProto.TileAddEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileAddEvent(
                 new TileAddEventData(addRequest.toByteArray(), TileAddEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mLastOnTileAddId)
-                .isEqualTo(TILE_ID);
+        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileAddCalled).isTrue();
     }
 
     @Test
     public void tileProvider_onTileRemove() throws Exception {
         EventProto.TileRemoveEvent removeRequest =
-                EventProto.TileRemoveEvent.newBuilder().setTileId(TILE_ID).build();
+                EventProto.TileRemoveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileRemoveEvent(
                 new TileRemoveEventData(
                         removeRequest.toByteArray(), TileRemoveEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mLastOnTileRemoveId)
-                .isEqualTo(TILE_ID);
+        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileRemoveCalled).isTrue();
     }
 
     @Test
     public void tileProvider_onTileEnter() throws Exception {
         EventProto.TileEnterEvent enterRequest =
-                EventProto.TileEnterEvent.newBuilder().setTileId(TILE_ID).build();
+                EventProto.TileEnterEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileEnterEvent(
                 new TileEnterEventData(
                         enterRequest.toByteArray(), TileEnterEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mLastOnTileEnterId)
-                .isEqualTo(TILE_ID);
+        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileEnterCalled).isTrue();
     }
 
     @Test
     public void tileProvider_onTileLeave() throws Exception {
         EventProto.TileLeaveEvent leaveRequest =
-                EventProto.TileLeaveEvent.newBuilder().setTileId(TILE_ID).build();
+                EventProto.TileLeaveEvent.getDefaultInstance();
         mTileProviderServiceStub.onTileLeaveEvent(
                 new TileLeaveEventData(
                         leaveRequest.toByteArray(), TileLeaveEventData.VERSION_PROTOBUF));
         shadowOf(Looper.getMainLooper()).idle();
 
-        expect.that(mDummyTileProviderServiceServiceController.get().mLastOnTileLeaveId)
-                .isEqualTo(TILE_ID);
+        expect.that(mDummyTileProviderServiceServiceController.get().mOnTileLeaveCalled).isTrue();
     }
 
     public static class DummyTileProviderService extends TileProviderService {
-        int mLastOnTileAddId = -1;
-        int mLastOnTileRemoveId = -1;
-        int mLastOnTileEnterId = -1;
-        int mLastOnTileLeaveId = -1;
+        boolean mOnTileAddCalled = false;
+        boolean mOnTileRemoveCalled = false;
+        boolean mOnTileEnterCalled = false;
+        boolean mOnTileLeaveCalled = false;
 
         @Override
         protected void onTileAddEvent(@NonNull TileAddEvent requestParams) {
-            this.mLastOnTileAddId = requestParams.getTileId();
+            mOnTileAddCalled = true;
         }
 
         @Override
         protected void onTileRemoveEvent(@NonNull TileRemoveEvent requestParams) {
-            this.mLastOnTileRemoveId = requestParams.getTileId();
+            mOnTileRemoveCalled = true;
         }
 
         @Override
         protected void onTileEnterEvent(@NonNull TileEnterEvent requestParams) {
-            this.mLastOnTileEnterId = requestParams.getTileId();
+            mOnTileEnterCalled = true;
         }
 
         @Override
         protected void onTileLeaveEvent(@NonNull TileLeaveEvent requestParams) {
-            this.mLastOnTileLeaveId = requestParams.getTileId();
+            mOnTileLeaveCalled = true;
         }
 
         @Override
diff --git a/wear/wear-complications-data/api/current.txt b/wear/wear-complications-data/api/current.txt
index 2031367..debfecf 100644
--- a/wear/wear-complications-data/api/current.txt
+++ b/wear/wear-complications-data/api/current.txt
@@ -1,143 +1,4 @@
 // Signature format: 4.0
-package android.support.wearable.complications {
-
-  public final class ComplicationData implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.graphics.drawable.Icon? getBurnInProtectionIcon();
-    method public android.graphics.drawable.Icon? getBurnInProtectionSmallImage();
-    method public android.support.wearable.complications.ComplicationText? getContentDescription();
-    method public long getEndDateTimeMillis();
-    method public android.graphics.drawable.Icon? getIcon();
-    method public android.graphics.drawable.Icon? getLargeImage();
-    method public android.support.wearable.complications.ComplicationText? getLongText();
-    method public android.support.wearable.complications.ComplicationText? getLongTitle();
-    method public float getRangedMaxValue();
-    method public float getRangedMinValue();
-    method public float getRangedValue();
-    method public android.support.wearable.complications.ComplicationText? getShortText();
-    method public android.support.wearable.complications.ComplicationText? getShortTitle();
-    method public android.graphics.drawable.Icon? getSmallImage();
-    method public int getSmallImageStyle();
-    method public long getStartDateTimeMillis();
-    method public android.app.PendingIntent? getTapAction();
-    method public int getType();
-    method public boolean hasBurnInProtectionIcon();
-    method public boolean hasBurnInProtectionSmallImage();
-    method public boolean hasContentDescription();
-    method public boolean hasIcon();
-    method public boolean hasLargeImage();
-    method public boolean hasLongText();
-    method public boolean hasLongTitle();
-    method public boolean hasRangedMaxValue();
-    method public boolean hasRangedMinValue();
-    method public boolean hasRangedValue();
-    method public boolean hasShortText();
-    method public boolean hasShortTitle();
-    method public boolean hasSmallImage();
-    method public boolean hasTapAction();
-    method public boolean isActiveAt(long);
-    method public boolean isTimeDependent();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationData!> CREATOR;
-    field public static final int IMAGE_STYLE_ICON = 2; // 0x2
-    field public static final int IMAGE_STYLE_PHOTO = 1; // 0x1
-    field public static final int TYPE_EMPTY = 2; // 0x2
-    field public static final int TYPE_ICON = 6; // 0x6
-    field public static final int TYPE_LARGE_IMAGE = 8; // 0x8
-    field public static final int TYPE_LONG_TEXT = 4; // 0x4
-    field public static final int TYPE_NOT_CONFIGURED = 1; // 0x1
-    field public static final int TYPE_NO_DATA = 10; // 0xa
-    field public static final int TYPE_NO_PERMISSION = 9; // 0x9
-    field public static final int TYPE_RANGED_VALUE = 5; // 0x5
-    field public static final int TYPE_SHORT_TEXT = 3; // 0x3
-    field public static final int TYPE_SMALL_IMAGE = 7; // 0x7
-  }
-
-  public static final class ComplicationData.Builder {
-    ctor public ComplicationData.Builder(android.support.wearable.complications.ComplicationData);
-    ctor public ComplicationData.Builder(int);
-    method public android.support.wearable.complications.ComplicationData build();
-    method public android.support.wearable.complications.ComplicationData.Builder clearEndDateTime();
-    method public android.support.wearable.complications.ComplicationData.Builder clearStartDateTime();
-    method public android.support.wearable.complications.ComplicationData.Builder setBurnInProtectionIcon(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setBurnInProtectionSmallImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setContentDescription(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setEndDateTimeMillis(long);
-    method public android.support.wearable.complications.ComplicationData.Builder setIcon(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLargeImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLongText(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLongTitle(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedMaxValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedMinValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setShortText(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setShortTitle(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setSmallImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setSmallImageStyle(int);
-    method public android.support.wearable.complications.ComplicationData.Builder setStartDateTimeMillis(long);
-    method public android.support.wearable.complications.ComplicationData.Builder setTapAction(android.app.PendingIntent?);
-  }
-
-  public final class ComplicationProviderInfo implements android.os.Parcelable {
-    ctor public ComplicationProviderInfo(String, String, android.graphics.drawable.Icon, int, android.content.ComponentName);
-    ctor public ComplicationProviderInfo(android.os.Parcel);
-    method public int describeContents();
-    method public String? getAppName();
-    method public int getComplicationType();
-    method public android.content.ComponentName? getProviderComponentName();
-    method public android.graphics.drawable.Icon? getProviderIcon();
-    method public String? getProviderName();
-    method public void setAppName(String);
-    method public void setComplicationType(int);
-    method public void setProviderComponentName(android.content.ComponentName);
-    method public void setProviderIcon(android.graphics.drawable.Icon);
-    method public void setProviderName(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationProviderInfo!> CREATOR;
-  }
-
-  public final class ComplicationText implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getNextChangeTime(long);
-    method public CharSequence getTextAt(android.content.res.Resources, long);
-    method public boolean isAlwaysEmpty();
-    method public static android.support.wearable.complications.ComplicationText plainText(CharSequence);
-    method public boolean returnsSameText(long, long);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationText!> CREATOR;
-    field public static final int DIFFERENCE_STYLE_SHORT_DUAL_UNIT = 3; // 0x3
-    field public static final int DIFFERENCE_STYLE_SHORT_SINGLE_UNIT = 2; // 0x2
-    field public static final int DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT = 5; // 0x5
-    field public static final int DIFFERENCE_STYLE_STOPWATCH = 1; // 0x1
-    field public static final int DIFFERENCE_STYLE_WORDS_SINGLE_UNIT = 4; // 0x4
-    field public static final int FORMAT_STYLE_DEFAULT = 1; // 0x1
-    field public static final int FORMAT_STYLE_LOWER_CASE = 3; // 0x3
-    field public static final int FORMAT_STYLE_UPPER_CASE = 2; // 0x2
-  }
-
-  public static final class ComplicationText.TimeDifferenceBuilder {
-    ctor public ComplicationText.TimeDifferenceBuilder();
-    ctor public ComplicationText.TimeDifferenceBuilder(long, long);
-    method public android.support.wearable.complications.ComplicationText build();
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setMinimumUnit(java.util.concurrent.TimeUnit?);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setReferencePeriodEndMillis(long);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setReferencePeriodStartMillis(long);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setShowNowText(boolean);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setStyle(int);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setSurroundingText(CharSequence?);
-  }
-
-  public static final class ComplicationText.TimeFormatBuilder {
-    ctor public ComplicationText.TimeFormatBuilder();
-    method public android.support.wearable.complications.ComplicationText build();
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setFormat(String?);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setStyle(int);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setSurroundingText(CharSequence?);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setTimeZone(java.util.TimeZone?);
-  }
-
-}
-
 package androidx.wear.complications {
 
   public final class ComplicationBounds {
@@ -147,6 +8,20 @@
     property public final java.util.Map<androidx.wear.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
   }
 
+  public final class ComplicationProviderInfo {
+    ctor public ComplicationProviderInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.complications.data.ComplicationType getType();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.complications.data.ComplicationType type;
+  }
+
   public final class DefaultComplicationProviderPolicy {
     ctor public DefaultComplicationProviderPolicy();
     ctor public DefaultComplicationProviderPolicy(int systemProvider);
@@ -169,9 +44,9 @@
   }
 
   public static final class ProviderInfoRetriever.ProviderInfo {
-    method public android.support.wearable.complications.ComplicationProviderInfo? getInfo();
+    method public androidx.wear.complications.ComplicationProviderInfo? getInfo();
     method public int getWatchFaceComplicationId();
-    property public final android.support.wearable.complications.ComplicationProviderInfo? info;
+    property public final androidx.wear.complications.ComplicationProviderInfo? info;
     property public final int watchFaceComplicationId;
   }
 
@@ -179,23 +54,30 @@
     ctor public ProviderInfoRetriever.ServiceDisconnectedException();
   }
 
-  public class SystemProviders {
-    field public static final int APP_SHORTCUT = 6; // 0x6
-    field public static final int DATE = 2; // 0x2
-    field public static final int DAY_AND_DATE = 16; // 0x10
-    field public static final int DAY_OF_WEEK = 13; // 0xd
-    field public static final int FAVORITE_CONTACT = 14; // 0xe
-    field public static final int MOST_RECENT_APP = 15; // 0xf
-    field public static final int NEXT_EVENT = 9; // 0x9
+  public final class ProviderInfoRetrieverKt {
+  }
+
+  public final class SystemProviders {
+    field public static final androidx.wear.complications.SystemProviders.Companion Companion;
     field public static final int NO_PROVIDER = -1; // 0xffffffff
-    field public static final int RETAIL_CHAT = 11; // 0xb
-    field public static final int RETAIL_STEP_COUNT = 10; // 0xa
-    field public static final int STEP_COUNT = 4; // 0x4
-    field public static final int SUNRISE_SUNSET = 12; // 0xc
-    field public static final int TIME_AND_DATE = 3; // 0x3
-    field public static final int UNREAD_NOTIFICATION_COUNT = 7; // 0x7
-    field public static final int WATCH_BATTERY = 1; // 0x1
-    field public static final int WORLD_CLOCK = 5; // 0x5
+    field public static final int PROVIDER_APP_SHORTCUT = 6; // 0x6
+    field public static final int PROVIDER_DATE = 2; // 0x2
+    field public static final int PROVIDER_DAY_AND_DATE = 16; // 0x10
+    field public static final int PROVIDER_DAY_OF_WEEK = 13; // 0xd
+    field public static final int PROVIDER_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int PROVIDER_MOST_RECENT_APP = 15; // 0xf
+    field public static final int PROVIDER_NEXT_EVENT = 9; // 0x9
+    field public static final int PROVIDER_RETAIL_CHAT = 11; // 0xb
+    field public static final int PROVIDER_RETAIL_STEP_COUNT = 10; // 0xa
+    field public static final int PROVIDER_STEP_COUNT = 4; // 0x4
+    field public static final int PROVIDER_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int PROVIDER_TIME_AND_DATE = 3; // 0x3
+    field public static final int PROVIDER_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int PROVIDER_WATCH_BATTERY = 1; // 0x1
+    field public static final int PROVIDER_WORLD_CLOCK = 5; // 0x5
+  }
+
+  public static final class SystemProviders.Companion {
   }
 
 }
@@ -205,9 +87,10 @@
   public abstract sealed class ComplicationData {
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public abstract boolean isActiveAt(long dateTimeMillis);
+    method public final androidx.wear.complications.data.TimeRange getValidTimeRange();
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
+    property public final androidx.wear.complications.data.TimeRange validTimeRange;
   }
 
   public interface ComplicationText {
@@ -215,6 +98,11 @@
     method public CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
     method public boolean isAlwaysEmpty();
     method public boolean returnsSameText(long firstDateTimeMillis, long secondDateTimeMillis);
+    field public static final androidx.wear.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
   }
 
   public enum ComplicationType {
@@ -247,7 +135,6 @@
 
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -257,21 +144,17 @@
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class LongTextComplicationData.Builder {
-    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData build();
-    method public androidx.wear.complications.data.LongTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? icon);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.complications.data.SmallImage? smallImage);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -295,25 +178,20 @@
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
-    method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
 
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
@@ -321,7 +199,6 @@
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
@@ -338,25 +215,20 @@
 
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public android.graphics.drawable.Icon getPhotoImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final android.graphics.drawable.Icon photoImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class PhotoImageComplicationData.Builder {
-    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage);
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData build();
-    method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -376,24 +248,20 @@
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final float max;
     property public final float min;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class RangedValueComplicationData.Builder {
-    ctor public RangedValueComplicationData.Builder(float value, float min, float max);
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
@@ -406,20 +274,16 @@
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class ShortTextComplicationData.Builder {
-    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -444,18 +308,14 @@
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.SmallImage getSmallImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.SmallImage smallImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
-    method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -469,6 +329,7 @@
   }
 
   public final class TimeDifferenceComplicationText implements androidx.wear.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
   }
 
   public static final class TimeDifferenceComplicationText.Builder {
@@ -476,7 +337,7 @@
     ctor public TimeDifferenceComplicationText.Builder(androidx.wear.complications.data.TimeDifferenceStyle style, androidx.wear.complications.data.CountDownTimeReference countDownTimeReference);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText build();
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
-    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
   }
 
diff --git a/wear/wear-complications-data/api/public_plus_experimental_current.txt b/wear/wear-complications-data/api/public_plus_experimental_current.txt
index 8f1e849..2828788 100644
--- a/wear/wear-complications-data/api/public_plus_experimental_current.txt
+++ b/wear/wear-complications-data/api/public_plus_experimental_current.txt
@@ -1,143 +1,4 @@
 // Signature format: 4.0
-package android.support.wearable.complications {
-
-  public final class ComplicationData implements android.os.Parcelable {
-    method public int describeContents();
-    method public android.graphics.drawable.Icon? getBurnInProtectionIcon();
-    method public android.graphics.drawable.Icon? getBurnInProtectionSmallImage();
-    method public android.support.wearable.complications.ComplicationText? getContentDescription();
-    method public long getEndDateTimeMillis();
-    method public android.graphics.drawable.Icon? getIcon();
-    method public android.graphics.drawable.Icon? getLargeImage();
-    method public android.support.wearable.complications.ComplicationText? getLongText();
-    method public android.support.wearable.complications.ComplicationText? getLongTitle();
-    method public float getRangedMaxValue();
-    method public float getRangedMinValue();
-    method public float getRangedValue();
-    method public android.support.wearable.complications.ComplicationText? getShortText();
-    method public android.support.wearable.complications.ComplicationText? getShortTitle();
-    method public android.graphics.drawable.Icon? getSmallImage();
-    method public int getSmallImageStyle();
-    method public long getStartDateTimeMillis();
-    method public android.app.PendingIntent? getTapAction();
-    method public int getType();
-    method public boolean hasBurnInProtectionIcon();
-    method public boolean hasBurnInProtectionSmallImage();
-    method public boolean hasContentDescription();
-    method public boolean hasIcon();
-    method public boolean hasLargeImage();
-    method public boolean hasLongText();
-    method public boolean hasLongTitle();
-    method public boolean hasRangedMaxValue();
-    method public boolean hasRangedMinValue();
-    method public boolean hasRangedValue();
-    method public boolean hasShortText();
-    method public boolean hasShortTitle();
-    method public boolean hasSmallImage();
-    method public boolean hasTapAction();
-    method public boolean isActiveAt(long);
-    method public boolean isTimeDependent();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationData!> CREATOR;
-    field public static final int IMAGE_STYLE_ICON = 2; // 0x2
-    field public static final int IMAGE_STYLE_PHOTO = 1; // 0x1
-    field public static final int TYPE_EMPTY = 2; // 0x2
-    field public static final int TYPE_ICON = 6; // 0x6
-    field public static final int TYPE_LARGE_IMAGE = 8; // 0x8
-    field public static final int TYPE_LONG_TEXT = 4; // 0x4
-    field public static final int TYPE_NOT_CONFIGURED = 1; // 0x1
-    field public static final int TYPE_NO_DATA = 10; // 0xa
-    field public static final int TYPE_NO_PERMISSION = 9; // 0x9
-    field public static final int TYPE_RANGED_VALUE = 5; // 0x5
-    field public static final int TYPE_SHORT_TEXT = 3; // 0x3
-    field public static final int TYPE_SMALL_IMAGE = 7; // 0x7
-  }
-
-  public static final class ComplicationData.Builder {
-    ctor public ComplicationData.Builder(android.support.wearable.complications.ComplicationData);
-    ctor public ComplicationData.Builder(int);
-    method public android.support.wearable.complications.ComplicationData build();
-    method public android.support.wearable.complications.ComplicationData.Builder clearEndDateTime();
-    method public android.support.wearable.complications.ComplicationData.Builder clearStartDateTime();
-    method public android.support.wearable.complications.ComplicationData.Builder setBurnInProtectionIcon(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setBurnInProtectionSmallImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setContentDescription(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setEndDateTimeMillis(long);
-    method public android.support.wearable.complications.ComplicationData.Builder setIcon(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLargeImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLongText(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setLongTitle(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedMaxValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedMinValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setRangedValue(float);
-    method public android.support.wearable.complications.ComplicationData.Builder setShortText(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setShortTitle(android.support.wearable.complications.ComplicationText?);
-    method public android.support.wearable.complications.ComplicationData.Builder setSmallImage(android.graphics.drawable.Icon?);
-    method public android.support.wearable.complications.ComplicationData.Builder setSmallImageStyle(int);
-    method public android.support.wearable.complications.ComplicationData.Builder setStartDateTimeMillis(long);
-    method public android.support.wearable.complications.ComplicationData.Builder setTapAction(android.app.PendingIntent?);
-  }
-
-  public final class ComplicationProviderInfo implements android.os.Parcelable {
-    ctor public ComplicationProviderInfo(String, String, android.graphics.drawable.Icon, int, android.content.ComponentName);
-    ctor public ComplicationProviderInfo(android.os.Parcel);
-    method public int describeContents();
-    method public String? getAppName();
-    method public int getComplicationType();
-    method public android.content.ComponentName? getProviderComponentName();
-    method public android.graphics.drawable.Icon? getProviderIcon();
-    method public String? getProviderName();
-    method public void setAppName(String);
-    method public void setComplicationType(int);
-    method public void setProviderComponentName(android.content.ComponentName);
-    method public void setProviderIcon(android.graphics.drawable.Icon);
-    method public void setProviderName(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationProviderInfo!> CREATOR;
-  }
-
-  public final class ComplicationText implements android.os.Parcelable {
-    method public int describeContents();
-    method public long getNextChangeTime(long);
-    method public CharSequence getTextAt(android.content.res.Resources, long);
-    method public boolean isAlwaysEmpty();
-    method public static android.support.wearable.complications.ComplicationText plainText(CharSequence);
-    method public boolean returnsSameText(long, long);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationText!> CREATOR;
-    field public static final int DIFFERENCE_STYLE_SHORT_DUAL_UNIT = 3; // 0x3
-    field public static final int DIFFERENCE_STYLE_SHORT_SINGLE_UNIT = 2; // 0x2
-    field public static final int DIFFERENCE_STYLE_SHORT_WORDS_SINGLE_UNIT = 5; // 0x5
-    field public static final int DIFFERENCE_STYLE_STOPWATCH = 1; // 0x1
-    field public static final int DIFFERENCE_STYLE_WORDS_SINGLE_UNIT = 4; // 0x4
-    field public static final int FORMAT_STYLE_DEFAULT = 1; // 0x1
-    field public static final int FORMAT_STYLE_LOWER_CASE = 3; // 0x3
-    field public static final int FORMAT_STYLE_UPPER_CASE = 2; // 0x2
-  }
-
-  public static final class ComplicationText.TimeDifferenceBuilder {
-    ctor public ComplicationText.TimeDifferenceBuilder();
-    ctor public ComplicationText.TimeDifferenceBuilder(long, long);
-    method public android.support.wearable.complications.ComplicationText build();
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setMinimumUnit(java.util.concurrent.TimeUnit?);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setReferencePeriodEndMillis(long);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setReferencePeriodStartMillis(long);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setShowNowText(boolean);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setStyle(int);
-    method public android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder setSurroundingText(CharSequence?);
-  }
-
-  public static final class ComplicationText.TimeFormatBuilder {
-    ctor public ComplicationText.TimeFormatBuilder();
-    method public android.support.wearable.complications.ComplicationText build();
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setFormat(String?);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setStyle(int);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setSurroundingText(CharSequence?);
-    method public android.support.wearable.complications.ComplicationText.TimeFormatBuilder setTimeZone(java.util.TimeZone?);
-  }
-
-}
-
 package androidx.wear.complications {
 
   public final class ComplicationBounds {
@@ -147,6 +8,20 @@
     property public final java.util.Map<androidx.wear.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
   }
 
+  public final class ComplicationProviderInfo {
+    ctor public ComplicationProviderInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.complications.data.ComplicationType getType();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.complications.data.ComplicationType type;
+  }
+
   public final class DefaultComplicationProviderPolicy {
     ctor public DefaultComplicationProviderPolicy();
     ctor public DefaultComplicationProviderPolicy(int systemProvider);
@@ -169,9 +44,9 @@
   }
 
   public static final class ProviderInfoRetriever.ProviderInfo {
-    method public android.support.wearable.complications.ComplicationProviderInfo? getInfo();
+    method public androidx.wear.complications.ComplicationProviderInfo? getInfo();
     method public int getWatchFaceComplicationId();
-    property public final android.support.wearable.complications.ComplicationProviderInfo? info;
+    property public final androidx.wear.complications.ComplicationProviderInfo? info;
     property public final int watchFaceComplicationId;
   }
 
@@ -179,23 +54,30 @@
     ctor public ProviderInfoRetriever.ServiceDisconnectedException();
   }
 
-  public class SystemProviders {
-    field public static final int APP_SHORTCUT = 6; // 0x6
-    field public static final int DATE = 2; // 0x2
-    field public static final int DAY_AND_DATE = 16; // 0x10
-    field public static final int DAY_OF_WEEK = 13; // 0xd
-    field public static final int FAVORITE_CONTACT = 14; // 0xe
-    field public static final int MOST_RECENT_APP = 15; // 0xf
-    field public static final int NEXT_EVENT = 9; // 0x9
+  public final class ProviderInfoRetrieverKt {
+  }
+
+  public final class SystemProviders {
+    field public static final androidx.wear.complications.SystemProviders.Companion Companion;
     field public static final int NO_PROVIDER = -1; // 0xffffffff
-    field public static final int RETAIL_CHAT = 11; // 0xb
-    field public static final int RETAIL_STEP_COUNT = 10; // 0xa
-    field public static final int STEP_COUNT = 4; // 0x4
-    field public static final int SUNRISE_SUNSET = 12; // 0xc
-    field public static final int TIME_AND_DATE = 3; // 0x3
-    field public static final int UNREAD_NOTIFICATION_COUNT = 7; // 0x7
-    field public static final int WATCH_BATTERY = 1; // 0x1
-    field public static final int WORLD_CLOCK = 5; // 0x5
+    field public static final int PROVIDER_APP_SHORTCUT = 6; // 0x6
+    field public static final int PROVIDER_DATE = 2; // 0x2
+    field public static final int PROVIDER_DAY_AND_DATE = 16; // 0x10
+    field public static final int PROVIDER_DAY_OF_WEEK = 13; // 0xd
+    field public static final int PROVIDER_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int PROVIDER_MOST_RECENT_APP = 15; // 0xf
+    field public static final int PROVIDER_NEXT_EVENT = 9; // 0x9
+    field public static final int PROVIDER_RETAIL_CHAT = 11; // 0xb
+    field public static final int PROVIDER_RETAIL_STEP_COUNT = 10; // 0xa
+    field public static final int PROVIDER_STEP_COUNT = 4; // 0x4
+    field public static final int PROVIDER_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int PROVIDER_TIME_AND_DATE = 3; // 0x3
+    field public static final int PROVIDER_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int PROVIDER_WATCH_BATTERY = 1; // 0x1
+    field public static final int PROVIDER_WORLD_CLOCK = 5; // 0x5
+  }
+
+  public static final class SystemProviders.Companion {
   }
 
 }
@@ -205,9 +87,10 @@
   public abstract sealed class ComplicationData {
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public abstract boolean isActiveAt(long dateTimeMillis);
+    method public final androidx.wear.complications.data.TimeRange getValidTimeRange();
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
+    property public final androidx.wear.complications.data.TimeRange validTimeRange;
   }
 
   public interface ComplicationText {
@@ -215,6 +98,11 @@
     method public CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
     method public boolean isAlwaysEmpty();
     method public boolean returnsSameText(long firstDateTimeMillis, long secondDateTimeMillis);
+    field public static final androidx.wear.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
   }
 
   public enum ComplicationType {
@@ -243,38 +131,32 @@
   }
 
   public final class DataKt {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.wear.complications.data.ComplicationData toApiComplicationData(android.support.wearable.complications.ComplicationData);
   }
 
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class LongTextComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class LongTextComplicationData.Builder {
-    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData build();
-    method public androidx.wear.complications.data.LongTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? icon);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.complications.data.SmallImage? smallImage);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -296,38 +178,32 @@
   }
 
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
-    method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
 
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class NoPermissionComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
@@ -344,27 +220,22 @@
 
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public android.graphics.drawable.Icon getPhotoImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final android.graphics.drawable.Icon photoImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class PhotoImageComplicationData.Builder {
-    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage);
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData build();
-    method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -378,31 +249,27 @@
   }
 
   public final class RangedValueComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public float getMax();
     method public float getMin();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final float max;
     property public final float min;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class RangedValueComplicationData.Builder {
-    ctor public RangedValueComplicationData.Builder(float value, float min, float max);
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
@@ -411,25 +278,21 @@
   }
 
   public final class ShortTextComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class ShortTextComplicationData.Builder {
-    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -452,21 +315,17 @@
   }
 
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.SmallImage getSmallImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.SmallImage smallImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
-    method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -480,6 +339,7 @@
   }
 
   public final class TimeDifferenceComplicationText implements androidx.wear.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
   }
 
   public static final class TimeDifferenceComplicationText.Builder {
@@ -487,7 +347,7 @@
     ctor public TimeDifferenceComplicationText.Builder(androidx.wear.complications.data.TimeDifferenceStyle style, androidx.wear.complications.data.CountDownTimeReference countDownTimeReference);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText build();
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
-    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
   }
 
diff --git a/wear/wear-complications-data/api/restricted_current.txt b/wear/wear-complications-data/api/restricted_current.txt
index da29a6f..1ca52a5 100644
--- a/wear/wear-complications-data/api/restricted_current.txt
+++ b/wear/wear-complications-data/api/restricted_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package android.support.wearable.complications {
 
-  public final class ComplicationData implements android.os.Parcelable {
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ComplicationData implements android.os.Parcelable {
     method public int describeContents();
     method public android.graphics.drawable.Icon? getBurnInProtectionIcon();
     method public android.graphics.drawable.Icon? getBurnInProtectionSmallImage();
@@ -84,8 +84,8 @@
   @IntDef({android.support.wearable.complications.ComplicationData.IMAGE_STYLE_PHOTO, android.support.wearable.complications.ComplicationData.IMAGE_STYLE_ICON}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ComplicationData.ImageStyle {
   }
 
-  public final class ComplicationProviderInfo implements android.os.Parcelable {
-    ctor public ComplicationProviderInfo(String, String, android.graphics.drawable.Icon, @android.support.wearable.complications.ComplicationData.ComplicationType int, android.content.ComponentName);
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ComplicationProviderInfo implements android.os.Parcelable {
+    ctor public ComplicationProviderInfo(String, String, android.graphics.drawable.Icon, @android.support.wearable.complications.ComplicationData.ComplicationType int, android.content.ComponentName?);
     ctor public ComplicationProviderInfo(android.os.Parcel);
     method public int describeContents();
     method public String? getAppName();
@@ -102,7 +102,7 @@
     field public static final android.os.Parcelable.Creator<android.support.wearable.complications.ComplicationProviderInfo!> CREATOR;
   }
 
-  public final class ComplicationText implements android.os.Parcelable android.support.wearable.complications.TimeDependentText {
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class ComplicationText implements android.os.Parcelable android.support.wearable.complications.TimeDependentText {
     method public int describeContents();
     method public long getNextChangeTime(long);
     method public CharSequence getTextAt(android.content.res.Resources, long);
@@ -173,6 +173,23 @@
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String ACTION_REQUEST_UPDATE_ALL_ACTIVE = "android.support.wearable.complications.ACTION_REQUEST_UPDATE_ALL_ACTIVE";
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String ACTION_START_PROVIDER_CHOOSER = "android.support.wearable.complications.ACTION_START_PROVIDER_CHOOSER";
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String EXTRA_WATCH_FACE_COMPONENT = "android.support.wearable.complications.EXTRA_WATCH_FACE_COMPONENT";
+    field public static boolean skipPermissionCheck;
+    field public static boolean useTestComplicationProviderChooserActivity;
+  }
+
+  public final class ComplicationProviderInfo {
+    ctor public ComplicationProviderInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.complications.data.ComplicationType getType();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationProviderInfo toWireComplicationProviderInfo();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.complications.data.ComplicationType type;
   }
 
   public final class DefaultComplicationProviderPolicy {
@@ -210,9 +227,9 @@
   }
 
   public static final class ProviderInfoRetriever.ProviderInfo {
-    method public android.support.wearable.complications.ComplicationProviderInfo? getInfo();
+    method public androidx.wear.complications.ComplicationProviderInfo? getInfo();
     method public int getWatchFaceComplicationId();
-    property public final android.support.wearable.complications.ComplicationProviderInfo? info;
+    property public final androidx.wear.complications.ComplicationProviderInfo? info;
     property public final int watchFaceComplicationId;
   }
 
@@ -220,30 +237,38 @@
     ctor public ProviderInfoRetriever.ServiceDisconnectedException();
   }
 
+  public final class ProviderInfoRetrieverKt {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static androidx.wear.complications.ComplicationProviderInfo toApiComplicationProviderInfo(android.support.wearable.complications.ComplicationProviderInfo);
+  }
+
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ProviderUpdateRequesterConstants {
     field public static final String EXTRA_PENDING_INTENT = "android.support.wearable.complications.EXTRA_PENDING_INTENT";
   }
 
-  public class SystemProviders {
-    field public static final int APP_SHORTCUT = 6; // 0x6
-    field public static final int DATE = 2; // 0x2
-    field public static final int DAY_AND_DATE = 16; // 0x10
-    field public static final int DAY_OF_WEEK = 13; // 0xd
-    field public static final int FAVORITE_CONTACT = 14; // 0xe
-    field public static final int MOST_RECENT_APP = 15; // 0xf
-    field public static final int NEXT_EVENT = 9; // 0x9
+  public final class SystemProviders {
+    field public static final androidx.wear.complications.SystemProviders.Companion Companion;
     field public static final int NO_PROVIDER = -1; // 0xffffffff
-    field public static final int RETAIL_CHAT = 11; // 0xb
-    field public static final int RETAIL_STEP_COUNT = 10; // 0xa
-    field public static final int STEP_COUNT = 4; // 0x4
-    field public static final int SUNRISE_SUNSET = 12; // 0xc
-    field public static final int TIME_AND_DATE = 3; // 0x3
-    field public static final int UNREAD_NOTIFICATION_COUNT = 7; // 0x7
-    field public static final int WATCH_BATTERY = 1; // 0x1
-    field public static final int WORLD_CLOCK = 5; // 0x5
+    field public static final int PROVIDER_APP_SHORTCUT = 6; // 0x6
+    field public static final int PROVIDER_DATE = 2; // 0x2
+    field public static final int PROVIDER_DAY_AND_DATE = 16; // 0x10
+    field public static final int PROVIDER_DAY_OF_WEEK = 13; // 0xd
+    field public static final int PROVIDER_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int PROVIDER_MOST_RECENT_APP = 15; // 0xf
+    field public static final int PROVIDER_NEXT_EVENT = 9; // 0x9
+    field public static final int PROVIDER_RETAIL_CHAT = 11; // 0xb
+    field public static final int PROVIDER_RETAIL_STEP_COUNT = 10; // 0xa
+    field public static final int PROVIDER_STEP_COUNT = 4; // 0x4
+    field public static final int PROVIDER_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int PROVIDER_TIME_AND_DATE = 3; // 0x3
+    field public static final int PROVIDER_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int PROVIDER_WATCH_BATTERY = 1; // 0x1
+    field public static final int PROVIDER_WORLD_CLOCK = 5; // 0x5
   }
 
-  @IntDef({androidx.wear.complications.SystemProviders.NO_PROVIDER, androidx.wear.complications.SystemProviders.WATCH_BATTERY, androidx.wear.complications.SystemProviders.DATE, androidx.wear.complications.SystemProviders.TIME_AND_DATE, androidx.wear.complications.SystemProviders.STEP_COUNT, androidx.wear.complications.SystemProviders.WORLD_CLOCK, androidx.wear.complications.SystemProviders.APP_SHORTCUT, androidx.wear.complications.SystemProviders.UNREAD_NOTIFICATION_COUNT, androidx.wear.complications.SystemProviders.NEXT_EVENT, androidx.wear.complications.SystemProviders.RETAIL_STEP_COUNT, androidx.wear.complications.SystemProviders.RETAIL_CHAT, androidx.wear.complications.SystemProviders.SUNRISE_SUNSET, androidx.wear.complications.SystemProviders.DAY_OF_WEEK, androidx.wear.complications.SystemProviders.FAVORITE_CONTACT, androidx.wear.complications.SystemProviders.MOST_RECENT_APP, androidx.wear.complications.SystemProviders.DAY_AND_DATE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface SystemProviders.ProviderId {
+  public static final class SystemProviders.Companion {
+  }
+
+  @IntDef({androidx.wear.complications.SystemProviders.NO_PROVIDER, androidx.wear.complications.SystemProviders.PROVIDER_WATCH_BATTERY, androidx.wear.complications.SystemProviders.PROVIDER_DATE, androidx.wear.complications.SystemProviders.PROVIDER_TIME_AND_DATE, androidx.wear.complications.SystemProviders.PROVIDER_STEP_COUNT, androidx.wear.complications.SystemProviders.PROVIDER_WORLD_CLOCK, androidx.wear.complications.SystemProviders.PROVIDER_APP_SHORTCUT, androidx.wear.complications.SystemProviders.PROVIDER_UNREAD_NOTIFICATION_COUNT, androidx.wear.complications.SystemProviders.PROVIDER_NEXT_EVENT, androidx.wear.complications.SystemProviders.PROVIDER_RETAIL_STEP_COUNT, androidx.wear.complications.SystemProviders.PROVIDER_RETAIL_CHAT, androidx.wear.complications.SystemProviders.PROVIDER_SUNRISE_SUNSET, androidx.wear.complications.SystemProviders.PROVIDER_DAY_OF_WEEK, androidx.wear.complications.SystemProviders.PROVIDER_FAVORITE_CONTACT, androidx.wear.complications.SystemProviders.PROVIDER_MOST_RECENT_APP, androidx.wear.complications.SystemProviders.PROVIDER_DAY_AND_DATE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public static @interface SystemProviders.ProviderId {
   }
 
 }
@@ -251,11 +276,13 @@
 package androidx.wear.complications.data {
 
   public abstract sealed class ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public final android.app.PendingIntent? getTapAction();
     method public final androidx.wear.complications.data.ComplicationType getType();
-    method public abstract boolean isActiveAt(long dateTimeMillis);
+    method public final androidx.wear.complications.data.TimeRange getValidTimeRange();
     property public final android.app.PendingIntent? tapAction;
     property public final androidx.wear.complications.data.ComplicationType type;
+    property public final androidx.wear.complications.data.TimeRange validTimeRange;
   }
 
   public interface ComplicationText {
@@ -264,6 +291,11 @@
     method public boolean isAlwaysEmpty();
     method public boolean returnsSameText(long firstDateTimeMillis, long secondDateTimeMillis);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationText toWireComplicationText();
+    field public static final androidx.wear.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
   }
 
   public enum ComplicationType {
@@ -306,33 +338,28 @@
 
   public final class EmptyComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class LongTextComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.SmallImage? getSmallImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.SmallImage? smallImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class LongTextComplicationData.Builder {
-    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public LongTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData build();
-    method public androidx.wear.complications.data.LongTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? icon);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.complications.data.SmallImage? smallImage);
     method public androidx.wear.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
@@ -354,38 +381,32 @@
   }
 
   public final class MonochromaticImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage getMonochromaticImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage monochromaticImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class MonochromaticImageComplicationData.Builder {
-    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage);
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.complications.data.MonochromaticImage monochromaticImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData build();
-    method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
 
   public final class NoDataComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NoDataComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class NoPermissionComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
@@ -402,27 +423,22 @@
 
   public final class NotConfiguredComplicationData extends androidx.wear.complications.data.ComplicationData {
     ctor public NotConfiguredComplicationData();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
-    method public boolean isActiveAt(long dateTimeMillis);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public final class PhotoImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public android.graphics.drawable.Icon getPhotoImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final android.graphics.drawable.Icon photoImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class PhotoImageComplicationData.Builder {
-    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage);
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData build();
-    method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -436,31 +452,27 @@
   }
 
   public final class RangedValueComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public float getMax();
     method public float getMin();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText? getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
     method public float getValue();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final float max;
     property public final float min;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText? text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     property public final float value;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class RangedValueComplicationData.Builder {
-    ctor public RangedValueComplicationData.Builder(float value, float min, float max);
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData build();
-    method public androidx.wear.complications.data.RangedValueComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.complications.data.ComplicationText? text);
@@ -469,25 +481,21 @@
   }
 
   public final class ShortTextComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.MonochromaticImage? getMonochromaticImage();
     method public androidx.wear.complications.data.ComplicationText getText();
     method public androidx.wear.complications.data.ComplicationText? getTitle();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.MonochromaticImage? monochromaticImage;
     property public final androidx.wear.complications.data.ComplicationText text;
     property public final androidx.wear.complications.data.ComplicationText? title;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class ShortTextComplicationData.Builder {
-    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text);
+    ctor public ShortTextComplicationData.Builder(androidx.wear.complications.data.ComplicationText text, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData build();
-    method public androidx.wear.complications.data.ShortTextComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.complications.data.ComplicationText? title);
@@ -510,21 +518,17 @@
   }
 
   public final class SmallImageComplicationData extends androidx.wear.complications.data.ComplicationData {
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
     method public androidx.wear.complications.data.ComplicationText? getContentDescription();
     method public androidx.wear.complications.data.SmallImage getSmallImage();
-    method public androidx.wear.complications.data.TimeRange? getValidTimeRange();
-    method public boolean isActiveAt(long dateTimeMillis);
     property public final androidx.wear.complications.data.ComplicationText? contentDescription;
     property public final androidx.wear.complications.data.SmallImage smallImage;
-    property public final androidx.wear.complications.data.TimeRange? validTimeRange;
     field public static final androidx.wear.complications.data.ComplicationType TYPE;
   }
 
   public static final class SmallImageComplicationData.Builder {
-    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage);
+    ctor public SmallImageComplicationData.Builder(androidx.wear.complications.data.SmallImage smallImage, androidx.wear.complications.data.ComplicationText contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData build();
-    method public androidx.wear.complications.data.SmallImageComplicationData.Builder setContentDescription(androidx.wear.complications.data.ComplicationText? contentDescription);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.complications.data.TimeRange? validTimeRange);
   }
@@ -539,6 +543,7 @@
   }
 
   public final class TimeDifferenceComplicationText implements androidx.wear.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
   }
 
   public static final class TimeDifferenceComplicationText.Builder {
@@ -546,7 +551,7 @@
     ctor public TimeDifferenceComplicationText.Builder(androidx.wear.complications.data.TimeDifferenceStyle style, androidx.wear.complications.data.CountDownTimeReference countDownTimeReference);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText build();
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
-    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
     method public androidx.wear.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
   }
 
diff --git a/wear/wear-complications-data/lint-baseline.xml b/wear/wear-complications-data/lint-baseline.xml
index 7b34db2..f8bdf29 100644
--- a/wear/wear-complications-data/lint-baseline.xml
+++ b/wear/wear-complications-data/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
@@ -8,8 +8,30 @@
         errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/wear/complications/ComplicationHelperActivity.java"
-            line="58"
+            line="59"
             column="1"/>
     </issue>
 
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.wear.utility.AsyncTraceEvent is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.beginAsyncSection(traceName, traceId)"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/wear/utility/TraceEvent.kt"
+            line="64"
+            column="19"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.wear.utility.AsyncTraceEvent is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            Trace.endAsyncSection(traceName, traceId)"
+        errorLine2="                  ~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/wear/utility/TraceEvent.kt"
+            line="70"
+            column="19"/>
+    </issue>
+
 </issues>
diff --git a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
index 37fb92c7..1b3074d 100644
--- a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
+++ b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
@@ -39,7 +39,8 @@
  *
  * <p>A {@link androidx.wear.complications.ComplicationProviderService} should create instances of
  * this class using {@link ComplicationData.Builder} and send them to the complication system in
- * response to {@link androidx.wear.complications.ComplicationProviderService#onComplicationUpdate}.
+ * response to
+ * {@link androidx.wear.complications.ComplicationProviderService#onComplicationRequest}.
  * Depending on the type of complication data, some fields will be required and some will be
  * optional - see the documentation for each type, and for the builder's set methods, for details.
  *
@@ -48,8 +49,11 @@
  * <p>When rendering the complication data for a given time, the watch face should first call {@link
  * #isActiveAt} to determine whether the data is valid at that time. See the documentation for each
  * of the complication types below for details of which fields are expected to be displayed.
+ *
+ * @hide
  */
 @SuppressLint("BanParcelableUsage")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public final class ComplicationData implements Parcelable {
 
     private static final String TAG = "ComplicationData";
diff --git a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
index e127e6f..9bfe8f82 100644
--- a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
+++ b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
@@ -25,13 +25,17 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 
 /**
  * Holder of details of a complication provider, for use by watch faces (for example, to show the
  * current provider in settings). A {@link androidx.wear.complications.ProviderInfoRetriever} can be
  * used to obtain instances of this class for each of a watch face's complications.
+ *
+ * @hide
  */
 @SuppressLint("BanParcelableUsage")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public final class ComplicationProviderInfo implements Parcelable {
 
     @NonNull
@@ -58,21 +62,24 @@
     @Nullable private String mProviderName;
     @Nullable private Icon mProviderIcon;
     @ComplicationData.ComplicationType private int mComplicationType;
+    /** This field is only populate in Android R and up and it is null otherwise. */
     @Nullable private ComponentName mProviderComponentName;
 
     /**
      * Constructs a {@link ComplicationProviderInfo} with the details of a complication provider.
      *
+     * <p>The providerComponentName field is only populated from Android R and up.
+     *
      * @param appName The name of the app providing the complication
      * @param providerName The name of the complication provider within the app
      * @param providerIcon The icon for the complication provider
      * @param complicationType The type of complication provided
-     * @param providerComponentName The preview complication data
+     * @param providerComponentName The component name of the complication provider
      */
     public ComplicationProviderInfo(
             @NonNull String appName, @NonNull String providerName, @NonNull Icon providerIcon,
             @ComplicationData.ComplicationType int complicationType,
-            @NonNull ComponentName providerComponentName) {
+            @Nullable ComponentName providerComponentName) {
         this.mAppName = appName;
         this.mProviderName = providerName;
         this.mProviderIcon = providerIcon;
diff --git a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
index 61f4fbb..741972a 100644
--- a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
+++ b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/ComplicationText.java
@@ -53,8 +53,11 @@
  * one of the provided builders: {@link TimeDifferenceBuilder} or {@link TimeFormatBuilder}.
  *
  * <p>Note this class is not thread safe.</p>
+ *
+ * @hide
  */
 @SuppressLint("BanParcelableUsage")
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public final class ComplicationText implements Parcelable, TimeDependentText {
 
     /** @hide */
@@ -327,6 +330,17 @@
     }
 
     /**
+     * Returns the time-dependent part of the complication text.
+     *
+     * @hide
+     */
+    @NonNull
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public TimeDependentText getTimeDependentText() {
+        return mTimeDependentText;
+    }
+
+    /**
      * Note if this ComplicationText contains a TimeDifference text and the {@code dateTimeMillis}
      * is between {@code referencePeriodStart} and {@code referencePeriodEnd}, then the text
      * returned will be "now" (localised to the default locale).  If the time is before
diff --git a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
index c29126c..d8825db 100644
--- a/wear/wear-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
+++ b/wear/wear-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
@@ -151,7 +151,7 @@
 
     /** Returns the minimum unit specified, or {@code null} if none has been specified. */
     @Nullable
-    TimeUnit getMinimumUnit() {
+    public TimeUnit getMinimumUnit() {
         return mMinimumUnit;
     }
 
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/ComplicationHelperActivity.java b/wear/wear-complications-data/src/main/java/androidx/wear/complications/ComplicationHelperActivity.java
index a0a7b71..de5f491 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/ComplicationHelperActivity.java
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/ComplicationHelperActivity.java
@@ -54,6 +54,7 @@
  * <p>Or, to request the permission, for instance if {@link ComplicationData} of {@link
  * ComplicationData#TYPE_NO_PERMISSION TYPE_NO_PERMISSION} has been received and tapped on, use
  * {@link #createPermissionRequestHelperIntent}.
+ *
  * @hide
  */
 @TargetApi(Build.VERSION_CODES.N)
@@ -62,6 +63,20 @@
 public final class ComplicationHelperActivity extends Activity
         implements ActivityCompat.OnRequestPermissionsResultCallback {
 
+    /**
+     * Whether to invoke a specified activity instead of the system's provider chooser.
+     *
+     * To be used in tests.
+     */
+    public static boolean useTestComplicationProviderChooserActivity = false;
+
+    /**
+     * Whether to skip th permission check and directly attempt to invoke the provider chooser.
+     *
+     * To be used in tests.
+     */
+    public static boolean skipPermissionCheck = false;
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public static final String ACTION_REQUEST_UPDATE_ALL_ACTIVE =
@@ -95,9 +110,14 @@
     private static final String COMPLICATIONS_PERMISSION_PRIVILEGED =
             "com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA_PRIVILEGED";
 
-    @Nullable private ComponentName mWatchFace;
+    @Nullable
+    private ComponentName mWatchFace;
     private int mWfComplicationId;
-    @Nullable @ComplicationData.ComplicationType private int[] mTypes;
+    @Nullable
+    private Bundle mAdditionalExtras;
+    @Nullable
+    @ComplicationData.ComplicationType
+    private int[] mTypes;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -115,12 +135,13 @@
                 mWfComplicationId =
                         intent.getIntExtra(ProviderChooserIntent.EXTRA_COMPLICATION_ID, 0);
                 mTypes = intent.getIntArrayExtra(ProviderChooserIntent.EXTRA_SUPPORTED_TYPES);
+                mAdditionalExtras = getAdditionalExtras(intent);
                 if (checkPermission()) {
                     startProviderChooser();
                 } else {
                     ActivityCompat.requestPermissions(
                             this,
-                            new String[] {COMPLICATIONS_PERMISSION},
+                            new String[]{COMPLICATIONS_PERMISSION},
                             PERMISSION_REQUEST_CODE_PROVIDER_CHOOSER);
                 }
                 break;
@@ -133,7 +154,7 @@
                 } else {
                     ActivityCompat.requestPermissions(
                             this,
-                            new String[] {COMPLICATIONS_PERMISSION},
+                            new String[]{COMPLICATIONS_PERMISSION},
                             PERMISSION_REQUEST_CODE_REQUEST_ONLY);
                 }
                 break;
@@ -171,9 +192,10 @@
 
     private boolean checkPermission() {
         return ActivityCompat.checkSelfPermission(this, COMPLICATIONS_PERMISSION_PRIVILEGED)
-                        == PackageManager.PERMISSION_GRANTED
+                == PackageManager.PERMISSION_GRANTED
                 || ActivityCompat.checkSelfPermission(this, COMPLICATIONS_PERMISSION)
-                        == PackageManager.PERMISSION_GRANTED;
+                == PackageManager.PERMISSION_GRANTED
+                || skipPermissionCheck;
     }
 
     /**
@@ -204,15 +226,18 @@
      *
      * <p>From android R onwards this API can only be called during an editing session.
      *
-     * @param context context for the current app, that must contain a ComplicationHelperActivity
-     * @param watchFace the ComponentName of the WatchFaceService being configured.
+     * @param context                 context for the current app, that must contain a
+     *                                ComplicationHelperActivity
+     * @param watchFace               the ComponentName of the WatchFaceService being configured.
      * @param watchFaceComplicationId the watch face's id for the complication being configured.
-     *     This must match the id passed in when the watch face calls
-     *     WatchFaceService.Engine#setActiveComplications.
-     * @param supportedTypes the types supported by the complication, in decreasing order of
-     *     preference. If a provider can supply data for more than one of these types, the type
-     *     chosen will be whichever was specified first.
-     * @param watchFaceInstanceId The ID of the watchface being edited.
+     *                                This must match the id passed in when the watch face calls
+     *                                WatchFaceService.Engine#setActiveComplications.
+     * @param supportedTypes          the types supported by the complication, in decreasing
+     *                                order of
+     *                                preference. If a provider can supply data for more than one
+     *                                of these types, the type
+     *                                chosen will be whichever was specified first.
+     * @param watchFaceInstanceId     The ID of the watchface being edited.
      */
     @NonNull
     public static Intent createProviderChooserHelperIntent(
@@ -253,7 +278,7 @@
      * watch face will be triggered. The provided {@code watchFace} must match the current watch
      * face for this to occur.
      *
-     * @param context context for the current app, that must contain a ComplicationHelperActivity
+     * @param context   context for the current app, that must contain a ComplicationHelperActivity
      * @param watchFace the ComponentName of the WatchFaceService for the current watch face
      */
     @NonNull
@@ -266,10 +291,22 @@
     }
 
     private void startProviderChooser() {
-        startActivityForResult(
+        Intent intent =
                 ProviderChooserIntent.createProviderChooserIntent(
-                        mWatchFace, mWfComplicationId, mTypes),
-                START_REQUEST_CODE_PROVIDER_CHOOSER);
+                        mWatchFace, mWfComplicationId, mTypes);
+        // Add the extras that were provided to the ComplicationHelperActivity. This is done by
+        // first taking the additional extras and adding to that anything that was set in the
+        // chooser intent, and setting them back on the intent itself to avoid the additional
+        // extras being able to override anything that was set by the chooser intent.
+        Bundle extras = new Bundle(mAdditionalExtras);
+        extras.putAll(intent.getExtras());
+        intent.replaceExtras(extras);
+        if (useTestComplicationProviderChooserActivity) {
+            intent.setComponent(new ComponentName(
+                    "androidx.wear.watchface.editor.test",
+                    "androidx.wear.watchface.editor.TestComplicationProviderChooserActivity"));
+        }
+        startActivityForResult(intent, START_REQUEST_CODE_PROVIDER_CHOOSER);
     }
 
     /** Requests that the system update all active complications on the watch face. */
@@ -283,4 +320,17 @@
                 PendingIntent.getActivity(this, 0, new Intent(""), 0));
         sendBroadcast(intent);
     }
+
+    /**
+     * Returns any extras that were not handled by the activity itself.
+     *
+     * <p>These will be forwarded to the chooser activity.
+     */
+    private Bundle getAdditionalExtras(Intent intent) {
+        Bundle extras = intent.getExtras();
+        extras.remove(ProviderChooserIntent.EXTRA_WATCH_FACE_COMPONENT_NAME);
+        extras.remove(ProviderChooserIntent.EXTRA_COMPLICATION_ID);
+        extras.remove(ProviderChooserIntent.EXTRA_SUPPORTED_TYPES);
+        return extras;
+    }
 }
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/DefaultComplicationProviderPolicy.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/DefaultComplicationProviderPolicy.kt
index 81e61f9..1ab0bb6 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/DefaultComplicationProviderPolicy.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/DefaultComplicationProviderPolicy.kt
@@ -18,6 +18,7 @@
 
 import android.content.ComponentName
 import androidx.annotation.RestrictTo
+import androidx.wear.complications.SystemProviders.ProviderId
 import java.util.ArrayList
 
 /**
@@ -37,14 +38,14 @@
     public val secondaryProvider: ComponentName?
 
     /** Fallback in case none of the non-system providers could be used. */
-    @SystemProviders.ProviderId
+    @ProviderId
     public val systemProviderFallback: Int
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public constructor(
         providers: List<ComponentName>,
-        @SystemProviders.ProviderId systemProviderFallback: Int
+        @ProviderId systemProviderFallback: Int
     ) {
         this.primaryProvider = if (providers.isNotEmpty()) providers[0] else null
         this.secondaryProvider = if (providers.size >= 2) providers[1] else null
@@ -61,7 +62,7 @@
     /**
      * Uses systemProvider as the default complication provider.
      */
-    public constructor(@SystemProviders.ProviderId systemProvider: Int) {
+    public constructor(@ProviderId systemProvider: Int) {
         primaryProvider = null
         secondaryProvider = null
         systemProviderFallback = systemProvider
@@ -73,7 +74,7 @@
      */
     public constructor(
         provider: ComponentName,
-        @SystemProviders.ProviderId systemProviderFallback: Int
+        @ProviderId systemProviderFallback: Int
     ) {
         primaryProvider = provider
         secondaryProvider = null
@@ -88,7 +89,7 @@
     public constructor(
         primaryProvider: ComponentName,
         secondaryProvider: ComponentName,
-        @SystemProviders.ProviderId systemProviderFallback: Int
+        @ProviderId systemProviderFallback: Int
     ) {
         this.primaryProvider = primaryProvider
         this.secondaryProvider = secondaryProvider
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/ProviderInfoRetriever.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/ProviderInfoRetriever.kt
index 73e00cb..c70dcfd 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/ProviderInfoRetriever.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/ProviderInfoRetriever.kt
@@ -20,35 +20,42 @@
 import android.content.Context
 import android.content.Intent
 import android.content.ServiceConnection
+import android.graphics.drawable.Icon
 import android.os.Build
 import android.os.IBinder
-import android.support.wearable.complications.ComplicationProviderInfo
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.annotation.VisibleForTesting
+import androidx.wear.complications.ProviderInfoRetriever.ProviderInfo
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
+import androidx.wear.complications.data.ComplicationType.Companion.fromWireType
 import androidx.wear.complications.data.toApiComplicationData
 import androidx.wear.utility.TraceEvent
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
 import kotlin.coroutines.resumeWithException
+
+private typealias WireComplicationProviderInfo =
+    android.support.wearable.complications.ComplicationProviderInfo
+
 /**
  * Retrieves [ComplicationProviderInfo] for a watch face's complications.
  *
  *
- * To use construct an instance and call [.retrieveProviderInfo] which returns a [ ].
+ * To use construct an instance and call [retrieveProviderInfo] which returns an array of
+ * [ProviderInfo] objects.
  *
  *
- * Further calls to [.retrieveProviderInfo] may be made using the same instance of this
- * class, but [.close] must be called when it is no longer needed. Once release has been
+ * Further calls to [retrieveProviderInfo] may be made using the same instance of this
+ * class, but [close] must be called when it is no longer needed. Once release has been
  * called, further retrieval attempts will fail.
  */
 public class ProviderInfoRetriever : AutoCloseable {
-    /** Results for [.retrieveProviderInfo]. */
+    /** Results for [retrieveProviderInfo]. */
     public class ProviderInfo internal constructor(
         /** The id for the complication, as provided to [retrieveProviderInfo].  */
         public val watchFaceComplicationId: Int,
@@ -131,7 +138,7 @@
         awaitDeferredService().getProviderInfos(
             watchFaceComponent, watchFaceComplicationIds
         )?.mapIndexed { index, info ->
-            ProviderInfo(watchFaceComplicationIds[index], info)
+            ProviderInfo(watchFaceComplicationIds[index], info?.toApiComplicationProviderInfo())
         }?.toTypedArray()
     }
 
@@ -202,7 +209,7 @@
      * be called when the retriever is no longer needed.
      *
      *
-     * Any outstanding or subsequent futures returned by [.retrieveProviderInfo] will
+     * Any outstanding or subsequent futures returned by [retrieveProviderInfo] will
      * resolve with null.
      *
      * This class implements the Java `AutoClosable` interface and
@@ -220,3 +227,58 @@
             "android.support.wearable.complications.ACTION_GET_COMPLICATION_CONFIG"
     }
 }
+
+/**
+ * Holder of details of a complication provider, for use by watch faces (for example,
+ * to show the current provider in settings). A [ProviderInfoRetriever] can be used to obtain
+ * references of this class for each of a watch face's complications.
+ */
+public class ComplicationProviderInfo(
+    /** The name of the application containing the complication provider. */
+    public val appName: String,
+
+    /** The name of the complication provider. */
+    public val name: String,
+
+    /** The icon for the complication provider. */
+    public val icon: Icon,
+
+    /** The type of the complication provided by the provider. */
+    public val type: ComplicationType,
+
+    /**
+     * The provider's {@link ComponentName}.
+     *
+     * This field is populated only on Android R and above and it is `null` otherwise.
+     */
+    public val componentName: ComponentName?,
+) {
+    init {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            require(componentName != null) {
+                "ComponentName is required on Android R and above"
+            }
+        }
+    }
+    /**
+     * Converts this value to [WireComplicationProviderInfo] object used for serialization.
+     *
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun toWireComplicationProviderInfo(): WireComplicationProviderInfo =
+        WireComplicationProviderInfo(
+            appName, name, icon, type.toWireComplicationType(),
+            componentName
+        )
+}
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public fun WireComplicationProviderInfo.toApiComplicationProviderInfo(): ComplicationProviderInfo =
+    ComplicationProviderInfo(
+        appName!!, providerName!!, providerIcon!!, fromWireType(complicationType),
+        providerComponentName
+    )
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.java b/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.java
deleted file mode 100644
index aea58a8..0000000
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.complications;
-
-import android.support.wearable.complications.ComplicationData;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.RestrictTo;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Methods to retrieve the component names for system complication providers. This will allow these
- * providers to be used as defaults by watch faces.
- */
-public class SystemProviders {
-
-    private SystemProviders() {}
-
-    /**
-     * System provider id as defined in {@link SystemProviders}.
-     *
-     * @hide
-     */
-    @IntDef({
-        NO_PROVIDER,
-        WATCH_BATTERY,
-        DATE,
-        TIME_AND_DATE,
-        STEP_COUNT,
-        WORLD_CLOCK,
-        APP_SHORTCUT,
-        UNREAD_NOTIFICATION_COUNT,
-        NEXT_EVENT,
-        RETAIL_STEP_COUNT,
-        RETAIL_CHAT,
-        SUNRISE_SUNSET,
-        DAY_OF_WEEK,
-        FAVORITE_CONTACT,
-        MOST_RECENT_APP,
-        DAY_AND_DATE
-    })
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ProviderId {}
-
-    /** Specifies that no provider should be used. */
-    public static final int NO_PROVIDER = -1;
-
-    /**
-     * Id for the 'watch battery' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports the following types: {@link ComplicationData#TYPE_ICON TYPE_ICON},
-     * {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}, {@link
-     * ComplicationData#TYPE_LONG_TEXT TYPE_LONG_TEXT}, {@link ComplicationData#TYPE_RANGED_VALUE
-     * TYPE_RANGED_VALUE}.
-     */
-    public static final int WATCH_BATTERY = 1;
-
-    /**
-     * Id for the 'date' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int DATE = 2;
-
-    /**
-     * Id for the 'time and date' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int TIME_AND_DATE = 3;
-
-    /**
-     * Id for the 'step count' complication provider.
-     *
-     * <p>This is a safe provider (because it only shows a daily total), so if a watch face uses
-     * this as a default it will be able to receive data from it even before the
-     * RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int STEP_COUNT = 4;
-
-    /**
-     * Id for the 'world clock' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int WORLD_CLOCK = 5;
-
-    /**
-     * Id for the 'app shortcut' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports the following types: {@link ComplicationData#TYPE_SMALL_IMAGE
-     * TYPE_SMALL_IMAGE}, {@link ComplicationData#TYPE_LONG_TEXT TYPE_LONG_TEXT}.
-     */
-    public static final int APP_SHORTCUT = 6;
-
-    /**
-     * Id for the 'unread notification count' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports the following types: {@link ComplicationData#TYPE_ICON TYPE_ICON},
-     * {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int UNREAD_NOTIFICATION_COUNT = 7;
-
-    /**
-     * Id for the 'next event' complication provider.
-     *
-     * <p>This is not a safe provider, so if a watch face uses this as a default it will receive
-     * data of TYPE_NO_PERMISSION until the user has granted the RECEIVE_COMPLICATION_DATA.
-     *
-     * <p>This provider supports the following types: {@link ComplicationData#TYPE_SHORT_TEXT
-     * TYPE_SHORT_TEXT}, {@link ComplicationData#TYPE_LONG_TEXT TYPE_LONG_TEXT}.
-     */
-    public static final int NEXT_EVENT = 9;
-
-    /**
-     * Id for the 'retail mode step count' complication provider.
-     *
-     * <p>This provider shows fake step count data, and the tap action launches the retail mode
-     * health app. This provider should only be set as a default if the device is in retail mode.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int RETAIL_STEP_COUNT = 10;
-
-    /**
-     * Id for the 'retail mode chat' complication provider.
-     *
-     * <p>This provider shows fake 'unread chat messages' data, and the tap action launches the
-     * retail mode chat app. This provider should only be set as a default if the device is in
-     * retail mode.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int RETAIL_CHAT = 11;
-
-    /**
-     * Id for the 'sunrise sunset' complication provider.
-     *
-     * <p>This provider shows next sunrise or sunset time according to current timezone and
-     * location.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int SUNRISE_SUNSET = 12;
-
-    /**
-     * Id for the 'day of week' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int DAY_OF_WEEK = 13;
-
-    /**
-     * Id for the 'favorite contact' complication provider.
-     *
-     * <p>This is not a safe provider, so if a watch face uses this as a default it will receive
-     * data of TYPE_NO_PERMISSION until the user has granted the RECEIVE_COMPLICATION_DATA.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SMALL_IMAGE TYPE_SMALL_IMAGE}.
-     */
-    public static final int FAVORITE_CONTACT = 14;
-
-    /**
-     * Id for the 'most recent app' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports {@link ComplicationData#TYPE_SMALL_IMAGE TYPE_SMALL_IMAGE}, {@link
-     * ComplicationData#TYPE_LONG_TEXT TYPE_LONG_TEXT}.
-     */
-    public static final int MOST_RECENT_APP = 15;
-
-    /**
-     * Id for the 'day and date' complication provider.
-     *
-     * <p>This is a safe provider, so if a watch face uses this as a default it will be able to
-     * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been granted.
-     *
-     * <p>This provider supports only {@link ComplicationData#TYPE_SHORT_TEXT TYPE_SHORT_TEXT}.
-     */
-    public static final int DAY_AND_DATE = 16;
-}
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.kt
new file mode 100644
index 0000000..839ca39
--- /dev/null
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/SystemProviders.kt
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.complications
+
+import androidx.annotation.IntDef
+import androidx.annotation.RestrictTo
+import androidx.wear.complications.data.ComplicationType
+
+/**
+ * Methods to retrieve the component names for system complication providers. This will allow these
+ * providers to be used as defaults by watch faces.
+ */
+public class SystemProviders private constructor() {
+    public companion object {
+        /** Specifies that no provider should be used.  */
+        public const val NO_PROVIDER: Int = -1
+
+        /**
+         * Id for the 'watch battery' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports the following types: [ComplicationType.MONOCHROMATIC_IMAGE],
+         * [ComplicationType.SHORT_TEXT], [ComplicationType.LONG_TEXT],
+         * [ComplicationType.RANGED_VALUE].
+         */
+        public const val PROVIDER_WATCH_BATTERY: Int = 1
+
+        /**
+         * Id for the 'date' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_DATE: Int = 2
+
+        /**
+         * Id for the 'time and date' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_TIME_AND_DATE: Int = 3
+
+        /**
+         * Id for the 'step count' complication provider.
+         *
+         * This is a safe provider (because it only shows a daily total), so if a watch face uses
+         * this as a default it will be able to receive data from it even before the
+         * RECEIVE_COMPLICATION_DATA permission has been granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_STEP_COUNT: Int = 4
+
+        /**
+         * Id for the 'world clock' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_WORLD_CLOCK: Int = 5
+
+        /**
+         * Id for the 'app shortcut' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports the following types: [ComplicationType.SMALL_IMAGE],
+         * [ComplicationType.LONG_TEXT].
+         */
+        public const val PROVIDER_APP_SHORTCUT: Int = 6
+
+        /**
+         * Id for the 'unread notification count' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports the following types: [ComplicationType.MONOCHROMATIC_IMAGE],
+         * [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_UNREAD_NOTIFICATION_COUNT: Int = 7
+
+        /**
+         * Id for the 'next event' complication provider.
+         *
+         * This is not a safe provider, so if a watch face uses this as a default it will receive
+         * data of TYPE_NO_PERMISSION until the user has granted the RECEIVE_COMPLICATION_DATA.
+         *
+         * This provider supports the following types: [ComplicationType.SHORT_TEXT],
+         * [ComplicationType.LONG_TEXT].
+         */
+        public const val PROVIDER_NEXT_EVENT: Int = 9
+
+        /**
+         * Id for the 'retail mode step count' complication provider.
+         *
+         * This provider shows fake step count data, and the tap action launches the retail mode
+         * health app. This provider should only be set as a default if the device is in retail
+         * mode.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_RETAIL_STEP_COUNT: Int = 10
+
+        /**
+         * Id for the 'retail mode chat' complication provider.
+         *
+         * This provider shows fake 'unread chat messages' data, and the tap action launches the
+         * retail mode chat app. This provider should only be set as a default if the device is in
+         * retail mode.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_RETAIL_CHAT: Int = 11
+
+        /**
+         * Id for the 'sunrise sunset' complication provider.
+         *
+         * This provider shows next sunrise or sunset time according to current timezone and
+         * location.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_SUNRISE_SUNSET: Int = 12
+
+        /**
+         * Id for the 'day of week' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_DAY_OF_WEEK: Int = 13
+
+        /**
+         * Id for the 'favorite contact' complication provider.
+         *
+         * This is not a safe provider, so if a watch face uses this as a default it will receive
+         * data of TYPE_NO_PERMISSION until the user has granted the RECEIVE_COMPLICATION_DATA.
+         *
+         * This provider supports only [ComplicationType.SMALL_IMAGE].
+         */
+        public const val PROVIDER_FAVORITE_CONTACT: Int = 14
+
+        /**
+         * Id for the 'most recent app' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports [ComplicationType.SMALL_IMAGE], [ComplicationType.LONG_TEXT].
+         */
+        public const val PROVIDER_MOST_RECENT_APP: Int = 15
+
+        /**
+         * Id for the 'day and date' complication provider.
+         *
+         * This is a safe provider, so if a watch face uses this as a default it will be able to
+         * receive data from it even before the RECEIVE_COMPLICATION_DATA permission has been
+         * granted.
+         *
+         * This provider supports only [ComplicationType.SHORT_TEXT].
+         */
+        public const val PROVIDER_DAY_AND_DATE: Int = 16
+    }
+
+    /**
+     * System provider id as defined in [SystemProviders].
+     *
+     * @hide
+     */
+    @IntDef(
+        NO_PROVIDER,
+        PROVIDER_WATCH_BATTERY,
+        PROVIDER_DATE,
+        PROVIDER_TIME_AND_DATE,
+        PROVIDER_STEP_COUNT,
+        PROVIDER_WORLD_CLOCK,
+        PROVIDER_APP_SHORTCUT,
+        PROVIDER_UNREAD_NOTIFICATION_COUNT,
+        PROVIDER_NEXT_EVENT,
+        PROVIDER_RETAIL_STEP_COUNT,
+        PROVIDER_RETAIL_CHAT,
+        PROVIDER_SUNRISE_SUNSET,
+        PROVIDER_DAY_OF_WEEK,
+        PROVIDER_FAVORITE_CONTACT,
+        PROVIDER_MOST_RECENT_APP,
+        PROVIDER_DAY_AND_DATE
+    )
+    @RestrictTo(
+        RestrictTo.Scope.LIBRARY_GROUP
+    )
+    @Retention(AnnotationRetention.SOURCE)
+    public annotation class ProviderId
+}
\ No newline at end of file
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
index 14a7de5..dcb126f 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Data.kt
@@ -19,6 +19,7 @@
 import android.app.PendingIntent
 import android.graphics.drawable.Icon
 import androidx.annotation.RestrictTo
+import androidx.wear.complications.ComplicationHelperActivity
 
 /** The wire format for [ComplicationData]. */
 internal typealias WireComplicationData = android.support.wearable.complications.ComplicationData
@@ -31,7 +32,14 @@
 public sealed class ComplicationData constructor(
     public val type: ComplicationType,
     public val tapAction: PendingIntent?,
-    internal var cachedWireComplicationData: WireComplicationData?
+    internal var cachedWireComplicationData: WireComplicationData?,
+    /**
+     * Describes when the complication should be displayed.
+     *
+     * Whether the complication is active and should be displayed at the given time should be
+     * checked with [TimeRange.contains].
+     */
+    public val validTimeRange: TimeRange = TimeRange.ALWAYS
 ) {
     /**
      * Converts this value to [WireComplicationData] object used for serialization.
@@ -40,17 +48,9 @@
      *
      * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public abstract fun asWireComplicationData(): WireComplicationData
 
-    /**
-     * Returns true if the complication is active and should be displayed at the given time. If this
-     * returns false, the complication should not be displayed.
-     *
-     * This must be checked for any time for which the complication will be displayed.
-     */
-    public abstract fun isActiveAt(dateTimeMillis: Long): Boolean
-
     internal fun createWireComplicationDataBuilder(): WireComplicationDataBuilder =
         cachedWireComplicationData?.let {
             WireComplicationDataBuilder(it)
@@ -63,10 +63,8 @@
  * leave the slot empty.
  */
 public class NoDataComplicationData : ComplicationData(TYPE, null, null) {
-    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
-
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
 
     /** @hide */
@@ -83,10 +81,8 @@
  * this type.
  */
 public class EmptyComplicationData : ComplicationData(TYPE, null, null) {
-    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
-
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
 
     /** @hide */
@@ -104,10 +100,8 @@
  * of this type.
  */
 public class NotConfiguredComplicationData : ComplicationData(TYPE, null, null) {
-    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
-
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData = asPlainWireComplicationData(type)
 
     /** @hide */
@@ -132,24 +126,24 @@
     public val monochromaticImage: MonochromaticImage?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [ShortTextComplicationData].
      *
-     * You must at a minimum set the [text].
+     * You must at a minimum set the [text] and [contentDescription] fields.
      */
-    public class Builder(private val text: ComplicationText) {
+    public class Builder(
+        private val text: ComplicationText,
+        private var contentDescription: ComplicationText
+    ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var title: ComplicationText? = null
         private var monochromaticImage: MonochromaticImage? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -158,6 +152,7 @@
         }
 
         /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
         public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
             this.validTimeRange = validTimeRange
         }
@@ -172,11 +167,6 @@
             this.monochromaticImage = monochromaticImage
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -197,12 +187,17 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             setShortText(text.toWireComplicationText())
             setShortTitle(title?.toWireComplicationText())
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             monochromaticImage?.addToWireComplicationData(this)
             setTapAction(tapAction)
             setValidTimeRange(validTimeRange, this)
@@ -233,25 +228,25 @@
     public val smallImage: SmallImage?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [LongTextComplicationData].
      *
-     * You must at a minimum set the [text].
+     * You must at a minimum set the [text] and [contentDescription] fields.
      */
-    public class Builder(private val text: ComplicationText) {
+    public class Builder(
+        private val text: ComplicationText,
+        private var contentDescription: ComplicationText
+    ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var title: ComplicationText? = null
         private var monochromaticImage: MonochromaticImage? = null
         private var smallImage: SmallImage? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -260,6 +255,7 @@
         }
 
         /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
         public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
             this.validTimeRange = validTimeRange
         }
@@ -279,11 +275,6 @@
             this.smallImage = smallImage
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -305,7 +296,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             setLongText(text.toWireComplicationText())
@@ -313,7 +304,12 @@
             monochromaticImage?.addToWireComplicationData(this)
             smallImage?.addToWireComplicationData(this)
             setTapAction(tapAction)
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
 
@@ -344,29 +340,27 @@
     public val text: ComplicationText?,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [RangedValueComplicationData].
      *
-     * You must at a minimum set the [value], [min], and [max] fields.
+     * You must at a minimum set the [value], [min], [max] and [contentDescription] fields.
      */
     public class Builder(
         private val value: Float,
         private val min: Float,
-        private val max: Float
+        private val max: Float,
+        private var contentDescription: ComplicationText
     ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
         private var monochromaticImage: MonochromaticImage? = null
         private var title: ComplicationText? = null
         private var text: ComplicationText? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -375,6 +369,7 @@
         }
 
         /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
         public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
             this.validTimeRange = validTimeRange
         }
@@ -394,11 +389,6 @@
             this.text = text
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -422,7 +412,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             setRangedValue(value)
@@ -432,7 +422,12 @@
             setShortText(text?.toWireComplicationText())
             setShortTitle(title?.toWireComplicationText())
             setTapAction(tapAction)
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
 
@@ -458,22 +453,22 @@
     public val monochromaticImage: MonochromaticImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [MonochromaticImageComplicationData].
      *
-     * You must at a minimum set the [monochromaticImage] field.
+     * You must at a minimum set the [monochromaticImage] and [contentDescription] fields.
      */
-    public class Builder(private val monochromaticImage: MonochromaticImage) {
+    public class Builder(
+        private val monochromaticImage: MonochromaticImage,
+        private val contentDescription: ComplicationText
+    ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -482,15 +477,11 @@
         }
 
         /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
         public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
             this.validTimeRange = validTimeRange
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -508,11 +499,17 @@
             )
     }
 
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             monochromaticImage.addToWireComplicationData(this)
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             setTapAction(tapAction)
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
@@ -539,22 +536,22 @@
     public val smallImage: SmallImage,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [SmallImageComplicationData].
      *
-     * You must at a minimum set the [smallImage] field.
+     * You must at a minimum set the [smallImage] and [contentDescription] fields.
      */
-    public class Builder(private val smallImage: SmallImage) {
+    public class Builder(
+        private val smallImage: SmallImage,
+        private val contentDescription: ComplicationText
+    ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -563,15 +560,11 @@
         }
 
         /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
         public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
             this.validTimeRange = validTimeRange
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -589,11 +582,17 @@
             )
     }
 
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             smallImage.addToWireComplicationData(this)
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             setTapAction(tapAction)
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
@@ -624,22 +623,22 @@
     public val photoImage: Icon,
     public val contentDescription: ComplicationText?,
     tapAction: PendingIntent?,
-    public val validTimeRange: TimeRange?,
+    validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?
-) : ComplicationData(TYPE, tapAction, cachedWireComplicationData) {
-
-    public override fun isActiveAt(dateTimeMillis: Long): Boolean =
-        validTimeRange?.contains(dateTimeMillis) ?: true
-
+) : ComplicationData(
+    TYPE, tapAction, cachedWireComplicationData, validTimeRange ?: TimeRange.ALWAYS
+) {
     /**
      * Builder for [PhotoImageComplicationData].
      *
-     * You must at a minimum set the [photoImage] field.
+     * You must at a minimum set the [photoImage] and [contentDescription] fields.
      */
-    public class Builder(private val photoImage: Icon) {
+    public class Builder(
+        private val photoImage: Icon,
+        private val contentDescription: ComplicationText
+    ) {
         private var tapAction: PendingIntent? = null
         private var validTimeRange: TimeRange? = null
-        private var contentDescription: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
 
         /** Sets optional pending intent to be invoked when the complication is tapped. */
@@ -654,11 +653,6 @@
             this.validTimeRange = validTimeRange
         }
 
-        /** Sets optional content description associated with the complication data. */
-        public fun setContentDescription(contentDescription: ComplicationText?): Builder = apply {
-            this.contentDescription = contentDescription
-        }
-
         internal fun setCachedWireComplicationData(
             cachedWireComplicationData: WireComplicationData?
         ): Builder = apply {
@@ -676,11 +670,17 @@
             )
     }
 
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             setLargeImage(photoImage)
-            setContentDescription(contentDescription?.toWireComplicationText())
+            setContentDescription(
+                when (contentDescription) {
+                    ComplicationText.EMPTY -> null
+                    else -> contentDescription?.toWireComplicationText()
+                }
+            )
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
 
@@ -708,9 +708,6 @@
     public val monochromaticImage: MonochromaticImage?,
     cachedWireComplicationData: WireComplicationData?
 ) : ComplicationData(TYPE, null, cachedWireComplicationData) {
-
-    override fun isActiveAt(dateTimeMillis: Long): Boolean = true
-
     /**
      * Builder for [NoPermissionComplicationData].
      *
@@ -754,7 +751,7 @@
     }
 
     /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun asWireComplicationData(): WireComplicationData =
         createWireComplicationDataBuilder().apply {
             setShortText(text?.toWireComplicationText())
@@ -770,6 +767,9 @@
     }
 }
 
+/**
+ * @hide
+ */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public fun WireComplicationData.toApiComplicationData(): ComplicationData {
     val wireComplicationData = this
@@ -782,60 +782,71 @@
             NotConfiguredComplicationData()
 
         ShortTextComplicationData.TYPE.toWireComplicationType() ->
-            ShortTextComplicationData.Builder(shortText!!.toApiComplicationText()).apply {
+            ShortTextComplicationData.Builder(
+                shortText!!.toApiComplicationText(),
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setTitle(shortTitle?.toApiComplicationText())
                 setMonochromaticImage(parseIcon())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
         LongTextComplicationData.TYPE.toWireComplicationType() ->
-            LongTextComplicationData.Builder(longText!!.toApiComplicationText()).apply {
+            LongTextComplicationData.Builder(
+                longText!!.toApiComplicationText(),
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setTitle(longTitle?.toApiComplicationText())
                 setMonochromaticImage(parseIcon())
                 setSmallImage(parseSmallImage())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
         RangedValueComplicationData.TYPE.toWireComplicationType() ->
             RangedValueComplicationData.Builder(
                 value = rangedValue, min = rangedMinValue,
-                max = rangedMaxValue
+                max = rangedMaxValue,
+                contentDescription =
+                    contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
             ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setMonochromaticImage(parseIcon())
                 setTitle(shortTitle?.toApiComplicationText())
                 setText(shortText?.toApiComplicationText())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
         MonochromaticImageComplicationData.TYPE.toWireComplicationType() ->
-            MonochromaticImageComplicationData.Builder(parseIcon()!!).apply {
+            MonochromaticImageComplicationData.Builder(
+                parseIcon()!!,
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
         SmallImageComplicationData.TYPE.toWireComplicationType() ->
-            SmallImageComplicationData.Builder(parseSmallImage()!!).apply {
+            SmallImageComplicationData.Builder(
+                parseSmallImage()!!,
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
                 setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
         PhotoImageComplicationData.TYPE.toWireComplicationType() ->
-            PhotoImageComplicationData.Builder(largeImage!!).apply {
+            PhotoImageComplicationData.Builder(
+                largeImage!!,
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
                 setValidTimeRange(parseTimeRange())
-                setContentDescription(contentDescription?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
 
diff --git a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Text.kt b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Text.kt
index fd88d45..cbce229 100644
--- a/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Text.kt
+++ b/wear/wear-complications-data/src/main/java/androidx/wear/complications/data/Text.kt
@@ -18,6 +18,16 @@
 
 import android.content.res.Resources
 import android.icu.util.TimeZone
+import android.support.wearable.complications.TimeDependentText
+import android.support.wearable.complications.TimeDifferenceText
+import android.text.style.ForegroundColorSpan
+import android.text.style.LocaleSpan
+import android.text.style.StrikethroughSpan
+import android.text.style.StyleSpan
+import android.text.style.SubscriptSpan
+import android.text.style.SuperscriptSpan
+import android.text.style.TypefaceSpan
+import android.text.style.UnderlineSpan
 import androidx.annotation.RestrictTo
 import java.util.concurrent.TimeUnit
 
@@ -66,12 +76,23 @@
     public fun isAlwaysEmpty(): Boolean
 
     /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.SUBCLASSES)
+    public fun getTimeDependentText(): TimeDependentText
+
+    /**
      * Converts this value to [WireComplicationText] object used for serialization.
      *
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public fun toWireComplicationText(): WireComplicationText
+
+    public companion object {
+        @JvmField
+        public val EMPTY: ComplicationText = PlainComplicationText.Builder("").build()
+    }
 }
 
 /** A [ComplicationText] that contains plain text. */
@@ -89,7 +110,7 @@
     }
 }
 
-/** The styling used for showing a time different by [ComplicationText.timeDifferenceBuilder]. */
+/** The styling used for showing a time different by [ComplicationText#TimeDifferenceBuilder]. */
 public enum class TimeDifferenceStyle(internal var wireStyle: Int) {
 
     /**
@@ -189,6 +210,15 @@
     delegate: WireComplicationText
 ) : ComplicationText by DelegatingComplicationText(delegate) {
     /**
+     * Gets the smallest unit that may be shown in the time difference text. If specified, units
+     * smaller than this minimum will not be included.
+     */
+    public fun getMinimumTimeUnit(): TimeUnit? =
+        if (getTimeDependentText() is TimeDifferenceText)
+            (getTimeDependentText() as TimeDifferenceText).minimumUnit
+        else null
+
+    /**
      * Builder for [ComplicationText] representing a time difference.
      *
      * Requires setting a [TimeDifferenceStyle].
@@ -202,11 +232,25 @@
         private var displayAsNow: Boolean? = null
         private var minimumUnit: TimeUnit? = null
 
+        /**
+         * Constructs a [TimeDifferenceComplicationText.Builder] where the complication is counting
+         * up until [countUpTimeReference].
+         *
+         * @param style The [TimeDifferenceStyle] to use when rendering the time difference.
+         * @param countUpTimeReference The [CountUpTimeReference] to count up until.
+         */
         public constructor(
             style: TimeDifferenceStyle,
             countUpTimeReference: CountUpTimeReference
         ) : this(style, null, countUpTimeReference.dateTimeMillis)
 
+        /**
+         * Constructs a [TimeDifferenceComplicationText.Builder] where the complication is counting
+         * down until [countDownTimeReference].
+         *
+         * @param style The [TimeDifferenceStyle] to use when rendering the time difference.
+         * @param countDownTimeReference The [CountDownTimeReference] to count down until.
+         */
         public constructor(
             style: TimeDifferenceStyle,
             countDownTimeReference: CountDownTimeReference
@@ -252,7 +296,7 @@
          * [TimeDifferenceStyle.SHORT_SINGLE_UNIT], then a minimum unit of [TimeUnit.SECONDS] will
          * have no effect.
          */
-        public fun setMinimumUnit(minimumUnit: TimeUnit?): Builder =
+        public fun setMinimumTimeUnit(minimumUnit: TimeUnit?): Builder =
             apply { this.minimumUnit = minimumUnit }
 
         /** Builds a [TimeDifferenceComplicationText]. */
@@ -350,6 +394,7 @@
         delegate.getNextChangeTime(fromDateTimeMillis)
 
     override fun isAlwaysEmpty() = delegate.isAlwaysEmpty
+    override fun getTimeDependentText(): TimeDependentText = delegate.timeDependentText
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -379,6 +424,8 @@
 
     override fun isAlwaysEmpty() = false
 
+    override fun getTimeDependentText(): TimeDependentText = delegate
+
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     override fun toWireComplicationText(): WireComplicationText {
diff --git a/wear/wear-complications-data/src/main/res/values-iw/complication_strings.xml b/wear/wear-complications-data/src/main/res/values-iw/complication_strings.xml
index 06416d9..324c874 100644
--- a/wear/wear-complications-data/src/main/res/values-iw/complication_strings.xml
+++ b/wear/wear-complications-data/src/main/res/values-iw/complication_strings.xml
@@ -31,13 +31,13 @@
       <item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
       <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
-      <item quantity="one">שעה <xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g></item>
+      <item quantity="one">שעה (<xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>)‏</item>
     </plurals>
     <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
       <item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
       <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
       <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
-      <item quantity="one">דקה <xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g></item>
+      <item quantity="one">דקה (<xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>‏)</item>
     </plurals>
     <string name="time_difference_now" msgid="1141173224250945412">"עכשיו"</string>
 </resources>
diff --git a/wear/wear-complications-data/src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt b/wear/wear-complications-data/src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt
index 94803bb..3170b0b 100644
--- a/wear/wear-complications-data/src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt
+++ b/wear/wear-complications-data/src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt
@@ -18,11 +18,13 @@
 
 import android.content.ComponentName
 import android.content.Context
+import android.graphics.drawable.Icon
 import android.os.IBinder
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.complications.data.ComplicationData
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.PlainComplicationText
@@ -30,8 +32,8 @@
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.eq
 import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.eq
 import org.mockito.Mockito
 import org.mockito.Mockito.doAnswer
 
@@ -58,7 +60,7 @@
     private val providerInfoRetriever = ProviderInfoRetriever(mockService)
 
     @Test
-    public fun requestPreviewComplicationData() {
+    public fun retrievePreviewComplicationData() {
         runBlocking {
             val component = ComponentName("provider.package", "provider.class")
             val type = ComplicationType.LONG_TEXT
@@ -66,7 +68,8 @@
             Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
 
             val testData: ComplicationData = LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("Test Text").build()
+                PlainComplicationText.Builder("Test Text").build(),
+                ComplicationText.EMPTY
             ).build()
 
             doAnswer {
@@ -91,7 +94,7 @@
     }
 
     @Test
-    public fun requestPreviewComplicationDataProviderReturnsNull() {
+    public fun retrievePreviewComplicationDataProviderReturnsNull() {
         runBlocking {
             val component = ComponentName("provider.package", "provider.class")
             val type = ComplicationType.LONG_TEXT
@@ -114,7 +117,7 @@
     }
 
     @Test
-    public fun requestPreviewComplicationDataApiNotSupported() {
+    public fun retrievePreviewComplicationDataApiNotSupported() {
         runBlocking {
             val component = ComponentName("provider.package", "provider.class")
             val type = ComplicationType.LONG_TEXT
@@ -127,7 +130,7 @@
     }
 
     @Test
-    public fun requestPreviewComplicationDataApiReturnsFalse() {
+    public fun retrievePreviewComplicationDataApiReturnsFalse() {
         runBlocking {
             val component = ComponentName("provider.package", "provider.class")
             val type = ComplicationType.LONG_TEXT
@@ -145,4 +148,16 @@
                 .isNull()
         }
     }
+
+    @Test
+    public fun complicationProviderInfo_NullComponentName() {
+        val complicationProviderInfo = ComplicationProviderInfo(
+            "appName",
+            "name",
+            Icon.createWithContentUri("icon"),
+            ComplicationType.SHORT_TEXT,
+            componentName = null
+        )
+        assertThat(complicationProviderInfo.componentName).isNull()
+    }
 }
\ No newline at end of file
diff --git a/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/DataTest.kt b/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/DataTest.kt
index 7495485..b5db646 100644
--- a/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/DataTest.kt
+++ b/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/DataTest.kt
@@ -60,9 +60,11 @@
 
     @Test
     public fun shortTextComplicationData() {
-        val data = ShortTextComplicationData.Builder("text".complicationText)
+        val data = ShortTextComplicationData.Builder(
+            "text".complicationText,
+            "content description".complicationText
+        )
             .setTitle("title".complicationText)
-            .setContentDescription("content description".complicationText)
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -77,9 +79,11 @@
 
     @Test
     public fun longTextComplicationData() {
-        val data = LongTextComplicationData.Builder("text".complicationText)
+        val data = LongTextComplicationData.Builder(
+            "text".complicationText,
+            "content description".complicationText
+        )
             .setTitle("title".complicationText)
-            .setContentDescription("content description".complicationText)
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -94,9 +98,11 @@
 
     @Test
     public fun rangedValueComplicationData() {
-        val data = RangedValueComplicationData.Builder(value = 95f, min = 0f, max = 100f)
+        val data = RangedValueComplicationData.Builder(
+            value = 95f, min = 0f, max = 100f,
+            contentDescription = "content description".complicationText
+        )
             .setTitle("battery".complicationText)
-            .setContentDescription("content description".complicationText)
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -115,8 +121,9 @@
     public fun monochromaticImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
-        val data = MonochromaticImageComplicationData.Builder(image)
-            .setContentDescription("content description".complicationText).build()
+        val data = MonochromaticImageComplicationData.Builder(
+            image, "content description".complicationText
+        ).build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationDataBuilder(WireComplicationData.TYPE_ICON)
@@ -131,8 +138,9 @@
     public fun smallImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
-        val data = SmallImageComplicationData.Builder(image)
-            .setContentDescription("content description".complicationText).build()
+        val data = SmallImageComplicationData.Builder(
+            image, "content description".complicationText
+        ).build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationDataBuilder(WireComplicationData.TYPE_SMALL_IMAGE)
@@ -147,9 +155,9 @@
     @Test
     public fun backgroundImageComplicationData() {
         val photoImage = Icon.createWithContentUri("someuri")
-        val data = PhotoImageComplicationData.Builder(photoImage)
-            .setContentDescription("content description".complicationText)
-            .build()
+        val data = PhotoImageComplicationData.Builder(
+            photoImage, "content description".complicationText
+        ).build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
                 WireComplicationDataBuilder(WireComplicationData.TYPE_LARGE_IMAGE)
@@ -312,7 +320,7 @@
     @Test
     public fun shortTextComplicationData() {
         assertThat(
-            ShortTextComplicationData.Builder("text".complicationText)
+            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
                 .setTapAction(mPendingIntent)
                 .build().asWireComplicationData().tapAction
         ).isEqualTo(mPendingIntent)
@@ -321,7 +329,7 @@
     @Test
     public fun longTextComplicationData() {
         assertThat(
-            LongTextComplicationData.Builder("text".complicationText)
+            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
                 .setTapAction(mPendingIntent)
                 .build().asWireComplicationData().tapAction
         ).isEqualTo(mPendingIntent)
@@ -330,7 +338,10 @@
     @Test
     public fun rangedValueComplicationData() {
         assertThat(
-            RangedValueComplicationData.Builder(value = 95f, min = 0f, max = 100f)
+            RangedValueComplicationData.Builder(
+                value = 95f, min = 0f, max = 100f,
+                contentDescription = ComplicationText.EMPTY
+            )
                 .setTapAction(mPendingIntent)
                 .build().asWireComplicationData().tapAction
         ).isEqualTo(mPendingIntent)
@@ -341,7 +352,7 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
         assertThat(
-            MonochromaticImageComplicationData.Builder(image)
+            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
                 .setTapAction(mPendingIntent)
                 .build()
                 .asWireComplicationData()
@@ -354,7 +365,8 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         assertThat(
-            SmallImageComplicationData.Builder(image).setTapAction(mPendingIntent).build()
+            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent).build()
                 .asWireComplicationData()
                 .tapAction
         ).isEqualTo(mPendingIntent)
@@ -365,7 +377,8 @@
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         assertThat(
-            SmallImageComplicationData.Builder(image).setTapAction(mPendingIntent).build()
+            SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent).build()
                 .asWireComplicationData()
                 .tapAction
         ).isEqualTo(mPendingIntent)
@@ -379,7 +392,9 @@
 
     @Test
     public fun shortTextComplicationData() {
-        val data = ShortTextComplicationData.Builder("text".complicationText)
+        val data = ShortTextComplicationData.Builder(
+            "text".complicationText, ComplicationText.EMPTY
+        )
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -394,7 +409,7 @@
 
     @Test
     public fun longTextComplicationData() {
-        val data = LongTextComplicationData.Builder("text".complicationText)
+        val data = LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -409,7 +424,10 @@
 
     @Test
     public fun rangedValueComplicationData() {
-        val data = RangedValueComplicationData.Builder(value = 95f, min = 0f, max = 100f)
+        val data = RangedValueComplicationData.Builder(
+            value = 95f, min = 0f, max = 100f,
+            contentDescription = ComplicationText.EMPTY
+        )
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -428,7 +446,7 @@
     public fun monochromaticImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = MonochromaticImage.Builder(icon).build()
-        val data = MonochromaticImageComplicationData.Builder(image)
+        val data = MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -445,7 +463,7 @@
     public fun smallImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
-        val data = SmallImageComplicationData.Builder(image)
+        val data = SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -462,7 +480,7 @@
     @Test
     public fun photoImageComplicationData() {
         val photoImage = Icon.createWithContentUri("someuri")
-        val data = PhotoImageComplicationData.Builder(photoImage)
+        val data = PhotoImageComplicationData.Builder(photoImage, ComplicationText.EMPTY)
             .setValidTimeRange(TimeRange.between(testStartDateTimeMillis, testEndDateTimeMillis))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
diff --git a/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/TextTest.kt b/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/TextTest.kt
index 7d3843c..048b391 100644
--- a/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/TextTest.kt
+++ b/wear/wear-complications-data/src/test/java/androidx/wear/complications/data/TextTest.kt
@@ -18,10 +18,13 @@
 
 import android.content.Context
 import android.icu.util.TimeZone
+import android.support.wearable.complications.ComplicationText
+import android.support.wearable.complications.TimeFormatText
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.complications.ParcelableSubject
 import androidx.wear.complications.SharedRobolectricTestRunner
 import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertNull
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.time.Instant
@@ -53,7 +56,7 @@
         )
             .setText("^1 after lunch")
             .setDisplayAsNow(false)
-            .setMinimumUnit(TimeUnit.SECONDS)
+            .setMinimumTimeUnit(TimeUnit.SECONDS)
             .build()
 
         ParcelableSubject.assertThat(text.toWireComplicationText())
@@ -82,7 +85,7 @@
         )
             .setText("^1 before lunch")
             .setDisplayAsNow(false)
-            .setMinimumUnit(TimeUnit.SECONDS)
+            .setMinimumTimeUnit(TimeUnit.SECONDS)
             .build()
 
         ParcelableSubject.assertThat(text.toWireComplicationText())
@@ -184,6 +187,45 @@
         assertThat(text.returnsSameText(dateTimeMillis, dateTimeMillis + 60.seconds)).isFalse()
     }
 
+    @Test
+    public fun testGetMinimumTimeUnit_WithValidTimeDependentTextObject() {
+        val minimumTimeUnit = TimeUnit.SECONDS
+
+        val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()
+        val text = TimeDifferenceComplicationText.Builder(
+            TimeDifferenceStyle.STOPWATCH,
+            CountUpTimeReference(referenceMillis)
+        )
+            .setMinimumTimeUnit(minimumTimeUnit)
+            .build()
+
+        assertThat(minimumTimeUnit).isEqualTo(text.getMinimumTimeUnit())
+    }
+
+    @Test
+    public fun testGetMinimumTimeUnit_WithoutTimeDependentTextObject() {
+        val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()
+        val text = TimeDifferenceComplicationText.Builder(
+            TimeDifferenceStyle.STOPWATCH,
+            CountUpTimeReference(referenceMillis)
+        )
+            .build()
+
+        assertNull(text.getMinimumTimeUnit())
+    }
+
+    @Test
+    public fun testGetMinimumTimeUnit_WithWrongTimeDependentTextObject() {
+        val tft = TimeFormatText(
+            "E 'in' LLL",
+            ComplicationText.FORMAT_STYLE_DEFAULT,
+            null
+        )
+        val text = TimeDifferenceComplicationText(ComplicationText("test", tft))
+
+        assertNull(text.getMinimumTimeUnit())
+    }
+
     private fun getResource() = ApplicationProvider.getApplicationContext<Context>().resources
 }
 
diff --git a/wear/wear-complications-provider/api/current.txt b/wear/wear-complications-provider/api/current.txt
index 2273217..7c28524 100644
--- a/wear/wear-complications-provider/api/current.txt
+++ b/wear/wear-complications-provider/api/current.txt
@@ -3,13 +3,14 @@
 
   public abstract class ComplicationProviderService extends android.app.Service {
     ctor public ComplicationProviderService();
-    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType);
-    method public final android.os.IBinder? onBind(android.content.Intent);
-    method @UiThread public void onComplicationActivated(int, int);
-    method @UiThread public void onComplicationDeactivated(int);
-    method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateListener);
+    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationId, androidx.wear.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.complications.ComplicationRequest request, androidx.wear.complications.ComplicationProviderService.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_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.complications.ComplicationProviderService.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_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
@@ -19,14 +20,29 @@
     field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
   }
 
-  public static interface ComplicationProviderService.ComplicationUpdateListener {
-    method public void onUpdateComplication(androidx.wear.complications.data.ComplicationData?) throws android.os.RemoteException;
+  public static final class ComplicationProviderService.Companion {
   }
 
-  public class ProviderUpdateRequester {
-    ctor public ProviderUpdateRequester(android.content.Context, android.content.ComponentName);
-    method public void requestUpdate(int...);
+  public static interface ComplicationProviderService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationId, androidx.wear.complications.data.ComplicationType complicationType);
+    method public int getComplicationId();
+    method public androidx.wear.complications.data.ComplicationType getComplicationType();
+    property public final int complicationId;
+    property public final androidx.wear.complications.data.ComplicationType complicationType;
+  }
+
+  public final class ProviderUpdateRequester {
+    ctor public ProviderUpdateRequester(android.content.Context context, android.content.ComponentName providerComponent);
+    method public void requestUpdate(int... complicationIds);
     method public void requestUpdateAll();
+    field public static final androidx.wear.complications.ProviderUpdateRequester.Companion Companion;
+  }
+
+  public static final class ProviderUpdateRequester.Companion {
   }
 
 }
diff --git a/wear/wear-complications-provider/api/public_plus_experimental_current.txt b/wear/wear-complications-provider/api/public_plus_experimental_current.txt
index 2273217..7c28524 100644
--- a/wear/wear-complications-provider/api/public_plus_experimental_current.txt
+++ b/wear/wear-complications-provider/api/public_plus_experimental_current.txt
@@ -3,13 +3,14 @@
 
   public abstract class ComplicationProviderService extends android.app.Service {
     ctor public ComplicationProviderService();
-    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType);
-    method public final android.os.IBinder? onBind(android.content.Intent);
-    method @UiThread public void onComplicationActivated(int, int);
-    method @UiThread public void onComplicationDeactivated(int);
-    method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateListener);
+    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationId, androidx.wear.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.complications.ComplicationRequest request, androidx.wear.complications.ComplicationProviderService.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_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.complications.ComplicationProviderService.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_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
@@ -19,14 +20,29 @@
     field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
   }
 
-  public static interface ComplicationProviderService.ComplicationUpdateListener {
-    method public void onUpdateComplication(androidx.wear.complications.data.ComplicationData?) throws android.os.RemoteException;
+  public static final class ComplicationProviderService.Companion {
   }
 
-  public class ProviderUpdateRequester {
-    ctor public ProviderUpdateRequester(android.content.Context, android.content.ComponentName);
-    method public void requestUpdate(int...);
+  public static interface ComplicationProviderService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationId, androidx.wear.complications.data.ComplicationType complicationType);
+    method public int getComplicationId();
+    method public androidx.wear.complications.data.ComplicationType getComplicationType();
+    property public final int complicationId;
+    property public final androidx.wear.complications.data.ComplicationType complicationType;
+  }
+
+  public final class ProviderUpdateRequester {
+    ctor public ProviderUpdateRequester(android.content.Context context, android.content.ComponentName providerComponent);
+    method public void requestUpdate(int... complicationIds);
     method public void requestUpdateAll();
+    field public static final androidx.wear.complications.ProviderUpdateRequester.Companion Companion;
+  }
+
+  public static final class ProviderUpdateRequester.Companion {
   }
 
 }
diff --git a/wear/wear-complications-provider/api/restricted_current.txt b/wear/wear-complications-provider/api/restricted_current.txt
index 0d4e30b..cfde453 100644
--- a/wear/wear-complications-provider/api/restricted_current.txt
+++ b/wear/wear-complications-provider/api/restricted_current.txt
@@ -3,13 +3,14 @@
 
   public abstract class ComplicationProviderService extends android.app.Service {
     ctor public ComplicationProviderService();
-    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType);
-    method public final android.os.IBinder? onBind(android.content.Intent);
-    method @UiThread public void onComplicationActivated(int, int);
-    method @UiThread public void onComplicationDeactivated(int);
-    method @UiThread public abstract void onComplicationUpdate(int, androidx.wear.complications.data.ComplicationType, androidx.wear.complications.ComplicationProviderService.ComplicationUpdateListener);
+    method public abstract androidx.wear.complications.data.ComplicationData? getPreviewData(androidx.wear.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationId, androidx.wear.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.complications.ComplicationRequest request, androidx.wear.complications.ComplicationProviderService.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_PROVIDER_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.complications.ComplicationProviderService.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_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
@@ -19,19 +20,34 @@
     field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
   }
 
-  public static interface ComplicationProviderService.ComplicationUpdateListener {
-    method public void onUpdateComplication(androidx.wear.complications.data.ComplicationData?) throws android.os.RemoteException;
+  public static final class ComplicationProviderService.Companion {
   }
 
-  public class ProviderUpdateRequester {
-    ctor public ProviderUpdateRequester(android.content.Context, android.content.ComponentName);
-    method public void requestUpdate(int...);
+  public static interface ComplicationProviderService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationId, androidx.wear.complications.data.ComplicationType complicationType);
+    method public int getComplicationId();
+    method public androidx.wear.complications.data.ComplicationType getComplicationType();
+    property public final int complicationId;
+    property public final androidx.wear.complications.data.ComplicationType complicationType;
+  }
+
+  public final class ProviderUpdateRequester {
+    ctor public ProviderUpdateRequester(android.content.Context context, android.content.ComponentName providerComponent);
+    method public void requestUpdate(int... complicationIds);
     method public void requestUpdateAll();
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String ACTION_REQUEST_UPDATE = "android.support.wearable.complications.ACTION_REQUEST_UPDATE";
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String ACTION_REQUEST_UPDATE_ALL = "android.support.wearable.complications.ACTION_REQUEST_UPDATE_ALL";
+    field public static final androidx.wear.complications.ProviderUpdateRequester.Companion Companion;
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String EXTRA_COMPLICATION_IDS = "android.support.wearable.complications.EXTRA_COMPLICATION_IDS";
     field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final String EXTRA_PROVIDER_COMPONENT = "android.support.wearable.complications.EXTRA_PROVIDER_COMPONENT";
   }
 
+  public static final class ProviderUpdateRequester.Companion {
+  }
+
 }
 
diff --git a/wear/wear-complications-provider/lint-baseline.xml b/wear/wear-complications-provider/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-complications-provider/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-complications-provider/samples/lint-baseline.xml b/wear/wear-complications-provider/samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-complications-provider/samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/AsynchronousProviderService.kt b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/AsynchronousProviderService.kt
index 7eb4ca5..e7f5cf2 100644
--- a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/AsynchronousProviderService.kt
+++ b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/AsynchronousProviderService.kt
@@ -21,6 +21,8 @@
 import android.text.Spanned
 import android.text.style.ForegroundColorSpan
 import androidx.wear.complications.ComplicationProviderService
+import androidx.wear.complications.ComplicationRequest
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.ShortTextComplicationData
@@ -30,21 +32,23 @@
 class AsynchronousProviderService : ComplicationProviderService() {
     val executor = Executors.newFixedThreadPool(5)
 
-    override fun onComplicationUpdate(
-        complicationId: Int,
-        type: ComplicationType,
-        listener: ComplicationUpdateListener
+    override fun onComplicationRequest(
+        request: ComplicationRequest,
+        listener: ComplicationRequestListener
     ) {
         executor.execute {
-            listener.onUpdateComplication(
-                when (type) {
+            listener.onComplicationData(
+                when (request.complicationType) {
                     ComplicationType.SHORT_TEXT ->
-                        ShortTextComplicationData.Builder(plainText("# $complicationId")).build()
+                        ShortTextComplicationData.Builder(
+                            plainText("# $request.complicationId"),
+                            ComplicationText.EMPTY
+                        ).build()
 
                     ComplicationType.LONG_TEXT ->
                         LongTextComplicationData.Builder(
                             plainText(
-                                SpannableString("hello $complicationId").apply {
+                                SpannableString("hello $request.complicationId").apply {
                                     setSpan(
                                         ForegroundColorSpan(Color.RED),
                                         0,
@@ -52,7 +56,8 @@
                                         Spanned.SPAN_INCLUSIVE_INCLUSIVE
                                     )
                                 }
-                            )
+                            ),
+                            ComplicationText.EMPTY
                         ).build()
 
                     else -> null
@@ -63,7 +68,10 @@
 
     override fun getPreviewData(type: ComplicationType) = when (type) {
         ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(plainText("# 123")).build()
+            ShortTextComplicationData.Builder(
+                plainText("# 123"),
+                ComplicationText.EMPTY
+            ).build()
 
         ComplicationType.LONG_TEXT ->
             LongTextComplicationData.Builder(
@@ -76,7 +84,8 @@
                             Spanned.SPAN_INCLUSIVE_INCLUSIVE
                         )
                     }
-                )
+                ),
+                ComplicationText.EMPTY
             ).build()
 
         else
diff --git a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/BackgroundProviderService.kt b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/BackgroundProviderService.kt
index 3e7488145c..adb09a1 100644
--- a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/BackgroundProviderService.kt
+++ b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/BackgroundProviderService.kt
@@ -20,7 +20,9 @@
 import android.os.Handler
 import android.os.Looper
 import androidx.wear.complications.ComplicationProviderService
+import androidx.wear.complications.ComplicationRequest
 import androidx.wear.complications.ProviderUpdateRequester
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.ShortTextComplicationData
@@ -44,7 +46,7 @@
         }
     }
 
-    override fun onComplicationActivated(complicationId: Int, type: Int) {
+    override fun onComplicationActivated(complicationId: Int, type: ComplicationType) {
         // Start requesting background updates.
         backgroundUpdate()
     }
@@ -55,18 +57,23 @@
         handler.postDelayed(this::backgroundUpdate, UPDATE_CADEANCE_MS)
     }
 
-    override fun onComplicationUpdate(
-        complicationId: Int,
-        type: ComplicationType,
-        listener: ComplicationUpdateListener
+    override fun onComplicationRequest(
+        request: ComplicationRequest,
+        listener: ComplicationRequestListener
     ) {
-        listener.onUpdateComplication(
-            when (type) {
+        listener.onComplicationData(
+            when (request.complicationType) {
                 ComplicationType.SHORT_TEXT ->
-                    ShortTextComplicationData.Builder(plainText("# $counter")).build()
+                    ShortTextComplicationData.Builder(
+                        plainText("# $counter"),
+                        ComplicationText.EMPTY
+                    ).build()
 
                 ComplicationType.LONG_TEXT ->
-                    LongTextComplicationData.Builder(plainText("Count $counter")).build()
+                    LongTextComplicationData.Builder(
+                        plainText("Count $counter"),
+                        ComplicationText.EMPTY
+                    ).build()
 
                 else -> null
             }
@@ -75,10 +82,16 @@
 
     override fun getPreviewData(type: ComplicationType) = when (type) {
         ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(plainText("# 123")).build()
+            ShortTextComplicationData.Builder(
+                plainText("# 123"),
+                ComplicationText.EMPTY
+            ).build()
 
         ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(plainText("Count 123")).build()
+            LongTextComplicationData.Builder(
+                plainText("Count 123"),
+                ComplicationText.EMPTY
+            ).build()
 
         else -> null
     }
diff --git a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/SynchronousProviderService.kt b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/SynchronousProviderService.kt
index c1ebad7..cce780f 100644
--- a/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/SynchronousProviderService.kt
+++ b/wear/wear-complications-provider/samples/src/main/java/androidx/wear/complications/provider/samples/SynchronousProviderService.kt
@@ -17,6 +17,8 @@
 package androidx.wear.complications.provider.samples
 
 import androidx.wear.complications.ComplicationProviderService
+import androidx.wear.complications.ComplicationRequest
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.ShortTextComplicationData
@@ -24,18 +26,23 @@
 /** A minimal complication provider which reports the ID of the complication immediately. */
 class SynchronousProviderService : ComplicationProviderService() {
 
-    override fun onComplicationUpdate(
-        complicationId: Int,
-        type: ComplicationType,
-        listener: ComplicationUpdateListener
+    override fun onComplicationRequest(
+        request: ComplicationRequest,
+        listener: ComplicationRequestListener
     ) {
-        listener.onUpdateComplication(
-            when (type) {
+        listener.onComplicationData(
+            when (request.complicationType) {
                 ComplicationType.SHORT_TEXT ->
-                    ShortTextComplicationData.Builder(plainText("# $complicationId")).build()
+                    ShortTextComplicationData.Builder(
+                        plainText("# $request.complicationId"),
+                        ComplicationText.EMPTY
+                    ).build()
 
                 ComplicationType.LONG_TEXT ->
-                    LongTextComplicationData.Builder(plainText("hello $complicationId")).build()
+                    LongTextComplicationData.Builder(
+                        plainText("hello $request.complicationId"),
+                        ComplicationText.EMPTY
+                    ).build()
 
                 else -> null
             }
@@ -44,10 +51,16 @@
 
     override fun getPreviewData(type: ComplicationType) = when (type) {
         ComplicationType.SHORT_TEXT ->
-            ShortTextComplicationData.Builder(plainText("# 123")).build()
+            ShortTextComplicationData.Builder(
+                plainText("# 123"),
+                ComplicationText.EMPTY
+            ).build()
 
         ComplicationType.LONG_TEXT ->
-            LongTextComplicationData.Builder(plainText("hello 123")).build()
+            LongTextComplicationData.Builder(
+                plainText("hello 123"),
+                ComplicationText.EMPTY
+            ).build()
 
         else -> null
     }
diff --git a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java
deleted file mode 100644
index a7e5463..0000000
--- a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.complications;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.support.wearable.complications.ComplicationProviderInfo;
-import android.support.wearable.complications.IComplicationManager;
-import android.support.wearable.complications.IComplicationProvider;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.UiThread;
-import androidx.wear.complications.data.ComplicationData;
-import androidx.wear.complications.data.ComplicationType;
-
-/**
- * Class for providers of complication data.
- *
- * <p>A provider service must implement {@link #onComplicationUpdate} to respond to requests for
- * updates from the complication system.
- *
- * <p>Manifest requirements:
- * <ul>
- * <il>The manifest declaration of this service must include an intent filter for
- * android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST.</il>
- *
- * <il>A ComplicationProviderService must include a {@code meta-data} tag with
- * android.support.wearable.complications.SUPPORTED_TYPES in its manifest entry. The value of
- * this tag should be a comma separated list of types supported by
- * the provider. Types should be given as named as per the type fields in the {@link
- * ComplicationData}, but omitting the "TYPE_" prefix, e.g. {@code SHORT_TEXT}, {@code
- * LONG_TEXT}, {@code RANGED_VALUE}.
- *
- * <p>The order in which types are listed has no significance. In the case where a watch face
- * supports multiple types in a single complication slot, the watch face will determine which
- * types it prefers.
- *
- * <p>For example, a provider that supports the RANGED_VALUE, SHORT_TEXT, and ICON types would
- * include the following in its manifest entry:
- *
- * <pre class="prettyprint">
- * &lt;meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES"
- *         android:value="RANGED_VALUE,SHORT_TEXT,ICON"/&gt;</pre>
- * </il>
- *
- * <il>A ComplicationProviderService should include a {@code meta-data} tag with
- * android.support.wearable.complications.UPDATE_PERIOD_SECONDS its manifest entry. The value of
- * this tag is the number of seconds the provider would like to elapse between update requests.
- *
- * <p>Note that update requests are not guaranteed to be sent with this frequency.
- *
- * <p>If a provider never needs to receive update requests beyond the one sent when a
- * complication is activated, the value of this tag should be 0.
- *
- * <p>For example, a provider that would like to update every ten minutes should include the
- * following in its manifest entry:
- *
- * <pre class="prettyprint">
- * &lt;meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
- *         android:value="600"/&gt;</pre>
- * </il>
- *
- * <il>A ComplicationProviderService can include a {@code meta-data} tag with
- * android.support.wearable.complications.PROVIDER_CONFIG_ACTION its manifest entry to cause a
- * configuration activity to be shown when the provider is selected.
- *
- * <p>The configuration activity must reside in the same package as the provider, and must
- * register an intent filter for the action specified here, including
- * android.support.wearable.complications.category.PROVIDER_CONFIG as well as
- * {@link Intent#CATEGORY_DEFAULT} as categories.
- *
- * <p>The complication id being configured will be included in the intent that starts the config
- * activity using the extra key android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID.
- *
- * <p>The complication type that will be requested from the provider will also be included,
- * using the extra key android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE.
- *
- * <p>The provider's {@link ComponentName} will also be included in the intent that starts the
- * config activity, using the extra key
- * android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT.
- *
- * <p>The config activity must call {@link Activity#setResult} with either {@link
- * Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} before it is finished, to tell the
- * system whether or not the provider should be set on the given complication.</il>
- *
- * <il>The manifest entry for the service should also include an android:icon attribute. The icon
- * provided there should be a single-color white icon that represents the provider. This icon will
- * be shown in the provider chooser interface, and may also be included in {@link
- * ComplicationProviderInfo} given to watch faces for display in their configuration activities.
- * </il>
- *
- * <il>The manifest entry should also include {@code
- * android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"} to ensure
- * that only the system can bind to it.</il>
- * </ul>
- *
- * <p> Multiple providers in the same APK are supported but in android R there's a soft limit of
- * 100 providers per APK. Above that the companion watchface editor won't support this provider app.
- */
-public abstract class ComplicationProviderService extends Service {
-
-    /**
-     * The intent action used to send update requests to the provider. Complication provider
-     * services must declare an intent filter for this action in the manifest.
-     */
-    @SuppressWarnings("ActionValue")
-    public static final String ACTION_COMPLICATION_UPDATE_REQUEST =
-            "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
-
-    /**
-     * Metadata key used to declare supported complication types.
-     *
-     * <p>A ComplicationProviderService must include a {@code meta-data} tag with this name in its
-     * manifest entry. The value of this tag should be a comma separated list of types supported by
-     * the provider. Types should be given as named as per the type fields in the {@link
-     * ComplicationData}, but omitting the "TYPE_" prefix, e.g. {@code SHORT_TEXT},
-     * {@code LONG_TEXT}, {@code RANGED_VALUE}.
-     *
-     * <p>The order in which types are listed has no significance. In the case where a watch face
-     * supports multiple types in a single complication slot, the watch face will determine which
-     * types it prefers.
-     *
-     * <p>For example, a provider that supports the RANGED_VALUE, SHORT_TEXT, and ICON types would
-     * include the following in its manifest entry:
-     *
-     * <pre class="prettyprint">
-     * &lt;meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES"
-     *         android:value="RANGED_VALUE,SHORT_TEXT,ICON"/&gt;</pre>
-     */
-    public static final String METADATA_KEY_SUPPORTED_TYPES =
-            "android.support.wearable.complications.SUPPORTED_TYPES";
-
-    /**
-     * Metadata key used to declare the requested frequency of update requests.
-     *
-     * <p>A ComplicationProviderService should include a {@code meta-data} tag with this name in its
-     * manifest entry. The value of this tag is the number of seconds the provider would like to
-     * elapse between update requests.
-     *
-     * <p>Note that update requests are not guaranteed to be sent with this frequency.
-     *
-     * <p>If a provider never needs to receive update requests beyond the one sent when a
-     * complication is activated, the value of this tag should be 0.
-     *
-     * <p>For example, a provider that would like to update every ten minutes should include the
-     * following in its manifest entry:
-     *
-     * <pre class="prettyprint">
-     * &lt;meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
-     *         android:value="600"/&gt;</pre>
-     */
-    public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS =
-            "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
-
-    /**
-     * Metadata key used to declare a list of watch faces that may receive data from a provider
-     * before they are granted the RECEIVE_COMPLICATION_DATA permission. This allows the listed
-     * watch
-     * faces to set the provider as a default and have the complication populate when the watch face
-     * is first seen.
-     *
-     * <p>Only trusted watch faces that will set this provider as a default should be included in
-     * this list.
-     *
-     * <p>Note that if a watch face is in the same app package as the provider, it does not need to
-     * be added to this list.
-     *
-     * <p>The value of this tag should be a comma separated list of watch faces or packages. An
-     * entry
-     * can be a flattened component, as if {@link ComponentName#flattenToString()} had been called,
-     * to declare a specific watch face as safe. An entry can also be a package name, as if {@link
-     * ComponentName#getPackageName()} had been called, in which case any watch face under the app
-     * with that package name will be considered safe for this provider.
-     */
-    public static final String METADATA_KEY_SAFE_WATCH_FACES =
-            "android.support.wearable.complications.SAFE_WATCH_FACES";
-
-    /**
-     * Metadata key used to declare that the provider should be hidden from the provider chooser
-     * interface. If set to "true", users will not be able to select this provider. The provider may
-     * still be specified as a default provider by watch faces.
-     *
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public static final String METADATA_KEY_HIDDEN =
-            "android.support.wearable.complications.HIDDEN";
-
-    /**
-     * Metadata key used to declare an action for a configuration activity for a provider.
-     *
-     * <p>A ComplicationProviderService can include a {@code meta-data} tag with this name in its
-     * manifest entry to cause a configuration activity to be shown when the provider is selected.
-     *
-     * <p>The configuration activity must reside in the same package as the provider, and must
-     * register an intent filter for the action specified here, including {@link
-     * #CATEGORY_PROVIDER_CONFIG} as well as {@link Intent#CATEGORY_DEFAULT} as categories.
-     *
-     * <p>The complication id being configured will be included in the intent that starts the config
-     * activity using the extra key {@link #EXTRA_CONFIG_COMPLICATION_ID}.
-     *
-     * <p>The complication type that will be requested from the provider will also be included,
-     * using
-     * the extra key {@link #EXTRA_CONFIG_COMPLICATION_TYPE}.
-     *
-     * <p>The provider's {@link ComponentName} will also be included in the intent that starts the
-     * config activity, using the extra key {@link #EXTRA_CONFIG_PROVIDER_COMPONENT}.
-     *
-     * <p>The config activity must call {@link Activity#setResult} with either {@link
-     * Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} before it is finished, to tell the
-     * system whether or not the provider should be set on the given complication.
-     */
-    @SuppressLint("IntentName")
-    public static final String METADATA_KEY_PROVIDER_CONFIG_ACTION =
-            "android.support.wearable.complications.PROVIDER_CONFIG_ACTION";
-
-    /**
-     * Category for provider config activities. The configuration activity for a complication
-     * provider must specify this category in its intent filter.
-     *
-     * @see #METADATA_KEY_PROVIDER_CONFIG_ACTION
-     */
-    @SuppressLint("IntentName")
-    public static final String CATEGORY_PROVIDER_CONFIG =
-            "android.support.wearable.complications.category.PROVIDER_CONFIG";
-
-    /** Extra used to supply the complication id to a provider configuration activity. */
-    @SuppressLint("ActionValue")
-    public static final String EXTRA_CONFIG_COMPLICATION_ID =
-            "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
-
-    /** Extra used to supply the complication type to a provider configuration activity. */
-    @SuppressLint("ActionValue")
-    public static final String EXTRA_CONFIG_COMPLICATION_TYPE =
-            "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
-
-    /** Extra used to supply the provider component to a provider configuration activity. */
-    @SuppressLint("ActionValue")
-    public static final String EXTRA_CONFIG_PROVIDER_COMPONENT =
-            "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
-
-    @Nullable
-    private IComplicationProviderWrapper mWrapper;
-    private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
-
-    @SuppressLint("SyntheticAccessor")
-    @Override
-    @Nullable
-    public final IBinder onBind(@NonNull Intent intent) {
-        if (ACTION_COMPLICATION_UPDATE_REQUEST.equals(intent.getAction())) {
-            if (mWrapper == null) {
-                mWrapper = new IComplicationProviderWrapper();
-            }
-            return mWrapper;
-        }
-        return null;
-    }
-
-    /**
-     * Called when a complication is activated.
-     *
-     * <p>This occurs when the watch face calls setActiveComplications, or when this provider is
-     * chosen for a complication which is already active.
-     *
-     * <p>This will usually be followed by a call to {@link #onComplicationUpdate}.
-     *
-     * <p>This will be called on the main thread.
-     */
-    @UiThread
-    public void onComplicationActivated(int complicationId, int type) {
-    }
-
-    /**
-     * Called when a complication data update is requested for the given complication id.
-     *
-     * <p>In response to this request the result callback should be called with the data to be
-     * displayed. If the request can not be fulfilled or no update is needed then null should be
-     * passed to the callback.
-     *
-     * <p>The callback doesn't have be called within onComplicationUpdate but it should be called
-     * soon after. If this does not occur within around 20 seconds (exact timeout length subject
-     * to change), then the system will unbind from this service which may cause your eventual
-     * update to not be received.
-     *
-     * @param complicationId The id of the requested complication. Note this ID is distinct from
-     *                       ids used by the watch face itself.
-     * @param type           The type of complication data requested.
-     * @param resultCallback The callback to pass the result to the system.
-     */
-    @UiThread
-    public abstract void onComplicationUpdate(
-            int complicationId,
-            @NonNull ComplicationType type,
-            @NonNull ComplicationUpdateListener resultCallback);
-
-    /**
-     * A request for representative preview data for the complication, for use in the editor UI.
-     * Preview data is assumed to be static per type. E.g. for a complication that displays the date
-     * and time of an event, rather than returning the real time it should return a fixed date and
-     * time such as 10:10 Aug 1st.
-     *
-     * <p>This will be called on a background thread.
-     *
-     * @param type The type of complication preview data requested.
-     * @return Preview data for the given complication type.
-     */
-    @Nullable
-    public abstract ComplicationData getPreviewData(@NonNull ComplicationType type);
-
-    /** Callback for {@link #onComplicationUpdate}. */
-    public interface ComplicationUpdateListener {
-        /**
-         * Sends the complicationData to the system. If null is passed then any
-         * previous complication data will not be overwritten. Can be called on any thread. Should
-         * only be called once.
-         */
-        void onUpdateComplication(@Nullable ComplicationData complicationData)
-                throws RemoteException;
-    }
-
-    /**
-     * Called when a complication is deactivated.
-     *
-     * <p>This occurs when the current watch face changes, or when the watch face calls
-     * setActiveComplications and does not include the given complication (usually because the watch
-     * face has stopped displaying it).
-     *
-     * <p>This will be called on the main thread.
-     */
-    @UiThread
-    public void onComplicationDeactivated(int complicationId) {
-    }
-
-    private class IComplicationProviderWrapper extends IComplicationProvider.Stub {
-        @SuppressLint("SyntheticAccessor")
-        @Override
-        public void onUpdate(final int complicationId, final int type, IBinder manager) {
-            final ComplicationType complicationType = ComplicationType.fromWireType(type);
-            final IComplicationManager iComplicationManager =
-                    IComplicationManager.Stub.asInterface(manager);
-            mMainThreadHandler.post(
-                    () -> onComplicationUpdate(complicationId, complicationType,
-                            complicationData -> {
-                                // This can be run on an arbitrary thread, but that's OK.
-                                ComplicationType dataType =
-                                        complicationData != null ? complicationData.getType() :
-                                                ComplicationType.NO_DATA;
-                                if (dataType == ComplicationType.NOT_CONFIGURED
-                                        || dataType == ComplicationType.EMPTY) {
-                                    throw new IllegalArgumentException(
-                                            "Cannot send data of TYPE_NOT_CONFIGURED or "
-                                                    + "TYPE_EMPTY. Use TYPE_NO_DATA instead.");
-                                }
-
-                                // When no update is needed, the complicationData is going to be
-                                // null.
-                                iComplicationManager.updateComplicationData(
-                                        complicationId,
-                                        (complicationData != null)
-                                                ? complicationData.asWireComplicationData()
-                                                : null);
-                            }));
-        }
-
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public void onComplicationDeactivated(final int complicationId) {
-            mMainThreadHandler.post(
-                    () -> ComplicationProviderService.this.onComplicationDeactivated(
-                            complicationId));
-        }
-
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public void onComplicationActivated(
-                final int complicationId, final int type, IBinder manager) {
-            mMainThreadHandler.post(
-                    () -> ComplicationProviderService.this.onComplicationActivated(
-                            complicationId, type));
-        }
-
-        @Override
-        public int getApiVersion() {
-            return IComplicationProvider.API_VERSION;
-        }
-
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public android.support.wearable.complications.ComplicationData getComplicationPreviewData(
-                final int type) {
-            ComplicationData wireComplicationData =
-                    getPreviewData(ComplicationType.fromWireType(type));
-            if (wireComplicationData == null) {
-                return null;
-            }
-            return wireComplicationData.asWireComplicationData();
-        }
-    }
-}
diff --git a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.kt b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.kt
new file mode 100644
index 0000000..1d009fa
--- /dev/null
+++ b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ComplicationProviderService.kt
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *            http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.complications
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.Service
+import android.content.ComponentName
+import android.content.Intent
+import android.os.Handler
+import android.os.IBinder
+import android.os.Looper
+import android.os.RemoteException
+import android.support.wearable.complications.ComplicationProviderInfo
+import android.support.wearable.complications.IComplicationManager
+import android.support.wearable.complications.IComplicationProvider
+import androidx.annotation.RestrictTo
+import androidx.annotation.UiThread
+import androidx.wear.complications.data.ComplicationData
+import androidx.wear.complications.data.ComplicationType
+import androidx.wear.complications.data.ComplicationType.Companion.fromWireType
+
+/**
+ * Data associated with complication request in [ComplicationProviderService.onComplicationRequest].
+ * @param complicationId The id of the requested complication. Note this ID is distinct from
+ * ids used by the watch face itself.
+ * @param complicationType The type of complication data requested.
+ */
+public class ComplicationRequest(
+    public val complicationId: Int,
+    public val complicationType: ComplicationType
+)
+
+/**
+ * Class for providers of complication data.
+ *
+ * A provider service must implement [onComplicationRequest] to respond to requests for updates
+ * from the complication system.
+ *
+ * Manifest requirements:
+ *
+ * - The manifest declaration of this service must include an
+ * intent filter for android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST.
+ *
+ * - A ComplicationProviderService must include a `meta-data` tag with
+ * android.support.wearable.complications.SUPPORTED_TYPES in its manifest entry. The value of this
+ * tag should be a comma separated list of types supported by the provider. Types should be given as
+ * named as per the type fields in the [ComplicationData], but omitting the "TYPE_" prefix, e.g.
+ * `SHORT_TEXT`, `LONG_TEXT`, `RANGED_VALUE`.
+ *
+ * The order in which types are listed has no significance. In the case where a watch face
+ * supports multiple types in a single complication slot, the watch face will determine which types
+ * it prefers.
+ *
+ * For example, a provider that supports the RANGED_VALUE, SHORT_TEXT, and ICON types would
+ * include the following in its manifest entry:
+ *
+ * ```
+ * <meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES"
+ * android:value="RANGED_VALUE,SHORT_TEXT,ICON"/>
+ * ```
+ *
+ *
+ * - A ComplicationProviderService should include a `meta-data` tag with
+ * android.support.wearable.complications.UPDATE_PERIOD_SECONDS its manifest entry. The value of
+ * this tag is the number of seconds the provider would like to elapse between update requests.
+ *
+ * Note that update requests are not guaranteed to be sent with this frequency.
+ *
+ * If a provider never needs to receive update requests beyond the one sent when a complication
+ * is activated, the value of this tag should be 0.
+ *
+ * For example, a provider that would like to update every ten minutes should include the
+ * following in its manifest entry:
+ *
+ * ```
+ * <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
+ * android:value="600"/>
+ * ```
+ *
+ *
+ * - A ComplicationProviderService can include a `meta-data` tag with
+ * android.support.wearable.complications.PROVIDER_CONFIG_ACTION its manifest entry to cause a
+ * configuration activity to be shown when the provider is selected.
+ *
+ * The configuration activity must reside in the same package as the provider, and must register
+ * an intent filter for the action specified here, including
+ * android.support.wearable.complications.category.PROVIDER_CONFIG as well as
+ * [Intent.CATEGORY_DEFAULT] as categories.
+ *
+ * The complication id being configured will be included in the intent that starts the config
+ * activity using the extra key android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID.
+ *
+ * The complication type that will be requested from the provider will also be included, using
+ * the extra key android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE.
+ *
+ * The provider's [ComponentName] will also be included in the intent that starts the config
+ * activity, using the extra key
+ * android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT.
+ *
+ * The config activity must call [Activity.setResult] with either [Activity.RESULT_OK] or
+ * [Activity.RESULT_CANCELED] before it is finished, to tell the system whether or not the provider
+ * should be set on the given complication.
+ *
+ * - The manifest entry for the service should also include an android:icon attribute. The icon
+ * provided there should be a single-color white icon that represents the provider. This icon will
+ * be shown in the provider chooser interface, and may also be included in
+ * [ComplicationProviderInfo] given to watch faces for display in their configuration activities.
+ *
+ *
+ * - The manifest entry should also include
+ * `android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"` to
+ * ensure that only the system can bind to it.
+ *
+ * Multiple providers in the same APK are supported but in android R there's a soft limit of 100
+ * providers per APK. Above that the companion watchface editor won't support this provider app.
+ */
+public abstract class ComplicationProviderService : Service() {
+    private var wrapper: IComplicationProviderWrapper? = null
+    private val mainThreadHandler = Handler(Looper.getMainLooper())
+
+    @SuppressLint("SyntheticAccessor")
+    final override fun onBind(intent: Intent): IBinder? {
+        if (ACTION_COMPLICATION_UPDATE_REQUEST == intent.action) {
+            if (wrapper == null) {
+                wrapper = IComplicationProviderWrapper()
+            }
+            return wrapper
+        }
+        return null
+    }
+
+    /**
+     * Called when a complication is activated.
+     *
+     * This occurs when the watch face calls setActiveComplications, or when this provider is
+     * chosen for a complication which is already active.
+     *
+     * This will usually be followed by a call to [onComplicationRequest].
+     *
+     * This will be called on the main thread.
+     */
+    @UiThread
+    public open fun onComplicationActivated(complicationId: Int, type: ComplicationType) {}
+
+    /**
+     * Called when a complication data update is requested for the given complication id.
+     *
+     * In response to this request the result callback should be called with the data to be
+     * displayed. If the request can not be fulfilled or no update is needed then null should be
+     * passed to the callback.
+     *
+     * The callback doesn't have be called within onComplicationRequest but it should be called
+     * soon after. If this does not occur within around 20 seconds (exact timeout length subject to
+     * change), then the system will unbind from this service which may cause your eventual update
+     * to not be received.
+     *
+     * @param request The details about the complication that has been requested.
+     * @param listener The callback to pass the result to the system.
+     */
+    @UiThread
+    public abstract fun onComplicationRequest(
+        request: ComplicationRequest,
+        listener: ComplicationRequestListener
+    )
+
+    /**
+     * A request for representative preview data for the complication, for use in the editor UI.
+     * Preview data is assumed to be static per type. E.g. for a complication that displays the date
+     * and time of an event, rather than returning the real time it should return a fixed date and
+     * time such as 10:10 Aug 1st.
+     *
+     * This will be called on a background thread.
+     *
+     * @param type The type of complication preview data requested.
+     * @return Preview data for the given complication type.
+     */
+    public abstract fun getPreviewData(type: ComplicationType): ComplicationData?
+
+    /** Callback for [onComplicationRequest]. */
+    public interface ComplicationRequestListener {
+        /**
+         * Sends the complicationData to the system. If null is passed then any previous
+         * complication data will not be overwritten. Can be called on any thread. Should only be
+         * called once.
+         */
+        @Throws(RemoteException::class)
+        public fun onComplicationData(complicationData: ComplicationData?)
+    }
+
+    /**
+     * Called when a complication is deactivated.
+     *
+     * This occurs when the current watch face changes, or when the watch face calls
+     * setActiveComplications and does not include the given complication (usually because the watch
+     * face has stopped displaying it).
+     *
+     * This will be called on the main thread.
+     */
+    @UiThread public open fun onComplicationDeactivated(complicationId: Int) {}
+
+    private inner class IComplicationProviderWrapper : IComplicationProvider.Stub() {
+        @SuppressLint("SyntheticAccessor")
+        override fun onUpdate(complicationId: Int, type: Int, manager: IBinder) {
+            val complicationType = fromWireType(type)
+            val iComplicationManager = IComplicationManager.Stub.asInterface(manager)
+            mainThreadHandler.post {
+                onComplicationRequest(
+                    ComplicationRequest(complicationId, complicationType),
+                    object : ComplicationRequestListener {
+                        override fun onComplicationData(complicationData: ComplicationData?) {
+                            // This can be run on an arbitrary thread, but that's OK.
+                            val dataType = complicationData?.type ?: ComplicationType.NO_DATA
+                            require(
+                                dataType != ComplicationType.NOT_CONFIGURED &&
+                                    dataType != ComplicationType.EMPTY
+                            ) {
+                                "Cannot send data of TYPE_NOT_CONFIGURED or " +
+                                    "TYPE_EMPTY. Use TYPE_NO_DATA instead."
+                            }
+
+                            // When no update is needed, the complicationData is going to be
+                            // null.
+                            iComplicationManager.updateComplicationData(
+                                complicationId,
+                                complicationData?.asWireComplicationData()
+                            )
+                        }
+                    }
+                )
+            }
+        }
+
+        @SuppressLint("SyntheticAccessor")
+        override fun onComplicationDeactivated(complicationId: Int) {
+            mainThreadHandler.post {
+                [email protected](complicationId)
+            }
+        }
+
+        @SuppressLint("SyntheticAccessor")
+        override fun onComplicationActivated(complicationId: Int, type: Int, manager: IBinder) {
+            mainThreadHandler.post {
+                [email protected](
+                    complicationId,
+                    fromWireType(type)
+                )
+            }
+        }
+
+        override fun getApiVersion(): Int {
+            return API_VERSION
+        }
+
+        @SuppressLint("SyntheticAccessor")
+        override fun getComplicationPreviewData(
+            type: Int
+        ): android.support.wearable.complications.ComplicationData? =
+            getPreviewData(fromWireType(type))?.asWireComplicationData()
+    }
+
+    public companion object {
+        /**
+         * The intent action used to send update requests to the provider. Complication provider
+         * services must declare an intent filter for this action in the manifest.
+         */
+        @SuppressWarnings("ActionValue")
+        public const val ACTION_COMPLICATION_UPDATE_REQUEST: String =
+            "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"
+
+        /**
+         * Metadata key used to declare supported complication types.
+         *
+         * A ComplicationProviderService must include a `meta-data` tag with this name in its
+         * manifest entry. The value of this tag should be a comma separated list of types supported
+         * by the provider. Types should be given as named as per the type fields in the
+         * [ComplicationData], but omitting the "TYPE_" prefix, e.g. `SHORT_TEXT`, `LONG_TEXT`,
+         * `RANGED_VALUE`.
+         *
+         * The order in which types are listed has no significance. In the case where a watch
+         * face supports multiple types in a single complication slot, the watch face will
+         * determine which types it prefers.
+         *
+         * For example, a provider that supports the RANGED_VALUE, SHORT_TEXT, and ICON types
+         * would include the following in its manifest entry:
+         * ```
+         * <meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES"
+         * android:value="RANGED_VALUE,SHORT_TEXT,ICON"/>
+         * ```
+         */
+        public const val METADATA_KEY_SUPPORTED_TYPES: String =
+            "android.support.wearable.complications.SUPPORTED_TYPES"
+
+        /**
+         * Metadata key used to declare the requested frequency of update requests.
+         *
+         * A ComplicationProviderService should include a `meta-data` tag with this name in its
+         * manifest entry. The value of this tag is the number of seconds the provider would like to
+         * elapse between update requests.
+         *
+         * Note that update requests are not guaranteed to be sent with this frequency.
+         *
+         * If a provider never needs to receive update requests beyond the one sent when a
+         * complication is activated, the value of this tag should be 0.
+         *
+         * For example, a provider that would like to update every ten minutes should include the
+         * following in its manifest entry:
+         * ```
+         * <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
+         * android:value="600"/>
+         * ```
+         */
+        public const val METADATA_KEY_UPDATE_PERIOD_SECONDS: String =
+            "android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
+
+        /**
+         * Metadata key used to declare a list of watch faces that may receive data from a provider
+         * before they are granted the RECEIVE_COMPLICATION_DATA permission. This allows the listed
+         * watch faces to set the provider as a default and have the complication populate when the
+         * watch face is first seen.
+         *
+         * Only trusted watch faces that will set this provider as a default should be included
+         * in this list.
+         *
+         * Note that if a watch face is in the same app package as the provider, it does not need
+         * to be added to this list.
+         *
+         * The value of this tag should be a comma separated list of watch faces or packages. An
+         * entry can be a flattened component, as if [ComponentName.flattenToString] had been
+         * called, to declare a specific watch face as safe. An entry can also be a package name,
+         * as if [ComponentName.getPackageName] had been called, in which case any watch face
+         * under the app with that package name will be considered safe for this provider.
+         */
+        public const val METADATA_KEY_SAFE_WATCH_FACES: String =
+            "android.support.wearable.complications.SAFE_WATCH_FACES"
+
+        /**
+         * Metadata key used to declare that the provider should be hidden from the provider chooser
+         * interface. If set to "true", users will not be able to select this provider. The provider
+         * may still be specified as a default provider by watch faces.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public const val METADATA_KEY_HIDDEN: String =
+            "android.support.wearable.complications.HIDDEN"
+
+        /**
+         * Metadata key used to declare an action for a configuration activity for a provider.
+         *
+         * A ComplicationProviderService can include a `meta-data` tag with this name in its
+         * manifest entry to cause a configuration activity to be shown when the provider is
+         * selected.
+         *
+         * The configuration activity must reside in the same package as the provider, and must
+         * register an intent filter for the action specified here, including
+         * [CATEGORY_PROVIDER_CONFIG] as well as [Intent.CATEGORY_DEFAULT] as categories.
+         *
+         * The complication id being configured will be included in the intent that starts the
+         * config activity using the extra key [EXTRA_CONFIG_COMPLICATION_ID].
+         *
+         * The complication type that will be requested from the provider will also be included,
+         * using the extra key [EXTRA_CONFIG_COMPLICATION_TYPE].
+         *
+         * The provider's [ComponentName] will also be included in the intent that starts the
+         * config activity, using the extra key [EXTRA_CONFIG_PROVIDER_COMPONENT].
+         *
+         * The config activity must call [Activity.setResult] with either [Activity.RESULT_OK] or
+         * [Activity.RESULT_CANCELED] before it is finished, to tell the system whether or not the
+         * provider should be set on the given complication.
+         */
+        @SuppressLint("IntentName")
+        public const val METADATA_KEY_PROVIDER_CONFIG_ACTION: String =
+            "android.support.wearable.complications.PROVIDER_CONFIG_ACTION"
+
+        /**
+         * Category for provider config activities. The configuration activity for a complication
+         * provider must specify this category in its intent filter.
+         *
+         * @see METADATA_KEY_PROVIDER_CONFIG_ACTION
+         */
+        @SuppressLint("IntentName")
+        public const val CATEGORY_PROVIDER_CONFIG: String =
+            "android.support.wearable.complications.category.PROVIDER_CONFIG"
+
+        /** Extra used to supply the complication id to a provider configuration activity. */
+        @SuppressLint("ActionValue")
+        public const val EXTRA_CONFIG_COMPLICATION_ID: String =
+            "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID"
+
+        /** Extra used to supply the complication type to a provider configuration activity. */
+        @SuppressLint("ActionValue")
+        public const val EXTRA_CONFIG_COMPLICATION_TYPE: String =
+            "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE"
+
+        /** Extra used to supply the provider component to a provider configuration activity. */
+        @SuppressLint("ActionValue")
+        public const val EXTRA_CONFIG_PROVIDER_COMPONENT: String =
+            "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT"
+    }
+}
diff --git a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.java b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.java
deleted file mode 100644
index bce0f6c..0000000
--- a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.complications;
-
-import android.annotation.SuppressLint;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
-/**
- * Allows complication providers to request update calls from the system. This effectively allows
- * providers to push updates to the system outside of the update request cycle.
- */
-public class ProviderUpdateRequester {
-
-    /** The package of the service that accepts provider requests. */
-    private static final String UPDATE_REQUEST_RECEIVER_PACKAGE = "com.google.android.wearable.app";
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static final String ACTION_REQUEST_UPDATE =
-            "android.support.wearable.complications.ACTION_REQUEST_UPDATE";
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static final String ACTION_REQUEST_UPDATE_ALL =
-            "android.support.wearable.complications.ACTION_REQUEST_UPDATE_ALL";
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static final String EXTRA_PROVIDER_COMPONENT =
-            "android.support.wearable.complications.EXTRA_PROVIDER_COMPONENT";
-
-    /** @hide */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public static final String EXTRA_COMPLICATION_IDS =
-            "android.support.wearable.complications.EXTRA_COMPLICATION_IDS";
-
-    @NonNull private final Context mContext;
-    @NonNull private final ComponentName mProviderComponent;
-
-    /**
-     * @param context The provider's context
-     * @param providerComponent the component name of the {@link ComplicationProviderService} that
-     *     this will request updates for
-     */
-    public ProviderUpdateRequester(
-            @NonNull Context context, @NonNull ComponentName providerComponent) {
-        if (context == null) {
-            throw new IllegalArgumentException("Context cannot be null");
-        }
-        if (providerComponent == null) {
-            throw new IllegalArgumentException("ProviderComponent cannot be null");
-        }
-        mContext = context;
-        mProviderComponent = providerComponent;
-    }
-
-    /**
-     * Requests that the system call {@link ComplicationProviderService#onComplicationUpdate
-     * onComplicationUpdate} on the specified provider, for all active complications using that
-     * provider.
-     *
-     * <p>This will do nothing if no active complications are configured to use the specified
-     * provider.
-     *
-     * <p>This will also only work if called from the same package as the provider.
-     */
-    @SuppressLint("PendingIntentMutability")
-    public void requestUpdateAll() {
-        Intent intent = new Intent(ACTION_REQUEST_UPDATE_ALL);
-        intent.setPackage(UPDATE_REQUEST_RECEIVER_PACKAGE);
-        intent.putExtra(EXTRA_PROVIDER_COMPONENT, mProviderComponent);
-        // Add a placeholder PendingIntent to allow the UID to be checked.
-        intent.putExtra(
-                ProviderUpdateRequesterConstants.EXTRA_PENDING_INTENT,
-                PendingIntent.getActivity(mContext, 0, new Intent(""), 0));
-        mContext.sendBroadcast(intent);
-    }
-
-    /**
-     * Requests that the system call {@link ComplicationProviderService#onComplicationUpdate
-     * onComplicationUpdate} on the specified provider, for the given complication ids. Inactive
-     * complications are ignored, as are complications configured to use a different provider.
-     *
-     * @param complicationIds the ids of the complications to be updated, as provided in calls to
-     *     {@link ComplicationProviderService#onComplicationActivated} and
-     *     {@link ComplicationProviderService#onComplicationUpdate}.
-     */
-    @SuppressLint("PendingIntentMutability")
-    public void requestUpdate(@NonNull int... complicationIds) {
-        Intent intent = new Intent(ACTION_REQUEST_UPDATE);
-        intent.setPackage(UPDATE_REQUEST_RECEIVER_PACKAGE);
-        intent.putExtra(EXTRA_PROVIDER_COMPONENT, mProviderComponent);
-        intent.putExtra(EXTRA_COMPLICATION_IDS, complicationIds);
-        // Add a placeholder PendingIntent to allow the UID to be checked.
-        intent.putExtra(
-                ProviderUpdateRequesterConstants.EXTRA_PENDING_INTENT,
-                PendingIntent.getActivity(mContext, 0, new Intent(""), 0));
-
-        mContext.sendBroadcast(intent);
-    }
-}
diff --git a/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.kt b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.kt
new file mode 100644
index 0000000..2c54c0d
--- /dev/null
+++ b/wear/wear-complications-provider/src/main/java/androidx/wear/complications/ProviderUpdateRequester.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.complications
+
+import android.annotation.SuppressLint
+import android.app.PendingIntent
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import androidx.annotation.RestrictTo
+
+/**
+ * Allows complication providers to request update calls from the system. This effectively allows
+ * providers to push updates to the system outside of the update request cycle.
+ */
+public class ProviderUpdateRequester(
+    private val context: Context,
+    private val providerComponent: ComponentName
+) {
+    /**
+     * Requests that the system call
+     * [onComplicationUpdate][ComplicationProviderService.onComplicationRequest] on the specified
+     * provider, for all active complications using that provider.
+     *
+     * This will do nothing if no active complications are configured to use the specified
+     * provider.
+     *
+     * This will also only work if called from the same package as the provider.
+     */
+    @SuppressLint("PendingIntentMutability")
+    public fun requestUpdateAll() {
+        val intent = Intent(ACTION_REQUEST_UPDATE_ALL)
+        intent.setPackage(UPDATE_REQUEST_RECEIVER_PACKAGE)
+        intent.putExtra(EXTRA_PROVIDER_COMPONENT, providerComponent)
+        // Add a placeholder PendingIntent to allow the UID to be checked.
+        intent.putExtra(
+            ProviderUpdateRequesterConstants.EXTRA_PENDING_INTENT,
+            PendingIntent.getActivity(context, 0, Intent(""), 0)
+        )
+        context.sendBroadcast(intent)
+    }
+
+    /**
+     * Requests that the system call
+     * [onComplicationUpdate][ComplicationProviderService.onComplicationRequest] on the specified
+     * provider, for the given complication ids. Inactive complications are ignored, as are
+     * complications configured to use a different provider.
+     *
+     * @param complicationIds the ids of the complications to be updated, as provided in calls to
+     * [ComplicationProviderService.onComplicationActivated] and
+     * [ComplicationProviderService.onComplicationRequest].
+     */
+    @SuppressLint("PendingIntentMutability")
+    public fun requestUpdate(vararg complicationIds: Int) {
+        val intent = Intent(ACTION_REQUEST_UPDATE)
+        intent.setPackage(UPDATE_REQUEST_RECEIVER_PACKAGE)
+        intent.putExtra(EXTRA_PROVIDER_COMPONENT, providerComponent)
+        intent.putExtra(EXTRA_COMPLICATION_IDS, complicationIds)
+        // Add a placeholder PendingIntent to allow the UID to be checked.
+        intent.putExtra(
+            ProviderUpdateRequesterConstants.EXTRA_PENDING_INTENT,
+            PendingIntent.getActivity(context, 0, Intent(""), 0)
+        )
+        context.sendBroadcast(intent)
+    }
+
+    public companion object {
+        /** The package of the service that accepts provider requests.  */
+        private const val UPDATE_REQUEST_RECEIVER_PACKAGE = "com.google.android.wearable.app"
+
+        /** @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public const val ACTION_REQUEST_UPDATE: String =
+            "android.support.wearable.complications.ACTION_REQUEST_UPDATE"
+
+        /** @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public const val ACTION_REQUEST_UPDATE_ALL: String =
+            "android.support.wearable.complications.ACTION_REQUEST_UPDATE_ALL"
+
+        /** @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public const val EXTRA_PROVIDER_COMPONENT: String =
+            "android.support.wearable.complications.EXTRA_PROVIDER_COMPONENT"
+
+        /** @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public const val EXTRA_COMPLICATION_IDS: String =
+            "android.support.wearable.complications.EXTRA_COMPLICATION_IDS"
+    }
+}
diff --git a/wear/wear-complications-provider/src/test/java/androidx/wear/complications/ComplicationProviderServiceTest.java b/wear/wear-complications-provider/src/test/java/androidx/wear/complications/ComplicationProviderServiceTest.java
index 3ddb44d..7bb22648 100644
--- a/wear/wear-complications-provider/src/test/java/androidx/wear/complications/ComplicationProviderServiceTest.java
+++ b/wear/wear-complications-provider/src/test/java/androidx/wear/complications/ComplicationProviderServiceTest.java
@@ -31,10 +31,12 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.wear.complications.data.ComplicationData;
+import androidx.wear.complications.data.ComplicationText;
 import androidx.wear.complications.data.ComplicationType;
 import androidx.wear.complications.data.LongTextComplicationData;
 import androidx.wear.complications.data.PlainComplicationText;
 
+import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -68,18 +70,20 @@
     private ComplicationProviderService mTestService = new ComplicationProviderService() {
 
         @Override
-        public void onComplicationUpdate(
-                int complicationId,
-                @NonNull ComplicationType type,
-                @NonNull ComplicationUpdateListener callback) {
+        public void onComplicationRequest(
+                @NotNull ComplicationRequest request,
+                @NonNull ComplicationRequestListener listener) {
             try {
-                callback.onUpdateComplication(
+                listener.onComplicationData(
                         new LongTextComplicationData.Builder(
-                                new PlainComplicationText.Builder("hello " + complicationId).build()
+                                new PlainComplicationText.Builder(
+                                        "hello " + request.getComplicationId()
+                                ).build(),
+                                ComplicationText.EMPTY
                         ).build()
                 );
             } catch (RemoteException e) {
-                Log.e(TAG, "onComplicationUpdate failed with error: ", e);
+                Log.e(TAG, "onComplicationRequest failed with error: ", e);
             }
         }
 
@@ -90,7 +94,8 @@
                 return null;
             }
             return new LongTextComplicationData.Builder(
-                    new PlainComplicationText.Builder("hello preview").build()
+                    new PlainComplicationText.Builder("hello preview").build(),
+                    ComplicationText.EMPTY
             ).build();
         }
     };
@@ -98,15 +103,14 @@
     private ComplicationProviderService mNoUpdateTestService = new ComplicationProviderService() {
 
         @Override
-        public void onComplicationUpdate(
-                int complicationId,
-                @NonNull ComplicationType type,
-                @NonNull ComplicationUpdateListener callback) {
+        public void onComplicationRequest(
+                @NotNull ComplicationRequest request,
+                @NonNull ComplicationRequestListener listener) {
             try {
                 // Null means no update required.
-                callback.onUpdateComplication(null);
+                listener.onComplicationData(null);
             } catch (RemoteException e) {
-                Log.e(TAG, "onComplicationUpdate failed with error: ", e);
+                Log.e(TAG, "onComplicationRequest failed with error: ", e);
             }
         }
 
@@ -114,7 +118,8 @@
         @Override
         public ComplicationData getPreviewData(@NonNull ComplicationType type) {
             return new LongTextComplicationData.Builder(
-                    new PlainComplicationText.Builder("hello preview").build()
+                    new PlainComplicationText.Builder("hello preview").build(),
+                    ComplicationText.EMPTY
             ).build();
         }
     };
@@ -132,7 +137,7 @@
     }
 
     @Test
-    public void testOnComplicationUpdate() throws Exception {
+    public void testOnComplicationRequest() throws Exception {
         int id = 123;
         mComplicationProvider.onUpdate(
                 id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager);
@@ -148,7 +153,7 @@
     }
 
     @Test
-    public void testOnComplicationUpdateNoUpdateRequired() throws Exception {
+    public void testOnComplicationRequestNoUpdateRequired() throws Exception {
         int id = 123;
         mNoUpdateComplicationProvider.onUpdate(
                 id, ComplicationType.LONG_TEXT.toWireComplicationType(), mLocalManager);
diff --git a/wear/wear-input-testing/lint-baseline.xml b/wear/wear-input-testing/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-input-testing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-input/lint-baseline.xml b/wear/wear-input/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-input/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-input/src/main/java/androidx/wear/input/RemoteInputIntentHelper.kt b/wear/wear-input/src/main/java/androidx/wear/input/RemoteInputIntentHelper.kt
index c38b11e..e1f6a54 100644
--- a/wear/wear-input/src/main/java/androidx/wear/input/RemoteInputIntentHelper.kt
+++ b/wear/wear-input/src/main/java/androidx/wear/input/RemoteInputIntentHelper.kt
@@ -90,7 +90,7 @@
          * .createActionRemoteInputIntent].
          *
          * @param intent The intent with given data.
-         * @return The array of [RemoteInput] previously added with [.putRemoteInputsExtra] or null
+         * @return The array of [RemoteInput] previously added with [putRemoteInputsExtra] or null
          * which means no user input required.
          */
         @JvmStatic
@@ -107,7 +107,7 @@
 
         /**
          * Adds the array of [RemoteInput] to the given [Intent] that specifies inputs collected
-         * from a user. Should be used with [Intent] created with [.createActionRemoteInputIntent].
+         * from a user. Should be used with [Intent] created with [createActionRemoteInputIntent].
          *
          * @param intent The intent with given data.
          * @param remoteInputs The array of [RemoteInput] to be added.
@@ -124,7 +124,7 @@
          * the confirmation screen to describe the action.
          *
          * @param intent The intent with given data.
-         * @return The string previously added with [.putTitleExtra] or null if no value is found.
+         * @return The string previously added with [putTitleExtra] or null if no value is found.
          */
         @JvmStatic
         @Nullable
@@ -148,7 +148,7 @@
          * cancel the action.
          *
          * @param intent The intent with given data.
-         * @return The string previously added with [.putCancelLabelExtra] or null if no value is
+         * @return The string previously added with [putCancelLabelExtra] or null if no value is
          * found.
          */
         @JvmStatic
@@ -174,7 +174,7 @@
          * confirm that the action should be executed.
          *
          * @param intent The intent with given data.
-         * @return The string previously added with [.putConfirmLabelExtra] or null if no value is
+         * @return The string previously added with [putConfirmLabelExtra] or null if no value is
          * found.
          */
         @JvmStatic
@@ -201,7 +201,7 @@
          * wearable is preparing to automatically execute the action.
          *
          * @param intent The intent with given data.
-         * @return The string previously added with [.putInProgressLabelExtra] or null if no
+         * @return The string previously added with [putInProgressLabelExtra] or null if no
          * value is found.
          */
         @JvmStatic
@@ -228,7 +228,7 @@
          * creating Smart Reply choices within a RemoteInput session.
          *
          * @param intent The intent with given data.
-         * @return The array of [CharSequence] previously added with [.putSmartReplyContext] or [
+         * @return The array of [CharSequence] previously added with [putSmartReplyContext] or [
          * .putSmartReplyContextExtra] or null if no value is found.
          */
         @JvmStatic
diff --git a/wear/wear-ongoing/api/current.txt b/wear/wear-ongoing/api/current.txt
index cf3b4ea..779ba555 100644
--- a/wear/wear-ongoing/api/current.txt
+++ b/wear/wear-ongoing/api/current.txt
@@ -3,9 +3,19 @@
 
   @RequiresApi(24) public final class OngoingActivity {
     method public void apply(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, int);
+    method public android.graphics.drawable.Icon? getAnimatedIcon();
+    method public String? getCategory();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public int getNotificationId();
+    method public int getOngoingActivityId();
+    method public android.graphics.drawable.Icon getStaticIcon();
+    method public androidx.wear.ongoing.OngoingActivityStatus? getStatus();
+    method public String? getTag();
+    method public long getTimestamp();
+    method public android.app.PendingIntent getTouchIntent();
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, int);
     method public void update(android.content.Context, androidx.wear.ongoing.OngoingActivityStatus);
   }
 
diff --git a/wear/wear-ongoing/api/public_plus_experimental_current.txt b/wear/wear-ongoing/api/public_plus_experimental_current.txt
index c35669e..3c959c3 100644
--- a/wear/wear-ongoing/api/public_plus_experimental_current.txt
+++ b/wear/wear-ongoing/api/public_plus_experimental_current.txt
@@ -3,9 +3,19 @@
 
   @RequiresApi(24) public final class OngoingActivity {
     method public void apply(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, int);
+    method public android.graphics.drawable.Icon? getAnimatedIcon();
+    method public String? getCategory();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public int getNotificationId();
+    method public int getOngoingActivityId();
+    method public android.graphics.drawable.Icon getStaticIcon();
+    method public androidx.wear.ongoing.OngoingActivityStatus? getStatus();
+    method public String? getTag();
+    method public long getTimestamp();
+    method public android.app.PendingIntent getTouchIntent();
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, int);
     method public void update(android.content.Context, androidx.wear.ongoing.OngoingActivityStatus);
   }
 
diff --git a/wear/wear-ongoing/api/restricted_current.txt b/wear/wear-ongoing/api/restricted_current.txt
index c35669e..3c959c3 100644
--- a/wear/wear-ongoing/api/restricted_current.txt
+++ b/wear/wear-ongoing/api/restricted_current.txt
@@ -3,9 +3,19 @@
 
   @RequiresApi(24) public final class OngoingActivity {
     method public void apply(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context);
-    method public static androidx.wear.ongoing.OngoingActivity? fromExistingOngoingActivity(android.content.Context, int);
+    method public android.graphics.drawable.Icon? getAnimatedIcon();
+    method public String? getCategory();
+    method public androidx.core.content.LocusIdCompat? getLocusId();
+    method public int getNotificationId();
+    method public int getOngoingActivityId();
+    method public android.graphics.drawable.Icon getStaticIcon();
+    method public androidx.wear.ongoing.OngoingActivityStatus? getStatus();
+    method public String? getTag();
+    method public long getTimestamp();
+    method public android.app.PendingIntent getTouchIntent();
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, java.util.function.Predicate<androidx.wear.ongoing.OngoingActivityData!>);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context);
+    method public static androidx.wear.ongoing.OngoingActivity? recoverOngoingActivity(android.content.Context, int);
     method public void update(android.content.Context, androidx.wear.ongoing.OngoingActivityStatus);
   }
 
diff --git a/wear/wear-ongoing/lint-baseline.xml b/wear/wear-ongoing/lint-baseline.xml
deleted file mode 100644
index 934e2aa..0000000
--- a/wear/wear-ongoing/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-</issues>
-
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
index dbd0aec..6c53230 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivity.java
@@ -37,9 +37,10 @@
  * Main class to access the Ongoing Activities API.
  *
  * It's created with the {@link Builder}. After it's created (and before building and
- * posting the {@link Notification}) {@link OngoingActivity#apply(Context)} apply} needs to be
+ * posting the {@link Notification}) {@link OngoingActivity#apply(Context)} apply needs to be
  * called:
- * {@code
+ *
+ * <pre>{@code
  * NotificationCompat.Builder builder = new NotificationCompat.Builder(context)....
  *
  * OngoingActivity ongoingActivity = new OngoingActivity.Builder(context, notificationId, builder);
@@ -47,13 +48,18 @@
  * ongoingActivity.apply(context);
  *
  * notificationManager.notify(notificationId, builder.build());
- * }
+ * }</pre>
  *
+ * Note that if a Notification with that id was previously posted it will be replaced. If you
+ * need more than one Notification with the same ID you can use a String tag to differentiate
+ * them in both the {@link Builder#Builder(Context, String, int, NotificationCompat.Builder)} and
+ * {@link NotificationManager#notify(String, int, Notification)}
+ * <p>
  * Afterward, {@link OngoingActivity#update(Context, OngoingActivityStatus) update} can be used to
  * update the status.
- *
+ * <p>
  * If saving the {@link OngoingActivity} instance is not convenient, it can be recovered (after the
- * notification is posted) with {@link OngoingActivity#fromExistingOngoingActivity(Context)}
+ * notification is posted) with {@link OngoingActivity#recoverOngoingActivity(Context)}
  */
 @RequiresApi(24)
 public final class OngoingActivity {
@@ -131,8 +137,6 @@
          * {@link OngoingActivity}. For example, in the WatchFace.
          * Should be white with a transparent background, preferably an AnimatedVectorDrawable.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setAnimatedIcon(@NonNull Icon animatedIcon) {
             mAnimatedIcon = animatedIcon;
@@ -144,8 +148,6 @@
          * {@link OngoingActivity}. For example, in the WatchFace.
          * Should be white with a transparent background, preferably an AnimatedVectorDrawable.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setAnimatedIcon(@DrawableRes int animatedIcon) {
             mAnimatedIcon = Icon.createWithResource(mContext, animatedIcon);
@@ -157,8 +159,6 @@
          * {@link OngoingActivity}, for example in the WatchFace in ambient mode.
          * Should be white with a transparent background, preferably an VectorDrawable.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setStaticIcon(@NonNull Icon staticIcon) {
             mStaticIcon = staticIcon;
@@ -170,8 +170,6 @@
          * {@link OngoingActivity}, for example in the WatchFace in ambient mode.
          * Should be white with a transparent background, preferably an VectorDrawable.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setStaticIcon(@DrawableRes int staticIcon) {
             mStaticIcon = Icon.createWithResource(mContext, staticIcon);
@@ -182,8 +180,6 @@
          * Set the initial status of this ongoing activity, the status may be displayed on the UI to
          * show progress of the Ongoing Activity.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setStatus(@NonNull OngoingActivityStatus status) {
             mStatus = status;
@@ -194,8 +190,6 @@
          * Set the intent to be used to go back to the activity when the user interacts with the
          * Ongoing Activity in other surfaces (for example, taps the Icon on the WatchFace)
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setTouchIntent(@NonNull PendingIntent touchIntent) {
             mTouchIntent = touchIntent;
@@ -206,8 +200,6 @@
          * Set the corresponding LocusId of this {@link OngoingActivity}, this will be used by the
          * launcher to identify the corresponding launcher item and display it accordingly.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setLocusId(@NonNull LocusIdCompat locusId) {
             mLocusId = locusId;
@@ -216,10 +208,8 @@
 
         /**
          * Give an id to this {@link OngoingActivity}, as a way to reference it in
-         * {@link OngoingActivity#fromExistingOngoingActivity(Context, int)}
+         * {@link OngoingActivity#recoverOngoingActivity(Context, int)}
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setOngoingActivityId(int ongoingActivityId) {
             mOngoingActivityId = ongoingActivityId;
@@ -230,8 +220,6 @@
          * Set the category of this {@link OngoingActivity}, this may be used by the system to
          * prioritize it.
          */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        // No getters needed on OngoingActivity - receiver will consume from OngoingActivityData.
         @NonNull
         public Builder setCategory(@NonNull String category) {
             mCategory = category;
@@ -290,6 +278,95 @@
     }
 
     /**
+     * Get the notificationId of the notification associated with this {@link OngoingActivity}.
+     */
+    public int getNotificationId() {
+        return mNotificationId;
+    }
+
+    /**
+     * Get the tag of the notification associated with this {@link OngoingActivity}, or null if
+     * there is none.
+     */
+    @Nullable
+    public String getTag() {
+        return mTag;
+    }
+
+    /**
+     * Get the animated icon that can be used on some surfaces to represent this
+     * {@link OngoingActivity}. For example, in the WatchFace.
+     */
+    @Nullable
+    public Icon getAnimatedIcon() {
+        return mData.getAnimatedIcon();
+    }
+
+    /**
+     * Get the static icon that can be used on some surfaces to represent this
+     * {@link OngoingActivity}. For example in the WatchFace in ambient mode. If not set, returns
+     *  the small icon of the corresponding Notification.
+     */
+    @NonNull
+    public Icon getStaticIcon() {
+        return mData.getStaticIcon();
+    }
+
+    /**
+     * Get the status of this ongoing activity, the status may be displayed on the UI to
+     * show progress of the Ongoing Activity. If not set, returns the content text of the
+     * corresponding Notification.
+     */
+    @Nullable
+    public OngoingActivityStatus getStatus() {
+        return mData.getStatus();
+    }
+
+    /**
+     * Get the intent to be used to go back to the activity when the user interacts with the
+     * Ongoing Activity in other surfaces (for example, taps the Icon on the WatchFace). If not
+     * set, returns the touch intent of the corresponding Notification.
+     */
+    @NonNull
+    public PendingIntent getTouchIntent() {
+        return mData.getTouchIntent();
+    }
+
+    /**
+     * Get the LocusId of this {@link OngoingActivity}, this can be used by the launcher to
+     * identify the corresponding launcher item and display it accordingly. If not set, returns
+     * the one in the corresponding Notification.
+     */
+    @Nullable
+    public LocusIdCompat getLocusId() {
+        return mData.getLocusId();
+    }
+
+    /**
+     * Get the id to this {@link OngoingActivity}. This id is used to reference it in
+     * {@link #recoverOngoingActivity(Context, int)}
+     */
+    public int getOngoingActivityId() {
+        return mData.getOngoingActivityId();
+    }
+
+    /**
+     * Get the Category of this {@link OngoingActivity} if set, otherwise the category of the
+     * corresponding notification.
+     */
+    @Nullable
+    public String getCategory() {
+        return mData.getCategory();
+    }
+
+    /**
+     * Get the time (in {@link SystemClock#elapsedRealtime()} time) the OngoingActivity was built.
+     */
+    public long getTimestamp() {
+        return mData.getTimestamp();
+    }
+
+    /**
      * Notify the system that this activity should be shown as an Ongoing Activity.
      *
      * This will modify the notification builder associated with this Ongoing Activity, so needs
@@ -333,7 +410,7 @@
      * @return the Ongoing Activity or null if not found
      */
     @Nullable
-    public static OngoingActivity fromExistingOngoingActivity(
+    public static OngoingActivity recoverOngoingActivity(
             @NonNull Context context,
             @NonNull Predicate<OngoingActivityData> filter
     ) {
@@ -366,8 +443,8 @@
      * @return the Ongoing Activity or null if not found
      */
     @Nullable
-    public static OngoingActivity fromExistingOngoingActivity(@NonNull Context context) {
-        return fromExistingOngoingActivity(context, (data) -> true);
+    public static OngoingActivity recoverOngoingActivity(@NonNull Context context) {
+        return recoverOngoingActivity(context, (data) -> true);
     }
 
     /**
@@ -381,9 +458,9 @@
      * @return the Ongoing Activity or null if not found
      */
     @Nullable
-    public static OngoingActivity fromExistingOngoingActivity(@NonNull Context context,
+    public static OngoingActivity recoverOngoingActivity(@NonNull Context context,
             int ongoingActivityId) {
-        return fromExistingOngoingActivity(context,
+        return recoverOngoingActivity(context,
                 (data) -> data.getOngoingActivityId() == ongoingActivityId);
     }
 
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityStatus.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityStatus.java
index dd5c7bb..dd07bd5 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityStatus.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/OngoingActivityStatus.java
@@ -38,19 +38,19 @@
 import java.util.Set;
 
 /**
- * Base class to serialize / deserialize {@link OngoingActivityStatus} into / from a Notification
- *
+ * Base class to serialize / deserialize {@link OngoingActivityStatus} into / from a Notification.
+ * <p>
  * A status is composed of Parts, and they are joined together with a template.
- *
+ * <p>
  * Note that for backwards compatibility reasons the code rendering this status message may not
  * have all of the [StatusPart] classes that are available in later versions of the library.
  * Templates that do not have values for all of the named parts will not be used.
  * The template list will be iterated through looking for the first template with all matching named
  * parts available, this will be selected for rendering the status.
- *
+ * <p>
  * To provide for backwards compatibility, you should provide one (or more) fallback templates which
  * use status parts from earlier versions of the API. e.g. TextStatusPart & TimerStatusPart
- *
+ * <p>
  * The status and part classes here use timestamps for updating the displayed representation of the
  * status, in cases when this is needed (chronometers), as returned by
  * {@link android.os.SystemClock#elapsedRealtime()}
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/StatusPart.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/StatusPart.java
index 518e7a6..bd2019c 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/StatusPart.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/StatusPart.java
@@ -20,7 +20,7 @@
 
 /**
  * Abstract class to represent An Ongoing activity status or part of it.
- *
+ * <p>
  * Parts are used to create complex statuses, that may contain several timers, placeholders for
  * text, etc.
  * They may also be used to convey information to the system about this Ongoing Activity.
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TextStatusPart.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TextStatusPart.java
index 31cbd221..4da03ca 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TextStatusPart.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TextStatusPart.java
@@ -26,7 +26,7 @@
 
 /**
  * An Ongoing activity status (or part of it) representing a plain, static text.
- *
+ * <p>
  * Available since wear-ongoing:1.0.0
  */
 @VersionedParcelize
diff --git a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TimerStatusPart.java b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TimerStatusPart.java
index c07de51..6336499 100644
--- a/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TimerStatusPart.java
+++ b/wear/wear-ongoing/src/main/java/androidx/wear/ongoing/TimerStatusPart.java
@@ -28,8 +28,8 @@
 
 /**
  * An Ongoing activity status (or part of it) representing a timer or stopwatch.
- *
- *  Available since wear-ongoing:1.0.0
+ * <p>
+ * Available since wear-ongoing:1.0.0
  */
 @VersionedParcelize
 public class TimerStatusPart extends StatusPart {
diff --git a/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt b/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
index e8b9974..4f7f098 100644
--- a/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
+++ b/wear/wear-ongoing/src/test/java/androidx/wear/ongoing/OngoingActivityTest.kt
@@ -125,12 +125,12 @@
     @Test
     fun testCreateFromExistingOngoingActivityNull() {
         // Nothing to see here.
-        assertNull(OngoingActivity.fromExistingOngoingActivity(context))
+        assertNull(OngoingActivity.recoverOngoingActivity(context))
 
         // Same, with a normal notification posted.
         val builder = NotificationCompat.Builder(context, ChannelId)
         notificationManager.notify(NotificationId, builder.build())
-        assertNull(OngoingActivity.fromExistingOngoingActivity(context))
+        assertNull(OngoingActivity.recoverOngoingActivity(context))
 
         // Clean up.
         notificationManager.cancel(NotificationId)
@@ -158,7 +158,7 @@
         for (i in 1..n) {
             val status = "New Status $i"
             statuses.add(status)
-            OngoingActivity.fromExistingOngoingActivity(context, i)!!
+            OngoingActivity.recoverOngoingActivity(context, i)!!
                 .update(context, OngoingActivityStatus.forPart(TextStatusPart(status)))
         }
         assertEquals(n, statuses.size) // Just in case.
@@ -219,7 +219,7 @@
 
         // After posting, send an update.
         val newStatus = OngoingActivityStatus.forPart(TimerStatusPart(12345))
-        OngoingActivity.fromExistingOngoingActivity(context)!!.update(context, newStatus)
+        OngoingActivity.recoverOngoingActivity(context)!!.update(context, newStatus)
 
         // Get the notification and check that the status, and only the status has been updated.
         val notifications = notificationManager.activeNotifications
@@ -341,7 +341,7 @@
 
         // After posting, send an update to the second OA and check the statuses.
         val newStatus2 = OngoingActivityStatus.forPart(TextStatusPart("update2"))
-        OngoingActivity.fromExistingOngoingActivity(context, 2)?.update(context, newStatus2)
+        OngoingActivity.recoverOngoingActivity(context, 2)?.update(context, newStatus2)
 
         assertEquals("status1, update2", getStatuses())
 
diff --git a/wear/wear-phone-interactions/lint-baseline.xml b/wear/wear-phone-interactions/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-phone-interactions/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/authentication/RemoteAuthClient.kt b/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/authentication/RemoteAuthClient.kt
index c547fc7..6dd4162 100644
--- a/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/authentication/RemoteAuthClient.kt
+++ b/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/authentication/RemoteAuthClient.kt
@@ -102,7 +102,7 @@
 
         /**
          * The package name obtained from calling getPackageName() on the context passed into
-         * [.create].
+         * [create].
          * Value type: String
          */
         internal const val KEY_PACKAGE_NAME: String = "packageName"
@@ -115,7 +115,7 @@
 
         /**
          * The error code explaining why the request failed.
-         * Value type: [.ErrorCode]
+         * Value type: [ErrorCode]
          */
         internal const val KEY_ERROR_CODE: String = "errorCode"
 
@@ -142,7 +142,7 @@
         /** Indicates no phone is connected, or the phone connected doesn't support 3p auth */
         public const val ERROR_PHONE_UNAVAILABLE: Int = 1
 
-        /** Errors returned in [.Callback.onAuthorizationError].  */
+        /** Errors returned in [Callback.onAuthorizationError].  */
         @Retention(AnnotationRetention.SOURCE)
         @IntDef(NO_ERROR, ERROR_UNSUPPORTED, ERROR_PHONE_UNAVAILABLE)
         internal annotation class ErrorCode
@@ -194,7 +194,7 @@
         /**
          * Called when an async remote authentication request completes successfully.
          *
-         * see [.sendAuthorizationRequest]
+         * see [sendAuthorizationRequest]
          */
         @UiThread
         public abstract fun onAuthorizationResponse(request: OAuthRequest, response: OAuthResponse)
@@ -202,7 +202,7 @@
         /**
          * Called when an async remote authentication request fails.
          *
-         * see [.sendAuthorizationRequest]
+         * see [sendAuthorizationRequest]
          */
         @UiThread
         public abstract fun onAuthorizationError(@ErrorCode errorCode: Int)
@@ -215,7 +215,7 @@
      * completes.
      *
      * @param request Request that will be sent to the phone. The auth response should redirect
-     * to the Wear OS companion. See [.WEAR_REDIRECT_URL_PREFIX]
+     * to the Wear OS companion. See [WEAR_REDIRECT_URL_PREFIX]
      *
      * @Throws RuntimeException if the service has error to open the request
      */
diff --git a/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/notifications/BridgingConfig.kt b/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/notifications/BridgingConfig.kt
index de2eb7f..86ee414 100644
--- a/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/notifications/BridgingConfig.kt
+++ b/wear/wear-phone-interactions/src/main/java/androidx/wear/phone/interactions/notifications/BridgingConfig.kt
@@ -40,7 +40,7 @@
     public val isBridgingEnabled: Boolean,
     /**
      * The set of excluded tags in the configuration. The bridging mode for these tags is the
-     * opposite of the default mode (returned by [.isBridgingEnabled]).
+     * opposite of the default mode (returned by [isBridgingEnabled]).
      */
     public val excludedTags: MutableSet<String>?
 ) {
diff --git a/wear/wear-remote-interactions/lint-baseline.xml b/wear/wear-remote-interactions/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-remote-interactions/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-client/api/current.txt b/wear/wear-watchface-client/api/current.txt
index 8137255..57cddaa 100644
--- a/wear/wear-watchface-client/api/current.txt
+++ b/wear/wear-watchface-client/api/current.txt
@@ -92,7 +92,7 @@
     method public void displayPressedAnimation(int complicationId);
     method public default Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
-    method public java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> getContentDescriptionLabels();
+    method public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
     method public String getInstanceId();
     method public long getPreviewReferenceTimeMillis();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -106,7 +106,7 @@
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle);
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle);
     property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> complicationsState;
-    property public abstract java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> contentDescriptionLabels;
+    property public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
     property public abstract String instanceId;
     property public abstract long previewReferenceTimeMillis;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
@@ -126,15 +126,6 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
-  public static final class InteractiveWatchFaceClient.ContentDescriptionLabel {
-    ctor public InteractiveWatchFaceClient.ContentDescriptionLabel(androidx.wear.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 CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
-    property public final android.graphics.Rect bounds;
-    property public final android.app.PendingIntent? tapAction;
-  }
-
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
     method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, @Px int surfaceWidth, @Px int surfaceHeight);
     method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
@@ -153,7 +144,7 @@
   }
 
   public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
-    ctor public WatchFaceControlClient.ServiceStartFailureException();
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
   public final class WatchFaceId {
diff --git a/wear/wear-watchface-client/api/public_plus_experimental_current.txt b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
index d04191e..a957fe1 100644
--- a/wear/wear-watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-client/api/public_plus_experimental_current.txt
@@ -92,7 +92,7 @@
     method public void displayPressedAnimation(int complicationId);
     method public default Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
-    method public java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> getContentDescriptionLabels();
+    method public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
     method public String getInstanceId();
     method public long getPreviewReferenceTimeMillis();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -106,7 +106,7 @@
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle);
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle);
     property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> complicationsState;
-    property public abstract java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> contentDescriptionLabels;
+    property public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
     property public abstract String instanceId;
     property public abstract long previewReferenceTimeMillis;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
@@ -126,15 +126,6 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
-  public static final class InteractiveWatchFaceClient.ContentDescriptionLabel {
-    ctor public InteractiveWatchFaceClient.ContentDescriptionLabel(androidx.wear.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 CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
-    property public final android.graphics.Rect bounds;
-    property public final android.app.PendingIntent? tapAction;
-  }
-
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
     method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, @Px int surfaceWidth, @Px int surfaceHeight);
     method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
@@ -153,7 +144,7 @@
   }
 
   public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
-    ctor public WatchFaceControlClient.ServiceStartFailureException();
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
   public final class WatchFaceId {
diff --git a/wear/wear-watchface-client/api/restricted_current.txt b/wear/wear-watchface-client/api/restricted_current.txt
index bce2031..709a25d 100644
--- a/wear/wear-watchface-client/api/restricted_current.txt
+++ b/wear/wear-watchface-client/api/restricted_current.txt
@@ -94,7 +94,7 @@
     method public void displayPressedAnimation(int complicationId);
     method public default Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
-    method public java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> getContentDescriptionLabels();
+    method public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
     method public String getInstanceId();
     method public long getPreviewReferenceTimeMillis();
     method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -108,7 +108,7 @@
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle);
     method public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle);
     property public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> complicationsState;
-    property public abstract java.util.List<androidx.wear.watchface.client.InteractiveWatchFaceClient.ContentDescriptionLabel> contentDescriptionLabels;
+    property public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
     property public abstract String instanceId;
     property public abstract long previewReferenceTimeMillis;
     property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
@@ -128,15 +128,6 @@
     field public static final int TAP_TYPE_UP = 2; // 0x2
   }
 
-  public static final class InteractiveWatchFaceClient.ContentDescriptionLabel {
-    ctor public InteractiveWatchFaceClient.ContentDescriptionLabel(androidx.wear.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 CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
-    property public final android.graphics.Rect bounds;
-    property public final android.app.PendingIntent? tapAction;
-  }
-
   public interface WatchFaceControlClient extends java.lang.AutoCloseable {
     method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, @Px int surfaceWidth, @Px int surfaceHeight);
     method public default static suspend Object? createWatchFaceControlClient(android.content.Context p, String context, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceControlClient> watchFacePackageName);
@@ -155,7 +146,7 @@
   }
 
   public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
-    ctor public WatchFaceControlClient.ServiceStartFailureException();
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
   }
 
   public final class WatchFaceId {
diff --git a/wear/wear-watchface-client/build.gradle b/wear/wear-watchface-client/build.gradle
index 3c29c46..91ad998 100644
--- a/wear/wear-watchface-client/build.gradle
+++ b/wear/wear-watchface-client/build.gradle
@@ -42,8 +42,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
 
     testImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/wear/wear-watchface-client/guava/build.gradle b/wear/wear-watchface-client/guava/build.gradle
index 3c0a1a5..a751ec3 100644
--- a/wear/wear-watchface-client/guava/build.gradle
+++ b/wear/wear-watchface-client/guava/build.gradle
@@ -37,8 +37,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
 }
 
diff --git a/wear/wear-watchface-client/guava/src/androidTest/java/androidx/wear/watchface/ListenableWatchFaceControlClientTest.kt b/wear/wear-watchface-client/guava/src/androidTest/java/androidx/wear/watchface/ListenableWatchFaceControlClientTest.kt
index fbb2ad3..1a39e34 100644
--- a/wear/wear-watchface-client/guava/src/androidTest/java/androidx/wear/watchface/ListenableWatchFaceControlClientTest.kt
+++ b/wear/wear-watchface-client/guava/src/androidTest/java/androidx/wear/watchface/ListenableWatchFaceControlClientTest.kt
@@ -92,6 +92,7 @@
             )
 
         headlessInstance.close()
+        client.close()
     }
 
     @Test
@@ -115,6 +116,7 @@
                 400
             )
         )
+        client.close()
     }
 
     @Test
@@ -161,6 +163,7 @@
             )
 
         interactiveInstance.close()
+        client.close()
     }
 
     @Test
@@ -210,6 +213,7 @@
         headlessInstance3.close()
         headlessInstance2.close()
         headlessInstance1.close()
+        client.close()
     }
 
     @Test
@@ -261,6 +265,7 @@
 
         headlessInstance1.close()
         interactiveInstance.close()
+        client.close()
     }
 
     @Test
@@ -273,6 +278,76 @@
 
         assertNull(client.getInteractiveWatchFaceClientInstance("I do not exist"))
     }
+
+    @Test
+    public fun createWatchFaceControlClient_cancel() {
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        ListenableWatchFaceControlClient.createWatchFaceControlClient(
+            context,
+            context.packageName
+        ).cancel(true)
+
+        // Canceling should not prevent a subsequent createWatchFaceControlClient.
+        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
+            context,
+            context.packageName
+        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(client).isNotNull()
+        client.close()
+    }
+
+    @Test
+    public fun listenableGetOrCreateInteractiveWatchFaceClient_cancel() {
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val client = ListenableWatchFaceControlClient.createWatchFaceControlClient(
+            context,
+            context.packageName
+        ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+
+        client.listenableGetOrCreateInteractiveWatchFaceClient(
+            "listenableTestId",
+            DeviceConfig(
+                false,
+                false,
+                0,
+                0
+            ),
+            WatchUiState(false, 0),
+            null,
+            null
+        ).cancel(true)
+
+        // Canceling should not prevent a subsequent listenableGetOrCreateInteractiveWatchFaceClient
+        val interactiveInstanceFuture =
+            client.listenableGetOrCreateInteractiveWatchFaceClient(
+                "listenableTestId",
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                null,
+                null
+            )
+        val service = object : TestWatchFaceService() {
+            init {
+                attachBaseContext(context)
+            }
+        }
+        service.onCreateEngine().onSurfaceChanged(
+            surfaceHolder,
+            0,
+            surfaceHolder.surfaceFrame.width(),
+            surfaceHolder.surfaceFrame.height()
+        )
+
+        val interactiveInstance = interactiveInstanceFuture.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(interactiveInstance).isNotNull()
+        interactiveInstance.close()
+        client.close()
+    }
 }
 
 public open class TestWatchFaceService : WatchFaceService() {
diff --git a/wear/wear-watchface-client/guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt b/wear/wear-watchface-client/guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
index 112669c..f93f87d 100644
--- a/wear/wear-watchface-client/guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
+++ b/wear/wear-watchface-client/guava/src/main/java/androidx/wear/watchface/client/ListenableWatchFaceControlClient.kt
@@ -28,8 +28,7 @@
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Runnable
-import kotlinx.coroutines.async
-import kotlinx.coroutines.guava.asListenableFuture
+import kotlinx.coroutines.cancel
 import kotlinx.coroutines.launch
 import kotlin.coroutines.CoroutineContext
 
@@ -46,7 +45,7 @@
         watchFaceControlClient.getInteractiveWatchFaceClientInstance(instanceId)
 
     public companion object {
-        private val immediateCoroutineScope = CoroutineScope(
+        internal fun createImmediateCoroutineScope() = CoroutineScope(
             object : CoroutineDispatcher() {
                 override fun dispatch(context: CoroutineContext, block: Runnable) {
                     block.run()
@@ -55,33 +54,29 @@
         )
 
         /**
-         * Returns a [ListenableFuture] for a [ListenableWatchFaceControlClient] which attempts to
-         * connect to a watch face in the android package [watchFacePackageName].
-         * Resolves as [ServiceNotBoundException] if the watch face control service can not
-         * be bound.
+         * Launches a coroutine with a new scope and returns a future that correctly handles
+         * cancellation.
          */
-        @SuppressLint("NewApi") // For ACTION_WATCHFACE_CONTROL_SERVICE
-        @JvmStatic
-        public fun createWatchFaceControlClient(
-            /** Calling application's [Context]. */
-            context: Context,
-            /** The name of the package containing the watch face control service to bind to. */
-            watchFacePackageName: String
-        ): ListenableFuture<ListenableWatchFaceControlClient> {
-            val traceEvent = AsyncTraceEvent(
-                "ListenableWatchFaceControlClient.createWatchFaceControlClient"
-            )
-            val future = ResolvableFuture.create<ListenableWatchFaceControlClient>()
-            immediateCoroutineScope.launch {
+        // TODO(flerda): Move this to a location where it can be shared.
+        internal fun <T> launchFutureCoroutine(
+            traceTag: String,
+            block: suspend CoroutineScope.() -> T
+        ): ListenableFuture<T> {
+            val traceEvent = AsyncTraceEvent(traceTag)
+            val future = ResolvableFuture.create<T>()
+            val coroutineScope = createImmediateCoroutineScope()
+            coroutineScope.launch {
+                // Propagate future cancellation.
+                future.addListener(
+                    {
+                        if (future.isCancelled) {
+                            coroutineScope.cancel()
+                        }
+                    },
+                    { runner -> runner.run() }
+                )
                 try {
-                    future.set(
-                        ListenableWatchFaceControlClient(
-                            WatchFaceControlClient.createWatchFaceControlClient(
-                                context,
-                                watchFacePackageName
-                            )
-                        )
-                    )
+                    future.set(block())
                 } catch (e: Exception) {
                     future.setException(e)
                 } finally {
@@ -90,6 +85,39 @@
             }
             return future
         }
+
+        /**
+         * Returns a [ListenableFuture] for a [ListenableWatchFaceControlClient] which attempts to
+         * connect to a watch face in the android package [watchFacePackageName].
+         * Resolves as [ServiceNotBoundException] if the watch face control service can not
+         * be bound.
+         *
+         * Note the returned future may resolve immediately on the calling thread or it may resolve
+         * asynchronously when the service is connected on a background thread.
+         *
+         * @param context Calling application's [Context].
+         * @param watchFacePackageName Name of the package containing the watch face control
+         * service to bind to.
+         * @return [ListenableFuture]<[ListenableWatchFaceControlClient]> which on success resolves
+         * to a [ListenableWatchFaceControlClient] or throws a [ServiceNotBoundException] if the
+         * watch face control service can not be bound.
+         */
+        @SuppressLint("NewApi") // For ACTION_WATCHFACE_CONTROL_SERVICE
+        @JvmStatic
+        public fun createWatchFaceControlClient(
+            context: Context,
+            watchFacePackageName: String
+        ): ListenableFuture<ListenableWatchFaceControlClient> =
+            launchFutureCoroutine(
+                "ListenableWatchFaceControlClient.createWatchFaceControlClient",
+            ) {
+                ListenableWatchFaceControlClient(
+                    WatchFaceControlClient.createWatchFaceControlClient(
+                        context,
+                        watchFacePackageName
+                    )
+                )
+            }
     }
 
     override fun createHeadlessWatchFaceClient(
@@ -116,15 +144,18 @@
         watchUiState: WatchUiState,
         userStyle: UserStyleData?,
         idToComplicationData: Map<Int, ComplicationData>?
-    ): ListenableFuture<InteractiveWatchFaceClient> = immediateCoroutineScope.async {
-        watchFaceControlClient.getOrCreateInteractiveWatchFaceClient(
-            id,
-            deviceConfig,
-            watchUiState,
-            userStyle,
-            idToComplicationData
-        )
-    }.asListenableFuture()
+    ): ListenableFuture<InteractiveWatchFaceClient> =
+        launchFutureCoroutine(
+            "ListenableWatchFaceControlClient.listenableGetOrCreateInteractiveWatchFaceClient",
+        ) {
+            watchFaceControlClient.getOrCreateInteractiveWatchFaceClient(
+                id,
+                deviceConfig,
+                watchUiState,
+                userStyle,
+                idToComplicationData
+            )
+        }
 
     override suspend fun getOrCreateInteractiveWatchFaceClient(
         id: String,
diff --git a/wear/wear-watchface-client/lint-baseline.xml b/wear/wear-watchface-client/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface-client/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
index cf35008..d61c17d 100644
--- a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/EditorServiceClientTest.kt
@@ -31,11 +31,11 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class EditorServiceClientTest {
+public class EditorServiceClientTest {
     private val editorServiceClient = EditorServiceClientImpl(EditorService.globalEditorService)
 
     @Test
-    fun registerObserver() {
+    public fun registerObserver() {
         lateinit var observedEditorState: EditorState
         val observer = object : EditorListener {
             override fun onEditorStateChanged(editorState: EditorState) {
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt
new file mode 100644
index 0000000..d9f8180
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/SerializationTest.kt
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.client.test
+
+import android.content.ComponentName
+import android.content.Context
+import android.graphics.Color
+import android.graphics.Rect
+import android.os.Parcel
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.wear.complications.SystemProviders
+import androidx.wear.complications.data.ComplicationType
+import androidx.wear.complications.data.LongTextComplicationData
+import androidx.wear.complications.data.ShortTextComplicationData
+import androidx.wear.complications.data.toApiComplicationData
+import androidx.wear.watchface.DrawMode
+import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.client.ComplicationState
+import androidx.wear.watchface.client.WatchFaceId
+import androidx.wear.watchface.client.asApiEditorState
+import androidx.wear.watchface.control.data.ComplicationRenderParams
+import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
+import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
+import androidx.wear.watchface.control.data.WatchFaceRenderParams
+import androidx.wear.watchface.data.ComplicationBoundsType
+import androidx.wear.watchface.data.ComplicationStateWireFormat
+import androidx.wear.watchface.editor.data.EditorStateWireFormat
+import androidx.wear.watchface.style.UserStyleData
+import androidx.wear.watchface.style.WatchFaceLayer
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.Base64
+
+/** Tests that we can deserialize golden resources correctly to ensure backwards compatibility. */
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+public class SerializationTest {
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+
+    private fun <T> loadGoldenResource(resourceId: Int, readFromParcel: (p: Parcel) -> T): T {
+        val resource = context.resources.openRawResource(resourceId)
+        val bytes = Base64.getDecoder().decode(String(resource.readBytes()))
+        val p = Parcel.obtain()
+        p.unmarshall(bytes, 0, bytes.size)
+        p.setDataPosition(0)
+        val result = readFromParcel(p)
+        p.recycle()
+        return result
+    }
+
+    @Test
+    public fun complicationRenderParams() {
+        val deserialized = loadGoldenResource(R.raw.complication_render_params) {
+            ComplicationRenderParams.CREATOR.createFromParcel(it)
+        }
+
+        assertThat(deserialized.complicationId).isEqualTo(123)
+        assertThat(RenderParameters(deserialized.renderParametersWireFormat))
+            .isEqualTo(
+                RenderParameters(
+                    DrawMode.AMBIENT,
+                    WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                    null,
+                )
+            )
+        assertThat(deserialized.calendarTimeMillis).isEqualTo(123456789)
+        assertThat(UserStyleData(deserialized.userStyle!!)).isEqualTo(
+            UserStyleData(mapOf("COLOR_STYLE_SETTING" to "GREEN_STYLE".encodeToByteArray()))
+        )
+
+        val complication =
+            deserialized.complicationData!!.toApiComplicationData() as LongTextComplicationData
+        assertThat(complication.text.getTextAt(context.resources, 0)).isEqualTo("Example")
+        assertThat(complication.title!!.getTextAt(context.resources, 0))
+            .isEqualTo("complication")
+    }
+
+    @Test
+    public fun headlessWatchFaceInstanceParams() {
+        val deserialized = loadGoldenResource(R.raw.headless_watchface_instance_params) {
+            HeadlessWatchFaceInstanceParams.CREATOR.createFromParcel(it)
+        }
+
+        assertThat(deserialized.watchFaceName).isEqualTo(ComponentName("package", "class"))
+        assertThat(deserialized.deviceConfig.hasBurnInProtection).isFalse()
+        assertThat(deserialized.deviceConfig.hasLowBitAmbient).isTrue()
+        assertThat(deserialized.deviceConfig.analogPreviewReferenceTimeMillis).isEqualTo(10)
+        assertThat(deserialized.deviceConfig.digitalPreviewReferenceTimeMillis).isEqualTo(20)
+        assertThat(deserialized.width).isEqualTo(640)
+        assertThat(deserialized.height).isEqualTo(480)
+    }
+
+    @Test
+    public fun wallpaperInteractiveWatchFaceInstanceParams() {
+        val deserialized =
+            loadGoldenResource(R.raw.wallpaper_interactive_watchface_instance_params) {
+                WallpaperInteractiveWatchFaceInstanceParams.CREATOR.createFromParcel(it)
+            }
+
+        assertThat(deserialized.instanceId).isEqualTo("interactiveInstanceId")
+        assertThat(deserialized.idAndComplicationDataWireFormats!!.size).isEqualTo(1)
+        assertThat(deserialized.idAndComplicationDataWireFormats!![0].id).isEqualTo(1)
+
+        val complication =
+            deserialized.idAndComplicationDataWireFormats!![0].complicationData
+                .toApiComplicationData() as LongTextComplicationData
+        assertThat(complication.text.getTextAt(context.resources, 0))
+            .isEqualTo("Test Text")
+        assertThat(complication.title!!.getTextAt(context.resources, 0))
+            .isEqualTo("Test Title")
+
+        assertThat(deserialized.deviceConfig.hasBurnInProtection).isTrue()
+        assertThat(deserialized.deviceConfig.hasLowBitAmbient).isTrue()
+        assertThat(deserialized.deviceConfig.analogPreviewReferenceTimeMillis).isEqualTo(100)
+        assertThat(deserialized.deviceConfig.digitalPreviewReferenceTimeMillis).isEqualTo(200)
+        assertThat(deserialized.watchUiState.inAmbientMode).isFalse()
+        assertThat(deserialized.watchUiState.interruptionFilter).isEqualTo(0)
+        assertThat(UserStyleData(deserialized.userStyle)).isEqualTo(
+            UserStyleData(
+                mapOf(
+                    "COLOR_STYLE_SETTING" to "GREEN_STYLE".encodeToByteArray(),
+                    "WATCH_HAND_STYLE" to "GOTHIC".encodeToByteArray()
+                )
+            )
+        )
+    }
+
+    @Test
+    public fun watchFaceRenderParams() {
+        val deserialized = loadGoldenResource(R.raw.watch_face_render_params) {
+            WatchFaceRenderParams.CREATOR.createFromParcel(it)
+        }
+
+        assertThat(RenderParameters(deserialized.renderParametersWireFormat)).isEqualTo(
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplications,
+                    Color.RED,
+                    Color.argb(128, 0, 0, 0)
+                )
+            )
+        )
+        assertThat(deserialized.calendarTimeMillis).isEqualTo(123456789)
+        assertThat(UserStyleData(deserialized.userStyle!!)).isEqualTo(
+            UserStyleData(
+                mapOf(
+                    "COLOR_STYLE_SETTING" to "RED".encodeToByteArray(),
+                    "NUM_COMPLICATIONS" to "TWO".encodeToByteArray(),
+                )
+            )
+        )
+
+        assertThat(deserialized.idAndComplicationDatumWireFormats!!.size).isEqualTo(2)
+        assertThat(deserialized.idAndComplicationDatumWireFormats!![0].id).isEqualTo(1)
+        val complicationA =
+            deserialized.idAndComplicationDatumWireFormats!![0].complicationData
+                .toApiComplicationData() as LongTextComplicationData
+        assertThat(complicationA.text.getTextAt(context.resources, 0)).isEqualTo("A Text")
+        assertThat(complicationA.title!!.getTextAt(context.resources, 0))
+            .isEqualTo("A Title")
+
+        assertThat(deserialized.idAndComplicationDatumWireFormats!![1].id).isEqualTo(2)
+        val complicationB =
+            deserialized.idAndComplicationDatumWireFormats!![1].complicationData
+                .toApiComplicationData() as ShortTextComplicationData
+        assertThat(complicationB.text.getTextAt(context.resources, 0)).isEqualTo("B Text")
+        assertThat(complicationB.title!!.getTextAt(context.resources, 0))
+            .isEqualTo("B Title")
+    }
+
+    @Test
+    public fun complicationState() {
+        val deserialized = loadGoldenResource(R.raw.complication_state) {
+            ComplicationState(ComplicationStateWireFormat.CREATOR.createFromParcel(it))
+        }
+
+        assertThat(deserialized.bounds).isEqualTo(Rect(1, 2, 3, 4))
+        assertThat(deserialized.boundsType).isEqualTo(ComplicationBoundsType.ROUND_RECT)
+        assertThat(deserialized.supportedTypes).containsExactly(
+            ComplicationType.LONG_TEXT, ComplicationType.SHORT_TEXT
+        )
+        assertThat(deserialized.defaultProviderPolicy.systemProviderFallback).isEqualTo(
+            SystemProviders.PROVIDER_DAY_AND_DATE
+        )
+        assertThat(deserialized.defaultProviderPolicy.primaryProvider).isEqualTo(
+            ComponentName("a", "b")
+        )
+        assertThat(deserialized.defaultProviderPolicy.secondaryProvider).isNull()
+        assertThat(deserialized.currentType).isEqualTo(ComplicationType.SHORT_TEXT)
+        assertThat(deserialized.isEnabled).isTrue()
+        assertThat(deserialized.isInitiallyEnabled).isFalse()
+        assertThat(deserialized.fixedComplicationProvider).isFalse()
+        assertThat(deserialized.complicationConfigExtras.getInt("keyA")).isEqualTo(100)
+    }
+
+    @Test
+    public fun editorState() {
+        val deserialized = loadGoldenResource(R.raw.editor_state) {
+            EditorStateWireFormat.CREATOR.createFromParcel(it).asApiEditorState()
+        }
+
+        assertThat(deserialized.watchFaceId).isEqualTo(WatchFaceId("id-1"))
+        assertThat(deserialized.userStyle).isEqualTo(
+            UserStyleData(
+                mapOf(
+                    "COLOR_STYLE_SETTING" to "BLUE".encodeToByteArray(),
+                    "NUM_COMPLICATIONS" to "THREE".encodeToByteArray(),
+                )
+            )
+        )
+        assertThat(deserialized.shouldCommitChanges).isTrue()
+
+        val complicationA = deserialized.previewComplicationsData[10] as ShortTextComplicationData
+        val complicationB = deserialized.previewComplicationsData[20] as LongTextComplicationData
+        assertThat(complicationA.text.getTextAt(context.resources, 0)).isEqualTo("Mon")
+        assertThat(complicationA.title!!.getTextAt(context.resources, 0)).isEqualTo("23rd")
+        assertThat(complicationB.text.getTextAt(context.resources, 0)).isEqualTo("Example")
+        assertThat(complicationB.title!!.getTextAt(context.resources, 0)).isEqualTo("complication")
+    }
+
+    @Test
+    public fun userStyleSchema() {
+        // TODO(b/187498135): Implement a golden test. This is harder than it sounds because the raw
+        // bytes of  a serialized Parcel is not portable and can differ between architectures even
+        // on the same API level.  The tests above possibly only pass on current bots by luck.
+    }
+}
diff --git a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index bfb35dd..c846361 100644
--- a/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/wear-watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -32,13 +32,17 @@
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
 import androidx.wear.complications.SystemProviders
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.ContentDescriptionLabel
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.LayerMode
 import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceService
+import androidx.wear.watchface.WatchState
 import androidx.wear.watchface.client.DeviceConfig
 import androidx.wear.watchface.client.HeadlessWatchFaceClient
 import androidx.wear.watchface.client.WatchFaceControlClient
@@ -55,10 +59,10 @@
 import androidx.wear.watchface.samples.GREEN_STYLE
 import androidx.wear.watchface.samples.NO_COMPLICATIONS
 import androidx.wear.watchface.samples.WATCH_HAND_LENGTH_STYLE_SETTING
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.style.UserStyleData
 import androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
-import androidx.wear.watchface.style.UserStyleData
+import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.async
 import kotlinx.coroutines.runBlocking
@@ -67,6 +71,7 @@
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
+import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -78,6 +83,7 @@
 import java.util.concurrent.TimeUnit
 
 private const val CONNECT_TIMEOUT_MILLIS = 500L
+private const val DESTROY_TIMEOUT_MILLIS = 500L
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
@@ -115,7 +121,12 @@
     @After
     public fun tearDown() {
         if (this::engine.isInitialized) {
-            engine.onDestroy()
+            val latch = CountDownLatch(1)
+            handler.post {
+                engine.onDestroy()
+                latch.countDown()
+            }
+            latch.await(DESTROY_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
         }
         service.close()
     }
@@ -140,12 +151,16 @@
 
     private val complications = mapOf(
         EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
-            ShortTextComplicationData.Builder(PlainComplicationText.Builder("ID").build())
-                .setTitle(PlainComplicationText.Builder("Left").build())
+            ShortTextComplicationData.Builder(
+                PlainComplicationText.Builder("ID").build(),
+                ComplicationText.EMPTY
+            ).setTitle(PlainComplicationText.Builder("Left").build())
                 .build(),
         EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
-            ShortTextComplicationData.Builder(PlainComplicationText.Builder("ID").build())
-                .setTitle(PlainComplicationText.Builder("Right").build())
+            ShortTextComplicationData.Builder(
+                PlainComplicationText.Builder("ID").build(),
+                ComplicationText.EMPTY
+            ).setTitle(PlainComplicationText.Builder("Right").build())
                 .build()
     )
 
@@ -182,9 +197,8 @@
         val bitmap = headlessInstance.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                RenderParameters.DRAW_ALL_LAYERS,
-                null,
-                Color.RED
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                null
             ),
             1234567,
             null,
@@ -215,13 +229,12 @@
         val bitmap = headlessInstance.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                mapOf(
-                    Layer.BASE to LayerMode.DRAW,
-                    Layer.COMPLICATIONS to LayerMode.DRAW_OUTLINED,
-                    Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-                ),
-                null,
-                Color.YELLOW
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplications,
+                    Color.YELLOW,
+                    Color.argb(128, 0, 0, 0) // Darken everything else.
+                )
             ),
             1234567,
             null,
@@ -234,6 +247,42 @@
     }
 
     @Test
+    public fun highlightOnlyLayer() {
+        val headlessInstance = service.createHeadlessWatchFaceClient(
+            ComponentName(
+                "androidx.wear.watchface.samples.test",
+                "androidx.wear.watchface.samples.ExampleCanvasAnalogWatchFaceService"
+            ),
+            DeviceConfig(
+                false,
+                false,
+                0,
+                0
+            ),
+            400,
+            400
+        )!!
+        val bitmap = headlessInstance.renderWatchFaceToBitmap(
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                emptySet(),
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplications,
+                    Color.YELLOW,
+                    Color.argb(128, 0, 0, 0) // Darken everything else.
+                )
+            ),
+            1234567,
+            null,
+            complications
+        )
+
+        bitmap.assertAgainstGolden(screenshotRule, "highlightOnlyLayer")
+
+        headlessInstance.close()
+    }
+
+    @Test
     public fun headlessComplicationDetails() {
         val headlessInstance = service.createHeadlessWatchFaceClient(
             exampleWatchFaceComponentName,
@@ -250,7 +299,7 @@
         assertThat(leftComplicationDetails.bounds).isEqualTo(Rect(80, 160, 160, 240))
         assertThat(leftComplicationDetails.boundsType).isEqualTo(ComplicationBoundsType.ROUND_RECT)
         assertThat(leftComplicationDetails.defaultProviderPolicy.systemProviderFallback).isEqualTo(
-            SystemProviders.DAY_OF_WEEK
+            SystemProviders.PROVIDER_DAY_OF_WEEK
         )
         assertThat(leftComplicationDetails.defaultProviderType).isEqualTo(
             ComplicationType.SHORT_TEXT
@@ -270,7 +319,7 @@
         assertThat(rightComplicationDetails.bounds).isEqualTo(Rect(240, 160, 320, 240))
         assertThat(rightComplicationDetails.boundsType).isEqualTo(ComplicationBoundsType.ROUND_RECT)
         assertThat(rightComplicationDetails.defaultProviderPolicy.systemProviderFallback).isEqualTo(
-            SystemProviders.STEP_COUNT
+            SystemProviders.PROVIDER_STEP_COUNT
         )
         assertThat(rightComplicationDetails.defaultProviderType).isEqualTo(
             ComplicationType.SHORT_TEXT
@@ -349,9 +398,8 @@
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                RenderParameters.DRAW_ALL_LAYERS,
-                null,
-                Color.RED
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                null
             ),
             1234567,
             null,
@@ -394,9 +442,8 @@
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                RenderParameters.DRAW_ALL_LAYERS,
-                null,
-                Color.RED
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                null
             ),
             1234567,
             null,
@@ -433,11 +480,13 @@
             mapOf(
                 EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID to
                     ShortTextComplicationData.Builder(
-                        PlainComplicationText.Builder("Test").build()
+                        PlainComplicationText.Builder("Test").build(),
+                        ComplicationText.EMPTY
                     ).build(),
                 EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
                     LongTextComplicationData.Builder(
-                        PlainComplicationText.Builder("Test").build()
+                        PlainComplicationText.Builder("Test").build(),
+                        ComplicationText.EMPTY
                     ).build()
             )
         )
@@ -450,7 +499,7 @@
         assertThat(leftComplicationDetails.bounds).isEqualTo(Rect(80, 160, 160, 240))
         assertThat(leftComplicationDetails.boundsType).isEqualTo(ComplicationBoundsType.ROUND_RECT)
         assertThat(leftComplicationDetails.defaultProviderPolicy.systemProviderFallback).isEqualTo(
-            SystemProviders.DAY_OF_WEEK
+            SystemProviders.PROVIDER_DAY_OF_WEEK
         )
         assertThat(leftComplicationDetails.defaultProviderType).isEqualTo(
             ComplicationType.SHORT_TEXT
@@ -473,7 +522,7 @@
         assertThat(rightComplicationDetails.bounds).isEqualTo(Rect(240, 160, 320, 240))
         assertThat(rightComplicationDetails.boundsType).isEqualTo(ComplicationBoundsType.ROUND_RECT)
         assertThat(rightComplicationDetails.defaultProviderPolicy.systemProviderFallback).isEqualTo(
-            SystemProviders.STEP_COUNT
+            SystemProviders.PROVIDER_STEP_COUNT
         )
         assertThat(rightComplicationDetails.defaultProviderType).isEqualTo(
             ComplicationType.SHORT_TEXT
@@ -619,6 +668,78 @@
     }
 
     @Test
+    public fun additionalContentDescriptionLabels(): Unit = runBlocking {
+        val deferredInteractiveInstance = async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+
+        // Create the engine which triggers creation of InteractiveWatchFaceClient.
+        async { createEngine() }
+
+        // Wait for the instance to be created.
+        withTimeout(CONNECT_TIMEOUT_MILLIS) {
+            deferredInteractiveInstance.await()
+        }
+
+        // Add some additional ContentDescriptionLabels
+        wallpaperService.watchFace.renderer.additionalContentDescriptionLabels = listOf(
+            Pair(
+                0,
+                ContentDescriptionLabel(
+                    PlainComplicationText.Builder("Before").build(),
+                    Rect(10, 10, 20, 20),
+                    null
+                )
+            ),
+            Pair(
+                20000,
+                ContentDescriptionLabel(
+                    PlainComplicationText.Builder("After").build(),
+                    Rect(30, 30, 40, 40),
+                    null
+                )
+            )
+        )
+
+        val sysUiInterface =
+            service.getInteractiveWatchFaceClientInstance("testId")!!
+
+        val contentDescriptionLabels = sysUiInterface.contentDescriptionLabels
+        assertThat(contentDescriptionLabels.size).isEqualTo(5)
+
+        // Central clock element. Note we don't know the timezone this test will be running in
+        // so we can't assert the contents of the clock's test.
+        assertThat(contentDescriptionLabels[0].bounds).isEqualTo(Rect(100, 100, 300, 300))
+        assertThat(contentDescriptionLabels[0].getTextAt(context.resources, 0).isNotEmpty())
+
+        // First additional ContentDescriptionLabel.
+        assertThat(contentDescriptionLabels[1].bounds).isEqualTo(Rect(10, 10, 20, 20))
+        assertThat(contentDescriptionLabels[1].getTextAt(context.resources, 0))
+            .isEqualTo("Before")
+
+        // Left complication.
+        assertThat(contentDescriptionLabels[2].bounds).isEqualTo(Rect(80, 160, 160, 240))
+        assertThat(contentDescriptionLabels[2].getTextAt(context.resources, 0))
+            .isEqualTo("ID Left")
+
+        // Right complication.
+        assertThat(contentDescriptionLabels[3].bounds).isEqualTo(Rect(240, 160, 320, 240))
+        assertThat(contentDescriptionLabels[3].getTextAt(context.resources, 0))
+            .isEqualTo("ID Right")
+
+        // Second additional ContentDescriptionLabel.
+        assertThat(contentDescriptionLabels[4].bounds).isEqualTo(Rect(30, 30, 40, 40))
+        assertThat(contentDescriptionLabels[4].getTextAt(context.resources, 0))
+            .isEqualTo("After")
+    }
+
+    @Test
     public fun updateInstance(): Unit = runBlocking {
         val deferredInteractiveInstance = async {
             service.getOrCreateInteractiveWatchFaceClient(
@@ -681,9 +802,8 @@
         val bitmap = interactiveInstance.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                RenderParameters.DRAW_ALL_LAYERS,
-                null,
-                Color.RED
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                null
             ),
             1234567,
             null,
@@ -726,16 +846,76 @@
         )
         interactiveInstance.close()
     }
+
+    @Test
+    public fun crashingWatchFace(): Unit = runBlocking {
+        val wallpaperService = TestCrashingWatchFaceService(context)
+
+        // Create the engine which triggers the crashing watchface
+        async {
+            handler.post {
+                engine = wallpaperService.onCreateEngine()
+                engine.onSurfaceChanged(
+                    surfaceHolder,
+                    0,
+                    surfaceHolder.surfaceFrame.width(),
+                    surfaceHolder.surfaceFrame.height()
+                )
+            }
+        }
+
+        try {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+            fail("Expected an exception to be thrown because the watchface crashed on init")
+        } catch (e: Exception) {
+            assertThat(e).isInstanceOf(
+                WatchFaceControlClient.ServiceStartFailureException::class.java
+            )
+            assertThat(e).hasMessageThat().contains("Watchface crashed during init")
+            assertThat(e).hasMessageThat().contains("exceptionMessage: Deliberately crashing")
+        }
+    }
 }
 
 internal class TestExampleCanvasAnalogWatchFaceService(
     testContext: Context,
     private var surfaceHolderOverride: SurfaceHolder
 ) : ExampleCanvasAnalogWatchFaceService() {
+    internal lateinit var watchFace: WatchFace
 
     init {
         attachBaseContext(testContext)
     }
 
     override fun getWallpaperSurfaceHolderOverride() = surfaceHolderOverride
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState
+    ): WatchFace {
+        watchFace = super.createWatchFace(surfaceHolder, watchState)
+        return watchFace
+    }
 }
+
+internal class TestCrashingWatchFaceService(
+    testContext: Context
+) : WatchFaceService() {
+
+    init {
+        attachBaseContext(testContext)
+    }
+
+    override suspend fun createWatchFace(
+        surfaceHolder: SurfaceHolder,
+        watchState: WatchState
+    ): WatchFace {
+        throw Exception("Deliberately crashing")
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/complication_render_params b/wear/wear-watchface-client/src/androidTest/res/raw/complication_render_params
new file mode 100644
index 0000000..c505053
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/complication_render_params
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAARwAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGMAbwBuAHQAcgBvAGwALgBkAGEAdABhAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AUgBlAG4AZABlAHIAUABhAHIAYQBtAHMAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAwAAAABAAAAewAAAOQAAAACAAAAQQAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGQAYQB0AGEALgBSAGUAbgBkAGUAcgBQAGEAcgBhAG0AZQB0AGUAcgBzAFcAaQByAGUARgBvAHIAbQBhAHQAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAwAAAABAAAAAwAAAAwAAAACAAAABwAAAAwAAAADAAAAAAAAAAwAAAAEAAAAAAAAAAwAAAAFAAAA/////wwAAAAGAAAAAAAA/wwAAAAHAAAAAAAA/xAAAAAEAAAAFc1bBwAAAACAAgAABQAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAAAABAAAAPgBAABCTkRMAwAAAAkAAABMAE8ATgBHAF8AVABFAFgAVAAAAAQAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AVABlAHgAdAAAAEgAAABCTkRMAQAAABIAAABzAHUAcgByAG8AdQBuAGQAaQBuAGcAXwBzAHQAcgBpAG4AZwAAAAAAAAAAAAcAAABFAHgAYQBtAHAAbABlAAAACgAAAEwATwBOAEcAXwBUAEkAVABMAEUAAAAAAAQAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AVABlAHgAdAAAAFQAAABCTkRMAQAAABIAAABzAHUAcgByAG8AdQBuAGQAaQBuAGcAXwBzAHQAcgBpAG4AZwAAAAAAAAAAAAwAAABjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgAAAAAACwAAAEkATQBBAEcARQBfAFMAVABZAEwARQAAAAEAAAABAAAAFAEAAAYAAABAAAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AcwB0AHkAbABlAC4AZABhAHQAYQAuAFUAcwBlAHIAUwB0AHkAbABlAFcAaQByAGUARgBvAHIAbQBhAHQAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAAAhAAAAAEAAAABAAAAAQAAAAQAAAATAAAAQwBPAEwATwBSAF8AUwBUAFkATABFAF8AUwBFAFQAVABJAE4ARwAAAAEAAAADAAAAAgAAAFsAQgAAAAAAJgAAACYAAACs7QAFdXIAAltCrPMX+AYIVOACAAB4cAAAAAtHUkVFTl9TVFlMRQAA
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/complication_state b/wear/wear-watchface-client/src/androidTest/res/raw/complication_state
new file mode 100644
index 0000000..6d3e94f
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/complication_state
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAAQgAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGQAYQB0AGEALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBTAHQAYQB0AGUAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAABIAAAAAQAAABUAAABhAG4AZAByAG8AaQBkAC4AZwByAGEAcABoAGkAYwBzAC4AUgBlAGMAdAAAAAEAAAACAAAAAwAAAAQAAAAMAAAACgAAAAAAAAAsAAAACwAAABwAAABCTkRMAQAAAAQAAABrAGUAeQBBAAAAAAABAAAAZAAAAAwAAAACAAAAAAAAABQAAAADAAAAAgAAAAQAAAADAAAAYAAAAAQAAAABAAAAAgAAAB0AAABhAG4AZAByAG8AaQBkAC4AYwBvAG4AdABlAG4AdAAuAEMAbwBtAHAAbwBuAGUAbgB0AE4AYQBtAGUAAAABAAAAYQAAAAEAAABiAAAADAAAAAUAAAAQAAAADAAAAAYAAAAEAAAADAAAAAcAAAABAAAADAAAAAgAAAAAAAAADAAAAAkAAAADAAAA
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/editor_state b/wear/wear-watchface-client/src/androidTest/res/raw/editor_state
new file mode 100644
index 0000000..41b15da
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/editor_state
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAAQwAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGUAZABpAHQAbwByAC4AZABhAHQAYQAuAEUAZABpAHQAbwByAFMAdABhAHQAZQBXAGkAcgBlAEYAbwByAG0AYQB0AFAAYQByAGMAZQBsAGkAegBlAHIAAAAYAAAAAQAAAAQAAABpAGQALQAxAAAAAABoAQAAAgAAAEAAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBzAHQAeQBsAGUALgBkAGEAdABhAC4AVQBzAGUAcgBTAHQAeQBsAGUAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAADYAAAAAQAAAAIAAAACAAAABAAAABMAAABDAE8ATABPAFIAXwBTAFQAWQBMAEUAXwBTAEUAVABUAEkATgBHAAAAEQAAAE4AVQBNAF8AQwBPAE0AUABMAEkAQwBBAFQASQBPAE4AUwAAAAIAAAADAAAAAgAAAFsAQgAAAAAAHwAAAB8AAACs7QAFdXIAAltCrPMX+AYIVOACAAB4cAAAAARCTFVFAAIAAABbAEIAAAAAACAAAAAgAAAArO0ABXVyAAJbQqzzF/gGCFTgAgAAeHAAAAAFVEhSRUXABwAAAwAAAAIAAAACAAAAPAAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGQAYQB0AGEALgBJAGQAQQBuAGQAQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4ARABhAHQAYQBXAGkAcgBlAEYAbwByAG0AYQB0AAAAAAAnAAAAYQBuAGQAcgBvAGkAZAB4AC4AdgBlAHIAcwBpAG8AbgBlAGQAcABhAHIAYwBlAGwAYQBiAGwAZQAuAFAAYQByAGMAZQBsAEkAbQBwAGwAAABGAAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAEkAZABBAG4AZABDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAFcAaQByAGUARgBvAHIAbQBhAHQAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAAADAAAAAEAAAAKAAAASAIAAAIAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4ARABhAHQAYQAAAAMAAADAAQAAQk5ETAIAAAALAAAAUwBIAE8AUgBUAF8AVABJAFQATABFAAAABAAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBUAGUAeAB0AAAARAAAAEJOREwBAAAAEgAAAHMAdQByAHIAbwB1AG4AZABpAG4AZwBfAHMAdAByAGkAbgBnAAAAAAAAAAAABAAAADIAMwByAGQAAAAAAAoAAABTAEgATwBSAFQAXwBUAEUAWABUAAAAAAAEAAAANwAAAGEAbgBkAHIAbwBpAGQALgBzAHUAcABwAG8AcgB0AC4AdwBlAGEAcgBhAGIAbABlAC4AYwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AcwAuAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAFQAZQB4AHQAAABAAAAAQk5ETAEAAAASAAAAcwB1AHIAcgBvAHUAbgBkAGkAbgBnAF8AcwB0AHIAaQBuAGcAAAAAAAAAAAADAAAATQBvAG4AAAA8AAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAEkAZABBAG4AZABDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAFcAaQByAGUARgBvAHIAbQBhAHQAAAAAACcAAABhAG4AZAByAG8AaQBkAHgALgB2AGUAcgBzAGkAbwBuAGUAZABwAGEAcgBjAGUAbABhAGIAbABlAC4AUABhAHIAYwBlAGwASQBtAHAAbAAAAEYAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBkAGEAdABhAC4ASQBkAEEAbgBkAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAEQAYQB0AGEAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAAAMAAAAAQAAABQAAACAAgAAAgAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAAAABAAAAPgBAABCTkRMAwAAAAkAAABMAE8ATgBHAF8AVABFAFgAVAAAAAQAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AVABlAHgAdAAAAEgAAABCTkRMAQAAABIAAABzAHUAcgByAG8AdQBuAGQAaQBuAGcAXwBzAHQAcgBpAG4AZwAAAAAAAAAAAAcAAABFAHgAYQBtAHAAbABlAAAACgAAAEwATwBOAEcAXwBUAEkAVABMAEUAAAAAAAQAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AVABlAHgAdAAAAFQAAABCTkRMAQAAABIAAABzAHUAcgByAG8AdQBuAGQAaQBuAGcAXwBzAHQAcgBpAG4AZwAAAAAAAAAAAAwAAABjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgAAAAAACwAAAEkATQBBAEcARQBfAFMAVABZAEwARQAAAAEAAAABAAAADAAAAAQAAAABAAAA
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/headless_watchface_instance_params b/wear/wear-watchface-client/src/androidTest/res/raw/headless_watchface_instance_params
new file mode 100644
index 0000000..e4c4ec5
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/headless_watchface_instance_params
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAATgAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGMAbwBuAHQAcgBvAGwALgBkAGEAdABhAC4ASABlAGEAZABsAGUAcwBzAFcAYQB0AGMAaABGAGEAYwBlAEkAbgBzAHQAYQBuAGMAZQBQAGEAcgBhAG0AcwBQAGEAcgBjAGUAbABpAHoAZQByAAAAAABsAAAAAQAAAB0AAABhAG4AZAByAG8AaQBkAC4AYwBvAG4AdABlAG4AdAAuAEMAbwBtAHAAbwBuAGUAbgB0AE4AYQBtAGUAAAAHAAAAcABhAGMAawBhAGcAZQAAAAUAAABjAGwAYQBzAHMAAACsAAAAAgAAADMAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBkAGEAdABhAC4ARABlAHYAaQBjAGUAQwBvAG4AZgBpAGcAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAwAAAABAAAAAQAAAAwAAAACAAAAAAAAABAAAAAEAAAACgAAAAAAAAAQAAAABQAAABQAAAAAAAAADAAAAAMAAACAAgAADAAAAAQAAADgAQAA
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/wallpaper_interactive_watchface_instance_params b/wear/wear-watchface-client/src/androidTest/res/raw/wallpaper_interactive_watchface_instance_params
new file mode 100644
index 0000000..ab9284a
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/wallpaper_interactive_watchface_instance_params
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAAWgAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGMAbwBuAHQAcgBvAGwALgBkAGEAdABhAC4AVwBhAGwAbABwAGEAcABlAHIASQBuAHQAZQByAGEAYwB0AGkAdgBlAFcAYQB0AGMAaABGAGEAYwBlAEkAbgBzAHQAYQBuAGMAZQBQAGEAcgBhAG0AcwBQAGEAcgBjAGUAbABpAHoAZQByAAAAAAA4AAAAAQAAABUAAABpAG4AdABlAHIAYQBjAHQAaQB2AGUASQBuAHMAdABhAG4AYwBlAEkAZAAAAAQEAABkAAAAAQAAAAIAAAA8AAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAEkAZABBAG4AZABDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAFcAaQByAGUARgBvAHIAbQBhAHQAAAAAACcAAABhAG4AZAByAG8AaQBkAHgALgB2AGUAcgBzAGkAbwBuAGUAZABwAGEAcgBjAGUAbABhAGIAbABlAC4AUABhAHIAYwBlAGwASQBtAHAAbAAAAEYAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBkAGEAdABhAC4ASQBkAEEAbgBkAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAEQAYQB0AGEAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAAAMAAAAAQAAAAEAAACAAgAAAgAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAAAABAAAAPgBAABCTkRMAwAAAAkAAABMAE8ATgBHAF8AVABFAFgAVAAAAAQAAAA3AAAAYQBuAGQAcgBvAGkAZAAuAHMAdQBwAHAAbwByAHQALgB3AGUAYQByAGEAYgBsAGUALgBjAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBzAC4AQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AVABlAHgAdAAAAEwAAABCTkRMAQAAABIAAABzAHUAcgByAG8AdQBuAGQAaQBuAGcAXwBzAHQAcgBpAG4AZwAAAAAAAAAAAAkAAABUAGUAcwB0ACAAVABlAHgAdAAAAAoAAABMAE8ATgBHAF8AVABJAFQATABFAAAAAAAEAAAANwAAAGEAbgBkAHIAbwBpAGQALgBzAHUAcABwAG8AcgB0AC4AdwBlAGEAcgBhAGIAbABlAC4AYwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AcwAuAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAFQAZQB4AHQAAABQAAAAQk5ETAEAAAASAAAAcwB1AHIAcgBvAHUAbgBkAGkAbgBnAF8AcwB0AHIAaQBuAGcAAAAAAAAAAAAKAAAAVABlAHMAdAAgAFQAaQB0AGwAZQAAAAAACwAAAEkATQBBAEcARQBfAFMAVABZAEwARQAAAAEAAAABAAAArAAAAAIAAAAzAAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAEQAZQB2AGkAYwBlAEMAbwBuAGYAaQBnAFAAYQByAGMAZQBsAGkAegBlAHIAAAAMAAAAAQAAAAEAAAAMAAAAAgAAAAEAAAAQAAAABAAAAGQAAAAAAAAAEAAAAAUAAADIAAAAAAAAAIwAAAADAAAAMwAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGQAYQB0AGEALgBXAGEAdABjAGgAVQBpAFMAdABhAHQAZQBQAGEAcgBjAGUAbABpAHoAZQByAAAADAAAAAEAAAAAAAAADAAAAAIAAAAAAAAAdAEAAAQAAABAAAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AcwB0AHkAbABlAC4AZABhAHQAYQAuAFUAcwBlAHIAUwB0AHkAbABlAFcAaQByAGUARgBvAHIAbQBhAHQAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAAA5AAAAAEAAAACAAAAAgAAAAQAAAATAAAAQwBPAEwATwBSAF8AUwBUAFkATABFAF8AUwBFAFQAVABJAE4ARwAAABAAAABXAEEAVABDAEgAXwBIAEEATgBEAF8AUwBUAFkATABFAAAAAAACAAAAAwAAAAIAAABbAEIAAAAAACYAAAAmAAAArO0ABXVyAAJbQqzzF/gGCFTgAgAAeHAAAAALR1JFRU5fU1RZTEUAAAIAAABbAEIAAAAAACEAAAAhAAAArO0ABXVyAAJbQqzzF/gGCFTgAgAAeHAAAAAGR09USElDAAAA
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/androidTest/res/raw/watch_face_render_params b/wear/wear-watchface-client/src/androidTest/res/raw/watch_face_render_params
new file mode 100644
index 0000000..5a3c319
--- /dev/null
+++ b/wear/wear-watchface-client/src/androidTest/res/raw/watch_face_render_params
@@ -0,0 +1 @@
+JwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAARAAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGMAbwBuAHQAcgBvAGwALgBkAGEAdABhAC4AVwBhAHQAYwBoAEYAYQBjAGUAUgBlAG4AZABlAHIAUABhAHIAYQBtAHMAUABhAHIAYwBlAGwAaQB6AGUAcgAAAAAA5AAAAAEAAABBAAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAFIAZQBuAGQAZQByAFAAYQByAGEAbQBlAHQAZQByAHMAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAADAAAAAEAAAAAAAAADAAAAAIAAAAHAAAADAAAAAMAAAABAAAADAAAAAQAAAAAAAAADAAAAAUAAAD/////DAAAAAYAAAAAAP//DAAAAAcAAAAAAACAwAcAAGQAAAACAAAAAgAAADwAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBkAGEAdABhAC4ASQBkAEEAbgBkAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAEQAYQB0AGEAVwBpAHIAZQBGAG8AcgBtAGEAdAAAAAAAJwAAAGEAbgBkAHIAbwBpAGQAeAAuAHYAZQByAHMAaQBvAG4AZQBkAHAAYQByAGMAZQBsAGEAYgBsAGUALgBQAGEAcgBjAGUAbABJAG0AcABsAAAARgAAAGEAbgBkAHIAbwBpAGQAeAAuAHcAZQBhAHIALgB3AGEAdABjAGgAZgBhAGMAZQAuAGQAYQB0AGEALgBJAGQAQQBuAGQAQwBvAG0AcABsAGkAYwBhAHQAaQBvAG4ARABhAHQAYQBXAGkAcgBlAEYAbwByAG0AYQB0AFAAYQByAGMAZQBsAGkAegBlAHIAAAAAAAwAAAABAAAAAQAAAHQCAAACAAAANwAAAGEAbgBkAHIAbwBpAGQALgBzAHUAcABwAG8AcgB0AC4AdwBlAGEAcgBhAGIAbABlAC4AYwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AcwAuAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAEQAYQB0AGEAAAAEAAAA7AEAAEJOREwDAAAACQAAAEwATwBOAEcAXwBUAEUAWABUAAAABAAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBUAGUAeAB0AAAASAAAAEJOREwBAAAAEgAAAHMAdQByAHIAbwB1AG4AZABpAG4AZwBfAHMAdAByAGkAbgBnAAAAAAAAAAAABgAAAEEAIABUAGUAeAB0AAAAAAAKAAAATABPAE4ARwBfAFQASQBUAEwARQAAAAAABAAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBUAGUAeAB0AAAASAAAAEJOREwBAAAAEgAAAHMAdQByAHIAbwB1AG4AZABpAG4AZwBfAHMAdAByAGkAbgBnAAAAAAAAAAAABwAAAEEAIABUAGkAdABsAGUAAAALAAAASQBNAEEARwBFAF8AUwBUAFkATABFAAAAAQAAAAEAAAA8AAAAYQBuAGQAcgBvAGkAZAB4AC4AdwBlAGEAcgAuAHcAYQB0AGMAaABmAGEAYwBlAC4AZABhAHQAYQAuAEkAZABBAG4AZABDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAFcAaQByAGUARgBvAHIAbQBhAHQAAAAAACcAAABhAG4AZAByAG8AaQBkAHgALgB2AGUAcgBzAGkAbwBuAGUAZABwAGEAcgBjAGUAbABhAGIAbABlAC4AUABhAHIAYwBlAGwASQBtAHAAbAAAAEYAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBkAGEAdABhAC4ASQBkAEEAbgBkAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAEQAYQB0AGEAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAAAMAAAAAQAAAAIAAABUAgAAAgAAADcAAABhAG4AZAByAG8AaQBkAC4AcwB1AHAAcABvAHIAdAAuAHcAZQBhAHIAYQBiAGwAZQAuAGMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAHMALgBDAG8AbQBwAGwAaQBjAGEAdABpAG8AbgBEAGEAdABhAAAAAwAAAMwBAABCTkRMAgAAAAsAAABTAEgATwBSAFQAXwBUAEkAVABMAEUAAAAEAAAANwAAAGEAbgBkAHIAbwBpAGQALgBzAHUAcABwAG8AcgB0AC4AdwBlAGEAcgBhAGIAbABlAC4AYwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AcwAuAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAFQAZQB4AHQAAABIAAAAQk5ETAEAAAASAAAAcwB1AHIAcgBvAHUAbgBkAGkAbgBnAF8AcwB0AHIAaQBuAGcAAAAAAAAAAAAHAAAAQgAgAFQAaQB0AGwAZQAAAAoAAABTAEgATwBSAFQAXwBUAEUAWABUAAAAAAAEAAAANwAAAGEAbgBkAHIAbwBpAGQALgBzAHUAcABwAG8AcgB0AC4AdwBlAGEAcgBhAGIAbABlAC4AYwBvAG0AcABsAGkAYwBhAHQAaQBvAG4AcwAuAEMAbwBtAHAAbABpAGMAYQB0AGkAbwBuAFQAZQB4AHQAAABIAAAAQk5ETAEAAAASAAAAcwB1AHIAcgBvAHUAbgBkAGkAbgBnAF8AcwB0AHIAaQBuAGcAAAAAAAAAAAAGAAAAQgAgAFQAZQB4AHQAAAAAABAAAAADAAAAFc1bBwAAAABoAQAABQAAAEAAAABhAG4AZAByAG8AaQBkAHgALgB3AGUAYQByAC4AdwBhAHQAYwBoAGYAYQBjAGUALgBzAHQAeQBsAGUALgBkAGEAdABhAC4AVQBzAGUAcgBTAHQAeQBsAGUAVwBpAHIAZQBGAG8AcgBtAGEAdABQAGEAcgBjAGUAbABpAHoAZQByAAAAAADYAAAAAQAAAAIAAAACAAAABAAAABMAAABDAE8ATABPAFIAXwBTAFQAWQBMAEUAXwBTAEUAVABUAEkATgBHAAAAEQAAAE4AVQBNAF8AQwBPAE0AUABMAEkAQwBBAFQASQBPAE4AUwAAAAIAAAADAAAAAgAAAFsAQgAAAAAAHgAAAB4AAACs7QAFdXIAAltCrPMX+AYIVOACAAB4cAAAAANSRUQAAAIAAABbAEIAAAAAAB4AAAAeAAAArO0ABXVyAAJbQqzzF/gGCFTgAgAAeHAAAAADVFdPAAA=
\ No newline at end of file
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationState.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationState.kt
index 3b1196c..84684ec 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationState.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationState.kt
@@ -25,6 +25,8 @@
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.data.ComplicationStateWireFormat
+import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption
+import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay
 
 /**
  * State of the [Complication].
@@ -36,13 +38,13 @@
  * @param defaultProviderType The default [ComplicationType] for this complication.
  * @param isEnabled Whether or not the complication is currently enabled (i.e. it should be drawn).
  * @param isInitiallyEnabled Whether or not the complication was initially enabled before
- *     considering any [ComplicationsOption] whose [ComplicationOverlay]s may enable or disable
- *     complications.
+ * considering any [ComplicationsOption] whose [ComplicationOverlay]s may enable or disable
+ * complications.
  * @param currentType The [ComplicationType] of the complication's current [ComplicationData].
  * @param fixedComplicationProvider Whether or not the complication provider is fixed (i.e the user
- *      can't configure it).
+ * can't configure it).
  * @param complicationConfigExtras Extras to be merged into the Intent sent when invoking the
- *      provider chooser activity.
+ * provider chooser activity.
  */
 public class ComplicationState(
     public val bounds: Rect,
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
index cf58f8a0..de51b11 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
@@ -22,9 +22,9 @@
  * @param hasLowBitAmbient Whether or not the watch hardware supports low bit ambient support.
  * @param hasBurnInProtection Whether or not the watch hardware supports burn in protection.
  * @param analogPreviewReferenceTimeMillis UTC reference time for screenshots of analog watch faces
- *     in milliseconds since the epoch.
+ * in milliseconds since the epoch.
  * @param digitalPreviewReferenceTimeMillis UTC reference time for screenshots of digital watch
- *     faces in milliseconds since the epoch.
+ * faces in milliseconds since the epoch.
  */
 public class DeviceConfig(
     @get:JvmName("hasLowBitAmbient")
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
index 1f6a7f4..0030f6b 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
@@ -31,7 +31,7 @@
  * use by the WatchFace provider.
  *
  * @param id The system's id for a watch face being edited. This is passed in from
- *     [androidx.wear.watchface.EditorRequest.watchFaceId].
+ * [androidx.wear.watchface.EditorRequest.watchFaceId].
  */
 public class WatchFaceId(public val id: String) {
     override fun equals(other: Any?): Boolean {
@@ -54,15 +54,15 @@
  * The state of the editing session. See [androidx.wear.watchface.editor.EditorSession].
  *
  * @param watchFaceId Unique ID for the instance of the watch face being edited (see
- *     [androidx.wear.watchface.editor.EditorRequest.watchFaceId]), only defined for
- *     Android R and beyond.
+ * [androidx.wear.watchface.editor.EditorRequest.watchFaceId]), only defined for Android R and
+ * beyond.
  * @param userStyle The current [UserStyle] encoded as a [UserStyleData].
  * @param previewComplicationsData Preview [ComplicationData] needed for taking screenshots without
- *     live complication data.
+ * live complication data.
  * @param shouldCommitChanges Whether or not this state should be committed (i.e. the user aborted
- *     the session). If it's not committed then any changes (E.g. complication provider changes)
- *     should be abandoned. There's no need to resend the style to the watchface because the
- *     library will have restored the previous style.
+ * the session). If it's not committed then any changes (E.g. complication provider changes) should
+ * be abandoned. There's no need to resend the style to the watchface because the library will have
+ * restored the previous style.
  */
 public class EditorState internal constructor(
     @RequiresApi(Build.VERSION_CODES.R)
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
index d0ef342..b79e50d 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/HeadlessWatchFaceClient.kt
@@ -75,9 +75,9 @@
      * @param calendarTimeMillis The UTC time in milliseconds since the epoch to render with.
      * @param userStyle Optional [UserStyle] to render with, if null the default style is used.
      * @param idToComplicationData Map of complication ids to [ComplicationData] to render with, or
-     *     if null complications are not rendered.
+     * if null complications are not rendered.
      * @return A shared memory backed [Bitmap] containing a screenshot of the watch face with the
-     *     given settings.
+     * given settings.
      */
     @RequiresApi(27)
     public fun renderWatchFaceToBitmap(
@@ -96,7 +96,7 @@
      * @param complicationData the [ComplicationData] to render with
      * @param userStyle Optional [UserStyle] to render with, if null the default style is used
      * @return A shared memory backed [Bitmap] containing a screenshot of the watch face with the
-     *     given settings, or `null` if [complicationId] is unrecognized.
+     * given settings, or `null` if [complicationId] is unrecognized.
      */
     @RequiresApi(27)
     public fun renderComplicationToBitmap(
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index decd2e9..8779175 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -16,20 +16,17 @@
 
 package androidx.wear.watchface.client
 
-import android.app.PendingIntent
-import android.content.res.Resources
 import android.graphics.Bitmap
-import android.graphics.Rect
 import android.support.wearable.watchface.SharedMemoryImage
 import androidx.annotation.AnyThread
 import androidx.annotation.Px
 import androidx.annotation.RequiresApi
 import androidx.wear.complications.data.ComplicationData
-import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.toApiComplicationText
 import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
+import androidx.wear.watchface.ContentDescriptionLabel
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.TapType
 import androidx.wear.watchface.control.IInteractiveWatchFace
@@ -41,7 +38,6 @@
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting
 import androidx.wear.watchface.style.UserStyleData
-import java.util.Objects
 import java.util.concurrent.Executor
 
 /**
@@ -65,9 +61,9 @@
      * @param calendarTimeMillis The UTC time in milliseconds since the epoch to render with.
      * @param userStyle Optional [UserStyle] to render with, if null the current style is used.
      * @param idAndComplicationData Map of complication ids to [ComplicationData] to render with, or
-     *     if null then the existing complication data if any is used.
+     * if null then the existing complication data if any is used.
      * @return A shared memory backed [Bitmap] containing a screenshot of the watch  face with the
-     *     given settings.
+     * given settings.
      */
     @RequiresApi(27)
     public fun renderWatchFaceToBitmap(
@@ -152,43 +148,6 @@
     public fun sendTouchEvent(@Px xPosition: Int, @Px yPosition: Int, @TapType tapType: Int)
 
     /**
-     * Describes regions of the watch face for use by a screen reader.
-     *
-     * @param text [ComplicationText] associated with the region, to be read by the screen reader.
-     * @param bounds [Rect] describing the area of the feature on screen.
-     * @param tapAction [PendingIntent] to be used if the screen reader's user triggers a tap
-     *     action.
-     */
-    public class ContentDescriptionLabel(
-        private val text: ComplicationText,
-        public val bounds: Rect,
-        public val tapAction: PendingIntent?
-    ) {
-        /**
-         * Returns the text that should be displayed for the given timestamp.
-         *
-         * @param resources [Resources] from the current [android.content.Context]
-         * @param dateTimeMillis milliseconds since epoch, e.g. from [System.currentTimeMillis]
-         */
-        public fun getTextAt(resources: Resources, dateTimeMillis: Long): CharSequence =
-            text.getTextAt(resources, dateTimeMillis)
-
-        override fun equals(other: Any?): Boolean =
-            other is ContentDescriptionLabel &&
-                text == other.text &&
-                bounds == other.bounds &&
-                tapAction == other.tapAction
-
-        override fun hashCode(): Int {
-            return Objects.hash(
-                text,
-                bounds,
-                tapAction
-            )
-        }
-    }
-
-    /**
      * Returns the [ContentDescriptionLabel]s describing the watch face, for the use by screen
      * readers.
      */
@@ -337,9 +296,9 @@
         iInteractiveWatchFace.sendTouchEvent(xPosition, yPosition, tapType)
     }
 
-    override val contentDescriptionLabels: List<InteractiveWatchFaceClient.ContentDescriptionLabel>
+    override val contentDescriptionLabels: List<ContentDescriptionLabel>
         get() = iInteractiveWatchFace.contentDescriptionLabels.map {
-            InteractiveWatchFaceClient.ContentDescriptionLabel(
+            ContentDescriptionLabel(
                 it.text.toApiComplicationText(),
                 it.bounds,
                 it.tapAction
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index 652bfb12..09a3f91 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -30,6 +30,7 @@
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.IWatchFaceControlService
 import androidx.wear.watchface.control.WatchFaceControlService
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
@@ -55,7 +56,7 @@
          *
          * @param context Calling application's [Context].
          * @param watchFacePackageName The name of the package containing the watch face control
-         *     service to bind to.
+         * service to bind to.
          * @return The [WatchFaceControlClient] if there is one.
          * @throws [ServiceNotBoundException] if the watch face control service can not be bound or
          * a [ServiceStartFailureException] if the watch face dies during startup.
@@ -105,7 +106,7 @@
     public class ServiceNotBoundException : Exception()
 
     /** Exception thrown by [WatchFaceControlClient] methods if the service dies during start up. */
-    public class ServiceStartFailureException : Exception()
+    public class ServiceStartFailureException(message: String = "") : Exception(message)
 
     /**
      * Returns the [InteractiveWatchFaceClient] for the given instance id, or null if no such
@@ -114,8 +115,8 @@
      * When finished call [InteractiveWatchFaceClient.close] to release resources.
      *
      * @param instanceId The name of the interactive watch face instance to retrieve
-     * @return The [InteractiveWatchFaceClient] or `null` if [instanceId] is unrecognized,
-     *    or [ServiceNotBoundException] if the WatchFaceControlService is not bound.
+     * @return The [InteractiveWatchFaceClient] or `null` if [instanceId] is unrecognized, or
+     * [ServiceNotBoundException] if the WatchFaceControlService is not bound.
      */
     public fun getInteractiveWatchFaceClientInstance(
         instanceId: String
@@ -129,8 +130,8 @@
      * When finished call [HeadlessWatchFaceClient.close] to release resources.
      *
      * @param watchFaceName The [ComponentName] of the watch face to create a headless instance for
-     *    must be in the same APK the WatchFaceControlClient is connected to. NB a single apk can
-     *    contain multiple watch faces.
+     * must be in the same APK the WatchFaceControlClient is connected to. NB a single apk can
+     * contain multiple watch faces.
      * @param deviceConfig The hardware [DeviceConfig]
      * @param surfaceWidth The width of screen shots taken by the [HeadlessWatchFaceClient]
      * @param surfaceHeight The height of screen shots taken by the [HeadlessWatchFaceClient]
@@ -153,8 +154,8 @@
      * @param id The ID for the requested [InteractiveWatchFaceClient].
      * @param deviceConfig The [DeviceConfig] for the wearable.
      * @param watchUiState The initial [WatchUiState] for the wearable.
-     * @param userStyle The initial style map encoded as [UserStyleData] (see [UserStyle]),
-     *     or null if the default should be used.
+     * @param userStyle The initial style map encoded as [UserStyleData] (see [UserStyle]), or
+     * `null` if the default should be used.
      * @param idToComplicationData The initial complication data, or null if unavailable.
      * @return The [InteractiveWatchFaceClient], this should be closed when finished.
      * @throws [ServiceStartFailureException] if the watchface dies during startup.
@@ -266,6 +267,16 @@
                             InteractiveWatchFaceClientImpl(iInteractiveWatchFace)
                         )
                     }
+
+                    override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
+                        serviceBinder.unlinkToDeath(deathObserver, 0)
+                        traceEvent.close()
+                        continuation.resumeWithException(
+                            WatchFaceControlClient.ServiceStartFailureException(
+                                "Watchface crashed during init: $exception"
+                            )
+                        )
+                    }
                 }
             )?.let {
                 // There was an existing watchface.onInteractiveWatchFaceCreated
diff --git a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
index e9da6de..ecdd49c 100644
--- a/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
+++ b/wear/wear-watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
@@ -39,13 +39,12 @@
  *
  * @param inAmbientMode Whether the device is is ambient mode or not.
  * @param interruptionFilter The interruption filter defines which notifications are allowed to
- *     interrupt the user. For watch faces this value is one of:
- *     [NotificationManager.INTERRUPTION_FILTER_ALARMS],
- *     [NotificationManager.INTERRUPTION_FILTER_ALL],
- *     [NotificationManager.INTERRUPTION_FILTER_NONE],
- *     [NotificationManager.INTERRUPTION_FILTER_PRIORITY],
- *     [NotificationManager.INTERRUPTION_FILTER_UNKNOWN]. @see [NotificationManager] for more
- *     details.
+ * interrupt the user. For watch faces this value is one of:
+ * [NotificationManager.INTERRUPTION_FILTER_ALARMS],
+ * [NotificationManager.INTERRUPTION_FILTER_ALL],
+ * [NotificationManager.INTERRUPTION_FILTER_NONE],
+ * [NotificationManager.INTERRUPTION_FILTER_PRIORITY],
+ * [NotificationManager.INTERRUPTION_FILTER_UNKNOWN]. @see [NotificationManager] for more details.
  */
 public class WatchUiState(
     @get:JvmName("inAmbientMode")
diff --git a/wear/wear-watchface-complications-rendering/api/current.txt b/wear/wear-watchface-complications-rendering/api/current.txt
index bd8e23b..2093fe8 100644
--- a/wear/wear-watchface-complications-rendering/api/current.txt
+++ b/wear/wear-watchface-complications-rendering/api/current.txt
@@ -1,17 +1,34 @@
 // 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);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method public boolean isHighlighted();
+    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method public void onAttach(androidx.wear.watchface.Complication complication);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    method public void setHighlighted(boolean value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+    property public boolean isHighlighted;
+    field public static final float EXPANSION_DP = 6.0f;
+    field public static final float STROKE_WIDTH_DP = 3.0f;
+  }
+
   public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
     ctor public ComplicationDrawable();
-    ctor public ComplicationDrawable(android.content.Context);
-    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable);
-    method public void draw(android.graphics.Canvas);
+    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 android.support.wearable.complications.ComplicationData? getComplicationData();
+    method public androidx.wear.complications.data.ComplicationData? getComplicationData();
     method public android.content.Context? getContext();
     method public long getCurrentTimeMillis();
-    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context, int);
+    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();
@@ -20,24 +37,46 @@
     method public boolean isInAmbientMode();
     method public boolean isLowBitAmbient();
     method public boolean isRangedValueProgressHidden();
-    method public boolean onTap(@Px int, @Px int);
-    method public void setAlpha(int);
-    method public void setBurnInProtection(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter?);
-    method public void setComplicationData(android.support.wearable.complications.ComplicationData?, boolean);
-    method public void setContext(android.content.Context);
-    method public void setCurrentTimeMillis(long);
-    method public void setHighlightDuration(@IntRange(from=0) long);
-    method public void setHighlighted(boolean);
-    method public void setInAmbientMode(boolean);
-    method public void setLowBitAmbient(boolean);
-    method public void setNoDataText(CharSequence?);
-    method public void setRangedValueProgressHidden(boolean);
+    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 p);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTimeMillis(long p);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean p);
+    method public void setInAmbientMode(boolean p);
+    method public void setLowBitAmbient(boolean p);
+    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.complications.data.ComplicationData? complicationData;
+    property public final android.content.Context? context;
+    property public final long currentTimeMillis;
+    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 class ComplicationStyle {
+  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);
+    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();
@@ -54,34 +93,66 @@
     method @ColorInt public int getRangedValueSecondaryColor();
     method @ColorInt public int getTextColor();
     method @Px public int getTextSize();
-    method public android.graphics.Typeface? getTextTypeface();
+    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);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
-    method public void setBorderColor(@ColorInt int);
-    method public void setBorderDashGap(@Px int);
-    method public void setBorderDashWidth(@Px int);
-    method public void setBorderRadius(@Px int);
-    method public void setBorderStyle(int);
-    method public void setBorderWidth(@Px int);
-    method public void setHighlightColor(@ColorInt int);
-    method public void setIconColor(@ColorInt int);
-    method public void setImageColorFilter(android.graphics.ColorFilter?);
-    method public void setRangedValuePrimaryColor(@ColorInt int);
-    method public void setRangedValueRingWidth(@Px int);
-    method public void setRangedValueSecondaryColor(@ColorInt int);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(@Px int);
-    method public void setTextTypeface(android.graphics.Typeface);
-    method public void setTitleColor(@ColorInt int);
-    method public void setTitleSize(@Px int);
-    method public void setTitleTypeface(android.graphics.Typeface);
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? p);
+    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.CanvasComplication canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.CanvasComplication getCanvasComplication();
+    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.CanvasComplication canvasComplication;
   }
 
 }
diff --git a/wear/wear-watchface-complications-rendering/api/public_plus_experimental_current.txt b/wear/wear-watchface-complications-rendering/api/public_plus_experimental_current.txt
index bd8e23b..2093fe8 100644
--- a/wear/wear-watchface-complications-rendering/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-complications-rendering/api/public_plus_experimental_current.txt
@@ -1,17 +1,34 @@
 // 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);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method public boolean isHighlighted();
+    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method public void onAttach(androidx.wear.watchface.Complication complication);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    method public void setHighlighted(boolean value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+    property public boolean isHighlighted;
+    field public static final float EXPANSION_DP = 6.0f;
+    field public static final float STROKE_WIDTH_DP = 3.0f;
+  }
+
   public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
     ctor public ComplicationDrawable();
-    ctor public ComplicationDrawable(android.content.Context);
-    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable);
-    method public void draw(android.graphics.Canvas);
+    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 android.support.wearable.complications.ComplicationData? getComplicationData();
+    method public androidx.wear.complications.data.ComplicationData? getComplicationData();
     method public android.content.Context? getContext();
     method public long getCurrentTimeMillis();
-    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context, int);
+    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();
@@ -20,24 +37,46 @@
     method public boolean isInAmbientMode();
     method public boolean isLowBitAmbient();
     method public boolean isRangedValueProgressHidden();
-    method public boolean onTap(@Px int, @Px int);
-    method public void setAlpha(int);
-    method public void setBurnInProtection(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter?);
-    method public void setComplicationData(android.support.wearable.complications.ComplicationData?, boolean);
-    method public void setContext(android.content.Context);
-    method public void setCurrentTimeMillis(long);
-    method public void setHighlightDuration(@IntRange(from=0) long);
-    method public void setHighlighted(boolean);
-    method public void setInAmbientMode(boolean);
-    method public void setLowBitAmbient(boolean);
-    method public void setNoDataText(CharSequence?);
-    method public void setRangedValueProgressHidden(boolean);
+    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 p);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTimeMillis(long p);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean p);
+    method public void setInAmbientMode(boolean p);
+    method public void setLowBitAmbient(boolean p);
+    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.complications.data.ComplicationData? complicationData;
+    property public final android.content.Context? context;
+    property public final long currentTimeMillis;
+    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 class ComplicationStyle {
+  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);
+    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();
@@ -54,34 +93,66 @@
     method @ColorInt public int getRangedValueSecondaryColor();
     method @ColorInt public int getTextColor();
     method @Px public int getTextSize();
-    method public android.graphics.Typeface? getTextTypeface();
+    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);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
-    method public void setBorderColor(@ColorInt int);
-    method public void setBorderDashGap(@Px int);
-    method public void setBorderDashWidth(@Px int);
-    method public void setBorderRadius(@Px int);
-    method public void setBorderStyle(int);
-    method public void setBorderWidth(@Px int);
-    method public void setHighlightColor(@ColorInt int);
-    method public void setIconColor(@ColorInt int);
-    method public void setImageColorFilter(android.graphics.ColorFilter?);
-    method public void setRangedValuePrimaryColor(@ColorInt int);
-    method public void setRangedValueRingWidth(@Px int);
-    method public void setRangedValueSecondaryColor(@ColorInt int);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(@Px int);
-    method public void setTextTypeface(android.graphics.Typeface);
-    method public void setTitleColor(@ColorInt int);
-    method public void setTitleSize(@Px int);
-    method public void setTitleTypeface(android.graphics.Typeface);
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? p);
+    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.CanvasComplication canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.CanvasComplication getCanvasComplication();
+    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.CanvasComplication canvasComplication;
   }
 
 }
diff --git a/wear/wear-watchface-complications-rendering/api/restricted_current.txt b/wear/wear-watchface-complications-rendering/api/restricted_current.txt
index 25d5b4f..8b9e974 100644
--- a/wear/wear-watchface-complications-rendering/api/restricted_current.txt
+++ b/wear/wear-watchface-complications-rendering/api/restricted_current.txt
@@ -1,17 +1,34 @@
 // 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);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method public boolean isHighlighted();
+    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method public void onAttach(androidx.wear.watchface.Complication complication);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    method public void setHighlighted(boolean value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+    property public boolean isHighlighted;
+    field public static final float EXPANSION_DP = 6.0f;
+    field public static final float STROKE_WIDTH_DP = 3.0f;
+  }
+
   public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
     ctor public ComplicationDrawable();
-    ctor public ComplicationDrawable(android.content.Context);
-    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable);
-    method public void draw(android.graphics.Canvas);
+    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 android.support.wearable.complications.ComplicationData? getComplicationData();
+    method public androidx.wear.complications.data.ComplicationData? getComplicationData();
     method public android.content.Context? getContext();
     method public long getCurrentTimeMillis();
-    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context, int);
+    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();
@@ -20,24 +37,46 @@
     method public boolean isInAmbientMode();
     method public boolean isLowBitAmbient();
     method public boolean isRangedValueProgressHidden();
-    method public boolean onTap(@Px int, @Px int);
-    method public void setAlpha(int);
-    method public void setBurnInProtection(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter?);
-    method public void setComplicationData(android.support.wearable.complications.ComplicationData?, boolean);
-    method public void setContext(android.content.Context);
-    method public void setCurrentTimeMillis(long);
-    method public void setHighlightDuration(@IntRange(from=0) long);
-    method public void setHighlighted(boolean);
-    method public void setInAmbientMode(boolean);
-    method public void setLowBitAmbient(boolean);
-    method public void setNoDataText(CharSequence?);
-    method public void setRangedValueProgressHidden(boolean);
+    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 p);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTimeMillis(long p);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean p);
+    method public void setInAmbientMode(boolean p);
+    method public void setLowBitAmbient(boolean p);
+    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.complications.data.ComplicationData? complicationData;
+    property public final android.content.Context? context;
+    property public final long currentTimeMillis;
+    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 class ComplicationStyle {
+  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);
+    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();
@@ -54,37 +93,69 @@
     method @ColorInt public int getRangedValueSecondaryColor();
     method @ColorInt public int getTextColor();
     method @Px public int getTextSize();
-    method public android.graphics.Typeface? getTextTypeface();
+    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);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
-    method public void setBorderColor(@ColorInt int);
-    method public void setBorderDashGap(@Px int);
-    method public void setBorderDashWidth(@Px int);
-    method public void setBorderRadius(@Px int);
-    method public void setBorderStyle(@androidx.wear.watchface.complications.rendering.ComplicationStyle.BorderStyle int);
-    method public void setBorderWidth(@Px int);
-    method public void setHighlightColor(@ColorInt int);
-    method public void setIconColor(@ColorInt int);
-    method public void setImageColorFilter(android.graphics.ColorFilter?);
-    method public void setRangedValuePrimaryColor(@ColorInt int);
-    method public void setRangedValueRingWidth(@Px int);
-    method public void setRangedValueSecondaryColor(@ColorInt int);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(@Px int);
-    method public void setTextTypeface(android.graphics.Typeface);
-    method public void setTitleColor(@ColorInt int);
-    method public void setTitleSize(@Px int);
-    method public void setTitleTypeface(android.graphics.Typeface);
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? p);
+    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(@androidx.wear.watchface.complications.rendering.ComplicationStyle.BorderStyle 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 @androidx.wear.watchface.complications.rendering.ComplicationStyle.BorderStyle 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;
   }
 
-  @IntDef({androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_NONE, androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_SOLID, androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_DASHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ComplicationStyle.BorderStyle {
+  @IntDef({androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_NONE, androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_SOLID, androidx.wear.watchface.complications.rendering.ComplicationStyle.BORDER_STYLE_DASHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public static @interface ComplicationStyle.BorderStyle {
+  }
+
+  public static final class ComplicationStyle.Companion {
+  }
+
+  public final class GlesTextureComplication {
+    ctor public GlesTextureComplication(androidx.wear.watchface.CanvasComplication canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.CanvasComplication getCanvasComplication();
+    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.CanvasComplication canvasComplication;
   }
 
 }
diff --git a/wear/wear-watchface-complications-rendering/build.gradle b/wear/wear-watchface-complications-rendering/build.gradle
index 7307faf..5a2bfe3 100644
--- a/wear/wear-watchface-complications-rendering/build.gradle
+++ b/wear/wear-watchface-complications-rendering/build.gradle
@@ -31,6 +31,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api(project(":wear:wear-complications-data"))
+    api(project(":wear:wear-watchface"))
 
     implementation("androidx.core:core:1.1.0")
     implementation("androidx.preference:preference:1.1.0")
diff --git a/wear/wear-watchface-complications-rendering/lint-baseline.xml b/wear/wear-watchface-complications-rendering/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface-complications-rendering/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt
new file mode 100644
index 0000000..9222881
--- /dev/null
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/CanvasComplicationDrawable.kt
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.complications.rendering
+
+import android.annotation.SuppressLint
+import android.content.res.Resources
+import android.graphics.Canvas
+import android.graphics.Rect
+import android.graphics.drawable.Drawable
+import android.icu.util.Calendar
+import android.util.TypedValue
+import androidx.annotation.CallSuper
+import androidx.annotation.ColorInt
+import androidx.wear.complications.data.ComplicationData
+import androidx.wear.utility.TraceEvent
+import androidx.wear.watchface.CanvasComplication
+import androidx.wear.watchface.Complication
+import androidx.wear.watchface.Observer
+import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.WatchState
+import androidx.wear.watchface.data.ComplicationBoundsType
+import androidx.wear.watchface.style.WatchFaceLayer
+
+/**
+ * A complication rendered with [ComplicationDrawable] which renders complications in a material
+ * design style. This renderer can't be shared by multiple complications.
+ *
+ * @param _drawable The [ComplicationDrawable] to render with.
+ * @param watchState The watch's [WatchState] which contains details pertaining to (low-bit) ambient
+ * mode and burn in protection needed to render correctly.
+ */
+public open class CanvasComplicationDrawable(
+    _drawable: ComplicationDrawable,
+    private val watchState: WatchState
+) : CanvasComplication {
+
+    private companion object {
+        const val EXPANSION_DP = 6.0f
+        const val STROKE_WIDTH_DP = 3.0f
+    }
+
+    private val complicationHighlightRenderer by lazy {
+        ComplicationHighlightRenderer(
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                EXPANSION_DP,
+                Resources.getSystem().displayMetrics
+            ),
+
+            TypedValue.applyDimension(
+                TypedValue.COMPLEX_UNIT_DIP,
+                STROKE_WIDTH_DP,
+                Resources.getSystem().displayMetrics
+            )
+        )
+    }
+
+    init {
+        _drawable.callback = object :
+            Drawable.Callback {
+            override fun unscheduleDrawable(who: Drawable, what: Runnable) {}
+
+            @SuppressLint("SyntheticAccessor")
+            override fun invalidateDrawable(who: Drawable) {
+                attachedComplication?.invalidate()
+            }
+
+            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
+        }
+    }
+
+    /** The [ComplicationDrawable] to render with. */
+    public var drawable: ComplicationDrawable = _drawable
+        set(value) {
+            // Copy the ComplicationData otherwise the complication will be blank until the next
+            // update.
+            value.setComplicationData(field.complicationData, false)
+            field = value
+            value.isInAmbientMode = watchState.isAmbient.value
+            value.isLowBitAmbient = watchState.hasLowBitAmbient
+            value.isBurnInProtectionOn = watchState.hasBurnInProtection
+
+            attachedComplication?.scheduleUpdateComplications()
+        }
+
+    private val isAmbientObserver = Observer<Boolean> {
+        drawable.isInAmbientMode = it
+    }
+
+    private var attachedComplication: Complication? = null
+
+    override fun onAttach(complication: Complication) {
+        attachedComplication = complication
+        watchState.isAmbient.addObserver(isAmbientObserver)
+    }
+
+    override fun render(
+        canvas: Canvas,
+        bounds: Rect,
+        calendar: Calendar,
+        renderParameters: RenderParameters
+    ) {
+        if (!renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS)) {
+            return
+        }
+
+        drawable.bounds = bounds
+        drawable.currentTimeMillis = calendar.timeInMillis
+        drawable.draw(canvas)
+    }
+
+    override fun drawHighlight(
+        canvas: Canvas,
+        bounds: Rect,
+        boundsType: Int,
+        calendar: Calendar,
+        @ColorInt color: Int
+    ) {
+        if (boundsType == ComplicationBoundsType.ROUND_RECT) {
+            complicationHighlightRenderer.drawComplicationHighlight(
+                canvas,
+                bounds,
+                color
+            )
+        }
+    }
+
+    public override var isHighlighted: Boolean
+        get() = drawable.isHighlighted
+        set(value) {
+            drawable.isHighlighted = value
+        }
+
+    private var _data: ComplicationData? = null
+
+    /** Returns the [ComplicationData] to render with. */
+    override fun getData(): ComplicationData? = _data
+
+    /**
+     * Updates the [ComplicationData] used for rendering and loads any [Drawable]s within the
+     * [complicationData].
+     *
+     * @param complicationData The new [ComplicationData] for which any [Drawable]s should be loaded
+     * @param loadDrawablesAsynchronous Whether any [Drawable]s within [complicationData] should be
+     * loaded asynchronously or not. If they are loaded asynchronously then upon completion,
+     * [ComplicationDrawable.setComplicationData] will call [Drawable.Callback.invalidateDrawable]
+     * registered in our init section above, which invalidates the attachedComplication and
+     * ultimately the watch face.
+     */
+    @CallSuper
+    override fun loadData(
+        complicationData: ComplicationData?,
+        loadDrawablesAsynchronous: Boolean
+    ): Unit = TraceEvent("CanvasComplicationDrawable.setIdAndData").use {
+        _data = complicationData
+        drawable.setComplicationData(
+            complicationData,
+            loadDrawablesAsynchronous
+        )
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.java b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.java
deleted file mode 100644
index 449cad4..0000000
--- a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.java
+++ /dev/null
@@ -1,859 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface.complications.rendering;
-
-import android.app.PendingIntent.CanceledException;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.wearable.complications.ComplicationData;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Xml;
-
-import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.Px;
-import androidx.annotation.VisibleForTesting;
-import androidx.wear.complications.ComplicationHelperActivity;
-import androidx.wear.watchface.complications.rendering.ComplicationRenderer.OnInvalidateListener;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.Objects;
-
-/**
- * A styleable drawable object that draws complications. You can create a ComplicationDrawable from
- * XML inflation or by using one of the constructor methods.
- *
- * <h3>Constructing a ComplicationDrawable</h3>
- *
- * <p>To construct a ComplicationDrawable programmatically, use the {@link
- * #ComplicationDrawable(Context)} constructor. Afterwards, styling attributes you want to modify
- * can be set via set methods.
- *
- * <pre>
- * public void onCreate(SurfaceHolder holder) {
- *   ...
- *   ComplicationDrawable complicationDrawable = new ComplicationDrawable(WatchFaceService.this);
- *   complicationDrawable.setBackgroundColorActive(backgroundColor);
- *   complicationDrawable.setTextColorActive(textColor);
- *   ...
- * }</pre>
- *
- * <h3>Constructing a ComplicationDrawable from XML</h3>
- *
- * <p>Constructing a ComplicationDrawable from an XML file makes it easier to modify multiple
- * styling attributes at once without calling any set methods. You may also use different XML files
- * to switch between different styles your watch face supports.
- *
- * <p>To construct a ComplicationDrawable from a drawable XML file, you may create an XML file in
- * your project's {@code res/drawable} folder. A ComplicationDrawable with red text and white title
- * in active mode, and white text and white title in ambient mode would look like this:
- *
- * <pre>
- * &lt;?xml version="1.0" encoding="utf-8"?&gt;
- * &lt;android.support.wearable.complications.rendering.ComplicationDrawable
- *   xmlns:app="http://schemas.android.com/apk/res-auto"
- *   app:textColor="#FFFF0000"
- *   app:titleColor="#FFFFFFFF"&gt;
- *   &lt;ambient
- *     app:textColor="#FFFFFFFF" /&gt;
- * &lt;/android.support.wearable.complications.rendering.ComplicationDrawable&gt;
- * </pre>
- *
- * <p>A top-level {@code drawable} tag with the {@code class} attribute may also be used to
- * construct a ComplicationDrawable from an XML file:
- *
- * <pre>
- * &lt;?xml version="1.0" encoding="utf-8"?&gt;
- * &lt;drawable
- *   class="android.support.wearable.complications.rendering.ComplicationDrawable"
- *   xmlns:app="http://schemas.android.com/apk/res-auto"
- *   app:textColor="#FFFF0000"
- *   app:titleColor="#FFFFFFFF"&gt;
- *   &lt;ambient
- *     app:textColor="#FFFFFFFF" /&gt;
- * &lt;/drawable&gt;</pre>
- *
- * <p>To inflate a ComplicationDrawable from XML file, use the {@link #getDrawable(Context, int)}
- * method. ComplicationDrawable needs access to the current context in order to style and draw
- * the complication.
- *
- * <pre>
- * public void onCreate(SurfaceHolder holder) {
- *   ...
- *   ComplicationDrawable complicationDrawable = (ComplicationDrawable)
- *       getDrawable(R.drawable.complication);
- *   complicationDrawable.setContext(WatchFaceService.this);
- *   ...
- * }</pre>
- *
- * <h4>Syntax:</h4>
- *
- * <pre>
- * &lt;?xml version="1.0" encoding="utf-8"?&gt;
- * &lt;android.support.wearable.complications.rendering.ComplicationDrawable
- *   xmlns:app="http://schemas.android.com/apk/res-auto"
- *   app:backgroundColor="color"
- *   app:backgroundDrawable="drawable"
- *   app:borderColor="color"
- *   app:borderDashGap="dimension"
- *   app:borderDashWidth="dimension"
- *   app:borderRadius="dimension"
- *   app:borderStyle="none|solid|dashed"
- *   app:borderWidth="dimension"
- *   app:highlightColor="color"
- *   app:iconColor="color"
- *   app:rangedValuePrimaryColor="color"
- *   app:rangedValueProgressHidden="boolean"
- *   app:rangedValueRingWidth="dimension"
- *   app:rangedValueSecondaryColor="color"
- *   app:textColor="color"
- *   app:textSize="dimension"
- *   app:textTypeface="string"
- *   app:titleColor="color"
- *   app:titleSize="dimension"
- *   app:titleTypeface="string"&gt;
- *   &lt;ambient
- *     app:backgroundColor="color"
- *     app:backgroundDrawable="drawable"
- *     app:borderColor="color"
- *     app:borderDashGap="dimension"
- *     app:borderDashWidth="dimension"
- *     app:borderRadius="dimension"
- *     app:borderStyle="none|solid|dashed"
- *     app:borderWidth="dimension"
- *     app:highlightColor="color"
- *     app:iconColor="color"
- *     app:rangedValuePrimaryColor="color"
- *     app:rangedValueRingWidth="dimension"
- *     app:rangedValueSecondaryColor="color"
- *     app:textColor="color"
- *     app:textSize="dimension"
- *     app:textTypeface="string"
- *     app:titleColor="color"
- *     app:titleSize="dimension"
- *     app:titleTypeface="string" /&gt;
- * &lt;/android.support.wearable.complications.rendering.ComplicationDrawable&gt;
- * </pre>
- *
- * <p>Attributes of the top-level tag apply to both active and ambient modes while attributes of the
- * inner {@code ambient} tag only apply to ambient mode. As an exception, top-level only {@code
- * rangedValueProgressHidden} attribute applies to both modes, and cannot be overridden in ambient
- * mode. To hide ranged value in only one of the active or ambient modes, you may consider setting
- * {@code rangedValuePrimaryColor} and {@code rangedValueSecondaryColor} to {@link
- * android.graphics.Color#TRANSPARENT} instead.
- *
- * <h3>Drawing a ComplicationDrawable</h3>
- *
- * <p>Depending on the size and shape of the bounds, the layout of the complication may change. For
- * instance, a short text complication with an icon that is drawn on square bounds would draw the
- * icon above the short text, but a short text complication with an icon that is drawn on wide
- * rectangular bounds might draw the icon to the left of the short text instead.
- */
-public final class ComplicationDrawable extends Drawable {
-
-    private Context mContext;
-    private ComplicationRenderer mComplicationRenderer;
-
-    private final ComplicationStyle mActiveStyle;
-    private final ComplicationStyle mAmbientStyle;
-
-    private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
-
-    private final Runnable mUnhighlightRunnable =
-            () -> {
-                setHighlighted(false);
-                invalidateSelf();
-            };
-
-    private final OnInvalidateListener mRendererInvalidateListener = () -> invalidateSelf();
-
-    private CharSequence mNoDataText;
-    private long mHighlightDuration;
-    private long mCurrentTimeMillis;
-    private boolean mInAmbientMode;
-    private boolean mLowBitAmbient;
-    private boolean mBurnInProtection;
-    private boolean mHighlighted;
-    private boolean mRangedValueProgressHidden;
-
-    private boolean mIsInflatedFromXml;
-    private boolean mAlreadyStyled;
-
-    /** Default constructor. */
-    public ComplicationDrawable() {
-        mActiveStyle = new ComplicationStyle();
-        mAmbientStyle = new ComplicationStyle();
-    }
-
-    /**
-     * Creates a ComplicationDrawable using the given context. If this constructor is used, calling
-     * {@link #setContext(Context)} may not be necessary.
-     */
-    public ComplicationDrawable(@NonNull Context context) {
-        this();
-        setContext(context);
-    }
-
-    public ComplicationDrawable(@NonNull ComplicationDrawable drawable) {
-        mActiveStyle = new ComplicationStyle(drawable.mActiveStyle);
-        mAmbientStyle = new ComplicationStyle(drawable.mAmbientStyle);
-        mNoDataText = drawable.mNoDataText.subSequence(0, drawable.mNoDataText.length());
-        mHighlightDuration = drawable.mHighlightDuration;
-        mCurrentTimeMillis = drawable.mCurrentTimeMillis;
-        setBounds(drawable.getBounds());
-
-        mInAmbientMode = drawable.mInAmbientMode;
-        mLowBitAmbient = drawable.mLowBitAmbient;
-        mBurnInProtection = drawable.mBurnInProtection;
-        mHighlighted = false;
-        mRangedValueProgressHidden = drawable.mRangedValueProgressHidden;
-        mIsInflatedFromXml = drawable.mIsInflatedFromXml;
-        mAlreadyStyled = true;
-    }
-
-    /**
-     * Creates a ComplicationDrawable from a resource.
-     *
-     * @param context The {@link Context} to load the resource from
-     * @param id      The id of the resource to load
-     * @return The {@link ComplicationDrawable} loaded from the specified resource id or null if it
-     * doesn't exist.
-     */
-    @Nullable
-    public static ComplicationDrawable getDrawable(@NonNull Context context, int id) {
-        if (context == null) {
-            throw new IllegalArgumentException("Argument \"context\" should not be null.");
-        }
-        ComplicationDrawable drawable = (ComplicationDrawable) context.getDrawable(id);
-        if (drawable == null) {
-            return null;
-        }
-
-        drawable.setContext(context);
-        return drawable;
-    }
-
-    /** Sets the style to default values using resources. */
-    private static void setStyleToDefaultValues(ComplicationStyle style, Resources r) {
-        style.setBackgroundColor(
-                r.getColor(R.color.complicationDrawable_backgroundColor, null));
-        style.setTextColor(r.getColor(R.color.complicationDrawable_textColor, null));
-        style.setTitleColor(r.getColor(R.color.complicationDrawable_titleColor, null));
-        style.setTextTypeface(
-                Typeface.create(
-                        r.getString(R.string.complicationDrawable_textTypeface), Typeface.NORMAL));
-        style.setTitleTypeface(
-                Typeface.create(
-                        r.getString(R.string.complicationDrawable_titleTypeface), Typeface.NORMAL));
-        style.setTextSize(r.getDimensionPixelSize(R.dimen.complicationDrawable_textSize));
-        style.setTitleSize(r.getDimensionPixelSize(R.dimen.complicationDrawable_titleSize));
-        style.setIconColor(r.getColor(R.color.complicationDrawable_iconColor, null));
-        style.setBorderColor(r.getColor(R.color.complicationDrawable_borderColor, null));
-        style.setBorderWidth(r.getDimensionPixelSize(R.dimen.complicationDrawable_borderWidth));
-        style.setBorderRadius(r.getDimensionPixelSize(R.dimen.complicationDrawable_borderRadius));
-        style.setBorderStyle(r.getInteger(R.integer.complicationDrawable_borderStyle));
-        style.setBorderDashWidth(
-                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashWidth));
-        style.setBorderDashGap(r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashGap));
-        style.setRangedValueRingWidth(
-                r.getDimensionPixelSize(R.dimen.complicationDrawable_rangedValueRingWidth));
-        style.setRangedValuePrimaryColor(
-                r.getColor(R.color.complicationDrawable_rangedValuePrimaryColor, null));
-        style.setRangedValueSecondaryColor(
-                r.getColor(R.color.complicationDrawable_rangedValueSecondaryColor, null));
-        style.setHighlightColor(r.getColor(R.color.complicationDrawable_highlightColor, null));
-    }
-
-    /**
-     * Sets the context used to render the complication. If a context is not set,
-     * ComplicationDrawable will throw an {@link IllegalStateException} if one of
-     * {@link #draw(Canvas)}, {@link #setBounds(Rect)}, or {@link
-     * #setComplicationData(ComplicationData, boolean)} is called.
-     *
-     * <p>While this can be called from any context, ideally, a
-     * androidx.wear.watchface.WatchFaceService object should be passed here to allow creating
-     * permission dialogs by the {@link #onTap(int, int)} method, in case current watch face
-     * doesn't have the permission to receive complication data.
-     *
-     * <p>If this ComplicationDrawable is retrieved using {@link Resources#getDrawable(int, Theme)},
-     * this method must be called before calling any of the methods mentioned above.
-     *
-     * <p>If this ComplicationDrawable is not inflated from an XML file, this method will reset the
-     * style to match the default values, so if {@link #ComplicationDrawable()} is used to construct
-     * a ComplicationDrawable, this method should be called right after.
-     */
-    public void setContext(@NonNull Context context) {
-        if (context == null) {
-            throw new IllegalArgumentException("Argument \"context\" should not be null.");
-        }
-        if (Objects.equals(context, mContext)) {
-            return;
-        }
-        mContext = context;
-
-        if (!mIsInflatedFromXml && !mAlreadyStyled) {
-            setStyleToDefaultValues(mActiveStyle, context.getResources());
-            setStyleToDefaultValues(mAmbientStyle, context.getResources());
-        }
-
-        if (!mAlreadyStyled) {
-            mHighlightDuration = context.getResources()
-                    .getInteger(R.integer.complicationDrawable_highlightDurationMs);
-        }
-
-        mComplicationRenderer = new ComplicationRenderer(mContext, mActiveStyle, mAmbientStyle);
-        mComplicationRenderer.setOnInvalidateListener(mRendererInvalidateListener);
-        if (mNoDataText == null) {
-            setNoDataText(context.getString(R.string.complicationDrawable_noDataText));
-        } else {
-            mComplicationRenderer.setNoDataText(mNoDataText);
-        }
-        mComplicationRenderer.setRangedValueProgressHidden(mRangedValueProgressHidden);
-        mComplicationRenderer.setBounds(getBounds());
-    }
-
-    /**
-     * Returns the {@link Context} used to render the complication.
-     */
-    @Nullable public Context getContext() {
-        return mContext;
-    }
-
-    private void inflateAttributes(Resources r, XmlPullParser parser) {
-        TypedArray a =
-                r.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.ComplicationDrawable);
-        setRangedValueProgressHidden(
-                a.getBoolean(R.styleable.ComplicationDrawable_rangedValueProgressHidden, false));
-        a.recycle();
-    }
-
-    private void inflateStyle(boolean isAmbient, Resources r, XmlPullParser parser) {
-        TypedArray a =
-                r.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.ComplicationDrawable);
-        ComplicationStyle complicationStyle = isAmbient ? mAmbientStyle : mActiveStyle;
-        if (a.hasValue(R.styleable.ComplicationDrawable_backgroundColor)) {
-            complicationStyle.setBackgroundColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_backgroundColor,
-                            r.getColor(R.color.complicationDrawable_backgroundColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_backgroundDrawable)) {
-            complicationStyle.setBackgroundDrawable(
-                    a.getDrawable(R.styleable.ComplicationDrawable_backgroundDrawable));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_textColor)) {
-            complicationStyle.setTextColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_textColor,
-                            r.getColor(R.color.complicationDrawable_textColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_titleColor)) {
-            complicationStyle.setTitleColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_titleColor,
-                            r.getColor(R.color.complicationDrawable_titleColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_textTypeface)) {
-            complicationStyle.setTextTypeface(
-                    Typeface.create(
-                            a.getString(R.styleable.ComplicationDrawable_textTypeface),
-                            Typeface.NORMAL));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_titleTypeface)) {
-            complicationStyle.setTitleTypeface(
-                    Typeface.create(
-                            a.getString(R.styleable.ComplicationDrawable_titleTypeface),
-                            Typeface.NORMAL));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_textSize)) {
-            complicationStyle.setTextSize(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_textSize,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_textSize)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_titleSize)) {
-            complicationStyle.setTitleSize(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_titleSize,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_titleSize)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_iconColor)) {
-            complicationStyle.setIconColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_iconColor,
-                            r.getColor(R.color.complicationDrawable_iconColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderColor)) {
-            complicationStyle.setBorderColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_borderColor,
-                            r.getColor(R.color.complicationDrawable_borderColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderRadius)) {
-            complicationStyle.setBorderRadius(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_borderRadius,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_borderRadius)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderStyle)) {
-            complicationStyle.setBorderStyle(
-                    a.getInt(
-                            R.styleable.ComplicationDrawable_borderStyle,
-                            r.getInteger(R.integer.complicationDrawable_borderStyle)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderDashWidth)) {
-            complicationStyle.setBorderDashWidth(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_borderDashWidth,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashWidth)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderDashGap)) {
-            complicationStyle.setBorderDashGap(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_borderDashGap,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashGap)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_borderWidth)) {
-            complicationStyle.setBorderWidth(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_borderWidth,
-                            r.getDimensionPixelSize(R.dimen.complicationDrawable_borderWidth)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValueRingWidth)) {
-            complicationStyle.setRangedValueRingWidth(
-                    a.getDimensionPixelSize(
-                            R.styleable.ComplicationDrawable_rangedValueRingWidth,
-                            r.getDimensionPixelSize(
-                                    R.dimen.complicationDrawable_rangedValueRingWidth)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValuePrimaryColor)) {
-            complicationStyle.setRangedValuePrimaryColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_rangedValuePrimaryColor,
-                            r.getColor(
-                                    R.color.complicationDrawable_rangedValuePrimaryColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValueSecondaryColor)) {
-            complicationStyle.setRangedValueSecondaryColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_rangedValueSecondaryColor,
-                            r.getColor(
-                                    R.color.complicationDrawable_rangedValueSecondaryColor, null)));
-        }
-        if (a.hasValue(R.styleable.ComplicationDrawable_highlightColor)) {
-            complicationStyle.setHighlightColor(
-                    a.getColor(
-                            R.styleable.ComplicationDrawable_highlightColor,
-                            r.getColor(R.color.complicationDrawable_highlightColor, null)));
-        }
-        a.recycle();
-    }
-
-    /**
-     * Inflates this ComplicationDrawable from an XML resource. This can't be called more than once
-     * for each ComplicationDrawable. Note that framework may have called this once to create the
-     * ComplicationDrawable instance from an XML resource.
-     *
-     * @param r      Resources used to resolve attribute values
-     * @param parser XML parser from which to inflate this ComplicationDrawable
-     * @param attrs  Base set of attribute values
-     * @param theme  Ignored by ComplicationDrawable
-     */
-    @Override
-    @SuppressWarnings("ObjectToString")
-    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
-            @NonNull AttributeSet attrs, @Nullable Theme theme)
-            throws XmlPullParserException, IOException {
-        if (mIsInflatedFromXml) {
-            throw new IllegalStateException("inflate may be called once only.");
-        }
-        mIsInflatedFromXml = true;
-        int type;
-        final int outerDepth = parser.getDepth();
-        // Inflate attributes always shared between active and ambient mode
-        inflateAttributes(r, parser);
-        // Reset both style builders to default values
-        setStyleToDefaultValues(mActiveStyle, r);
-        setStyleToDefaultValues(mAmbientStyle, r);
-        // Attributes of the outer tag applies to both active and ambient styles
-        inflateStyle(false, r, parser);
-        inflateStyle(true, r, parser);
-        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
-                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
-            if (type != XmlPullParser.START_TAG) {
-                continue;
-            }
-
-            // Attributes of inner <ambient> tag applies to ambient style only
-            final String name = parser.getName();
-            if (TextUtils.equals(name, "ambient")) {
-                inflateStyle(true, r, parser);
-            } else {
-                Log.w(
-                        "ComplicationDrawable",
-                        "Unknown element: " + name + " for ComplicationDrawable " + this);
-            }
-        }
-    }
-
-    /**
-     * Draws the complication for the last known time. Last known time is derived from
-     * ComplicationDrawable#setCurrentTimeMillis(long)}.
-     *
-     * @param canvas Canvas for the complication to be drawn onto
-     */
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        assertInitialized();
-        updateStyleIfRequired();
-        mComplicationRenderer.draw(
-                canvas,
-                mCurrentTimeMillis,
-                mInAmbientMode,
-                mLowBitAmbient,
-                mBurnInProtection,
-                mHighlighted);
-    }
-
-    /** Does nothing. */
-    @Override
-    public void setAlpha(int alpha) {
-        // No op.
-    }
-
-    /**
-     * Does nothing. Use {@link ComplicationStyle#setImageColorFilter(ColorFilter)} instead to apply
-     * color filter to small and large images.
-     */
-    @Override
-    public void setColorFilter(@Nullable ColorFilter colorFilter) {
-        // No op.
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @deprecated This method is no longer used in graphics optimizations
-     */
-    @Override
-    @Deprecated
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    @Override
-    protected void onBoundsChange(@NonNull Rect bounds) {
-        if (mComplicationRenderer != null) {
-            mComplicationRenderer.setBounds(bounds);
-        }
-    }
-
-    /**
-     * Sets the text to be rendered when {@link ComplicationData} is of type {@link
-     * ComplicationData#TYPE_NO_DATA}. If {@code noDataText} is null, an empty text will be
-     * rendered.
-     */
-    public void setNoDataText(@Nullable CharSequence noDataText) {
-        if (noDataText == null) {
-            mNoDataText = "";
-        } else {
-            mNoDataText = noDataText.subSequence(0, noDataText.length());
-        }
-        if (mComplicationRenderer != null) {
-            mComplicationRenderer.setNoDataText(mNoDataText);
-        }
-    }
-
-    /**
-     * Sets if the ranged value progress should be hidden when {@link ComplicationData} is of type
-     * {@link ComplicationData#TYPE_RANGED_VALUE}.
-     *
-     * @param rangedValueProgressHidden {@code true} if progress should be hidden, {@code false}
-     *                                  otherwise
-     * @attr ref androidx.wear.watchface.complications.rendering.R
-     *     .styleable#ComplicationDrawable_rangedValueProgressHidden
-     */
-    public void setRangedValueProgressHidden(boolean rangedValueProgressHidden) {
-        mRangedValueProgressHidden = rangedValueProgressHidden;
-        if (mComplicationRenderer != null) {
-            mComplicationRenderer.setRangedValueProgressHidden(rangedValueProgressHidden);
-        }
-    }
-
-    /** Returns {@code true} if the ranged value progress is hidden, {@code false} otherwise. */
-    public boolean isRangedValueProgressHidden() {
-        return mRangedValueProgressHidden;
-    }
-
-    /**
-     * Sets the complication data to be drawn. If {@code complicationData} is {@code null}, nothing
-     * will be drawn when {@link #draw(Canvas)} is called.
-     *
-     * @param complicationData The [ComplicationData] to set
-     * @param loadDrawablesAsync If true any drawables should be loaded asynchronously,
-     *      otherwise they will be loaded synchronously.
-     */
-    public void setComplicationData(
-            @Nullable ComplicationData complicationData,
-            boolean loadDrawablesAsync
-    ) {
-        assertInitialized();
-        mComplicationRenderer.setComplicationData(complicationData, loadDrawablesAsync);
-    }
-
-    /**
-     * Returns the {@link ComplicationData} to be drawn by this ComplicationDrawable.
-     */
-    @Nullable
-    public ComplicationData getComplicationData() {
-        return mComplicationRenderer.getComplicationData();
-    }
-
-    /** Sets whether the complication should be rendered in ambient mode. */
-    public void setInAmbientMode(boolean inAmbientMode) {
-        mInAmbientMode = inAmbientMode;
-    }
-
-    /** Returns whether the complication is rendered in ambient mode. */
-    public boolean isInAmbientMode() {
-        return mInAmbientMode;
-    }
-
-    /**
-     * Sets whether the complication, when rendering in ambient mode, should apply a style suitable
-     * for low bit ambient mode.
-     */
-    public void setLowBitAmbient(boolean lowBitAmbient) {
-        mLowBitAmbient = lowBitAmbient;
-    }
-
-    /**
-     * Returns whether the complication, when rendering in ambient mode, should apply a style
-     * suitable for low bit ambient mode.
-     */
-    public boolean isLowBitAmbient() {
-        return mLowBitAmbient;
-    }
-
-    /**
-     * Sets whether the complication, when rendering in ambient mode, should apply a style suitable
-     * for display on devices with burn in protection.
-     */
-    public void setBurnInProtection(boolean burnInProtection) {
-        mBurnInProtection = burnInProtection;
-    }
-
-    /**
-     * Whether the complication, when rendering in ambient mode, should apply a style suitable for
-     * display on devices with burn in protection.
-     */
-    public boolean isBurnInProtectionOn() {
-        return mBurnInProtection;
-    }
-
-    /**
-     * Sets the current time in mulliseconds since the epoch. This will be used to render
-     * {@link ComplicationData} with time dependent text.
-     *
-     * @param currentTimeMillis time in milliseconds since the epoch
-     */
-    public void setCurrentTimeMillis(long currentTimeMillis) {
-        mCurrentTimeMillis = currentTimeMillis;
-    }
-
-    /**
-     * Returns the time in milliseconds since the epoch used for rendering {@link ComplicationData}
-     * with time dependent text.
-     */
-    public long getCurrentTimeMillis() {
-        return mCurrentTimeMillis;
-    }
-
-    /**
-     * Sets whether the complication is currently highlighted. This may be called by a watch face
-     * when a complication is tapped.
-     *
-     * <p>If watch face is in ambient mode, highlight will not be visible even if this is set to
-     * {@code true}, because it may cause burn-in or power inefficiency.
-     */
-    public void setHighlighted(boolean isHighlighted) {
-        mHighlighted = isHighlighted;
-    }
-
-    /**
-     * Returns whether the complication is currently highlighted.
-     */
-    public boolean isHighlighted() {
-        return mHighlighted;
-    }
-
-    /**
-     * Sends the tap action for the complication if tap coordinates are inside the complication
-     * bounds.
-     *
-     * <p>This method will also highlight the complication. The highlight duration is 300
-     * milliseconds by default but can be modified using the {@link #setHighlightDuration(long)}
-     * method.
-     *
-     * <p>If {@link ComplicationData} has the type {@link ComplicationData#TYPE_NO_PERMISSION}, this
-     * method will launch an intent to request complication permission for the watch face. This will
-     * only work if the context set by {@link #getDrawable} or the constructor is an
-     * instance of WatchFaceService.
-     *
-     * @param x X coordinate of the tap relative to screen origin
-     * @param y Y coordinate of the tap relative to screen origin
-     * @return {@code true} if the action was successful, {@code false} if complication data is not
-     * set, the complication has no tap action, the tap action (i.e. {@link
-     * android.app.PendingIntent}) is cancelled, or the given x and y are not inside the
-     * complication bounds.
-     */
-    public boolean onTap(@Px int x, @Px int y) {
-        if (mComplicationRenderer == null) {
-            return false;
-        }
-        ComplicationData data = mComplicationRenderer.getComplicationData();
-        if (data == null) {
-            return false;
-        }
-        if (!data.hasTapAction() && data.getType() != ComplicationData.TYPE_NO_PERMISSION) {
-            return false;
-        }
-        if (!getBounds().contains(x, y)) {
-            return false;
-        }
-        if (data.getType() == ComplicationData.TYPE_NO_PERMISSION) {
-            // Check if mContext is an instance of WatchFaceService. We can't use the standard
-            // instanceof operator because WatchFaceService is defined in library which depends on
-            // this one, hence the reflection hack.
-            try {
-                if (Class.forName("androidx.wear.watchface.WatchFaceService")
-                        .isInstance(mContext)) {
-                    mContext.startActivity(
-                            ComplicationHelperActivity.createPermissionRequestHelperIntent(
-                                    mContext,
-                                    new ComponentName(mContext, mContext.getClass()))
-                                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
-                } else {
-                    return false;
-                }
-            } catch (ClassNotFoundException e) {
-                // If watchFaceServiceClass class isn't found we know mContext can't be an instance
-                // of WatchFaceService.
-                return false;
-            }
-        } else {
-            try {
-                data.getTapAction().send();
-            } catch (CanceledException e) {
-                return false;
-            }
-        }
-        if (getHighlightDuration() > 0) {
-            setHighlighted(true);
-            invalidateSelf();
-            mMainThreadHandler.removeCallbacks(mUnhighlightRunnable);
-            mMainThreadHandler.postDelayed(mUnhighlightRunnable, getHighlightDuration());
-        }
-        return true;
-    }
-
-    /**
-     * Sets the duration for the complication to stay highlighted after calling the {@link
-     * #onTap(int, int)} method. Default value is 300 milliseconds. Setting highlight duration to 0
-     * disables highlighting.
-     *
-     * @param highlightDurationMillis highlight duration in milliseconds
-     */
-    public void setHighlightDuration(@IntRange(from = 0) long highlightDurationMillis) {
-        if (highlightDurationMillis < 0) {
-            throw new IllegalArgumentException("Highlight duration should be non-negative.");
-        }
-        mHighlightDuration = highlightDurationMillis;
-    }
-
-    /** Returns the highlight duration. */
-    public long getHighlightDuration() {
-        return mHighlightDuration;
-    }
-
-    /** Builds styles and syncs them with the complication renderer. */
-    void updateStyleIfRequired() {
-        if (mActiveStyle.isDirty() || mAmbientStyle.isDirty()) {
-            mComplicationRenderer.updateStyle(mActiveStyle, mAmbientStyle);
-            mActiveStyle.clearDirtyFlag();
-            mAmbientStyle.clearDirtyFlag();
-        }
-    }
-
-    /**
-     * Throws an exception if the context is not set. This method should be called if any of the
-     * member methods do a context-dependent job.
-     */
-    private void assertInitialized() {
-        if (mContext == null) {
-            throw new IllegalStateException(
-                    "ComplicationDrawable does not have a context. Use setContext(Context) to set"
-                            + " it first.");
-        }
-    }
-
-    /** Returns complication style for active mode. */
-    @NonNull
-    public ComplicationStyle getActiveStyle() {
-        return mActiveStyle;
-    }
-
-    /** Returns complication style for ambient mode. */
-    @NonNull
-    public ComplicationStyle getAmbientStyle() {
-        return mAmbientStyle;
-    }
-
-    /** Returns complication renderer. */
-    @Nullable
-    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-    public ComplicationRenderer getComplicationRenderer() {
-        return mComplicationRenderer;
-    }
-
-    /**
-     * Returns the text to be rendered when {@link ComplicationData} is of type {@link
-     * ComplicationData#TYPE_NO_DATA}.
-     */
-    @Nullable
-    public CharSequence getNoDataText() {
-        return mNoDataText;
-    }
-}
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
new file mode 100644
index 0000000..0639d79
--- /dev/null
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationDrawable.kt
@@ -0,0 +1,751 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.watchface.complications.rendering
+
+import android.app.PendingIntent
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.graphics.Canvas
+import android.graphics.ColorFilter
+import android.graphics.Rect
+import android.graphics.Typeface
+import android.graphics.drawable.Drawable
+import android.os.Handler
+import android.os.Looper
+import android.text.TextUtils
+import android.util.AttributeSet
+import android.util.Log
+import android.util.Xml
+import androidx.annotation.IntRange
+import androidx.annotation.Px
+import androidx.annotation.VisibleForTesting
+import androidx.wear.complications.ComplicationHelperActivity
+import androidx.wear.complications.data.ComplicationData
+import androidx.wear.complications.data.ComplicationType.NO_DATA
+import androidx.wear.complications.data.ComplicationType.NO_PERMISSION
+import androidx.wear.complications.data.ComplicationType.RANGED_VALUE
+import androidx.wear.complications.data.toApiComplicationData
+import androidx.wear.watchface.complications.rendering.ComplicationRenderer.OnInvalidateListener
+import org.xmlpull.v1.XmlPullParser
+import org.xmlpull.v1.XmlPullParserException
+import java.io.IOException
+
+/**
+ * A styleable drawable object that draws complications. You can create a ComplicationDrawable from
+ * XML inflation or by using one of the constructor methods.
+ *
+ * <h3>Constructing a ComplicationDrawable</h3>
+ *
+ * To construct a ComplicationDrawable programmatically, use the [ComplicationDrawable]
+ * constructor. Afterwards, styling attributes you want to modify
+ * can be set via set methods.
+ *
+ * ```
+ * public void onCreate(SurfaceHolder holder) {
+ * ...
+ * ComplicationDrawable complicationDrawable = new ComplicationDrawable(WatchFaceService.this);
+ * complicationDrawable.setBackgroundColorActive(backgroundColor);
+ * complicationDrawable.setTextColorActive(textColor);
+ * ...
+ * }
+ * ```
+ *
+ * <h3>Constructing a ComplicationDrawable from XML</h3>
+ *
+ * Constructing a ComplicationDrawable from an XML file makes it easier to modify multiple
+ * styling attributes at once without calling any set methods. You may also use different XML files
+ * to switch between different styles your watch face supports.
+ *
+ *
+ * To construct a ComplicationDrawable from a drawable XML file, you may create an XML file in
+ * your project's `res/drawable` folder. A ComplicationDrawable with red text and white title
+ * in active mode, and white text and white title in ambient mode would look like this:
+ *
+ * ```
+ * <?xml version="1.0" encoding="utf-8"?>
+ * <android.support.wearable.complications.rendering.ComplicationDrawable
+ * xmlns:app="http://schemas.android.com/apk/res-auto"
+ * app:textColor="#FFFF0000"
+ * app:titleColor="#FFFFFFFF">
+ * <ambient
+ * app:textColor="#FFFFFFFF" />
+ * </android.support.wearable.complications.rendering.ComplicationDrawable>
+ * ```
+ *
+ *
+ * A top-level `drawable` tag with the `class` attribute may also be used to
+ * construct a ComplicationDrawable from an XML file:
+ *
+ * ```
+ * <?xml version="1.0" encoding="utf-8"?>
+ * <drawable
+ * class="android.support.wearable.complications.rendering.ComplicationDrawable"
+ * xmlns:app="http://schemas.android.com/apk/res-auto"
+ * app:textColor="#FFFF0000"
+ * app:titleColor="#FFFFFFFF">
+ * <ambient
+ * app:textColor="#FFFFFFFF" />
+ * </drawable>
+ * ```
+ *
+ * To inflate a ComplicationDrawable from XML file, use the [.getDrawable]
+ * method. ComplicationDrawable needs access to the current context in order to style and draw
+ * the complication.
+ *
+ * ```
+ * public void onCreate(SurfaceHolder holder) {
+ * ...
+ * ComplicationDrawable complicationDrawable = (ComplicationDrawable)
+ * getDrawable(R.drawable.complication);
+ * complicationDrawable.setContext(WatchFaceService.this);
+ * ...
+ * }
+ * ```
+ *
+ * <h4>Syntax:</h4>
+ * ```
+ * <?xml version="1.0" encoding="utf-8"?>
+ * <android.support.wearable.complications.rendering.ComplicationDrawable
+ * xmlns:app="http://schemas.android.com/apk/res-auto"
+ * app:backgroundColor="color"
+ * app:backgroundDrawable="drawable"
+ * app:borderColor="color"
+ * app:borderDashGap="dimension"
+ * app:borderDashWidth="dimension"
+ * app:borderRadius="dimension"
+ * app:borderStyle="none|solid|dashed"
+ * app:borderWidth="dimension"
+ * app:highlightColor="color"
+ * app:iconColor="color"
+ * app:rangedValuePrimaryColor="color"
+ * app:rangedValueProgressHidden="boolean"
+ * app:rangedValueRingWidth="dimension"
+ * app:rangedValueSecondaryColor="color"
+ * app:textColor="color"
+ * app:textSize="dimension"
+ * app:textTypeface="string"
+ * app:titleColor="color"
+ * app:titleSize="dimension"
+ * app:titleTypeface="string">
+ * <ambient
+ * app:backgroundColor="color"
+ * app:backgroundDrawable="drawable"
+ * app:borderColor="color"
+ * app:borderDashGap="dimension"
+ * app:borderDashWidth="dimension"
+ * app:borderRadius="dimension"
+ * app:borderStyle="none|solid|dashed"
+ * app:borderWidth="dimension"
+ * app:highlightColor="color"
+ * app:iconColor="color"
+ * app:rangedValuePrimaryColor="color"
+ * app:rangedValueRingWidth="dimension"
+ * app:rangedValueSecondaryColor="color"
+ * app:textColor="color"
+ * app:textSize="dimension"
+ * app:textTypeface="string"
+ * app:titleColor="color"
+ * app:titleSize="dimension"
+ * app:titleTypeface="string" />
+ * </android.support.wearable.complications.rendering.ComplicationDrawable>
+ * ```
+ *
+ * Attributes of the top-level tag apply to both active and ambient modes while attributes of the
+ * inner `ambient` tag only apply to ambient mode. As an exception, top-level only
+ * `rangedValueProgressHidden` attribute applies to both modes, and cannot be overridden in ambient
+ * mode. To hide ranged value in only one of the active or ambient modes, you may consider setting
+ * `rangedValuePrimaryColor` and `rangedValueSecondaryColor` to [android.graphics.Color.TRANSPARENT]
+ * instead.
+ *
+ * <h3>Drawing a ComplicationDrawable</h3>
+ *
+ * Depending on the size and shape of the bounds, the layout of the complication may change. For
+ * instance, a short text complication with an icon that is drawn on square bounds would draw the
+ * icon above the short text, but a short text complication with an icon that is drawn on wide
+ * rectangular bounds might draw the icon to the left of the short text instead.
+ */
+public class ComplicationDrawable : Drawable {
+    /**
+     * Returns the [Context] used to render the complication.
+     */
+    public var context: Context? = null
+        private set
+
+    /** Returns complication renderer.  */
+    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+    @get:JvmName("getComplicationRenderer")
+    internal var complicationRenderer: ComplicationRenderer? = null
+        private set
+
+    /** Returns complication style for active mode.  */
+    public val activeStyle: ComplicationStyle
+
+    /** Returns complication style for ambient mode.  */
+    public val ambientStyle: ComplicationStyle
+
+    private val mainThreadHandler = Handler(Looper.getMainLooper())
+    private val unhighlightRunnable = Runnable {
+        isHighlighted = false
+        invalidateSelf()
+    }
+    private val rendererInvalidateListener = OnInvalidateListener { invalidateSelf() }
+
+    /**
+     * The time in milliseconds since the epoch used for rendering [ComplicationData]
+     * with time dependent text.
+     */
+    public var currentTimeMillis: Long = 0
+
+    /** Whether the complication is rendered in ambient mode.  */
+    public var isInAmbientMode: Boolean = false
+
+    /**
+     * Whether the complication, when rendering in ambient mode, should apply a style
+     * suitable for low bit ambient mode.
+     */
+    public var isLowBitAmbient: Boolean = false
+
+    /**
+     * Whether the complication, when rendering in ambient mode, should apply a style suitable for
+     * display on devices with burn in protection.
+     */
+    public var isBurnInProtectionOn: Boolean = false
+
+    /**
+     * Whether the complication is currently highlighted. This may be called by a watch face
+     * when a complication is tapped.
+     *
+     * If watch face is in ambient mode, highlight will not be visible even if this is set to
+     * `true`, because it may cause burn-in or power inefficiency.
+     */
+    public var isHighlighted: Boolean = false
+
+    private var isInflatedFromXml = false
+    private var alreadyStyled = false
+
+    /** Default constructor.  */
+    public constructor() {
+        activeStyle = ComplicationStyle()
+        ambientStyle = ComplicationStyle()
+    }
+
+    /**
+     * Creates a ComplicationDrawable using the given context. If this constructor is used, calling
+     * [.setContext] may not be necessary.
+     */
+    public constructor(context: Context) : this() {
+        setContext(context)
+    }
+
+    public constructor(drawable: ComplicationDrawable) {
+        activeStyle = ComplicationStyle(drawable.activeStyle)
+        ambientStyle = ComplicationStyle(drawable.ambientStyle)
+        noDataText = drawable.noDataText!!.subSequence(0, drawable.noDataText!!.length)
+        highlightDuration = drawable.highlightDuration
+        currentTimeMillis = drawable.currentTimeMillis
+        bounds = drawable.bounds
+        isInAmbientMode = drawable.isInAmbientMode
+        isLowBitAmbient = drawable.isLowBitAmbient
+        isBurnInProtectionOn = drawable.isBurnInProtectionOn
+        isHighlighted = false
+        isRangedValueProgressHidden = drawable.isRangedValueProgressHidden
+        isInflatedFromXml = drawable.isInflatedFromXml
+        alreadyStyled = true
+    }
+
+    /**
+     * Sets the context used to render the complication. If a context is not set,
+     * ComplicationDrawable will throw an [IllegalStateException] if one of [draw], [setBounds],
+     * or [setComplicationData] is called.
+     *
+     * While this can be called from any context, ideally, a
+     * androidx.wear.watchface.WatchFaceService object should be passed here to allow creating
+     * permission dialogs by the [onTap] method, in case current watch face doesn't have the
+     * permission to receive complication data.
+     *
+     * If this ComplicationDrawable is retrieved using [Resources.getDrawable], this method must
+     * be called before calling any of the methods mentioned above.
+     *
+     * If this ComplicationDrawable is not inflated from an XML file, this method will reset the
+     * style to match the default values, so if [ComplicationDrawable()] is used to construct a
+     * ComplicationDrawable, this method should be called right after.
+     */
+    public fun setContext(context: Context) {
+        if (context == this.context) {
+            return
+        }
+        this.context = context
+        if (!isInflatedFromXml && !alreadyStyled) {
+            setStyleToDefaultValues(activeStyle, context.resources)
+            setStyleToDefaultValues(ambientStyle, context.resources)
+        }
+        if (!alreadyStyled) {
+            highlightDuration = context.resources
+                .getInteger(R.integer.complicationDrawable_highlightDurationMs).toLong()
+        }
+        complicationRenderer = ComplicationRenderer(this.context, activeStyle, ambientStyle)
+        val nonNullComplicationRenderer = complicationRenderer!!
+        nonNullComplicationRenderer.setOnInvalidateListener(rendererInvalidateListener)
+        if (noDataText == null) {
+            noDataText = context.getString(R.string.complicationDrawable_noDataText)
+        } else {
+            nonNullComplicationRenderer.setNoDataText(noDataText)
+        }
+        nonNullComplicationRenderer.isRangedValueProgressHidden = isRangedValueProgressHidden
+        nonNullComplicationRenderer.bounds = bounds
+    }
+
+    private fun inflateAttributes(r: Resources, parser: XmlPullParser) {
+        val a = r.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.ComplicationDrawable)
+        isRangedValueProgressHidden =
+            a.getBoolean(R.styleable.ComplicationDrawable_rangedValueProgressHidden, false)
+        a.recycle()
+    }
+
+    private fun inflateStyle(isAmbient: Boolean, r: Resources, parser: XmlPullParser) {
+        val a = r.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.ComplicationDrawable)
+        val complicationStyle = if (isAmbient) ambientStyle else activeStyle
+        if (a.hasValue(R.styleable.ComplicationDrawable_backgroundColor)) {
+            complicationStyle.backgroundColor = a.getColor(
+                R.styleable.ComplicationDrawable_backgroundColor,
+                r.getColor(R.color.complicationDrawable_backgroundColor, null)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_backgroundDrawable)) {
+            complicationStyle.backgroundDrawable =
+                a.getDrawable(R.styleable.ComplicationDrawable_backgroundDrawable)
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_textColor)) {
+            complicationStyle.textColor = a.getColor(
+                R.styleable.ComplicationDrawable_textColor,
+                r.getColor(R.color.complicationDrawable_textColor, null)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_titleColor)) {
+            complicationStyle.titleColor = a.getColor(
+                R.styleable.ComplicationDrawable_titleColor,
+                r.getColor(R.color.complicationDrawable_titleColor, null)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_textTypeface)) {
+            complicationStyle.setTextTypeface(
+                Typeface.create(
+                    a.getString(R.styleable.ComplicationDrawable_textTypeface),
+                    Typeface.NORMAL
+                )
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_titleTypeface)) {
+            complicationStyle.setTitleTypeface(
+                Typeface.create(
+                    a.getString(R.styleable.ComplicationDrawable_titleTypeface),
+                    Typeface.NORMAL
+                )
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_textSize)) {
+            complicationStyle.textSize = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_textSize,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_textSize)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_titleSize)) {
+            complicationStyle.titleSize = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_titleSize,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_titleSize)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_iconColor)) {
+            complicationStyle.iconColor = a.getColor(
+                R.styleable.ComplicationDrawable_iconColor,
+                r.getColor(R.color.complicationDrawable_iconColor, null)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderColor)) {
+            complicationStyle.borderColor = a.getColor(
+                R.styleable.ComplicationDrawable_borderColor,
+                r.getColor(R.color.complicationDrawable_borderColor, null)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderRadius)) {
+            complicationStyle.borderRadius = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_borderRadius,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderRadius)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderStyle)) {
+            complicationStyle.borderStyle = a.getInt(
+                R.styleable.ComplicationDrawable_borderStyle,
+                r.getInteger(R.integer.complicationDrawable_borderStyle)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderDashWidth)) {
+            complicationStyle.borderDashWidth = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_borderDashWidth,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashWidth)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderDashGap)) {
+            complicationStyle.borderDashGap = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_borderDashGap,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashGap)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_borderWidth)) {
+            complicationStyle.borderWidth = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_borderWidth,
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderWidth)
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValueRingWidth)) {
+            complicationStyle.rangedValueRingWidth = a.getDimensionPixelSize(
+                R.styleable.ComplicationDrawable_rangedValueRingWidth,
+                r.getDimensionPixelSize(
+                    R.dimen.complicationDrawable_rangedValueRingWidth
+                )
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValuePrimaryColor)) {
+            complicationStyle.rangedValuePrimaryColor = a.getColor(
+                R.styleable.ComplicationDrawable_rangedValuePrimaryColor,
+                r.getColor(
+                    R.color.complicationDrawable_rangedValuePrimaryColor, null
+                )
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_rangedValueSecondaryColor)) {
+            complicationStyle.rangedValueSecondaryColor = a.getColor(
+                R.styleable.ComplicationDrawable_rangedValueSecondaryColor,
+                r.getColor(
+                    R.color.complicationDrawable_rangedValueSecondaryColor, null
+                )
+            )
+        }
+        if (a.hasValue(R.styleable.ComplicationDrawable_highlightColor)) {
+            complicationStyle.highlightColor = a.getColor(
+                R.styleable.ComplicationDrawable_highlightColor,
+                r.getColor(R.color.complicationDrawable_highlightColor, null)
+            )
+        }
+        a.recycle()
+    }
+
+    /**
+     * Inflates this ComplicationDrawable from an XML resource. This can't be called more than once
+     * for each ComplicationDrawable. Note that framework may have called this once to create the
+     * ComplicationDrawable instance from an XML resource.
+     *
+     * @param r      Resources used to resolve attribute values
+     * @param parser XML parser from which to inflate this ComplicationDrawable
+     * @param attrs  Base set of attribute values
+     * @param theme  Ignored by ComplicationDrawable
+     */
+    @Throws(XmlPullParserException::class, IOException::class)
+    public override fun inflate(
+        r: Resources,
+        parser: XmlPullParser,
+        attrs: AttributeSet,
+        theme: Resources.Theme?
+    ) {
+        check(!isInflatedFromXml) { "inflate may be called once only." }
+        isInflatedFromXml = true
+        var type: Int
+        val outerDepth = parser.depth
+        // Inflate attributes always shared between active and ambient mode
+        inflateAttributes(r, parser)
+        // Reset both style builders to default values
+        setStyleToDefaultValues(activeStyle, r)
+        setStyleToDefaultValues(ambientStyle, r)
+        // Attributes of the outer tag applies to both active and ambient styles
+        inflateStyle(false, r, parser)
+        inflateStyle(true, r, parser)
+        while (
+            parser.next().also { type = it } != XmlPullParser.END_DOCUMENT &&
+            (type != XmlPullParser.END_TAG || parser.depth > outerDepth)
+        ) {
+            if (type != XmlPullParser.START_TAG) {
+                continue
+            }
+
+            // Attributes of inner <ambient> tag applies to ambient style only
+            val name = parser.name
+            if (TextUtils.equals(name, "ambient")) {
+                inflateStyle(true, r, parser)
+            } else {
+                Log.w(
+                    "ComplicationDrawable",
+                    "Unknown element: $name for ComplicationDrawable $this"
+                )
+            }
+        }
+    }
+
+    /**
+     * Draws the complication for the last known time. Last known time is derived from
+     * ComplicationDrawable#setCurrentTimeMillis(long)}.
+     *
+     * @param canvas Canvas for the complication to be drawn onto
+     */
+    public override fun draw(canvas: Canvas) {
+        assertInitialized()
+        updateStyleIfRequired()
+        complicationRenderer?.draw(
+            canvas,
+            currentTimeMillis,
+            isInAmbientMode,
+            isLowBitAmbient,
+            isBurnInProtectionOn,
+            isHighlighted
+        )
+    }
+
+    /**
+     * This function is not supported in [ComplicationDrawable].
+     *
+     * @throws [UnsupportedOperationException] when called.
+     */
+    public override fun setAlpha(@IntRange(from = 0, to = 255) alpha: Int) {
+        throw UnsupportedOperationException("setAlpha is not supported in ComplicationDrawable.")
+    }
+
+    /**
+     * This function is not supported in [ComplicationDrawable]. Use
+     * [ComplicationStyle.imageColorFilter] instead to apply color filter to small and large images.
+     *
+     * @throws [UnsupportedOperationException] when called.
+     */
+    public override fun setColorFilter(colorFilter: ColorFilter?) {
+        throw UnsupportedOperationException(
+            "setColorFilter is not supported in ComplicationDrawable."
+        )
+    }
+
+    /** @throws [UnsupportedOperationException] when called. */
+    @Deprecated("This method is no longer used in graphics optimizations")
+    override fun getOpacity(): Int =
+        throw UnsupportedOperationException("getOpacity is not supported in ComplicationDrawable.")
+
+    protected override fun onBoundsChange(bounds: Rect) {
+        if (complicationRenderer != null) {
+            complicationRenderer!!.bounds = bounds
+        }
+    }
+
+    /** If the ranged value progress should be hidden when [ComplicationData] is of type
+     * [RANGED_VALUE].
+     *
+     * @attr ref androidx.wear.watchface.complications.rendering.R
+     * .styleable#ComplicationDrawable_rangedValueProgressHidden
+     */
+    public var isRangedValueProgressHidden: Boolean = false
+        set(rangedValueProgressHidden) {
+            field = rangedValueProgressHidden
+            complicationRenderer?.isRangedValueProgressHidden = rangedValueProgressHidden
+        }
+
+    /**
+     * Sets the complication data to be drawn. If `complicationData` is `null`, nothing
+     * will be drawn when [draw] is called.
+     *
+     * @param complicationData The [ComplicationData] to set
+     * @param loadDrawablesAsync If true any drawables should be loaded asynchronously,
+     * otherwise they will be loaded synchronously.
+     */
+    public fun setComplicationData(
+        complicationData: ComplicationData?,
+        loadDrawablesAsync: Boolean
+    ) {
+        assertInitialized()
+        complicationRenderer?.setComplicationData(
+            complicationData?.asWireComplicationData(),
+            loadDrawablesAsync
+        )
+    }
+
+    /**
+     * Returns the [ComplicationData] to be drawn by this ComplicationDrawable.
+     */
+    public val complicationData: ComplicationData?
+        get() = if (complicationRenderer?.complicationData != null)
+            complicationRenderer!!.complicationData.toApiComplicationData()
+        else null
+
+    /**
+     * Sends the tap action for the complication if tap coordinates are inside the complication
+     * bounds.
+     *
+     * This method will also highlight the complication. The highlight duration is 300
+     * milliseconds by default but can be modified using the [.setHighlightDuration]
+     * method.
+     *
+     * If [ComplicationData] has the type [NO_PERMISSION], this method will launch an intent to
+     * request complication permission for the watch face. This will only work if the context set
+     * by [getDrawable] or the constructor is an instance of WatchFaceService.
+     *
+     * @param x X coordinate of the tap relative to screen origin
+     * @param y Y coordinate of the tap relative to screen origin
+     * @return `true` if the action was successful, `false` if complication data is not set, the
+     * complication has no tap action, the tap action (i.e. [android.app.PendingIntent]) is
+     * cancelled, or the given x and y are not inside the complication bounds.
+     */
+    public fun onTap(@Px x: Int, @Px y: Int): Boolean {
+        if (complicationRenderer == null) {
+            return false
+        }
+        val data = complicationRenderer!!.complicationData ?: return false
+        if (!data.hasTapAction() && data.type
+            != android.support.wearable.complications.ComplicationData.TYPE_NO_PERMISSION
+        ) {
+            return false
+        }
+        if (!bounds.contains(x, y)) {
+            return false
+        }
+        if (data.type
+            == android.support.wearable.complications.ComplicationData.TYPE_NO_PERMISSION
+        ) {
+            // Check if context is an instance of WatchFaceService. We can't use the standard
+            // instanceof operator because WatchFaceService is defined in library which depends on
+            // this one, hence the reflection hack.
+            try {
+                if (context!!::class.java.name == "androidx.wear.watchface.WatchFaceService") {
+                    context!!.startActivity(
+                        ComplicationHelperActivity.createPermissionRequestHelperIntent(
+                            context!!,
+                            ComponentName(context!!, context!!.javaClass)
+                        )
+                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                    )
+                } else {
+                    return false
+                }
+            } catch (e: ClassNotFoundException) {
+                // If watchFaceServiceClass class isn't found we know context can't be an instance
+                // of WatchFaceService.
+                return false
+            }
+        } else {
+            try {
+                data.tapAction!!.send()
+            } catch (e: PendingIntent.CanceledException) {
+                return false
+            }
+        }
+        if (highlightDuration > 0) {
+            isHighlighted = true
+            invalidateSelf()
+            mainThreadHandler.removeCallbacks(unhighlightRunnable)
+            mainThreadHandler.postDelayed(unhighlightRunnable, highlightDuration)
+        }
+        return true
+    }
+
+    /** The duration for the complication to stay highlighted after calling the [onTap] method.
+     * Default value is 300 milliseconds. Setting highlight duration to 0 disables highlighting.
+     */
+    public var highlightDuration: Long = 0
+        set(@IntRange(from = 0) highlightDurationMillis: Long) {
+            require(highlightDurationMillis >= 0) { "Highlight duration should be non-negative." }
+            field = highlightDurationMillis
+        }
+
+    /** Builds styles and syncs them with the complication renderer.  */
+    @JvmName(name = "updateStyleIfRequired")
+    internal fun updateStyleIfRequired() {
+        if (activeStyle.isDirty || ambientStyle.isDirty) {
+            complicationRenderer!!.updateStyle(activeStyle, ambientStyle)
+            activeStyle.clearDirtyFlag()
+            ambientStyle.clearDirtyFlag()
+        }
+    }
+
+    /**
+     * Throws an exception if the context is not set. This method should be called if any of the
+     * member methods do a context-dependent job.
+     */
+    private fun assertInitialized() {
+        checkNotNull(context) {
+            "ComplicationDrawable does not have a context. Use setContext(Context) to set it first."
+        }
+    }
+    /**
+     * The text to be rendered when [ComplicationData] is of type [NO_DATA]. If `noDataText` is
+     * null, an empty text will be
+     * rendered.
+     */
+    public var noDataText: CharSequence? = null
+        set(noDataText) {
+            field = noDataText?.subSequence(0, noDataText.length) ?: ""
+            if (complicationRenderer != null) {
+                complicationRenderer!!.setNoDataText(field)
+            }
+        }
+
+    public companion object {
+        /**
+         * Creates a ComplicationDrawable from a resource.
+         *
+         * @param context The [Context] to load the resource from
+         * @param id      The id of the resource to load
+         * @return The [ComplicationDrawable] loaded from the specified resource id or null if it
+         * doesn't exist.
+         */
+        @JvmStatic
+        public fun getDrawable(context: Context, id: Int): ComplicationDrawable? {
+            val drawable = context.getDrawable(id) as ComplicationDrawable? ?: return null
+            drawable.setContext(context)
+            return drawable
+        }
+
+        /** Sets the style to default values using resources.  */
+        @JvmStatic
+        internal fun setStyleToDefaultValues(style: ComplicationStyle, r: Resources) {
+            style.backgroundColor = r.getColor(R.color.complicationDrawable_backgroundColor, null)
+            style.textColor = r.getColor(R.color.complicationDrawable_textColor, null)
+            style.titleColor = r.getColor(R.color.complicationDrawable_titleColor, null)
+            style.setTextTypeface(
+                Typeface.create(
+                    r.getString(R.string.complicationDrawable_textTypeface), Typeface.NORMAL
+                )
+            )
+            style.setTitleTypeface(
+                Typeface.create(
+                    r.getString(R.string.complicationDrawable_titleTypeface), Typeface.NORMAL
+                )
+            )
+            style.textSize = r.getDimensionPixelSize(R.dimen.complicationDrawable_textSize)
+            style.titleSize = r.getDimensionPixelSize(R.dimen.complicationDrawable_titleSize)
+            style.iconColor = r.getColor(R.color.complicationDrawable_iconColor, null)
+            style.borderColor = r.getColor(R.color.complicationDrawable_borderColor, null)
+            style.borderWidth = r.getDimensionPixelSize(R.dimen.complicationDrawable_borderWidth)
+            style.borderRadius = r.getDimensionPixelSize(R.dimen.complicationDrawable_borderRadius)
+            style.borderStyle = r.getInteger(R.integer.complicationDrawable_borderStyle)
+            style.borderDashWidth =
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashWidth)
+            style.borderDashGap =
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_borderDashGap)
+            style.rangedValueRingWidth =
+                r.getDimensionPixelSize(R.dimen.complicationDrawable_rangedValueRingWidth)
+            style.rangedValuePrimaryColor =
+                r.getColor(R.color.complicationDrawable_rangedValuePrimaryColor, null)
+            style.rangedValueSecondaryColor =
+                r.getColor(R.color.complicationDrawable_rangedValueSecondaryColor, null)
+            style.highlightColor = r.getColor(R.color.complicationDrawable_highlightColor, null)
+        }
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.kt
new file mode 100644
index 0000000..ca6f60a
--- /dev/null
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationHighlightRenderer.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.wear.watchface.complications.rendering
+
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffXfermode
+import android.graphics.Rect
+import android.graphics.RectF
+import androidx.annotation.ColorInt
+import androidx.annotation.Px
+import kotlin.math.floor
+
+/** Helper for rendering a thick outline around a complication to highlight it. */
+public class ComplicationHighlightRenderer(
+    @Px private val outlineExpansion: Float,
+    @Px outlineStrokeWidth: Float
+) {
+    private val transparentWhitePaint = Paint().apply {
+        style = Paint.Style.FILL
+        color = Color.argb(0, 255, 255, 255) // Transparent white
+        xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)
+        isAntiAlias = true
+    }
+
+    private val outlinePaint = Paint().apply {
+        style = Paint.Style.STROKE
+        strokeWidth = outlineStrokeWidth
+        isAntiAlias = true
+    }
+
+    /**
+     * Intended for use by [CanvasComplicationDrawable.drawHighlight]. Draws a thick line around the
+     * complication with [color] and with the given bounds.  Fills the center of the complication
+     * with transparent white. When composited on top of the underlying watchface the complication's
+     * original pixels will be preserved with their original brightness.
+     */
+    public fun drawComplicationHighlight(
+        canvas: Canvas,
+        bounds: Rect,
+        @ColorInt color: Int
+    ) {
+        outlinePaint.color = color
+        val radius = bounds.height() / 2.0f
+        if (bounds.width() == bounds.height()) {
+            // Round the center coordinates to the nearest whole integer.
+            val ctrX = floor(bounds.exactCenterX() + 0.5f)
+            val ctrY = floor(bounds.exactCenterY() + 0.5f)
+
+            canvas.drawCircle(
+                ctrX,
+                ctrY,
+                radius + outlineExpansion,
+                transparentWhitePaint
+            )
+
+            canvas.drawCircle(
+                ctrX,
+                ctrY,
+                radius + outlineExpansion,
+                outlinePaint
+            )
+        } else {
+            canvas.drawRoundRect(
+                RectF(
+                    bounds.left.toFloat() - outlineExpansion,
+                    bounds.top.toFloat() - outlineExpansion,
+                    bounds.right.toFloat() + outlineExpansion,
+                    bounds.bottom.toFloat() + outlineExpansion
+                ),
+                radius,
+                radius,
+                transparentWhitePaint
+            )
+
+            canvas.drawRoundRect(
+                RectF(
+                    bounds.left.toFloat() - outlineExpansion,
+                    bounds.top.toFloat() - outlineExpansion,
+                    bounds.right.toFloat() + outlineExpansion,
+                    bounds.bottom.toFloat() + outlineExpansion
+                ),
+                radius,
+                radius,
+                outlinePaint
+            )
+        }
+    }
+}
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
index 1445266..82dfc2f 100644
--- a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
@@ -129,9 +129,9 @@
     Drawable mLargeImage;
 
     // Drawables for rendering rounded images
-    private final RoundedDrawable mRoundedBackgroundDrawable = new RoundedDrawable();
-    private final RoundedDrawable mRoundedLargeImage = new RoundedDrawable();
-    private final RoundedDrawable mRoundedSmallImage = new RoundedDrawable();
+    private RoundedDrawable mRoundedBackgroundDrawable = null;
+    private RoundedDrawable mRoundedLargeImage = null;
+    private RoundedDrawable mRoundedSmallImage = null;
 
     // Text renderers
     private final TextRenderer mMainTextRenderer = new TextRenderer();
@@ -218,6 +218,10 @@
         }
         if (data == null) {
             mComplicationData = null;
+            // Free unnecessary RoundedDrawables.
+            mRoundedBackgroundDrawable = null;
+            mRoundedLargeImage = null;
+            mRoundedSmallImage = null;
             return;
         }
         if (data.getType() == ComplicationData.TYPE_NO_DATA) {
@@ -244,6 +248,13 @@
             loadDrawableIconAndImages();
         }
         calculateBounds();
+
+        // Based on the results of calculateBounds we know if mRoundedLargeImage or
+        // mSmallImageBounds are needed for rendering and can null the references if not required.
+        // NOTE mRoundedBackgroundDrawable has a different lifecycle which is based on the current
+        // paint mode so it doesn't make sense to clear it's reference here.
+        mRoundedLargeImage = null;
+        mRoundedSmallImage = null;
     }
 
     /**
@@ -322,10 +333,8 @@
         if (mComplicationData == null
                 || mComplicationData.getType() == ComplicationData.TYPE_EMPTY
                 || mComplicationData.getType() == ComplicationData.TYPE_NOT_CONFIGURED
-                || !mComplicationData.isActiveAt(currentTimeMillis)) {
-            return;
-        }
-        if (mBounds.isEmpty()) {
+                || !mComplicationData.isActiveAt(currentTimeMillis)
+                || mBounds.isEmpty()) {
             return;
         }
         // If in ambient mode but paint set is not usable with current ambient properties,
@@ -406,10 +415,15 @@
         canvas.drawRoundRect(mBackgroundBoundsF, radius, radius, paintSet.mBackgroundPaint);
         if (paintSet.mStyle.getBackgroundDrawable() != null
                 && !paintSet.isInBurnInProtectionMode()) {
+            if (mRoundedBackgroundDrawable == null) {
+                mRoundedBackgroundDrawable = new RoundedDrawable();
+            }
             mRoundedBackgroundDrawable.setDrawable(paintSet.mStyle.getBackgroundDrawable());
             mRoundedBackgroundDrawable.setRadius(radius);
             mRoundedBackgroundDrawable.setBounds(mBackgroundBounds);
             mRoundedBackgroundDrawable.draw(canvas);
+        } else {
+            mRoundedBackgroundDrawable = null;
         }
     }
 
@@ -520,6 +534,9 @@
         if (DEBUG_MODE) {
             canvas.drawRect(mSmallImageBounds, mDebugPaint);
         }
+        if (mRoundedSmallImage == null) {
+            mRoundedSmallImage = new RoundedDrawable();
+        }
         if (!paintSet.isInBurnInProtectionMode()) {
             mRoundedSmallImage.setDrawable(mSmallImage);
             if (mSmallImage == null) {
@@ -552,6 +569,9 @@
         }
         // Draw the image if not in burn in protection mode (in active mode or burn in not enabled)
         if (!paintSet.isInBurnInProtectionMode()) {
+            if (mRoundedLargeImage == null) {
+                mRoundedLargeImage = new RoundedDrawable();
+            }
             mRoundedLargeImage.setDrawable(mLargeImage);
             // Large image is always treated as photo style
             mRoundedLargeImage.setRadius(getImageBorderRadius(paintSet.mStyle, mLargeImageBounds));
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.java b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.java
deleted file mode 100644
index 86b57d81..0000000
--- a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface.complications.rendering;
-
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.support.wearable.complications.ComplicationData;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.Px;
-import androidx.annotation.RestrictTo;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Defines attributes to customize appearance of rendered {@link
- * android.support.wearable.complications.ComplicationData}.
- */
-public class ComplicationStyle {
-
-    /**
-     * Constants used to define border styles for complications.
-     *
-     * @hide
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({BORDER_STYLE_NONE, BORDER_STYLE_SOLID, BORDER_STYLE_DASHED})
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public @interface BorderStyle {
-    }
-
-    /** Style where the borders are not drawn. */
-    public static final int BORDER_STYLE_NONE = 0;
-
-    /** Style where the borders are drawn without any gap. */
-    public static final int BORDER_STYLE_SOLID = 1;
-
-    /**
-     * Style where the borders are drawn as dashed lines. If this is set as current border style,
-     * dash width and dash gap should also be set via {@link #setBorderDashWidth(int)},
-     * {@link #setBorderDashGap(int)}  or XML attributes, or default values will be used.
-     */
-    public static final int BORDER_STYLE_DASHED = 2;
-
-    /** Default primary color. */
-    private static final int PRIMARY_COLOR_DEFAULT = Color.WHITE;
-
-    /** Default secondary color. */
-    private static final int SECONDARY_COLOR_DEFAULT = Color.LTGRAY;
-
-    /** Default background color. */
-    private static final int BACKGROUND_COLOR_DEFAULT = Color.BLACK;
-
-    /** Default background color. */
-    private static final int HIGHLIGHT_COLOR_DEFAULT = Color.LTGRAY;
-
-    /** Default border color. */
-    private static final int BORDER_COLOR_DEFAULT = Color.WHITE;
-
-    /** Default text size. */
-    @Px
-    private static final int TEXT_SIZE_DEFAULT = Integer.MAX_VALUE;
-
-    /** Default typeface. */
-    private static final Typeface TYPEFACE_DEFAULT =
-            Typeface.create("sans-serif-condensed", Typeface.NORMAL);
-
-    /** Default dash width. */
-    @Px
-    private static final int DASH_WIDTH_DEFAULT = 3;
-
-    /** Default dash gap. */
-    @Px
-    private static final int DASH_GAP_DEFAULT = 3;
-
-    /** Default border width. */
-    @Px
-    private static final int BORDER_WIDTH_DEFAULT = 1;
-
-    /** Default ring width. */
-    @Px
-    private static final int RING_WIDTH_DEFAULT = 2;
-
-    /** Default border radius. */
-    @Px
-    public static final int BORDER_RADIUS_DEFAULT = Integer.MAX_VALUE;
-
-    @ColorInt
-    private int mBackgroundColor = BACKGROUND_COLOR_DEFAULT;
-    private Drawable mBackgroundDrawable = null;
-    @ColorInt
-    private int mTextColor = PRIMARY_COLOR_DEFAULT;
-    @ColorInt
-    private int mTitleColor = SECONDARY_COLOR_DEFAULT;
-    private Typeface mTextTypeface = TYPEFACE_DEFAULT;
-    private Typeface mTitleTypeface = TYPEFACE_DEFAULT;
-    @Px
-    private int mTextSize = TEXT_SIZE_DEFAULT;
-    @Px
-    private int mTitleSize = TEXT_SIZE_DEFAULT;
-    private ColorFilter mImageColorFilter = null;
-    @ColorInt
-    private int mIconColor = PRIMARY_COLOR_DEFAULT;
-    @ColorInt
-    private int mBorderColor = BORDER_COLOR_DEFAULT;
-    @BorderStyle
-    private int mBorderStyle = BORDER_STYLE_SOLID;
-    @Px
-    private int mBorderDashWidth = DASH_WIDTH_DEFAULT;
-    @Px
-    private int mBorderDashGap = DASH_GAP_DEFAULT;
-    @Px
-    private int mBorderRadius = BORDER_RADIUS_DEFAULT;
-    @Px
-    private int mBorderWidth = BORDER_WIDTH_DEFAULT;
-    @Px
-    private int mRangedValueRingWidth = RING_WIDTH_DEFAULT;
-    @ColorInt
-    private int mRangedValuePrimaryColor = PRIMARY_COLOR_DEFAULT;
-    @ColorInt
-    private int mRangedValueSecondaryColor = SECONDARY_COLOR_DEFAULT;
-    @ColorInt
-    private int mHighlightColor = HIGHLIGHT_COLOR_DEFAULT;
-    private boolean mDirty = true;
-
-    public ComplicationStyle() {
-    }
-
-    public ComplicationStyle(@NonNull ComplicationStyle style) {
-        mBackgroundColor = style.getBackgroundColor();
-        mBackgroundDrawable = style.getBackgroundDrawable();
-        mTextColor = style.getTextColor();
-        mTitleColor = style.getTitleColor();
-        mTextTypeface = style.getTextTypeface();
-        mTitleTypeface = style.getTitleTypeface();
-        mTextSize = style.getTextSize();
-        mTitleSize = style.getTitleSize();
-        mImageColorFilter = style.getImageColorFilter();
-        mIconColor = style.getIconColor();
-        mBorderColor = style.getBorderColor();
-        mBorderStyle = style.getBorderStyle();
-        mBorderDashWidth = style.getBorderDashWidth();
-        mBorderDashGap = style.getBorderDashGap();
-        mBorderRadius = style.getBorderRadius();
-        mBorderWidth = style.getBorderWidth();
-        mRangedValueRingWidth = style.getRangedValueRingWidth();
-        mRangedValuePrimaryColor = style.getRangedValuePrimaryColor();
-        mRangedValueSecondaryColor = style.getRangedValueSecondaryColor();
-        mHighlightColor = style.getHighlightColor();
-    }
-
-    boolean isDirty() {
-        return mDirty;
-    }
-
-    void clearDirtyFlag() {
-        mDirty = false;
-    }
-
-    /** Returns the background color to be used. */
-    @ColorInt
-    public int getBackgroundColor() {
-        return mBackgroundColor;
-    }
-
-    /** Returns the background drawable to be used, or null if there's no background drawable. */
-    @Nullable
-    public Drawable getBackgroundDrawable() {
-        return mBackgroundDrawable;
-    }
-
-    /** Returns the text color. Text color should be used for short and long text. */
-    @ColorInt
-    public int getTextColor() {
-        return mTextColor;
-    }
-
-    /** Returns the title color. Title color should be used for short and long title. */
-    @ColorInt
-    public int getTitleColor() {
-        return mTitleColor;
-    }
-
-    /**
-     * Returns the color filter to be used when rendering small and large images, or null if there's
-     * no color filter.
-     */
-    @Nullable
-    public ColorFilter getImageColorFilter() {
-        return mImageColorFilter;
-    }
-
-    /** Returns the color for tinting icons. */
-    @ColorInt
-    public int getIconColor() {
-        return mIconColor;
-    }
-
-    /** Returns the typeface to be used for short and long text. */
-    @Nullable
-    public Typeface getTextTypeface() {
-        return mTextTypeface;
-    }
-
-    /** Returns the typeface to be used for short and long title. */
-    @Nullable
-    public Typeface getTitleTypeface() {
-        return mTitleTypeface;
-    }
-
-    /** Returns the text size to be used for short and long text. */
-    @Px
-    public int getTextSize() {
-        return mTextSize;
-    }
-
-    /** Returns the text size to be used for short and long title. */
-    @Px
-    public int getTitleSize() {
-        return mTitleSize;
-    }
-
-    /** Returns the border color. */
-    @ColorInt
-    public int getBorderColor() {
-        return mBorderColor;
-    }
-
-    @BorderStyle
-    public int getBorderStyle() {
-        return mBorderStyle;
-    }
-
-    /**
-     * Returns the dash width to be used when drawing borders of type {@link #BORDER_STYLE_DASHED}.
-     */
-    @Px
-    public int getBorderDashWidth() {
-        return mBorderDashWidth;
-    }
-
-    /**
-     * Returns the dash gap to be used when drawing borders of type {@link #BORDER_STYLE_DASHED}.
-     */
-    @Px
-    public int getBorderDashGap() {
-        return mBorderDashGap;
-    }
-
-    /**
-     * Returns the border radius. If {@link ComplicationStyle#BORDER_RADIUS_DEFAULT} is returned,
-     * border radius should be reduced to half of the minimum of width or height during the
-     * rendering.
-     */
-    @Px
-    public int getBorderRadius() {
-        return mBorderRadius;
-    }
-
-    /** Returns the border width. */
-    @Px
-    public int getBorderWidth() {
-        return mBorderWidth;
-    }
-
-    /** Returns the ring width to be used when rendering ranged value indicator. */
-    @Px
-    public int getRangedValueRingWidth() {
-        return mRangedValueRingWidth;
-    }
-
-    /** Returns the color to be used when rendering first part of ranged value indicator. */
-    @ColorInt
-    public int getRangedValuePrimaryColor() {
-        return mRangedValuePrimaryColor;
-    }
-
-    /** Returns the color to be used when rendering second part of ranged value indicator. */
-    @ColorInt
-    public int getRangedValueSecondaryColor() {
-        return mRangedValueSecondaryColor;
-    }
-
-    /** Returns the highlight color to be used when the complication is highlighted. */
-    @ColorInt
-    public int getHighlightColor() {
-        return mHighlightColor;
-    }
-
-    /**
-     * Sets the background color.
-     *
-     * @param backgroundColor The color to set
-     */
-    public void setBackgroundColor(@ColorInt int backgroundColor) {
-        this.mBackgroundColor = backgroundColor;
-    }
-
-    /**
-     * Sets the {@link Drawable} to render in the background.
-     *
-     * @param backgroundDrawable The {@link Drawable} to render in the background
-     */
-    public void setBackgroundDrawable(@Nullable Drawable backgroundDrawable) {
-        this.mBackgroundDrawable = backgroundDrawable;
-    }
-
-    /**
-     * Sets the color to render the text with. Text color is used for rendering short text
-     * and long text fields.
-     *
-     * @param textColor The color to render the text with
-     */
-    public void setTextColor(@ColorInt int textColor) {
-        this.mTextColor = textColor;
-    }
-
-    /**
-     * Sets the color to render the title with.  Title color is used for rendering short
-     * title and long title fields.
-     *
-     * @param titleColor The color to render the title with
-     */
-    public void setTitleColor(@ColorInt int titleColor) {
-        this.mTitleColor = titleColor;
-    }
-
-    /**
-     * Sets the color filter used in active mode when rendering large images and small images
-     * with style {@link ComplicationData#IMAGE_STYLE_PHOTO}.
-     *
-     * @param colorFilter The {@link ColorFilter} to use
-     */
-    public void setImageColorFilter(@Nullable ColorFilter colorFilter) {
-        mImageColorFilter = colorFilter;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the color for tinting the icon with.
-     *
-     * @param iconColor The color to render the icon with
-     */
-    public void setIconColor(@ColorInt int iconColor) {
-        mIconColor = iconColor;
-        mDirty = true;
-    }
-
-    /**
-     * Sets {@link Typeface} to use when rendering short text and long text fields.
-     *
-     * @param textTypeface The {@link Typeface} to render the text with
-     */
-    public void setTextTypeface(@NonNull Typeface textTypeface) {
-        mTextTypeface = textTypeface;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the {@link Typeface} to render the title for short and long text with.
-     *
-     * @param titleTypeface The {@link Typeface} to render the title with
-     */
-    public void setTitleTypeface(@NonNull Typeface titleTypeface) {
-        mTitleTypeface = titleTypeface;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the size of the text to use when rendering short text and long text fields.
-     *
-     * @param textSize The size of the text=
-     */
-    public void setTextSize(@Px int textSize) {
-        mTextSize = textSize;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the size of the title text to use when rendering short text and long text fields.
-     *
-     * @param titleSize The size of the title text=
-     */
-    public void setTitleSize(@Px int titleSize) {
-        mTitleSize = titleSize;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the color to render the complication border with.
-     *
-     * @param borderColor The color to render the complication border with
-     */
-    public void setBorderColor(@ColorInt int borderColor) {
-        mBorderColor = borderColor;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the style to render the complication border with.
-     *
-     * @param borderStyle The style to render the complication border with
-     */
-    public void setBorderStyle(@BorderStyle int borderStyle) {
-        switch (borderStyle) {
-            case BORDER_STYLE_SOLID:
-                mBorderStyle = BORDER_STYLE_SOLID;
-                break;
-            case BORDER_STYLE_DASHED:
-                mBorderStyle = BORDER_STYLE_DASHED;
-                break;
-            default:
-                mBorderStyle = BORDER_STYLE_NONE;
-        }
-        mDirty = true;
-    }
-
-    /**
-     * Sets dash widths to render the complication border with when drawing borders with style
-     * {@link #BORDER_STYLE_DASHED}.
-     *
-     * @param borderDashWidth The dash widths to render the complication border with
-     */
-    public void setBorderDashWidth(@Px int borderDashWidth) {
-        mBorderDashWidth = borderDashWidth;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the dash gap render the complication border with when drawing borders with style
-     * {@link #BORDER_STYLE_DASHED}.
-     *
-     * @param borderDashGap The dash gap render the complication border with
-     */
-    public void setBorderDashGap(@Px int borderDashGap) {
-        mBorderDashGap = borderDashGap;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the border radius to be applied to the corners of the bounds of the complication in
-     * active mode. Border radius will be limited to the half of width or height, depending
-     * on which one is smaller.
-     *
-     * @param borderRadius The radius to render the complication border with
-     */
-    public void setBorderRadius(@Px int borderRadius) {
-        mBorderRadius = borderRadius;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the width to render the complication border with.
-     *
-     * @param borderWidth The width to render the complication border with
-     */
-    public void setBorderWidth(@Px int borderWidth) {
-        mBorderWidth = borderWidth;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the stroke width used when rendering the ranged value indicator.
-     *
-     * @param rangedValueRingWidth The width to render the ranged value ring with
-     */
-    public void setRangedValueRingWidth(@Px int rangedValueRingWidth) {
-        mRangedValueRingWidth = rangedValueRingWidth;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the main color to render the ranged value text with.
-     *
-     * @param rangedValuePrimaryColor The main color to render the ranged value text with
-     */
-    public void setRangedValuePrimaryColor(@ColorInt int rangedValuePrimaryColor) {
-        mRangedValuePrimaryColor = rangedValuePrimaryColor;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the secondary color to render the ranged value text with.
-     *
-     * @param rangedValueSecondaryColor The secondary color to render the ranged value text with
-     */
-    public void setRangedValueSecondaryColor(@ColorInt int rangedValueSecondaryColor) {
-        mRangedValueSecondaryColor = rangedValueSecondaryColor;
-        mDirty = true;
-    }
-
-    /**
-     * Sets the background color to use when the complication is highlighted.
-     *
-     * @param highlightColor The background color to use when the complication is highlighted
-     */
-    public void setHighlightColor(@ColorInt int highlightColor) {
-        mHighlightColor = highlightColor;
-        mDirty = true;
-    }
-}
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt
new file mode 100644
index 0000000..da75875
--- /dev/null
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationStyle.kt
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.wear.watchface.complications.rendering
+
+import android.graphics.Color
+import android.graphics.ColorFilter
+import android.graphics.Typeface
+import android.graphics.drawable.Drawable
+import androidx.annotation.ColorInt
+import androidx.annotation.IntDef
+import androidx.annotation.Px
+import androidx.annotation.RestrictTo
+import androidx.wear.complications.data.SmallImageType
+
+/**
+ * Defines attributes to customize appearance of rendered [ ].
+ */
+public class ComplicationStyle {
+    /**
+     * Constants used to define border styles for complications.
+     *
+     * @hide
+     */
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(BORDER_STYLE_NONE, BORDER_STYLE_SOLID, BORDER_STYLE_DASHED)
+    @RestrictTo(
+        RestrictTo.Scope.LIBRARY_GROUP
+    )
+    public annotation class BorderStyle
+
+    /** The background color to be used. */
+    @ColorInt
+    public var backgroundColor: Int = BACKGROUND_COLOR_DEFAULT
+        @ColorInt get() = field
+        set(@ColorInt backgroundColor: Int) { field = backgroundColor }
+
+    /** The background drawable to be used, or null if there's no background drawable.  */
+    public var backgroundDrawable: Drawable? = null
+
+    /**
+     * The color to render the text with. Text color is used for rendering short text and long
+     * text fields.
+     */
+    @ColorInt
+    public var textColor: Int = PRIMARY_COLOR_DEFAULT
+        @ColorInt get() = field
+        set(@ColorInt textColor: Int) { field = textColor }
+
+    /**
+     * The color to render the title with. Title color is used for rendering short title and long
+     * title fields.
+     */
+    @ColorInt
+    public var titleColor: Int = SECONDARY_COLOR_DEFAULT
+        @ColorInt get() = field
+        set(@ColorInt titleColor: Int) { field = titleColor }
+
+    /** The typeface to be used for short and long text.  */
+    public var textTypeface: Typeface = TYPEFACE_DEFAULT
+        private set
+
+    /** The typeface to be used for short and long title.  */
+    public var titleTypeface: Typeface = TYPEFACE_DEFAULT
+        private set
+
+    @Px
+    private var mTextSize = TEXT_SIZE_DEFAULT
+
+    @Px
+    private var mTitleSize = TEXT_SIZE_DEFAULT
+
+    private var mImageColorFilter: ColorFilter? = null
+
+    @ColorInt
+    private var mIconColor = PRIMARY_COLOR_DEFAULT
+
+    @ColorInt
+    private var mBorderColor = BORDER_COLOR_DEFAULT
+
+    @BorderStyle
+    private var mBorderStyle = BORDER_STYLE_SOLID
+
+    @Px
+    private var mBorderDashWidth = DASH_WIDTH_DEFAULT
+
+    @Px
+    private var mBorderDashGap = DASH_GAP_DEFAULT
+
+    @Px
+    private var mBorderRadius = BORDER_RADIUS_DEFAULT
+
+    @Px
+    private var mBorderWidth = BORDER_WIDTH_DEFAULT
+
+    @Px
+    private var mRangedValueRingWidth = RING_WIDTH_DEFAULT
+
+    @ColorInt
+    private var mRangedValuePrimaryColor = PRIMARY_COLOR_DEFAULT
+
+    @ColorInt
+    private var mRangedValueSecondaryColor = SECONDARY_COLOR_DEFAULT
+
+    @ColorInt
+    private var mHighlightColor = HIGHLIGHT_COLOR_DEFAULT
+
+    @get:JvmName(name = "isDirty")
+    internal var isDirty: Boolean = true
+        private set
+
+    public constructor()
+
+    public constructor(style: ComplicationStyle) {
+        backgroundColor = style.backgroundColor
+        backgroundDrawable = style.backgroundDrawable
+        textColor = style.textColor
+        titleColor = style.titleColor
+        textTypeface = style.textTypeface
+        titleTypeface = style.titleTypeface
+        mTextSize = style.textSize
+        mTitleSize = style.titleSize
+        mImageColorFilter = style.imageColorFilter
+        mIconColor = style.iconColor
+        mBorderColor = style.borderColor
+        mBorderStyle = style.borderStyle
+        mBorderDashWidth = style.borderDashWidth
+        mBorderDashGap = style.borderDashGap
+        mBorderRadius = style.borderRadius
+        mBorderWidth = style.borderWidth
+        mRangedValueRingWidth = style.rangedValueRingWidth
+        mRangedValuePrimaryColor = style.rangedValuePrimaryColor
+        mRangedValueSecondaryColor = style.rangedValueSecondaryColor
+        mHighlightColor = style.highlightColor
+    }
+
+    @JvmName(name = "clearDirtyFlag")
+    internal fun clearDirtyFlag() {
+        isDirty = false
+    }
+
+    /**
+     * The color filter used in active mode when rendering large images and small images
+     * with style [SmallImageType.PHOTO].
+     */
+    public var imageColorFilter: ColorFilter?
+        get() = mImageColorFilter
+        set(colorFilter) {
+            mImageColorFilter = colorFilter
+            isDirty = true
+        }
+
+    /** The color for tinting icons.  */
+    public var iconColor: Int
+        @ColorInt get() = mIconColor
+        set(@ColorInt iconColor) {
+            mIconColor = iconColor
+            isDirty = true
+        }
+
+    /** Returns the text size to be used for short and long text fields. */
+    public var textSize: Int
+        @Px get() = mTextSize
+        set(@Px textSize) {
+            mTextSize = textSize
+            isDirty = true
+        }
+
+    /** The text size to be used for short and long title fields. */
+    public var titleSize: Int
+        @Px get() = mTitleSize
+        set(@Px titleSize) {
+            mTitleSize = titleSize
+            isDirty = true
+        }
+
+    /**
+     * The color to render the complication border with.
+     */
+    public var borderColor: Int
+        @ColorInt get() = mBorderColor
+        set(@ColorInt borderColor) {
+            mBorderColor = borderColor
+            isDirty = true
+        }
+
+    /**
+     * The style to render the complication border with.
+     */
+    public var borderStyle: Int
+        @BorderStyle get() = mBorderStyle
+        set(@BorderStyle borderStyle) {
+            mBorderStyle = when (borderStyle) {
+                BORDER_STYLE_SOLID -> BORDER_STYLE_SOLID
+                BORDER_STYLE_DASHED -> BORDER_STYLE_DASHED
+                else -> BORDER_STYLE_NONE
+            }
+            isDirty = true
+        }
+    /** The dash width to be used when drawing borders of type [.BORDER_STYLE_DASHED]. */
+    public var borderDashWidth: Int
+        @Px get() = mBorderDashWidth
+        set(@Px borderDashWidth) {
+            mBorderDashWidth = borderDashWidth
+            isDirty = true
+        }
+
+    /**
+     * The dash gap to be used when drawing borders of type [.BORDER_STYLE_DASHED].
+     */
+    public var borderDashGap: Int
+        @Px get() = mBorderDashGap
+        set(@Px borderDashGap) {
+            mBorderDashGap = borderDashGap
+            isDirty = true
+        }
+    /**
+     * The border radius to be applied to the corners of the bounds of the complication in
+     * active mode. Border radius will be limited to the half of width or height, depending
+     * on which one is smaller. If [ComplicationStyle.BORDER_RADIUS_DEFAULT] is returned, border
+     * radius should be reduced to half of the minimum of width or height during the rendering.
+     */
+    public var borderRadius: Int
+        @Px get() = mBorderRadius
+        set(@Px borderRadius) {
+            mBorderRadius = borderRadius
+            isDirty = true
+        }
+
+    /**
+     * The width to render the complication border with.
+     */
+    public var borderWidth: Int
+        @Px get() = mBorderWidth
+        set(@Px borderWidth) {
+            mBorderWidth = borderWidth
+            isDirty = true
+        }
+
+    /** The ring width to be used when rendering ranged value indicator. */
+    public var rangedValueRingWidth: Int
+        @Px get() = mRangedValueRingWidth
+        set(@Px rangedValueRingWidth) {
+            mRangedValueRingWidth = rangedValueRingWidth
+            isDirty = true
+        }
+
+    /** The color to be used when rendering first part of ranged value indicator. */
+    public var rangedValuePrimaryColor: Int
+        @ColorInt get() = mRangedValuePrimaryColor
+        set(@ColorInt rangedValuePrimaryColor) {
+            mRangedValuePrimaryColor = rangedValuePrimaryColor
+            isDirty = true
+        }
+
+    /** The color to be used when rendering second part of ranged value indicator. */
+    public var rangedValueSecondaryColor: Int
+        @ColorInt get() = mRangedValueSecondaryColor
+        set(@ColorInt rangedValueSecondaryColor) {
+            mRangedValueSecondaryColor = rangedValueSecondaryColor
+            isDirty = true
+        }
+
+    /** The highlight color to be used when the complication is highlighted. */
+    public var highlightColor: Int
+        @ColorInt get() = mHighlightColor
+        set(@ColorInt highlightColor) {
+            mHighlightColor = highlightColor
+            isDirty = true
+        }
+
+    /**
+     * Sets [Typeface] to use when rendering short text and long text fields.
+     *
+     * @param textTypeface The [Typeface] to render the text with
+     */
+    public fun setTextTypeface(textTypeface: Typeface) {
+        this.textTypeface = textTypeface
+        isDirty = true
+    }
+
+    /**
+     * Sets the [Typeface] to render the title for short and long text with.
+     *
+     * @param titleTypeface The [Typeface] to render the title with
+     */
+    public fun setTitleTypeface(titleTypeface: Typeface) {
+        this.titleTypeface = titleTypeface
+        isDirty = true
+    }
+
+    public companion object {
+        /** Style where the borders are not drawn.  */
+        public const val BORDER_STYLE_NONE: Int = 0
+
+        /** Style where the borders are drawn without any gap.  */
+        public const val BORDER_STYLE_SOLID: Int = 1
+
+        /**
+         * Style where the borders are drawn as dashed lines. If this is set as current border
+         * style, dash width and dash gap should also be set via [.setBorderDashWidth],
+         * [.setBorderDashGap] or XML attributes, or default values will be used.
+         */
+        public const val BORDER_STYLE_DASHED: Int = 2
+
+        /** Default primary color.  */
+        private const val PRIMARY_COLOR_DEFAULT = Color.WHITE
+
+        /** Default secondary color.  */
+        private const val SECONDARY_COLOR_DEFAULT = Color.LTGRAY
+
+        /** Default background color.  */
+        private const val BACKGROUND_COLOR_DEFAULT = Color.BLACK
+
+        /** Default background color.  */
+        private const val HIGHLIGHT_COLOR_DEFAULT = Color.LTGRAY
+
+        /** Default border color.  */
+        private const val BORDER_COLOR_DEFAULT = Color.WHITE
+
+        /** Default text size.  */
+        @Px
+        private const val TEXT_SIZE_DEFAULT = Int.MAX_VALUE
+
+        /** Default typeface.  */
+        private val TYPEFACE_DEFAULT =
+            Typeface.create("sans-serif-condensed", Typeface.NORMAL)
+
+        /** Default dash width.  */
+        @Px
+        private const val DASH_WIDTH_DEFAULT = 3
+
+        /** Default dash gap.  */
+        @Px
+        private const val DASH_GAP_DEFAULT = 3
+
+        /** Default border width.  */
+        @Px
+        private const val BORDER_WIDTH_DEFAULT = 1
+
+        /** Default ring width.  */
+        @Px
+        private const val RING_WIDTH_DEFAULT = 2
+
+        /** Default border radius.  */
+        @Px
+        public const val BORDER_RADIUS_DEFAULT: Int = Int.MAX_VALUE
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt
new file mode 100644
index 0000000..3c5287b
--- /dev/null
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/GlesTextureComplication.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.complications.rendering
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Rect
+import android.icu.util.Calendar
+import android.opengl.GLES20
+import android.opengl.GLUtils
+import androidx.annotation.Px
+import androidx.wear.watchface.CanvasComplication
+import androidx.wear.watchface.RenderParameters
+
+/**
+ * Helper for rendering a [CanvasComplication] to a GLES20 texture. To use call [renderToTexture]
+ * and then [bind] before drawing.
+ *
+ * @param canvasComplication The [CanvasComplication] to render to texture.
+ * @param textureWidth The width of the texture in pixels to create.
+ * @param textureHeight The height of the texture in pixels to create.
+ * @param textureType The texture type, e.g. [GLES20.GL_TEXTURE_2D].
+ */
+public class GlesTextureComplication(
+    public val canvasComplication: CanvasComplication,
+    @Px textureWidth: Int,
+    @Px textureHeight: Int,
+    private val textureType: Int
+) {
+    private val texture = createTexture(textureType)
+    private val bitmap = Bitmap.createBitmap(
+        textureWidth,
+        textureHeight,
+        Bitmap.Config.ARGB_8888
+    )
+    private val canvas = Canvas(bitmap)
+    private val bounds = Rect(0, 0, textureWidth, textureHeight)
+
+    /** Renders [canvasComplication] to an OpenGL texture. */
+    public fun renderToTexture(calendar: Calendar, renderParameters: RenderParameters) {
+        canvas.drawColor(Color.BLACK)
+        canvasComplication.render(canvas, bounds, calendar, renderParameters)
+        bind()
+        GLUtils.texImage2D(textureType, 0, bitmap, 0)
+    }
+
+    /** Bind the texture to the active texture target. */
+    public fun bind() {
+        GLES20.glBindTexture(textureType, texture)
+    }
+
+    /**
+     * Creates an OpenGL texture handler.
+     *
+     * @return The OpenGL texture handler
+     */
+    private fun createTexture(textureType: Int): Int {
+        val handle = IntArray(1)
+        GLES20.glGenTextures(1, handle, 0)
+        GLES20.glBindTexture(textureType, handle[0])
+        GLES20.glTexParameteri(
+            textureType,
+            GLES20.GL_TEXTURE_WRAP_S,
+            GLES20.GL_CLAMP_TO_EDGE
+        )
+        GLES20.glTexParameteri(
+            textureType,
+            GLES20.GL_TEXTURE_WRAP_T,
+            GLES20.GL_CLAMP_TO_EDGE
+        )
+        GLES20.glTexParameteri(
+            textureType,
+            GLES20.GL_TEXTURE_MAG_FILTER,
+            GLES20.GL_LINEAR
+        )
+        GLES20.glTexParameteri(
+            textureType,
+            GLES20.GL_TEXTURE_MIN_FILTER,
+            GLES20.GL_LINEAR
+        )
+        return handle[0]
+    }
+}
diff --git a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
index 8bda258..7e2a415 100644
--- a/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
+++ b/wear/wear-watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/TextRenderer.java
@@ -263,7 +263,7 @@
      * <p>If not called, the default is {@link Gravity#CENTER}.
      *
      * @param gravity Gravity to position text, should be one of the constants specified in {@link
-     *                android.view.Gravity} class.
+     * android.view.Gravity} class.
      */
     public void setGravity(int gravity) {
         if (mGravity == gravity) {
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
index 1492085..ed6f874c 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationDrawableTest.java
@@ -50,6 +50,7 @@
 import androidx.annotation.NonNull;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.wear.complications.ComplicationHelperActivity;
+import androidx.wear.complications.data.DataKt;
 import androidx.wear.watchface.CanvasType;
 import androidx.wear.watchface.Renderer;
 import androidx.wear.watchface.WatchFace;
@@ -85,7 +86,7 @@
     private static final int AMBIENT_PX = 1;
 
     private ComplicationDrawable mComplicationDrawable;
-    private ComplicationData mComplicationData;
+    private androidx.wear.complications.data.ComplicationData mComplicationData;
     private int mDefaultTextSize;
 
     @Mock
@@ -105,10 +106,12 @@
         mComplicationDrawable = new ComplicationDrawable();
         mComplicationDrawable.setCallback(mMockDrawableCallback);
 
-        mComplicationData =
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("hede"))
+        ComplicationData complicationData =
+                new ComplicationData.Builder(
+                        ComplicationData.TYPE_SHORT_TEXT
+                ).setShortText(ComplicationText.plainText("hede"))
                         .build();
+        mComplicationData = DataKt.toApiComplicationData(complicationData);
         mDefaultTextSize =
                 ApplicationProvider.getApplicationContext()
                         .getResources()
@@ -117,11 +120,6 @@
     }
 
     @Test
-    public void callingSetContextWithNullThrowsIllegalArgumentException() {
-        assertThrows(IllegalArgumentException.class, () -> mComplicationDrawable.setContext(null));
-    }
-
-    @Test
     public void callingDrawOnCanvasBeforeSetContextThrowsAnException() {
         assertThrows(IllegalStateException.class, () -> mComplicationDrawable.draw(mMockCanvas));
     }
@@ -384,11 +382,14 @@
     public void onTapReturnsFalseIfNoTapAction() {
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .build()
+                    ),
+                true
+        );
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isFalse();
@@ -398,12 +399,15 @@
     public void onTapReturnsFalseIfOutOfBounds() {
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .setTapAction(mMockPendingIntent)
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .setTapAction(mMockPendingIntent)
+                            .build()
+                ),
+                true
+        );
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         assertThat(mComplicationDrawable.onTap(200, 200)).isFalse();
@@ -415,12 +419,15 @@
 
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .setTapAction(mMockPendingIntent)
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .setTapAction(mMockPendingIntent)
+                        .build()
+                ),
+                true
+        );
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isFalse();
@@ -430,12 +437,15 @@
     public void onTapReturnsTrueIfSuccessfulAndHighlightsComplication() {
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .setTapAction(mMockPendingIntent)
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .setTapAction(mMockPendingIntent)
+                        .build()
+                ),
+                true
+        );
         reset(mMockDrawableCallback);
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
@@ -449,12 +459,15 @@
         long highlightDuration = 1000;
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .setTapAction(mMockPendingIntent)
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .setTapAction(mMockPendingIntent)
+                            .build()
+                ),
+                true
+        );
         reset(mMockDrawableCallback);
 
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
@@ -479,12 +492,15 @@
         long highlightDuration = 0;
         mComplicationDrawable.setContext(ApplicationProvider.getApplicationContext());
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
-                        .setShortText(ComplicationText.plainText("rofl"))
-                        .setShortTitle(ComplicationText.plainText("copter"))
-                        .setTapAction(mMockPendingIntent)
-                        .build(),
-                true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                            .setShortText(ComplicationText.plainText("rofl"))
+                            .setShortTitle(ComplicationText.plainText("copter"))
+                            .setTapAction(mMockPendingIntent)
+                            .build()
+                ),
+                true
+        );
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         mComplicationDrawable.setHighlightDuration(highlightDuration);
@@ -518,7 +534,11 @@
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build(), true);
+                DataKt.toApiComplicationData(
+                        new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()
+                ),
+                true
+        );
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isTrue();
 
@@ -540,7 +560,11 @@
         mComplicationDrawable.setBounds(new Rect(0, 0, 100, 100));
 
         mComplicationDrawable.setComplicationData(
-                new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build(), true);
+                DataKt.toApiComplicationData(
+                    new ComplicationData.Builder(ComplicationData.TYPE_NO_PERMISSION).build()
+                ),
+                true
+        );
 
         assertThat(mComplicationDrawable.onTap(50, 50)).isFalse();
 
@@ -729,10 +753,12 @@
                             surfaceHolder, currentUserStyleRepository, watchState,
                             CanvasType.SOFTWARE, 16L) {
                         @Override
-                        public void render(@NonNull Canvas canvas, @NonNull Rect bounds,
-                                @NonNull Calendar calendar) {
+                        public void renderHighlightLayer(@NonNull Canvas canvas,
+                                @NonNull Rect bounds, @NonNull Calendar calendar) {}
 
-                        }
+                        @Override
+                        public void render(@NonNull Canvas canvas, @NonNull Rect bounds,
+                                @NonNull Calendar calendar) {}
                     }
             );
         }
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
index 74673ca..2b9bbce 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
@@ -57,11 +57,10 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 /** Tests for {@link ComplicationRenderer}. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(ComplicationsTestRunner.class)
 @DoNotInstrument
 public class ComplicationRendererTest {
 
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationsTestRunner.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationsTestRunner.java
index 5643ecf..25dd9edd 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationsTestRunner.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationsTestRunner.java
@@ -36,8 +36,10 @@
                 .doNotInstrumentPackage("android.support.wearable.complications")
                 .doNotInstrumentPackage("android.support.wearable.watchface")
                 .doNotInstrumentPackage("androidx.wear.complications")
+                .doNotInstrumentPackage("androidx.wear.complications.data")
                 .doNotInstrumentPackage("androidx.wear.complications.rendering")
                 .doNotInstrumentPackage("androidx.wear.watchface")
+                .doNotInstrumentPackage("androidx.wear.watchface.complications.rendering")
                 .build();
     }
 }
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/EmojiHelperTest.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/EmojiHelperTest.java
index 6931e13..1f0429e 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/EmojiHelperTest.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/EmojiHelperTest.java
@@ -21,11 +21,10 @@
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 /** EmojiHelper tests. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(ComplicationsTestRunner.class)
 @DoNotInstrument
 public class EmojiHelperTest {
 
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/RoundedDrawableTest.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/RoundedDrawableTest.java
index a3b5fa2..ca40577 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/RoundedDrawableTest.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/RoundedDrawableTest.java
@@ -37,11 +37,10 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 /** Tests for {@link RoundedDrawable} */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(ComplicationsTestRunner.class)
 @DoNotInstrument
 public class RoundedDrawableTest {
 
diff --git a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/TextRendererTest.java b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/TextRendererTest.java
index 667d097..ad130d1 100644
--- a/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/TextRendererTest.java
+++ b/wear/wear-watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/TextRendererTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertTrue;
+
 import android.graphics.Color;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
@@ -31,11 +33,10 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
 /** TextRenderer tests. */
-@RunWith(RobolectricTestRunner.class)
+@RunWith(ComplicationsTestRunner.class)
 @DoNotInstrument
 public class TextRendererTest {
 
@@ -77,6 +78,6 @@
     public void applySpannAllowlistNotSpanned() {
         String text = "some test text";
 
-        assertThat(mTextRenderer.applySpanAllowlist(text)).isEqualTo(text);
+        assertTrue(mTextRenderer.applySpanAllowlist(text).toString().contentEquals(text));
     }
 }
diff --git a/wear/wear-watchface-data/api/restricted_current.txt b/wear/wear-watchface-data/api/restricted_current.txt
index cba8655..16f5ad0 100644
--- a/wear/wear-watchface-data/api/restricted_current.txt
+++ b/wear/wear-watchface-data/api/restricted_current.txt
@@ -3,6 +3,7 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class Constants {
     field public static final String ACTION_REQUEST_STATE = "com.google.android.wearable.watchfaces.action.REQUEST_STATE";
+    field public static final String ACTION_WATCH_FACE_REFRESH_A11Y_LABELS = "androidx.watchface.action.WATCH_FACE_A11Y_LABELS_REFRESH";
     field public static final String COMMAND_AMBIENT_UPDATE = "com.google.android.wearable.action.AMBIENT_UPDATE";
     field public static final String COMMAND_BACKGROUND_ACTION = "com.google.android.wearable.action.BACKGROUND_ACTION";
     field public static final String COMMAND_COMPLICATION_DATA = "com.google.android.wearable.action.COMPLICATION_DATA";
@@ -42,9 +43,9 @@
     field public static final String KEY_TAP_ACTION = "KEY_TAP_ACTION";
     field public static final String KEY_TEXT = "KEY_TEXT";
     field public static final String KEY_VIEW_PROTECTION_MODE = "viewProtectionMode";
+    field public static final String PERMISSION_BIND_WATCH_FACE_CONTROL = "com.google.android.wearable.permission.BIND_WATCH_FACE_CONTROL";
     field public static final String PROPERTY_BURN_IN_PROTECTION = "burn_in_protection";
     field public static final String PROPERTY_LOW_BIT_AMBIENT = "low_bit_ambient";
-    field public static final int PROVIDER_CHOOSER_REQUEST_CODE = 1; // 0x1
     field public static final String STATUS_AIRPLANE_MODE = "airplane_mode";
     field public static final String STATUS_CHARGING = "charging";
     field public static final String STATUS_CONNECTED = "connected";
@@ -135,6 +136,14 @@
     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 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();
@@ -245,14 +254,21 @@
   }
 
   @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, java.util.List<androidx.wear.watchface.data.LayerParameterWireFormat!>, Integer?, @ColorInt int);
+    ctor public RenderParametersWireFormat(int, int, int, int, String?, @ColorInt int, @ColorInt int);
     method public int describeContents();
+    method @ColorInt public int getBackgroundTint();
     method public int getDrawMode();
-    method public java.util.List<androidx.wear.watchface.data.LayerParameterWireFormat!> getLayerParameters();
-    method @ColorInt public int getOutlineTint();
-    method public Integer? getSelectedComplicationId();
+    method public int getElementComplicationId();
+    method public int getElementType();
+    method public String? getElementUserStyleSettingId();
+    method @ColorInt public int getHighlightTint();
+    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 {
@@ -292,16 +308,18 @@
   }
 
   @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<androidx.wear.complications.data.ComplicationType!,android.graphics.RectF!>?);
+    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 mComplicationId;
     field @androidx.versionedparcelable.ParcelField(2) public int mEnabled;
-    field @androidx.versionedparcelable.ParcelField(3) public java.util.Map<androidx.wear.complications.data.ComplicationType!,android.graphics.RectF!>? mPerComplicationTypeBounds;
+    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 {
diff --git a/wear/wear-watchface-data/lint-baseline.xml b/wear/wear-watchface-data/lint-baseline.xml
index 3f27b19..8fa8545 100644
--- a/wear/wear-watchface-data/lint-baseline.xml
+++ b/wear/wear-watchface-data/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanTargetApiAnnotation"
diff --git a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IPendingInteractiveWatchFace.aidl b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IPendingInteractiveWatchFace.aidl
index 005eac3..3a46130 100644
--- a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IPendingInteractiveWatchFace.aidl
+++ b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/IPendingInteractiveWatchFace.aidl
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.control;
 
 import androidx.wear.watchface.control.IInteractiveWatchFace;
+import androidx.wear.watchface.control.data.CrashInfoParcel;
 
 /**
  * Callback issued when {@link IInteractiveWatchFaceWcs} has been created.
@@ -26,7 +27,7 @@
 interface IPendingInteractiveWatchFace {
    // IMPORTANT NOTE: All methods must be given an explicit transaction id that must never change
    // in the future to remain binary backwards compatible.
-   // Next Id: 8
+   // Next Id: 4
 
    /**
     * API version number. This should be incremented every time a new method is added.
@@ -43,4 +44,7 @@
 
    /** Called by the watchface when {@link IInteractiveWatchFaceWcs} has been created. */
    oneway void onInteractiveWatchFaceCreated(in IInteractiveWatchFace iInteractiveWatchFace) = 2;
+
+   /** Called if the watchface crashed on startup. */
+   oneway void onInteractiveWatchFaceCrashed(in CrashInfoParcel exception) = 3;
 }
diff --git a/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/data/CrashInfoParcel.aidl b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/data/CrashInfoParcel.aidl
new file mode 100644
index 0000000..e2d824c
--- /dev/null
+++ b/wear/wear-watchface-data/src/main/aidl/androidx/wear/watchface/control/data/CrashInfoParcel.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.control.data;
+
+/** @hide */
+parcelable CrashInfoParcel;
diff --git a/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
index d32f509..9c0e809 100644
--- a/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
+++ b/wear/wear-watchface-data/src/main/java/android/support/wearable/watchface/Constants.kt
@@ -57,8 +57,11 @@
         public const val KEY_BITMAP_CONFIG_ORDINAL: String = "KEY_BITMAP_CONFIG_ORDINAL"
         public const val KEY_SCREENSHOT: String = "KEY_SCREENSHOT"
 
-        /** Used to identify our provider chooser requests. */
-        public const val PROVIDER_CHOOSER_REQUEST_CODE: Int = 1
+        public const val PERMISSION_BIND_WATCH_FACE_CONTROL: String =
+            "com.google.android.wearable.permission.BIND_WATCH_FACE_CONTROL"
+
+        public const val ACTION_WATCH_FACE_REFRESH_A11Y_LABELS: String =
+            "androidx.watchface.action.WATCH_FACE_A11Y_LABELS_REFRESH"
 
         @SuppressWarnings("ActionValue")
         public const val ACTION_REQUEST_STATE: String =
diff --git a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java
new file mode 100644
index 0000000..5f0fc51
--- /dev/null
+++ b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/control/data/CrashInfoParcel.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.control.data;
+
+import static android.app.ApplicationErrorReport.CrashInfo;
+
+import android.annotation.SuppressLint;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.StringBuilderPrinter;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+/**
+ * Used for sending details of an exception over aidl.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@SuppressLint("BanParcelableUsage")
+public class CrashInfoParcel implements Parcelable {
+    @NonNull public final CrashInfo crashInfo;
+
+    public CrashInfoParcel(@NonNull Throwable exception) {
+        crashInfo = new CrashInfo(exception);
+    }
+
+    CrashInfoParcel(Parcel in) {
+        crashInfo = new CrashInfo(in);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        crashInfo.writeToParcel(dest, flags);
+    }
+
+    public static final Parcelable.Creator<CrashInfoParcel> CREATOR =
+            new Parcelable.Creator<CrashInfoParcel>() {
+                @Override
+                public CrashInfoParcel createFromParcel(Parcel source) {
+                    return new CrashInfoParcel(source);
+                }
+
+                @Override
+                public CrashInfoParcel[] newArray(int size) {
+                    return new CrashInfoParcel[size];
+                }
+            };
+
+    @NonNull
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        StringBuilderPrinter pr = new StringBuilderPrinter(sb);
+        crashInfo.dump(pr, "");
+        return sb.toString();
+    }
+}
diff --git a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
index aaf3b73..bb3308b 100644
--- a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
+++ b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/data/RenderParametersWireFormat.java
@@ -29,8 +29,6 @@
 import androidx.versionedparcelable.VersionedParcelable;
 import androidx.versionedparcelable.VersionedParcelize;
 
-import java.util.List;
-
 /**
  * Wire format for {@link androidx.wear.watchface.RenderParameters}.
  *
@@ -40,70 +38,138 @@
 @VersionedParcelize
 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
 public class RenderParametersWireFormat implements VersionedParcelable, Parcelable {
-    private static final int NO_COMPLICATION_ID = -1;
+    /** Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is `null`. */
+    public static int ELEMENT_TYPE_NONE = 0;
+
+    /**
+     * Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is
+     * {@link androidx.wear.watchface.HighlightedElement.AllComplications}.
+     */
+    public static int ELEMENT_TYPE_ALL_COMPLICATIONS = 1;
+
+    /**
+     * Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is
+     * {@link androidx.wear.watchface.HighlightedElement.Complication}.
+     */
+    public static int ELEMENT_TYPE_COMPLICATION = 2;
+
+    /**
+     * Used when {@link androidx.wear.watchface.RenderParameters#getHighlightLayer} is
+     * {@link androidx.wear.watchface.HighlightedElement.UserStyle}.
+     */
+    public static int ELEMENT_TYPE_USER_STYLE = 3;
 
     /** Wire format for {@link androidx.wear.watchface.DrawMode}. */
     @ParcelField(1)
     int mDrawMode;
 
     /**
-     * Optional parameter which if non null specifies that a particular complication, should be
-     * drawn with a special highlight to indicate it's been selected.
+     * A bitfield where each bit represents one layer in the set of
+     * {@link androidx.wear.watchface.style.WatchFaceLayer}s.
      */
     @ParcelField(2)
-    int mSelectedComplicationId;
+    int mWatchFaceLayerSetBitfield;
 
     /**
-     * Specifies the tint for any outlined element.
+     * One of {@link #ELEMENT_TYPE_NONE}, {@link #ELEMENT_TYPE_ALL_COMPLICATIONS},
+     * {@link #ELEMENT_TYPE_COMPLICATION} or {@link #ELEMENT_TYPE_USER_STYLE}.
      */
     @ParcelField(3)
-    int mOutlineTint;
+    int mElementType;
 
     /**
-     * Wire format for Map<{@link androidx.wear.watchface.style.Layer},
-     * {@link androidx.wear.watchface.LayerMode}>.
-     *
-     * This list needs to go last because VersionedParcelable has a design flaw, if the format
-     * changes the reader can't determine the correct size of the list and data afterwards would get
-     * corrupted. We try to avoid this by putting the list last.
+     * Optional ID of a single complication to render highlighted, only used with
+     * {@link #ELEMENT_TYPE_COMPLICATION}.
      */
-    @NonNull
-    @ParcelField(100)
-    List<LayerParameterWireFormat> mLayerParameters;
+    @ParcelField(4)
+    int mElementComplicationId;
+
+    /**
+     * Optional UserStyleSetting to render highlighted, only non-null with
+     * {@link #ELEMENT_TYPE_USER_STYLE}.
+     */
+    @ParcelField(5)
+    @Nullable
+    String mElementUserStyleSettingId;
+
+    /**
+     * Specifies the tint for the highlighted element. Only used when {@link #mElementType} isn't
+     * {@link #ELEMENT_TYPE_NONE}.
+     */
+    @ParcelField(6)
+    @ColorInt
+    int mHighlightTint;
+
+    /**
+     * Specifies the tint for everything else. Only used when {@link #mElementType} isn't
+     * {@link #ELEMENT_TYPE_NONE}.
+     */
+    @ParcelField(7)
+    @ColorInt
+    int mBackgroundTint;
 
     RenderParametersWireFormat() {
     }
 
     public RenderParametersWireFormat(
             int drawMode,
-            @NonNull List<LayerParameterWireFormat> layerParameters,
-            @Nullable Integer selectedComplicationId,
-            @ColorInt int outlineTint) {
+            int watchFaceLayerSetBitfield,
+            int elementType,
+            int complicationId,
+            @Nullable String elementUserStyleSettingId,
+            @ColorInt int highlightTint,
+            @ColorInt int backgroundTint) {
         mDrawMode = drawMode;
-        mLayerParameters = layerParameters;
-        mSelectedComplicationId = (selectedComplicationId != null)
-                ? selectedComplicationId : NO_COMPLICATION_ID;
-        mOutlineTint = outlineTint;
+        mWatchFaceLayerSetBitfield = watchFaceLayerSetBitfield;
+        mElementType = elementType;
+        mElementComplicationId = complicationId;
+        mElementUserStyleSettingId = elementUserStyleSettingId;
+        mHighlightTint = highlightTint;
+        mBackgroundTint = backgroundTint;
+        if (elementType == ELEMENT_TYPE_USER_STYLE) {
+            if (elementUserStyleSettingId == null) {
+                throw new IllegalArgumentException(
+                        "selectedUserStyleSettingId must be non-null when elementType is "
+                                + "ELEMENT_TYPE_USER_STYLE");
+            }
+        } else {
+            if (elementUserStyleSettingId != null) {
+                throw new IllegalArgumentException(
+                        "selectedUserStyleSettingId must be null when elementType isn't "
+                                + "ELEMENT_TYPE_USER_STYLE");
+            }
+        }
     }
 
     public int getDrawMode() {
         return mDrawMode;
     }
 
+    public int getWatchFaceLayerSetBitfield() {
+        return mWatchFaceLayerSetBitfield;
+    }
+
+    public int getElementType() {
+        return mElementType;
+    }
+
+    public int getElementComplicationId() {
+        return mElementComplicationId;
+    }
+
     @Nullable
-    public Integer getSelectedComplicationId() {
-        return (mSelectedComplicationId == NO_COMPLICATION_ID) ? null :
-                mSelectedComplicationId;
+    public String getElementUserStyleSettingId() {
+        return mElementUserStyleSettingId;
     }
 
     @ColorInt
-    public int getOutlineTint() {
-        return mOutlineTint;
+    public int getHighlightTint() {
+        return mHighlightTint;
     }
 
-    @NonNull
-    public List<LayerParameterWireFormat> getLayerParameters() {
-        return mLayerParameters;
+    @ColorInt
+    public int getBackgroundTint() {
+        return mBackgroundTint;
     }
 
     /** Serializes this IndicatorState to the specified {@link Parcel}. */
diff --git a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
index f3e4848..e63e83b 100644
--- a/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
+++ b/wear/wear-watchface-data/src/main/java/androidx/wear/watchface/style/data/ComplicationOverlayWireFormat.java
@@ -28,7 +28,6 @@
 import androidx.versionedparcelable.ParcelUtils;
 import androidx.versionedparcelable.VersionedParcelable;
 import androidx.versionedparcelable.VersionedParcelize;
-import androidx.wear.complications.data.ComplicationType;
 
 import java.util.Map;
 
@@ -40,6 +39,7 @@
     public static final int ENABLED_UNKNOWN = -1;
     public static final int ENABLED_YES = 1;
     public static final int ENABLED_NO = 0;
+    public static final long NULL_ACCESSIBILITY_TRAVERSAL_INDEX = 0x100000000L;
 
     @ParcelField(1)
     public int mComplicationId;
@@ -53,7 +53,11 @@
 
     @ParcelField(3)
     @Nullable
-    public Map<ComplicationType, RectF> mPerComplicationTypeBounds;
+    public Map<Integer, RectF> mPerComplicationTypeBounds;
+
+    /** Ideally this would be Integer but VersionedParcelable doesn't support that. */
+    @ParcelField(4)
+    long mAccessibilityTraversalIndex;
 
     ComplicationOverlayWireFormat() {
     }
@@ -61,7 +65,8 @@
     public ComplicationOverlayWireFormat(
             int complicationId,
             @Nullable Boolean enabled,
-            @Nullable Map<ComplicationType, RectF> perComplicationTypeBounds
+            @Nullable Map<Integer, RectF> perComplicationTypeBounds,
+            @Nullable Integer accessibilityTraversalIndex
     ) {
         mComplicationId = complicationId;
         if (enabled != null) {
@@ -70,6 +75,11 @@
             mEnabled = ENABLED_UNKNOWN;
         }
         mPerComplicationTypeBounds = perComplicationTypeBounds;
+        if (accessibilityTraversalIndex == null) {
+            mAccessibilityTraversalIndex = NULL_ACCESSIBILITY_TRAVERSAL_INDEX;
+        } else {
+            mAccessibilityTraversalIndex = accessibilityTraversalIndex;
+        }
     }
 
     @Override
@@ -77,6 +87,19 @@
         return 0;
     }
 
+    /**
+     * Returns the optional override to the accessibilityTraversalIndex used for sorting
+     * ContentDescriptionLabels. See ComplicationOverlay for details.
+     */
+    @Nullable
+    public Integer getAccessibilityTraversalIndex() {
+        if (mAccessibilityTraversalIndex == NULL_ACCESSIBILITY_TRAVERSAL_INDEX) {
+            return null;
+        } else {
+            return (int) mAccessibilityTraversalIndex;
+        }
+    }
+
     /** Serializes this UserStyleWireFormat to the specified {@link Parcel}. */
     @Override
     public void writeToParcel(@NonNull Parcel parcel, int flags) {
diff --git a/wear/wear-watchface-editor/api/current.txt b/wear/wear-watchface-editor/api/current.txt
index 5e23ca2..56b5343 100644
--- a/wear/wear-watchface-editor/api/current.txt
+++ b/wear/wear-watchface-editor/api/current.txt
@@ -1,6 +1,16 @@
 // Signature format: 4.0
 package androidx.wear.watchface.editor {
 
+  public final class ChosenComplicationProvider {
+    ctor public ChosenComplicationProvider(int complicationId, androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo, android.os.Bundle extras);
+    method public int getComplicationId();
+    method public androidx.wear.complications.ComplicationProviderInfo? getComplicationProviderInfo();
+    method public android.os.Bundle getExtras();
+    property public final int complicationId;
+    property public final androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo;
+    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(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
@@ -27,6 +37,7 @@
     method public abstract Integer? getBackgroundComplicationId();
     method @UiThread public abstract Integer? getComplicationIdAt(@Px int x, @Px int y);
     method @UiThread public abstract suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method @UiThread public abstract suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public abstract long getPreviewReferenceTimeMillis();
     method public abstract androidx.wear.watchface.style.UserStyle getUserStyle();
@@ -34,7 +45,7 @@
     method public abstract android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
     method @UiThread public final boolean isCommitChangesOnClose();
-    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method @UiThread public abstract android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method @UiThread public final void setCommitChangesOnClose(boolean p);
     method public abstract void setUserStyle(androidx.wear.watchface.style.UserStyle p);
@@ -54,6 +65,9 @@
     method @UiThread public suspend Object? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p);
   }
 
+  public final class EditorSessionKt {
+  }
+
   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);
diff --git a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
index 5e23ca2..56b5343 100644
--- a/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-editor/api/public_plus_experimental_current.txt
@@ -1,6 +1,16 @@
 // Signature format: 4.0
 package androidx.wear.watchface.editor {
 
+  public final class ChosenComplicationProvider {
+    ctor public ChosenComplicationProvider(int complicationId, androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo, android.os.Bundle extras);
+    method public int getComplicationId();
+    method public androidx.wear.complications.ComplicationProviderInfo? getComplicationProviderInfo();
+    method public android.os.Bundle getExtras();
+    property public final int complicationId;
+    property public final androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo;
+    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(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
@@ -27,6 +37,7 @@
     method public abstract Integer? getBackgroundComplicationId();
     method @UiThread public abstract Integer? getComplicationIdAt(@Px int x, @Px int y);
     method @UiThread public abstract suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method @UiThread public abstract suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public abstract long getPreviewReferenceTimeMillis();
     method public abstract androidx.wear.watchface.style.UserStyle getUserStyle();
@@ -34,7 +45,7 @@
     method public abstract android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
     method @UiThread public final boolean isCommitChangesOnClose();
-    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method @UiThread public abstract android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method @UiThread public final void setCommitChangesOnClose(boolean p);
     method public abstract void setUserStyle(androidx.wear.watchface.style.UserStyle p);
@@ -54,6 +65,9 @@
     method @UiThread public suspend Object? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p);
   }
 
+  public final class EditorSessionKt {
+  }
+
   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);
diff --git a/wear/wear-watchface-editor/api/restricted_current.txt b/wear/wear-watchface-editor/api/restricted_current.txt
index a42c76e..9cee27d 100644
--- a/wear/wear-watchface-editor/api/restricted_current.txt
+++ b/wear/wear-watchface-editor/api/restricted_current.txt
@@ -3,14 +3,15 @@
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract class BaseEditorSession extends androidx.wear.watchface.editor.EditorSession {
     method public void close();
-    method protected final void fetchComplicationPreviewData();
+    method protected final void fetchComplicationsData();
     method public Integer? getBackgroundComplicationId();
     method protected final boolean getClosed();
     method public Integer? getComplicationIdAt(@Px int x, @Px int y);
     method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> $completion);
+    method public suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> $completion);
     method public final kotlinx.coroutines.CoroutineScope getCoroutineScope();
     method protected final boolean getForceClosed();
-    method public suspend Object? openComplicationProviderChooser(int p, kotlin.coroutines.Continuation<? super java.lang.Boolean> $completion);
+    method public suspend Object? openComplicationProviderChooser(int p, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> $completion);
     method @UiThread protected abstract void releaseResources();
     method protected final void requireNotClosed();
     method protected final void setClosed(boolean p);
@@ -21,6 +22,16 @@
     property protected final boolean forceClosed;
   }
 
+  public final class ChosenComplicationProvider {
+    ctor public ChosenComplicationProvider(int complicationId, androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo, android.os.Bundle extras);
+    method public int getComplicationId();
+    method public androidx.wear.complications.ComplicationProviderInfo? getComplicationProviderInfo();
+    method public android.os.Bundle getExtras();
+    property public final int complicationId;
+    property public final androidx.wear.complications.ComplicationProviderInfo? complicationProviderInfo;
+    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(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
@@ -47,6 +58,7 @@
     method public abstract Integer? getBackgroundComplicationId();
     method @UiThread public abstract Integer? getComplicationIdAt(@Px int x, @Px int y);
     method @UiThread public abstract suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method @UiThread public abstract suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public abstract long getPreviewReferenceTimeMillis();
     method public abstract androidx.wear.watchface.style.UserStyle getUserStyle();
@@ -54,7 +66,7 @@
     method public abstract android.content.ComponentName getWatchFaceComponentName();
     method @RequiresApi(android.os.Build.VERSION_CODES.R) public abstract androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
     method @UiThread public final boolean isCommitChangesOnClose();
-    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method @UiThread public abstract suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method @UiThread public abstract android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method @UiThread public final void setCommitChangesOnClose(boolean p);
     method public abstract void setUserStyle(androidx.wear.watchface.style.UserStyle p);
@@ -74,6 +86,9 @@
     method @UiThread public suspend Object? createOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p);
   }
 
+  public final class EditorSessionKt {
+  }
+
   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);
diff --git a/wear/wear-watchface-editor/build.gradle b/wear/wear-watchface-editor/build.gradle
index e80c798..f226b93 100644
--- a/wear/wear-watchface-editor/build.gradle
+++ b/wear/wear-watchface-editor/build.gradle
@@ -37,13 +37,14 @@
 
     implementation("androidx.core:core:1.1.0")
 
+    androidTestImplementation(project(":wear:wear-watchface-complications-rendering"))
     androidTestImplementation(project(":wear:wear-watchface-editor-guava"))
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(KOTLIN_COROUTINES_TEST)
     androidTestImplementation(TRUTH)
 }
diff --git a/wear/wear-watchface-editor/guava/api/current.txt b/wear/wear-watchface-editor/guava/api/current.txt
index 8a92560..716598b 100644
--- a/wear/wear-watchface-editor/guava/api/current.txt
+++ b/wear/wear-watchface-editor/guava/api/current.txt
@@ -8,16 +8,18 @@
     method public Integer? getBackgroundComplicationId();
     method public Integer? getComplicationIdAt(int x, int y);
     method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> getListenableComplicationsProviderInfo();
     method public long getPreviewReferenceTimeMillis();
     method public 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 static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Boolean> listenableOpenComplicationProviderChooser(int complicationId);
-    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationProvider> listenableOpenComplicationProviderChooser(int complicationId);
+    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle value);
     property public Integer? backgroundComplicationId;
diff --git a/wear/wear-watchface-editor/guava/api/public_plus_experimental_current.txt b/wear/wear-watchface-editor/guava/api/public_plus_experimental_current.txt
index 8a92560..716598b 100644
--- a/wear/wear-watchface-editor/guava/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-editor/guava/api/public_plus_experimental_current.txt
@@ -8,16 +8,18 @@
     method public Integer? getBackgroundComplicationId();
     method public Integer? getComplicationIdAt(int x, int y);
     method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> getListenableComplicationsProviderInfo();
     method public long getPreviewReferenceTimeMillis();
     method public 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 static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Boolean> listenableOpenComplicationProviderChooser(int complicationId);
-    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationProvider> listenableOpenComplicationProviderChooser(int complicationId);
+    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle value);
     property public Integer? backgroundComplicationId;
diff --git a/wear/wear-watchface-editor/guava/api/restricted_current.txt b/wear/wear-watchface-editor/guava/api/restricted_current.txt
index 8a92560..716598b 100644
--- a/wear/wear-watchface-editor/guava/api/restricted_current.txt
+++ b/wear/wear-watchface-editor/guava/api/restricted_current.txt
@@ -8,16 +8,18 @@
     method public Integer? getBackgroundComplicationId();
     method public Integer? getComplicationIdAt(int x, int y);
     method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>> p);
+    method public suspend Object? getComplicationsProviderInfo(kotlin.coroutines.Continuation<? super java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> p);
     method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationState> getComplicationsState();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.data.ComplicationData>> getListenableComplicationPreviewData();
+    method public com.google.common.util.concurrent.ListenableFuture<java.util.Map<java.lang.Integer,androidx.wear.complications.ComplicationProviderInfo>> getListenableComplicationsProviderInfo();
     method public long getPreviewReferenceTimeMillis();
     method public 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 static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditingSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent);
-    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Boolean> listenableOpenComplicationProviderChooser(int complicationId);
-    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationProvider> listenableOpenComplicationProviderChooser(int complicationId);
+    method public suspend Object? openComplicationProviderChooser(int complicationId, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.ChosenComplicationProvider> p);
     method public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, long calendarTimeMillis, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>? idToComplicationData);
     method public void setUserStyle(androidx.wear.watchface.style.UserStyle value);
     property public Integer? backgroundComplicationId;
diff --git a/wear/wear-watchface-editor/guava/build.gradle b/wear/wear-watchface-editor/guava/build.gradle
index 5d7afd9..a11ce0d 100644
--- a/wear/wear-watchface-editor/guava/build.gradle
+++ b/wear/wear-watchface-editor/guava/build.gradle
@@ -36,8 +36,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
 }
 
diff --git a/wear/wear-watchface-editor/guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt b/wear/wear-watchface-editor/guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
index 7827a94..d9f57d1 100644
--- a/wear/wear-watchface-editor/guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
+++ b/wear/wear-watchface-editor/guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
@@ -24,6 +24,7 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.UiThread
 import androidx.concurrent.futures.ResolvableFuture
+import androidx.wear.complications.ComplicationProviderInfo
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.client.ComplicationState
@@ -138,9 +139,26 @@
             return future
         }
 
+    /** [ListenableFuture] wrapper around [EditorSession.getComplicationsProviderInfo]. */
+    public fun getListenableComplicationsProviderInfo():
+        ListenableFuture<Map<Int, ComplicationProviderInfo?>> {
+            val future = ResolvableFuture.create<Map<Int, ComplicationProviderInfo?>>()
+            getCoroutineScope().launch {
+                try {
+                    future.set(wrappedEditorSession.getComplicationsProviderInfo())
+                } catch (e: Exception) {
+                    future.setException(e)
+                }
+            }
+            return future
+        }
+
     override suspend fun getComplicationsPreviewData(): Map<Int, ComplicationData> =
         wrappedEditorSession.getComplicationsPreviewData()
 
+    override suspend fun getComplicationsProviderInfo(): Map<Int, ComplicationProviderInfo?> =
+        wrappedEditorSession.getComplicationsProviderInfo()
+
     @get:SuppressWarnings("AutoBoxing")
     override val backgroundComplicationId: Int?
         get() = wrappedEditorSession.backgroundComplicationId
@@ -162,8 +180,8 @@
     /** [ListenableFuture] wrapper around [EditorSession.openComplicationProviderChooser]. */
     public fun listenableOpenComplicationProviderChooser(
         complicationId: Int
-    ): ListenableFuture<Boolean> {
-        val future = ResolvableFuture.create<Boolean>()
+    ): ListenableFuture<ChosenComplicationProvider?> {
+        val future = ResolvableFuture.create<ChosenComplicationProvider?>()
         getCoroutineScope().launch {
             try {
                 future.set(
@@ -176,8 +194,9 @@
         return future
     }
 
-    override suspend fun openComplicationProviderChooser(complicationId: Int): Boolean =
-        wrappedEditorSession.openComplicationProviderChooser(complicationId)
+    override suspend fun openComplicationProviderChooser(complicationId: Int):
+        ChosenComplicationProvider? =
+            wrappedEditorSession.openComplicationProviderChooser(complicationId)
 
     override fun close() {
         wrappedEditorSession.close()
diff --git a/wear/wear-watchface-editor/lint-baseline.xml b/wear/wear-watchface-editor/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface-editor/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-editor/samples/lint-baseline.xml b/wear/wear-watchface-editor/samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface-editor/samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
index ebd6b45..53f57ea 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
@@ -16,30 +16,29 @@
 
 package androidx.wear.watchface.editor.sample
 
-import android.app.Activity
 import android.content.Context
-import android.content.Intent
 import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.Rect
+import android.os.Build
 import android.os.Bundle
-import android.support.wearable.watchface.Constants
-import android.view.GestureDetector
+import android.util.Log
+import android.util.TypedValue
 import android.view.LayoutInflater
-import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Button
+import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
-import androidx.annotation.VisibleForTesting
 import androidx.fragment.app.Fragment
+import androidx.wear.complications.ComplicationProviderInfo
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.LayerMode
 import androidx.wear.watchface.RenderParameters
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.RenderParameters.HighlightLayer
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.widget.SwipeDismissFrameLayout
 import kotlinx.coroutines.launch
-import kotlin.math.abs
 
 /**
  * This fragment lets the user select a non-background complication to configure.
@@ -65,15 +64,6 @@
             )
         }
     }
-
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        if (requestCode == Constants.PROVIDER_CHOOSER_REQUEST_CODE &&
-            resultCode == Activity.RESULT_OK
-        ) {
-            // Exit the configuration flow.
-            activity?.finish()
-        }
-    }
 }
 
 /**
@@ -89,10 +79,52 @@
 internal class ConfigView(
     context: Context,
 
-    val watchFaceConfigActivity: WatchFaceConfigActivity
+    private val watchFaceConfigActivity: WatchFaceConfigActivity
 ) : SwipeDismissFrameLayout(context) {
 
+    companion object {
+        private const val TAG = "ConfigView"
+    }
+
     private lateinit var previewComplicationData: Map<Int, ComplicationData>
+    private val drawRect = Rect()
+
+    // One invisible button per complication.
+    private val complicationButtons =
+        watchFaceConfigActivity.editorSession.complicationsState.mapValues { stateEntry ->
+            // TODO(alexclarke): This button is a Rect which makes the tap animation look bad.
+            if (stateEntry.value.fixedComplicationProvider ||
+                !stateEntry.value.isEnabled ||
+                stateEntry.key == watchFaceConfigActivity.editorSession.backgroundComplicationId
+            ) {
+                // Do not create a button for fixed complications, disabled complications, or
+                // background complications.
+                null
+            } else {
+                Button(context).apply {
+                    // Make the button transparent unless tapped upon.
+                    setBackgroundResource(
+                        TypedValue().apply {
+                            context.theme.resolveAttribute(
+                                android.R.attr.selectableItemBackground,
+                                this,
+                                true
+                            )
+                        }.resourceId
+                    )
+                    setOnClickListener { onComplicationButtonClicked(stateEntry.key) }
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        setOnLongClickListener {
+                            TooltipApi26.updateTooltip(it, watchFaceConfigActivity, stateEntry.key)
+                            // Do not consume the long click so that the tooltip is shown by the
+                            // default handler.
+                            false
+                        }
+                    }
+                    addView(this)
+                }
+            }
+        }
 
     init {
         watchFaceConfigActivity.coroutineScope.launch {
@@ -102,105 +134,46 @@
         }
     }
 
-    /**
-     * Event info class to hold the position and type of the event.
-     * We will use this structure to cache the details of the last
-     * motion event
-     */
-    data class EventInfo(
-        var eventPositionX: Int,
-        var eventPositionY: Int,
-        var eventType: Int
-    )
-
-    private var selectedComplicationId: Int? = null
-    private val drawRect = Rect()
-    private var lastEventInfo: EventInfo? = null
-    private val gestureListener = object : GestureDetector.SimpleOnGestureListener() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onDown(e: MotionEvent): Boolean {
-            lastEventInfo =
-                EventInfo(
-                    e.x.toInt(),
-                    e.y.toInt(),
-                    MotionEvent.ACTION_DOWN
-                )
-            return true
-        }
-
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onSingleTapUp(e: MotionEvent): Boolean {
-            return if (onTap(e.x.toInt(), e.y.toInt())) {
-                invalidate()
-                true
-            } else {
-                super.onSingleTapUp(e)
-            }
+    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
+        super.onLayout(changed, left, top, right, bottom)
+        for ((id, view) in complicationButtons) {
+            val rect = watchFaceConfigActivity.editorSession.complicationsState[id]!!.bounds
+            view?.layout(
+                rect.left,
+                rect.top,
+                rect.right,
+                rect.bottom
+            )
         }
     }
-    private val gestureDetector = GestureDetector(context, gestureListener)
 
-    /**
-     * Called when the user taps on the view.
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @SuppressWarnings("unused")
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    fun onTap(
-        tapX: Int,
-        tapY: Int
-    ): Boolean {
-        // Check if the user tapped on any of the complications, but with the supplied calendar.
-        // This is to support freezing of animated complications while the user selects one to
-        // configure.
-        val complicationId =
-            watchFaceConfigActivity.editorSession.getComplicationIdAt(tapX, tapY) ?: return false
-
-        // Silently do nothing if the complication is fixed. Note the user is given a visual clue
-        // that the complication is not editable in [Complication.drawOutline] so this is OK.
-        val complicationState =
-            watchFaceConfigActivity.editorSession.complicationsState[complicationId]!!
-        if (complicationState.fixedComplicationProvider) {
-            return true
-        }
-
-        // Briefly highlight the complication.
-        selectedComplicationId = complicationId
-        invalidate()
-
-        watchFaceConfigActivity.handler.postDelayed(
-            {
-                selectedComplicationId = null
-                invalidate()
-            },
-            100
-        )
+    private fun onComplicationButtonClicked(complicationId: Int) {
         watchFaceConfigActivity.coroutineScope.launch {
-            watchFaceConfigActivity.fragmentController.showComplicationConfig(complicationId)
+            val chosenComplicationProvider =
+                watchFaceConfigActivity.fragmentController.showComplicationConfig(complicationId)
+            Log.d(TAG, "showComplicationConfig: $chosenComplicationProvider")
             // Redraw after the complication provider chooser has run.
             invalidate()
         }
-
-        return true
     }
 
-    override fun onTouchEvent(event: MotionEvent): Boolean {
-        if (gestureDetector.onTouchEvent(event)) {
-            return true
-        }
-        // This is to handle strange gestureDetector behavior logged here: http://b/153992719
-        if (event.actionMasked == MotionEvent.ACTION_UP) {
-            lastEventInfo?.let {
-                if ((it.eventType == MotionEvent.ACTION_DOWN) &&
-                    (abs(it.eventPositionX - event.rawX.toInt()) < 1) &&
-                    (abs(it.eventPositionY - event.rawY.toInt()) < 1)
-                ) {
-                    onTap(event.rawX.toInt(), event.rawY.toInt())
-                }
+    @RequiresApi(Build.VERSION_CODES.O)
+    private object TooltipApi26 {
+        fun updateTooltip(
+            button: View,
+            watchFaceConfigActivity: WatchFaceConfigActivity,
+            complicationId: Int
+        ) {
+            watchFaceConfigActivity.coroutineScope.launch {
+                val providerInfo =
+                    watchFaceConfigActivity.editorSession
+                        .getComplicationsProviderInfo()[complicationId]
+                button.tooltipText = getProviderInfoToast(providerInfo)
             }
-            lastEventInfo = null
         }
-        return super.onTouchEvent(event)
+
+        private fun getProviderInfoToast(providerInfo: ComplicationProviderInfo?): String =
+            providerInfo?.name ?: "Empty complication provider"
     }
 
     override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
@@ -212,13 +185,12 @@
         val bitmap = editingSession.renderWatchFaceToBitmap(
             RenderParameters(
                 DrawMode.INTERACTIVE,
-                mapOf(
-                    Layer.BASE to LayerMode.DRAW,
-                    Layer.COMPLICATIONS to LayerMode.DRAW_OUTLINED,
-                    Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-                ),
-                selectedComplicationId,
-                Color.RED
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplications,
+                    Color.RED, // Red complication highlight.
+                    Color.argb(128, 0, 0, 0) // Darken everything else.
+                )
             ),
             editingSession.previewReferenceTimeMillis,
             previewComplicationData
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
index 7f06cf8..7d3cab6 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ConfigFragment.kt
@@ -16,9 +16,7 @@
 
 package androidx.wear.watchface.editor.sample
 
-import android.app.Activity
 import android.content.Context
-import android.content.Intent
 import android.graphics.Typeface
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.Icon
@@ -156,7 +154,7 @@
             )
             infoArray?.let {
                 it[0].info?.apply {
-                    backgroundConfigOption.summary = providerName!!
+                    backgroundConfigOption.summary = name
                 }
                 configViewAdapter.notifyDataSetChanged()
             }
@@ -165,15 +163,6 @@
         return backgroundConfigOption
     }
 
-    /** Called with the result from the call to watchFaceImpl.onComplicationConfigTap() above. */
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        if (requestCode == Constants.PROVIDER_CHOOSER_REQUEST_CODE &&
-            resultCode == Activity.RESULT_OK
-        ) {
-            activity?.finish()
-        }
-    }
-
     override fun onDestroy() {
         super.onDestroy()
     }
diff --git a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
index 6955326..9a27f0e 100644
--- a/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
+++ b/wear/wear-watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/WatchFaceConfigActivity.kt
@@ -20,6 +20,7 @@
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.util.Log
 import android.view.View
 import android.view.accessibility.AccessibilityEvent
 import androidx.annotation.RestrictTo
@@ -28,6 +29,7 @@
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.wear.complications.data.ComplicationData
+import androidx.wear.watchface.editor.ChosenComplicationProvider
 import androidx.wear.watchface.editor.EditorSession
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
@@ -55,7 +57,7 @@
     )
 
     /** Lets the user configure the complication provider for a single complication slot. */
-    suspend fun showComplicationConfig(complicationId: Int): Boolean
+    suspend fun showComplicationConfig(complicationId: Int): ChosenComplicationProvider?
 }
 
 // Reference time for editor screenshots for analog watch faces.
@@ -71,6 +73,10 @@
  * as userStyle configuration.
  */
 class WatchFaceConfigActivity : FragmentActivity() {
+    companion object {
+        private const val TAG = "WatchFaceConfigActivity"
+    }
+
     internal val complicationData = HashMap<Int, ComplicationData>()
 
     internal lateinit var editorSession: EditorSession
@@ -190,7 +196,9 @@
             numComplications == 1 -> {
                 val onlyComplication = editorSession.complicationsState.entries.first()
                 coroutineScope.launch {
-                    fragmentController.showComplicationConfig(onlyComplication.key)
+                    val chosenComplicationProvider =
+                        fragmentController.showComplicationConfig(onlyComplication.key)
+                    Log.d(TAG, "showComplicationConfig: $chosenComplicationProvider")
                 }
             }
 
diff --git a/wear/wear-watchface-editor/src/androidTest/AndroidManifest.xml b/wear/wear-watchface-editor/src/androidTest/AndroidManifest.xml
index e1d17da..8698f0b 100644
--- a/wear/wear-watchface-editor/src/androidTest/AndroidManifest.xml
+++ b/wear/wear-watchface-editor/src/androidTest/AndroidManifest.xml
@@ -25,6 +25,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
         <activity android:name="androidx.wear.watchface.editor.TestComplicationHelperActivity"
             android:exported="false">
             <intent-filter>
@@ -33,5 +34,10 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name="androidx.wear.watchface.editor.TestComplicationProviderChooserActivity" />
+
+        <activity android:name="androidx.wear.complications.ComplicationHelperActivity" />
     </application>
 </manifest>
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
index 0417a38..38007635 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditingSessionTest.kt
@@ -21,50 +21,61 @@
 import android.content.Context
 import android.content.Intent
 import android.graphics.Bitmap
+import android.graphics.Canvas
 import android.graphics.Rect
 import android.graphics.RectF
 import android.graphics.drawable.Icon
+import android.icu.util.Calendar
 import android.os.Bundle
 import android.os.Handler
 import android.os.IBinder
 import android.os.Looper
-import android.os.Parcel
-import android.support.wearable.complications.ComplicationData
-import android.support.wearable.complications.ComplicationProviderInfo
 import android.support.wearable.complications.IPreviewComplicationDataCallback
 import android.support.wearable.complications.IProviderInfoService
+import android.view.Surface
+import android.view.SurfaceHolder
 import androidx.activity.ComponentActivity
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.wear.complications.ComplicationBounds
+import androidx.wear.complications.ComplicationHelperActivity
+import androidx.wear.complications.ComplicationProviderInfo
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.ProviderChooserIntent
 import androidx.wear.complications.ProviderInfoRetriever
 import androidx.wear.complications.SystemProviders
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
+import androidx.wear.complications.data.EmptyComplicationData
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.ShortTextComplicationData
-import androidx.wear.watchface.CanvasComplicationDrawable
+import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.MutableWatchState
 import androidx.wear.watchface.RenderParameters
+import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
+import androidx.wear.watchface.WatchFaceHostApi
+import androidx.wear.watchface.WatchFaceImpl
+import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.client.WatchFaceId
 import androidx.wear.watchface.client.asApiEditorState
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.editor.data.EditorStateWireFormat
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import androidx.wear.watchface.style.Layer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption
 import androidx.wear.watchface.style.UserStyleSetting.Option
+import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
@@ -84,6 +95,7 @@
 import org.mockito.Mockito
 import org.mockito.Mockito.`when`
 import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.mock
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
@@ -99,10 +111,16 @@
 
 private const val PROVIDER_CHOOSER_EXTRA_KEY = "PROVIDER_CHOOSER_EXTRA_KEY"
 private const val PROVIDER_CHOOSER_EXTRA_VALUE = "PROVIDER_CHOOSER_EXTRA_VALUE"
+private const val PROVIDER_CHOOSER_RESULT_EXTRA_KEY = "PROVIDER_CHOOSER_RESULT_EXTRA_KEY"
+private const val PROVIDER_CHOOSER_RESULT_EXTRA_VALUE = "PROVIDER_CHOOSER_RESULT_EXTRA_VALUE"
+
+private typealias WireComplicationProviderInfo =
+    android.support.wearable.complications.ComplicationProviderInfo
 
 /** Trivial "editor" which exposes the EditorSession for testing. */
 public open class OnWatchFaceEditingTestActivity : ComponentActivity() {
     public lateinit var editorSession: EditorSession
+    public lateinit var onCreateException: Exception
 
     public val listenableEditorSession: ListenableEditorSession by lazy {
         ListenableEditorSession(editorSession)
@@ -118,11 +136,15 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         immediateCoroutineScope.launch {
-            editorSession = EditorSession.createOnWatchEditingSessionImpl(
-                this@OnWatchFaceEditingTestActivity,
-                intent!!,
-                providerInfoRetrieverProvider!!
-            )!!
+            try {
+                editorSession = EditorSession.createOnWatchEditingSessionImpl(
+                    this@OnWatchFaceEditingTestActivity,
+                    intent!!,
+                    providerInfoRetrieverProvider!!
+                )!!
+            } catch (e: Exception) {
+                onCreateException = e
+            }
         }
     }
 }
@@ -141,29 +163,32 @@
             "ProviderApp1",
             "Provider1",
             providerIcon1,
-            ComplicationType.SHORT_TEXT.toWireComplicationType(),
+            ComplicationType.SHORT_TEXT,
             provider1
         ),
         RIGHT_COMPLICATION_ID to ComplicationProviderInfo(
             "ProviderApp2",
             "Provider2",
             providerIcon2,
-            ComplicationType.LONG_TEXT.toWireComplicationType(),
+            ComplicationType.LONG_TEXT,
             provider2
         )
     )
     private val previewData = mapOf(
         provider1 to
             ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder("Left").build()
+                PlainComplicationText.Builder("Left").build(),
+                ComplicationText.EMPTY
             ).build().asWireComplicationData(),
         provider2 to
             LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("Right").build()
+                PlainComplicationText.Builder("Right").build(),
+                ComplicationText.EMPTY
             ).build().asWireComplicationData(),
         provider3 to
             LongTextComplicationData.Builder(
-                PlainComplicationText.Builder("Provider3").build()
+                PlainComplicationText.Builder("Provider3").build(),
+                ComplicationText.EMPTY
             ).build().asWireComplicationData(),
     )
 
@@ -172,13 +197,13 @@
     override fun getProviderInfos(
         watchFaceComponent: ComponentName,
         ids: IntArray
-    ): Array<ComplicationProviderInfo>? {
+    ): Array<WireComplicationProviderInfo?>? {
         if (watchFaceComponent != this.watchFaceComponent) {
             return null
         }
-        return ArrayList<ComplicationProviderInfo>().apply {
+        return ArrayList<WireComplicationProviderInfo?>().apply {
             for (id in ids) {
-                providerData[id]?.let { add(it) }
+                add(providerData[id]?.toWireComplicationProviderInfo())
             }
         }.toTypedArray()
     }
@@ -200,6 +225,7 @@
 
     public companion object {
         public var lastIntent: Intent? = null
+        public var resultIntent: Intent? = null
     }
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -207,23 +233,25 @@
 
         lastIntent = intent
 
-        setResult(
-            123,
-            Intent().apply {
-                putExtra(
-                    "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
-                    ComplicationProviderInfo(
-                        "TestProvider3App",
-                        "TestProvider3",
-                        Icon.createWithBitmap(
-                            Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
-                        ),
-                        ComplicationType.LONG_TEXT.toWireComplicationType(),
-                        provider3
-                    )
-                )
-            }
-        )
+        setResult(123, resultIntent)
+        finish()
+    }
+}
+
+/** Fake complication provider choooser for testing. */
+public class TestComplicationProviderChooserActivity : Activity() {
+
+    public companion object {
+        public var lastIntent: Intent? = null
+        public var resultIntent: Intent? = null
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        lastIntent = intent
+
+        setResult(123, resultIntent)
         finish()
     }
 }
@@ -251,7 +279,7 @@
         "Watchface colorization", /* icon = */
         null,
         colorStyleList,
-        listOf(Layer.BASE)
+        listOf(WatchFaceLayer.BASE)
     )
 
     private val classicStyleOption = ListOption(Option.Id("classic_style"), "Classic", icon = null)
@@ -269,7 +297,7 @@
         "Hand visual look", /* icon = */
         null,
         watchHandStyleList,
-        listOf(Layer.COMPLICATIONS_OVERLAY)
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
     )
 
     private val placeholderWatchState = MutableWatchState().asWatchState()
@@ -286,7 +314,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.SUNRISE_SUNSET),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_SUNRISE_SUNSET),
             ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .build()
@@ -304,7 +332,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
             ComplicationBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .setConfigExtras(
@@ -402,6 +430,9 @@
 
     @After
     public fun tearDown() {
+        ComplicationProviderChooserContract.useTestComplicationHelperActivity = false
+        ComplicationHelperActivity.useTestComplicationProviderChooserActivity = false
+        ComplicationHelperActivity.skipPermissionCheck = false
         WatchFace.clearAllEditorDelegates()
     }
 
@@ -538,7 +569,7 @@
                     ComplicationType.MONOCHROMATIC_IMAGE,
                     ComplicationType.SMALL_IMAGE
                 ),
-                DefaultComplicationProviderPolicy(SystemProviders.SUNRISE_SUNSET),
+                DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_SUNRISE_SUNSET),
                 ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
             ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
                 .setFixedComplicationProvider(true)
@@ -600,7 +631,7 @@
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
                 val mockProviderInfoService = Mockito.mock(IProviderInfoService::class.java)
-                val complicationType = ComplicationData.TYPE_SHORT_TEXT
+                val complicationType = ComplicationType.SHORT_TEXT
                 val complicationText = "TestText"
                 val mockBinder = Mockito.mock(IBinder::class.java)
 
@@ -611,13 +642,14 @@
                     val callback = it.arguments[2] as IPreviewComplicationDataCallback
                     callback.updateComplicationData(
                         ShortTextComplicationData.Builder(
-                            PlainComplicationText.Builder(complicationText).build()
+                            PlainComplicationText.Builder(complicationText).build(),
+                            ComplicationText.EMPTY
                         ).build().asWireComplicationData()
                     )
                     true
                 }.`when`(mockProviderInfoService).requestPreviewComplicationData(
                     eq(providerComponentName),
-                    eq(complicationType),
+                    eq(complicationType.toWireComplicationType()),
                     any()
                 )
 
@@ -650,6 +682,7 @@
     }
 
     @Test
+    @SdkSuppress(maxSdkVersion = 28)
     public fun getPreviewData_preRFallback() {
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
@@ -659,24 +692,18 @@
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
                 val mockProviderInfoService = Mockito.mock(IProviderInfoService::class.java)
-                val complicationType = ComplicationData.TYPE_SHORT_TEXT
+                val complicationType = ComplicationType.SHORT_TEXT
 
                 val providerInfoRetriever = ProviderInfoRetriever(mockProviderInfoService)
                 val previewComplication = editorSession.getPreviewData(
                     providerInfoRetriever,
                     // Construct a ComplicationProviderInfo with null providerComponentName.
                     ComplicationProviderInfo(
-                        Parcel.obtain().apply {
-                            writeBundle(
-                                Bundle().apply {
-                                    putString("app_name", "provider.app")
-                                    putString("provider_name", "provider")
-                                    putParcelable("provider_icon", providerIcon)
-                                    putInt("complication_type", complicationType)
-                                }
-                            )
-                            setDataPosition(0)
-                        }
+                        "provider.app",
+                        "provider",
+                        providerIcon,
+                        complicationType,
+                        null,
                     )
                 ) as ShortTextComplicationData
 
@@ -693,6 +720,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = 30)
     public fun getPreviewData_postRFallback() {
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
@@ -702,13 +730,13 @@
             runBlocking {
                 val editorSession = it.editorSession as OnWatchFaceEditorSessionImpl
                 val mockProviderInfoService = Mockito.mock(IProviderInfoService::class.java)
-                val complicationType = ComplicationData.TYPE_SHORT_TEXT
+                val complicationType = ComplicationType.SHORT_TEXT
 
                 `when`(mockProviderInfoService.apiVersion).thenReturn(1)
                 `when`(
                     mockProviderInfoService.requestPreviewComplicationData(
                         eq(providerComponentName),
-                        eq(complicationType),
+                        eq(complicationType.toWireComplicationType()),
                         any(IPreviewComplicationDataCallback::class.java)
                     )
                 ).thenReturn(false) // Triggers the ExecutionException.
@@ -737,6 +765,21 @@
     @Test
     public fun launchComplicationProviderChooser() {
         ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        val chosenComplicationProviderInfo = ComplicationProviderInfo(
+            "TestProvider3App",
+            "TestProvider3",
+            Icon.createWithBitmap(
+                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+            ),
+            ComplicationType.LONG_TEXT,
+            provider3
+        )
+        TestComplicationHelperActivity.resultIntent = Intent().apply {
+            putExtra(
+                "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
+                chosenComplicationProviderInfo.toWireComplicationProviderInfo()
+            )
+        }
 
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
@@ -753,7 +796,15 @@
              * Invoke [TestComplicationHelperActivity] which will change the provider (and hence
              * the preview data) for [LEFT_COMPLICATION_ID].
              */
-            assertTrue(editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID))
+            val chosenComplicationProvider =
+                editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID)
+            assertThat(chosenComplicationProvider).isNotNull()
+            checkNotNull(chosenComplicationProvider)
+            assertThat(chosenComplicationProvider.complicationId).isEqualTo(LEFT_COMPLICATION_ID)
+            assertEquals(
+                chosenComplicationProviderInfo,
+                chosenComplicationProvider.complicationProviderInfo
+            )
 
             // This should update the preview data to point to the updated provider3 data.
             val previewComplication =
@@ -776,8 +827,22 @@
     }
 
     @Test
-    public fun launchComplicationProviderChooser_ComplicationConfigExtras() {
+    public fun launchComplicationProviderChooserTwiceBackToBack() {
         ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        TestComplicationHelperActivity.resultIntent = Intent().apply {
+            putExtra(
+                "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
+                ComplicationProviderInfo(
+                    "TestProvider3App",
+                    "TestProvider3",
+                    Icon.createWithBitmap(
+                        Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+                    ),
+                    ComplicationType.LONG_TEXT,
+                    provider3
+                ).toWireComplicationProviderInfo()
+            )
+        }
 
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
@@ -790,7 +855,114 @@
         }
 
         runBlocking {
-            assertTrue(editorSession.openComplicationProviderChooser(RIGHT_COMPLICATION_ID))
+            val pendingResult = async {
+                editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID)
+            }
+
+            // This shouldn't crash.
+            assertThat(editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID))
+                .isNotNull()
+            assertThat(pendingResult).isNotNull()
+        }
+    }
+
+    @Test
+    public fun launchComplicationProviderChooser_chooseEmpty() {
+        ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        TestComplicationHelperActivity.resultIntent = Intent().apply {}
+
+        val scenario = createOnWatchFaceEditingTestActivity(
+            emptyList(),
+            listOf(leftComplication, rightComplication)
+        )
+
+        lateinit var editorSession: EditorSession
+        scenario.onActivity { activity ->
+            editorSession = activity.editorSession
+        }
+
+        runBlocking {
+            /**
+             * Invoke [TestComplicationHelperActivity] which will change the provider (and hence
+             * the preview data) for [LEFT_COMPLICATION_ID].
+             */
+            val chosenComplicationProvider =
+                editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID)
+            assertThat(chosenComplicationProvider).isNotNull()
+            checkNotNull(chosenComplicationProvider)
+            assertThat(chosenComplicationProvider.complicationId).isEqualTo(LEFT_COMPLICATION_ID)
+            assertThat(chosenComplicationProvider.complicationProviderInfo).isNull()
+            assertThat(editorSession.getComplicationsPreviewData()[LEFT_COMPLICATION_ID])
+                .isInstanceOf(EmptyComplicationData::class.java)
+        }
+    }
+
+    @Test
+    public fun launchComplicationProviderChooser_cancel() {
+        ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        TestComplicationHelperActivity.resultIntent = null
+
+        val scenario = createOnWatchFaceEditingTestActivity(
+            emptyList(),
+            listOf(leftComplication, rightComplication)
+        )
+
+        lateinit var editorSession: EditorSession
+        scenario.onActivity { activity ->
+            editorSession = activity.editorSession
+        }
+
+        runBlocking {
+            /**
+             * Invoke [TestComplicationHelperActivity] which will simulate the user canceling.
+             */
+            assertThat(editorSession.openComplicationProviderChooser(LEFT_COMPLICATION_ID)).isNull()
+        }
+    }
+
+    @Test
+    public fun launchComplicationProviderChooser_ComplicationConfigExtrasToHelper() {
+        ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        val chosenComplicationProviderInfo = ComplicationProviderInfo(
+            "TestProvider3App",
+            "TestProvider3",
+            Icon.createWithBitmap(
+                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+            ),
+            ComplicationType.LONG_TEXT,
+            provider3
+        )
+        TestComplicationHelperActivity.resultIntent = Intent().apply {
+            putExtra(
+                "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
+                chosenComplicationProviderInfo.toWireComplicationProviderInfo()
+            )
+            putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+        }
+
+        val scenario = createOnWatchFaceEditingTestActivity(
+            emptyList(),
+            listOf(leftComplication, rightComplication)
+        )
+
+        lateinit var editorSession: EditorSession
+        scenario.onActivity { activity ->
+            editorSession = activity.editorSession
+        }
+
+        runBlocking {
+            val chosenComplicationProvider =
+                editorSession.openComplicationProviderChooser(RIGHT_COMPLICATION_ID)
+            assertThat(chosenComplicationProvider).isNotNull()
+            checkNotNull(chosenComplicationProvider)
+            assertThat(chosenComplicationProvider.complicationId).isEqualTo(RIGHT_COMPLICATION_ID)
+            assertEquals(
+                chosenComplicationProviderInfo,
+                chosenComplicationProvider.complicationProviderInfo
+            )
+            assertThat(
+                chosenComplicationProvider.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY]
+            ).isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
 
             assertThat(
                 TestComplicationHelperActivity.lastIntent?.extras?.getString(
@@ -801,6 +973,62 @@
     }
 
     @Test
+    public fun launchComplicationProviderChooser_ComplicationConfigExtrasToChooser() {
+        // Invoke the test provider chooser to record the result.
+        ComplicationHelperActivity.useTestComplicationProviderChooserActivity = true
+        // Invoke the provider chooser without checking for permissions first.
+        ComplicationHelperActivity.skipPermissionCheck = true
+
+        val chosenComplicationProviderInfo = ComplicationProviderInfo(
+            "TestProvider3App",
+            "TestProvider3",
+            Icon.createWithBitmap(
+                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+            ),
+            ComplicationType.LONG_TEXT,
+            provider3
+        )
+        TestComplicationProviderChooserActivity.resultIntent = Intent().apply {
+            putExtra(
+                "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
+                chosenComplicationProviderInfo.toWireComplicationProviderInfo()
+            )
+            putExtra(PROVIDER_CHOOSER_RESULT_EXTRA_KEY, PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+        }
+
+        val scenario = createOnWatchFaceEditingTestActivity(
+            emptyList(),
+            listOf(leftComplication, rightComplication)
+        )
+
+        lateinit var editorSession: EditorSession
+        scenario.onActivity { activity ->
+            editorSession = activity.editorSession
+        }
+
+        runBlocking {
+            val chosenComplicationProvider =
+                editorSession.openComplicationProviderChooser(RIGHT_COMPLICATION_ID)
+            assertThat(chosenComplicationProvider).isNotNull()
+            checkNotNull(chosenComplicationProvider)
+            assertThat(chosenComplicationProvider.complicationId).isEqualTo(RIGHT_COMPLICATION_ID)
+            assertEquals(
+                chosenComplicationProviderInfo,
+                chosenComplicationProvider.complicationProviderInfo
+            )
+            assertThat(
+                chosenComplicationProvider.extras[PROVIDER_CHOOSER_RESULT_EXTRA_KEY]
+            ).isEqualTo(PROVIDER_CHOOSER_RESULT_EXTRA_VALUE)
+
+            assertThat(
+                TestComplicationProviderChooserActivity.lastIntent?.extras?.getString(
+                    PROVIDER_CHOOSER_EXTRA_KEY
+                )
+            ).isEqualTo(PROVIDER_CHOOSER_EXTRA_VALUE)
+        }
+    }
+
+    @Test
     public fun getComplicationIdAt() {
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
@@ -1100,15 +1328,16 @@
         scenario.onActivity {
             baseEditorSession = it.editorSession as BaseEditorSession
             baseEditorSession.pendingComplicationProviderChooserResult = CompletableDeferred()
-            baseEditorSession.updatePreviewData(
+            baseEditorSession.onComplicationProviderChooserResult(
                 ComplicationProviderChooserResult(
                     ComplicationProviderInfo(
                         "provider.app",
                         "provider",
                         providerIcon,
-                        ComplicationData.TYPE_SHORT_TEXT,
+                        ComplicationType.SHORT_TEXT,
                         providerComponentName
-                    )
+                    ),
+                    Bundle.EMPTY
                 )
             )
         }
@@ -1121,4 +1350,150 @@
         // Ensure the providerInfoRetriever was closed despite forceClose() being called.
         assertThat(providerInfoRetriever.closed).isTrue()
     }
+
+    @Test
+    public fun getComplicationsPreviewData() {
+        val scenario = createOnWatchFaceEditingTestActivity(
+            listOf(colorStyleSetting, watchHandStyleSetting),
+            listOf(leftComplication, rightComplication)
+        )
+
+        scenario.onActivity { activity ->
+            runBlocking {
+                val previewData = activity.editorSession.getComplicationsPreviewData()
+                assertThat(previewData.size).isEqualTo(2)
+                assertThat(previewData[LEFT_COMPLICATION_ID])
+                    .isInstanceOf(ShortTextComplicationData::class.java)
+                val leftComplicationData =
+                    previewData[LEFT_COMPLICATION_ID] as ShortTextComplicationData
+                assertThat(
+                    leftComplicationData.text.getTextAt(
+                        ApplicationProvider.getApplicationContext<Context>().resources,
+                        0
+                    )
+                ).isEqualTo("Left")
+
+                assertThat(previewData[RIGHT_COMPLICATION_ID])
+                    .isInstanceOf(LongTextComplicationData::class.java)
+                val rightComplicationData =
+                    previewData[RIGHT_COMPLICATION_ID] as LongTextComplicationData
+                assertThat(
+                    rightComplicationData.text.getTextAt(
+                        ApplicationProvider.getApplicationContext<Context>().resources,
+                        0
+                    )
+                ).isEqualTo("Right")
+            }
+        }
+    }
+
+    public fun getComplicationsPreviewData_withEmptyBackgroundComplication() {
+        val scenario = createOnWatchFaceEditingTestActivity(
+            listOf(colorStyleSetting, watchHandStyleSetting),
+            listOf(leftComplication, backgroundComplication)
+        )
+
+        scenario.onActivity { activity ->
+            runBlocking {
+                val previewData = activity.editorSession.getComplicationsPreviewData()
+                assertThat(previewData.size).isEqualTo(2)
+                assertThat(previewData[LEFT_COMPLICATION_ID])
+                    .isInstanceOf(ShortTextComplicationData::class.java)
+                val leftComplicationData =
+                    previewData[LEFT_COMPLICATION_ID] as ShortTextComplicationData
+                assertThat(
+                    leftComplicationData.text.getTextAt(
+                        ApplicationProvider.getApplicationContext<Context>().resources,
+                        0
+                    )
+                ).isEqualTo("Left")
+
+                // TestProviderInfoRetrieverProvider isn't configured with a provider for the
+                // background complication which means it behaves as if it was an empty
+                // complication as far as fetching preview data is concerned.
+                assertThat(previewData[BACKGROUND_COMPLICATION_ID])
+                    .isInstanceOf(EmptyComplicationData::class.java)
+            }
+        }
+    }
+
+    @Test
+    public fun testComponentNameMismatch() {
+        val watchFaceId = WatchFaceId("ID-1")
+        val scenario: ActivityScenario<OnWatchFaceEditingTestActivity> = ActivityScenario.launch(
+            WatchFaceEditorContract().createIntent(
+                ApplicationProvider.getApplicationContext<Context>(),
+                EditorRequest(testComponentName, testEditorPackageName, null, watchFaceId)
+            ).apply {
+                component = ComponentName(
+                    ApplicationProvider.getApplicationContext<Context>(),
+                    OnWatchFaceEditingTestActivity::class.java
+                )
+            }
+        )
+
+        scenario.onActivity { activity ->
+            val mockWatchFaceHostApi = mock(WatchFaceHostApi::class.java)
+            val mockHandler = mock(Handler::class.java)
+            `when`(mockWatchFaceHostApi.getHandler()).thenReturn(mockHandler)
+            `when`(mockWatchFaceHostApi.getContext()).thenReturn(
+                ApplicationProvider.getApplicationContext<Context>()
+            )
+            val watchState = MutableWatchState().asWatchState()
+            val currentUserStyleRepository =
+                CurrentUserStyleRepository(UserStyleSchema(emptyList()))
+            val mockSurfaceHolder = mock(SurfaceHolder::class.java)
+            val mockSurface = mock(Surface::class.java)
+            `when`(mockSurfaceHolder.surface).thenReturn(mockSurface)
+            `when`(mockSurfaceHolder.surfaceFrame).thenReturn(Rect())
+            `when`(mockSurface.isValid).thenReturn(false)
+
+            // Construct a WatchFaceImpl which creates a delegate whose ComponentName doesn't match
+            // testComponentName.
+            WatchFaceImpl(
+                WatchFace(
+                    WatchFaceType.DIGITAL,
+                    currentUserStyleRepository,
+                    object : Renderer.CanvasRenderer(
+                        mockSurfaceHolder,
+                        currentUserStyleRepository,
+                        watchState, CanvasType.SOFTWARE,
+                        16
+                    ) {
+                        override fun render(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
+
+                        override fun renderHighlightLayer(
+                            canvas: Canvas,
+                            bounds: Rect,
+                            calendar: Calendar
+                        ) {
+                        }
+                    }
+                ),
+                mockWatchFaceHostApi,
+                watchState
+            )
+
+            assertThat(activity.onCreateException).isInstanceOf(IllegalStateException::class.java)
+            assertThat(activity.onCreateException.message).isEqualTo(
+                "Expected ComponentInfo{test.package/test.class} to be created but " +
+                    "got ComponentInfo{androidx.wear.watchface.editor.test/" +
+                    "android.app.Application}"
+            )
+        }
+    }
 }
+
+internal fun assertEquals(expected: ComplicationProviderInfo?, actual: ComplicationProviderInfo?) =
+    when (expected) {
+        null -> assertThat(actual).isNull()
+        else -> {
+            assertThat(actual).isNotNull()
+            checkNotNull(actual)
+            assertThat(actual.appName).isEqualTo(expected.appName)
+            assertThat(actual.name).isEqualTo(expected.name)
+            // Check the type as a proxy for it being the same icon.
+            assertThat(actual.icon.type).isEqualTo(expected.icon.type)
+            assertThat(actual.componentName).isEqualTo(expected.componentName)
+        }
+    }
diff --git a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
index 76639ee..3a7a9a35 100644
--- a/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
+++ b/wear/wear-watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
@@ -18,31 +18,34 @@
 
 import android.content.ComponentName
 import android.content.Context
+import android.content.Intent
+import android.graphics.Bitmap
 import android.graphics.Rect
 import android.graphics.RectF
+import android.graphics.drawable.Icon
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.wear.complications.ComplicationBounds
+import androidx.wear.complications.ComplicationProviderInfo
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.LongTextComplicationData
 import androidx.wear.complications.data.ShortTextComplicationData
-import androidx.wear.watchface.CanvasComplicationDrawable
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.MutableWatchState
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.client.WatchFaceId
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
 import com.google.common.truth.Truth
 import com.google.common.truth.Truth.assertThat
-import org.junit.Assert.assertTrue
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito
@@ -73,7 +76,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.SUNRISE_SUNSET),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_SUNRISE_SUNSET),
             ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .build()
@@ -91,7 +94,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
             ComplicationBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .build()
@@ -161,6 +164,21 @@
     @Test
     public fun listenableOpenComplicationProviderChooser() {
         ComplicationProviderChooserContract.useTestComplicationHelperActivity = true
+        val chosenComplicationProviderInfo = ComplicationProviderInfo(
+            "TestProvider3App",
+            "TestProvider3",
+            Icon.createWithBitmap(
+                Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
+            ),
+            ComplicationType.LONG_TEXT,
+            provider3
+        )
+        TestComplicationHelperActivity.resultIntent = Intent().apply {
+            putExtra(
+                "android.support.wearable.complications.EXTRA_PROVIDER_INFO",
+                chosenComplicationProviderInfo.toWireComplicationProviderInfo()
+            )
+        }
         val scenario = createOnWatchFaceEditingTestActivity(
             emptyList(),
             listOf(leftComplication, rightComplication)
@@ -175,10 +193,16 @@
          * Invoke [TestComplicationHelperActivity] which will change the provider (and hence
          * the preview data) for [LEFT_COMPLICATION_ID].
          */
-        assertTrue(
+        val chosenComplicationProvider =
             listenableEditorSession.listenableOpenComplicationProviderChooser(
                 LEFT_COMPLICATION_ID
             ).get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        assertThat(chosenComplicationProvider).isNotNull()
+        checkNotNull(chosenComplicationProvider)
+        assertThat(chosenComplicationProvider.complicationId).isEqualTo(LEFT_COMPLICATION_ID)
+        assertEquals(
+            chosenComplicationProviderInfo,
+            chosenComplicationProvider.complicationProviderInfo
         )
 
         // This should update the preview data to point to the updated provider3 data.
@@ -194,4 +218,4 @@
             )
         ).isEqualTo("Provider3")
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index 9d46700..6935eed 100644
--- a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -25,7 +25,6 @@
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
-import android.support.wearable.complications.ComplicationProviderInfo
 import androidx.activity.ComponentActivity
 import androidx.activity.result.contract.ActivityResultContract
 import androidx.annotation.Px
@@ -33,16 +32,20 @@
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
 import androidx.wear.complications.ComplicationHelperActivity
+import androidx.wear.complications.ComplicationProviderInfo
 import androidx.wear.complications.ProviderInfoRetriever
 import androidx.wear.complications.data.ComplicationData
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.ComplicationType
-import androidx.wear.complications.data.LongTextComplicationData
+import androidx.wear.complications.data.EmptyComplicationData
 import androidx.wear.complications.data.MonochromaticImage
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.ShortTextComplicationData
+import androidx.wear.complications.toApiComplicationProviderInfo
 import androidx.wear.utility.AsyncTraceEvent
 import androidx.wear.utility.TraceEvent
 import androidx.wear.utility.launchWithTracing
+import androidx.wear.watchface.DrawMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.client.ComplicationState
@@ -66,6 +69,9 @@
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withTimeout
 
+private typealias WireComplicationProviderInfo =
+    android.support.wearable.complications.ComplicationProviderInfo
+
 /**
  * Interface for manipulating watch face state during an editing session for a watch face editing
  * session. The editor should adjust [userStyle] and call [openComplicationProviderChooser] to
@@ -118,14 +124,24 @@
 
     /**
      * Returns a map of complication ids to preview [ComplicationData] suitable for use in rendering
-     * the watch face. Note if a slot is configured to be empty then it will not appear in the map,
-     * however disabled complications are included. Note also unlike live data this is static per
-     * provider, but it may update (on the UiThread) as a result of
+     * the watch face. Note if a slot is configured to be empty then it will an instance of
+     * [EmptyComplicationData]. Disabled complications are included. Note also unlike live data
+     * this is static per provider, but it may update (on the UiThread) as a result of
      * [openComplicationProviderChooser].
      */
     @UiThread
     public abstract suspend fun getComplicationsPreviewData(): Map<Int, ComplicationData>
 
+    /**
+     * Returns a map of complication ids to [ComplicationProviderInfo] that represent the
+     * information available about the provider for each complication.
+     *
+     * A `null` [ComplicationProviderInfo] will be associated with a complication id if the
+     * complication is configured to show the empty complication provider.
+     */
+    @UiThread
+    public abstract suspend fun getComplicationsProviderInfo(): Map<Int, ComplicationProviderInfo?>
+
     /** The ID of the background complication or `null` if there isn't one. */
     @get:SuppressWarnings("AutoBoxing")
     public abstract val backgroundComplicationId: Int?
@@ -141,7 +157,7 @@
     /**
      * Renders the watch face to a [Bitmap] using the current [userStyle].
      *
-     * @param renderParameters The [RenderParameters] to render with
+     * @param renderParameters The [RenderParameters] to render with. Must be [DrawMode.INTERACTIVE]
      * @param calendarTimeMillis The UTC time in milliseconds since the epoch to render with
      * @param idToComplicationData The [ComplicationData] for each complication to render with
      */
@@ -153,12 +169,19 @@
     ): Bitmap
 
     /**
-     * Opens the complication provider chooser and returns `true` if the user made a selection or
-     * `false` if the activity was canceled. If the complication provider was changed then the map
-     * returned by [getComplicationsPreviewData] is updated (on the UiThread).
+     * Opens the complication provider chooser and returns the chosen complication provider
+     * for the given splot.
+     *
+     * The result returns `null` if the operation was cancelled and otherwise returned an
+     * instance of [ChosenComplicationProvider] that contains information about the chosen
+     * provider.
+     *
+     * If the complication provider was changed then the map returned by
+     * [getComplicationsPreviewData] is updated (on the UiThread).
      */
     @UiThread
-    public abstract suspend fun openComplicationProviderChooser(complicationId: Int): Boolean
+    public abstract suspend fun openComplicationProviderChooser(complicationId: Int):
+        ChosenComplicationProvider?
 
     public companion object {
         /**
@@ -169,7 +192,7 @@
          * @param activity The [ComponentActivity] associated with the [EditorSession].
          * @param editIntent The [Intent] sent by SysUI to launch the editing session.
          * @return Deferred<EditorSession?> which is resolved with either the [EditorSession] or
-         *    `null` if it can't be constructed.
+         * `null` if it can't be constructed.
          */
         @SuppressWarnings("ExecutorRegistration")
         @JvmStatic
@@ -213,7 +236,7 @@
                     session.setEditorDelegate(
                         WatchFace.getOrCreateEditorDelegate(
                             editorRequest.watchFaceComponentName
-                        ).await()!!
+                        ).await()
                     )
 
                     // Resolve only after init has been completed.
@@ -257,6 +280,22 @@
     }
 }
 
+/**
+ * The complication provider that was chosen by the user for a given complication id as a result
+ * to a call to [EditorSession.openComplicationProviderChooser].
+ */
+public class ChosenComplicationProvider(
+    /** The ID of the complication slot that was configured. */
+    public val complicationId: Int,
+    /** The provider that was chosen for this slot, or `null` if the empty provider was chosen. */
+    public val complicationProviderInfo: ComplicationProviderInfo?,
+    /** Any additional extras returned by provider chooser. */
+    public val extras: Bundle,
+) {
+    override fun toString(): String =
+        "$complicationId,$complicationProviderInfo,${extras.asString()}"
+}
+
 // Helps inject mock ProviderInfoRetrievers for testing.
 internal interface ProviderInfoRetrieverProvider {
     fun getProviderInfoRetriever(): ProviderInfoRetriever
@@ -290,8 +329,10 @@
         EditorService.globalEditorService.addCloseCallback(closeCallback)
     }
 
-    // This is completed when [fetchComplicationPreviewData] has called [getPreviewData] for
-    // each complication and each of those have been completed.
+    /**
+     * This is completed when [fetchComplicationsData] has called [getPreviewData] for each
+     * complication and each of those have been completed.
+     */
     private val deferredComplicationPreviewDataMap =
         CompletableDeferred<MutableMap<Int, ComplicationData>>()
 
@@ -299,35 +340,62 @@
         return deferredComplicationPreviewDataMap.await()
     }
 
-    // Pending result for [launchComplicationProviderChooser].
-    internal var pendingComplicationProviderChooserResult: CompletableDeferred<Boolean>? = null
+    // This is completed when [fetchProviderInfo] has called [getProviderInfo] for each
+    // complication and each of those have been completed.
+    private val deferredComplicationsProviderInfoMap =
+        CompletableDeferred<MutableMap<Int, ComplicationProviderInfo?>>()
 
-    // The id of the complication being configured due to [launchComplicationProviderChooser].
+    override suspend fun getComplicationsProviderInfo(): Map<Int, ComplicationProviderInfo?> =
+        deferredComplicationsProviderInfoMap.await()
+
+    /** Pending result for [openComplicationProviderChooser]. */
+    internal var pendingComplicationProviderChooserResult:
+        CompletableDeferred<ChosenComplicationProvider?>? = null
+
+    /** The id of the complication being configured due to [openComplicationProviderChooser]. */
     private var pendingComplicationProviderId: Int = -1
 
     private val chooseComplicationProvider =
         activity.registerForActivityResult(ComplicationProviderChooserContract()) {
-            updatePreviewData(it)
+            onComplicationProviderChooserResult(it)
         }
 
-    internal fun updatePreviewData(
-        complicationProviderChooserResult: ComplicationProviderChooserResult
+    internal fun onComplicationProviderChooserResult(
+        complicationProviderChooserResult: ComplicationProviderChooserResult?
     ) {
+        // Check if the user cancelled the provider chooser.
+        if (complicationProviderChooserResult == null) {
+            pendingComplicationProviderChooserResult!!.complete(null)
+            pendingComplicationProviderChooserResult = null
+            return
+        }
         val providerInfoRetriever =
             providerInfoRetrieverProvider.getProviderInfoRetriever()
-        coroutineScope.launchWithTracing("BaseEditorSession.updatePreviewData") {
+        coroutineScope.launchWithTracing(
+            "BaseEditorSession.onComplicationProviderChooserResult"
+        ) {
             try {
+                val complicationsProviderInfoMap = deferredComplicationsProviderInfoMap.await()
+                complicationsProviderInfoMap[pendingComplicationProviderId] =
+                    complicationProviderChooserResult.providerInfo
                 val previewData = getPreviewData(
                     providerInfoRetriever,
                     complicationProviderChooserResult.providerInfo
                 )
                 val complicationPreviewDataMap = deferredComplicationPreviewDataMap.await()
                 if (previewData == null) {
-                    complicationPreviewDataMap.remove(pendingComplicationProviderId)
+                    complicationPreviewDataMap[pendingComplicationProviderId] =
+                        EmptyComplicationData()
                 } else {
                     complicationPreviewDataMap[pendingComplicationProviderId] = previewData
                 }
-                pendingComplicationProviderChooserResult!!.complete(true)
+                pendingComplicationProviderChooserResult!!.complete(
+                    ChosenComplicationProvider(
+                        pendingComplicationProviderId,
+                        complicationProviderChooserResult.providerInfo,
+                        complicationProviderChooserResult.extras,
+                    )
+                )
                 pendingComplicationProviderChooserResult = null
             } finally {
                 // This gets called after the above coroutine has finished.
@@ -338,17 +406,25 @@
 
     override suspend fun openComplicationProviderChooser(
         complicationId: Int
-    ): Boolean = TraceEvent(
+    ): ChosenComplicationProvider? = TraceEvent(
         "BaseEditorSession.launchComplicationProviderChooser $complicationId"
     ).use {
         requireNotClosed()
         require(!complicationsState[complicationId]!!.fixedComplicationProvider) {
             "Can't configure fixed complication ID $complicationId"
         }
-        pendingComplicationProviderChooserResult = CompletableDeferred<Boolean>()
+        // If there's a previous openComplicationProviderChooser invocation in flight then wait for
+        // it to complete.
+        pendingComplicationProviderChooserResult?.await()
+
+        pendingComplicationProviderChooserResult = CompletableDeferred()
         pendingComplicationProviderId = complicationId
         chooseComplicationProvider.launch(
-            ComplicationProviderChooserRequest(this, complicationId, watchFaceId.id)
+            ComplicationProviderChooserRequest(
+                this,
+                complicationId,
+                watchFaceId.id
+            )
         )
         return pendingComplicationProviderChooserResult!!.await()
     }
@@ -389,11 +465,11 @@
             return null
         }
         // Fetch preview ComplicationData if possible.
-        return providerInfo.providerComponentName?.let {
+        providerInfo.componentName?.let {
             try {
                 providerInfoRetriever.retrievePreviewComplicationData(
                     it,
-                    ComplicationType.fromWireType(providerInfo.complicationType)
+                    providerInfo.type
                 )
             } catch (e: Exception) {
                 // Something went wrong, so use fallback preview data.
@@ -404,25 +480,17 @@
 
     private fun makeFallbackPreviewData(
         providerInfo: ComplicationProviderInfo
-    ) = when {
-        providerInfo.providerName == null -> null
+    ) =
+        ShortTextComplicationData.Builder(
+            PlainComplicationText.Builder(providerInfo.name).build(),
+            ComplicationText.EMPTY
+        ).setMonochromaticImage(
+            MonochromaticImage.Builder(providerInfo.icon).build()
+        ).build()
 
-        providerInfo.providerIcon == null ->
-            LongTextComplicationData.Builder(
-                PlainComplicationText.Builder(providerInfo.providerName!!).build()
-            ).build()
-
-        else ->
-            ShortTextComplicationData.Builder(
-                PlainComplicationText.Builder(providerInfo.providerName!!).build()
-            ).setMonochromaticImage(
-                MonochromaticImage.Builder(providerInfo.providerIcon!!).build()
-            ).build()
-    }
-
-    protected fun fetchComplicationPreviewData() {
+    protected fun fetchComplicationsData() {
         val providerInfoRetriever = providerInfoRetrieverProvider.getProviderInfoRetriever()
-        coroutineScope.launchWithTracing("BaseEditorSession.fetchComplicationPreviewData") {
+        coroutineScope.launchWithTracing("BaseEditorSession.fetchComplicationsData") {
             try {
                 // Unlikely but WCS could conceivably crash during this call. We could retry but it's
                 // not obvious if that'd succeed or if WCS session state is recoverable, it's probably
@@ -431,17 +499,23 @@
                     watchFaceComponentName,
                     complicationsState.keys.toIntArray()
                 )
+                deferredComplicationsProviderInfoMap.complete(
+                    extractComplicationsProviderInfoMap(providerInfoArray)?.toMutableMap()
+                        ?: mutableMapOf()
+                )
                 deferredComplicationPreviewDataMap.complete(
                     // Parallel fetch preview ComplicationData.
                     providerInfoArray?.associateBy(
                         { it.watchFaceComplicationId },
-                        { async { getPreviewData(providerInfoRetriever, it.info) } }
+                        {
+                            async {
+                                getPreviewData(providerInfoRetriever, it.info)
+                            }
+                        }
                         // Coerce to a Map<Int, ComplicationData> omitting null values.
                         // If mapNotNullValues existed we would use it here.
-                    )?.filterValues {
-                        it.await() != null
-                    }?.mapValues {
-                        it.value.await()!!
+                    )?.mapValues {
+                        it.value.await() ?: EmptyComplicationData()
                     }?.toMutableMap() ?: mutableMapOf()
                 )
             } finally {
@@ -568,6 +642,9 @@
         idToComplicationData: Map<Int, ComplicationData>?
     ): Bitmap {
         requireNotClosed()
+        require(renderParameters.drawMode == DrawMode.INTERACTIVE) {
+            "Currently only DrawMode.INTERACTIVE is supported"
+        }
         return editorDelegate.renderWatchFaceToBitmap(
             renderParameters,
             calendarTimeMillis,
@@ -597,7 +674,7 @@
                 UserStyle(initialEditorUserStyle, editorDelegate.userStyleSchema)
         }
 
-        fetchComplicationPreviewData()
+        fetchComplicationsData()
     }
 }
 
@@ -638,7 +715,7 @@
     }
 
     init {
-        fetchComplicationPreviewData()
+        fetchComplicationsData()
     }
 }
 
@@ -649,16 +726,27 @@
 )
 
 internal class ComplicationProviderChooserResult(
-    /** The updated [ComplicationProviderInfo] or `null` if the operation was canceled. */
-    internal val providerInfo: ComplicationProviderInfo?
+    /** The updated [ComplicationProviderInfo] or `null` if the empty provider was chosen. */
+    internal val providerInfo: ComplicationProviderInfo?,
+    /** Any additional extras returned by provider chooser. */
+    internal val extras: Bundle,
 )
 
-/** An [ActivityResultContract] for invoking the complication provider chooser. */
+/**
+ * An [ActivityResultContract] for invoking the complication provider chooser. If the user
+ * cancels the provider chooser than the result will be `null`.
+ */
 internal class ComplicationProviderChooserContract : ActivityResultContract<
-    ComplicationProviderChooserRequest, ComplicationProviderChooserResult>() {
+    ComplicationProviderChooserRequest, ComplicationProviderChooserResult?>() {
 
     internal companion object {
         const val EXTRA_PROVIDER_INFO = "android.support.wearable.complications.EXTRA_PROVIDER_INFO"
+
+        /**
+         * Whether to invoke a test activity instead of the [ComplicationHelperActivity].
+         *
+         * To be used in tests.
+         */
         internal var useTestComplicationHelperActivity = false
     }
 
@@ -683,7 +771,29 @@
         return intent
     }
 
-    override fun parseResult(resultCode: Int, intent: Intent?): ComplicationProviderChooserResult {
-        return ComplicationProviderChooserResult(intent?.getParcelableExtra(EXTRA_PROVIDER_INFO))
+    override fun parseResult(resultCode: Int, intent: Intent?) = intent?.let {
+        val extras = intent.extras?.let {
+            Bundle(it).apply { remove(EXTRA_PROVIDER_INFO) }
+        } ?: Bundle.EMPTY
+        ComplicationProviderChooserResult(
+            it.getParcelableExtra<android.support.wearable.complications.ComplicationProviderInfo>(
+                EXTRA_PROVIDER_INFO
+            )?.toApiComplicationProviderInfo(),
+            extras
+        )
     }
 }
+
+/**
+ * Extracts a map from complication ID to the corresponding [ComplicationProviderInfo] from the
+ * given array of [ProviderInfoRetriever.ProviderInfo].
+ */
+internal fun extractComplicationsProviderInfoMap(
+    providerInfoArray: Array<ProviderInfoRetriever.ProviderInfo>?
+): Map<Int, ComplicationProviderInfo?>? =
+    providerInfoArray?.associateBy(
+        { it.watchFaceComplicationId },
+        { it.info }
+    )
+
+internal fun Bundle.asString() = keySet().map { "$it: ${get(it)}" }
diff --git a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
index f09e23c..9408e35 100644
--- a/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
+++ b/wear/wear-watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
@@ -43,10 +43,10 @@
  * @param watchFaceComponentName The [ComponentName] of the watch face being edited.
  * @param editorPackageName The package name of the watch face editor APK.
  * @param initialUserStyle The initial [UserStyle] stored as a [UserStyleData] or `null`. Only
- *     required for a headless [EditorSession].
- * @param watchFaceId Unique ID for the instance of the watch face being edited, only
- *     defined for Android R and beyond, it's `null` on Android P and earlier. Note each distinct
- *     [ComponentName] can have multiple instances.
+ * required for a headless [EditorSession].
+ * @param watchFaceId Unique ID for the instance of the watch face being edited, only defined for
+ * Android R and beyond, it's `null` on Android P and earlier. Note each distinct [ComponentName]
+ * can have multiple instances.
  */
 public class EditorRequest @RequiresApi(Build.VERSION_CODES.R) constructor(
     public val watchFaceComponentName: ComponentName,
@@ -63,7 +63,7 @@
      * @param watchFaceComponentName The [ComponentName] of the watch face being edited.
      * @param editorPackageName The package name of the watch face editor APK.
      * @param initialUserStyle The initial [UserStyle] stored as a [UserStyleData] or `null`. Only
-     *     required for a headless [EditorSession].
+     * required for a headless [EditorSession].
      * [EditorSession].
      */
     @SuppressLint("NewApi")
diff --git a/wear/wear-watchface-style/api/current.txt b/wear/wear-watchface-style/api/current.txt
index ff75d4a..c3bd688 100644
--- a/wear/wear-watchface-style/api/current.txt
+++ b/wear/wear-watchface-style/api/current.txt
@@ -16,12 +16,6 @@
     method @UiThread public void onUserStyleChanged(androidx.wear.watchface.style.UserStyle userStyle);
   }
 
-  public enum Layer {
-    enum_constant public static final androidx.wear.watchface.style.Layer BASE;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS_OVERLAY;
-  }
-
   public final class 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.UserStyle userStyle);
@@ -45,7 +39,7 @@
   }
 
   public abstract sealed class UserStyleSetting {
-    method public final java.util.Collection<androidx.wear.watchface.style.Layer> getAffectedLayers();
+    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();
@@ -54,7 +48,7 @@
     method public final androidx.wear.watchface.style.UserStyleSetting.Id getId();
     method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(byte[] optionId);
     method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
-    property public final java.util.Collection<androidx.wear.watchface.style.Layer> affectedLayers;
+    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;
@@ -66,7 +60,7 @@
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, boolean defaultValue);
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue);
     method public boolean getDefaultValue();
   }
 
@@ -80,15 +74,17 @@
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers);
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
     method public androidx.wear.complications.ComplicationBounds? getComplicationBounds();
     method public int getComplicationId();
     method public Boolean? isEnabled();
+    property public final Integer? accessibilityTraversalIndex;
     property public final androidx.wear.complications.ComplicationBounds? complicationBounds;
     property public final int complicationId;
     property public final Boolean? enabled;
@@ -97,6 +93,7 @@
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder(int complicationId);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setComplicationBounds(androidx.wear.complications.ComplicationBounds complicationBounds);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setEnabled(boolean enabled);
   }
@@ -112,7 +109,7 @@
   }
 
   public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, byte[] defaultValue);
+    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 {
@@ -122,7 +119,7 @@
   }
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, double defaultValue);
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -149,8 +146,8 @@
   }
 
   public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
   }
 
   public static final class UserStyleSetting.ListUserStyleSetting.ListOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
@@ -162,7 +159,7 @@
   }
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, long defaultValue);
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -199,5 +196,16 @@
   public static final class UserStyleSetting.Option.Id.Companion {
   }
 
+  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/wear-watchface-style/api/public_plus_experimental_current.txt b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
index 7bc6a09..52c0c01 100644
--- a/wear/wear-watchface-style/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface-style/api/public_plus_experimental_current.txt
@@ -16,12 +16,6 @@
     method @UiThread public void onUserStyleChanged(androidx.wear.watchface.style.UserStyle userStyle);
   }
 
-  public enum Layer {
-    enum_constant public static final androidx.wear.watchface.style.Layer BASE;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS_OVERLAY;
-  }
-
   public final class 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.UserStyle userStyle);
@@ -45,7 +39,7 @@
   }
 
   public abstract sealed class UserStyleSetting {
-    method public final java.util.Collection<androidx.wear.watchface.style.Layer> getAffectedLayers();
+    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();
@@ -54,7 +48,7 @@
     method public final androidx.wear.watchface.style.UserStyleSetting.Id getId();
     method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(byte[] optionId);
     method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
-    property public final java.util.Collection<androidx.wear.watchface.style.Layer> affectedLayers;
+    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;
@@ -66,7 +60,7 @@
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, boolean defaultValue);
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
   }
@@ -82,16 +76,18 @@
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
     method public androidx.wear.complications.ComplicationBounds? getComplicationBounds();
     method public int getComplicationId();
     method public Boolean? isEnabled();
+    property public final Integer? accessibilityTraversalIndex;
     property public final androidx.wear.complications.ComplicationBounds? complicationBounds;
     property public final int complicationId;
     property public final Boolean? enabled;
@@ -100,6 +96,7 @@
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder(int complicationId);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setComplicationBounds(androidx.wear.complications.ComplicationBounds complicationBounds);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setEnabled(boolean enabled);
   }
@@ -116,7 +113,7 @@
   }
 
   public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, byte[] defaultValue);
+    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();
   }
 
@@ -128,7 +125,7 @@
   }
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, double defaultValue);
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -157,8 +154,8 @@
   }
 
   public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListUserStyleSettingWireFormat toWireFormat();
   }
 
@@ -172,7 +169,7 @@
   }
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, long defaultValue);
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -211,5 +208,16 @@
   public static final class UserStyleSetting.Option.Id.Companion {
   }
 
+  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/wear-watchface-style/api/restricted_current.txt b/wear/wear-watchface-style/api/restricted_current.txt
index 707ed6a..95674c6 100644
--- a/wear/wear-watchface-style/api/restricted_current.txt
+++ b/wear/wear-watchface-style/api/restricted_current.txt
@@ -16,12 +16,6 @@
     method @UiThread public void onUserStyleChanged(androidx.wear.watchface.style.UserStyle userStyle);
   }
 
-  public enum Layer {
-    enum_constant public static final androidx.wear.watchface.style.Layer BASE;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS;
-    enum_constant public static final androidx.wear.watchface.style.Layer COMPLICATIONS_OVERLAY;
-  }
-
   public final class 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.UserStyle userStyle);
@@ -50,7 +44,7 @@
   }
 
   public abstract sealed class UserStyleSetting {
-    method public final java.util.Collection<androidx.wear.watchface.style.Layer> getAffectedLayers();
+    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();
@@ -61,7 +55,7 @@
     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.Layer> affectedLayers;
+    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;
@@ -73,7 +67,7 @@
   }
 
   public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, boolean defaultValue);
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
   }
@@ -89,16 +83,18 @@
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption defaultOption);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
   }
 
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay {
-    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds);
+    ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay(int complicationId, optional Boolean? enabled, optional androidx.wear.complications.ComplicationBounds? complicationBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
     method public androidx.wear.complications.ComplicationBounds? getComplicationBounds();
     method public int getComplicationId();
     method public Boolean? isEnabled();
+    property public final Integer? accessibilityTraversalIndex;
     property public final androidx.wear.complications.ComplicationBounds? complicationBounds;
     property public final int complicationId;
     property public final Boolean? enabled;
@@ -107,6 +103,7 @@
   public static final class UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder {
     ctor public UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder(int complicationId);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setComplicationBounds(androidx.wear.complications.ComplicationBounds complicationBounds);
     method public androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay.Builder setEnabled(boolean enabled);
   }
@@ -123,7 +120,7 @@
   }
 
   public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, byte[] defaultValue);
+    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();
   }
 
@@ -135,7 +132,7 @@
   }
 
   public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, double defaultValue);
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -164,8 +161,8 @@
   }
 
   public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
-    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListUserStyleSettingWireFormat toWireFormat();
   }
 
@@ -179,7 +176,7 @@
   }
 
   public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
-    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.Layer> affectsLayers, long defaultValue);
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, CharSequence displayName, CharSequence description, 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();
@@ -220,5 +217,16 @@
   public static final class UserStyleSetting.Option.Id.Companion {
   }
 
+  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/wear-watchface-style/lint-baseline.xml b/wear/wear-watchface-style/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface-style/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
index 8f78541..80387b8 100644
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/CurrentUserStyleRepository.kt
@@ -46,8 +46,8 @@
      * settings default option.
      *
      * @param userStyle The [UserStyle] represented as a [UserStyleData].
-     * @param styleSchema The  for this UserStyle, describes how we interpret
-     *     [userStyle].
+     * @param styleSchema The [UserStyleSchema] for this UserStyle, describes how we interpret
+     * [userStyle].
      */
     public constructor(
         userStyle: UserStyleData,
@@ -141,27 +141,40 @@
 /**
  * Describes the list of [UserStyleSetting]s the user can configure.
  *
- * @param userStyleSettings The user configurable style categories associated with this watch
- *     face. Empty if the watch face doesn't support user styling.
+ * @param userStyleSettings The user configurable style categories associated with this watch face.
+ * Empty if the watch face doesn't support user styling. Note we allow at most one
+ * [UserStyleSetting.ComplicationsUserStyleSetting] and one
+ * [UserStyleSetting.CustomValueUserStyleSetting]
+ * in the list.
  */
 public class UserStyleSchema(
     public val userStyleSettings: List<UserStyleSetting>
 ) {
     init {
+        var complicationsUserStyleSettingCount = 0
         var customValueUserStyleSettingCount = 0
         for (setting in userStyleSettings) {
-            if (setting is UserStyleSetting.CustomValueUserStyleSetting) {
-                customValueUserStyleSettingCount++
+            when (setting) {
+                is UserStyleSetting.ComplicationsUserStyleSetting ->
+                    complicationsUserStyleSettingCount++
+
+                is UserStyleSetting.CustomValueUserStyleSetting ->
+                    customValueUserStyleSettingCount++
             }
         }
 
+        // This requirement makes it easier to implement companion editors.
+        require(complicationsUserStyleSettingCount <= 1) {
+            "At most only one ComplicationsUserStyleSetting is allowed"
+        }
+
         // There's a hard limit to how big Schema + UserStyle can be and since this data is sent
         // over bluetooth to the companion there will be performance issues well before we hit
         // that the limit. As a result we want the total size of custom data to be kept small and
         // we are initially restricting there to be at most one CustomValueUserStyleSetting.
-        require(
-            customValueUserStyleSettingCount <= 1
-        ) { "At most only one CustomValueUserStyleSetting is allowed" }
+        require(customValueUserStyleSettingCount <= 1) {
+            "At most only one CustomValueUserStyleSetting is allowed"
+        }
     }
 
     /** @hide */
@@ -184,7 +197,7 @@
  * [UserStyleSchema].
  *
  * @param schema The [UserStyleSchema] for this CurrentUserStyleRepository which describes the
- *     available style categories.
+ * available style categories.
  */
 public class CurrentUserStyleRepository(
     public val schema: UserStyleSchema
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/Layer.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/Layer.kt
deleted file mode 100644
index 6e378ed..0000000
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/Layer.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface.style
-
-/** Describes part of watchface. Used as a parameter for rendering. */
-public enum class Layer {
-    /** The watch excluding complications and anything that may render on top of complications. */
-    BASE,
-
-    /** The watch face complications. */
-    COMPLICATIONS,
-
-    /** Anything that may render on top of complications, e.g. watch hands. */
-    COMPLICATIONS_OVERLAY
-}
\ No newline at end of file
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
index edaa98f..d3169ac 100644
--- a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/UserStyleSetting.kt
@@ -19,8 +19,10 @@
 import android.graphics.drawable.Icon
 import androidx.annotation.RestrictTo
 import androidx.wear.complications.ComplicationBounds
+import androidx.wear.complications.data.ComplicationType
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationsOption
+import androidx.wear.watchface.style.UserStyleSetting.Id.Companion.MAX_LENGTH
 import androidx.wear.watchface.style.data.BooleanOptionWireFormat
 import androidx.wear.watchface.style.data.BooleanUserStyleSettingWireFormat
 import androidx.wear.watchface.style.data.ComplicationOverlayWireFormat
@@ -51,20 +53,19 @@
  * as a result the size of serialized UserStyleSettings could become an issue if large.
  *
  * @param id Identifier for the element, must be unique. Styling data gets shared with the companion
- *     (typically via bluetooth) so size is a consideration and short ids are encouraged. There is a
- *     maximum length see [maxIdLength].
+ * (typically via bluetooth) so size is a consideration and short ids are encouraged. There is a
+ * maximum length see [MAX_LENGTH].
  * @param displayName Localized human readable name for the element, used in the userStyle selection
- *     UI.
+ * UI.
  * @param description Localized description string displayed under the displayName.
  * @param icon Icon for use in the style selection UI.
  * @param options List of options for this UserStyleSetting. Depending on the type of
- *     UserStyleSetting this may be an exhaustive list, or just examples to populate a ListView
- *     in case the UserStyleSetting isn't supported by the UI (e.g. a new WatchFace with an old
- *     Companion).
+ * UserStyleSetting this may be an exhaustive list, or just examples to populate a ListView in case
+ * the UserStyleSetting isn't supported by the UI (e.g. a new WatchFace with an old Companion).
  * @param defaultOptionIndex The default option index, used if nothing has been selected within the
- *     [options] list.
- * @param affectedLayers Used by the style configuration UI. Describes which rendering layers this
- *     style affects.
+ * [options] list.
+ * @param affectedWatchFaceLayers Used by the style configuration UI. Describes which rendering
+ * layers this style affects.
  */
 public sealed class UserStyleSetting(
     public val id: Id,
@@ -73,7 +74,7 @@
     public val icon: Icon?,
     public val options: List<Option>,
     public val defaultOptionIndex: Int,
-    public val affectedLayers: Collection<Layer>
+    public val affectedWatchFaceLayers: Collection<WatchFaceLayer>
 ) {
     /**
      * Machine readable identifier for [UserStyleSetting]s. The length of this identifier may not
@@ -93,6 +94,21 @@
         }
 
         override fun toString(): String = value
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (javaClass != other?.javaClass) return false
+
+            other as Id
+
+            if (value != other.value) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            return value.hashCode()
+        }
     }
 
     public companion object {
@@ -138,7 +154,7 @@
         wireFormat.mIcon,
         wireFormat.mOptions.map { Option.createFromWireFormat(it) },
         wireFormat.mDefaultOptionIndex,
-        wireFormat.mAffectsLayers.map { Layer.values()[it] }
+        wireFormat.mAffectsLayers.map { WatchFaceLayer.values()[it] }
     )
 
     /** @hide */
@@ -247,10 +263,10 @@
      * categories that can't sensibly be fully enumerated (e.g. a full 24-bit color picker).
      *
      * @param optionId The ID of the option
-     * @return An [Option] corresponding to the name. This could either be one of the
-     *     options from userStyleSettings or a newly constructed Option depending on the nature
-     *     of the UserStyleSetting. If optionName is unrecognized then the default value for the
-     *     setting should be returned.
+     * @return An [Option] corresponding to the name. This could either be one of the options from
+     * [UserStyleSetting]s or a newly constructed Option depending on the nature of the
+     * UserStyleSetting. If optionName is unrecognized then the default value for the setting should
+     * be returned.
      */
     public open fun getOptionForId(optionId: ByteArray): Option =
         options.find { it.id.value.contentEquals(optionId) } ?: options[defaultOptionIndex]
@@ -263,11 +279,11 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param displayName Localized human readable name for the element, used in the userStyle
-         *     selection UI.
+         * selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the userStyle selection UI.
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering
-         *     layers this style affects.
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects.
          * @param defaultValue The default value for this BooleanUserStyleSetting.
          */
         public constructor (
@@ -275,7 +291,7 @@
             displayName: CharSequence,
             description: CharSequence,
             icon: Icon?,
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultValue: Boolean
         ) : super(
             id,
@@ -287,7 +303,7 @@
                 true -> 0
                 false -> 1
             },
-            affectsLayers
+            affectsWatchFaceLayers
         )
 
         internal constructor(wireFormat: BooleanUserStyleSettingWireFormat) : super(wireFormat)
@@ -302,7 +318,7 @@
                 icon,
                 getWireFormatOptionsList(),
                 defaultOptionIndex,
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /** Returns the default value. */
@@ -343,7 +359,8 @@
      * The ComplicationsManager listens for style changes with this setting and when a
      * [ComplicationsOption] is selected the overrides are automatically applied. Note its suggested
      * that the default [ComplicationOverlay] (the first entry in the list) does not apply any
-     * overrides.
+     * overrides. Only a single [ComplicationsUserStyleSetting] is permitted in the
+     * [UserStyleSchema].
      *
      * Not to be confused with complication provider selection.
      */
@@ -355,15 +372,21 @@
          *
          * @param complicationId The [Id] of the complication to configure.
          * @param enabled If non null, whether the complication should be enabled for this
-         *     configuration. If null then no changes are made.
-         * @param complicationBounds If non null, the new [ComplicationBounds] for this
-         *     configuration. If null then no changes are made.
+         * configuration. If null then no changes are made.
+         * @param complicationBounds If non null, the [ComplicationBounds] for this
+         * configuration. If null then no changes are made.
+         * @param accessibilityTraversalIndex If non null the accessibility traversal index
+         * for this configuration. This is used to determine the order in which accessibility labels
+         * for the watch face are read to the user.
          */
         public class ComplicationOverlay constructor(
             public val complicationId: Int,
             @get:JvmName("isEnabled")
             public val enabled: Boolean? = null,
-            public val complicationBounds: ComplicationBounds? = null
+            public val complicationBounds: ComplicationBounds? = null,
+            @SuppressWarnings("AutoBoxing")
+            @get:SuppressWarnings("AutoBoxing")
+            public val accessibilityTraversalIndex: Int? = null
         ) {
             public class Builder(
                 /** The id of the complication to configure. */
@@ -371,6 +394,7 @@
             ) {
                 private var enabled: Boolean? = null
                 private var complicationBounds: ComplicationBounds? = null
+                private var accessibilityTraversalIndex: Int? = null
 
                 /** Overrides the complication's enabled flag. */
                 public fun setEnabled(enabled: Boolean): Builder = apply {
@@ -383,11 +407,23 @@
                         this.complicationBounds = complicationBounds
                     }
 
+                /**
+                 * Overrides the complication's accessibility traversal index. This is used to sort
+                 * [androidx.wear.watchface.ContentDescriptionLabel]s. If unset we will order the
+                 * complications by their initial accessibilityTraversalIndex (usually the same
+                 * as their id).
+                 */
+                public fun setAccessibilityTraversalIndex(accessibilityTraversalIndex: Int):
+                    Builder = apply {
+                        this.accessibilityTraversalIndex = accessibilityTraversalIndex
+                    }
+
                 public fun build(): ComplicationOverlay =
                     ComplicationOverlay(
                         complicationId,
                         enabled,
-                        complicationBounds
+                        complicationBounds,
+                        accessibilityTraversalIndex
                     )
             }
 
@@ -403,14 +439,22 @@
                         "Unrecognised wireFormat.mEnabled " + wireFormat.mEnabled
                     )
                 },
-                wireFormat.mPerComplicationTypeBounds?.let { ComplicationBounds(it) }
+                wireFormat.mPerComplicationTypeBounds?.let {
+                    ComplicationBounds(
+                        it.mapKeys { ComplicationType.fromWireType(it.key) }
+                    )
+                },
+                wireFormat.accessibilityTraversalIndex
             )
 
             internal fun toWireFormat() =
                 ComplicationOverlayWireFormat(
                     complicationId,
                     enabled,
-                    complicationBounds?.perComplicationTypeBounds
+                    complicationBounds?.perComplicationTypeBounds?.mapKeys {
+                        it.key.toWireComplicationType()
+                    },
+                    accessibilityTraversalIndex
                 )
         }
 
@@ -419,14 +463,15 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param displayName Localized human readable name for the element, used in the userStyle
-         *     selection UI.
+         * selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the userStyle selection UI.
          * @param complicationConfig The configuration for affected complications.
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering layers
-         *     this style affects, must include [Layer.COMPLICATIONS].
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects, must include
+         * [WatchFaceLayer.COMPLICATIONS].
          * @param defaultOption The default option, used when data isn't persisted. Optional
-         *     parameter which defaults to the first element of [complicationConfig].
+         * parameter which defaults to the first element of [complicationConfig].
          */
         @JvmOverloads
         public constructor (
@@ -435,7 +480,7 @@
             description: CharSequence,
             icon: Icon?,
             complicationConfig: List<ComplicationsOption>,
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultOption: ComplicationsOption = complicationConfig.first()
         ) : super(
             id,
@@ -444,9 +489,9 @@
             icon,
             complicationConfig,
             complicationConfig.indexOf(defaultOption),
-            affectsLayers
+            affectsWatchFaceLayers
         ) {
-            require(affectsLayers.contains(Layer.COMPLICATIONS))
+            require(affectsWatchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS))
         }
 
         internal constructor(
@@ -463,7 +508,7 @@
                 icon,
                 getWireFormatOptionsList(),
                 defaultOptionIndex,
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /** Represents an override to the initial complication configuration. */
@@ -485,11 +530,11 @@
              *
              * @param id [Id] for the element, must be unique.
              * @param displayName Localized human readable name for the element, used in the
-             *     userStyle selection UI.
+             * userStyle selection UI.
              * @param icon [Icon] for use in the style selection UI.
              * @param complicationOverlays Overlays to be applied when this ComplicationsOption is
-             *     selected. If this is empty then the net result is the initial complication
-             *     configuration.
+             * selected. If this is empty then the net result is the initial complication
+             * configuration.
              */
             public constructor(
                 id: Id,
@@ -556,14 +601,14 @@
          * Constructs a [DoubleRangeUserStyleSetting].
          *
          * @param id [Id] for the element, must be unique.
-         * @param displayName Localized human readable name for the element, used in the
-         *     userStyle selection UI.
+         * @param displayName Localized human readable name for the element, used in the user style
+         * selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the style selection UI.
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering layers
-         *     this style affects.
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects.
          * @param defaultValue The default value for this DoubleRangeUserStyleSetting.
          */
         public constructor (
@@ -573,7 +618,7 @@
             icon: Icon?,
             minimumValue: Double,
             maximumValue: Double,
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultValue: Double
         ) : super(
             id,
@@ -586,7 +631,7 @@
                 minimumValue -> 0
                 else -> 1
             },
-            affectsLayers
+            affectsWatchFaceLayers
         )
 
         internal constructor(wireFormat: DoubleRangeUserStyleSettingWireFormat) : super(wireFormat)
@@ -601,7 +646,7 @@
                 icon,
                 getWireFormatOptionsList(),
                 defaultOptionIndex,
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /** Represents an option as a [Double] in the range [minimumValue .. maximumValue]. */
@@ -672,12 +717,12 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param displayName Localized human readable name for the element, used in the userStyle
-         *     selection UI.
+         * selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the userStyle selection UI.
          * @param options List of all options for this ListUserStyleSetting.
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering layers
-         *     this style affects.
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects.
          * @param defaultOption The default option, used when data isn't persisted.
          */
         @JvmOverloads
@@ -687,7 +732,7 @@
             description: CharSequence,
             icon: Icon?,
             options: List<ListOption>,
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultOption: ListOption = options.first()
         ) : super(
             id,
@@ -696,7 +741,7 @@
             icon,
             options,
             options.indexOf(defaultOption),
-            affectsLayers
+            affectsWatchFaceLayers
         )
 
         internal constructor(wireFormat: ListUserStyleSettingWireFormat) : super(wireFormat)
@@ -711,7 +756,7 @@
                 icon,
                 getWireFormatOptionsList(),
                 defaultOptionIndex,
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /**
@@ -728,9 +773,9 @@
              * Constructs a [ListOption].
              *
              * @param id The [Id] of this [ListOption], must be unique within the
-             *     [ListUserStyleSetting].
+             * [ListUserStyleSetting].
              * @param displayName Localized human readable name for the setting, used in the style
-             *     selection UI.
+             * selection UI.
              * @param icon [Icon] for use in the style selection UI.
              */
             public constructor(id: Id, displayName: CharSequence, icon: Icon?) : super(id) {
@@ -792,13 +837,13 @@
          *
          * @param id [Id] for the element, must be unique.
          * @param displayName Localized human readable name for the element, used in the userStyle
-         *     selection UI.
+         * selection UI.
          * @param description Localized description string displayed under the displayName.
          * @param icon [Icon] for use in the userStyle selection UI.
          * @param minimumValue Minimum value (inclusive).
          * @param maximumValue Maximum value (inclusive).
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering layers
-         *     this style affects.
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects.
          * @param defaultValue The default value for this LongRangeUserStyleSetting.
          */
         public constructor (
@@ -808,7 +853,7 @@
             icon: Icon?,
             minimumValue: Long,
             maximumValue: Long,
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultValue: Long
         ) : super(
             id,
@@ -821,7 +866,7 @@
                 minimumValue -> 0
                 else -> 1
             },
-            affectsLayers
+            affectsWatchFaceLayers
         )
 
         internal constructor(wireFormat: LongRangeUserStyleSettingWireFormat) : super(wireFormat)
@@ -836,7 +881,7 @@
                 icon,
                 getWireFormatOptionsList(),
                 defaultOptionIndex,
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /**
@@ -905,7 +950,8 @@
 
     /**
      * An application specific style setting. This style is ignored by the system editor. This is
-     * expected to be used in conjunction with an on watch face editor.
+     * expected to be used in conjunction with an on watch face editor. Only a single
+     * [ComplicationsUserStyleSetting] is permitted in the [UserStyleSchema].
      */
     public class CustomValueUserStyleSetting : UserStyleSetting {
         internal companion object {
@@ -915,12 +961,12 @@
         /**
          * Constructs a [CustomValueUserStyleSetting].
          *
-         * @param affectsLayers Used by the style configuration UI. Describes which rendering layers
-         *     this style affects.
+         * @param affectsWatchFaceLayers Used by the style configuration UI. Describes which watch
+         * face rendering layers this style affects.
          * @param defaultValue The default value [ByteArray].
          */
         public constructor (
-            affectsLayers: Collection<Layer>,
+            affectsWatchFaceLayers: Collection<WatchFaceLayer>,
             defaultValue: ByteArray
         ) : super(
             Id(CUSTOM_VALUE_USER_STYLE_SETTING_ID),
@@ -929,7 +975,7 @@
             null,
             listOf(CustomValueOption(defaultValue)),
             0,
-            affectsLayers
+            affectsWatchFaceLayers
         )
 
         internal constructor(wireFormat: CustomValueUserStyleSettingWireFormat) : super(wireFormat)
@@ -943,7 +989,7 @@
                 description,
                 icon,
                 getWireFormatOptionsList(),
-                affectedLayers.map { it.ordinal }
+                affectedWatchFaceLayers.map { it.ordinal }
             )
 
         /**
@@ -959,7 +1005,7 @@
              * Constructs a [CustomValueOption].
              *
              * @param customValue The [ByteArray] [id] and value of this [CustomValueOption]. This
-             *     may not exceed [Id.MAX_LENGTH].
+             * may not exceed [Id.MAX_LENGTH].
              */
             public constructor(customValue: ByteArray) : super(Id(customValue))
 
diff --git a/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt
new file mode 100644
index 0000000..9ec2c17
--- /dev/null
+++ b/wear/wear-watchface-style/src/main/java/androidx/wear/watchface/style/WatchFaceLayer.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface.style
+
+/** Describes part of watchface. Used as a parameter for rendering. */
+public enum class WatchFaceLayer {
+    /** The watch excluding complications and anything that may render on top of complications. */
+    BASE,
+
+    /** The watch face complications. */
+    COMPLICATIONS,
+
+    /** Any parts of the watch that may render on top of complications, e.g. watch hands. */
+    COMPLICATIONS_OVERLAY;
+
+    public companion object {
+        /** A [Set] of all [WatchFaceLayer]s. */
+        @JvmField
+        public val ALL_WATCH_FACE_LAYERS: Set<WatchFaceLayer> = values().toSet()
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
index cba47d2..359caeb 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/CurrentUserStyleRepositoryTest.kt
@@ -48,7 +48,7 @@
         "Watchface colorization", /* icon = */
         null,
         colorStyleList,
-        listOf(Layer.BASE)
+        listOf(WatchFaceLayer.BASE)
     )
 
     private val classicStyleOption =
@@ -69,7 +69,7 @@
         "Hand visual look", /* icon = */
         null,
         watchHandStyleList,
-        listOf(Layer.COMPLICATIONS_OVERLAY)
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
     )
     private val watchHandLengthStyleSetting =
         DoubleRangeUserStyleSetting(
@@ -79,7 +79,7 @@
             null,
             0.25,
             1.0,
-            listOf(Layer.COMPLICATIONS_OVERLAY),
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
             0.75
         )
 
@@ -156,7 +156,7 @@
             "Watchface colorization", /* icon = */
             null,
             colorStyleList,
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
         val watchHandStyleSetting2 = ListUserStyleSetting(
             UserStyleSetting.Id("hand_style_setting"),
@@ -164,7 +164,7 @@
             "Hand visual look", /* icon = */
             null,
             watchHandStyleList,
-            listOf(Layer.COMPLICATIONS_OVERLAY)
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
 
         val newStyle = UserStyle(
@@ -244,7 +244,7 @@
     @Test
     public fun userStyle_mapConstructor_customValueUserStyleSetting() {
         val customStyleSetting = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
 
@@ -264,19 +264,42 @@
             userStyleRepository.schema
         )
 
-        val customValue = userStyle.selectedOptions[customStyleSetting]!! as
-            UserStyleSetting.CustomValueUserStyleSetting.CustomValueOption
+        val customValue = userStyle.selectedOptions[customStyleSetting]!! as CustomValueOption
         assertThat(customValue.customValue.decodeToString()).isEqualTo("TEST 123")
     }
 
     @Test
+    public fun userStyle_multiple_ComplicationsUserStyleSetting_notAllowed() {
+        val customStyleSetting1 = CustomValueUserStyleSetting(
+            listOf(WatchFaceLayer.BASE),
+            "default".encodeToByteArray()
+        )
+        val customStyleSetting2 = CustomValueUserStyleSetting(
+            listOf(WatchFaceLayer.BASE),
+            "default".encodeToByteArray()
+        )
+
+        try {
+            UserStyleSchema(
+                listOf(customStyleSetting1, customStyleSetting2)
+            )
+            fail(
+                "Constructing a UserStyleSchema with more than one ComplicationsUserStyleSetting " +
+                    "should fail"
+            )
+        } catch (e: Exception) {
+            // expected
+        }
+    }
+
+    @Test
     public fun userStyle_multiple_CustomValueUserStyleSettings_notAllowed() {
         val customStyleSetting1 = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
         val customStyleSetting2 = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
 
@@ -296,7 +319,7 @@
     @Test
     public fun setAndGetCustomStyleSetting() {
         val customStyleSetting = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
 
@@ -308,8 +331,7 @@
 
         userStyleRepository.userStyle = UserStyle(
             mapOf(
-                customStyleSetting to
-                    CustomValueUserStyleSetting.CustomValueOption("test".encodeToByteArray())
+                customStyleSetting to CustomValueOption("test".encodeToByteArray())
             )
         )
 
@@ -370,9 +392,6 @@
             .isEqualTo("12.3")
         assertThat(LongRangeUserStyleSetting.LongRangeOption(123).toString())
             .isEqualTo("123")
-        assertThat(
-            CustomValueUserStyleSetting.CustomValueOption("test".encodeToByteArray())
-                .toString()
-        ).isEqualTo("test")
+        assertThat(CustomValueOption("test".encodeToByteArray()).toString()).isEqualTo("test")
     }
 }
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
index 3afade1..2a42787 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
@@ -58,7 +58,7 @@
             "description",
             settingIcon,
             listOf(option1, option2, option3),
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
 
         val parcel = Parcel.obtain()
@@ -78,8 +78,8 @@
         assertThat(unparceled.displayName).isEqualTo("displayName")
         assertThat(unparceled.description).isEqualTo("description")
         assertThat(unparceled.icon!!.uri.toString()).isEqualTo("settingIcon")
-        assertThat(unparceled.affectedLayers.size).isEqualTo(1)
-        assertThat(unparceled.affectedLayers.first()).isEqualTo(Layer.BASE)
+        assertThat(unparceled.affectedWatchFaceLayers.size).isEqualTo(1)
+        assertThat(unparceled.affectedWatchFaceLayers.first()).isEqualTo(WatchFaceLayer.BASE)
         val optionArray = unparceled.options.filterIsInstance<ListOption>().toTypedArray()
         assertThat(optionArray.size).isEqualTo(3)
         assertThat(optionArray[0].id.value.decodeToString()).isEqualTo("1")
@@ -124,7 +124,7 @@
             "description1",
             settingIcon1,
             listOf(option1, option2),
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
         val styleSetting2 = ListUserStyleSetting(
             UserStyleSetting.Id("id2"),
@@ -132,18 +132,18 @@
             "description2",
             settingIcon2,
             listOf(option3, option4),
-            listOf(Layer.COMPLICATIONS_OVERLAY)
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
         val styleSetting3 = BooleanUserStyleSetting(
             UserStyleSetting.Id("id3"),
             "displayName3",
             "description3",
             null,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             true
         )
         val styleSetting4 = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
 
@@ -170,8 +170,10 @@
         assertThat(schema.userStyleSettings[0].displayName).isEqualTo("displayName1")
         assertThat(schema.userStyleSettings[0].description).isEqualTo("description1")
         assertThat(schema.userStyleSettings[0].icon!!.uri.toString()).isEqualTo("settingIcon1")
-        assertThat(schema.userStyleSettings[0].affectedLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[0].affectedLayers.first()).isEqualTo(Layer.BASE)
+        assertThat(schema.userStyleSettings[0].affectedWatchFaceLayers.size).isEqualTo(1)
+        assertThat(schema.userStyleSettings[0].affectedWatchFaceLayers.first()).isEqualTo(
+            WatchFaceLayer.BASE
+        )
         val optionArray1 =
             schema.userStyleSettings[0].options.filterIsInstance<ListOption>().toTypedArray()
         assertThat(optionArray1.size).isEqualTo(2)
@@ -187,9 +189,9 @@
         assertThat(schema.userStyleSettings[1].displayName).isEqualTo("displayName2")
         assertThat(schema.userStyleSettings[1].description).isEqualTo("description2")
         assertThat(schema.userStyleSettings[1].icon!!.uri.toString()).isEqualTo("settingIcon2")
-        assertThat(schema.userStyleSettings[1].affectedLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[1].affectedLayers.first()).isEqualTo(
-            Layer.COMPLICATIONS_OVERLAY
+        assertThat(schema.userStyleSettings[1].affectedWatchFaceLayers.size).isEqualTo(1)
+        assertThat(schema.userStyleSettings[1].affectedWatchFaceLayers.first()).isEqualTo(
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
         )
         val optionArray2 =
             schema.userStyleSettings[1].options.filterIsInstance<ListOption>().toTypedArray()
@@ -206,14 +208,18 @@
         assertThat(schema.userStyleSettings[2].displayName).isEqualTo("displayName3")
         assertThat(schema.userStyleSettings[2].description).isEqualTo("description3")
         assertThat(schema.userStyleSettings[2].icon).isEqualTo(null)
-        assertThat(schema.userStyleSettings[2].affectedLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[2].affectedLayers.first()).isEqualTo(Layer.BASE)
+        assertThat(schema.userStyleSettings[2].affectedWatchFaceLayers.size).isEqualTo(1)
+        assertThat(schema.userStyleSettings[2].affectedWatchFaceLayers.first()).isEqualTo(
+            WatchFaceLayer.BASE
+        )
 
         assert(schema.userStyleSettings[3] is CustomValueUserStyleSetting)
         assertThat(schema.userStyleSettings[3].defaultOption.id.value.decodeToString())
             .isEqualTo("default")
-        assertThat(schema.userStyleSettings[3].affectedLayers.size).isEqualTo(1)
-        assertThat(schema.userStyleSettings[3].affectedLayers.first()).isEqualTo(Layer.BASE)
+        assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.size).isEqualTo(1)
+        assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.first()).isEqualTo(
+            WatchFaceLayer.BASE
+        )
     }
 
     @Test
@@ -226,7 +232,7 @@
             "description1",
             settingIcon1,
             listOf(option1, option2),
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
         val styleSetting2 = ListUserStyleSetting(
             UserStyleSetting.Id("id2"),
@@ -234,7 +240,7 @@
             "description2",
             settingIcon2,
             listOf(option3, option4),
-            listOf(Layer.COMPLICATIONS_OVERLAY)
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
         val schema = UserStyleSchema(listOf(styleSetting1, styleSetting2))
         val userStyle = UserStyle(
@@ -267,7 +273,7 @@
             "displayName2",
             "description2",
             null,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             true
         )
         assertTrue(booleanUserStyleSettingDefaultTrue.getDefaultValue())
@@ -277,7 +283,7 @@
             "displayName2",
             "description2",
             null,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             false
         )
         assertFalse(booleanUserStyleSettingDefaultFalse.getDefaultValue())
@@ -292,7 +298,7 @@
             null,
             -1.0,
             1.0,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             -1.0
         )
         assertThat(doubleRangeUserStyleSettingDefaultMin.defaultValue).isEqualTo(-1.0)
@@ -304,7 +310,7 @@
             null,
             -1.0,
             1.0,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             0.5
         )
         assertThat(doubleRangeUserStyleSettingDefaultMid.defaultValue).isEqualTo(0.5)
@@ -316,7 +322,7 @@
             null,
             -1.0,
             1.0,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             1.0
         )
         assertThat(doubleRangeUserStyleSettingDefaultMax.defaultValue).isEqualTo(1.0)
@@ -331,7 +337,7 @@
             null,
             -1,
             10,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             -1,
         )
         assertThat(longRangeUserStyleSettingDefaultMin.defaultValue).isEqualTo(-1)
@@ -343,7 +349,7 @@
             null,
             -1,
             10,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             5
         )
         assertThat(longRangeUserStyleSettingDefaultMid.defaultValue).isEqualTo(5)
@@ -355,7 +361,7 @@
             null,
             -1,
             10,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             10
         )
         assertThat(longRangeUserStyleSettingDefaultMax.defaultValue).isEqualTo(10)
@@ -415,7 +421,7 @@
                     )
                 )
             ),
-            listOf(Layer.COMPLICATIONS)
+            listOf(WatchFaceLayer.COMPLICATIONS)
         )
 
         val parcel = Parcel.obtain()
@@ -469,7 +475,7 @@
             "description1",
             settingIcon1,
             listOf(option1, option2),
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
         val styleSetting2 = ListUserStyleSetting(
             UserStyleSetting.Id("id2"),
@@ -477,18 +483,18 @@
             "description2",
             settingIcon2,
             listOf(option3, option4),
-            listOf(Layer.COMPLICATIONS_OVERLAY)
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
         val styleSetting3 = BooleanUserStyleSetting(
             UserStyleSetting.Id("id3"),
             "displayName3",
             "description3",
             null,
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             true
         )
         val styleSetting4 = CustomValueUserStyleSetting(
-            listOf(Layer.BASE),
+            listOf(WatchFaceLayer.BASE),
             "default".encodeToByteArray()
         )
 
@@ -517,7 +523,7 @@
             "description1",
             settingIcon1,
             listOf(option1, option2),
-            listOf(Layer.BASE)
+            listOf(WatchFaceLayer.BASE)
         )
         val styleSetting2 = ListUserStyleSetting(
             UserStyleSetting.Id("id2"),
@@ -525,7 +531,7 @@
             "description2",
             settingIcon2,
             listOf(option3, option4),
-            listOf(Layer.COMPLICATIONS_OVERLAY)
+            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
         )
         val style = UserStyle(
             mapOf(
diff --git a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
index dbd8114..6d15085 100644
--- a/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
+++ b/wear/wear-watchface-style/src/test/java/androidx/wear/watchface/style/UserStyleSettingTest.kt
@@ -46,7 +46,7 @@
                 null,
                 0.0,
                 1.0,
-                listOf(Layer.BASE),
+                listOf(WatchFaceLayer.BASE),
                 defaultValue
             )
 
@@ -87,7 +87,7 @@
                 null,
                 0.0,
                 1.0,
-                listOf(Layer.BASE),
+                listOf(WatchFaceLayer.BASE),
                 defaultValue
             )
 
diff --git a/wear/wear-watchface/api/current.txt b/wear/wear-watchface/api/current.txt
index 8e97ead..873a982 100644
--- a/wear/wear-watchface/api/current.txt
+++ b/wear/wear-watchface/api/current.txt
@@ -6,33 +6,31 @@
     method public boolean hitTest(androidx.wear.watchface.Complication complication, android.graphics.Rect screenBounds, @Px int x, @Px int y);
   }
 
-  public class CanvasComplicationDrawable {
-    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable _drawable, androidx.wear.watchface.WatchState watchState);
-    method public void drawOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, @ColorInt int color);
-    method public final androidx.wear.complications.data.ComplicationData? getData();
-    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
-    method @UiThread public final boolean isHighlighted();
-    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
-    method @UiThread public final void onAttach(androidx.wear.watchface.Complication complication);
-    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters, int complicationId);
-    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
-    method @UiThread public final void setIsHighlighted(boolean value);
-    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
-    property @UiThread public final boolean isHighlighted;
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public boolean isHighlighted();
+    method public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method @UiThread public void onAttach(androidx.wear.watchface.Complication complication);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public void setIsHighlighted(boolean p);
+    property public abstract boolean isHighlighted;
   }
 
   public final class Complication {
     method public android.graphics.Rect computeBounds(android.graphics.Rect screen);
-    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method @UiThread public androidx.wear.complications.ComplicationBounds getComplicationBounds();
     method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationProviderPolicy getDefaultProviderPolicy();
     method @UiThread public androidx.wear.complications.data.ComplicationType getDefaultProviderType();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getRenderer();
+    method public int getId();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
     method @UiThread public java.util.List<androidx.wear.complications.data.ComplicationType> getSupportedTypes();
     method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
     method public void invalidate();
@@ -41,6 +39,8 @@
     method public boolean isFixedComplicationProvider();
     method public boolean isInitiallyEnabled();
     method @UiThread public void render(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property @UiThread public final androidx.wear.complications.ComplicationBounds complicationBounds;
     property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
@@ -49,8 +49,9 @@
     property @UiThread public final androidx.wear.complications.data.ComplicationType defaultProviderType;
     property @UiThread public final boolean enabled;
     property public final boolean fixedComplicationProvider;
+    property public final int id;
     property public final boolean initiallyEnabled;
-    property public final androidx.wear.watchface.CanvasComplicationDrawable renderer;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
     property @UiThread public final java.util.List<androidx.wear.complications.data.ComplicationType> supportedTypes;
     property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
     field public static final androidx.wear.watchface.Complication.Companion Companion;
@@ -58,6 +59,7 @@
 
   public static final class Complication.Builder {
     method public androidx.wear.watchface.Complication build();
+    method public androidx.wear.watchface.Complication.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.Complication.Builder setConfigExtras(android.os.Bundle extras);
     method public androidx.wear.watchface.Complication.Builder setDefaultProviderType(androidx.wear.complications.data.ComplicationType defaultProviderType);
     method public androidx.wear.watchface.Complication.Builder setEnabled(boolean enabled);
@@ -65,19 +67,9 @@
   }
 
   public static final class Complication.Companion {
-    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
-  }
-
-  public final class ComplicationOutlineRenderer {
-    ctor public ComplicationOutlineRenderer();
-    method public static void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
-    field public static final androidx.wear.watchface.ComplicationOutlineRenderer.Companion Companion;
-  }
-
-  public static final class ComplicationOutlineRenderer.Companion {
-    method public void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
   }
 
   public interface ComplicationTapFilter {
@@ -103,6 +95,17 @@
   public final class ComplicationsManagerKt {
   }
 
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.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.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.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;
@@ -110,22 +113,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class GlesTextureComplication {
-    ctor public GlesTextureComplication(androidx.wear.watchface.CanvasComplicationDrawable canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType, int id);
-    method public void bind();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getCanvasComplication();
-    method public int getId();
-    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
-    property public final androidx.wear.watchface.CanvasComplicationDrawable canvasComplication;
-    property public final int id;
-  }
-
-  public enum LayerMode {
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW;
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW_OUTLINED;
-    enum_constant public static final androidx.wear.watchface.LayerMode HIDE;
-  }
-
   public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
     ctor public MutableObservableWatchData(T? initialValue);
     ctor public MutableObservableWatchData();
@@ -147,26 +134,56 @@
     method public void onChanged(T);
   }
 
+  public final class RenderBufferTextureKt {
+  }
+
   public final class RenderParameters {
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId, @ColorInt int outlineTint);
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId);
+    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 java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> getLayerParameters();
-    method @ColorInt public int getOutlineTint();
-    method public Integer? getSelectedComplicationId();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
     property public final androidx.wear.watchface.DrawMode drawMode;
-    property public final java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> layerParameters;
-    property @ColorInt public final int outlineTint;
-    property public final Integer? selectedComplicationId;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    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;
-    field public static final java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> DRAW_ALL_LAYERS;
   }
 
   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.AllComplications extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplications INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.Complication extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.Complication(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();
@@ -178,8 +195,10 @@
     method @UiThread public void onDestroy();
     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 p);
     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;
@@ -191,25 +210,32 @@
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor 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 abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor 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);
-    ctor 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);
-    ctor 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);
+    ctor @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 @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 @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.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext? getEglContext();
-    method public final android.opengl.EGLDisplay? getEglDisplay();
-    method @UiThread public final void initOpenGlContext();
+    method public final android.opengl.EGLContext getEglContext();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final void makeContextCurrent();
     method @UiThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext? p);
-    method public final void setEglDisplay(android.opengl.EGLDisplay? p);
+    method public final void setEglContext(android.opengl.EGLContext p);
+    method public final void setEglDisplay(android.opengl.EGLDisplay p);
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext? eglContext;
-    property public final android.opengl.EGLDisplay? eglDisplay;
+    property public final android.opengl.EGLContext eglContext;
+    property public final android.opengl.EGLDisplay eglDisplay;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
   }
 
   public final class RendererKt {
@@ -223,16 +249,24 @@
   public final class WatchFace {
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer, optional androidx.wear.watchface.ComplicationsManager complicationsManager);
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer);
+    method public androidx.wear.watchface.ComplicationsManager getComplicationsManager();
     method public androidx.wear.watchface.style.CurrentUserStyleRepository getCurrentUserStyleRepository();
     method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
     method public Long? getOverridePreviewReferenceTimeMillis();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
     method public static boolean isLegacyWatchFaceOverlayStyleSupported();
+    method public void setComplicationsManager(androidx.wear.watchface.ComplicationsManager p);
     method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
     method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceTimeMillis(@IntRange(from=0) long previewReferenceTimeMillis);
     method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int p);
+    property public final androidx.wear.watchface.ComplicationsManager complicationsManager;
     property public final androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository;
     property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
     property public final Long? overridePreviewReferenceTimeMillis;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
     field public static final androidx.wear.watchface.WatchFace.Companion Companion;
   }
 
@@ -254,7 +288,7 @@
   }
 
   public static interface WatchFace.TapListener {
-    method @UiThread public void onTap(int originalTapType, @Px int xPos, @Px int yPos);
+    method @UiThread public void onTap(int tapType, @Px int xPos, @Px int yPos);
   }
 
   public final class WatchFaceKt {
diff --git a/wear/wear-watchface/api/public_plus_experimental_current.txt b/wear/wear-watchface/api/public_plus_experimental_current.txt
index 8e97ead..0da7e85 100644
--- a/wear/wear-watchface/api/public_plus_experimental_current.txt
+++ b/wear/wear-watchface/api/public_plus_experimental_current.txt
@@ -6,33 +6,31 @@
     method public boolean hitTest(androidx.wear.watchface.Complication complication, android.graphics.Rect screenBounds, @Px int x, @Px int y);
   }
 
-  public class CanvasComplicationDrawable {
-    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable _drawable, androidx.wear.watchface.WatchState watchState);
-    method public void drawOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, @ColorInt int color);
-    method public final androidx.wear.complications.data.ComplicationData? getData();
-    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
-    method @UiThread public final boolean isHighlighted();
-    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
-    method @UiThread public final void onAttach(androidx.wear.watchface.Complication complication);
-    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters, int complicationId);
-    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
-    method @UiThread public final void setIsHighlighted(boolean value);
-    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
-    property @UiThread public final boolean isHighlighted;
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, @androidx.wear.watchface.data.ComplicationBoundsType int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public boolean isHighlighted();
+    method public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method @UiThread public void onAttach(androidx.wear.watchface.Complication complication);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public void setIsHighlighted(boolean p);
+    property public abstract boolean isHighlighted;
   }
 
   public final class Complication {
     method public android.graphics.Rect computeBounds(android.graphics.Rect screen);
-    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method @UiThread public androidx.wear.complications.ComplicationBounds getComplicationBounds();
     method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationProviderPolicy getDefaultProviderPolicy();
     method @UiThread public androidx.wear.complications.data.ComplicationType getDefaultProviderType();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getRenderer();
+    method public int getId();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
     method @UiThread public java.util.List<androidx.wear.complications.data.ComplicationType> getSupportedTypes();
     method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
     method public void invalidate();
@@ -41,6 +39,8 @@
     method public boolean isFixedComplicationProvider();
     method public boolean isInitiallyEnabled();
     method @UiThread public void render(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property @UiThread public final androidx.wear.complications.ComplicationBounds complicationBounds;
     property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
@@ -49,8 +49,9 @@
     property @UiThread public final androidx.wear.complications.data.ComplicationType defaultProviderType;
     property @UiThread public final boolean enabled;
     property public final boolean fixedComplicationProvider;
+    property public final int id;
     property public final boolean initiallyEnabled;
-    property public final androidx.wear.watchface.CanvasComplicationDrawable renderer;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
     property @UiThread public final java.util.List<androidx.wear.complications.data.ComplicationType> supportedTypes;
     property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
     field public static final androidx.wear.watchface.Complication.Companion Companion;
@@ -58,6 +59,7 @@
 
   public static final class Complication.Builder {
     method public androidx.wear.watchface.Complication build();
+    method public androidx.wear.watchface.Complication.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.Complication.Builder setConfigExtras(android.os.Bundle extras);
     method public androidx.wear.watchface.Complication.Builder setDefaultProviderType(androidx.wear.complications.data.ComplicationType defaultProviderType);
     method public androidx.wear.watchface.Complication.Builder setEnabled(boolean enabled);
@@ -65,19 +67,9 @@
   }
 
   public static final class Complication.Companion {
-    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
-  }
-
-  public final class ComplicationOutlineRenderer {
-    ctor public ComplicationOutlineRenderer();
-    method public static void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
-    field public static final androidx.wear.watchface.ComplicationOutlineRenderer.Companion Companion;
-  }
-
-  public static final class ComplicationOutlineRenderer.Companion {
-    method public void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
   }
 
   public interface ComplicationTapFilter {
@@ -103,6 +95,17 @@
   public final class ComplicationsManagerKt {
   }
 
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.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.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.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;
@@ -110,22 +113,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class GlesTextureComplication {
-    ctor public GlesTextureComplication(androidx.wear.watchface.CanvasComplicationDrawable canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType, int id);
-    method public void bind();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getCanvasComplication();
-    method public int getId();
-    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
-    property public final androidx.wear.watchface.CanvasComplicationDrawable canvasComplication;
-    property public final int id;
-  }
-
-  public enum LayerMode {
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW;
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW_OUTLINED;
-    enum_constant public static final androidx.wear.watchface.LayerMode HIDE;
-  }
-
   public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
     ctor public MutableObservableWatchData(T? initialValue);
     ctor public MutableObservableWatchData();
@@ -147,26 +134,56 @@
     method public void onChanged(T);
   }
 
+  public final class RenderBufferTextureKt {
+  }
+
   public final class RenderParameters {
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId, @ColorInt int outlineTint);
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId);
+    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 java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> getLayerParameters();
-    method @ColorInt public int getOutlineTint();
-    method public Integer? getSelectedComplicationId();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
     property public final androidx.wear.watchface.DrawMode drawMode;
-    property public final java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> layerParameters;
-    property @ColorInt public final int outlineTint;
-    property public final Integer? selectedComplicationId;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    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;
-    field public static final java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> DRAW_ALL_LAYERS;
   }
 
   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.AllComplications extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplications INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.Complication extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.Complication(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();
@@ -178,8 +195,10 @@
     method @UiThread public void onDestroy();
     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 p);
     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;
@@ -191,25 +210,32 @@
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor 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 abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor 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);
-    ctor 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);
-    ctor 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);
+    ctor @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 @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 @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.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext? getEglContext();
-    method public final android.opengl.EGLDisplay? getEglDisplay();
-    method @UiThread public final void initOpenGlContext();
+    method public final android.opengl.EGLContext getEglContext();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final void makeContextCurrent();
     method @UiThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext? p);
-    method public final void setEglDisplay(android.opengl.EGLDisplay? p);
+    method public final void setEglContext(android.opengl.EGLContext p);
+    method public final void setEglDisplay(android.opengl.EGLDisplay p);
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext? eglContext;
-    property public final android.opengl.EGLDisplay? eglDisplay;
+    property public final android.opengl.EGLContext eglContext;
+    property public final android.opengl.EGLDisplay eglDisplay;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
   }
 
   public final class RendererKt {
@@ -223,16 +249,24 @@
   public final class WatchFace {
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer, optional androidx.wear.watchface.ComplicationsManager complicationsManager);
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer);
+    method public androidx.wear.watchface.ComplicationsManager getComplicationsManager();
     method public androidx.wear.watchface.style.CurrentUserStyleRepository getCurrentUserStyleRepository();
     method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
     method public Long? getOverridePreviewReferenceTimeMillis();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
     method public static boolean isLegacyWatchFaceOverlayStyleSupported();
+    method public void setComplicationsManager(androidx.wear.watchface.ComplicationsManager p);
     method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
     method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceTimeMillis(@IntRange(from=0) long previewReferenceTimeMillis);
     method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int p);
+    property public final androidx.wear.watchface.ComplicationsManager complicationsManager;
     property public final androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository;
     property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
     property public final Long? overridePreviewReferenceTimeMillis;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
     field public static final androidx.wear.watchface.WatchFace.Companion Companion;
   }
 
@@ -254,7 +288,7 @@
   }
 
   public static interface WatchFace.TapListener {
-    method @UiThread public void onTap(int originalTapType, @Px int xPos, @Px int yPos);
+    method @UiThread public void onTap(int tapType, @Px int xPos, @Px int yPos);
   }
 
   public final class WatchFaceKt {
diff --git a/wear/wear-watchface/api/restricted_current.txt b/wear/wear-watchface/api/restricted_current.txt
index 893f2cd..1aa5089 100644
--- a/wear/wear-watchface/api/restricted_current.txt
+++ b/wear/wear-watchface/api/restricted_current.txt
@@ -6,33 +6,31 @@
     method public boolean hitTest(androidx.wear.watchface.Complication complication, android.graphics.Rect screenBounds, @Px int x, @Px int y);
   }
 
-  public class CanvasComplicationDrawable {
-    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable _drawable, androidx.wear.watchface.WatchState watchState);
-    method public void drawOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, @ColorInt int color);
-    method public final androidx.wear.complications.data.ComplicationData? getData();
-    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
-    method @UiThread public final boolean isHighlighted();
-    method @CallSuper public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
-    method @UiThread public final void onAttach(androidx.wear.watchface.Complication complication);
-    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters, int complicationId);
-    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
-    method @UiThread public final void setIsHighlighted(boolean value);
-    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
-    property @UiThread public final boolean isHighlighted;
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, @androidx.wear.watchface.data.ComplicationBoundsType int boundsType, android.icu.util.Calendar calendar, @ColorInt int color);
+    method public androidx.wear.complications.data.ComplicationData? getData();
+    method public boolean isHighlighted();
+    method public void loadData(androidx.wear.complications.data.ComplicationData? complicationData, boolean loadDrawablesAsynchronous);
+    method @UiThread public void onAttach(androidx.wear.watchface.Complication complication);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method public void setIsHighlighted(boolean p);
+    property public abstract boolean isHighlighted;
   }
 
   public final class Complication {
     method public android.graphics.Rect computeBounds(android.graphics.Rect screen);
-    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method public static androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public static androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
     method public int getBoundsType();
     method @UiThread public androidx.wear.complications.ComplicationBounds getComplicationBounds();
     method public androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> getComplicationData();
     method public android.os.Bundle getConfigExtras();
     method @UiThread public androidx.wear.complications.DefaultComplicationProviderPolicy getDefaultProviderPolicy();
     method @UiThread public androidx.wear.complications.data.ComplicationType getDefaultProviderType();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getRenderer();
+    method public int getId();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
     method @UiThread public java.util.List<androidx.wear.complications.data.ComplicationType> getSupportedTypes();
     method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
     method public void invalidate();
@@ -41,6 +39,9 @@
     method public boolean isFixedComplicationProvider();
     method public boolean isInitiallyEnabled();
     method @UiThread public void render(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void scheduleUpdateComplications();
+    property @UiThread public final int accessibilityTraversalIndex;
     property public final int boundsType;
     property @UiThread public final androidx.wear.complications.ComplicationBounds complicationBounds;
     property public final androidx.wear.watchface.ObservableWatchData<androidx.wear.complications.data.ComplicationData> complicationData;
@@ -49,8 +50,9 @@
     property @UiThread public final androidx.wear.complications.data.ComplicationType defaultProviderType;
     property @UiThread public final boolean enabled;
     property public final boolean fixedComplicationProvider;
+    property public final int id;
     property public final boolean initiallyEnabled;
-    property public final androidx.wear.watchface.CanvasComplicationDrawable renderer;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
     property @UiThread public final java.util.List<androidx.wear.complications.data.ComplicationType> supportedTypes;
     property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
     field public static final androidx.wear.watchface.Complication.Companion Companion;
@@ -58,6 +60,7 @@
 
   public static final class Complication.Builder {
     method public androidx.wear.watchface.Complication build();
+    method public androidx.wear.watchface.Complication.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
     method public androidx.wear.watchface.Complication.Builder setConfigExtras(android.os.Bundle extras);
     method public androidx.wear.watchface.Complication.Builder setDefaultProviderType(androidx.wear.complications.data.ComplicationType defaultProviderType);
     method public androidx.wear.watchface.Complication.Builder setEnabled(boolean enabled);
@@ -65,19 +68,9 @@
   }
 
   public static final class Complication.Companion {
-    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
-    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
-    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplicationDrawable renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
-  }
-
-  public final class ComplicationOutlineRenderer {
-    ctor public ComplicationOutlineRenderer();
-    method public static void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
-    field public static final androidx.wear.watchface.ComplicationOutlineRenderer.Companion Companion;
-  }
-
-  public static final class ComplicationOutlineRenderer.Companion {
-    method public void drawComplicationOutline(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+    method public androidx.wear.watchface.Complication.Builder createBackgroundComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy);
+    method public androidx.wear.watchface.Complication.Builder createEdgeComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.Complication.Builder createRoundRectComplicationBuilder(int id, androidx.wear.watchface.CanvasComplication renderer, java.util.List<? extends androidx.wear.complications.data.ComplicationType> supportedTypes, androidx.wear.complications.DefaultComplicationProviderPolicy defaultProviderPolicy, androidx.wear.complications.ComplicationBounds bounds);
   }
 
   public interface ComplicationTapFilter {
@@ -103,6 +96,17 @@
   public final class ComplicationsManagerKt {
   }
 
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.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.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, long dateTimeMillis);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.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;
@@ -110,22 +114,6 @@
     enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
   }
 
-  public final class GlesTextureComplication {
-    ctor public GlesTextureComplication(androidx.wear.watchface.CanvasComplicationDrawable canvasComplication, @Px int textureWidth, @Px int textureHeight, int textureType, int id);
-    method public void bind();
-    method public androidx.wear.watchface.CanvasComplicationDrawable getCanvasComplication();
-    method public int getId();
-    method public void renderToTexture(android.icu.util.Calendar calendar, androidx.wear.watchface.RenderParameters renderParameters);
-    property public final androidx.wear.watchface.CanvasComplicationDrawable canvasComplication;
-    property public final int id;
-  }
-
-  public enum LayerMode {
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW;
-    enum_constant public static final androidx.wear.watchface.LayerMode DRAW_OUTLINED;
-    enum_constant public static final androidx.wear.watchface.LayerMode HIDE;
-  }
-
   public final class MutableObservableWatchData<T> extends androidx.wear.watchface.ObservableWatchData<T> {
     ctor public MutableObservableWatchData(T? initialValue);
     ctor public MutableObservableWatchData();
@@ -178,28 +166,58 @@
     method public void onChanged(T);
   }
 
+  public final class RenderBufferTextureKt {
+  }
+
   public final class RenderParameters {
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId, @ColorInt int outlineTint);
-    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Map<androidx.wear.watchface.style.Layer,? extends androidx.wear.watchface.LayerMode> layerParameters, Integer? selectedComplicationId);
+    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 java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> getLayerParameters();
-    method @ColorInt public int getOutlineTint();
-    method public Integer? getSelectedComplicationId();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    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 java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> layerParameters;
-    property @ColorInt public final int outlineTint;
-    property public final Integer? selectedComplicationId;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    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;
-    field public static final java.util.Map<androidx.wear.watchface.style.Layer,androidx.wear.watchface.LayerMode> DRAW_ALL_LAYERS;
   }
 
   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.AllComplications extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplications INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.Complication extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.Complication(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();
@@ -211,8 +229,10 @@
     method @UiThread public void onDestroy();
     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 p);
     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;
@@ -224,25 +244,32 @@
   public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
     ctor 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 abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, android.icu.util.Calendar calendar);
   }
 
   public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
-    ctor 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);
-    ctor 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);
-    ctor 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);
+    ctor @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 @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 @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.EGLConfig getEglConfig();
-    method public final android.opengl.EGLContext? getEglContext();
-    method public final android.opengl.EGLDisplay? getEglDisplay();
-    method @UiThread public final void initOpenGlContext();
+    method public final android.opengl.EGLContext getEglContext();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public final void initOpenGlContext() throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final void makeContextCurrent();
     method @UiThread public void onGlContextCreated();
     method @UiThread public void onGlSurfaceCreated(@Px int width, @Px int height);
     method @UiThread public abstract void render(android.icu.util.Calendar calendar);
+    method @UiThread public abstract void renderHighlightLayer(android.icu.util.Calendar calendar);
     method public final void setEglConfig(android.opengl.EGLConfig p);
-    method public final void setEglContext(android.opengl.EGLContext? p);
-    method public final void setEglDisplay(android.opengl.EGLDisplay? p);
+    method public final void setEglContext(android.opengl.EGLContext p);
+    method public final void setEglDisplay(android.opengl.EGLDisplay p);
     property public final android.opengl.EGLConfig eglConfig;
-    property public final android.opengl.EGLContext? eglContext;
-    property public final android.opengl.EGLDisplay? eglDisplay;
+    property public final android.opengl.EGLContext eglContext;
+    property public final android.opengl.EGLDisplay eglDisplay;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
   }
 
   public final class RendererKt {
@@ -257,19 +284,27 @@
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer, optional androidx.wear.watchface.ComplicationsManager complicationsManager);
     ctor public WatchFace(int watchFaceType, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.Renderer renderer);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread @VisibleForTesting public static void clearAllEditorDelegates();
+    method public androidx.wear.watchface.ComplicationsManager getComplicationsManager();
     method public androidx.wear.watchface.style.CurrentUserStyleRepository getCurrentUserStyleRepository();
     method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public static kotlinx.coroutines.CompletableDeferred<androidx.wear.watchface.WatchFace.EditorDelegate> getOrCreateEditorDelegate(android.content.ComponentName componentName);
     method public Long? getOverridePreviewReferenceTimeMillis();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
     method public static boolean isLegacyWatchFaceOverlayStyleSupported();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @UiThread public static void registerEditorDelegate(android.content.ComponentName componentName, androidx.wear.watchface.WatchFace.EditorDelegate editorDelegate);
+    method public void setComplicationsManager(androidx.wear.watchface.ComplicationsManager p);
     method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
     method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceTimeMillis(@IntRange(from=0) long previewReferenceTimeMillis);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.wear.watchface.WatchFace setSystemTimeProvider(androidx.wear.watchface.WatchFace.SystemTimeProvider systemTimeProvider);
     method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int p);
+    property public final androidx.wear.watchface.ComplicationsManager complicationsManager;
     property public final androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository;
     property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
     property public final Long? overridePreviewReferenceTimeMillis;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
     field public static final androidx.wear.watchface.WatchFace.Companion Companion;
   }
 
@@ -314,7 +349,7 @@
   }
 
   public static interface WatchFace.TapListener {
-    method @UiThread public void onTap(int originalTapType, @Px int xPos, @Px int yPos);
+    method @UiThread public void onTap(int tapType, @Px int xPos, @Px int yPos);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface WatchFaceHostApi {
@@ -324,8 +359,14 @@
     method @UiThread public void invalidate();
     method public void onUserStyleChanged();
     method public void setActiveComplications(int[] watchFaceComplicationIds);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setContentDescriptionLabels(android.support.wearable.watchface.accessibility.ContentDescriptionLabel![] labels);
     method public void setDefaultComplicationProviderWithFallbacks(int watchFaceComplicationId, java.util.List<android.content.ComponentName>? providers, @androidx.wear.complications.SystemProviders.ProviderId int fallbackSystemProvider, int type);
+    method public void updateContentDescriptionLabels();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final class WatchFaceImpl {
+    ctor public WatchFaceImpl(androidx.wear.watchface.WatchFace watchface, androidx.wear.watchface.WatchFaceHostApi watchFaceHostApi, androidx.wear.watchface.WatchState watchState);
+    method public long getPreviewReferenceTimeMillis();
+    property public final long previewReferenceTimeMillis;
   }
 
   public final class WatchFaceKt {
diff --git a/wear/wear-watchface/build.gradle b/wear/wear-watchface/build.gradle
index 2977012..340abf2 100644
--- a/wear/wear-watchface/build.gradle
+++ b/wear/wear-watchface/build.gradle
@@ -30,7 +30,6 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api(project(":wear:wear-complications-data"))
-    api(project(":wear:wear-watchface-complications-rendering"))
     api(project(":wear:wear-watchface-data"))
     api(project(":wear:wear-watchface-style"))
     api(KOTLIN_STDLIB)
@@ -44,10 +43,11 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
 
+    testImplementation(project(":wear:wear-watchface-complications-rendering"))
     testImplementation(ANDROIDX_TEST_EXT_JUNIT)
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_RULES)
diff --git a/wear/wear-watchface/guava/build.gradle b/wear/wear-watchface/guava/build.gradle
index a70be6e..28f0610 100644
--- a/wear/wear-watchface/guava/build.gradle
+++ b/wear/wear-watchface/guava/build.gradle
@@ -34,14 +34,14 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(TRUTH)
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_RUNNER)
     testImplementation(ANDROIDX_TEST_RULES)
-    testImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    testImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    testImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    testImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
     testImplementation(ROBOLECTRIC)
     testImplementation(TRUTH)
 }
diff --git a/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt b/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
index 3b2d55e..3f89abe 100644
--- a/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
+++ b/wear/wear-watchface/guava/src/androidTest/java/AsyncListenableWatchFaceServiceTest.kt
@@ -49,8 +49,9 @@
     CanvasType.SOFTWARE,
     16
 ) {
-    override fun render(canvas: Canvas, bounds: Rect, calendar: Calendar) {
-    }
+    override fun render(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
+
+    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
 }
 
 private class TestAsyncListenableWatchFaceService(private val handler: Handler) :
diff --git a/wear/wear-watchface/guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt b/wear/wear-watchface/guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
index 489aaac..27d6554 100644
--- a/wear/wear-watchface/guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
+++ b/wear/wear-watchface/guava/src/test/java/androidx/wear/watchface/ListenableWatchFaceServiceTest.kt
@@ -54,6 +54,12 @@
                     16
                 ) {
                     override fun render(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
+
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        calendar: Calendar
+                    ) {}
                 }
             ).apply { setOverridePreviewReferenceTimeMillis(REFERENCE_PREVIEW_TIME) }
         )
diff --git a/wear/wear-watchface/lint-baseline.xml b/wear/wear-watchface/lint-baseline.xml
index 9ed4a74..234f8b1 100644
--- a/wear/wear-watchface/lint-baseline.xml
+++ b/wear/wear-watchface/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="MissingClass"
@@ -56,4 +56,15 @@
             column="5"/>
     </issue>
 
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.wear.watchface.Renderer.CanvasRenderer is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="                    surfaceHolder.lockHardwareCanvas() // Requires API level 26."
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/wear/watchface/Renderer.kt"
+            line="325"
+            column="35"/>
+    </issue>
+
 </issues>
diff --git a/wear/wear-watchface/samples/lint-baseline.xml b/wear/wear-watchface/samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/wear/wear-watchface/samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/wear/wear-watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java b/wear/wear-watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
index eb93d21a..2466d7a 100644
--- a/wear/wear-watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
+++ b/wear/wear-watchface/samples/minimal/src/main/java/androidx/wear/watchface/samples/minimal/WatchFaceRenderer.java
@@ -24,6 +24,7 @@
 import android.icu.util.Calendar;
 import android.view.SurfaceHolder;
 
+import androidx.annotation.NonNull;
 import androidx.wear.watchface.CanvasType;
 import androidx.wear.watchface.Renderer;
 import androidx.wear.watchface.WatchState;
@@ -78,4 +79,10 @@
                 rect.centerY() - mWatchState.getChinHeight(),
                 mPaint);
     }
+
+    @Override
+    public void renderHighlightLayer(@NonNull Canvas canvas, @NonNull Rect bounds,
+            @NonNull Calendar calendar) {
+        canvas.drawColor(getRenderParameters().getHighlightLayer().getBackgroundTint());
+    }
 }
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
index ad5079f..fc93ceb 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasAnalogWatchFaceService.kt
@@ -30,19 +30,17 @@
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationType
-import androidx.wear.watchface.CanvasComplicationDrawable
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.LayerMode
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import androidx.wear.watchface.style.Layer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
@@ -54,6 +52,7 @@
 import androidx.wear.watchface.style.UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption
 import androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.Option
+import androidx.wear.watchface.style.WatchFaceLayer
 import kotlin.math.cos
 import kotlin.math.sin
 
@@ -74,20 +73,17 @@
 
 private const val NUMBER_RADIUS_FRACTION = 0.45f
 
-val COLOR_STYLE_SETTING = "color_style_setting"
-val RED_STYLE = "red_style"
-val GREEN_STYLE = "green_style"
-val BLUE_STYLE = "blue_style"
-
-val DRAW_HOUR_PIPS_STYLE_SETTING = "draw_hour_pips_style_setting"
-
-val WATCH_HAND_LENGTH_STYLE_SETTING = "watch_hand_length_style_setting"
-
-val COMPLICATIONS_STYLE_SETTING = "complications_style_setting"
-val NO_COMPLICATIONS = "NO_COMPLICATIONS"
-val LEFT_COMPLICATION = "LEFT_COMPLICATION"
-val RIGHT_COMPLICATION = "RIGHT_COMPLICATION"
-val LEFT_AND_RIGHT_COMPLICATIONS = "LEFT_AND_RIGHT_COMPLICATIONS"
+const val COLOR_STYLE_SETTING = "color_style_setting"
+const val RED_STYLE = "red_style"
+const val GREEN_STYLE = "green_style"
+const val BLUE_STYLE = "blue_style"
+const val DRAW_HOUR_PIPS_STYLE_SETTING = "draw_hour_pips_style_setting"
+const val WATCH_HAND_LENGTH_STYLE_SETTING = "watch_hand_length_style_setting"
+const val COMPLICATIONS_STYLE_SETTING = "complications_style_setting"
+const val NO_COMPLICATIONS = "NO_COMPLICATIONS"
+const val LEFT_COMPLICATION = "LEFT_COMPLICATION"
+const val RIGHT_COMPLICATION = "RIGHT_COMPLICATION"
+const val LEFT_AND_RIGHT_COMPLICATIONS = "LEFT_AND_RIGHT_COMPLICATIONS"
 
 /** How long each frame is displayed at expected frame rate.  */
 private const val FRAME_PERIOD_MS: Long = 16L
@@ -135,14 +131,18 @@
                 Icon.createWithResource(context, R.drawable.blue_style)
             )
         ),
-        listOf(Layer.BASE, Layer.COMPLICATIONS, Layer.COMPLICATIONS_OVERLAY)
+        listOf(
+            WatchFaceLayer.BASE,
+            WatchFaceLayer.COMPLICATIONS,
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
+        )
     )
     val drawHourPipsStyleSetting = BooleanUserStyleSetting(
         UserStyleSetting.Id(DRAW_HOUR_PIPS_STYLE_SETTING),
         context.getString(R.string.watchface_pips_setting),
         context.getString(R.string.watchface_pips_setting_description),
         null,
-        listOf(Layer.BASE),
+        listOf(WatchFaceLayer.BASE),
         true
     )
     val watchHandLengthStyleSetting = DoubleRangeUserStyleSetting(
@@ -152,7 +152,7 @@
         null,
         0.25,
         1.0,
-        listOf(Layer.COMPLICATIONS_OVERLAY),
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY),
         0.75
     )
     // These are style overrides applied on top of the complications passed into
@@ -209,7 +209,7 @@
                 )
             )
         ),
-        listOf(Layer.COMPLICATIONS)
+        listOf(WatchFaceLayer.COMPLICATIONS)
     )
     val userStyleRepository = CurrentUserStyleRepository(
         UserStyleSchema(
@@ -231,7 +231,7 @@
             ComplicationType.MONOCHROMATIC_IMAGE,
             ComplicationType.SMALL_IMAGE
         ),
-        DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+        DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
         ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
     ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
         .build()
@@ -245,7 +245,7 @@
             ComplicationType.MONOCHROMATIC_IMAGE,
             ComplicationType.SMALL_IMAGE
         ),
-        DefaultComplicationProviderPolicy(SystemProviders.STEP_COUNT),
+        DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_STEP_COUNT),
         ComplicationBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
     ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
         .build()
@@ -333,7 +333,8 @@
                     // the styles are defined in XML so we need to replace the complication's
                     // drawables.
                     for ((_, complication) in complicationsManager.complications) {
-                        complication.renderer.drawable = watchFaceColorStyle.getDrawable(context)!!
+                        (complication.renderer as CanvasComplicationDrawable).drawable =
+                            watchFaceColorStyle.getDrawable(context)!!
                     }
 
                     drawHourPips = (userStyle[drawPipsStyleSetting]!! as BooleanOption).value
@@ -354,21 +355,36 @@
 
         canvas.drawColor(style.backgroundColor)
 
-        // CanvasComplicationDrawable already obeys rendererParameters.
-        drawComplications(canvas, calendar)
+        // We don't need to check renderParameters.watchFaceWatchFaceLayers because
+        // CanvasComplicationDrawable does that for us.
+        for ((_, complication) in complicationsManager.complications) {
+            if (complication.enabled) {
+                complication.render(canvas, calendar, renderParameters)
+            }
+        }
 
-        if (renderParameters.layerParameters[Layer.COMPLICATIONS_OVERLAY] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+        ) {
             drawClockHands(canvas, bounds, calendar, style)
         }
 
         if (renderParameters.drawMode != DrawMode.AMBIENT &&
-            renderParameters.layerParameters[Layer.BASE] != LayerMode.HIDE &&
-            drawHourPips
+            renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE) && drawHourPips
         ) {
             drawNumberStyleOuterElement(canvas, bounds, style)
         }
     }
 
+    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, calendar: Calendar) {
+        canvas.drawColor(renderParameters.highlightLayer!!.backgroundTint)
+
+        for ((_, complication) in complicationsManager.complications) {
+            if (complication.enabled) {
+                complication.renderHighlightLayer(canvas, calendar, renderParameters)
+            }
+        }
+    }
+
     private fun drawClockHands(
         canvas: Canvas,
         bounds: Rect,
@@ -555,14 +571,6 @@
         return path
     }
 
-    private fun drawComplications(canvas: Canvas, calendar: Calendar) {
-        for ((_, complication) in complicationsManager.complications) {
-            if (complication.enabled) {
-                complication.render(canvas, calendar, renderParameters)
-            }
-        }
-    }
-
     private fun drawNumberStyleOuterElement(canvas: Canvas, bounds: Rect, style: ColorStyle) {
         val textBounds = Rect()
         textPaint.color = style.outerElementColor
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
index 35e7b94..fbe47da 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleCanvasDigitalWatchFaceService.kt
@@ -43,18 +43,17 @@
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationType
-import androidx.wear.watchface.CanvasComplicationDrawable
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.LayerMode
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
@@ -493,7 +492,11 @@
                     Icon.createWithResource(this, R.drawable.blue_style)
                 )
             ),
-            listOf(Layer.BASE, Layer.COMPLICATIONS, Layer.COMPLICATIONS_OVERLAY)
+            listOf(
+                WatchFaceLayer.BASE,
+                WatchFaceLayer.COMPLICATIONS,
+                WatchFaceLayer.COMPLICATIONS_OVERLAY
+            )
         )
         val userStyleRepository = CurrentUserStyleRepository(
             UserStyleSchema(listOf(colorStyleSetting))
@@ -507,7 +510,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.WATCH_BATTERY),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_WATCH_BATTERY),
             ComplicationBounds(
                 createBoundsRect(
                     LEFT_CIRCLE_COMPLICATION_CENTER_FRACTION,
@@ -525,7 +528,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.DATE),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DATE),
             ComplicationBounds(
                 createBoundsRect(
                     RIGHT_CIRCLE_COMPLICATION_CENTER_FRACTION,
@@ -547,7 +550,7 @@
             ComplicationID.UPPER.ordinal,
             CanvasComplicationDrawable(watchFaceStyle.getDrawable(this)!!, watchState),
             upperAndLowerComplicationTypes,
-            DefaultComplicationProviderPolicy(SystemProviders.WORLD_CLOCK),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_WORLD_CLOCK),
             ComplicationBounds(
                 ComplicationType.values().associateWith {
                     if (it == ComplicationType.LONG_TEXT) {
@@ -569,7 +572,7 @@
             ComplicationID.LOWER.ordinal,
             CanvasComplicationDrawable(watchFaceStyle.getDrawable(this)!!, watchState),
             upperAndLowerComplicationTypes,
-            DefaultComplicationProviderPolicy(SystemProviders.NEXT_EVENT),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_NEXT_EVENT),
             ComplicationBounds(
                 ComplicationType.values().associateWith {
                     if (it == ComplicationType.LONG_TEXT) {
@@ -762,7 +765,8 @@
                     // the styles are defined in XML so we need to replace the complication's
                     // drawables.
                     for ((_, complication) in complicationsManager.complications) {
-                        complication.renderer.drawable = watchFaceColorStyle.getDrawable(context)!!
+                        (complication.renderer as CanvasComplicationDrawable).drawable =
+                            watchFaceColorStyle.getDrawable(context)!!
                     }
 
                     clearDigitBitmapCache()
@@ -827,13 +831,13 @@
 
         applyColorStyleAndDrawMode(renderParameters.drawMode)
 
-        if (renderParameters.layerParameters[Layer.BASE] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE)) {
             drawBackground(canvas)
         }
 
         drawComplications(canvas, calendar)
 
-        if (renderParameters.layerParameters[Layer.BASE] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE)) {
             val is24Hour: Boolean = DateFormat.is24HourFormat(context)
 
             nextSecondTime.timeInMillis = calendar.timeInMillis
@@ -977,6 +981,12 @@
         }
     }
 
+    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, calendar: Calendar) {
+        canvas.drawColor(renderParameters.highlightLayer!!.backgroundTint)
+
+        drawComplicationHighlights(canvas, calendar)
+    }
+
     override fun getMainClockElementBounds() = clockBounds
 
     private fun recalculateBoundsIfChanged(bounds: Rect, calendar: Calendar) {
@@ -1095,6 +1105,13 @@
         }
     }
 
+    private fun drawComplicationHighlights(canvas: Canvas, calendar: Calendar) {
+        for (i in FOREGROUND_COMPLICATION_IDS) {
+            val complication = complicationsManager[i] as Complication
+            complication.renderHighlightLayer(canvas, calendar, renderParameters)
+        }
+    }
+
     private fun clearDigitBitmapCache() {
         currentCachedDigits.clear()
         digitBitmapCache.clear()
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
index d229d3b..613b24a 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLBackgroundInitWatchFaceService.kt
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.samples
 
 import android.graphics.BitmapFactory
+import android.graphics.Color
 import android.icu.util.Calendar
 import android.opengl.EGL14
 import android.opengl.GLES20
@@ -315,4 +316,15 @@
 
         triangleTextureProgram.unbindAttribs()
     }
+
+    override fun renderHighlightLayer(calendar: Calendar) {
+        val highlightLayer = renderParameters.highlightLayer!!
+        GLES20.glClearColor(
+            Color.red(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.green(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.blue(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.alpha(highlightLayer.backgroundTint).toFloat() / 256.0f
+        )
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+    }
 }
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
index ad3fd10..b265fdb 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/ExampleOpenGLWatchFaceService.kt
@@ -17,6 +17,7 @@
 package androidx.wear.watchface.samples
 
 import android.content.Context
+import android.graphics.Color
 import android.graphics.RectF
 import android.graphics.drawable.Icon
 import android.icu.util.Calendar
@@ -31,18 +32,17 @@
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationType
-import androidx.wear.watchface.CanvasComplicationDrawable
 import androidx.wear.watchface.Complication
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.GlesTextureComplication
-import androidx.wear.watchface.LayerMode
+import androidx.wear.watchface.complications.rendering.GlesTextureComplication
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
@@ -110,7 +110,7 @@
                 Icon.createWithResource(context, R.drawable.green_style)
             )
         ),
-        listOf(Layer.BASE, Layer.COMPLICATIONS_OVERLAY)
+        listOf(WatchFaceLayer.BASE, WatchFaceLayer.COMPLICATIONS_OVERLAY)
     )
     val userStyleRepository = CurrentUserStyleRepository(UserStyleSchema(listOf(colorStyleSetting)))
     val complicationsManager = ComplicationsManager(
@@ -125,7 +125,7 @@
                     ComplicationType.MONOCHROMATIC_IMAGE,
                     ComplicationType.SMALL_IMAGE
                 ),
-                DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+                DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
                 ComplicationBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
             ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
                 .build()
@@ -181,17 +181,17 @@
     private val modelMatrices = Array(360) { FloatArray(16) }
 
     /**
-     * Products of [.mViewMatrices] and [.mProjectionMatrix]. One matrix per camera
+     * Products of [mViewMatrices] and [mProjectionMatrix]. One matrix per camera
      * position.
      */
     private val vpMatrices = Array(numCameraAngles) { FloatArray(16) }
 
-    /** The product of [.mAmbientViewMatrix] and [.mProjectionMatrix]  */
+    /** The product of [mAmbientViewMatrix] and [mProjectionMatrix]  */
     private val ambientVpMatrix = FloatArray(16)
 
     /**
-     * Product of [.mModelMatrices], [.mViewMatrices], and
-     * [.mProjectionMatrix].
+     * Product of [mModelMatrices], [mViewMatrices], and
+     * [mProjectionMatrix].
      */
     private val mvpMatrix = FloatArray(16)
 
@@ -216,6 +216,7 @@
     private lateinit var textureTriangleProgram: Gles2TexturedTriangleList.Program
 
     private lateinit var complicationTriangles: Gles2TexturedTriangleList
+    private lateinit var complicationHighlightTriangles: Gles2ColoredTriangleList
 
     override fun onGlContextCreated() {
         // Create program for drawing triangles.
@@ -235,6 +236,14 @@
             0.6f
         )
 
+        complicationHighlightTriangles = createComplicationHighlightQuad(
+            coloredTriangleProgram,
+            -0.9f,
+            -0.1f,
+            0.6f,
+            0.6f
+        )
+
         // Create triangles for the hands.
         secondHandTriangleMap = mapOf(
             "red_style" to
@@ -330,8 +339,7 @@
             complication.renderer,
             128,
             128,
-            GLES20.GL_TEXTURE_2D,
-            EXAMPLE_OPENGL_COMPLICATION_ID
+            GLES20.GL_TEXTURE_2D
         )
     }
 
@@ -510,6 +518,50 @@
         )
     )
 
+    /**
+     * Creates a triangle list for the complication highlight quad.
+     */
+    private fun createComplicationHighlightQuad(
+        program: Gles2ColoredTriangleList.Program,
+        left: Float,
+        top: Float,
+        width: Float,
+        height: Float
+    ) = Gles2ColoredTriangleList(
+        program,
+        floatArrayOf(
+            top + 0.0f,
+            left + 0.0f,
+            0.0f,
+
+            top + 0.0f,
+            left + width,
+            0.0f,
+
+            top + height,
+            left + 0.0f,
+            0.0f,
+
+            top + 0.0f,
+            left + width,
+            0.0f,
+
+            top + height,
+            left + 0.0f,
+            0.0f,
+
+            top + height,
+            left + width,
+            0.0f
+        ),
+        floatArrayOf(
+            1.0f /* red */,
+            1.0f /* green */,
+            1.0f /* blue */,
+            0.0f /* alpha */
+        )
+    )
+
     private fun getMajorTickTriangleCoords(index: Int): FloatArray {
         return getTickTriangleCoords(
             0.03f /* width */, 0.09f /* length */,
@@ -588,8 +640,7 @@
         GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
 
         // Draw the complication first.
-        // TODO(alexclarke): Implement LayerMode.DRAW_OUTLINED
-        if (renderParameters.layerParameters[Layer.COMPLICATIONS] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS)) {
             complicationTexture.renderToTexture(calendar, renderParameters)
 
             textureTriangleProgram.bindProgramAndAttribs()
@@ -614,7 +665,8 @@
         val hoursIndex = (hours / 12f * 360f).toInt()
 
         // Render hands.
-        if (renderParameters.layerParameters[Layer.COMPLICATIONS_OVERLAY] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS_OVERLAY)
+        ) {
             Matrix.multiplyMM(
                 mvpMatrix,
                 0,
@@ -650,12 +702,33 @@
             }
         }
 
-        if (renderParameters.layerParameters[Layer.BASE] != LayerMode.HIDE) {
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.BASE)) {
             majorTickTriangles.draw(vpMatrix)
             minorTickTriangles.draw(vpMatrix)
             coloredTriangleProgram.unbindAttribs()
         }
     }
+
+    override fun renderHighlightLayer(calendar: Calendar) {
+        val cameraIndex = (calendar.timeInMillis / FRAME_PERIOD_MS % numCameraAngles).toInt()
+        val vpMatrix = vpMatrices[cameraIndex]
+
+        val highlightLayer = renderParameters.highlightLayer!!
+        GLES20.glClearColor(
+            Color.red(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.green(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.blue(highlightLayer.backgroundTint).toFloat() / 256.0f,
+            Color.alpha(highlightLayer.backgroundTint).toFloat() / 256.0f
+        )
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+
+        if (renderParameters.watchFaceLayers.contains(WatchFaceLayer.COMPLICATIONS)) {
+            GLES20.glEnable(GLES20.GL_BLEND)
+            GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)
+            complicationHighlightTriangles.draw(vpMatrix)
+            coloredTriangleProgram.unbindAttribs()
+        }
+    }
 }
 
 /**
@@ -667,8 +740,8 @@
     private val color: FloatArray
 ) {
     init {
-        require(triangleCoords.size % (VERTICE_PER_TRIANGLE * COORDS_PER_VERTEX) == 0) {
-            ("must be multiple of VERTICE_PER_TRIANGLE * COORDS_PER_VERTEX coordinates")
+        require(triangleCoords.size % (VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX) == 0) {
+            ("must be multiple of VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX coordinates")
         }
         require(color.size == NUM_COLOR_COMPONENTS) { "wrong number of color components" }
     }
@@ -870,7 +943,7 @@
         private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT
 
         /** Triangles have three vertices.  */
-        private const val VERTICE_PER_TRIANGLE = 3
+        private const val VERTICES_PER_TRIANGLE = 3
 
         /**
          * Number of components in an OpenGL color. The components are:
@@ -951,12 +1024,12 @@
     private val textureCoords: FloatArray
 ) {
     init {
-        require(triangleCoords.size % (VERTICE_PER_TRIANGLE * COORDS_PER_VERTEX) == 0) {
-            ("must be multiple of VERTICE_PER_TRIANGLE * COORDS_PER_VERTEX coordinates")
+        require(triangleCoords.size % (VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX) == 0) {
+            ("must be multiple of VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX coordinates")
         }
-        require(textureCoords.size % (VERTICE_PER_TRIANGLE * TEXTURE_COORDS_PER_VERTEX) == 0) {
+        require(textureCoords.size % (VERTICES_PER_TRIANGLE * TEXTURE_COORDS_PER_VERTEX) == 0) {
             (
-                "must be multiple of VERTICE_PER_TRIANGLE * NUM_TEXTURE_COMPONENTS texture " +
+                "must be multiple of VERTICES_PER_TRIANGLE * NUM_TEXTURE_COMPONENTS texture " +
                     "coordinates"
                 )
         }
@@ -1199,7 +1272,7 @@
         private const val TEXTURE_COORDS_VERTEX_STRIDE = TEXTURE_COORDS_PER_VERTEX * BYTES_PER_FLOAT
 
         /** Triangles have three vertices. */
-        private const val VERTICE_PER_TRIANGLE = 3
+        private const val VERTICES_PER_TRIANGLE = 3
 
         /**
          * Checks if any of the GL calls since the last time this method was called set an error
diff --git a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
index 07c4b8c..9a23db8 100644
--- a/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
+++ b/wear/wear-watchface/samples/src/main/java/androidx/wear/watchface/samples/KDocExampleWatchFace.kt
@@ -31,14 +31,14 @@
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.CanvasType
 import androidx.wear.watchface.Complication
-import androidx.wear.watchface.CanvasComplicationDrawable
 import androidx.wear.watchface.ComplicationsManager
 import androidx.wear.watchface.Renderer
 import androidx.wear.watchface.WatchFace
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.WatchFaceType
 import androidx.wear.watchface.WatchState
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
@@ -79,7 +79,11 @@
                                     icon = null
                                 )
                             ),
-                            listOf(Layer.BASE, Layer.COMPLICATIONS, Layer.COMPLICATIONS_OVERLAY)
+                            listOf(
+                                WatchFaceLayer.BASE,
+                                WatchFaceLayer.COMPLICATIONS,
+                                WatchFaceLayer.COMPLICATIONS_OVERLAY
+                            )
                         ),
                         ListUserStyleSetting(
                             UserStyleSetting.Id("hand_style_setting"),
@@ -99,7 +103,7 @@
                                     icon = null
                                 )
                             ),
-                            listOf(Layer.COMPLICATIONS_OVERLAY)
+                            listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
                         )
                     )
                 )
@@ -119,7 +123,7 @@
                             ComplicationType.MONOCHROMATIC_IMAGE,
                             ComplicationType.SMALL_IMAGE
                         ),
-                        DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+                        DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
                         ComplicationBounds(RectF(0.15625f, 0.1875f, 0.84375f, 0.3125f))
                     ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
                         .build(),
@@ -136,7 +140,7 @@
                             ComplicationType.MONOCHROMATIC_IMAGE,
                             ComplicationType.SMALL_IMAGE
                         ),
-                        DefaultComplicationProviderPolicy(SystemProviders.STEP_COUNT),
+                        DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_STEP_COUNT),
                         ComplicationBounds(RectF(0.1f, 0.5625f, 0.35f, 0.8125f))
                     ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
                         .build()
@@ -168,6 +172,16 @@
                 ) {
                     // ...
                 }
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    calendar: Calendar
+                ) {
+                    canvas.drawColor(renderParameters.highlightLayer!!.backgroundTint)
+
+                    // ...
+                }
             }
 
             return WatchFace(
diff --git a/wear/wear-watchface/samples/src/main/res/values-af/strings.xml b/wear/wear-watchface/samples/src/main/res/values-af/strings.xml
new file mode 100644
index 0000000..8663547
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-af/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rooistyl"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Groenstyl"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Kleure"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Horlosieskermkleur"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rooi"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Groen"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blou"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Uurkolletjies"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Om te teken of nie"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Wyserlengte"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Horlosiewyserskaal"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Verwikkelinge"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Nommer en posisie"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Albei"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Geen"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Links"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Regs"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-am/strings.xml b/wear/wear-watchface/samples/src/main/res/values-am/strings.xml
new file mode 100644
index 0000000..6a41692
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-am/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ቀይ ቅጥ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"አረንጓዴ ቅጥ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ቀለማት"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"የሰዓት መልክ ቀለምን ማከል"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ቀይ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"አረንጓዴ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ሰማያዊ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"የሰዓት ፒፖች"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"መሳል ወይም አለመሳል"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"የእጅ ርዝመት"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"የሰዓት እጆች ሚዛን"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ተጨማሪ ባህሪዎች"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ቁጥር እና አቀማመጥ"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ሁለቱም"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ምንም"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ግራ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ቀኝ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ar/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..750c906
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ar/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"نمط أحمر"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"نمط أخضر"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"الألوان"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"لون خلفية شاشة الساعة"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"أحمر"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"أخضر"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"أزرق"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"علامات الساعات"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"رسمها أو عدم رسمها"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"طول حزام الساعة"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"مقاس حزام الساعة"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"الإضافات"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"العدد والمكان"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"كلا الجانبين"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"بدون إضافات"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"يمين"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"يسار"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-as/strings.xml b/wear/wear-watchface/samples/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..a943d1e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-as/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ৰঙা শৈলী"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"সেউজীয়া শৈলী"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ৰং"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Watchfaceত ৰং কৰা"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ৰঙা"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"সেউজীয়া"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"নীলা"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ঘণ্টাৰ সূচক"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"অংকন কৰিবনে নাই"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"কাঁটাৰ দৈৰ্ঘ্য"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ঘড়ীৰ কাঁটাৰ দৈৰ্ঘ্য"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"জটিলতা"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"নম্বৰ আৰু স্থান"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"দুয়ো"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"নাই"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"বাওঁ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"সোঁ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-az/strings.xml b/wear/wear-watchface/samples/src/main/res/values-az/strings.xml
new file mode 100644
index 0000000..8a85ca1
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-az/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Qırmızı Üslub"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Yaşıl Üslub"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Rənglər"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Siferblat rəngləri"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Qırmızı"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Yaşıl"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Göy"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Saat Göstəriciləri"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Çəkməli, yoxsa yox"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Əqrəb uzunluğu"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Saat əqrəbi ölçüsü"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikasiyalar"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Say və mövqe"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Hər ikisi"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Heç bir"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Sol"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Sağ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-b+sr+Latn/strings.xml b/wear/wear-watchface/samples/src/main/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..cd68479
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Crveni stil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zeleni stil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Boje"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Bojenje brojčanika"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Crvena"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelena"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Plava"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Zvučni signali sata"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Aktivirano ili ne"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Dužina ruke"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Razmera ruke sata"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikacije"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Broj i položaj"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Oba"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nijedna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Leva"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Desna"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-be/strings.xml b/wear/wear-watchface/samples/src/main/res/values-be/strings.xml
new file mode 100644
index 0000000..c78a458
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-be/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Чырвоны стыль"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зялёны стыль"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Колеры"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Колер цыферблата"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Чырвоны"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Зялёны"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Сіні"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Меткі гадзін"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Паказваць ці не"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Даўжыня стрэлкі"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Памер стрэлак"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Ускладненні"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Лічбы і іх пазіцыя"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Абодва"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Няма"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Злева"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Справа"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-bg/strings.xml b/wear/wear-watchface/samples/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..98aebdc
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-bg/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Червен стил"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зелен стил"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Цветове"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Циферблат: Цветове"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"червено"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"зелено"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"синьо"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Точки за часа"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Да се показват ли"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Дължина на стрелките"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Мащаб на стрелките"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Допълнения"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Номер и позиция"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"И двете"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Без"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Ляво"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Дясно"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-bn/strings.xml b/wear/wear-watchface/samples/src/main/res/values-bn/strings.xml
new file mode 100644
index 0000000..fbc8c0e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-bn/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"রেড স্টাইল"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"গ্রিন স্টাইল"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"রঙ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ওয়াচফেস কালারাইজেশন"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"লাল"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"সবুজ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"নীল"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ঘণ্টা চিহ্নিতকারী"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"দেখাতে চান, না চান না"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"কাঁটার দৈর্ঘ্য"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"কাঁটার দৈর্ঘ্যের মাপ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"কমপ্লিকেশন"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"নম্বর এবং পজিশন"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"উভয়ই"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"কোনওটিই নয়"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"বাঁ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ডান"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-bs/strings.xml b/wear/wear-watchface/samples/src/main/res/values-bs/strings.xml
new file mode 100644
index 0000000..99deb90
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-bs/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Crveni stil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zeleni stil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Boje"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Boja brojčanika"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Crvena"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelena"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Plava"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Oznake sata"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Prikazati oznake ili ne"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Dužina kazaljke"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Veličina kazaljki"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Spletovi"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Broj i položaj"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Oba"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ništa"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Lijevo"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Desno"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ca/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ca/strings.xml
new file mode 100644
index 0000000..2a2b739
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ca/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estil vermell"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estil verd"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colors"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Colors de l\'esfera"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Vermell"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verd"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blau"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Pips de l\'hora"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Activar els pips o no"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Llargada d\'agulles"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala de les agulles"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicacions"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número i posició"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Totes dues"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Cap"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Esquerra"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Dreta"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-cs/strings.xml b/wear/wear-watchface/samples/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..ac17cbf
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-cs/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Červený styl"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zelený styl"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Barvy"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Barva ciferníku"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Červená"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelená"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Modrá"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Tečky hodin"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Kreslit nebo ne"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Délka ručiček"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Délka hodinových ručiček"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikace"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Číslo a pozice"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Obojí"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Žádné"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vlevo"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Vpravo"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-da/strings.xml b/wear/wear-watchface/samples/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..5894569
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-da/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rød farvestil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Grøn farvestil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Farver"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Urskivens farvetema"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rød"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Grøn"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blå"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Timemarkører"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Om der skal tegnes"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Længde på viserne"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Målestok for visere"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Widgets"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Antal og placering"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Begge"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ingen"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Venstre"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Højre"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-de/strings.xml b/wear/wear-watchface/samples/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..952734a
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-de/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rotes Design"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Grünes Design"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Farben"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Zifferblattfarbe"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rot"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Grün"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blau"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Stundenindexe"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Mit oder ohne Indexe"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Uhrzeigerlänge"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Länge der Uhrzeiger"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Zusatzfunktionen"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Ziffer und Position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Beide"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Keine"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Links"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Rechts"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-el/strings.xml b/wear/wear-watchface/samples/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..e96ba7e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-el/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Κόκκινο στιλ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Πράσινο στιλ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Χρώματα"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Χρώμα πρόσοψης ρολογιού"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Κόκκινο"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Πράσινο"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Μπλε"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Ενδείξεις ωρών"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Σχεδίαση ή όχι"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Μήκος δείκτη"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Κλίμακα δεικτών ρολογιού"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Ενδείξεις"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Αριθμός και θέση"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Και οι δύο"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Καμία"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Αριστερά"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Δεξιά"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-en-rAU/strings.xml b/wear/wear-watchface/samples/src/main/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..10e1f33
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-en-rAU/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Red style"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Green style"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colours"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Watchface colourisation"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Red"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Green"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blue"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Hour pips"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Whether to draw or not"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Hand length"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scale of watch hands"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Number and position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Both"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"None"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Left"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Right"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-en-rCA/strings.xml b/wear/wear-watchface/samples/src/main/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..10e1f33
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-en-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Red style"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Green style"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colours"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Watchface colourisation"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Red"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Green"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blue"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Hour pips"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Whether to draw or not"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Hand length"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scale of watch hands"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Number and position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Both"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"None"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Left"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Right"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-en-rGB/strings.xml b/wear/wear-watchface/samples/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..10e1f33
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Red style"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Green style"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colours"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Watchface colourisation"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Red"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Green"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blue"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Hour pips"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Whether to draw or not"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Hand length"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scale of watch hands"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Number and position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Both"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"None"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Left"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Right"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-en-rIN/strings.xml b/wear/wear-watchface/samples/src/main/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..10e1f33
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-en-rIN/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Red style"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Green style"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colours"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Watchface colourisation"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Red"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Green"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blue"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Hour pips"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Whether to draw or not"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Hand length"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scale of watch hands"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Number and position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Both"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"None"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Left"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Right"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-en-rXC/strings.xml b/wear/wear-watchface/samples/src/main/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..003a833
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-en-rXC/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎Red Style‎‏‎‎‏‎"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎Green Style‎‏‎‎‏‎"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎Colors‎‏‎‎‏‎"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎Watchface colorization‎‏‎‎‏‎"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‎Red‎‏‎‎‏‎"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎Green‎‏‎‎‏‎"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎Blue‎‏‎‎‏‎"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎Hour Pips‎‏‎‎‏‎"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎Whether to draw or not‎‏‎‎‏‎"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎Hand length‎‏‎‎‏‎"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎Scale of watch hands‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎Complications‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‏‎Number and position‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎Both‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‎None‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎Left‎‏‎‎‏‎"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‎Right‎‏‎‎‏‎"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-es-rUS/strings.xml b/wear/wear-watchface/samples/src/main/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..46a8f3f
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-es-rUS/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo rojo"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Coloración de cara"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rojo"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Pitidos de la hora"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Hacer sonar o no"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Largo de las agujas"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Ajuste de las agujas"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicaciones"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número y posición"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ninguna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Izquierda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Derecha"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-es/strings.xml b/wear/wear-watchface/samples/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000..9e7cb45
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-es/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo rojo"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Color de la esfera"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rojo"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Marcas de horas"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Marcarlas o no"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Largo de manecillas"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala de manecillas"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicaciones"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número y ubicación"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ninguna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Izquierda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Derecha"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-et/strings.xml b/wear/wear-watchface/samples/src/main/res/values-et/strings.xml
new file mode 100644
index 0000000..4f7c4a9
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-et/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Punane stiil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Roheline stiil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Värvid"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Kelladisaini värvid"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Punane"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Roheline"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Sinine"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Tunnimärgid"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Kas lisada või mitte"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Seieri pikkus"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Kellaseierite ulatus"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Funktsioonid"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Number ja asend"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Mõlemad"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Puudub"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vasak"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Parem"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-eu/strings.xml b/wear/wear-watchface/samples/src/main/res/values-eu/strings.xml
new file mode 100644
index 0000000..83a502d
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-eu/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo gorria"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo berdea"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Koloreak"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Koloreztatu erloju-esfera"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Gorria"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Berdea"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Urdina"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Ordu-markak"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Marraztu ala ez"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Orratzaren luzera"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Orratzen eskala"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Ezaugarri bereziak"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Zenbakia eta kokapena"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Biak"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Bat ere ez"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Ezkerrekoa"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Eskuinekoa"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-fa/strings.xml b/wear/wear-watchface/samples/src/main/res/values-fa/strings.xml
new file mode 100644
index 0000000..594cf6a
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-fa/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"سبک قرمز"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"سبک سبز"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"رنگ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"رنگ‌آمیزی صفحه ساعت"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"قرمز"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"سبز"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"آبی"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"نشانگر ساعت"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"نشانگر رسم شود یا نه"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"طول عقربه"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"مقیاس عقربه‌های ساعت"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"چیدمان"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"عدد و موقعیت"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"هر دو"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"هیچ‌کدام"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"چپ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"راست"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-fi/strings.xml b/wear/wear-watchface/samples/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..2c890dfe
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-fi/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Punainen tyyli"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Vihreä tyyli"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Värit"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Kellotaulun värit"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Punainen"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Vihreä"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Sininen"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Tunnin piippaukset"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Piirtämisvaihtoehto"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Viisarin pituus"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Viisarin asteikko"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Lisäominaisuudet"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Määrä ja sijoittelu"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Molemmat"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"–"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vasen"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Oikea"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-fr-rCA/strings.xml b/wear/wear-watchface/samples/src/main/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..9b437af6
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-fr-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Style rouge"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Style vert"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Couleurs"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Couleurs du cadran"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rouge"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Vert"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Bleu"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Bips aux heures"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Activer les bips ou non"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Longueur des aiguilles"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Échelle des aiguilles"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Numéro et position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Les deux"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Aucune"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Gauche"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Droite"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-fr/strings.xml b/wear/wear-watchface/samples/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..2eee051
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-fr/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Style rouge"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Style vert"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Coloris"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Colorisation du cadran"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rouge"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Vert"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Bleu"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Bips horaires"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Les dessiner ou non"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Longueur aiguilles"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Longueur aiguilles"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complications"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Nombre et position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Les deux"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Aucune"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Gauche"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Droite"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-gl/strings.xml b/wear/wear-watchface/samples/src/main/res/values-gl/strings.xml
new file mode 100644
index 0000000..ee9e880
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-gl/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo vermello"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Cores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Cores da esfera"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Vermello"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Puntos das horas"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Indica se se mostran"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Agullas: lonxitude"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala das agullas"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicacións"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número e posición"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ningunha"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Esquerda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Dereita"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-gu/strings.xml b/wear/wear-watchface/samples/src/main/res/values-gu/strings.xml
new file mode 100644
index 0000000..00e3cdd
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-gu/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"લાલ રંગની શૈલી"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"લીલા રંગની શૈલી"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"રંગો"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ઘડિયાળની રંગ થીમની પસંદગી"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"લાલ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"લીલો"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"વાદળી"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"કલાક માટેના PIP"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"દોરવું કે નહીં"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"કાંટાની લંબાઈ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ઘડિયાળના કાંટાની લંબાઈ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"કૉમ્પ્લિકેશન"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"નંબર અને સ્થિતિ"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"બન્ને"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"એકપણ નહીં"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ડાબા"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"જમણા"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-hi/strings.xml b/wear/wear-watchface/samples/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..ae1e91d
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-hi/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"रेड स्टाइल"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ग्रीन स्टाइल"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"रंग"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"स्मार्ट वॉच के फ़ेस में रंग भरना"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"लाल"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"हरा"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"नीला"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"हर घंटे का निशान"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"हर घंटे का निशान दिखाया जाए या नहीं"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"घड़ी की सुइयों की लंबाई"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"घड़ी की सुइयों का पैमाना"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Android घड़ी के संकेत"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"नंबर और पोज़िशन"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"दोनों तरफ़ के संकेत"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"कोई संकेत नहीं"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"बायां संकेत"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"दायां संकेत"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-hr/strings.xml b/wear/wear-watchface/samples/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000..a2e8697
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-hr/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Crveni stil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zeleni stil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Boje"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Boja brojčanika"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Crvena"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelena"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Plava"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Signali punog sata"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Crtati ili ne"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Duljina kazaljki"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Omjer kazaljki"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikacije"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Broj i položaj"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Oboje"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nijedna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Lijeva"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Desna"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-hu/strings.xml b/wear/wear-watchface/samples/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..3803ee2
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-hu/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Piros stílus"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zöld stílus"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Színek"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Óralapszínezés"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Piros"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zöld"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Kék"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Jelzőhang óránként"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Használat eldöntése"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Kézhosszúság"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Kéz mérete"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikációk"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Szám és pozíció"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Mindkettő"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nincs"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Bal"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Jobb"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-hy/strings.xml b/wear/wear-watchface/samples/src/main/res/values-hy/strings.xml
new file mode 100644
index 0000000..2312a0d
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-hy/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Կարմիր ոճ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Կանաչ ոճ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Գույներ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Գունային կարգավորումներ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Կարմիր"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Կանաչ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Կապույտ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Ժամերի նշաններ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Ցուցադրել, թե ոչ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Սլաքի երկարությունը"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Սլաքների մեծությունը"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Լրացումներ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Թիվ և դիրք"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Երկուսն էլ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Չկա"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Ձախ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Աջ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-in/strings.xml b/wear/wear-watchface/samples/src/main/res/values-in/strings.xml
new file mode 100644
index 0000000..87ae828
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-in/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Gaya Merah"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Gaya Hijau"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Warna"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Pewarnaan tampilan jam"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Merah"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Hijau"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Biru"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Pip Jam"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Gambar atau tidak"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Panjang jarum jam"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Skala jarum jam"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Detail"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Angka dan posisi"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Keduanya"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Tidak ada"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Kiri"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Kanan"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-is/strings.xml b/wear/wear-watchface/samples/src/main/res/values-is/strings.xml
new file mode 100644
index 0000000..2b04540
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-is/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rauður stíll"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Grænn stíll"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Litir"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Litur úrskífu"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rauður"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Grænn"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blár"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Klukkustundamerki"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Teikna eða ekki"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Lengd vísa"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Lengd vísanna"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Græjur"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Tala og staðsetning"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Báðum megin"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ekkert"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vinstri"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Hægri"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-it/strings.xml b/wear/wear-watchface/samples/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..8582ab4
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-it/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Stile Rosso"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Stile Verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Colori"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Coloraz. quadrante"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rosso"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blu"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Tacche per le ore"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Scegli se tracciarle"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Lunghezza lancette"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scala delle lancette"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicazioni"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Numero e posizione"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Entrambe"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nessuna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Sinistra"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Destra"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-iw/strings.xml b/wear/wear-watchface/samples/src/main/res/values-iw/strings.xml
new file mode 100644
index 0000000..c5a4996
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-iw/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"סגנון אדום"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"סגנון ירוק"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"צבעים"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"צבעי תצוגת השעון"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"אדום"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ירוק"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"כחול"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"אותות זמן לכל שעה"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"האם להציג?"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"אורך המחוגים"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"אורך מחוגי השעון"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"תכונות נוספות"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"מספר ומיקום"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"שתי האפשרויות"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ללא"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"השמאלית"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"הימנית"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ja/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..5f3f938
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ja/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"レッド スタイル"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"グリーン スタイル"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"カラー"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ウォッチフェイスのカラー化"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"レッド"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"グリーン"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ブルー"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"正時表示"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"表示の有無"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"針の長さ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"針のサイズ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"追加機能"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"数字と位置"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"両方"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"なし"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"左"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"右"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ka/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ka/strings.xml
new file mode 100644
index 0000000..e7a2658
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ka/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"წითელი სტილი"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"მწვანე სტილი"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ფერები"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ციფერბლატის ფერები"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"წითელი"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"მწვანე"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ლურჯი"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"საათის ნიშნულები"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"დავხატოთ თუ არა"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ისრის სიგრძე"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"საათის ისრების სკალა"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"გართულებები"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ნომერი და პოზიცია"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ორივე"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"არცერთი"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"მარცხენა"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"მარჯვენა"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-kk/strings.xml b/wear/wear-watchface/samples/src/main/res/values-kk/strings.xml
new file mode 100644
index 0000000..162199b
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-kk/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Қызыл стиль"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Жасыл стиль"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Түстер"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Циферблат түсі"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Қызыл"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Жасыл"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Көк"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Сағат белгілері"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Салу/салмау"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Сағат тілі ұзындығы"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Сағат тілі өлшемі"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Қосымшалар"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Нөмірі мен позициясы"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Екеуі де"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Жоқ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Сол жақ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Оң жақ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-km/strings.xml b/wear/wear-watchface/samples/src/main/res/values-km/strings.xml
new file mode 100644
index 0000000..75c570e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-km/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"រចនាប័ទ្មក្រហម"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"រចនាប័ទ្មបៃតង"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ពណ៌"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ការរើសពណ៌មុខ​នាឡិកា"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ក្រហម"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"បៃតង"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ខៀវ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"គំនូសម៉ោង"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ថាតើត្រូវគូសឬអត់"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ប្រវែងទ្រនិច"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ទំហំទ្រនិចនាឡិកា"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ភាពស្មុគស្មាញ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"លេខ និងទីតាំង"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ទាំងពីរ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"គ្មាន"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ឆ្វេង"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ស្ដាំ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-kn/strings.xml b/wear/wear-watchface/samples/src/main/res/values-kn/strings.xml
new file mode 100644
index 0000000..3a80137
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-kn/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ಕೆಂಪು ಬಣ್ಣದ ಶೈಲಿ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ಹಸಿರು ಬಣ್ಣದ ಶೈಲಿ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ಬಣ್ಣಗಳು"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ಗಡಿಯಾರದ ಮುಖಭಾಗದ ಬಣ್ಣ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ಕೆಂಪು"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ಹಸಿರು"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ನೀಲಿ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ಗಂಟೆ ಸಂಖ್ಯೆಯ ಬಣ್ಣ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ಸೇರಿಸಬೇಕೆ ಅಥವಾ ಬೇಡವೇ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ಗಡಿಯಾರದ ಮುಳ್ಳಿನ ಉದ್ದ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ಗಡಿಯಾರ ಮುಳ್ಳು ಪ್ರಮಾಣ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ತೊಡಕುಗಳು"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ಸಂಖ್ಯೆ ಮತ್ತು ಸ್ಥಾನ"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ಎರಡೂ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ಯಾವುದೂ ಅಲ್ಲ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ಎಡ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ಬಲ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ko/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..55d0fed
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ko/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"빨간색 스타일"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"녹색 스타일"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"색상"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"시계 모드 색상"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"빨간색"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"녹색"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"파란색"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"시간 눈금"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"표시 여부"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"침 길이"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"침 크기"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"정보 표시"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"숫자 및 위치"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"둘 다"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"없음"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"왼쪽"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"오른쪽"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ky/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ky/strings.xml
new file mode 100644
index 0000000..301ed4b
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ky/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Кызыл стиль"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Жашыл стиль"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Түстөр"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Циферблаттын түсү"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Кызыл"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Жашыл"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Көк"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Cаат белгилери"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Белгилениши"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Жебенин узундугу"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Жебелердин масштабы"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Кошумчалар"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Номер жана позициясы"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Экөө тең"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Жок"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Сол"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Оң"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-lo/strings.xml b/wear/wear-watchface/samples/src/main/res/values-lo/strings.xml
new file mode 100644
index 0000000..3ea9b02
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-lo/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ຮູບແບບສີແດງ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ຮູບແບບສີຂຽວ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ສີ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ການປັບສີໜ້າປັດໂມງ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ສີແດງ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ສີຂຽວ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ສີຟ້າ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ຈຸດໂມງ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ແຕ້ມຫຼືບໍ່ແຕ້ມ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ຄວາມຍາວເຂັມ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ຂະໜາດຂອງເຂັມໂມງ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ການແຊກຊ້ອນ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ຕົວເລກ ແລະ ຕຳແໜ່ງ"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ທັງສອງ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ບໍ່ມີ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ຊ້າຍ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ຂວາ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-lt/strings.xml b/wear/wear-watchface/samples/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..c857855
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-lt/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Raudonas stilius"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Žalias stilius"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Spalvos"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Ciferblato spalvos"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Raudona"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Žalia"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Mėlyna"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Valandų žymos"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Piešti ar nepiešti"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Rodyklės ilgis"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Rodyklių mastelis"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Funkcijos"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Skaičius ir pozicija"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Abi"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nėra"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Kairėn"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Dešinėn"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-lv/strings.xml b/wear/wear-watchface/samples/src/main/res/values-lv/strings.xml
new file mode 100644
index 0000000..708f4c8
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-lv/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Sarkans stils"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zaļš stils"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Krāsas"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Pulksteņa ekrāna krāsa"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Sarkana"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zaļa"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Zila"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Stundu atzīmes"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Rādīt vai nerādīt"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Rādītāja garums"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Rādītāju mērogs"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Papildinājumi"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Skaitlis un pozīcija"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Abi"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nav"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Pa kreisi"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Pa labi"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-mk/strings.xml b/wear/wear-watchface/samples/src/main/res/values-mk/strings.xml
new file mode 100644
index 0000000..3dc7079
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-mk/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Црвен стил"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зелен стил"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Бои"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Бои за маската"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Црвена"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Зелена"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Сина"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Сигнали за час"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Дали да се огласи"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Должина на сказалка"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Скала за сказалките"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Компликации"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Број и положба"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Двете"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ниедна"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Левата"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Десната"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ml/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ml/strings.xml
new file mode 100644
index 0000000..83abb20
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ml/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"റെഡ് സ്‌റ്റെെൽ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ഗ്രീൻ സ്‌റ്റെെൽ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"നിറങ്ങൾ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"വാച്ച് ഫെയ്സ് കളറെെസേഷൻ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ചുവപ്പ്"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"പച്ച"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"നീല"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"അവർ പിപ്പ്‌സ്"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ചേർക്കണോ വേണ്ടയോ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"കെെ നീളം"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"വാച്ച് ഹാൻഡുകളുടെ സ്കെയിൽ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"കോംപ്ലിക്കേഷൻസ്"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"നമ്പറും സ്ഥാനവും"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"രണ്ടും"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ഒന്നുമില്ല"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ഇടത്"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"വലത്"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-mn/strings.xml b/wear/wear-watchface/samples/src/main/res/values-mn/strings.xml
new file mode 100644
index 0000000..986c70e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-mn/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Улаан загвар"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Ногоон загвар"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Өнгө"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Цагийн нүүрний өнгө"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Улаан"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Ногоон"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Цэнхэр"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Цагийн зураас"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Зурах эсэх"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Зүүний урт"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Цагийн зүүний хэмжээ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Хүндрэл"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Тоо болон байрлал"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Хоёуланг нь"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Хоосон"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Зүүн"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Баруун"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-mr/strings.xml b/wear/wear-watchface/samples/src/main/res/values-mr/strings.xml
new file mode 100644
index 0000000..ef4e982
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-mr/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"लाल शैली"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"हिरवी शैली"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"रंग"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"वॉचफेसची रंगसंगती"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"लाल"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"हिरवी"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"निळी"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"तासाची पिप्स"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"काढायची किंवा नाही"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"काट्याची लांबी"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"घड्याळाच्या काट्याची लांबी"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"कॉम्प्लिकेशन"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"नंबर आणि स्थान"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"दोन्ही"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"कोणतेही नाही"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"डावे"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"उजवे"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ms/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ms/strings.xml
new file mode 100644
index 0000000..3bfd556
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ms/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Gaya Merah"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Gaya Hijau"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Warna"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Pewarnaan muka jam"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Merah"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Hijau"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Biru"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Jam PIP"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Sama ada melukis atau tidak"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Panjang tangan"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Skala tangan jam"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Kerumitan"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Nombor dan kedudukan"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Kedua-duanya"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Tiada"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Kiri"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Kanan"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-my/strings.xml b/wear/wear-watchface/samples/src/main/res/values-my/strings.xml
new file mode 100644
index 0000000..93fb22e
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-my/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"အနီရောင် ပုံစံ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"အစိမ်းရောင် ပုံစံ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"အရောင်များ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"နာရီဒိုင်ခွက် အရောင်"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"အနီရောင်"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"အစိမ်းရောင်"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"အပြာရောင်"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"နာရီအချက်ပေးသံများ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"အချက်ပေး၊ မပေး"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"နာရီလက်တံ အလျား"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"နာရီလက်တံများ၏ စကေး"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"နာရီဝန်ဆောင်မှုများ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"နံပါတ်နှင့် အနေအထား"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"နှစ်ခုလုံး"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"မရှိ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ဘယ်"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ညာ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-nb/strings.xml b/wear/wear-watchface/samples/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000..72de918
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-nb/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rød stil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Grønn stil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Farger"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Bakgrunnsfargelegging"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rød"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Grønn"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blå"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Timemerking"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Om det skal tegnes"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Håndlengde"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Skala for klokkevisere"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Tilleggsfunksjoner"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Tall og posisjon"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Begge deler"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ingen"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Venstre"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Høyre"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ne/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ne/strings.xml
new file mode 100644
index 0000000..9b9f5ab
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ne/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"रातो शैली"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"हरियो शैली"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"रङहरू"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"वाचफेसको रङ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"रातो"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"हरियो"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"निलो"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"घन्टा जनाउने सङ्केत"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"सङ्केत देखाउने कि नदेखाउने"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"सुईको लम्बाइ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"घडीका सुईको लम्बाइ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"थप विशेषता"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"अङ्क र स्थिति"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"दुवै"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"कुनै पनि होइन"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"बायाँ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"दायाँ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-nl/strings.xml b/wear/wear-watchface/samples/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..3a723ac
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-nl/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rode stijl"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Groene stijl"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Kleuren"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Wijzerplaatkleuren"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rood"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Groen"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blauw"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Uurstippen"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Wel of niet tekenen"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Wijzerlengte"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Schaal van wijzers"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicaties"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Cijfer en positie"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Beide"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Geen"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Links"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Rechts"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-or/strings.xml b/wear/wear-watchface/samples/src/main/res/values-or/strings.xml
new file mode 100644
index 0000000..40da56a
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-or/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ଲାଲ୍ ଷ୍ଟାଇଲ୍"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ସବୁଜ ଷ୍ଟାଇଲ୍"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ରଙ୍ଗଗୁଡ଼ିକ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ୱାଚଫେସ୍ କଲରାଇଜେସନ୍"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ଲାଲ୍"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ସବୁଜ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ନୀଳ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ଘଣ୍ଟା ପ୍ରତି ପିପ୍ସ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ଡ୍ର କରିବେ ନା ନାହିଁ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ହ୍ୟାଣ୍ଡର ଲମ୍ବ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ୱାଚ୍ ହ୍ୟାଣ୍ଡର ସ୍କେଲ୍"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"କମ୍ପ୍ଲିକେସନ୍ସ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ନମ୍ବର ଏବଂ ଅବସ୍ଥିତି"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ଉଭୟ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"କିଛି ନାହିଁ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ବାମ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ଡାହାଣ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-pa/strings.xml b/wear/wear-watchface/samples/src/main/res/values-pa/strings.xml
new file mode 100644
index 0000000..9547d7f
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-pa/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ਲਾਲ ਸਟਾਈਲ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ਹਰਾ ਸਟਾਈਲ"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"ਰੰਗ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ਵਾਚਫੇਸ ਵਿੱਚ ਰੰਗ ਭਰਨਾ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ਲਾਲ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ਹਰਾ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"ਨੀਲਾ"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"ਘੰਟੇ ਦਾ ਚਿੰਨ੍ਹ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ਬਣਾਉਣਾ ਹੈ ਜਾਂ ਨਹੀਂ"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ਸੂਈ ਦੀ ਲੰਬਾਈ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ਘੜੀ ਦੀ ਸੂਈ ਦਾ ਸਕੇਲ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ਪੇਚੀਦਗੀਆਂ"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ਗਿਣਤੀ ਅਤੇ ਸਥਿਤੀ"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ਦੋਵੇਂ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ਕੋਈ ਨਹੀਂ"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ਖੱਬੇ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ਸੱਜੇ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-pl/strings.xml b/wear/wear-watchface/samples/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..7fd6bb5
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-pl/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Styl czerwony"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Styl zielony"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Kolory"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Kolor tarczy zegarka"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Czerwony"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zielony"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Niebieski"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Znaczniki godzin"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Ze znacznikami lub bez"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Długość wskazówek"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Długość wskazówek"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Widżety"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Liczba i pozycja"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"To i to"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Brak"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Po lewej"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Po prawej"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-pt-rBR/strings.xml b/wear/wear-watchface/samples/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..2924988
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo vermelho"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Cores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Cor do mostrador"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Vermelho"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Bipes horários"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Emitir ou não"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Tamanho dos ponteiros"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala dos ponteiros"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicações"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número e posição"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nenhuma"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Esquerda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Direita"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-pt-rPT/strings.xml b/wear/wear-watchface/samples/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..5e86680
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo vermelho"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Cores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Cor do mostrador"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Vermelho"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Sinais horários"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Desenhar ou não"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Comprim. ponteiros"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala dos ponteiros"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicações"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número e posição"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nenhuma"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Esquerda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Direita"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-pt/strings.xml b/wear/wear-watchface/samples/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000..2924988
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-pt/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Estilo vermelho"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Estilo verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Cores"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Cor do mostrador"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Vermelho"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Azul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Bipes horários"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Emitir ou não"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Tamanho dos ponteiros"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Escala dos ponteiros"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Complicações"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Número e posição"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambas"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Nenhuma"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Esquerda"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Direita"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ro/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..64c3938
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ro/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Stil roșu"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Stil verde"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Culori"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Culorile ecranului"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Roșu"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Verde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Albastru"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Marcaje orare"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Cu sau fără marcaje"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Lungimea limbilor"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Mărimea limbilor"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Funcții suplimentare"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Număr și poziție"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ambele"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Fără"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Stânga"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Dreapta"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ru/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..5a75ec7
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ru/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Красный стиль"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зеленый стиль"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Цвета"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Настройка цвета"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Красный"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Зеленый"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Синий"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Отметки часов"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Показывать или нет"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Длина стрелки"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Масштаб стрелок"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Дополнения"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Номер и позиция"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Оба"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Нет"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Слева"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Справа"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-si/strings.xml b/wear/wear-watchface/samples/src/main/res/values-si/strings.xml
new file mode 100644
index 0000000..6ac63c7
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-si/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"රතු මෝස්තරය"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"කොළ මෝස්තරය"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"වර්ණ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"ඔරලෝ. මුහු. වර්ණ ගැන්."</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"රතු"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"කොළ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"නිල්"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"පැය PIP"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"අඳින්නද එපාද"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"අතේ දිග"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ඔරලෝසු අත්වල පරිමාණය"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"සංකූලතා"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"අංකය සහ ස්ථානය"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"දෙකම"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"කිසිවක් නැත"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"වම"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"දකුණ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sk/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..dfcf826
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sk/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Červený štýl"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zelený štýl"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Farby"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Sfarbenie vzhľadu"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Červená"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelená"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Modrá"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Tón oznamuj. hodinu"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Či má byť vykreslený"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Dĺžka ručičky"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Mierka hod. ručičiek"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Súčiastky"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Číslo a pozícia"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Obe"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Žiadne"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vľavo"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Vpravo"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sl/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..29c6548
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sl/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Rdeči slog"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Zeleni slog"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Barve"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Obarvanje številčnice"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Rdeča"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Zelena"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Modra"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Urne oznake"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Ali naj bodo izrisane"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Dolžina kazalcev"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Velikost kazalcev"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Obogatitve"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Številka in položaj"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Oboje"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Brez"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Levo"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Desno"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sq/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sq/strings.xml
new file mode 100644
index 0000000..96b4ca1
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sq/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Stili ngjyrë e kuqe"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Stili ngjyrë jeshile"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Ngjyrat"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Ngjyra e fushës së orës"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"E kuqe"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Jeshile"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blu"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Shënuesit e orëve"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Shfaq ose jo shënuesit"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Gjatësia e akrepit"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Gjatësia e akrepave"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Ndërlikimet"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Numri dhe pozicioni"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Të dyja"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Asnjë"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Majtas"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Djathtas"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sr/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sr/strings.xml
new file mode 100644
index 0000000..ea2c244
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sr/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Црвени стил"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зелени стил"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Боје"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Бојење бројчаника"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Црвена"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Зелена"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Плава"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Звучни сигнали сата"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Активирано или не"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Дужина руке"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Размера руке сата"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Компликације"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Број и положај"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Оба"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Ниједна"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Лева"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Десна"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sv/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..aa0e541
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sv/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Röd design"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Grön design"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Färger"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Färg på urtavla"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Röd"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Grön"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Blå"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Timmarkörer"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Om markörer ska visas"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Visarlängd"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Visarnas skala"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Komplikationer"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Siffra och position"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Båda"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Inga"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Vänster"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Höger"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-sw/strings.xml b/wear/wear-watchface/samples/src/main/res/values-sw/strings.xml
new file mode 100644
index 0000000..c4ea0b0
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-sw/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Muundo Mwekundu"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Muundo wa Kijani"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Rangi"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Kutia rangi kwenye sura ya saa"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Nyekundu"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Kijani"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Samawati"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Alama za Kuonyesha Saa"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Iwapo tutachora au la"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Urefu wa mkono"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Urefu wa mikono ya saa"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Madoido"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Nambari na nafasi"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Zote mbili"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Hamna"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Kushoto"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Kulia"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ta/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000..05370f2
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ta/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"சிவப்பு நிற ஸ்டைல்"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"பச்சை நிற ஸ்டைல்"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"நிறங்கள்"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"வாட்ச் முகப்பு நிறம்"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"சிவப்பு"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"பச்சை"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"நீலம்"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"மணிநேர இடைவெளிக்கோடு"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"வரையவா வேண்டாமா"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"முள்ளின் நீளம்"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"வாட்ச் முள்ளின் அளவு"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"காட்சிப்பகுதிகள்"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"எண் மற்றும் நிலை"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"இரண்டும்"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"எதுவுமில்லை"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"இடது"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"வலது"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-te/strings.xml b/wear/wear-watchface/samples/src/main/res/values-te/strings.xml
new file mode 100644
index 0000000..145181f
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-te/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ఎరుపు స్టయిల్"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"ఆకుపచ్చ స్టయిల్"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"రంగులు"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"వాచ్ లుక్ కలరైజేషన్"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"ఎరుపు"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"ఆకుపచ్చ"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"నీలం"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"గంట గుర్తులు"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"డ్రా చేయాలా వద్దా"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"హాండ్ పొడవు"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"వాచ్ హ్యాండ్ కొలతలు"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"సంక్లిష్టతలు"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"నంబర్, స్థానం"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"రెండూ"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ఏదీ కాదు"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ఎడమ"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"కుడి"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-th/strings.xml b/wear/wear-watchface/samples/src/main/res/values-th/strings.xml
new file mode 100644
index 0000000..001cc4b
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-th/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"รูปแบบสีแดง"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"รูปแบบสีเขียว"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"สี"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"เปลี่ยนสีหน้าปัด"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"แดง"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"เขียว"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"น้ำเงิน"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"เสียงพิปบอกชั่วโมง"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ให้ส่งเสียงหรือไม่"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"ความยาวเข็มนาฬิกา"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"ปรับขนาดเข็มนาฬิกา"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"ข้อมูลแทรก"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"ตัวเลขและตำแหน่ง"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"ทั้งคู่"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"ไม่มี"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"ซ้าย"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"ขวา"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-tl/strings.xml b/wear/wear-watchface/samples/src/main/res/values-tl/strings.xml
new file mode 100644
index 0000000..c478123
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-tl/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Pulang Istilo"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Berdeng Istilo"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Mga Kulay"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Colorization ng watchface"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Pula"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Berde"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Asul"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Pips ng Oras"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Mag-draw o hindi"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Haba ng kamay"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Scale ng kamay ng relo"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Mga Complication"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Numero at posisyon"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Pareho"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Wala"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Kaliwa"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Kanan"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-tr/strings.xml b/wear/wear-watchface/samples/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000..950e1d4
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-tr/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Kırmızı Stil"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Yeşil Stil"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Renkler"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Kadran renklendirme"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Kırmızı"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Yeşil"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Mavi"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Saat Noktaları"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Çizilip çizilmeyeceği"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"İbre uzunluğu"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"İbre ölçeği"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Özellikler"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Sayı ve konum"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Her ikisi de"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Yok"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Sol"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Sağ"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-uk/strings.xml b/wear/wear-watchface/samples/src/main/res/values-uk/strings.xml
new file mode 100644
index 0000000..57f27a5
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-uk/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Червоний стиль"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Зелений стиль"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Кольори"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Кольори циферблата"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Червоний"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Зелений"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Синій"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Позначки годин"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Позначати чи ні"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Довжина стрілок"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Розмір стрілок"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Додаткові функції"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"К-сть і положення"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Обидві"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Немає"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Ліва"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Права"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-ur/strings.xml b/wear/wear-watchface/samples/src/main/res/values-ur/strings.xml
new file mode 100644
index 0000000..ead0e00
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-ur/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"ریڈ اسٹائل"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"گرین اسٹائل"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"رنگ"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"واچ فیس کو رنگنا"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"سرخ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"سبز"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"نیلا"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"گھنٹے کے نشانات"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"ڈرا کریں یا نہ کریں"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"واچ ہینڈ کی لمبائی"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"واچ ہینڈز کا اسکیل"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"پیچیدگیاں"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"نمبر اور پوزیشن"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"دونوں"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"کوئی نہیں"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"بائیں"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"دائیں"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-uz/strings.xml b/wear/wear-watchface/samples/src/main/res/values-uz/strings.xml
new file mode 100644
index 0000000..9c891db
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-uz/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Qizil tusli"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Yashil tusli"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Ranglar"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Soat yuzi ranglari"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Qizil"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Yashil"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Koʻk"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Soat belgisi"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Belgilanishi"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Mil uzunligi"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Mil oʻlchamlari"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Kengaytmalar"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Raqam va joylashuv"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Ikkalasi"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Hech qanday"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Chap"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Oʻng"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-vi/strings.xml b/wear/wear-watchface/samples/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..85f44c9
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-vi/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Kiểu màu đỏ"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Kiểu màu xanh lục"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Màu"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Chỉnh màu mặt đồng hồ"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Đỏ"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Xanh lục"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Xanh dương"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Vạch chỉ giờ"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Vẽ hoặc không"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Độ dài kim đồng hồ"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Tỷ lệ kim đồng hồ"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Chức năng"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Số và vị trí"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Cả hai"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Không có"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Trái"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Phải"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-zh-rCN/strings.xml b/wear/wear-watchface/samples/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..d76f389
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"红色样式"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"绿色样式"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"颜色"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"设置表盘颜色"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"红色"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"绿色"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"蓝色"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"小时刻度"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"是否绘制小时刻度"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"指针长度"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"手表指针长度"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"复杂功能"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"数字和位置"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"两者"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"无"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"左"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"右"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-zh-rHK/strings.xml b/wear/wear-watchface/samples/src/main/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..e0b8177
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-zh-rHK/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"紅色樣式"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"綠色樣式"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"顏色"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"設定錶面顏色"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"紅色"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"綠色"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"藍色"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"小時刻度"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"是否顯示小時刻度"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"指針長度"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"手錶指針長度"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"進階功能"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"數字和位置"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"左右兩邊"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"無"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"左"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"右"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-zh-rTW/strings.xml b/wear/wear-watchface/samples/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..d171624
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"紅色樣式"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"綠色樣式"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"顏色"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"設定錶面顏色"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"紅色"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"綠色"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"藍色"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"小時刻度"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"是否顯示小時刻度"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"指針長度"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"手錶指針的長度"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"資料顯示區"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"數字和位置"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"左右兩邊"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"無"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"左"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"右"</string>
+</resources>
diff --git a/wear/wear-watchface/samples/src/main/res/values-zu/strings.xml b/wear/wear-watchface/samples/src/main/res/values-zu/strings.xml
new file mode 100644
index 0000000..2d945d7
--- /dev/null
+++ b/wear/wear-watchface/samples/src/main/res/values-zu/strings.xml
@@ -0,0 +1,37 @@
+<?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.
+   -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="red_style_name" msgid="3422019812492418917">"Isitayela Esibomvu"</string>
+    <string name="green_style_name" msgid="1807715891527319248">"Isitayela Esiluhlaza okotshani"</string>
+    <string name="colors_style_setting" msgid="7410336396317170889">"Imibala"</string>
+    <string name="colors_style_setting_description" msgid="4961811355700378894">"Imibala Yobuso bewashi"</string>
+    <string name="colors_style_red" msgid="1284998271677973320">"Okubomvu"</string>
+    <string name="colors_style_green" msgid="1327609154689015139">"Okuluhlaza okotshani"</string>
+    <string name="colors_style_blue" msgid="8619157586474982343">"Okuluhlaza okwesibhakabhaka"</string>
+    <string name="watchface_pips_setting" msgid="486515623723087644">"Ihora le-Pips"</string>
+    <string name="watchface_pips_setting_description" msgid="651887190185401130">"Ukuthi udwebe noma cha"</string>
+    <string name="watchface_hand_length_setting" msgid="7998526424509601034">"Ubude besandla"</string>
+    <string name="watchface_hand_length_setting_description" msgid="9060532706860425059">"Isikali sezandla zewashi"</string>
+    <string name="watchface_complications_setting" msgid="7605635862096204587">"Izinkinga"</string>
+    <string name="watchface_complications_setting_description" msgid="3565604049641117847">"Inani nesikhundla"</string>
+    <string name="watchface_complications_setting_both" msgid="1869848592349112126">"Kokubili"</string>
+    <string name="watchface_complications_setting_none" msgid="722694346696596744">"Lutho"</string>
+    <string name="watchface_complications_setting_left" msgid="1623162625339223972">"Ngakwesokunxele"</string>
+    <string name="watchface_complications_setting_right" msgid="3310633126129770902">"Ngakwesokudla"</string>
+</resources>
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
index f00e321..6ec3b4b 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlServiceTest.kt
@@ -20,7 +20,6 @@
 import android.content.Context
 import android.content.Intent
 import android.graphics.Canvas
-import android.graphics.Color
 import android.graphics.Rect
 import android.icu.util.Calendar
 import android.os.Handler
@@ -32,6 +31,7 @@
 import androidx.test.filters.MediumTest
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.CanvasType
@@ -57,6 +57,7 @@
 import androidx.wear.watchface.samples.ExampleOpenGLWatchFaceService
 import androidx.wear.watchface.style.CurrentUserStyleRepository
 import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.android.asCoroutineDispatcher
@@ -88,6 +89,12 @@
                 16
             ) {
                 override fun render(canvas: Canvas, bounds: Rect, calendar: Calendar) {}
+
+                override fun renderHighlightLayer(
+                    canvas: Canvas,
+                    bounds: Rect,
+                    calendar: Calendar
+                ) {}
             }
         )
     }
@@ -160,9 +167,8 @@
                 WatchFaceRenderParams(
                     RenderParameters(
                         DrawMode.INTERACTIVE,
-                        RenderParameters.DRAW_ALL_LAYERS,
-                        null,
-                        Color.RED
+                        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                        null
                     ).toWireFormat(),
                     1234567890,
                     null,
@@ -170,7 +176,8 @@
                         IdAndComplicationDataWireFormat(
                             EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
                             ShortTextComplicationData.Builder(
-                                PlainComplicationText.Builder("Mon").build()
+                                PlainComplicationText.Builder("Mon").build(),
+                                ComplicationText.EMPTY
                             )
                                 .setTitle(PlainComplicationText.Builder("23rd").build())
                                 .build()
@@ -179,7 +186,8 @@
                         IdAndComplicationDataWireFormat(
                             EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
                             ShortTextComplicationData.Builder(
-                                PlainComplicationText.Builder("100").build()
+                                PlainComplicationText.Builder("100").build(),
+                                ComplicationText.EMPTY
                             )
                                 .setTitle(PlainComplicationText.Builder("Steps").build())
                                 .build()
@@ -203,9 +211,8 @@
                 WatchFaceRenderParams(
                     RenderParameters(
                         DrawMode.INTERACTIVE,
-                        RenderParameters.DRAW_ALL_LAYERS,
-                        null,
-                        Color.RED
+                        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                        null
                     ).toWireFormat(),
                     1234567890,
                     null,
@@ -213,7 +220,8 @@
                         IdAndComplicationDataWireFormat(
                             EXAMPLE_OPENGL_COMPLICATION_ID,
                             ShortTextComplicationData.Builder(
-                                PlainComplicationText.Builder("Mon").build()
+                                PlainComplicationText.Builder("Mon").build(),
+                                ComplicationText.EMPTY
                             )
                                 .setTitle(PlainComplicationText.Builder("23rd").build())
                                 .build()
@@ -238,12 +246,14 @@
                     EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
                     RenderParameters(
                         DrawMode.AMBIENT,
-                        RenderParameters.DRAW_ALL_LAYERS,
+                        WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
                         null,
-                        Color.RED
                     ).toWireFormat(),
                     123456789,
-                    ShortTextComplicationData.Builder(PlainComplicationText.Builder("Mon").build())
+                    ShortTextComplicationData.Builder(
+                        PlainComplicationText.Builder("Mon").build(),
+                        ComplicationText.EMPTY
+                    )
                         .setTitle(PlainComplicationText.Builder("23rd").build())
                         .build()
                         .asWireComplicationData(),
diff --git a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
index 46ff4a8..bca8d09 100644
--- a/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
+++ b/wear/wear-watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
@@ -38,16 +38,17 @@
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
 import androidx.wear.complications.SystemProviders
+import androidx.wear.complications.data.ComplicationText
 import androidx.wear.complications.data.PlainComplicationText
 import androidx.wear.complications.data.ShortTextComplicationData
 import androidx.wear.watchface.DrawMode
-import androidx.wear.watchface.LayerMode
 import androidx.wear.watchface.RenderParameters
 import androidx.wear.watchface.TapType
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.InteractiveInstanceManager
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.data.DeviceConfig
@@ -57,10 +58,11 @@
 import androidx.wear.watchface.samples.EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
 import androidx.wear.watchface.samples.EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
 import androidx.wear.watchface.samples.GREEN_STYLE
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
+import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -109,7 +111,7 @@
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
-class WatchFaceServiceImageTest {
+public class WatchFaceServiceImageTest {
 
     @Mock
     private lateinit var surfaceHolder: SurfaceHolder
@@ -120,8 +122,11 @@
     private val handler = Handler(Looper.getMainLooper())
 
     private val complicationProviders = mapOf(
-        SystemProviders.DAY_OF_WEEK to
-            ShortTextComplicationData.Builder(PlainComplicationText.Builder("Mon").build())
+        SystemProviders.PROVIDER_DAY_OF_WEEK to
+            ShortTextComplicationData.Builder(
+                PlainComplicationText.Builder("Mon").build(),
+                ComplicationText.EMPTY
+            )
                 .setTitle(PlainComplicationText.Builder("23rd").build())
                 .setTapAction(
                     PendingIntent.getActivity(
@@ -137,15 +142,19 @@
                 )
                 .build()
                 .asWireComplicationData(),
-        SystemProviders.STEP_COUNT to
-            ShortTextComplicationData.Builder(PlainComplicationText.Builder("100").build())
+        SystemProviders.PROVIDER_STEP_COUNT to
+            ShortTextComplicationData.Builder(
+                PlainComplicationText.Builder("100").build(),
+                ComplicationText.EMPTY
+            )
                 .setTitle(PlainComplicationText.Builder("Steps").build())
                 .build()
                 .asWireComplicationData()
     )
 
     @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule("wear/wear-watchface")
+    public val screenshotRule: AndroidXScreenshotTestRule =
+        AndroidXScreenshotTestRule("wear/wear-watchface")
 
     private val bitmap = Bitmap.createBitmap(BITMAP_WIDTH, BITMAP_HEIGHT, Bitmap.Config.ARGB_8888)
     private val canvas = Canvas(bitmap)
@@ -160,15 +169,20 @@
     private lateinit var interactiveWatchFaceInstance: IInteractiveWatchFace
 
     @Before
-    fun setUp() {
+    public fun setUp() {
         MockitoAnnotations.initMocks(this)
     }
 
     @After
-    fun shutDown() {
-        if (this::interactiveWatchFaceInstance.isInitialized) {
-            interactiveWatchFaceInstance.release()
+    public fun shutDown() {
+        val latch = CountDownLatch(1)
+        handler.post {
+            if (this::interactiveWatchFaceInstance.isInitialized) {
+                interactiveWatchFaceInstance.release()
+            }
+            latch.countDown()
         }
+        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
     }
 
     private fun initCanvasWatchFace() {
@@ -261,6 +275,10 @@
                                 initLatch.countDown()
                             }
                         }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
+                            fail("WatchFace crashed: $exception")
+                        }
                     }
                 )
             )
@@ -301,7 +319,7 @@
     }
 
     @Test
-    fun testActiveScreenshot() {
+    public fun testActiveScreenshot() {
         handler.post(this::initCanvasWatchFace)
         initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         handler.post {
@@ -313,7 +331,7 @@
     }
 
     @Test
-    fun testAmbientScreenshot() {
+    public fun testAmbientScreenshot() {
         handler.post(this::initCanvasWatchFace)
         initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         handler.post {
@@ -326,7 +344,7 @@
     }
 
     @Test
-    fun testCommandTakeScreenShot() {
+    public fun testCommandTakeScreenShot() {
         val latch = CountDownLatch(1)
         handler.post(this::initCanvasWatchFace)
         initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
@@ -337,9 +355,8 @@
                     WatchFaceRenderParams(
                         RenderParameters(
                             DrawMode.AMBIENT,
-                            RenderParameters.DRAW_ALL_LAYERS,
-                            null,
-                            Color.RED
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            null
                         ).toWireFormat(),
                         123456789,
                         null,
@@ -358,7 +375,7 @@
     }
 
     @Test
-    fun testCommandTakeOpenGLScreenShot() {
+    public fun testCommandTakeOpenGLScreenShot() {
         val latch = CountDownLatch(1)
 
         handler.post(this::initGles2WatchFace)
@@ -370,9 +387,8 @@
                     WatchFaceRenderParams(
                         RenderParameters(
                             DrawMode.INTERACTIVE,
-                            RenderParameters.DRAW_ALL_LAYERS,
-                            null,
-                            Color.RED
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            null
                         ).toWireFormat(),
                         123456789,
                         null,
@@ -391,7 +407,7 @@
     }
 
     @Test
-    fun testSetGreenStyle() {
+    public fun testSetGreenStyle() {
         handler.post(this::initCanvasWatchFace)
         initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         handler.post {
@@ -408,7 +424,7 @@
     }
 
     @Test
-    fun testHighlightAllComplicationsInScreenshot() {
+    public fun testHighlightAllComplicationsInScreenshot() {
         val latch = CountDownLatch(1)
 
         handler.post(this::initCanvasWatchFace)
@@ -420,13 +436,12 @@
                     WatchFaceRenderParams(
                         RenderParameters(
                             DrawMode.INTERACTIVE,
-                            mapOf(
-                                Layer.BASE to LayerMode.DRAW,
-                                Layer.COMPLICATIONS to LayerMode.DRAW_OUTLINED,
-                                Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-                            ),
-                            null,
-                            Color.RED
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            RenderParameters.HighlightLayer(
+                                RenderParameters.HighlightedElement.AllComplications,
+                                Color.RED,
+                                Color.argb(128, 0, 0, 0)
+                            )
                         ).toWireFormat(),
                         123456789,
                         null,
@@ -445,7 +460,7 @@
     }
 
     @Test
-    fun testHighlightRightComplicationInScreenshot() {
+    public fun testHighlightRightComplicationInScreenshot() {
         val latch = CountDownLatch(1)
 
         handler.post(this::initCanvasWatchFace)
@@ -457,13 +472,14 @@
                     WatchFaceRenderParams(
                         RenderParameters(
                             DrawMode.INTERACTIVE,
-                            mapOf(
-                                Layer.BASE to LayerMode.DRAW,
-                                Layer.COMPLICATIONS to LayerMode.DRAW_OUTLINED,
-                                Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-                            ),
-                            EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                            Color.RED
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            RenderParameters.HighlightLayer(
+                                RenderParameters.HighlightedElement.Complication(
+                                    EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID
+                                ),
+                                Color.RED,
+                                Color.argb(128, 0, 0, 0)
+                            )
                         ).toWireFormat(),
                         123456789,
                         null,
@@ -482,19 +498,25 @@
     }
 
     @Test
-    fun testScreenshotWithPreviewComplicationData() {
+    public fun testScreenshotWithPreviewComplicationData() {
         val latch = CountDownLatch(1)
         val previewComplicationData = listOf(
             IdAndComplicationDataWireFormat(
                 EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID,
-                ShortTextComplicationData.Builder(PlainComplicationText.Builder("A").build())
+                ShortTextComplicationData.Builder(
+                    PlainComplicationText.Builder("A").build(),
+                    ComplicationText.EMPTY
+                )
                     .setTitle(PlainComplicationText.Builder("Preview").build())
                     .build()
                     .asWireComplicationData()
             ),
             IdAndComplicationDataWireFormat(
                 EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID,
-                ShortTextComplicationData.Builder(PlainComplicationText.Builder("B").build())
+                ShortTextComplicationData.Builder(
+                    PlainComplicationText.Builder("B").build(),
+                    ComplicationText.EMPTY
+                )
                     .setTitle(PlainComplicationText.Builder("Preview").build())
                     .build()
                     .asWireComplicationData()
@@ -512,9 +534,8 @@
                     WatchFaceRenderParams(
                         RenderParameters(
                             DrawMode.INTERACTIVE,
-                            RenderParameters.DRAW_ALL_LAYERS,
-                            null,
-                            Color.RED
+                            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                            null
                         ).toWireFormat(),
                         123456789,
                         null,
@@ -533,7 +554,7 @@
     }
 
     @Test
-    fun directBoot() {
+    public fun directBoot() {
         Mockito.`when`(surfaceHolder.surfaceFrame)
             .thenReturn(Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT))
         Mockito.`when`(surfaceHolder.lockHardwareCanvas()).thenReturn(canvas)
@@ -586,12 +607,17 @@
         try {
             bitmap.assertAgainstGolden(screenshotRule, "direct_boot")
         } finally {
-            engineWrapper.onDestroy()
+            val latch = CountDownLatch(1)
+            handler.post {
+                engineWrapper.onDestroy()
+                latch.countDown()
+            }
+            latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
         }
     }
 
     @Test
-    fun complicationTapLaunchesActivity() {
+    public fun complicationTapLaunchesActivity() {
         handler.post(this::initCanvasWatchFace)
 
         ComplicationTapActivity.newCountDown()
diff --git a/wear/wear-watchface/src/main/AndroidManifest.xml b/wear/wear-watchface/src/main/AndroidManifest.xml
index d41e9a8..17820ae 100644
--- a/wear/wear-watchface/src/main/AndroidManifest.xml
+++ b/wear/wear-watchface/src/main/AndroidManifest.xml
@@ -25,7 +25,9 @@
   <application>
     <uses-library android:name="com.google.android.wearable" android:required="false" />
     <service
-        android:name="androidx.wear.watchface.control.WatchFaceControlService">
+        android:name="androidx.wear.watchface.control.WatchFaceControlService"
+        android:enabled="@bool/watch_face_instance_service_enabled"
+        android:permission="com.google.android.wearable.permission.BIND_WATCH_FACE_CONTROL">
       <meta-data android:name="androidx.wear.watchface.api_version" android:value="3" />
       <intent-filter>
         <action android:name="com.google.android.wearable.action.WATCH_FACE_CONTROL"/>
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastReceivers.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastReceivers.kt
deleted file mode 100644
index aa104ef..0000000
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastReceivers.kt
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface
-
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import androidx.annotation.UiThread
-import androidx.annotation.VisibleForTesting
-
-/**
- * All watchface instances share the same [Context] which is a problem for broadcast receivers
- * because the OS will mistakenly believe we're leaking them if there's more than one instance. So
- * we need to use this class to share them.
- */
-internal class BroadcastReceivers private constructor(private val context: Context) {
-
-    interface BroadcastEventObserver {
-        /** Called when we receive [Intent.ACTION_TIME_TICK]. */
-        @UiThread
-        fun onActionTimeTick()
-
-        /** Called when we receive [Intent.ACTION_TIMEZONE_CHANGED]. */
-        @UiThread
-        fun onActionTimeZoneChanged()
-
-        /** Called when we receive [Intent.ACTION_TIME_CHANGED]. */
-        @UiThread
-        fun onActionTimeChanged()
-
-        /** Called when we receive [Intent.ACTION_BATTERY_LOW]. */
-        @UiThread
-        fun onActionBatteryLow()
-
-        /** Called when we receive [Intent.ACTION_BATTERY_OKAY]. */
-        @UiThread
-        fun onActionBatteryOkay()
-
-        /** Called when we receive [Intent.ACTION_POWER_CONNECTED]. */
-        @UiThread
-        fun onActionPowerConnected()
-
-        /** Called when we receive [WatchFaceImpl.MOCK_TIME_INTENT]. */
-        @UiThread
-        fun onMockTime(intent: Intent)
-    }
-
-    companion object {
-        val broadcastEventObservers = HashSet<BroadcastEventObserver>()
-
-        /* We don't leak due to balanced calls to[addBroadcastEventObserver] and
-        [removeBroadcastEventObserver] which sets this back to null.
-         */
-        @SuppressWarnings("StaticFieldLeak")
-        var broadcastReceivers: BroadcastReceivers? = null
-
-        @UiThread
-        fun addBroadcastEventObserver(context: Context, observer: BroadcastEventObserver) {
-            broadcastEventObservers.add(observer)
-            if (broadcastReceivers == null) {
-                broadcastReceivers = BroadcastReceivers(context)
-            }
-        }
-
-        @UiThread
-        fun removeBroadcastEventObserver(observer: BroadcastEventObserver) {
-            broadcastEventObservers.remove(observer)
-            if (broadcastEventObservers.isEmpty()) {
-                broadcastReceivers!!.onDestroy()
-                broadcastReceivers = null
-            }
-        }
-
-        @VisibleForTesting
-        fun sendOnActionBatteryLowForTesting(intent: Intent) {
-            require(intent.action == Intent.ACTION_BATTERY_LOW)
-            require(broadcastEventObservers.isNotEmpty())
-            for (observer in broadcastEventObservers) {
-                observer.onActionBatteryLow()
-            }
-        }
-
-        @VisibleForTesting
-        fun sendOnActionBatteryOkayForTesting(intent: Intent) {
-            require(intent.action == Intent.ACTION_BATTERY_OKAY)
-            require(broadcastEventObservers.isNotEmpty())
-            for (observer in broadcastEventObservers) {
-                observer.onActionBatteryOkay()
-            }
-        }
-
-        @VisibleForTesting
-        fun sendOnActionPowerConnectedForTesting(intent: Intent) {
-            require(intent.action == Intent.ACTION_POWER_CONNECTED)
-            require(broadcastEventObservers.isNotEmpty())
-            for (observer in broadcastEventObservers) {
-                observer.onActionPowerConnected()
-            }
-        }
-
-        @VisibleForTesting
-        fun sendOnMockTimeForTesting(intent: Intent) {
-            require(intent.action == WatchFaceImpl.MOCK_TIME_INTENT)
-            require(broadcastEventObservers.isNotEmpty())
-            for (observer in broadcastEventObservers) {
-                observer.onMockTime(intent)
-            }
-        }
-    }
-
-    private val actionTimeTickReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionTimeTick()
-            }
-        }
-    }
-
-    private val actionTimeZoneReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionTimeZoneChanged()
-            }
-        }
-    }
-
-    private val actionTimeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        override fun onReceive(context: Context?, intent: Intent?) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionTimeChanged()
-            }
-        }
-    }
-
-    private val actionBatteryLowReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionBatteryLow()
-            }
-        }
-    }
-
-    private val actionBatteryOkayReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionBatteryOkay()
-            }
-        }
-    }
-
-    private val actionPowerConnectedReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onActionPowerConnected()
-            }
-        }
-    }
-
-    private val mockTimeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
-        @SuppressWarnings("SyntheticAccessor")
-        override fun onReceive(context: Context, intent: Intent) {
-            for (observer in broadcastEventObservers) {
-                observer.onMockTime(intent)
-            }
-        }
-    }
-
-    init {
-        context.registerReceiver(actionTimeTickReceiver, IntentFilter(Intent.ACTION_TIME_TICK))
-        context.registerReceiver(
-            actionTimeZoneReceiver,
-            IntentFilter(Intent.ACTION_TIMEZONE_CHANGED)
-        )
-        context.registerReceiver(actionTimeReceiver, IntentFilter(Intent.ACTION_TIME_CHANGED))
-        context.registerReceiver(actionBatteryLowReceiver, IntentFilter(Intent.ACTION_BATTERY_LOW))
-        context.registerReceiver(
-            actionBatteryOkayReceiver,
-            IntentFilter(Intent.ACTION_BATTERY_OKAY)
-        )
-        context.registerReceiver(
-            actionPowerConnectedReceiver,
-            IntentFilter(Intent.ACTION_POWER_CONNECTED)
-        )
-        context.registerReceiver(mockTimeReceiver, IntentFilter(WatchFaceImpl.MOCK_TIME_INTENT))
-    }
-
-    fun onDestroy() {
-        context.unregisterReceiver(actionTimeTickReceiver)
-        context.unregisterReceiver(actionTimeZoneReceiver)
-        context.unregisterReceiver(actionTimeReceiver)
-        context.unregisterReceiver(actionBatteryLowReceiver)
-        context.unregisterReceiver(actionBatteryOkayReceiver)
-        context.unregisterReceiver(actionPowerConnectedReceiver)
-        context.unregisterReceiver(mockTimeReceiver)
-    }
-}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
new file mode 100644
index 0000000..cc6675a
--- /dev/null
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import androidx.annotation.UiThread
+
+/**
+ * This class decouples [BroadcastEventObserver]s from the actual broadcast event receivers to make
+ * testing easier.
+ */
+internal class BroadcastsReceiver constructor(
+    private val context: Context,
+    private val observer: BroadcastEventObserver
+) {
+
+    interface BroadcastEventObserver {
+        /** Called when we receive [Intent.ACTION_TIME_TICK]. */
+        @UiThread
+        fun onActionTimeTick()
+
+        /** Called when we receive [Intent.ACTION_TIMEZONE_CHANGED]. */
+        @UiThread
+        fun onActionTimeZoneChanged()
+
+        /** Called when we receive [Intent.ACTION_TIME_CHANGED]. */
+        @UiThread
+        fun onActionTimeChanged()
+
+        /** Called when we receive [Intent.ACTION_BATTERY_LOW]. */
+        @UiThread
+        fun onActionBatteryLow()
+
+        /** Called when we receive [Intent.ACTION_BATTERY_OKAY]. */
+        @UiThread
+        fun onActionBatteryOkay()
+
+        /** Called when we receive [Intent.ACTION_POWER_CONNECTED]. */
+        @UiThread
+        fun onActionPowerConnected()
+
+        /** Called when we receive [WatchFaceImpl.MOCK_TIME_INTENT]. */
+        @UiThread
+        fun onMockTime(intent: Intent)
+    }
+
+    internal val actionTimeTickReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionTimeTick()
+        }
+    }
+
+    internal val actionTimeZoneReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionTimeZoneChanged()
+        }
+    }
+
+    internal val actionTimeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent?) {
+            observer.onActionTimeChanged()
+        }
+    }
+
+    internal val actionBatteryLowReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionBatteryLow()
+        }
+    }
+
+    internal val actionBatteryOkayReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionBatteryOkay()
+        }
+    }
+
+    internal val actionPowerConnectedReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionPowerConnected()
+        }
+    }
+
+    internal val mockTimeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onMockTime(intent)
+        }
+    }
+
+    init {
+        context.registerReceiver(actionTimeTickReceiver, IntentFilter(Intent.ACTION_TIME_TICK))
+        context.registerReceiver(
+            actionTimeZoneReceiver,
+            IntentFilter(Intent.ACTION_TIMEZONE_CHANGED)
+        )
+        context.registerReceiver(actionTimeReceiver, IntentFilter(Intent.ACTION_TIME_CHANGED))
+        context.registerReceiver(actionBatteryLowReceiver, IntentFilter(Intent.ACTION_BATTERY_LOW))
+        context.registerReceiver(
+            actionBatteryOkayReceiver,
+            IntentFilter(Intent.ACTION_BATTERY_OKAY)
+        )
+        context.registerReceiver(
+            actionPowerConnectedReceiver,
+            IntentFilter(Intent.ACTION_POWER_CONNECTED)
+        )
+        context.registerReceiver(mockTimeReceiver, IntentFilter(WatchFaceImpl.MOCK_TIME_INTENT))
+    }
+
+    fun onDestroy() {
+        context.unregisterReceiver(actionTimeTickReceiver)
+        context.unregisterReceiver(actionTimeZoneReceiver)
+        context.unregisterReceiver(actionTimeReceiver)
+        context.unregisterReceiver(actionBatteryLowReceiver)
+        context.unregisterReceiver(actionBatteryOkayReceiver)
+        context.unregisterReceiver(actionPowerConnectedReceiver)
+        context.unregisterReceiver(mockTimeReceiver)
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
index 1ad45e5..09eca33 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Complication.kt
@@ -16,84 +16,35 @@
 
 package androidx.wear.watchface
 
-import android.annotation.SuppressLint
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.graphics.RectF
 import android.graphics.drawable.Drawable
 import android.icu.util.Calendar
 import android.os.Bundle
-import androidx.annotation.CallSuper
 import androidx.annotation.ColorInt
 import androidx.annotation.Px
+import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
 import androidx.wear.complications.ComplicationBounds
 import androidx.wear.complications.DefaultComplicationProviderPolicy
 import androidx.wear.complications.data.ComplicationData
 import androidx.wear.complications.data.ComplicationType
-import androidx.wear.utility.TraceEvent
-import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.data.ComplicationBoundsType
-import androidx.wear.watchface.style.Layer
 import androidx.wear.watchface.style.UserStyleSetting
 import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting
+import androidx.wear.watchface.style.UserStyleSetting.ComplicationsUserStyleSetting.ComplicationOverlay
+import androidx.wear.watchface.RenderParameters.HighlightedElement
 
-/**
- * A complication rendered with [ComplicationDrawable] which renders complications in a material
- * design style. This renderer can't be shared by multiple complications.
- *
- * @param _drawable The [ComplicationDrawable] to render with.
- * @param watchState The watch's [WatchState] which contains details pertaining to (low-bit) ambient
- *     mode and burn in protection needed to render correctly.
- */
-public open class CanvasComplicationDrawable(
-    _drawable: ComplicationDrawable,
-    private val watchState: WatchState
-) {
-    init {
-        _drawable.callback = object :
-            Drawable.Callback {
-            override fun unscheduleDrawable(who: Drawable, what: Runnable) {}
-
-            @SuppressLint("SyntheticAccessor")
-            override fun invalidateDrawable(who: Drawable) {
-                attachedComplication?.invalidate()
-            }
-
-            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {}
-        }
-    }
-
-    /** The [ComplicationDrawable] to render with. */
-    public var drawable: ComplicationDrawable = _drawable
-        set(value) {
-            // Copy the ComplicationData otherwise the complication will be blank until the next
-            // update.
-            value.setComplicationData(field.complicationData, false)
-            field = value
-            value.isInAmbientMode = watchState.isAmbient.value
-            value.isLowBitAmbient = watchState.hasLowBitAmbient
-            value.setBurnInProtection(watchState.hasBurnInProtection)
-
-            attachedComplication?.scheduleUpdateComplications()
-        }
-
-    private val isAmbientObserver = Observer<Boolean> {
-        drawable.isInAmbientMode = it
-    }
-
-    private var attachedComplication: Complication? = null
-
+/** Interface for rendering complications onto a [Canvas]. */
+public interface CanvasComplication {
     /**
      * Called when the CanvasComplication attaches to a [Complication]. This will get called during
      * [Complication] initialization and if [Complication.renderer] is assigned with this
      * CanvasComplication.
      */
     @UiThread
-    public fun onAttach(complication: Complication) {
-        attachedComplication = complication
-        watchState.isAmbient.addObserver(isAmbientObserver)
-    }
+    public fun onAttach(complication: Complication)
 
     /**
      * Draws the complication defined by [getData] into the canvas with the specified bounds.
@@ -105,102 +56,57 @@
      * @param bounds A [Rect] describing the bounds of the complication
      * @param calendar The current [Calendar]
      * @param renderParameters The current [RenderParameters]
-     * @param complicationId The Id of the parent [Complication]
      */
     @UiThread
-    public open fun render(
+    public fun render(
         canvas: Canvas,
         bounds: Rect,
         calendar: Calendar,
-        renderParameters: RenderParameters,
-        complicationId: Int
-    ) {
-        when (renderParameters.layerParameters[Layer.COMPLICATIONS]) {
-            LayerMode.DRAW -> {
-                drawable.bounds = bounds
-                drawable.currentTimeMillis = calendar.timeInMillis
-                drawable.draw(canvas)
-            }
-            LayerMode.DRAW_OUTLINED -> {
-                drawable.bounds = bounds
-                drawable.currentTimeMillis = calendar.timeInMillis
-                val wasHighlighted = drawable.isHighlighted
-                drawable.isHighlighted = renderParameters.selectedComplicationId == complicationId
-                drawable.draw(canvas)
-                drawable.isHighlighted = wasHighlighted
-
-                // It's only sensible to render a highlight for non-background, non-fixed
-                // complications.
-                if (!attachedComplication!!.fixedComplicationProvider) {
-                    drawOutline(canvas, bounds, calendar, renderParameters.outlineTint)
-                }
-            }
-            LayerMode.HIDE -> return
-        }
-    }
+        renderParameters: RenderParameters
+    )
 
     /**
-     * Used (indirectly) by the editor to highlight a complication by drawing a (dashed) line
-     * around it.
+     * Draws a highlight for a [ComplicationBoundsType.ROUND_RECT] complication. The default
+     * implementation does this by drawing a dashed line around the complication, other visual
+     * effects may be used if desired.
      *
-     * @param canvas The [Canvas] to render into.
-     * @param bounds The screen space bounding [Rect] of the complication in pixels.
-     * @param calendar The [Calendar] to use for rendering any time dependent properties.
-     * @param color The color to use when rendering the outline.
+     * @param canvas The [Canvas] to render into
+     * @param bounds A [Rect] describing the bounds of the complication
+     * @param boundsType The [ComplicationBoundsType] of the complication
+     * @param calendar The current [Calendar]
+     * @param color The color to render the highlight with
      */
-    public open fun drawOutline(
+    public fun drawHighlight(
         canvas: Canvas,
         bounds: Rect,
+        @ComplicationBoundsType boundsType: Int,
         calendar: Calendar,
         @ColorInt color: Int
-    ) {
-        if (!attachedComplication!!.fixedComplicationProvider) {
-            ComplicationOutlineRenderer.drawComplicationOutline(
-                canvas,
-                bounds,
-                color
-            )
-        }
-    }
+    )
 
     /**
      * Whether the complication should be drawn highlighted. This is to provide visual feedback when
      * the user taps on a complication.
      */
+    @Suppress("INAPPLICABLE_JVM_NAME") // https://stackoverflow.com/questions/47504279
+    @get:JvmName("isHighlighted")
+    @set:JvmName("setIsHighlighted")
     public var isHighlighted: Boolean
-        @JvmName("isHighlighted")
-        @UiThread
-        get() = drawable.isHighlighted
-        @JvmName("setIsHighlighted")
-        @UiThread
-        set(value) {
-            drawable.isHighlighted = value
-        }
-
-    private var _data: ComplicationData? = null
 
     /** Returns the [ComplicationData] to render with. */
-    public fun getData(): ComplicationData? = _data
+    public fun getData(): ComplicationData?
 
     /**
      * Sets the [ComplicationData] to render with and loads any [Drawable]s contained within the
      * ComplicationData. You can choose whether this is done synchronously or asynchronously via
-     * [loadDrawablesAsynchronous].
+     * [loadDrawablesAsynchronous]. When any asynchronous loading has completed
+     * [Complication.invalidate] must be called for the [Complication] instance previously passed
+     * in via [onAttach].
      *
      * @param complicationData The [ComplicationData] to render with
      * @param loadDrawablesAsynchronous Whether or not any drawables should be loaded asynchronously
      */
-    @CallSuper
-    public open fun loadData(
-        complicationData: ComplicationData?,
-        loadDrawablesAsynchronous: Boolean
-    ): Unit = TraceEvent("CanvasComplicationDrawable.setIdAndData").use {
-        _data = complicationData
-        drawable.setComplicationData(
-            complicationData?.asWireComplicationData(),
-            loadDrawablesAsynchronous
-        )
-    }
+    public fun loadData(complicationData: ComplicationData?, loadDrawablesAsynchronous: Boolean)
 }
 
 /** Interface for determining whether a tap hits a complication. */
@@ -248,32 +154,34 @@
  * [UserStyleSetting.ComplicationsUserStyleSetting].
  *
  * @param id The Watch Face's ID for the complication.
+ * @param accessibilityTraversalIndex Used to sort Complications when generating accessibility
+ * content description labels.
  * @param boundsType The [ComplicationBoundsType] of the complication.
  * @param bounds The complication's [ComplicationBounds].
- * @param renderer The [CanvasComplicationDrawable] used to render the complication.
- * @param supportedTypes The list of [ComplicationType]s accepted by this complication. Passed
- *     into [ComplicationHelperActivity.createProviderChooserHelperIntent] during complication
- *     configuration. This list should be non-empty.
+ * @param renderer The [CanvasComplication] used to render the complication.
+ * @param supportedTypes The list of [ComplicationType]s accepted by this complication. Used
+ * during complication, this list should be non-empty.
  * @param defaultProviderPolicy The [DefaultComplicationProviderPolicy] which controls the initial
- *     provider when the watch face is first installed.
+ * provider when the watch face is first installed.
  * @param defaultProviderType The default [ComplicationType] for the default provider.
  * @param initiallyEnabled At creation a complication is either enabled or disabled. This can be
- *     overridden by a [ComplicationsUserStyleSetting] (see [ComplicationOverlay.enabled]).
- *     Editors need to know the initial state of a complication to predict the effects of making a
- *     style change.
+ * overridden by a [ComplicationsUserStyleSetting] (see [ComplicationOverlay.enabled]).
+ * Editors need to know the initial state of a complication to predict the effects of making a
+ * style change.
  * @param configExtras Extras to be merged into the Intent sent when invoking the provider chooser
- *     activity.
+ * activity.
  * @param fixedComplicationProvider  Whether or not the complication provider is fixed (i.e.
- *     can't be changed by the user).  This is useful for watch faces built around specific
- *     complications.
+ * can't be changed by the user).  This is useful for watch faces built around specific
+ * complications.
  * @param tapFilter The [ComplicationTapFilter] used to determine whether or not a tap hit the
- *     complication.
+ * complication.
  */
 public class Complication internal constructor(
-    internal val id: Int,
+    public val id: Int,
+    accessibilityTraversalIndex: Int,
     @ComplicationBoundsType public val boundsType: Int,
     bounds: ComplicationBounds,
-    public val renderer: CanvasComplicationDrawable,
+    public val renderer: CanvasComplication,
     supportedTypes: List<ComplicationType>,
     defaultProviderPolicy: DefaultComplicationProviderPolicy,
     defaultProviderType: ComplicationType,
@@ -284,6 +192,13 @@
     public val fixedComplicationProvider: Boolean,
     public val tapFilter: ComplicationTapFilter
 ) {
+    init {
+        require(id >= 0) { "id must be >= 0" }
+        require(accessibilityTraversalIndex >= 0) {
+            "accessibilityTraversalIndex must be >= 0"
+        }
+    }
+
     public companion object {
         internal val unitSquare = RectF(0f, 0f, 1f, 1f)
 
@@ -293,20 +208,19 @@
          * can be tapped by the user to trigger the associated intent.
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         *     unique within the watch face.
-         * @param renderer The [CanvasComplicationDrawable] to use for rendering. Note renderers
-         *     should not be shared between complications.
-         * @param supportedTypes The types of complication supported by this Complication. Passed
-         *     into [ComplicationHelperActivity.createProviderChooserHelperIntent] during
-         *     complication configuration. This list should be non-empty.
+         * unique within the watch face.
+         * @param renderer The [CanvasComplication] to use for rendering. Note renderers should not
+         * be shared between complications.
+         * @param supportedTypes The types of complication supported by this Complication. Used
+         * during complication, this list should be non-empty.
          * @param defaultProviderPolicy The [DefaultComplicationProviderPolicy] used to select
-         *     the initial complication provider when the watch is first installed.
+         * the initial complication provider when the watch is first installed.
          * @param bounds The complication's [ComplicationBounds].
          */
         @JvmStatic
         public fun createRoundRectComplicationBuilder(
             id: Int,
-            renderer: CanvasComplicationDrawable,
+            renderer: CanvasComplication,
             supportedTypes: List<ComplicationType>,
             defaultProviderPolicy: DefaultComplicationProviderPolicy,
             bounds: ComplicationBounds
@@ -328,19 +242,18 @@
          * the list of complications.
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         *     unique within the watch face.
-         * @param renderer The [CanvasComplicationDrawable] to use for rendering. Note renderers
-         *     should not be shared between complications.
-         * @param supportedTypes The types of complication supported by this Complication. Passed
-         *     into [ComplicationHelperActivity.createProviderChooserHelperIntent] during
-         *     complication configuration. This list should be non-empty.
+         * unique within the watch face.
+         * @param renderer The [CanvasComplication] to use for rendering. Note renderers should not
+         * be shared between complications.
+         * @param supportedTypes The types of complication supported by this Complication. Used
+         * during complication, this list should be non-empty.
          * @param defaultProviderPolicy The [DefaultComplicationProviderPolicy] used to select
-         *     the initial complication provider when the watch is first installed.
+         * the initial complication provider when the watch is first installed.
          */
         @JvmStatic
         public fun createBackgroundComplicationBuilder(
             id: Int,
-            renderer: CanvasComplicationDrawable,
+            renderer: CanvasComplication,
             supportedTypes: List<ComplicationType>,
             defaultProviderPolicy: DefaultComplicationProviderPolicy
         ): Builder = Builder(
@@ -359,28 +272,27 @@
          * An edge complication is drawn around the border of the display and has custom hit test
          * logic (see [complicationTapFilter]). When tapped the associated intent is
          * dispatched. Edge complications should have a custom [renderer] with
-         * [CanvasComplicationDrawable.drawEdgeOutline] overridden.
+         * [CanvasComplication.drawHighlight] overridden.
          *
          * Note we don't support edge complication hit testing from an editor.
          *
          * @param id The watch face's ID for this complication. Can be any integer but should be
-         *     unique within the watch face.
-         * @param renderer The [CanvasComplicationDrawable] to use for rendering. Note renderers
-         *     should not be shared between complications.
-         * @param supportedTypes The types of complication supported by this Complication. Passed
-         *     into [ComplicationHelperActivity.createProviderChooserHelperIntent] during
-         *     complication configuration. This list should be non-empty.
+         * unique within the watch face.
+         * @param renderer The [CanvasComplication] to use for rendering. Note renderers should not
+         * be shared between complications.
+         * @param supportedTypes The types of complication supported by this Complication. Used
+         * during complication, this list should be non-empty.
          * @param defaultProviderPolicy The [DefaultComplicationProviderPolicy] used to select
-         *     the initial complication provider when the watch is first installed.
+         * the initial complication provider when the watch is first installed.
          * @param bounds The complication's [ComplicationBounds]. Its likely the bounding rect will
-         *     be much larger than the complication and shouldn't directly be used for hit testing.
+         * be much larger than the complication and shouldn't directly be used for hit testing.
          * @param complicationTapFilter The [ComplicationTapFilter] used to determine whether or
-         *     not a tap hit the complication.
+         * not a tap hit the complication.
          */
         @JvmStatic
         public fun createEdgeComplicationBuilder(
             id: Int,
-            renderer: CanvasComplicationDrawable,
+            renderer: CanvasComplication,
             supportedTypes: List<ComplicationType>,
             defaultProviderPolicy: DefaultComplicationProviderPolicy,
             bounds: ComplicationBounds,
@@ -400,33 +312,49 @@
      * Builder for constructing [Complication]s.
      *
      * @param id The watch face's ID for this complication. Can be any integer but should be unique
-     *     within the watch face.
-     * @param renderer The [CanvasComplicationDrawable] to use for rendering. Note renderers should
-     *     not be shared between complications.
-     * @param supportedTypes The types of complication supported by this Complication. Passed into
-     *     [ComplicationHelperActivity.createProviderChooserHelperIntent] during complication
-     *     configuration. This list should be non-empty.
+     * within the watch face.
+     * @param renderer The [CanvasComplication] to use for rendering. Note renderers should not be
+     * shared between complications.
+     * @param supportedTypes The types of complication supported by this Complication. Used
+     * during complication, this list should be non-empty.
      * @param defaultProviderPolicy The [DefaultComplicationProviderPolicy] used to select
-     *     the initial complication provider when the watch is first installed.
+     * the initial complication provider when the watch is first installed.
      * @param boundsType The [ComplicationBoundsType] of the complication.
      * @param bounds The complication's [ComplicationBounds].
      * @param complicationTapFilter The [ComplicationTapFilter] used to perform hit testing for this
-     *     complication.
+     * complication.
      */
     public class Builder internal constructor(
         private val id: Int,
-        private val renderer: CanvasComplicationDrawable,
+        private val renderer: CanvasComplication,
         private val supportedTypes: List<ComplicationType>,
         private val defaultProviderPolicy: DefaultComplicationProviderPolicy,
         @ComplicationBoundsType private val boundsType: Int,
         private val bounds: ComplicationBounds,
         private val complicationTapFilter: ComplicationTapFilter
     ) {
+        private var accessibilityTraversalIndex = id
         private var defaultProviderType = ComplicationType.NOT_CONFIGURED
         private var initiallyEnabled = true
         private var configExtras: Bundle = Bundle.EMPTY
         private var fixedComplicationProvider = false
 
+        init {
+            require(id >= 0) { "id must be >= 0" }
+        }
+
+        /**
+         * Sets the initial value used to sort Complications when generating accessibility content
+         * description labels. By default this is [id].
+         */
+        public fun setAccessibilityTraversalIndex(accessibilityTraversalIndex: Int): Builder {
+            this.accessibilityTraversalIndex = accessibilityTraversalIndex
+            require(accessibilityTraversalIndex >= 0) {
+                "accessibilityTraversalIndex must be >= 0"
+            }
+            return this
+        }
+
         /**
          * Sets the initial [ComplicationType] to use with the initial complication provider.
          * Note care should be taken to ensure [defaultProviderType] is compatible with the
@@ -468,6 +396,7 @@
         /** Constructs the [Complication]. */
         public fun build(): Complication = Complication(
             id,
+            accessibilityTraversalIndex,
             boundsType,
             bounds,
             renderer,
@@ -516,7 +445,9 @@
 
             // The caller might modify a number of complications. For efficiency we need to coalesce
             // these into one update task.
-            complicationsManager.scheduleUpdate()
+            if (this::complicationsManager.isInitialized) {
+                complicationsManager.scheduleUpdate()
+            }
         }
 
     internal var enabledDirty = true
@@ -610,6 +541,34 @@
             }
         }
 
+    internal var accessibilityTraversalIndexDirty = true
+
+    /**
+     * This is used to determine the order in which accessibility labels for the watch face are
+     * read to the user. Accessibility labels are automatically generated for the time and
+     * complications.  See also [Renderer.additionalContentDescriptionLabels].
+     */
+    public var accessibilityTraversalIndex: Int = accessibilityTraversalIndex
+        @UiThread
+        get
+        @UiThread
+        internal set(value) {
+            require(value >= 0) {
+                "accessibilityTraversalIndex must be >= 0"
+            }
+            if (field == value) {
+                return
+            }
+            field = value
+            accessibilityTraversalIndexDirty = true
+
+            // The caller might enable/disable a number of complications. For efficiency we need
+            // to coalesce these into one update task.
+            if (this::complicationsManager.isInitialized) {
+                complicationsManager.scheduleUpdate()
+            }
+        }
+
     internal var dataDirty = true
 
     /**
@@ -631,7 +590,7 @@
             ComplicationType.NO_DATA -> false
             ComplicationType.NO_PERMISSION -> false
             ComplicationType.EMPTY -> false
-            else -> complicationData.value.isActiveAt(dateTimeMillis)
+            else -> complicationData.value.validTimeRange.contains(dateTimeMillis)
         }
     }
 
@@ -649,7 +608,53 @@
         renderParameters: RenderParameters
     ) {
         val bounds = computeBounds(Rect(0, 0, canvas.width, canvas.height))
-        renderer.render(canvas, bounds, calendar, renderParameters, id)
+        renderer.render(canvas, bounds, calendar, renderParameters)
+    }
+
+    /**
+     * Watch faces should use this method to render non-fixed complications for any highlight layer
+     * pass. Note the system may call this.
+     *
+     * @param canvas The [Canvas] to render into
+     * @param calendar The current [Calendar]
+     * @param renderParameters The current [RenderParameters]
+     */
+    @UiThread
+    public fun renderHighlightLayer(
+        canvas: Canvas,
+        calendar: Calendar,
+        renderParameters: RenderParameters
+    ) {
+        // It's only sensible to render a highlight for non-fixed complications because you can't
+        // edit fixed complications.
+        if (fixedComplicationProvider) {
+            return
+        }
+
+        val bounds = computeBounds(Rect(0, 0, canvas.width, canvas.height))
+        when (val highlightedElement = renderParameters.highlightLayer?.highlightedElement) {
+            is HighlightedElement.AllComplications -> {
+                renderer.drawHighlight(
+                    canvas,
+                    bounds,
+                    boundsType,
+                    calendar,
+                    renderParameters.highlightLayer.highlightTint
+                )
+            }
+
+            is HighlightedElement.Complication -> {
+                if (highlightedElement.id == id) {
+                    renderer.drawHighlight(
+                        canvas,
+                        bounds,
+                        boundsType,
+                        calendar,
+                        renderParameters.highlightLayer.highlightTint
+                    )
+                }
+            }
+        }
     }
 
     /**
@@ -678,7 +683,9 @@
         this.invalidateListener = invalidateListener
     }
 
-    internal fun scheduleUpdateComplications() {
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public fun scheduleUpdateComplications() {
         // In tests this may not be initialized.
         if (this::complicationsManager.isInitialized) {
             // Update active complications to ensure accessibility data is up to date.
@@ -695,11 +702,12 @@
                 complicationBounds.perComplicationTypeBounds[it.type]
             } ?: complicationBounds.perComplicationTypeBounds[defaultProviderType]!!
         unitSquareBounds.intersect(unitSquare)
+        // We add 0.5 to make toInt() round to the nearest whole number rather than truncating.
         return Rect(
-            (unitSquareBounds.left * screen.width()).toInt(),
-            (unitSquareBounds.top * screen.height()).toInt(),
-            (unitSquareBounds.right * screen.width()).toInt(),
-            (unitSquareBounds.bottom * screen.height()).toInt()
+            (0.5f + unitSquareBounds.left * screen.width()).toInt(),
+            (0.5f + unitSquareBounds.top * screen.height()).toInt(),
+            (0.5f + unitSquareBounds.right * screen.width()).toInt(),
+            (0.5f + unitSquareBounds.bottom * screen.height()).toInt()
         )
     }
 
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationOutlineRenderer.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationOutlineRenderer.kt
deleted file mode 100644
index 2467a50..0000000
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationOutlineRenderer.kt
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface
-
-import android.content.res.Resources
-import android.graphics.Canvas
-import android.graphics.Paint
-import android.graphics.Rect
-import android.graphics.RectF
-import android.util.TypedValue
-import androidx.annotation.ColorInt
-
-/**
- * Helper for rendering a thick outline around a complication. Intended for use with
- * [LayerMode#DRAW_OUTLINED].
- */
-public class ComplicationOutlineRenderer {
-    public companion object {
-        internal const val EXPANSION_PX = 6
-        internal const val STROKE_WIDTH_DP = 3.0f
-        internal val outlinePaint = Paint().apply {
-            style = Paint.Style.STROKE
-            strokeWidth = TypedValue.applyDimension(
-                TypedValue.COMPLEX_UNIT_DIP,
-                STROKE_WIDTH_DP,
-                Resources.getSystem().displayMetrics
-            )
-            isAntiAlias = true
-        }
-
-        /** Draws a thick line around the complication with the given bounds. */
-        @JvmStatic
-        public fun drawComplicationOutline(
-            canvas: Canvas,
-            bounds: Rect,
-            @ColorInt color: Int
-        ) {
-            outlinePaint.color = color
-            val radius = bounds.height() / 2.0f
-            if (bounds.width() == bounds.height()) {
-                canvas.drawCircle(
-                    bounds.exactCenterX() + 1.0f, // Offset necessary to properly center.
-                    bounds.exactCenterY(),
-                    radius + EXPANSION_PX,
-                    outlinePaint
-                )
-            } else {
-                canvas.drawRoundRect(
-                    RectF(
-                        (bounds.left - EXPANSION_PX).toFloat(),
-                        (bounds.top - EXPANSION_PX).toFloat(),
-                        (bounds.right + EXPANSION_PX).toFloat(),
-                        (bounds.bottom + EXPANSION_PX).toFloat()
-                    ),
-                    radius,
-                    radius,
-                    outlinePaint
-                )
-            }
-        }
-    }
-}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
index 111af6e..4dc665d 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ComplicationsManager.kt
@@ -21,8 +21,6 @@
 import android.content.Context
 import android.content.Intent
 import android.icu.util.Calendar
-import android.support.wearable.watchface.accessibility.AccessibilityUtils
-import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
 import androidx.annotation.Px
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
@@ -49,7 +47,7 @@
  *
  * @param complicationCollection The complications associated with the watch face, may be empty.
  * @param currentUserStyleRepository The [CurrentUserStyleRepository] used to listen for
- *     [ComplicationsUserStyleSetting] changes and apply them.
+ * [ComplicationsUserStyleSetting] changes and apply them.
  */
 public class ComplicationsManager(
     complicationCollection: Collection<Complication>,
@@ -79,7 +77,8 @@
 
     private class InitialComplicationConfig(
         val complicationBounds: ComplicationBounds,
-        val enabled: Boolean
+        val enabled: Boolean,
+        val accessibilityTraversalIndex: Int
     )
 
     // Copy of the original complication configs. This is necessary because the semantics of
@@ -91,7 +90,8 @@
             {
                 InitialComplicationConfig(
                     it.complicationBounds,
-                    it.enabled
+                    it.enabled,
+                    it.accessibilityTraversalIndex
                 )
             }
         )
@@ -107,6 +107,33 @@
         this.renderer = renderer
     }
 
+    init {
+        val complicationsStyleCategory =
+            currentUserStyleRepository.schema.userStyleSettings.firstOrNull {
+                it is ComplicationsUserStyleSetting
+            }
+
+        // Add a listener if we have a ComplicationsUserStyleSetting so we can track changes and
+        // automatically apply them.
+        if (complicationsStyleCategory != null) {
+            // Ensure we apply any initial StyleCategoryOption overlay by initializing with null.
+            var previousOption: ComplicationsOption? = null
+            currentUserStyleRepository.addUserStyleChangeListener(
+                object : CurrentUserStyleRepository.UserStyleChangeListener {
+                    override fun onUserStyleChanged(userStyle: UserStyle) {
+                        val newlySelectedOption =
+                            userStyle[complicationsStyleCategory]!! as ComplicationsOption
+                        if (previousOption != newlySelectedOption) {
+                            previousOption = newlySelectedOption
+                            applyComplicationsStyleCategoryOption(newlySelectedOption)
+                        }
+                    }
+                }
+            )
+        }
+    }
+
+    /** Finish initialization. */
     internal fun init(
         watchFaceHostApi: WatchFaceHostApi,
         calendar: Calendar,
@@ -122,37 +149,11 @@
             complication.init(this, complicationInvalidateListener)
         }
 
-        val complicationsStyleCategory =
-            currentUserStyleRepository.schema.userStyleSettings.firstOrNull {
-                it is ComplicationsUserStyleSetting
-            }
-
-        // Add a listener if we have a ComplicationsUserStyleSetting so we can track changes and
-        // automatically apply them.
-        if (complicationsStyleCategory != null) {
-            // Ensure we apply any initial StyleCategoryOption overlay by initializing with null.
-            var previousOption: ComplicationsUserStyleSetting.ComplicationsOption? = null
-            currentUserStyleRepository.addUserStyleChangeListener(
-                object : CurrentUserStyleRepository.UserStyleChangeListener {
-                    override fun onUserStyleChanged(userStyle: UserStyle) {
-                        val newlySelectedOption =
-                            userStyle[complicationsStyleCategory]!! as ComplicationsOption
-                        if (previousOption != newlySelectedOption) {
-                            previousOption = newlySelectedOption
-                            applyComplicationsStyleCategoryOption(newlySelectedOption)
-                        }
-                    }
-                }
-            )
-        }
-
         // Activate complications.
         scheduleUpdate()
     }
 
-    internal fun applyComplicationsStyleCategoryOption(
-        styleOption: ComplicationsUserStyleSetting.ComplicationsOption
-    ) {
+    internal fun applyComplicationsStyleCategoryOption(styleOption: ComplicationsOption) {
         for ((id, complication) in complications) {
             val override = styleOption.complicationOverlays.find { it.complicationId == id }
             val initialConfig = initialComplicationConfigs[id]!!
@@ -161,6 +162,8 @@
                 override?.complicationBounds ?: initialConfig.complicationBounds
             complication.enabled =
                 override?.enabled ?: initialConfig.enabled
+            complication.accessibilityTraversalIndex =
+                override?.accessibilityTraversalIndex ?: initialConfig.accessibilityTraversalIndex
         }
     }
 
@@ -173,40 +176,6 @@
         }
     }
 
-    internal fun getContentDescriptionLabels(): Array<ContentDescriptionLabel> {
-        val labels = mutableListOf<ContentDescriptionLabel>()
-
-        // Add a ContentDescriptionLabel for the main clock element.
-        labels.add(
-            ContentDescriptionLabel(
-                renderer.getMainClockElementBounds(),
-                AccessibilityUtils.makeTimeAsComplicationText(
-                    watchFaceHostApi.getContext()
-                )
-            )
-        )
-        // Add a ContentDescriptionLabel for each enabled complication.
-        for ((_, complication) in complications) {
-            if (complication.enabled) {
-                if (complication.boundsType == ComplicationBoundsType.BACKGROUND) {
-                    ComplicationBoundsType.BACKGROUND
-                } else {
-                    complication.renderer.getData()?.let {
-                        labels.add(
-                            ContentDescriptionLabel(
-                                watchFaceHostApi.getContext(),
-                                complication.computeBounds(renderer.screenBounds),
-                                it.asWireComplicationData()
-                            )
-                        )
-                    }
-                }
-            }
-        }
-
-        return labels.toTypedArray()
-    }
-
     private fun updateComplications() {
         val activeKeys = mutableListOf<Int>()
 
@@ -222,7 +191,8 @@
                 activeKeys.add(id)
 
                 labelsDirty =
-                    labelsDirty || complication.dataDirty || complication.complicationBoundsDirty
+                    labelsDirty || complication.dataDirty || complication.complicationBoundsDirty ||
+                    complication.accessibilityTraversalIndexDirty
 
                 if (complication.defaultProviderPolicyDirty ||
                     complication.defaultProviderTypeDirty
@@ -250,20 +220,16 @@
         }
 
         if (labelsDirty) {
-            // Register ContentDescriptionLabels which are used to provide accessibility data.
-            watchFaceHostApi.setContentDescriptionLabels(
-                getContentDescriptionLabels()
-            )
+            watchFaceHostApi.updateContentDescriptionLabels()
         }
     }
 
     /**
      * Called when new complication data is received.
      *
-     * @param watchFaceComplicationId The id of the complication that the data relates to. This
-     *     will be an id that was previously sent in a call to [setActiveComplications]. If this id
-     *     is unrecognized the call will be a NOP, the only circumstance when that happens is if
-     *     the watch face changes it's complication config between runs e.g. during development.
+     * @param watchFaceComplicationId The id of the complication that the data relates to. If this
+     * id is unrecognized the call will be a NOP, the only circumstance when that happens is if the
+     * watch face changes it's complication config between runs e.g. during development.
      * @param data The [ComplicationData] that should be displayed in the complication.
      */
     @UiThread
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt
new file mode 100644
index 0000000..de96271
--- /dev/null
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/ContentDescriptionLabel.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface
+
+import android.app.PendingIntent
+import android.content.res.Resources
+import android.graphics.Rect
+import androidx.wear.complications.data.ComplicationText
+import java.util.Objects
+
+/**
+ * Describes regions of the watch face for use by a screen reader.
+ *
+ * @param text [ComplicationText] associated with the region, to be read by the screen reader.
+ * @param bounds [Rect] describing the area of the feature on screen.
+ * @param tapAction [PendingIntent] to be used if the screen reader's user triggers a tap
+ * action.
+ */
+public class ContentDescriptionLabel(
+    public val text: ComplicationText,
+    public val bounds: Rect,
+    public val tapAction: PendingIntent?
+) {
+    /**
+     * Returns the text that should be displayed for the given timestamp.
+     *
+     * @param resources [Resources] from the current [android.content.Context]
+     * @param dateTimeMillis milliseconds since epoch, e.g. from [System.currentTimeMillis]
+     */
+    public fun getTextAt(resources: Resources, dateTimeMillis: Long): CharSequence =
+        text.getTextAt(resources, dateTimeMillis)
+
+    override fun equals(other: Any?): Boolean =
+        other is ContentDescriptionLabel &&
+            text == other.text &&
+            bounds == other.bounds &&
+            tapAction == other.tapAction
+
+    override fun hashCode(): Int {
+        return Objects.hash(
+            text,
+            bounds,
+            tapAction
+        )
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/GlesTextureComplication.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/GlesTextureComplication.kt
deleted file mode 100644
index efe23e4..0000000
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/GlesTextureComplication.kt
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.watchface
-
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.graphics.Rect
-import android.icu.util.Calendar
-import android.opengl.GLES20
-import android.opengl.GLUtils
-import androidx.annotation.Px
-
-/**
- * Helper for rendering a [CanvasComplicationDrawable] to a GLES20 texture. To use call
- * [renderToTexture] and then [bind] before drawing.
- *
- * @param canvasComplication The [CanvasComplicationDrawable] to render to texture.
- * @param textureWidth The width of the texture in pixels to create.
- * @param textureHeight The height of the texture in pixels to create.
- * @param textureType The texture type, e.g. [GLES20.GL_TEXTURE_2D].
- * @param id The id of the associated [Complication].
- */
-public class GlesTextureComplication(
-    public val canvasComplication: CanvasComplicationDrawable,
-    @Px textureWidth: Int,
-    @Px textureHeight: Int,
-    private val textureType: Int,
-    public val id: Int
-) {
-    private val texture = createTexture(textureType)
-    private val bitmap = Bitmap.createBitmap(
-        textureWidth,
-        textureHeight,
-        Bitmap.Config.ARGB_8888
-    )
-    private val canvas = Canvas(bitmap)
-    private val bounds = Rect(0, 0, textureWidth, textureHeight)
-
-    /** Renders [canvasComplication] to an OpenGL texture. */
-    public fun renderToTexture(calendar: Calendar, renderParameters: RenderParameters) {
-        canvas.drawColor(Color.BLACK)
-        canvasComplication.render(canvas, bounds, calendar, renderParameters, id)
-        bind()
-        GLUtils.texImage2D(textureType, 0, bitmap, 0)
-    }
-
-    /** Bind the texture to the active texture target. */
-    public fun bind() {
-        GLES20.glBindTexture(textureType, texture)
-    }
-
-    /**
-     * Creates an OpenGL texture handler.
-     *
-     * @return The OpenGL texture handler
-     */
-    private fun createTexture(textureType: Int): Int {
-        val handle = IntArray(1)
-        GLES20.glGenTextures(1, handle, 0)
-        GLES20.glBindTexture(textureType, handle[0])
-        GLES20.glTexParameteri(
-            textureType,
-            GLES20.GL_TEXTURE_WRAP_S,
-            GLES20.GL_CLAMP_TO_EDGE
-        )
-        GLES20.glTexParameteri(
-            textureType,
-            GLES20.GL_TEXTURE_WRAP_T,
-            GLES20.GL_CLAMP_TO_EDGE
-        )
-        GLES20.glTexParameteri(
-            textureType,
-            GLES20.GL_TEXTURE_MAG_FILTER,
-            GLES20.GL_LINEAR
-        )
-        GLES20.glTexParameteri(
-            textureType,
-            GLES20.GL_TEXTURE_MIN_FILTER,
-            GLES20.GL_LINEAR
-        )
-        return handle[0]
-    }
-}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
index 6740156..aa66e3b 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/IndentingPrintWriter.kt
@@ -24,8 +24,8 @@
  * Lightweight wrapper around [java.io.PrintWriter] that automatically indents newlines based
  * on internal state.
  *
- * Delays writing indent until first actual write on a newline, enabling indent modification
- * after newline.
+ * Delays writing indent until first actual write on a newline, enabling indent modification after
+ * newline.
  */
 internal class IndentingPrintWriter(
     writer: Writer,
@@ -36,7 +36,7 @@
     /** Mutable version of current indent  */
     private val indentBuilder = StringBuilder()
 
-    /** Cache of current [.indentBuilder] value  */
+    /** Cache of current [indentBuilder] value  */
     private var currentIndent: CharArray? = null
 
     /**
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
new file mode 100644
index 0000000..d83fa20
--- /dev/null
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderBufferTexture.kt
@@ -0,0 +1,484 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface
+
+import android.opengl.GLES20
+import android.opengl.GLU
+import android.opengl.GLUtils
+import android.util.Log
+import androidx.annotation.Px
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
+import java.nio.FloatBuffer
+
+/**
+ * Whether to check for GL errors. This is slow, so not appropriate for production builds.
+ */
+internal const val CHECK_GL_ERRORS = false
+
+private const val TAG = "RenderBufferTexture"
+
+/**
+ * Checks if any of the GL calls since the last time this method was called set an error
+ * condition. Call this method immediately after calling a GL method. Pass the name of the
+ * GL operation. For example:
+ *
+ * <pre>
+ * mColorHandle = GLES20.glGetUniformLocation(mProgram, "uColor");
+ * MyGLRenderer.checkGlError("glGetUniformLocation");</pre>
+ *
+ * If the operation is not successful, the check throws an exception.
+ *
+ * *Note* This is quite slow so it's best to use it sparingly in production builds.
+ *
+ * @param glOperation name of the OpenGL call to check
+ */
+internal fun checkGlError(glOperation: String) {
+    val error = GLES20.glGetError()
+    if (error != GLES20.GL_NO_ERROR) {
+        var errorString = GLU.gluErrorString(error)
+        if (errorString == null) {
+            errorString = GLUtils.getEGLErrorString(error)
+        }
+        val message =
+            glOperation + " caused GL error 0x" + Integer.toHexString(error) +
+                ": " + errorString
+        Log.e(TAG, message)
+        throw RuntimeException(message)
+    }
+}
+
+/**
+ * Handles a framebuffer and texture for rendering to texture. Also handles drawing a full screen
+ * quad to apply the texture as an overlay.
+ */
+internal class RenderBufferTexture(
+    @Px
+    private val width: Int,
+
+    @Px
+    private val height: Int
+) {
+    private companion object {
+        private const val RENDER_TEXTURE_UNIT = 1
+    }
+
+    val framebuffer = IntArray(1)
+    val textureId = IntArray(1)
+
+    val fullScreenQuad = Gles2TexturedTriangleList(
+        Gles2TexturedTriangleList.Program(),
+        // List of (x,y,z) coordinates for two triangles to make a quad that covers the whole screen
+        floatArrayOf(
+            -1.0f,
+            -1.0f,
+            0.5f,
+
+            -1.0f,
+            1.0f,
+            0.5f,
+
+            1.0f,
+            -1.0f,
+            0.5f,
+
+            -1.0f,
+            1.0f,
+            0.5f,
+
+            1.0f,
+            -1.0f,
+            0.5f,
+
+            1.0f,
+            1.0f,
+            0.5f
+        ),
+
+        // List of (u, v) texture coordinates.
+        floatArrayOf(
+            0.0f,
+            0.0f,
+
+            0.0f,
+            1.0f,
+
+            1.0f,
+            0.0f,
+
+            0.0f,
+            1.0f,
+
+            1.0f,
+            0.0f,
+
+            1.0f,
+            1.0f
+        )
+    )
+
+    init {
+        // Create the texture
+        GLES20.glGenTextures(1, textureId, 0)
+        GLES20.glActiveTexture(GLES20.GL_TEXTURE0)
+        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0])
+        GLES20.glTexParameteri(
+            GLES20.GL_TEXTURE_2D,
+            GLES20.GL_TEXTURE_WRAP_S,
+            GLES20.GL_CLAMP_TO_EDGE
+        )
+        GLES20.glTexParameteri(
+            GLES20.GL_TEXTURE_2D,
+            GLES20.GL_TEXTURE_WRAP_T,
+            GLES20.GL_CLAMP_TO_EDGE
+        )
+        GLES20.glTexParameteri(
+            GLES20.GL_TEXTURE_2D,
+            GLES20.GL_TEXTURE_MAG_FILTER,
+            GLES20.GL_LINEAR
+        )
+        GLES20.glTexParameteri(
+            GLES20.GL_TEXTURE_2D,
+            GLES20.GL_TEXTURE_MIN_FILTER,
+            GLES20.GL_LINEAR
+        )
+
+        GLES20.glTexImage2D(
+            GLES20.GL_TEXTURE_2D,
+            0,
+            GLES20.GL_RGBA,
+            width,
+            height,
+            0,
+            GLES20.GL_RGBA,
+            GLES20.GL_UNSIGNED_BYTE,
+            null
+        )
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glTexImage2D")
+        }
+
+        // Create the frame buffer
+        GLES20.glGenFramebuffers(1, framebuffer, 0)
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glGenFramebuffers")
+        }
+        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebuffer[0])
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glBindFramebuffer")
+        }
+        GLES20.glFramebufferTexture2D(
+            GLES20.GL_FRAMEBUFFER,
+            GLES20.GL_COLOR_ATTACHMENT0,
+            GLES20.GL_TEXTURE_2D,
+            textureId[0],
+            0
+        )
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glFramebufferTexture2D")
+        }
+
+        val status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER)
+        if (status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
+            throw RuntimeException("Failed to create framebuffer")
+        }
+
+        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0)
+    }
+
+    fun bindFrameBuffer() {
+        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebuffer[0])
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glBindFramebuffer")
+        }
+        GLES20.glViewport(0, 0, width, height)
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glFramebufferTexture2D")
+        }
+    }
+
+    fun compositeQuad() {
+        fullScreenQuad.program.bindProgramAndAttribs()
+        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0])
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glBindTexture")
+        }
+        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA)
+        if (CHECK_GL_ERRORS) {
+            checkGlError("glBlendFunc")
+        }
+        fullScreenQuad.draw()
+    }
+}
+
+/**
+ * A list of triangles drawn with a texture using OpenGL ES 2.0.
+ */
+internal class Gles2TexturedTriangleList(
+    internal val program: Program,
+    triangleCoords: FloatArray,
+    private val textureCoords: FloatArray
+) {
+    init {
+        require(triangleCoords.size % (VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX) == 0) {
+            ("must be multiple of VERTICES_PER_TRIANGLE * COORDS_PER_VERTEX coordinates")
+        }
+        require(textureCoords.size % (VERTICES_PER_TRIANGLE * TEXTURE_COORDS_PER_VERTEX) == 0) {
+            (
+                "must be multiple of VERTICES_PER_TRIANGLE * NUM_TEXTURE_COMPONENTS texture " +
+                    "coordinates"
+                )
+        }
+    }
+
+    /** The VBO containing the vertex coordinates. */
+    private val vertexBuffer =
+        ByteBuffer.allocateDirect(triangleCoords.size * BYTES_PER_FLOAT)
+            .apply { order(ByteOrder.nativeOrder()) }
+            .asFloatBuffer().apply {
+                put(triangleCoords)
+                position(0)
+            }
+
+    /** The VBO containing the vertex coordinates. */
+    private val textureCoordsBuffer =
+        ByteBuffer.allocateDirect(textureCoords.size * BYTES_PER_FLOAT)
+            .apply { order(ByteOrder.nativeOrder()) }
+            .asFloatBuffer().apply {
+                put(textureCoords)
+                position(0)
+            }
+
+    /** Number of coordinates in this triangle list.  */
+    private val numCoords = triangleCoords.size / COORDS_PER_VERTEX
+
+    /**
+     * Draws this triangle list using OpenGL commands.
+     */
+    internal fun draw() {
+        // Pass vertex data, and texture coordinates to OpenGL.
+        program.bind(vertexBuffer, textureCoordsBuffer)
+
+        // Draw the triangle list.
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numCoords)
+        if (CHECK_GL_ERRORS) checkGlError(
+            "glDrawArrays"
+        )
+
+        program.unbindAttribs()
+    }
+
+    /** OpenGL shaders for drawing textured triangle lists.  */
+    internal class Program {
+        /** ID OpenGL uses to identify this program.  */
+        private val programId: Int
+
+        /** Handle for aPosition attribute in vertex shader.  */
+        private val positionHandle: Int
+
+        /** Handle for aTextureCoordinate uniform in fragment shader.  */
+        private val textureCoordinateHandle: Int
+
+        companion object {
+            /** Trivial pass through vertex shader. */
+            private const val VERTEX_SHADER_CODE = "" +
+                "attribute vec4 aPosition;\n" +
+                "attribute vec4 aTextureCoordinate;\n" +
+                "varying vec2 textureCoordinate;\n" +
+                "void main() {\n" +
+                "    gl_Position = aPosition;\n" +
+                "    textureCoordinate = aTextureCoordinate.xy;\n" +
+                "}\n"
+
+            /** Trivial fragment shader that draws with a texture.  */
+            private const val FRAGMENT_SHADER_CODE = "" +
+                "varying highp vec2 textureCoordinate;\n" +
+                "uniform sampler2D texture;\n" +
+                "void main() {\n" +
+                "    gl_FragColor = texture2D(texture, textureCoordinate);\n" +
+                "}\n"
+        }
+
+        /**
+         * Tells OpenGL to use this program. Call this method before drawing a sequence of
+         * triangle lists.
+         */
+        fun bindProgramAndAttribs() {
+            GLES20.glUseProgram(programId)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glUseProgram")
+            }
+
+            // Enable vertex array (VBO).
+            GLES20.glEnableVertexAttribArray(positionHandle)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glEnableVertexAttribArray")
+            }
+
+            GLES20.glEnableVertexAttribArray(textureCoordinateHandle)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glEnableVertexAttribArray")
+            }
+        }
+
+        fun unbindAttribs() {
+            GLES20.glDisableVertexAttribArray(positionHandle)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glDisableVertexAttribArray")
+            }
+
+            GLES20.glDisableVertexAttribArray(textureCoordinateHandle)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glDisableVertexAttribArray")
+            }
+        }
+
+        /** Sends the given MVP matrix, vertex data, and color to OpenGL.  */
+        fun bind(
+            vertexBuffer: FloatBuffer?,
+            textureCoordinatesBuffer: FloatBuffer?
+        ) {
+            // Pass the VBO with the triangle list's vertices to OpenGL.
+            GLES20.glVertexAttribPointer(
+                positionHandle,
+                COORDS_PER_VERTEX,
+                GLES20.GL_FLOAT,
+                false /* normalized */,
+                VERTEX_STRIDE,
+                vertexBuffer
+            )
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glVertexAttribPointer")
+            }
+
+            // Pass the VBO with the triangle list's texture coordinates to OpenGL.
+            GLES20.glVertexAttribPointer(
+                textureCoordinateHandle,
+                TEXTURE_COORDS_PER_VERTEX,
+                GLES20.GL_FLOAT,
+                false /* normalized */,
+                TEXTURE_COORDS_VERTEX_STRIDE,
+                textureCoordinatesBuffer
+            )
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glVertexAttribPointer")
+            }
+        }
+
+        /**
+         * Creates a program to draw triangle lists. For optimal drawing efficiency, one program
+         * should be used for all triangle lists being drawn.
+         */
+        init {
+            // Prepare shaders.
+            val vertexShader = loadShader(
+                GLES20.GL_VERTEX_SHADER,
+                VERTEX_SHADER_CODE
+            )
+            val fragmentShader = loadShader(
+                GLES20.GL_FRAGMENT_SHADER,
+                FRAGMENT_SHADER_CODE
+            )
+
+            // Create empty OpenGL Program.
+            programId = GLES20.glCreateProgram()
+            if (CHECK_GL_ERRORS) checkGlError(
+                "glCreateProgram"
+            )
+            check(programId != 0) { "glCreateProgram failed" }
+
+            // Add the shaders to the program.
+            GLES20.glAttachShader(programId, vertexShader)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glAttachShader")
+            }
+            GLES20.glAttachShader(programId, fragmentShader)
+
+            // Link the program so it can be executed.
+            GLES20.glLinkProgram(programId)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glLinkProgram")
+            }
+
+            // Get a handle to the vertex shader's aPosition attribute.
+            positionHandle = GLES20.glGetAttribLocation(programId, "aPosition")
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glGetAttribLocation positionHandle")
+            }
+
+            // Get a handle to vertex shader's aUV attribute.
+            textureCoordinateHandle =
+                GLES20.glGetAttribLocation(programId, "aTextureCoordinate")
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glGetAttribLocation textureCoordinateHandle")
+            }
+
+            // Enable vertex array (VBO).
+            GLES20.glEnableVertexAttribArray(positionHandle)
+            if (CHECK_GL_ERRORS) {
+                checkGlError("glEnableVertexAttribArray")
+            }
+        }
+    }
+
+    internal companion object {
+        /** Number of coordinates per vertex in this array: one for each of x, y, and z.  */
+        private const val COORDS_PER_VERTEX = 3
+
+        /** Number of texture coordinates per vertex in this array: one for u & v */
+        private const val TEXTURE_COORDS_PER_VERTEX = 2
+
+        /** Number of bytes to store a float in GL.  */
+        const val BYTES_PER_FLOAT = 4
+
+        /** Number of bytes per vertex.  */
+        private const val VERTEX_STRIDE = COORDS_PER_VERTEX * BYTES_PER_FLOAT
+
+        /** Number of bytes per vertex for texture coords.  */
+        private const val TEXTURE_COORDS_VERTEX_STRIDE = TEXTURE_COORDS_PER_VERTEX * BYTES_PER_FLOAT
+
+        /** Triangles have three vertices. */
+        private const val VERTICES_PER_TRIANGLE = 3
+
+        /**
+         * Compiles an OpenGL shader.
+         *
+         * @param type [GLES20.GL_VERTEX_SHADER] or [GLES20.GL_FRAGMENT_SHADER]
+         * @param shaderCode string containing the shader source code
+         * @return ID for the shader
+         */
+        internal fun loadShader(type: Int, shaderCode: String): Int {
+            // Create a vertex or fragment shader.
+            val shader = GLES20.glCreateShader(type)
+            if (CHECK_GL_ERRORS) checkGlError(
+                "glCreateShader"
+            )
+            check(shader != 0) { "glCreateShader failed" }
+
+            // Add the source code to the shader and compile it.
+            GLES20.glShaderSource(shader, shaderCode)
+            if (CHECK_GL_ERRORS) checkGlError(
+                "glShaderSource"
+            )
+            GLES20.glCompileShader(shader)
+            if (CHECK_GL_ERRORS) checkGlError(
+                "glCompileShader"
+            )
+            return shader
+        }
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
index d31294a..5fc427d 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/RenderParameters.kt
@@ -19,13 +19,18 @@
 import android.graphics.Color
 import androidx.annotation.ColorInt
 import androidx.annotation.RestrictTo
-import androidx.wear.watchface.data.LayerParameterWireFormat
+import androidx.wear.watchface.RenderParameters.HighlightLayer
 import androidx.wear.watchface.data.RenderParametersWireFormat
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.style.WatchFaceLayer
+import androidx.wear.watchface.style.UserStyleSetting
 
 /* Used to parameterize watch face drawing based on the current system state. */
 public enum class DrawMode {
-    /** This mode is used when the user is interacting with the watch face. */
+    /**
+     * This mode is used when the user is interacting with the watch face.
+     *
+     * This is currently the only mode that is supported when editing the watch face.
+     */
     INTERACTIVE,
 
     /**
@@ -45,119 +50,301 @@
     AMBIENT
 }
 
-/** Used to parameterize per layer drawing. */
-public enum class LayerMode {
-    /** This layer should be rendered normally. */
-    DRAW,
-
-    /**
-     * Used by editors, this layer should be rendered with a outline or similar graphical
-     * highlighting with [RenderParameters.outlineTint]. See also
-     * [RenderParameters.selectedComplicationId] for use in combination with
-     * [Layer.COMPLICATIONS].
-     *
-     * Note a highlight for background complications won't be drawn since this would typically be
-     * off screen.
-     */
-    DRAW_OUTLINED,
-
-    /** This layer should not be drawn. */
-    HIDE
-}
-
 /**
  * Used to parameterize watch face rendering.
  *
+ * Watch face rendering is split up in a number of layers: the base layer [WatchFaceLayer.BASE], the
+ * complications layer [WatchFaceLayer.COMPLICATIONS], and the layer above the complications
+ * [WatchFaceLayer.COMPLICATIONS_OVERLAY]. These layers are always drawn in this order, one on top of
+ * the previous one. These are the layers that are used to render the watch face itself.
+ *
+ * An additional layer, the highlight layer, can be drawn during editing the watch face to highlight
+ * different elements of the watch face, namely a set of complications (which may be a single
+ * complication) or the area of the watch face that is affected by a single user style setting.
+ *
+ * The watch face should provide a way to highlight any of the above combination so that its own
+ * editor on the one provided by the Wear OS phone app is able to highlight the editable part of the
+ * watch face to the user. If a complication of single user style setting is meant to affect the
+ * entire watch face, the entire watch face should be highlighted.
+ *
+ * The watch face layers and highlight layer can be configured independently, so that it is possible
+ * to draw only the highlight layer by passing an empty set of [watchFaceLayers].
+ *
+ * The semantics of rendering different layers is such that if each individual layer is rendered
+ * independently and the resulting images are composited with alpha blending, the result is
+ * identical to rendering all of the layers in a single request.
+ *
  * @param drawMode The overall drawing parameters based on system state.
- * @param layerParameters Parameters for rendering individual layers. Generally these will all be
- *     [LayerMode#DRAW] in normal operation, but the editor may make more complicated requests
- *     which need to be honored to function properly.
- * @param selectedComplicationId Optional parameter which if non null specifies that a particular
- *     complication should be drawn with a special highlight to indicate it's been selected.
- * @param outlineTint Specifies the tint should be used with [LayerMode.DRAW_OUTLINED]
+ * @param watchFaceLayers The parts of the watch face to draw.
+ * @param highlightLayer Optional [HighlightLayer] used by editors to visually highlight an
+ * aspect of the watch face. Rendered last on top of [watchFaceLayers]. If highlighting isn't needed
+ * this will be `null`.
  */
-public class RenderParameters constructor(
+public class RenderParameters @JvmOverloads constructor(
     public val drawMode: DrawMode,
-    public val layerParameters: Map<Layer, LayerMode>,
-    @SuppressWarnings("AutoBoxing")
-    @get:SuppressWarnings("AutoBoxing")
-    public val selectedComplicationId: Int?,
-    @ColorInt
-    @get:ColorInt
-    public val outlineTint: Int
+    public val watchFaceLayers: Set<WatchFaceLayer>,
+    public val highlightLayer: HighlightLayer? = null
 ) {
-    /**
-     * Constructs [RenderParameters] without an explicit [outlineTint]. This constructor doesn't
-     * support [LayerMode.DRAW_OUTLINED].
-     *
-     * @param drawMode The overall drawing parameters based on system state.
-     * @param layerParameters Parameters for rendering individual layers. Generally these will all
-     *     be [LayerMode#DRAW] in normal operation, but the editor may make more complicated
-     *     requests which need to be honored to function properly.
-     * @param selectedComplicationId Optional parameter which if non null specifies that a
-     *     particular complication should be drawn with a special highlight to indicate it's been
-     *     selected.
-     */
-    public constructor(
-        drawMode: DrawMode,
-        layerParameters: Map<Layer, LayerMode>,
-        @SuppressWarnings("AutoBoxing")
-        selectedComplicationId: Int?,
-    ) : this(drawMode, layerParameters, selectedComplicationId, Color.RED) {
-        for (layerMode in layerParameters.values) {
-            require(layerMode != LayerMode.DRAW_OUTLINED) {
-                "LayerMode.DRAW_OUTLINED is not supported by this constructor, use the primary " +
-                    "one instead"
+    init {
+        require(watchFaceLayers.isNotEmpty() || highlightLayer != null) {
+            "Either watchFaceLayers must be non empty or " +
+                "renderParameters.highlightLayer must be non-null."
+        }
+    }
+
+    /** An element of the watch face to highlight. */
+    public sealed class HighlightedElement {
+        /** All [Complication]s will be highlighted. */
+        public object AllComplications : HighlightedElement()
+
+        /** A single [Complication] with the specified [id] will be highlighted. */
+        public class Complication(public val id: Int) : HighlightedElement() {
+            override fun equals(other: Any?): Boolean {
+                if (this === other) return true
+                if (javaClass != other?.javaClass) return false
+
+                other as Complication
+
+                if (id != other.id) return false
+
+                return true
+            }
+
+            override fun hashCode(): Int {
+                return id
+            }
+        }
+
+        /**
+         * A [UserStyleSetting] to highlight. E.g. for a setting that controls watch hands, the
+         * location of the hands should be highlighted.
+         *
+         * @param id The [UserStyleSetting.Id] of the [UserStyleSetting] to highlight.
+         */
+        public class UserStyle(public val id: UserStyleSetting.Id) : HighlightedElement() {
+            override fun equals(other: Any?): Boolean {
+                if (this === other) return true
+                if (javaClass != other?.javaClass) return false
+
+                other as UserStyle
+
+                if (id != other.id) return false
+                return true
+            }
+
+            override fun hashCode(): Int {
+                return id.hashCode()
             }
         }
     }
 
-    public companion object {
-        /** A layerParameters map where all Layers have [LayerMode.DRAW]. */
-        @JvmField
-        public val DRAW_ALL_LAYERS: Map<Layer, LayerMode> =
-            Layer.values().associateBy({ it }, { LayerMode.DRAW })
+    /**
+     * The definition of what to include in the highlight layer.
+     *
+     * The highlight layer is used by editors to show the parts of the watch face affected by a
+     * setting. E.g. a set of complications or a user style setting.
+     *
+     * The highlight layer is composited on top of the watch face with an alpha blend. It should
+     * be cleared with [backgroundTint]. The solid or semi-transparent outline around
+     * [highlightedElement] should be rendered using the provided [highlightTint]. The highlighted
+     * element itself should be rendered as fully transparent (an alpha value of 0) to leave it
+     * unaffected.
+     *
+     * @param highlightedElement The [HighlightedElement] to draw highlighted with [highlightTint].
+     * @param highlightTint The highlight tint to apply to [highlightedElement].
+     * @param backgroundTint The tint to apply to everything other than [highlightedElement].
+     * Typically this will darken everything else to increase contrast.
+     */
+    public class HighlightLayer(
+        public val highlightedElement: HighlightedElement,
 
+        @ColorInt
+        @get:ColorInt
+        public val highlightTint: Int,
+
+        @ColorInt
+        @get:ColorInt
+        public val backgroundTint: Int
+    ) {
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (javaClass != other?.javaClass) return false
+
+            other as HighlightLayer
+
+            if (highlightedElement != other.highlightedElement) return false
+            if (highlightTint != other.highlightTint) return false
+            if (backgroundTint != other.backgroundTint) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            var result = highlightedElement.hashCode()
+            result = 31 * result + highlightTint
+            result = 31 * result + backgroundTint
+            return result
+        }
+    }
+
+    public companion object {
         /** Default RenderParameters which draws everything in interactive mode. */
         @JvmField
         public val DEFAULT_INTERACTIVE: RenderParameters =
-            RenderParameters(DrawMode.INTERACTIVE, DRAW_ALL_LAYERS, null)
+            RenderParameters(DrawMode.INTERACTIVE, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null)
     }
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public constructor(wireFormat: RenderParametersWireFormat) : this(
         DrawMode.values()[wireFormat.drawMode],
-        wireFormat.layerParameters.associateBy(
-            { Layer.values()[it.layer] },
-            { LayerMode.values()[it.layerMode] }
-        ),
-        wireFormat.selectedComplicationId,
-        wireFormat.outlineTint
+        HashSet<WatchFaceLayer>().apply {
+            WatchFaceLayer.values().forEachIndexed { index, layer ->
+                if (wireFormat.watchFaceLayerSetBitfield and 1.shl(index) != 0) {
+                    add(layer)
+                }
+            }
+        },
+        when (wireFormat.elementType) {
+            RenderParametersWireFormat.ELEMENT_TYPE_NONE -> null
+
+            RenderParametersWireFormat.ELEMENT_TYPE_ALL_COMPLICATIONS -> {
+                HighlightLayer(
+                    HighlightedElement.AllComplications,
+                    wireFormat.highlightTint,
+                    wireFormat.backgroundTint
+                )
+            }
+
+            RenderParametersWireFormat.ELEMENT_TYPE_COMPLICATION -> {
+                HighlightLayer(
+                    HighlightedElement.Complication(wireFormat.elementComplicationId),
+                    wireFormat.highlightTint,
+                    wireFormat.backgroundTint
+                )
+            }
+
+            RenderParametersWireFormat.ELEMENT_TYPE_USER_STYLE -> {
+                HighlightLayer(
+                    HighlightedElement.UserStyle(
+                        UserStyleSetting.Id(wireFormat.elementUserStyleSettingId!!)
+                    ),
+                    wireFormat.highlightTint,
+                    wireFormat.backgroundTint
+                )
+            }
+
+            else -> null
+        }
     )
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
-    public fun toWireFormat(): RenderParametersWireFormat = RenderParametersWireFormat(
-        drawMode.ordinal,
-        layerParameters.map {
-            LayerParameterWireFormat(
-                it.key.ordinal,
-                it.value.ordinal
+    public fun toWireFormat(): RenderParametersWireFormat =
+        when (val thingHighlighted = highlightLayer?.highlightedElement) {
+            is HighlightedElement.AllComplications -> RenderParametersWireFormat(
+                drawMode.ordinal,
+                computeLayersBitfield(),
+                RenderParametersWireFormat.ELEMENT_TYPE_ALL_COMPLICATIONS,
+                0,
+                null,
+                highlightLayer!!.highlightTint,
+                highlightLayer.backgroundTint
             )
-        },
-        selectedComplicationId,
-        outlineTint
-    )
+
+            is HighlightedElement.Complication -> RenderParametersWireFormat(
+                drawMode.ordinal,
+                computeLayersBitfield(),
+                RenderParametersWireFormat.ELEMENT_TYPE_COMPLICATION,
+                thingHighlighted.id,
+                null,
+                highlightLayer!!.highlightTint,
+                highlightLayer.backgroundTint
+            )
+
+            is HighlightedElement.UserStyle -> RenderParametersWireFormat(
+                drawMode.ordinal,
+                computeLayersBitfield(),
+                RenderParametersWireFormat.ELEMENT_TYPE_USER_STYLE,
+                0,
+                thingHighlighted.id.value,
+                highlightLayer!!.highlightTint,
+                highlightLayer.backgroundTint
+            )
+
+            else -> RenderParametersWireFormat(
+                drawMode.ordinal,
+                computeLayersBitfield(),
+                RenderParametersWireFormat.ELEMENT_TYPE_NONE,
+                0,
+                null,
+                Color.BLACK,
+                Color.BLACK
+            )
+        }
+
+    private fun computeLayersBitfield(): Int {
+        var bitfield = 0
+        WatchFaceLayer.values().forEachIndexed { index, layer ->
+            if (watchFaceLayers.contains(layer)) {
+                bitfield += 1.shl(index)
+            }
+        }
+        return bitfield
+    }
 
     internal fun dump(writer: IndentingPrintWriter) {
         writer.println("RenderParameters:")
         writer.increaseIndent()
         writer.println("drawMode=${drawMode.name}")
-        writer.println("selectedComplicationId=$selectedComplicationId")
-        writer.println("outlineTint=$outlineTint")
-        val params = layerParameters.map { "${it.key} -> ${it.value.name}" }.joinToString { it }
-        writer.println("layerParameters=[$params]")
+        writer.println("watchFaceLayers=${watchFaceLayers.joinToString()}")
+
+        highlightLayer?.let {
+            writer.println("HighlightLayer:")
+            writer.increaseIndent()
+            when (it.highlightedElement) {
+                is HighlightedElement.AllComplications -> {
+                    writer.println("HighlightedElement.AllComplications:")
+                }
+
+                is HighlightedElement.Complication -> {
+                    writer.println("HighlightedElement.Complication:")
+                    writer.increaseIndent()
+                    writer.println("id=${it.highlightedElement.id}")
+                    writer.decreaseIndent()
+                }
+
+                is HighlightedElement.UserStyle -> {
+                    writer.println("HighlightedElement.UserStyle:")
+                    writer.increaseIndent()
+                    writer.println("id=${it.highlightedElement.id}")
+                    writer.decreaseIndent()
+                }
+            }
+            writer.println("highlightTint=${it.highlightTint}")
+            writer.println("backgroundTint=${it.backgroundTint}")
+            writer.decreaseIndent()
+        }
         writer.decreaseIndent()
     }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as RenderParameters
+
+        if (drawMode != other.drawMode) return false
+        if (watchFaceLayers != other.watchFaceLayers) return false
+        if (highlightLayer != other.highlightLayer) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = drawMode.hashCode()
+        result = 31 * result + watchFaceLayers.hashCode()
+        result = 31 * result + (highlightLayer?.hashCode() ?: 0)
+        return result
+    }
 }
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index 92fd683..dc51b3f 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -21,6 +21,9 @@
 import android.graphics.Bitmap
 import android.graphics.Canvas
 import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffXfermode
 import android.graphics.Rect
 import android.icu.util.Calendar
 import android.opengl.EGL14
@@ -88,6 +91,10 @@
 
 internal val EGL_SURFACE_ATTRIB_LIST = intArrayOf(EGL14.EGL_NONE)
 
+private val HIGHLIGHT_LAYER_COMPOSITE_PAINT = Paint().apply {
+    xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
+}
+
 /**
  * The base class for [CanvasRenderer] and [GlesRenderer].
  *
@@ -95,11 +102,11 @@
  * @param currentUserStyleRepository The associated [CurrentUserStyleRepository].
  * @param watchState The associated [WatchState].
  * @param interactiveDrawModeUpdateDelayMillis The interval in milliseconds between frames in
- *     interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the frame
- *     rate will be clamped to 10fps. Watch faces are recommended to use lower frame rates if
- *     possible for better battery life. Variable frame rates can also help preserve battery
- *     life, e.g. if a watch face has a short animation once per second it can adjust the frame
- *     rate inorder to sleep when not animating.
+ * interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the frame rate
+ * will be clamped to 10fps. Watch faces are recommended to use lower frame rates if possible for
+ * better battery life. Variable frame rates can also help preserve battery life, e.g. if a watch
+ * face has a short animation once per second it can adjust the frame rate inorder to sleep when
+ * not animating.
  */
 public sealed class Renderer(
     public val surfaceHolder: SurfaceHolder,
@@ -162,6 +169,27 @@
             }
         }
 
+    /**
+     * Accessibility [ContentDescriptionLabel] for any rendered watch face elements other than the
+     * time and [Complication]s which are generated automatically.
+     *
+     * The [Int] in the `Pair<Int, ContentDescriptionLabel>` is used to sort the
+     * [ContentDescriptionLabel]s. Note the time piece has an accessibility traversal index of -1
+     * and each complication's index is defined by its [Complication.accessibilityTraversalIndex].
+     */
+    public var additionalContentDescriptionLabels:
+        Collection<Pair<Int, ContentDescriptionLabel>> = emptyList()
+            set(value) {
+                field = value
+                for (pair in value) {
+                    require(pair.first >= 0) {
+                        "Each accessibility label index in additionalContentDescriptionLabels " +
+                            "must be >= 0"
+                    }
+                }
+                watchFaceHostApi.updateContentDescriptionLabels()
+            }
+
     /** Called when the Renderer is destroyed. */
     @UiThread
     public open fun onDestroy() {
@@ -264,16 +292,16 @@
      * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class.
      *
      * @param surfaceHolder The [SurfaceHolder] from which a [Canvas] to will be obtained and passed
-     *     into [render].
+     * into [render].
      * @param currentUserStyleRepository The watch face's associated [CurrentUserStyleRepository].
      * @param watchState The watch face's associated [WatchState].
      * @param canvasType The type of canvas to request.
      * @param interactiveDrawModeUpdateDelayMillis The interval in milliseconds between frames in
-     *     interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the
-     *     frame rate will be clamped to 10fps. Watch faces are recommended to use lower frame
-     *     rates if possible for better battery life. Variable frame rates can also help preserve
-     *     battery life, e.g. if a watch face has a short animation once per second it can adjust
-     *     the frame rate inorder to sleep when not animating.
+     * interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the frame
+     * rate will be clamped to 10fps. Watch faces are recommended to use lower frame rates if
+     * possible for better battery life. Variable frame rates can also help preserve battery
+     * life, e.g. if a watch face has a short animation once per second it can adjust the frame
+     * rate inorder to sleep when not animating.
      */
     public abstract class CanvasRenderer(
         surfaceHolder: SurfaceHolder,
@@ -301,7 +329,7 @@
                 ) ?: return
             try {
                 if (watchState.isVisible.value) {
-                    render(canvas, surfaceHolder.surfaceFrame, calendar)
+                    renderAndComposite(canvas, calendar)
                 } else {
                     canvas.drawColor(Color.BLACK)
                 }
@@ -322,18 +350,45 @@
             )
             val prevRenderParameters = this.renderParameters
             this.renderParameters = renderParameters
-            render(Canvas(bitmap), screenBounds, calendar)
+            renderAndComposite(Canvas(bitmap), calendar)
             this.renderParameters = prevRenderParameters
             return bitmap
         }
 
+        private fun renderAndComposite(canvas: Canvas, calendar: Calendar) {
+            // Usually renderParameters.watchFaceWatchFaceLayers will be non-empty.
+            if (renderParameters.watchFaceLayers.isNotEmpty()) {
+                render(canvas, screenBounds, calendar)
+
+                // Render and composite the HighlightLayer
+                if (renderParameters.highlightLayer != null) {
+                    val highlightLayer = Bitmap.createBitmap(
+                        screenBounds.width(),
+                        screenBounds.height(),
+                        Bitmap.Config.ARGB_8888
+                    )
+                    renderHighlightLayer(Canvas(highlightLayer), screenBounds, calendar)
+                    canvas.drawBitmap(highlightLayer, 0f, 0f, HIGHLIGHT_LAYER_COMPOSITE_PAINT)
+                    highlightLayer.recycle()
+                }
+            } else {
+                require(renderParameters.highlightLayer != null) {
+                    "We don't support empty renderParameters.watchFaceWatchFaceLayers without a " +
+                        "non-null renderParameters.highlightLayer"
+                }
+                renderHighlightLayer(canvas, screenBounds, calendar)
+            }
+        }
+
         /**
-         * Sub-classes should override this to implement their rendering logic which should respect
-         * the current [DrawMode]. For correct functioning the CanvasRenderer must use the supplied
-         * [Calendar] in favor of any other ways of getting the time.
+         * Sub-classes should override this to implement their watch face rendering logic which
+         * should respect the current [renderParameters]. Any highlights due to
+         * [RenderParameters.highlightLayer] should be rendered by [renderHighlightLayer] instead
+         * where possible. For correct behavior this function must use the supplied [Calendar]
+         * in favor of any other ways of getting the time.
          *
          * @param canvas The [Canvas] to render into. Don't assume this is always the canvas from
-         *     the [SurfaceHolder] backing the display
+         * the [SurfaceHolder] backing the display
          * @param bounds A [Rect] describing the bonds of the canvas to draw into
          * @param calendar The current [Calendar]
          */
@@ -344,6 +399,27 @@
             calendar: Calendar
         )
 
+        /**
+         * Sub-classes should override this to implement their watch face highlight layer rendering
+         * logic for the [RenderParameters.highlightLayer] aspect of [renderParameters]. Typically
+         * the implementation will clear [canvas] to
+         * [RenderParameters.HighlightLayer.backgroundTint] before rendering a transparent highlight
+         * or a solid outline around the [RenderParameters.HighlightLayer.highlightedElement]. This
+         * will be composited as needed on top of the results of [render]. For correct behavior this
+         * function must use the supplied [Calendar] in favor of any other ways of getting the time.
+         *
+         * @param canvas The [Canvas] to render into. Don't assume this is always the canvas from
+         * the [SurfaceHolder] backing the display
+         * @param bounds A [Rect] describing the bonds of the canvas to draw into
+         * @param calendar The current [Calendar]
+         */
+        @UiThread
+        public abstract fun renderHighlightLayer(
+            canvas: Canvas,
+            bounds: Rect,
+            calendar: Calendar
+        )
+
         internal override fun dump(writer: IndentingPrintWriter) {
             writer.println("CanvasRenderer:")
             writer.increaseIndent()
@@ -363,21 +439,22 @@
      * Before passing to the [WatchFace] constructor [initOpenGlContext] must be called.
      *
      * @param surfaceHolder The [SurfaceHolder] whose [android.view.Surface] [render] will draw
-     *     into.
+     * into.
      * @param currentUserStyleRepository The associated [CurrentUserStyleRepository].
      * @param watchState The associated [WatchState].
      * @param interactiveDrawModeUpdateDelayMillis The interval in milliseconds between frames in
-     *     interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the
-     *     frame rate will be clamped to 10fps. Watch faces are recommended to use lower frame
-     *     rates if possible for better battery life. Variable frame rates can also help preserve
-     *     battery life, e.g. if a watch face has a short animation once per second it can adjust
-     *     the frame rate inorder to sleep when not animating.
+     * interactive [DrawMode]s. To render at 60hz set to 16. Note when battery is low, the frame
+     * rate will be clamped to 10fps. Watch faces are recommended to use lower frame rates if
+     * possible for better battery life. Variable frame rates can also help preserve battery life,
+     * e.g. if a watch face has a short animation once per second it can adjust the frame rate
+     * inorder to sleep when not animating.
      * @param eglConfigAttribList Attributes for [EGL14.eglChooseConfig]. By default this selects an
-     *     RGBA8888 back buffer.
+     * RGBA8888 back buffer.
      * @param eglSurfaceAttribList The attributes to be passed to [EGL14.eglCreateWindowSurface]. By
-     *     default this is empty.
+     * default this is empty.
+     * @throws [GlesException] If any GL calls fail during initialization.
      */
-    public abstract class GlesRenderer @JvmOverloads constructor(
+    public abstract class GlesRenderer @Throws(GlesException::class) @JvmOverloads constructor(
         surfaceHolder: SurfaceHolder,
         currentUserStyleRepository: CurrentUserStyleRepository,
         watchState: WatchState,
@@ -396,24 +473,27 @@
             private const val TAG = "Gles2WatchFace"
         }
 
+        /** Exception thrown if a GL call fails */
+        public class GlesException(message: String) : Exception(message)
+
         /** The GlesRenderer's [EGLDisplay]. */
-        public var eglDisplay: EGLDisplay? = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY).apply {
+        public var eglDisplay: EGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY).apply {
             if (this == EGL14.EGL_NO_DISPLAY) {
-                throw RuntimeException("eglGetDisplay returned EGL_NO_DISPLAY")
+                throw GlesException("eglGetDisplay returned EGL_NO_DISPLAY")
             }
             // Initialize the display. The major and minor version numbers are passed back.
             val version = IntArray(2)
             if (!EGL14.eglInitialize(this, version, 0, version, 1)) {
-                throw RuntimeException("eglInitialize failed")
+                throw GlesException("eglInitialize failed")
             }
         }
 
         /** The GlesRenderer's [EGLConfig]. */
-        public var eglConfig: EGLConfig = chooseEglConfig(eglDisplay!!)
+        public var eglConfig: EGLConfig = chooseEglConfig(eglDisplay)
 
         /** The GlesRenderer's [EGLContext]. */
         @SuppressWarnings("SyntheticAccessor")
-        public var eglContext: EGLContext? = EGL14.eglCreateContext(
+        public var eglContext: EGLContext = EGL14.eglCreateContext(
             eglDisplay,
             eglConfig,
             EGL14.EGL_NO_CONTEXT,
@@ -427,14 +507,21 @@
             }
         }
 
-        private var eglSurface: EGLSurface? = null
+        private lateinit var eglSurface: EGLSurface
         private var calledOnGlContextCreated = false
+        private val renderBufferTexture by lazy {
+            RenderBufferTexture(
+                surfaceHolder.surfaceFrame.width(),
+                surfaceHolder.surfaceFrame.height()
+            )
+        }
         internal var initDone = false
 
         /**
          * Chooses the EGLConfig to use.
-         * @throws RuntimeException if [EGL14.eglChooseConfig] fails
+         * @throws [GlesException] if [EGL14.eglChooseConfig] fails
          */
+        @Throws(GlesException::class)
         private fun chooseEglConfig(eglDisplay: EGLDisplay): EGLConfig {
             val numEglConfigs = IntArray(1)
             val eglConfigs = arrayOfNulls<EGLConfig>(1)
@@ -449,16 +536,17 @@
                     0
                 )
             ) {
-                throw RuntimeException("eglChooseConfig failed")
+                throw GlesException("eglChooseConfig failed")
             }
             if (numEglConfigs[0] == 0) {
-                throw RuntimeException("no matching EGL configs")
+                throw GlesException("no matching EGL configs")
             }
             return eglConfigs[0]!!
         }
 
+        @Throws(GlesException::class)
         private fun createWindowSurface(width: Int, height: Int) {
-            if (eglSurface != null) {
+            if (this::eglSurface.isInitialized) {
                 if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
                     Log.w(TAG, "eglDestroySurface failed")
                 }
@@ -481,7 +569,7 @@
                 )
             }
             if (eglSurface == EGL14.EGL_NO_SURFACE) {
-                throw RuntimeException("eglCreateWindowSurface failed")
+                throw GlesException("eglCreateWindowSurface failed")
             }
 
             makeContextCurrent()
@@ -495,41 +583,40 @@
 
         @CallSuper
         override fun onDestroy() {
-            if (eglSurface != null) {
+            if (this::eglSurface.isInitialized) {
                 if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
                     Log.w(TAG, "eglDestroySurface failed")
                 }
-                eglSurface = null
             }
-            if (eglContext != null) {
-                if (!EGL14.eglDestroyContext(eglDisplay, eglContext)) {
-                    Log.w(TAG, "eglDestroyContext failed")
-                }
-                eglContext = null
+            if (!EGL14.eglDestroyContext(eglDisplay, eglContext)) {
+                Log.w(TAG, "eglDestroyContext failed")
             }
-            if (eglDisplay != null) {
-                if (!EGL14.eglTerminate(eglDisplay)) {
-                    Log.w(TAG, "eglTerminate failed")
-                }
-                eglDisplay = null
+            if (!EGL14.eglTerminate(eglDisplay)) {
+                Log.w(TAG, "eglTerminate failed")
             }
         }
 
         /**
-         * Sets our GL context to be the current one. This method *must* be called before any OpenGL
-         * APIs are used.
+         * Sets our GL context to be the current one. The library does this on your behalf before
+         * calling [onGlContextCreated] or [render]. If you need to make any OpenGL calls outside
+         * those functions, this method *must* be called first.
+         *
+         * @throws [IllegalStateException] if the calls to [EGL14.eglMakeCurrent] fails
          */
-        private fun makeContextCurrent() {
+        public fun makeContextCurrent() {
             if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
-                throw RuntimeException("eglMakeCurrent failed")
+                throw IllegalStateException("eglMakeCurrent failed")
             }
         }
 
         /**
          * Initializes the GlesRenderer, and calls [onGlSurfaceCreated]. It is an error to construct
          * a [WatchFace] before this method has been called.
+         *
+         * @throws [GlesException] If any GL calls fail.
          */
         @UiThread
+        @Throws(GlesException::class)
         public fun initOpenGlContext() {
             surfaceHolder.addCallback(object : SurfaceHolder.Callback {
                 @SuppressLint("SyntheticAccessor")
@@ -544,10 +631,11 @@
 
                 @SuppressLint("SyntheticAccessor")
                 override fun surfaceDestroyed(holder: SurfaceHolder) {
-                    if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
-                        Log.w(TAG, "eglDestroySurface failed")
+                    if (this@GlesRenderer::eglSurface.isInitialized) {
+                        if (!EGL14.eglDestroySurface(eglDisplay, eglSurface)) {
+                            Log.w(TAG, "eglDestroySurface failed")
+                        }
                     }
-                    eglSurface = null
                 }
 
                 override fun surfaceCreated(holder: SurfaceHolder) {
@@ -564,7 +652,10 @@
             initDone = true
         }
 
-        /** Called when a new GL context is created. It's safe to use GL APIs in this method. */
+        /**
+         * Called when a new GL context is created. It's safe to use GL APIs in this method. Note
+         * [makeContextCurrent] is called by the library before this method.
+         */
         @UiThread
         public open fun onGlContextCreated() {
         }
@@ -583,7 +674,8 @@
             calendar: Calendar
         ) {
             makeContextCurrent()
-            render(calendar)
+            GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)
+            renderAndComposite(calendar)
             if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) {
                 Log.w(TAG, "eglSwapBuffers failed")
             }
@@ -600,7 +692,8 @@
             makeContextCurrent()
             val prevRenderParameters = this.renderParameters
             this.renderParameters = renderParameters
-            render(calendar)
+            GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)
+            renderAndComposite(calendar)
             this.renderParameters = prevRenderParameters
             GLES20.glFinish()
             GLES20.glReadPixels(
@@ -620,6 +713,30 @@
             return bitmap
         }
 
+        private fun renderAndComposite(calendar: Calendar) {
+            // Usually renderParameters.watchFaceWatchFaceLayers will be non-empty.
+            if (renderParameters.watchFaceLayers.isNotEmpty()) {
+                render(calendar)
+
+                // Render and composite the HighlightLayer
+                if (renderParameters.highlightLayer != null) {
+                    renderBufferTexture.bindFrameBuffer()
+                    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ZERO)
+                    renderHighlightLayer(calendar)
+                    GLES20.glFlush()
+
+                    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0)
+                    renderBufferTexture.compositeQuad()
+                }
+            } else {
+                require(renderParameters.highlightLayer != null) {
+                    "We don't support empty renderParameters.watchFaceWatchFaceLayers without a " +
+                        "non-null renderParameters.highlightLayer"
+                }
+                renderHighlightLayer(calendar)
+            }
+        }
+
         private fun verticalFlip(
             buffer: ByteBuffer,
             width: Int,
@@ -648,15 +765,32 @@
         }
 
         /**
-         * Sub-classes should override this to implement their rendering logic which should respect
-         * the current [DrawMode]. For correct functioning the GlesRenderer must use the supplied
-         * [Calendar] in favor of any other ways of getting the time.
+         * Sub-classes should override this to implement their watch face rendering logic which
+         * should respect the current [renderParameters]. Any highlights due to
+         * [RenderParameters.highlightLayer] should be rendered by [renderHighlightLayer] instead
+         * where possible. For correct behavior this function must use the supplied [Calendar]
+         * in favor of any other ways of getting the time. Note [makeContextCurrent] is called by
+         * the library before this method.
          *
          * @param calendar The current [Calendar]
          */
         @UiThread
         public abstract fun render(calendar: Calendar)
 
+        /**
+         * Sub-classes should override this to implement their watch face highlight layer rendering
+         * logic for the [RenderParameters.highlightLayer] aspect of [renderParameters]. Typically
+         * the implementation will clear the buffer to
+         * [RenderParameters.HighlightLayer.backgroundTint] before rendering a transparent highlight
+         * or a solid outline around the [RenderParameters.HighlightLayer.highlightedElement]. This
+         * will be composited as needed on top of the results of [render]. For correct behavior this
+         * function must use the supplied [Calendar] in favor of any other ways of getting the time.
+         *
+         * @param calendar The current [Calendar]
+         */
+        @UiThread
+        public abstract fun renderHighlightLayer(calendar: Calendar)
+
         internal override fun dump(writer: IndentingPrintWriter) {
             writer.println("GlesRenderer:")
             writer.increaseIndent()
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index 6bdb080..8dbc10c 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -23,8 +23,6 @@
 import android.content.Intent
 import android.content.IntentFilter
 import android.graphics.Bitmap
-import android.graphics.Color
-import android.graphics.Point
 import android.graphics.Rect
 import android.icu.util.Calendar
 import android.icu.util.TimeZone
@@ -32,8 +30,8 @@
 import android.os.Build
 import android.support.wearable.watchface.WatchFaceStyle
 import android.util.Base64
+import android.view.Gravity
 import android.view.Surface.FRAME_RATE_COMPATIBILITY_DEFAULT
-import android.view.ViewConfiguration
 import androidx.annotation.ColorInt
 import androidx.annotation.IntDef
 import androidx.annotation.IntRange
@@ -42,13 +40,14 @@
 import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
 import androidx.annotation.UiThread
 import androidx.annotation.VisibleForTesting
-import androidx.wear.utility.TraceEvent
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationData
-import androidx.wear.watchface.style.UserStyle
+import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleData
+import androidx.wear.watchface.style.UserStyleSchema
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 import kotlinx.coroutines.CompletableDeferred
 import java.io.FileNotFoundException
@@ -89,12 +88,13 @@
     val hashMap = HashMap<String, ByteArray>()
     try {
         val reader = InputStreamReader(context.openFileInput(fileName)).buffered()
-        while (true) {
-            val key = reader.readLine() ?: break
-            val value = reader.readLine() ?: break
-            hashMap[key] = Base64.decode(value, Base64.NO_WRAP)
+        reader.use {
+            while (true) {
+                val key = reader.readLine() ?: break
+                val value = reader.readLine() ?: break
+                hashMap[key] = Base64.decode(value, Base64.NO_WRAP)
+            }
         }
-        reader.close()
     } catch (e: FileNotFoundException) {
         // We don't need to do anything special here.
     }
@@ -103,13 +103,14 @@
 
 private fun writePrefs(context: Context, fileName: String, style: UserStyle) {
     val writer = context.openFileOutput(fileName, Context.MODE_PRIVATE).bufferedWriter()
-    for ((key, value) in style.selectedOptions) {
-        writer.write(key.id.value)
-        writer.newLine()
-        writer.write(Base64.encodeToString(value.id.value, Base64.NO_WRAP))
-        writer.newLine()
+    writer.use {
+        for ((key, value) in style.selectedOptions) {
+            writer.write(key.id.value)
+            writer.newLine()
+            writer.write(Base64.encodeToString(value.id.value, Base64.NO_WRAP))
+            writer.newLine()
+        }
     }
-    writer.close()
 }
 
 /**
@@ -117,16 +118,16 @@
  * complications and state observers.
  *
  * @param watchFaceType The type of watch face, whether it's digital or analog. Used to determine
- *     the default time for editor preview screenshots.
+ * the default time for editor preview screenshots.
  * @param currentUserStyleRepository The [CurrentUserStyleRepository] for this WatchFace.
  * @param renderer The [Renderer] for this WatchFace.
  * @param complicationsManager The [ComplicationsManager] for this WatchFace.
  */
 public class WatchFace @JvmOverloads constructor(
-    @WatchFaceType internal var watchFaceType: Int,
+    @WatchFaceType public var watchFaceType: Int,
     public val currentUserStyleRepository: CurrentUserStyleRepository,
-    internal val renderer: Renderer,
-    internal var complicationsManager: ComplicationsManager =
+    public val renderer: Renderer,
+    public var complicationsManager: ComplicationsManager =
         ComplicationsManager(emptyList(), currentUserStyleRepository)
 ) {
     internal var tapListener: TapListener? = null
@@ -147,7 +148,7 @@
         private val componentNameToEditorDelegate = HashMap<ComponentName, EditorDelegate>()
 
         private var pendingComponentName: ComponentName? = null
-        private var pendingEditorDelegateCB: CompletableDeferred<EditorDelegate?>? = null
+        private var pendingEditorDelegateCB: CompletableDeferred<EditorDelegate>? = null
 
         /** @hide */
         @JvmStatic
@@ -158,6 +159,18 @@
             editorDelegate: EditorDelegate
         ) {
             componentNameToEditorDelegate[componentName] = editorDelegate
+
+            if (componentName == pendingComponentName) {
+                pendingEditorDelegateCB?.complete(editorDelegate)
+            } else {
+                pendingEditorDelegateCB?.completeExceptionally(
+                    IllegalStateException(
+                        "Expected $pendingComponentName to be created but got $componentName"
+                    )
+                )
+            }
+            pendingComponentName = null
+            pendingEditorDelegateCB = null
         }
 
         internal fun unregisterEditorDelegate(componentName: ComponentName) {
@@ -182,7 +195,7 @@
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
         public fun getOrCreateEditorDelegate(
             componentName: ComponentName
-        ): CompletableDeferred<EditorDelegate?> {
+        ): CompletableDeferred<EditorDelegate> {
             componentNameToEditorDelegate[componentName]?.let {
                 return CompletableDeferred(it)
             }
@@ -193,21 +206,6 @@
             pendingEditorDelegateCB = CompletableDeferred()
             return pendingEditorDelegateCB!!
         }
-
-        @UiThread
-        internal fun maybeCreatePendingEditorDelegate(watchface: WatchFaceImpl) {
-            if (pendingComponentName != null) {
-                pendingEditorDelegateCB?.complete(
-                    if (watchface.componentName == pendingComponentName) {
-                        watchface.createWFEditorDelegate()
-                    } else {
-                        null
-                    }
-                )
-                pendingComponentName = null
-                pendingEditorDelegateCB = null
-            }
-        }
     }
 
     /**
@@ -254,10 +252,34 @@
 
     /** Listens for taps on the watchface which didn't land on [Complication]s. */
     public interface TapListener {
-        /** Called whenever the user taps on the watchface but doesn't hit a [Complication]. */
+        /**
+         * Called whenever the user taps on the watchface but doesn't hit a [Complication].
+         *
+         * The watch face receives three different types of touch events:
+         * - [TapType.DOWN] when the user puts the finger down on the touchscreen
+         * - [TapType.UP] when the user lifts the finger from the touchscreen
+         * - [TapType.CANCEL] when the system detects that the user is performing a gesture other
+         *   than a tap
+         *
+         * Note that the watch face is only given tap events, i.e., events where the user puts
+         * the finger down on the screen and then lifts it at the position. If the user performs any
+         * other type of gesture while their finger in on the touchscreen, the watch face will be
+         * receive a cancel, as all other gestures are reserved by the system.
+         *
+         * Therefore, a [TapType.DOWN] event and the successive [TapType.UP] event are guaranteed
+         * to be close enough to be considered a tap according to the value returned by
+         * [android.view.ViewConfiguration.getScaledTouchSlop].
+         *
+         * If the watch face receives a [TapType.CANCEL] event, it should not trigger any action, as
+         * the system is already processing the gesture.
+         *
+         * @param tapType the type of touch event sent to the watch face
+         * @param xPos the horizontal position in pixels on the screen where the touch happened
+         * @param yPos the vertical position in pixels on the screen where the touch happened
+         */
         @UiThread
         public fun onTap(
-            @TapType originalTapType: Int,
+            @TapType tapType: Int,
             @Px xPos: Int,
             @Px yPos: Int
         )
@@ -266,22 +288,20 @@
     /**
      * Legacy Wear 2.0 watch face styling. These settings will be ignored on Wear 3.0 devices.
      *
-     * @param viewProtectionMode The view protection mode bit field, must be a combination of
-     *     zero or more of [PROTECT_STATUS_BAR], [PROTECT_HOTWORD_INDICATOR],
-     *     [PROTECT_WHOLE_SCREEN].
+     * @param viewProtectionMode The view protection mode bit field, must be a combination of zero
+     * or more of [WatchFaceStyle.PROTECT_STATUS_BAR], [WatchFaceStyle.PROTECT_HOTWORD_INDICATOR],
+     * [WatchFaceStyle.PROTECT_WHOLE_SCREEN].
      * @param statusBarGravity Controls the position of status icons (battery state, lack of
-     *     connection) on the screen. This must be any combination of horizontal Gravity constant:
-     *         ([Gravity.LEFT], [Gravity.CENTER_HORIZONTAL], [Gravity.RIGHT])
-     *         and vertical Gravity constants ([Gravity.TOP], [Gravity,CENTER_VERTICAL},
-     *         [Gravity,BOTTOM]), e.g. {@code Gravity.LEFT | Gravity.BOTTOM}. On circular screens,
-     *          only the vertical gravity is respected.
+     * connection) on the screen. This must be any combination of horizontal Gravity constant:
+     * ([Gravity.LEFT], [Gravity.CENTER_HORIZONTAL], [Gravity.RIGHT]) and vertical Gravity
+     * constants ([Gravity.TOP], [Gravity.CENTER_VERTICAL], [Gravity.BOTTOM]), e.g.
+     * `[Gravity.LEFT] | [Gravity.BOTTOM]`. On circular screens, only the vertical gravity is
+     * respected.
      * @param tapEventsAccepted Controls whether this watch face accepts tap events. Watchfaces
-     *     that set this {@code true} are indicating they are prepared to receive
-     *     [IInteractiveWatchFaceSysUI.TAP_TYPE_DOWN],
-     *     [IInteractiveWatchFaceSysUI.TAP_TYPE_CANCEL], and
-     *     [IInteractiveWatchFaceSysUI.TAP_TYPE_UP] events.
+     * that set this `true` are indicating they are prepared to receive [TapType.DOWN],
+     * [TapType.CANCEL], and [TapType.UP] events.
      * @param accentColor The accent color which will be used when drawing the unread notification
-     *     indicator. Default color is white.
+     * indicator. Default color is white.
      * @throws IllegalArgumentException if [viewProtectionMode] has an unexpected value
      */
     public class LegacyWatchFaceOverlayStyle @JvmOverloads constructor(
@@ -359,13 +379,15 @@
     }
 }
 
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @SuppressLint("SyntheticAccessor")
-internal class WatchFaceImpl(
+public class WatchFaceImpl(
     watchface: WatchFace,
     private val watchFaceHostApi: WatchFaceHostApi,
     private val watchState: WatchState
 ) {
-    companion object {
+    internal companion object {
         internal const val NO_DEFAULT_PROVIDER = SystemProviders.NO_PROVIDER
 
         internal const val MOCK_TIME_INTENT = "androidx.wear.watchface.MockTime"
@@ -413,10 +435,9 @@
     private var mockTime = MockTime(1.0, 0, Long.MAX_VALUE)
 
     private var lastTappedComplicationId: Int? = null
-    private var lastTappedPosition: Point? = null
-    private var registeredReceivers = false
+    internal var broadcastsReceiver: BroadcastsReceiver? = null
 
-    // True if NotificationManager.INTERRUPTION_FILTER_NONE.
+    // True if 'Do Not Disturb' mode is on.
     private var muteMode = false
     private var nextDrawTimeMillis: Long = 0
 
@@ -425,8 +446,6 @@
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     public val calendar: Calendar = Calendar.getInstance()
 
-    private val pendingSingleTap: CancellableUniqueTask =
-        CancellableUniqueTask(watchFaceHostApi.getHandler())
     private val pendingUpdateTime: CancellableUniqueTask =
         CancellableUniqueTask(watchFaceHostApi.getHandler())
 
@@ -446,7 +465,7 @@
         legacyWatchFaceStyle.tapEventsAccepted
     )
 
-    private val broadcastEventObserver = object : BroadcastReceivers.BroadcastEventObserver {
+    private val broadcastEventObserver = object : BroadcastsReceiver.BroadcastEventObserver {
         override fun onActionTimeTick() {
             if (!watchState.isAmbient.value) {
                 renderer.invalidate()
@@ -513,43 +532,6 @@
             else -> throw InvalidParameterException("Unrecognized watchFaceType")
         }
 
-    init {
-        // If the system has a stored user style then Home/SysUI is in charge of style
-        // persistence, otherwise we need to do our own.
-        val storedUserStyle = watchFaceHostApi.getInitialUserStyle()
-        if (storedUserStyle != null) {
-            userStyleRepository.userStyle =
-                UserStyle(UserStyleData(storedUserStyle), userStyleRepository.schema)
-        } else {
-            // The system doesn't support preference persistence we need to do it ourselves.
-            val preferencesFile =
-                "watchface_prefs_${watchFaceHostApi.getContext().javaClass.name}.txt"
-
-            userStyleRepository.userStyle = UserStyle(
-                UserStyleData(readPrefs(watchFaceHostApi.getContext(), preferencesFile)),
-                userStyleRepository.schema
-            )
-
-            userStyleRepository.addUserStyleChangeListener(
-                object : CurrentUserStyleRepository.UserStyleChangeListener {
-                    @SuppressLint("SyntheticAccessor")
-                    override fun onUserStyleChanged(userStyle: UserStyle) {
-                        writePrefs(watchFaceHostApi.getContext(), preferencesFile, userStyle)
-                    }
-                })
-        }
-
-        renderer.watchFaceHostApi = watchFaceHostApi
-
-        setIsBatteryLowAndNotChargingFromBatteryStatus(
-            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
-                watchFaceHostApi.getContext().registerReceiver(null, iFilter)
-            }
-        )
-
-        WatchFace.maybeCreatePendingEditorDelegate(this)
-    }
-
     private var inOnSetStyle = false
 
     private val ambientObserver = Observer<Boolean> {
@@ -558,7 +540,11 @@
     }
 
     private val interruptionFilterObserver = Observer<Int> {
-        val inMuteMode = it == NotificationManager.INTERRUPTION_FILTER_NONE
+        // We are in mute mode in any of the following modes. The specific mode depends on the
+        // device's implementation of "Do Not Disturb".
+        val inMuteMode = it == NotificationManager.INTERRUPTION_FILTER_NONE ||
+            it == NotificationManager.INTERRUPTION_FILTER_PRIORITY ||
+            it == NotificationManager.INTERRUPTION_FILTER_ALARMS
         if (muteMode != inMuteMode) {
             muteMode = inMuteMode
             watchFaceHostApi.invalidate()
@@ -596,6 +582,39 @@
     }
 
     init {
+        // If the system has a stored user style then Home/SysUI is in charge of style
+        // persistence, otherwise we need to do our own.
+        val storedUserStyle = watchFaceHostApi.getInitialUserStyle()
+        if (storedUserStyle != null) {
+            userStyleRepository.userStyle =
+                UserStyle(UserStyleData(storedUserStyle), userStyleRepository.schema)
+        } else {
+            // The system doesn't support preference persistence we need to do it ourselves.
+            val preferencesFile =
+                "watchface_prefs_${watchFaceHostApi.getContext().javaClass.name}.txt"
+
+            userStyleRepository.userStyle = UserStyle(
+                UserStyleData(readPrefs(watchFaceHostApi.getContext(), preferencesFile)),
+                userStyleRepository.schema
+            )
+
+            userStyleRepository.addUserStyleChangeListener(
+                object : CurrentUserStyleRepository.UserStyleChangeListener {
+                    @SuppressLint("SyntheticAccessor")
+                    override fun onUserStyleChanged(userStyle: UserStyle) {
+                        writePrefs(watchFaceHostApi.getContext(), preferencesFile, userStyle)
+                    }
+                })
+        }
+
+        renderer.watchFaceHostApi = watchFaceHostApi
+
+        setIsBatteryLowAndNotChargingFromBatteryStatus(
+            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
+                watchFaceHostApi.getContext().registerReceiver(null, iFilter)
+            }
+        )
+
         // We need to inhibit an immediate callback during initialization because members are not
         // fully constructed and it will fail. It's also superfluous because we're going to render
         // anyway.
@@ -721,7 +740,6 @@
     }
 
     internal fun onDestroy() {
-        pendingSingleTap.cancel()
         pendingUpdateTime.cancel()
         renderer.onDestroy()
         watchState.isAmbient.removeObserver(ambientObserver)
@@ -736,23 +754,26 @@
         unregisterReceivers()
     }
 
+    @UiThread
     private fun registerReceivers() {
-        if (registeredReceivers) {
-            return
+        require(watchFaceHostApi.getHandler().looper.isCurrentThread) {
+            "registerReceivers must be called the UiThread"
         }
-        registeredReceivers = true
-        BroadcastReceivers.addBroadcastEventObserver(
-            watchFaceHostApi.getContext(),
-            broadcastEventObserver
-        )
+
+        // There's no point registering BroadcastsReceiver for headless instances.
+        if (broadcastsReceiver == null && !watchState.isHeadless) {
+            broadcastsReceiver =
+                BroadcastsReceiver(watchFaceHostApi.getContext(), broadcastEventObserver)
+        }
     }
 
+    @UiThread
     private fun unregisterReceivers() {
-        if (!registeredReceivers) {
-            return
+        require(watchFaceHostApi.getHandler().looper.isCurrentThread) {
+            "unregisterReceivers must be called the UiThread"
         }
-        registeredReceivers = false
-        BroadcastReceivers.removeBroadcastEventObserver(broadcastEventObserver)
+        broadcastsReceiver?.onDestroy()
+        broadcastsReceiver = null
     }
 
     private fun scheduleDraw() {
@@ -802,12 +823,7 @@
             newDrawMode = DrawMode.MUTE
         }
         renderer.renderParameters =
-            RenderParameters(
-                newDrawMode,
-                RenderParameters.DRAW_ALL_LAYERS,
-                null,
-                Color.BLACK // Required by the constructor but unused.
-            )
+            RenderParameters(newDrawMode, WatchFaceLayer.ALL_WATCH_FACE_LAYERS, null)
     }
 
     /** @hide */
@@ -867,8 +883,7 @@
     /**
      * Called when new complication data is received.
      *
-     * @param watchFaceComplicationId The id of the complication that the data relates to. This will
-     *     be an id that was previously sent in a call to [setActiveComplications].
+     * @param watchFaceComplicationId The id of the complication that the data relates to.
      * @param data The [ComplicationData] that should be displayed in the complication.
      */
     @UiThread
@@ -888,87 +903,48 @@
      * Called when a tap or touch related event occurs. Detects double and single taps on
      * complications and triggers the associated action.
      *
-     * @param originalTapType Value representing the event sent to the wallpaper
+     * @param tapType Value representing the event sent to the wallpaper
      * @param x X coordinate of the event
      * @param y Y coordinate of the event
      */
     @UiThread
     internal fun onTapCommand(
-        @TapType originalTapType: Int,
+        @TapType tapType: Int,
         x: Int,
         y: Int
     ) {
         val tappedComplication = complicationsManager.getComplicationAt(x, y)
         if (tappedComplication == null) {
-            clearGesture()
-            tapListener?.onTap(originalTapType, x, y)
+            // The event does not belong to any of the complications, pass to the listener.
+            lastTappedComplicationId = null
+            tapListener?.onTap(tapType, x, y)
             return
         }
 
-        // Unfortunately we don't get MotionEvents so we can't directly use the GestureDetector
-        // to distinguish between single and double taps. Currently we do that ourselves.
-        // TODO(alexclarke): Revisit this
-        var tapType = originalTapType
-        when (tapType) {
-            TapType.DOWN -> {
-                lastTappedPosition = Point(x, y)
-            }
-            TapType.CANCEL -> {
-                lastTappedPosition?.let { safeLastTappedPosition ->
-                    if ((safeLastTappedPosition.x == x) && (safeLastTappedPosition.y == y)) {
-                        tapType = TapType.UP
-                    }
-                }
-                lastTappedPosition = null
-            }
-        }
-
         when (tapType) {
             TapType.UP -> {
                 if (tappedComplication.id != lastTappedComplicationId &&
                     lastTappedComplicationId != null
                 ) {
-                    clearGesture()
+                    // The UP event belongs to a different complication then the DOWN event,
+                    // do not consider this a tap on either of them.
+                    lastTappedComplicationId = null
                     return
                 }
-                if (!pendingSingleTap.isPending()) {
-                    // Give the user immediate visual feedback, the UI feels sluggish if we defer
-                    // this.
-                    complicationsManager.displayPressedAnimation(tappedComplication.id)
-
-                    lastTappedComplicationId = tappedComplication.id
-
-                    // This could either be a single or a double tap, post a task to process the
-                    // single tap which will get canceled if a double tap gets there first
-                    pendingSingleTap.postDelayedUnique(
-                        ViewConfiguration.getDoubleTapTimeout().toLong()
-                    ) {
-                        complicationsManager.onComplicationSingleTapped(tappedComplication.id)
-                        watchFaceHostApi.invalidate()
-                        clearGesture()
-                    }
-                }
+                complicationsManager.displayPressedAnimation(tappedComplication.id)
+                complicationsManager.onComplicationSingleTapped(tappedComplication.id)
+                watchFaceHostApi.invalidate()
+                lastTappedComplicationId = null
             }
             TapType.DOWN -> {
-                // Make sure the user isn't doing a swipe.
-                if (tappedComplication.id != lastTappedComplicationId &&
-                    lastTappedComplicationId != null
-                ) {
-                    clearGesture()
-                }
                 lastTappedComplicationId = tappedComplication.id
             }
-            else -> clearGesture()
+            else -> lastTappedComplicationId = null
         }
     }
 
-    private fun clearGesture() {
-        lastTappedComplicationId = null
-        pendingSingleTap.cancel()
-    }
-
     @UiThread
-    fun dump(writer: IndentingPrintWriter) {
+    internal fun dump(writer: IndentingPrintWriter) {
         writer.println("WatchFaceImpl ($componentName): ")
         writer.increaseIndent()
         writer.println("calendar=$calendar")
@@ -977,10 +953,8 @@
         writer.println("mockTime.speed=${mockTime.speed}")
         writer.println("nextDrawTimeMillis=$nextDrawTimeMillis")
         writer.println("muteMode=$muteMode")
-        writer.println("pendingSingleTap=${pendingSingleTap.isPending()}")
         writer.println("pendingUpdateTime=${pendingUpdateTime.isPending()}")
         writer.println("lastTappedComplicationId=$lastTappedComplicationId")
-        writer.println("lastTappedPosition=$lastTappedPosition")
         writer.println("currentUserStyleRepository.userStyle=${userStyleRepository.userStyle}")
         writer.println("currentUserStyleRepository.schema=${userStyleRepository.schema}")
         watchState.dump(writer)
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
index 087a334..55f0263 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceHostApi.kt
@@ -20,10 +20,9 @@
 import android.content.Context
 import android.os.Handler
 import android.support.wearable.complications.ComplicationData
-import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
-import androidx.wear.complications.SystemProviders
+import androidx.wear.complications.SystemProviders.ProviderId
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 
 /**
@@ -59,8 +58,7 @@
      * This is a fairly expensive operation so use it sparingly (e.g. do not call it in
      * `onDraw()`).
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    public fun setContentDescriptionLabels(labels: Array<ContentDescriptionLabel>)
+    public fun updateContentDescriptionLabels()
 
     /**
      * Sets the complications which are active in the watchface. Complication data will be
@@ -91,7 +89,7 @@
      * permission, it will not be able to receive data from the provider unless the provider is
      * from the same app package as the watch face, or the provider lists the watch face as a
      * safe watch face. For system providers that may be used before your watch face has the
-     * permission, use [.setDefaultSystemComplicationProvider] with a safe provider
+     * permission, use [setDefaultSystemComplicationProvider] with a safe provider
      * instead.
      *
      * A provider not satisfying the above conditions may still be set as a default using
@@ -100,16 +98,16 @@
      *
      * @param watchFaceComplicationId The watch face's ID for the complication
      * @param providers The list of non-system providers to try in order before falling back to
-     *     fallbackSystemProvider. This list may be null.
-     * @param fallbackSystemProvider The system provider to use if none of the providers could
-     *     be used.
-     * @param type The type of complication data that should be provided. Must be one of the
-     *     types defined in [ComplicationData]
+     * fallbackSystemProvider. This list may be null.
+     * @param fallbackSystemProvider The system provider to use if none of the providers could be
+     * used.
+     * @param type The type of complication data that should be provided. Must be one of the types
+     * defined in [ComplicationData].
      */
     public fun setDefaultComplicationProviderWithFallbacks(
         watchFaceComplicationId: Int,
         providers: List<ComponentName>?,
-        @SystemProviders.ProviderId fallbackSystemProvider: Int,
+        @ProviderId fallbackSystemProvider: Int,
         type: Int
     )
 
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index 448ec9a..b9a7ee8 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -36,12 +36,14 @@
 import android.support.wearable.watchface.Constants
 import android.support.wearable.watchface.IWatchFaceService
 import android.support.wearable.watchface.SharedMemoryImage
+import android.support.wearable.watchface.accessibility.AccessibilityUtils
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
 import android.util.Log
 import android.view.Choreographer
 import android.view.Surface
 import android.view.SurfaceHolder
 import android.view.WindowInsets
+import android.view.accessibility.AccessibilityManager
 import androidx.annotation.IntDef
 import androidx.annotation.Px
 import androidx.annotation.RequiresApi
@@ -59,9 +61,11 @@
 import androidx.wear.watchface.control.InteractiveInstanceManager
 import androidx.wear.watchface.control.InteractiveWatchFaceImpl
 import androidx.wear.watchface.control.data.ComplicationRenderParams
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
+import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.data.ComplicationStateWireFormat
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
@@ -104,28 +108,36 @@
 public annotation class TapType {
     public companion object {
         /**
-         * Used in [WatchFaceImpl#onTapCommand] to indicate a "down" touch event on the watch face.
+         * Used to indicate a "down" touch event on the watch face.
+         *
+         * The watch face will receive an [UP] or a [CANCEL] event to follow this event, to
+         * indicate whether this down event corresponds to a tap gesture to be handled by the watch
+         * face, or a different type of gesture that is handled by the system, respectively.
          */
         public const val DOWN: Int = IInteractiveWatchFace.TAP_TYPE_DOWN
 
         /**
-         * Used in [WatchFaceImpl#onTapCommand] to indicate that a previous [TapType.DOWN] touch
-         * event has been canceled. This generally happens when the watch face is touched but then a
-         * move or long press occurs.
+         * Used in to indicate that a previous [TapType.DOWN] touch event has been canceled. This
+         * generally happens when the watch face is touched but then a move or long press occurs.
+         *
+         * The watch face should not trigger any action, as the system is already processing the
+         * gesture.
          */
         public const val CANCEL: Int = IInteractiveWatchFace.TAP_TYPE_CANCEL
 
         /**
-         * Used in [WatchFaceImpl#onTapCommand] to indicate that an "up" event on the watch face has
-         * occurred that has not been consumed by another activity. A [TapType.DOWN] will always
-         * occur first. This event will not occur if a [TapType.CANCEL] is sent.
+         * Used to indicate that an "up" event on the watch face has occurred that has not been
+         * consumed by the system. A [TapType.DOWN] will always occur first. This event will not
+         * be sent if a [TapType.CANCEL] is sent.
+         *
+         * Therefore, a [TapType.DOWN] event and the successive [TapType.UP] event are guaranteed
+         * to be close enough to be considered a tap according to the value returned by
+         * [android.view.ViewConfiguration.getScaledTouchSlop].
          */
         public const val UP: Int = IInteractiveWatchFace.TAP_TYPE_UP
     }
 }
 
-private class PendingComplicationData(val complicationId: Int, val data: ComplicationData)
-
 /**
  * WatchFaceService and [WatchFace] are a pair of classes intended to handle much of
  * the boilerplate needed to implement a watch face without being too opinionated. The suggested
@@ -229,12 +241,21 @@
 
         // Filename for persisted preferences to be used in a direct boot scenario.
         private const val DIRECT_BOOT_PREFS = "directboot.prefs"
+
+        // The index of the watch element in the content description labels. Usually it will be
+        // first.
+        private const val WATCH_ELEMENT_ACCESSIBILITY_TRAVERSAL_INDEX = -1
+
+        // The maximum permitted duration of [WatchFaceService.MAX_CREATE_WATCHFACE_TIME_MILLIS].
+        private const val MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000
     }
 
     /**
      * Override this factory method to create your WatchFaceImpl. This method will be called by the
      * library on the UiThread. If possible any expensive initialization should be done on a
-     * background thread.
+     * background thread to avoid blocking the UiThread.
+     *
+     * Warning watch face initialization will fail if createWatchFace takes longer than 5 seconds.
      *
      * @param surfaceHolder The [SurfaceHolder] to pass to the [Renderer]'s constructor.
      * @param watchState The [WatchState] for the watch face.
@@ -285,11 +306,11 @@
         "WatchFaceService.readDirectBootPrefs"
     ).use {
         try {
-            val reader = context.openFileInput(fileName)
-            val result =
+            val directBootContext = context.createDeviceProtectedStorageContext()
+            val reader = directBootContext.openFileInput(fileName)
+            reader.use {
                 ParcelUtils.fromInputStream<WallpaperInteractiveWatchFaceInstanceParams>(reader)
-            reader.close()
-            result
+            }
         } catch (e: Exception) {
             null
         }
@@ -300,9 +321,235 @@
         fileName: String,
         prefs: WallpaperInteractiveWatchFaceInstanceParams
     ): Unit = TraceEvent("WatchFaceService.writeDirectBootPrefs").use {
-        val writer = context.openFileOutput(fileName, Context.MODE_PRIVATE)
-        ParcelUtils.toOutputStream(prefs, writer)
-        writer.close()
+        val directBootContext = context.createDeviceProtectedStorageContext()
+        val writer = directBootContext.openFileOutput(fileName, Context.MODE_PRIVATE)
+        writer.use {
+            ParcelUtils.toOutputStream(prefs, writer)
+        }
+    }
+
+    /** This is the old pre Android R flow that's needed for backwards compatibility. */
+    internal class WslFlow(private val engineWrapper: EngineWrapper) {
+        class PendingComplicationData(val complicationId: Int, val data: ComplicationData)
+
+        lateinit var iWatchFaceService: IWatchFaceService
+
+        var pendingBackgroundAction: Bundle? = null
+        var pendingProperties: Bundle? = null
+        var pendingSetWatchFaceStyle = false
+        var pendingVisibilityChanged: Boolean? = null
+        var pendingComplicationDataUpdates = ArrayList<PendingComplicationData>()
+        var complicationsActivated = false
+        var watchFaceInitStarted = false
+        var lastActiveComplications: IntArray? = null
+
+        // Only valid after onSetBinder has been called.
+        var systemApiVersion = -1
+
+        fun iWatchFaceServiceInitialized() = this::iWatchFaceService.isInitialized
+
+        fun requestWatchFaceStyle() {
+            try {
+                iWatchFaceService.setStyle(engineWrapper.watchFaceImpl.getWatchFaceStyle())
+            } catch (e: RemoteException) {
+                Log.e(TAG, "Failed to set WatchFaceStyle: ", e)
+            }
+
+            val activeComplications = lastActiveComplications
+            if (activeComplications != null) {
+                engineWrapper.setActiveComplications(activeComplications)
+            }
+
+            if (engineWrapper.contentDescriptionLabels.isNotEmpty()) {
+                engineWrapper.setContentDescriptionLabels(engineWrapper.contentDescriptionLabels)
+            }
+        }
+
+        fun setDefaultComplicationProviderWithFallbacks(
+            watchFaceComplicationId: Int,
+            providers: List<ComponentName>?,
+            @ProviderId fallbackSystemProvider: Int,
+            type: Int
+        ) {
+
+            // For android R flow iWatchFaceService won't have been set.
+            if (!iWatchFaceServiceInitialized()) {
+                return
+            }
+
+            if (systemApiVersion >= 2) {
+                iWatchFaceService.setDefaultComplicationProviderWithFallbacks(
+                    watchFaceComplicationId,
+                    providers,
+                    fallbackSystemProvider,
+                    type
+                )
+            } else {
+                // If the implementation doesn't support the new API we emulate its behavior by
+                // setting complication providers in the reverse order. This works because if
+                // setDefaultComplicationProvider attempts to set a non-existent or incompatible
+                // provider it does nothing, which allows us to emulate the same semantics as
+                // setDefaultComplicationProviderWithFallbacks albeit with more calls.
+                if (fallbackSystemProvider != WatchFaceImpl.NO_DEFAULT_PROVIDER) {
+                    iWatchFaceService.setDefaultSystemComplicationProvider(
+                        watchFaceComplicationId, fallbackSystemProvider, type
+                    )
+                }
+
+                if (providers != null) {
+                    // Iterate in reverse order. This could be O(n^2) but n is expected to be small
+                    // and the list is probably an ArrayList so it's probably O(n) in practice.
+                    for (i in providers.size - 1 downTo 0) {
+                        iWatchFaceService.setDefaultComplicationProvider(
+                            watchFaceComplicationId, providers[i], type
+                        )
+                    }
+                }
+            }
+        }
+
+        fun setActiveComplications(watchFaceComplicationIds: IntArray) {
+            // For android R flow iWatchFaceService won't have been set.
+            if (!iWatchFaceServiceInitialized()) {
+                return
+            }
+
+            lastActiveComplications = watchFaceComplicationIds
+
+            try {
+                iWatchFaceService.setActiveComplications(
+                    watchFaceComplicationIds, /* updateAll= */ !complicationsActivated
+                )
+                complicationsActivated = true
+            } catch (e: RemoteException) {
+                Log.e(TAG, "Failed to set active complications: ", e)
+            }
+        }
+
+        fun onRequestStyle() {
+            // We can't guarantee the binder has been set and onSurfaceChanged called before this
+            // command.
+            if (!engineWrapper.watchFaceCreated()) {
+                pendingSetWatchFaceStyle = true
+                return
+            }
+            requestWatchFaceStyle()
+            pendingSetWatchFaceStyle = false
+        }
+
+        @UiThread
+        fun onBackgroundAction(extras: Bundle) {
+            // We can't guarantee the binder has been set and onSurfaceChanged called before this
+            // command.
+            if (!engineWrapper.watchFaceCreated()) {
+                pendingBackgroundAction = extras
+                return
+            }
+
+            engineWrapper.setWatchUiState(
+                WatchUiState(
+                    extras.getBoolean(
+                        Constants.EXTRA_AMBIENT_MODE,
+                        engineWrapper.mutableWatchState.isAmbient.getValueOr(false)
+                    ),
+                    extras.getInt(
+                        Constants.EXTRA_INTERRUPTION_FILTER,
+                        engineWrapper.mutableWatchState.interruptionFilter.getValueOr(0)
+                    )
+                )
+            )
+
+            pendingBackgroundAction = null
+        }
+
+        fun onComplicationDataUpdate(extras: Bundle) {
+            extras.classLoader = WireComplicationData::class.java.classLoader
+            val complicationData: WireComplicationData =
+                extras.getParcelable(Constants.EXTRA_COMPLICATION_DATA)!!
+            engineWrapper.setComplicationData(
+                extras.getInt(Constants.EXTRA_COMPLICATION_ID),
+                complicationData.toApiComplicationData()
+            )
+        }
+
+        fun onSetBinder(extras: Bundle) {
+            val binder = extras.getBinder(Constants.EXTRA_BINDER)
+            if (binder == null) {
+                Log.w(TAG, "Binder is null.")
+                return
+            }
+
+            iWatchFaceService = IWatchFaceService.Stub.asInterface(binder)
+
+            try {
+                // Note if the implementation doesn't support getVersion this will return zero
+                // rather than throwing an exception.
+                systemApiVersion = iWatchFaceService.apiVersion
+            } catch (e: RemoteException) {
+                Log.w(TAG, "Failed to getVersion: ", e)
+            }
+
+            engineWrapper.coroutineScope.launch { maybeCreateWatchFace() }
+        }
+
+        @UiThread
+        fun onPropertiesChanged(properties: Bundle) {
+            if (!watchFaceInitStarted) {
+                pendingProperties = properties
+                engineWrapper.coroutineScope.launch { maybeCreateWatchFace() }
+                return
+            }
+
+            engineWrapper.setImmutableSystemState(
+                DeviceConfig(
+                    properties.getBoolean(Constants.PROPERTY_LOW_BIT_AMBIENT),
+                    properties.getBoolean(Constants.PROPERTY_BURN_IN_PROTECTION),
+                    ANALOG_WATCHFACE_REFERENCE_TIME_MS,
+                    DIGITAL_WATCHFACE_REFERENCE_TIME_MS
+                )
+            )
+        }
+
+        private suspend fun maybeCreateWatchFace(): Unit = TraceEvent(
+            "EngineWrapper.maybeCreateWatchFace"
+        ).use {
+            // To simplify handling of watch face state, we only construct the [WatchFaceImpl]
+            // once iWatchFaceService have been initialized and pending properties sent.
+            if (iWatchFaceServiceInitialized() &&
+                pendingProperties != null && !engineWrapper.watchFaceCreatedOrPending()
+            ) {
+                watchFaceInitStarted = true
+
+                // Apply immutable properties to mutableWatchState before creating the watch face.
+                onPropertiesChanged(pendingProperties!!)
+                pendingProperties = null
+
+                val watchState = engineWrapper.mutableWatchState.asWatchState()
+                engineWrapper.createWatchFaceInternal(
+                    watchState, engineWrapper.surfaceHolder, "maybeCreateWatchFace"
+                )
+
+                val backgroundAction = pendingBackgroundAction
+                if (backgroundAction != null) {
+                    onBackgroundAction(backgroundAction)
+                    pendingBackgroundAction = null
+                }
+                if (pendingSetWatchFaceStyle) {
+                    onRequestStyle()
+                }
+                val visibility = pendingVisibilityChanged
+                if (visibility != null) {
+                    engineWrapper.onVisibilityChanged(visibility)
+                    pendingVisibilityChanged = null
+                }
+                for (complicationDataUpdate in pendingComplicationDataUpdates) {
+                    engineWrapper.setComplicationData(
+                        complicationDataUpdate.complicationId,
+                        complicationDataUpdate.data
+                    )
+                }
+            }
+        }
     }
 
     internal inner class EngineWrapper(
@@ -312,7 +559,9 @@
         internal val coroutineScope = CoroutineScope(getHandler().asCoroutineDispatcher().immediate)
         private val _context = this@WatchFaceService as Context
 
-        internal lateinit var iWatchFaceService: IWatchFaceService
+        // State to support the old WSL style interface
+        internal val wslFlow = WslFlow(this)
+
         internal lateinit var watchFaceImpl: WatchFaceImpl
 
         internal val mutableWatchState = getMutableWatchState().apply {
@@ -362,26 +611,13 @@
         // If non-null then changes to the style must be persisted.
         private var directBootParams: WallpaperInteractiveWatchFaceInstanceParams? = null
 
-        // State to support the old WSL style initialzation flow.
-        private var pendingBackgroundAction: Bundle? = null
-        private var pendingProperties: Bundle? = null
-        private var pendingSetWatchFaceStyle = false
-        private var pendingVisibilityChanged: Boolean? = null
-        private var pendingComplicationDataUpdates = ArrayList<PendingComplicationData>()
-        private var complicationsActivated = false
-        private var watchFaceInitStarted = false
-
-        // Only valid after onSetBinder has been called.
-        private var systemApiVersion = -1
+        internal var contentDescriptionLabels: Array<ContentDescriptionLabel> = emptyArray()
 
         internal var firstSetWatchUiState = true
         internal var immutableSystemStateDone = false
         internal var immutableChinHeightDone = false
         private var ignoreNextOnVisibilityChanged = false
 
-        internal var lastActiveComplications: IntArray? = null
-        internal var lastA11yLabels: Array<ContentDescriptionLabel>? = null
-
         private var firstOnSurfaceChangedReceived = false
         private var asyncWatchFaceConstructionPending = false
 
@@ -403,16 +639,33 @@
 
             // In a direct boot scenario attempt to load the previously serialized parameters.
             if (pendingWallpaperInstance == null && !expectPreRInitFlow()) {
-                directBootParams = readDirectBootPrefs(_context, DIRECT_BOOT_PREFS)
-                if (directBootParams != null) {
+                val params = readDirectBootPrefs(_context, DIRECT_BOOT_PREFS)
+                directBootParams = params
+                // In tests a watchface may already have been created.
+                if (params != null && !watchFaceCreatedOrPending()) {
                     val asyncTraceEvent = AsyncTraceEvent("DirectBoot")
                     coroutineScope.launch {
-                        // In tests a watchface may already have been created.
-                        if (!watchFaceCreatedOrPending()) {
-                            createInteractiveInstance(
-                                directBootParams!!,
-                                "DirectBoot"
-                            )
+                        try {
+                            val instance = createInteractiveInstance(params, "DirectBoot")
+                            // WatchFace init is async so its possible we now have a pending
+                            // WallpaperInteractiveWatchFaceInstance request.
+                            InteractiveInstanceManager
+                                .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
+                                    require(it.params.instanceId == params.instanceId) {
+                                        "Mismatch between pendingWallpaperInstance id " +
+                                            "${it.params.instanceId} and constructed instance id " +
+                                            "${params.instanceId}"
+                                    }
+                                    it.callback.onInteractiveWatchFaceCreated(instance)
+                                }
+                        } catch (e: Exception) {
+                            InteractiveInstanceManager
+                                .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
+                                    it.callback.onInteractiveWatchFaceCrashed(
+                                        CrashInfoParcel(e)
+                                    )
+                                }
+                        } finally {
                             asyncTraceEvent.close()
                         }
                     }
@@ -430,12 +683,18 @@
                 // workaround the workaround...
                 ignoreNextOnVisibilityChanged = true
                 coroutineScope.launch {
-                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
-                        createInteractiveInstance(
-                            pendingWallpaperInstance.params,
-                            "Boot with pendingWallpaperInstance"
+                    try {
+                        pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
+                            createInteractiveInstance(
+                                pendingWallpaperInstance.params,
+                                "Boot with pendingWallpaperInstance"
+                            )
                         )
-                    )
+                    } catch (e: Exception) {
+                        pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
+                            CrashInfoParcel(e)
+                        )
+                    }
                     asyncTraceEvent.close()
                     val params = pendingWallpaperInstance.params
                     directBootParams = params
@@ -534,8 +793,8 @@
             if (watchFaceCreated()) {
                 watchFaceImpl.onComplicationDataUpdate(complicationId, data)
             } else {
-                pendingComplicationDataUpdates.add(
-                    PendingComplicationData(complicationId, data)
+                wslFlow.pendingComplicationDataUpdates.add(
+                    WslFlow.PendingComplicationData(complicationId, data)
                 )
             }
         }
@@ -549,7 +808,7 @@
 
         @UiThread
         fun getComplicationState(): List<IdAndComplicationStateWireFormat> =
-            uiThreadHandler.runOnHandlerWithTracing("EngineWrapper.getComplicationState") {
+            uiThreadHandler.runBlockingOnHandlerWithTracing("EngineWrapper.getComplicationState") {
                 watchFaceImpl.complicationsManager.complications.map {
                     IdAndComplicationStateWireFormat(
                         it.key,
@@ -584,8 +843,8 @@
                 }
             } else {
                 for (idAndComplicationData in complicationDatumWireFormats) {
-                    pendingComplicationDataUpdates.add(
-                        PendingComplicationData(
+                    wslFlow.pendingComplicationDataUpdates.add(
+                        WslFlow.PendingComplicationData(
                             idAndComplicationData.id,
                             idAndComplicationData.complicationData.toApiComplicationData()
                         )
@@ -594,24 +853,6 @@
             }
         }
 
-        private fun requestWatchFaceStyle() {
-            try {
-                iWatchFaceService.setStyle(watchFaceImpl.getWatchFaceStyle())
-            } catch (e: RemoteException) {
-                Log.e(TAG, "Failed to set WatchFaceStyle: ", e)
-            }
-
-            val activeComplications = lastActiveComplications
-            if (activeComplications != null) {
-                setActiveComplications(activeComplications)
-            }
-
-            val a11yLabels = lastA11yLabels
-            if (a11yLabels != null) {
-                setContentDescriptionLabels(a11yLabels)
-            }
-        }
-
         @UiThread
         @RequiresApi(27)
         fun renderWatchFaceToBitmap(
@@ -696,8 +937,7 @@
                     Canvas(complicationBitmap),
                     Rect(0, 0, bounds.width(), bounds.height()),
                     calendar,
-                    RenderParameters(params.renderParametersWireFormat),
-                    params.complicationId
+                    RenderParameters(params.renderParametersWireFormat)
                 )
 
                 // Restore previous ComplicationData & style if required.
@@ -840,23 +1080,23 @@
                     }
                 Constants.COMMAND_BACKGROUND_ACTION ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_BACKGROUND_ACTION") {
-                        onBackgroundAction(extras!!)
+                        wslFlow.onBackgroundAction(extras!!)
                     }
                 Constants.COMMAND_COMPLICATION_DATA ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_COMPLICATION_DATA") {
-                        onComplicationDataUpdate(extras!!)
+                        wslFlow.onComplicationDataUpdate(extras!!)
                     }
                 Constants.COMMAND_REQUEST_STYLE ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_REQUEST_STYLE") {
-                        onRequestStyle()
+                        wslFlow.onRequestStyle()
                     }
                 Constants.COMMAND_SET_BINDER ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_SET_BINDER") {
-                        onSetBinder(extras!!)
+                        wslFlow.onSetBinder(extras!!)
                     }
                 Constants.COMMAND_SET_PROPERTIES ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_SET_PROPERTIES") {
-                        onPropertiesChanged(extras!!)
+                        wslFlow.onPropertiesChanged(extras!!)
                     }
                 Constants.COMMAND_TAP ->
                     uiThreadHandler.runOnHandlerWithTracing("onCommand COMMAND_TAP") {
@@ -876,51 +1116,6 @@
             return null
         }
 
-        @UiThread
-        fun onBackgroundAction(extras: Bundle) {
-            // We can't guarantee the binder has been set and onSurfaceChanged called before this
-            // command.
-            if (!watchFaceCreated()) {
-                pendingBackgroundAction = extras
-                return
-            }
-
-            setWatchUiState(
-                WatchUiState(
-                    extras.getBoolean(
-                        Constants.EXTRA_AMBIENT_MODE,
-                        mutableWatchState.isAmbient.getValueOr(false)
-                    ),
-                    extras.getInt(
-                        Constants.EXTRA_INTERRUPTION_FILTER,
-                        mutableWatchState.interruptionFilter.getValueOr(0)
-                    )
-                )
-            )
-
-            pendingBackgroundAction = null
-        }
-
-        private fun onSetBinder(extras: Bundle) {
-            val binder = extras.getBinder(Constants.EXTRA_BINDER)
-            if (binder == null) {
-                Log.w(TAG, "Binder is null.")
-                return
-            }
-
-            iWatchFaceService = IWatchFaceService.Stub.asInterface(binder)
-
-            try {
-                // Note if the implementation doesn't support getVersion this will return zero
-                // rather than throwing an exception.
-                systemApiVersion = iWatchFaceService.apiVersion
-            } catch (e: RemoteException) {
-                Log.w(TAG, "Failed to getVersion: ", e)
-            }
-
-            coroutineScope.launch { maybeCreateWatchFace() }
-        }
-
         override fun getInitialUserStyle(): UserStyleWireFormat? = initialUserStyle
 
         @RequiresApi(27)
@@ -1031,26 +1226,9 @@
 
             params.idAndComplicationDataWireFormats?.let { setComplicationDataList(it) }
 
-            val visibility = pendingVisibilityChanged
-            if (visibility != null) {
-                onVisibilityChanged(visibility)
-                pendingVisibilityChanged = null
-            }
-
             val instance = InteractiveWatchFaceImpl(this, params.instanceId, uiThreadHandler)
             InteractiveInstanceManager.addInstance(instance)
             interactiveInstanceId = params.instanceId
-
-            // WatchFace init is async so its possible we have a pending
-            // WallpaperInteractiveWatchFaceInstance request.
-            InteractiveInstanceManager.takePendingWallpaperInteractiveWatchFaceInstance()?.let {
-                require(it.params.instanceId == params.instanceId) {
-                    "Miss match between pendingWallpaperInstance id $it.params.instanceId and " +
-                        "constructed instance id $params.instanceId"
-                }
-                it.callback.onInteractiveWatchFaceCreated(instance)
-            }
-
             return instance
         }
 
@@ -1066,72 +1244,29 @@
             }
         }
 
-        private suspend fun createWatchFaceInternal(
+        internal suspend fun createWatchFaceInternal(
             watchState: WatchState,
             surfaceHolder: SurfaceHolder,
             _createdBy: String
         ) {
             asyncWatchFaceConstructionPending = true
             createdBy = _createdBy
+            val timeBefore = System.currentTimeMillis()
             val watchface = TraceEvent("WatchFaceService.createWatchFace").use {
                 createWatchFace(surfaceHolder, watchState)
             }
+            val timeAfter = System.currentTimeMillis()
+            val timeTaken = timeAfter - timeBefore
+            require(timeTaken < MAX_CREATE_WATCHFACE_TIME_MILLIS) {
+                "createWatchFace should complete in less than $MAX_CREATE_WATCHFACE_TIME_MILLIS " +
+                    "milliseconds"
+            }
             watchFaceImpl = TraceEvent("WatchFaceImpl.init").use {
                 WatchFaceImpl(watchface, this, watchState)
             }
             asyncWatchFaceConstructionPending = false
         }
 
-        private suspend fun maybeCreateWatchFace(): Unit = TraceEvent(
-            "EngineWrapper.maybeCreateWatchFace"
-        ).use {
-            // To simplify handling of watch face state, we only construct the [WatchFaceImpl]
-            // once iWatchFaceService have been initialized and pending properties sent.
-            if (this::iWatchFaceService.isInitialized && pendingProperties != null &&
-                !watchFaceCreatedOrPending()
-            ) {
-                watchFaceInitStarted = true
-
-                // Apply immutable properties to mutableWatchState before creating the watch face.
-                onPropertiesChanged(pendingProperties!!)
-                pendingProperties = null
-
-                val watchState = mutableWatchState.asWatchState()
-                createWatchFaceInternal(watchState, surfaceHolder, "maybeCreateWatchFace")
-
-                val backgroundAction = pendingBackgroundAction
-                if (backgroundAction != null) {
-                    onBackgroundAction(backgroundAction)
-                    pendingBackgroundAction = null
-                }
-                if (pendingSetWatchFaceStyle) {
-                    onRequestStyle()
-                }
-                val visibility = pendingVisibilityChanged
-                if (visibility != null) {
-                    onVisibilityChanged(visibility)
-                    pendingVisibilityChanged = null
-                }
-                for (complicationDataUpdate in pendingComplicationDataUpdates) {
-                    setComplicationData(
-                        complicationDataUpdate.complicationId,
-                        complicationDataUpdate.data
-                    )
-                }
-            }
-        }
-
-        private fun onRequestStyle() {
-            // We can't guarantee the binder has been set and onSurfaceChanged called before this
-            // command.
-            if (!watchFaceCreated()) {
-                pendingSetWatchFaceStyle = true
-                return
-            }
-            requestWatchFaceStyle()
-            pendingSetWatchFaceStyle = false
-        }
-
         override fun onVisibilityChanged(visible: Boolean): Unit = TraceEvent(
             "onVisibilityChanged"
         ).use {
@@ -1160,13 +1295,13 @@
                 // We can't guarantee the binder has been set and onSurfaceChanged called before
                 // this command.
                 if (!watchFaceCreated()) {
-                    pendingVisibilityChanged = visible
+                    wslFlow.pendingVisibilityChanged = visible
                     return
                 }
             }
 
             mutableWatchState.isVisible.value = visible
-            pendingVisibilityChanged = null
+            wslFlow.pendingVisibilityChanged = null
         }
 
         override fun invalidate() {
@@ -1205,34 +1340,6 @@
             }
         }
 
-        private fun onComplicationDataUpdate(extras: Bundle) {
-            extras.classLoader = WireComplicationData::class.java.classLoader
-            val complicationData: WireComplicationData =
-                extras.getParcelable(Constants.EXTRA_COMPLICATION_DATA)!!
-            setComplicationData(
-                extras.getInt(Constants.EXTRA_COMPLICATION_ID),
-                complicationData.toApiComplicationData()
-            )
-        }
-
-        @UiThread
-        internal fun onPropertiesChanged(properties: Bundle) {
-            if (!watchFaceInitStarted) {
-                pendingProperties = properties
-                coroutineScope.launch { maybeCreateWatchFace() }
-                return
-            }
-
-            setImmutableSystemState(
-                DeviceConfig(
-                    properties.getBoolean(Constants.PROPERTY_LOW_BIT_AMBIENT),
-                    properties.getBoolean(Constants.PROPERTY_BURN_IN_PROTECTION),
-                    ANALOG_WATCHFACE_REFERENCE_TIME_MS,
-                    DIGITAL_WATCHFACE_REFERENCE_TIME_MS
-                )
-            )
-        }
-
         internal fun watchFaceCreated() = this::watchFaceImpl.isInitialized
 
         internal fun watchFaceCreatedOrPending() =
@@ -1244,71 +1351,97 @@
             @ProviderId fallbackSystemProvider: Int,
             type: Int
         ) {
-            // For wear 3.0 watchfaces iWatchFaceService won't have been set.
-            if (!this::iWatchFaceService.isInitialized) {
-                return
-            }
-
-            if (systemApiVersion >= 2) {
-                iWatchFaceService.setDefaultComplicationProviderWithFallbacks(
-                    watchFaceComplicationId,
-                    providers,
-                    fallbackSystemProvider,
-                    type
-                )
-            } else {
-                // If the implementation doesn't support the new API we emulate its behavior by
-                // setting complication providers in the reverse order. This works because if
-                // setDefaultComplicationProvider attempts to set a non-existent or incompatible
-                // provider it does nothing, which allows us to emulate the same semantics as
-                // setDefaultComplicationProviderWithFallbacks albeit with more calls.
-                if (fallbackSystemProvider != WatchFaceImpl.NO_DEFAULT_PROVIDER) {
-                    iWatchFaceService.setDefaultSystemComplicationProvider(
-                        watchFaceComplicationId, fallbackSystemProvider, type
-                    )
-                }
-
-                if (providers != null) {
-                    // Iterate in reverse order. This could be O(n^2) but n is expected to be small
-                    // and the list is probably an ArrayList so it's probably O(n) in practice.
-                    for (i in providers.size - 1 downTo 0) {
-                        iWatchFaceService.setDefaultComplicationProvider(
-                            watchFaceComplicationId, providers[i], type
-                        )
-                    }
-                }
-            }
+            wslFlow.setDefaultComplicationProviderWithFallbacks(
+                watchFaceComplicationId,
+                providers,
+                fallbackSystemProvider,
+                type
+            )
         }
 
         override fun setActiveComplications(watchFaceComplicationIds: IntArray) {
-            // For wear 3.0 watchfaces iWatchFaceService won't have been set.
-            if (!this::iWatchFaceService.isInitialized) {
-                return
+            wslFlow.setActiveComplications(watchFaceComplicationIds)
+        }
+
+        override fun updateContentDescriptionLabels() {
+            val labels = mutableListOf<Pair<Int, ContentDescriptionLabel>>()
+
+            // Add a ContentDescriptionLabel for the main clock element.
+            labels.add(
+                Pair(
+                    WATCH_ELEMENT_ACCESSIBILITY_TRAVERSAL_INDEX,
+                    ContentDescriptionLabel(
+                        watchFaceImpl.renderer.getMainClockElementBounds(),
+                        AccessibilityUtils.makeTimeAsComplicationText(_context)
+                    )
+                )
+            )
+
+            // Add a ContentDescriptionLabel for each enabled complication.
+            val screenBounds = watchFaceImpl.renderer.screenBounds
+            for ((_, complication) in watchFaceImpl.complicationsManager.complications) {
+                if (complication.enabled) {
+                    if (complication.boundsType == ComplicationBoundsType.BACKGROUND) {
+                        ComplicationBoundsType.BACKGROUND
+                    } else {
+                        complication.renderer.getData()?.let {
+                            labels.add(
+                                Pair(
+                                    complication.accessibilityTraversalIndex,
+                                    ContentDescriptionLabel(
+                                        _context,
+                                        complication.computeBounds(screenBounds),
+                                        it.asWireComplicationData()
+                                    )
+                                )
+                            )
+                        }
+                    }
+                }
             }
 
-            lastActiveComplications = watchFaceComplicationIds
-
-            try {
-                iWatchFaceService.setActiveComplications(
-                    watchFaceComplicationIds, /* updateAll= */ !complicationsActivated
+            // Add any additional labels defined by the watch face.
+            for (labelPair in watchFaceImpl.renderer.additionalContentDescriptionLabels) {
+                labels.add(
+                    Pair(
+                        labelPair.first,
+                        ContentDescriptionLabel(
+                            labelPair.second.bounds,
+                            labelPair.second.text.toWireComplicationText()
+                        ).apply {
+                            tapAction = labelPair.second.tapAction
+                        }
+                    )
                 )
-                complicationsActivated = true
-            } catch (e: RemoteException) {
-                Log.e(TAG, "Failed to set active complications: ", e)
+            }
+
+            setContentDescriptionLabels(
+                labels.sortedBy { it.first }.map { it.second }.toTypedArray()
+            )
+
+            // From Android R Let SysUI know the labels have changed if the accessibility manager
+            // is enabled.
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
+                getAccessibilityManager().isEnabled
+            ) {
+                // TODO(alexclarke): This should require a permission. See http://b/184717802
+                _context.sendBroadcast(Intent(Constants.ACTION_WATCH_FACE_REFRESH_A11Y_LABELS))
             }
         }
 
-        override fun setContentDescriptionLabels(labels: Array<ContentDescriptionLabel>) {
-            // For wear 3.0 watchfaces iWatchFaceService won't have been set.
-            if (!this::iWatchFaceService.isInitialized) {
-                return
-            }
+        private fun getAccessibilityManager() =
+            _context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
 
-            lastA11yLabels = labels
-            try {
-                iWatchFaceService.setContentDescriptionLabels(labels)
-            } catch (e: RemoteException) {
-                Log.e(TAG, "Failed to set accessibility labels: ", e)
+        fun setContentDescriptionLabels(labels: Array<ContentDescriptionLabel>) {
+            contentDescriptionLabels = labels
+
+            // For the old pre-android R flow.
+            if (wslFlow.iWatchFaceServiceInitialized()) {
+                try {
+                    wslFlow.iWatchFaceService.setContentDescriptionLabels(contentDescriptionLabels)
+                } catch (e: RemoteException) {
+                    Log.e(TAG, "Failed to set accessibility labels: ", e)
+                }
             }
         }
 
@@ -1320,24 +1453,27 @@
             writer.println("WatchFaceEngine:")
             writer.increaseIndent()
             when {
-                this::iWatchFaceService.isInitialized -> writer.println("WSL style init flow")
+                wslFlow.iWatchFaceServiceInitialized() -> writer.println("WSL style init flow")
                 this::watchFaceImpl.isInitialized -> writer.println("Androidx style init flow")
                 expectPreRInitFlow() -> writer.println("Expecting WSL style init")
                 else -> writer.println("Expecting androidx style style init")
             }
 
-            if (this::iWatchFaceService.isInitialized) {
+            if (wslFlow.iWatchFaceServiceInitialized()) {
                 writer.println(
                     "iWatchFaceService.asBinder().isBinderAlive=" +
-                        "${iWatchFaceService.asBinder().isBinderAlive}"
+                        "${wslFlow.iWatchFaceService.asBinder().isBinderAlive}"
                 )
-                if (iWatchFaceService.asBinder().isBinderAlive) {
-                    writer.println("iWatchFaceService.apiVersion=${iWatchFaceService.apiVersion}")
+                if (wslFlow.iWatchFaceService.asBinder().isBinderAlive) {
+                    writer.println(
+                        "iWatchFaceService.apiVersion=" +
+                            "${wslFlow.iWatchFaceService.apiVersion}"
+                    )
                 }
             }
             writer.println("createdBy=$createdBy")
             writer.println("firstOnSurfaceChanged=$firstOnSurfaceChangedReceived")
-            writer.println("watchFaceInitStarted=$watchFaceInitStarted")
+            writer.println("watchFaceInitStarted=$wslFlow.watchFaceInitStarted")
             writer.println("asyncWatchFaceConstructionPending=$asyncWatchFaceConstructionPending")
             writer.println("ignoreNextOnVisibilityChanged=$ignoreNextOnVisibilityChanged")
 
@@ -1392,7 +1528,7 @@
  * @param task The task to post on the handler.
  * @return [R] the return value of [task].
  */
-internal fun <R> Handler.runOnHandlerWithTracing(
+internal fun <R> Handler.runBlockingOnHandlerWithTracing(
     traceEventName: String,
     task: () -> R
 ): R = TraceEvent(traceEventName).use {
@@ -1424,3 +1560,23 @@
         returnVal as R
     }
 }
+
+/**
+ * Runs the supplied task on the handler thread. If we're not on the handler thread a task is
+ * posted.
+ *
+ * @param traceEventName The name of the trace event to emit.
+ * @param task The task to post on the handler.
+ */
+internal fun Handler.runOnHandlerWithTracing(
+    traceEventName: String,
+    task: () -> Unit
+) = TraceEvent(traceEventName).use {
+    if (looper == Looper.myLooper()) {
+        task.invoke()
+    } else {
+        post {
+            TraceEvent("$traceEventName invokeTask").use { task.invoke() }
+        }
+    }
+}
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
index d1ee966..a32f6ce 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchState.kt
@@ -26,30 +26,30 @@
  * not it supports burn in prevention and low-bit ambient.
  *
  * @param interruptionFilter The current user interruption settings. See [NotificationManager].
- *     Based on the value the watch face should adjust the amount of information it displays. For
- *     example, if it displays the number of pending emails, it should hide it if
- *     interruptionFilter is equal to [NotificationManager.INTERRUPTION_FILTER_NONE].
- *     `interruptionFilter` can be [NotificationManager.INTERRUPTION_FILTER_NONE],
- *     [NotificationManager.INTERRUPTION_FILTER_PRIORITY],
- *     [NotificationManager.INTERRUPTION_FILTER_ALL],
- *     [NotificationManager.INTERRUPTION_FILTER_ALARMS], or
- *     [NotificationManager.INTERRUPTION_FILTER_UNKNOWN].
+ * Based on the value the watch face should adjust the amount of information it displays. For
+ * example, if it displays the number of pending emails, it should hide it if
+ * interruptionFilter is equal to [NotificationManager.INTERRUPTION_FILTER_NONE].
+ * `interruptionFilter` can be [NotificationManager.INTERRUPTION_FILTER_NONE],
+ * [NotificationManager.INTERRUPTION_FILTER_PRIORITY],
+ * [NotificationManager.INTERRUPTION_FILTER_ALL],
+ * [NotificationManager.INTERRUPTION_FILTER_ALARMS], or
+ * [NotificationManager.INTERRUPTION_FILTER_UNKNOWN].
  * @param isAmbient Whether or not the watch is in ambient mode. The watch face should switch to a
- *     simplified low intensity display when in ambient mode. E.g. if the watch face displays
- *     seconds, it should hide them in ambient mode.
+ * simplified low intensity display when in ambient mode. E.g. if the watch face displays seconds,
+ * it should hide them in ambient mode.
  * @param isBatteryLowAndNotCharging Whether or not we should conserve power due to a low battery
- *     which isn't charging. Only valid if
- *     [android.support.wearable.watchface.WatchFaceStyle.hideNotificationIndicator] is true.
+ * which isn't charging. Only valid if
+ * [android.support.wearable.watchface.WatchFaceStyle.hideNotificationIndicator] is true.
  * @param isVisible Whether or not the watch face is visible.
  * @param hasLowBitAmbient Whether or not the watch hardware supports low bit ambient support.
  * @param hasBurnInProtection Whether or not the watch hardware supports burn in protection.
  * @param analogPreviewReferenceTimeMillis UTC reference time for previews of analog watch faces in
- *     milliseconds since the epoch.
+ * milliseconds since the epoch.
  * @param digitalPreviewReferenceTimeMillis UTC reference time for previews of digital watch faces
- *     in milliseconds since the epoch.
+ * in milliseconds since the epoch.
  * @param chinHeight the size, in pixels, of the chin or zero if the device does not have a
- *     chin. A chin is a section at the bottom of a circular display that is visible due to
- *     hardware limitations.
+ * chin. A chin is a section at the bottom of a circular display that is visible due to hardware
+ * limitations.
  * @param isHeadless Whether or not this is a headless watchface.
  */
 public class WatchState(
@@ -88,7 +88,9 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class MutableWatchState {
-    public var interruptionFilter: MutableObservableWatchData<Int> = MutableObservableWatchData()
+    public var interruptionFilter: MutableObservableWatchData<Int> = MutableObservableWatchData(
+        NotificationManager.INTERRUPTION_FILTER_UNKNOWN
+    )
     public val isAmbient: MutableObservableWatchData<Boolean> = MutableObservableWatchData()
     public val isBatteryLowAndNotCharging: MutableObservableWatchData<Boolean> =
         MutableObservableWatchData()
@@ -97,6 +99,7 @@
     public var hasBurnInProtection: Boolean = false
     public var analogPreviewReferenceTimeMillis: Long = 0
     public var digitalPreviewReferenceTimeMillis: Long = 0
+
     @Px
     public var chinHeight: Int = 0
         @Px get
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
index effcd4a..aacebb3 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/HeadlessWatchFaceImpl.kt
@@ -23,6 +23,7 @@
 import androidx.wear.watchface.WatchFaceService
 import androidx.wear.watchface.control.data.ComplicationRenderParams
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
+import androidx.wear.watchface.runBlockingOnHandlerWithTracing
 import androidx.wear.watchface.runOnHandlerWithTracing
 
 /**
@@ -64,19 +65,23 @@
     override fun getApiVersion() = IHeadlessWatchFace.API_VERSION
 
     override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
-        uiThreadHandler.runOnHandlerWithTracing("HeadlessWatchFaceImpl.renderWatchFaceToBitmap") {
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
+            "HeadlessWatchFaceImpl.renderWatchFaceToBitmap"
+        ) {
             engine!!.renderWatchFaceToBitmap(params)
         }
 
     override fun getPreviewReferenceTimeMillis() = engine!!.watchFaceImpl.previewReferenceTimeMillis
 
     override fun getComplicationState() =
-        uiThreadHandler.runOnHandlerWithTracing("HeadlessWatchFaceImpl.getComplicationState") {
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
+            "HeadlessWatchFaceImpl.getComplicationState"
+        ) {
             engine!!.getComplicationState()
         }
 
     override fun renderComplicationToBitmap(params: ComplicationRenderParams) =
-        uiThreadHandler.runOnHandlerWithTracing(
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
             "HeadlessWatchFaceImpl.renderComplicationToBitmap"
         ) {
             engine!!.renderComplicationToBitmap(params)
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index 4f537a63..0497027 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -23,6 +23,7 @@
 import androidx.wear.watchface.control.data.WatchFaceRenderParams
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchUiState
+import androidx.wear.watchface.runBlockingOnHandlerWithTracing
 import androidx.wear.watchface.runOnHandlerWithTracing
 import androidx.wear.watchface.style.data.UserStyleWireFormat
 
@@ -43,14 +44,14 @@
     }
 
     override fun getContentDescriptionLabels(): Array<ContentDescriptionLabel> =
-        uiThreadHandler.runOnHandlerWithTracing(
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
             "InteractiveWatchFaceImpl.getContentDescriptionLabels"
         ) {
-            engine.watchFaceImpl.complicationsManager.getContentDescriptionLabels()
+            engine.contentDescriptionLabels
         }
 
     override fun renderWatchFaceToBitmap(params: WatchFaceRenderParams) =
-        uiThreadHandler.runOnHandlerWithTracing(
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
             "InteractiveWatchFaceImpl.renderWatchFaceToBitmap"
         ) {
             engine.renderWatchFaceToBitmap(params)
@@ -90,7 +91,11 @@
         newInstanceId: String,
         userStyle: UserStyleWireFormat
     ) {
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.updateInstance") {
+        /**
+         * This is blocking to ensure ordering with respect to any subsequent [getInstanceId] and
+         * [getPreviewReferenceTimeMillis] calls.
+         */
+        uiThreadHandler.runBlockingOnHandlerWithTracing("InteractiveWatchFaceImpl.updateInstance") {
             if (instanceId != newInstanceId) {
                 InteractiveInstanceManager.renameInstance(instanceId, newInstanceId)
                 instanceId = newInstanceId
@@ -101,12 +106,16 @@
     }
 
     override fun getComplicationDetails() =
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.getComplicationDetails") {
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
+            "InteractiveWatchFaceImpl.getComplicationDetails"
+        ) {
             engine.getComplicationState()
         }
 
     override fun getUserStyleSchema() =
-        uiThreadHandler.runOnHandlerWithTracing("InteractiveWatchFaceImpl.getUserStyleSchema") {
+        uiThreadHandler.runBlockingOnHandlerWithTracing(
+            "InteractiveWatchFaceImpl.getUserStyleSchema"
+        ) {
             engine.watchFaceImpl.userStyleRepository.schema.toWireFormat()
         }
 
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
index 4be3d02..7b35f3a 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/WatchFaceControlService.kt
@@ -30,6 +30,7 @@
 import androidx.wear.utility.TraceEvent
 import androidx.wear.watchface.IndentingPrintWriter
 import androidx.wear.watchface.WatchFaceService
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.editor.EditorService
@@ -171,6 +172,11 @@
                             asyncTraceEvent.close()
                             callback.onInteractiveWatchFaceCreated(iInteractiveWatchFaceWcs)
                         }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel) {
+                            asyncTraceEvent.close()
+                            callback.onInteractiveWatchFaceCrashed(exception)
+                        }
                     }
                 )
             )
diff --git a/wear/wear-watchface/src/main/res/values-kk/watchface_strings.xml b/wear/wear-watchface/src/main/res/values-kk/watchface_strings.xml
index 8d8287f..29b5b61 100644
--- a/wear/wear-watchface/src/main/res/values-kk/watchface_strings.xml
+++ b/wear/wear-watchface/src/main/res/values-kk/watchface_strings.xml
@@ -4,7 +4,7 @@
     <string name="complication_config" msgid="292306201243482945">"Циферблат қосымша деректерін конфигурациялау"</string>
     <string name="watchface_settings" msgid="4785773105440577595">"Циферблат параметрлерін конфигурациялау"</string>
     <string name="style_config" msgid="2987895585951859981">"Циферблат стильдерін конфигурациялау"</string>
-    <string name="none_background_image_provider" msgid="2326408635673026310">"Ешқайсысы"</string>
+    <string name="none_background_image_provider" msgid="2326408635673026310">"Жоқ"</string>
     <string name="settings_complications" msgid="7688669266180209514">"Деректер"</string>
     <string name="settings_background_image" msgid="4866968289579187727">"Фондық кескін"</string>
     <string name="settings_styles" msgid="5609438460443634575">"Стильдер"</string>
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
index 2583b43..fa2726f 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/AsyncWatchFaceInitTest.kt
@@ -24,6 +24,7 @@
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.InteractiveInstanceManager
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.WatchUiState
@@ -37,6 +38,7 @@
 import kotlinx.coroutines.launch
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNull
+import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -238,6 +240,12 @@
                             ) {
                                 pendingInteractiveWatchFaceWcs = iInteractiveWatchFaceWcs
                             }
+
+                            override fun onInteractiveWatchFaceCrashed(
+                                exception: CrashInfoParcel?
+                            ) {
+                                fail("WatchFace crashed: $exception")
+                            }
                         }
                     )
                 )
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt
new file mode 100644
index 0000000..17c20fe4
--- /dev/null
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/RenderParametersTest.kt
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.watchface
+
+import android.graphics.Color
+import androidx.wear.watchface.style.WatchFaceLayer
+import androidx.wear.watchface.style.UserStyleSetting
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(WatchFaceTestRunner::class)
+public class RenderParametersTest {
+    @Test
+    public fun interactive_base_toWireFormatRoundTrip() {
+        val renderParameters = RenderParameters(
+            RenderParameters(DrawMode.INTERACTIVE, setOf(WatchFaceLayer.BASE)).toWireFormat()
+        )
+        assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+        assertThat(renderParameters.watchFaceLayers).containsExactly(WatchFaceLayer.BASE)
+        assertThat(renderParameters.highlightLayer).isNull()
+    }
+
+    @Test
+    public fun ambient_twoLayers_toWireFormatRoundTrip() {
+        val renderParameters = RenderParameters(
+            RenderParameters(
+                DrawMode.AMBIENT,
+                setOf(
+                    WatchFaceLayer.COMPLICATIONS,
+                    WatchFaceLayer.COMPLICATIONS_OVERLAY
+                )
+            ).toWireFormat()
+        )
+        assertThat(renderParameters.drawMode).isEqualTo(DrawMode.AMBIENT)
+        assertThat(renderParameters.watchFaceLayers).containsExactly(
+            WatchFaceLayer.COMPLICATIONS,
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
+        )
+        assertThat(renderParameters.highlightLayer).isNull()
+    }
+
+    @Test
+    public fun highlightLayer_AllComplications_toWireFormatRoundTrip() {
+        val renderParameters = RenderParameters(
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.AllComplications,
+                    Color.RED,
+                    Color.BLACK
+                )
+            ).toWireFormat()
+        )
+        assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+        assertThat(renderParameters.watchFaceLayers).containsExactly(
+            WatchFaceLayer.BASE,
+            WatchFaceLayer.COMPLICATIONS,
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
+        )
+        val highlightLayer = renderParameters.highlightLayer
+        assertThat(highlightLayer!!.highlightTint).isEqualTo(Color.RED)
+        assertThat(highlightLayer.backgroundTint).isEqualTo(Color.BLACK)
+        assertThat(highlightLayer.highlightedElement).isInstanceOf(
+            RenderParameters.HighlightedElement.AllComplications::class.java
+        )
+    }
+
+    @Test
+    public fun highlightLayer_Complication_toWireFormatRoundTrip() {
+        val renderParameters = RenderParameters(
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.Complication(123),
+                    Color.RED,
+                    Color.BLACK
+                )
+            ).toWireFormat()
+        )
+        assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+        assertThat(renderParameters.watchFaceLayers).containsExactly(
+            WatchFaceLayer.BASE,
+            WatchFaceLayer.COMPLICATIONS,
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
+        )
+        val highlightLayer = renderParameters.highlightLayer
+        assertThat(highlightLayer!!.highlightTint).isEqualTo(Color.RED)
+        assertThat(highlightLayer.backgroundTint).isEqualTo(Color.BLACK)
+        assertThat(highlightLayer.highlightedElement).isInstanceOf(
+            RenderParameters.HighlightedElement.Complication::class.java
+        )
+        val complication = highlightLayer.highlightedElement as
+            RenderParameters.HighlightedElement.Complication
+        assertThat(complication.id).isEqualTo(123)
+    }
+
+    @Test
+    public fun highlightLayer_UserStyle_toWireFormatRoundTrip() {
+        val renderParameters = RenderParameters(
+            RenderParameters(
+                DrawMode.INTERACTIVE,
+                WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+                RenderParameters.HighlightLayer(
+                    RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-1")),
+                    Color.RED,
+                    Color.BLACK
+                )
+            ).toWireFormat()
+        )
+        assertThat(renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+        assertThat(renderParameters.watchFaceLayers).containsExactly(
+            WatchFaceLayer.BASE,
+            WatchFaceLayer.COMPLICATIONS,
+            WatchFaceLayer.COMPLICATIONS_OVERLAY
+        )
+        val highlightLayer = renderParameters.highlightLayer
+        assertThat(highlightLayer!!.highlightTint).isEqualTo(Color.RED)
+        assertThat(highlightLayer.backgroundTint).isEqualTo(Color.BLACK)
+        assertThat(highlightLayer.highlightedElement).isInstanceOf(
+            RenderParameters.HighlightedElement.UserStyle::class.java
+        )
+        val userStyle = highlightLayer.highlightedElement as
+            RenderParameters.HighlightedElement.UserStyle
+        assertThat(userStyle.id.value).isEqualTo("id-1")
+    }
+
+    @Test
+    public fun equality() {
+        val renderParameters1a = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            null
+        )
+        val renderParameters1b = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            null
+        )
+
+        val renderParameters2a = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-1")),
+                Color.RED,
+                Color.BLACK
+            )
+        )
+        val renderParameters2b = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-1")),
+                Color.RED,
+                Color.BLACK
+            )
+        )
+        val renderParameters2c = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.UserStyle(UserStyleSetting.Id("id-2")),
+                Color.RED,
+                Color.BLACK
+            )
+        )
+
+        val renderParameters3a = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.Complication(1),
+                Color.RED,
+                Color.BLUE
+            )
+        )
+        val renderParameters3b = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.Complication(1),
+                Color.RED,
+                Color.BLUE
+            )
+        )
+        val renderParameters3c = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.Complication(2),
+                Color.RED,
+                Color.BLUE
+            )
+        )
+
+        val renderParameters4a = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.AllComplications,
+                Color.RED,
+                Color.BLUE
+            )
+        )
+        val renderParameters4b = RenderParameters(
+            DrawMode.INTERACTIVE,
+            WatchFaceLayer.ALL_WATCH_FACE_LAYERS,
+            RenderParameters.HighlightLayer(
+                RenderParameters.HighlightedElement.AllComplications,
+                Color.RED,
+                Color.BLUE
+            )
+        )
+
+        assertThat(renderParameters1a).isEqualTo(renderParameters1a)
+        assertThat(renderParameters1a).isEqualTo(renderParameters1b)
+
+        assertThat(renderParameters2a).isEqualTo(renderParameters2a)
+        assertThat(renderParameters2a).isEqualTo(renderParameters2b)
+
+        assertThat(renderParameters3a).isEqualTo(renderParameters3a)
+        assertThat(renderParameters3a).isEqualTo(renderParameters3b)
+
+        assertThat(renderParameters4a).isEqualTo(renderParameters4a)
+        assertThat(renderParameters4a).isEqualTo(renderParameters4b)
+
+        assertThat(renderParameters1a).isNotEqualTo(renderParameters2a)
+        assertThat(renderParameters1a).isNotEqualTo(renderParameters3a)
+        assertThat(renderParameters1a).isNotEqualTo(renderParameters4a)
+
+        assertThat(renderParameters2a).isNotEqualTo(renderParameters2c)
+        assertThat(renderParameters2a).isNotEqualTo(renderParameters3a)
+        assertThat(renderParameters2a).isNotEqualTo(renderParameters4a)
+
+        assertThat(renderParameters3a).isNotEqualTo(renderParameters3c)
+        assertThat(renderParameters3a).isNotEqualTo(renderParameters4a)
+    }
+}
\ No newline at end of file
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
index 15e579e..d0f3929 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
@@ -50,12 +50,16 @@
     private val preAndroidR: Boolean,
     private val directBootParams: WallpaperInteractiveWatchFaceInstanceParams?
 ) : WatchFaceService() {
-    var singleTapCount = 0
-    var complicationSingleTapped: Int? = null
+    /** The ids of the complications that have been tapped. */
+    val tappedComplicationIds: List<Int>
+        get() = mutableTappedComplicationIds
     var complicationSelected: Int? = null
     var mockSystemTimeMillis = 0L
     var lastUserStyle: UserStyle? = null
 
+    /** A mutable list of the ids of the complications that have been tapped. */
+    private val mutableTappedComplicationIds: MutableList<Int> = ArrayList()
+
     init {
         currentUserStyleRepository.addUserStyleChangeListener(
             object : CurrentUserStyleRepository.UserStyleChangeListener {
@@ -68,8 +72,7 @@
         complicationsManager.addTapListener(
             object : ComplicationsManager.TapCallback {
                 override fun onComplicationTapped(complicationId: Int) {
-                    complicationSingleTapped = complicationId
-                    singleTapCount++
+                    mutableTappedComplicationIds.add(complicationId)
                 }
             })
     }
@@ -82,7 +85,7 @@
     }
 
     fun clearTappedState() {
-        complicationSingleTapped = null
+        mutableTappedComplicationIds.clear()
     }
 
     init {
@@ -129,7 +132,7 @@
  * IWatchFaceService.Stub implementation that redirects all method calls to a mock so they can be
  * verified. (Using a Spy on the actual stub doesn't work).
  */
-class WatchFaceServiceStub(private val iWatchFaceService: IWatchFaceService) :
+public class WatchFaceServiceStub(private val iWatchFaceService: IWatchFaceService) :
     IWatchFaceService.Stub() {
     override fun setStyle(style: WatchFaceStyle) {
         iWatchFaceService.setStyle(style)
@@ -185,7 +188,7 @@
     }
 }
 
-open class TestRenderer(
+public open class TestRenderer(
     surfaceHolder: SurfaceHolder,
     currentUserStyleRepository: CurrentUserStyleRepository,
     watchState: WatchState,
@@ -197,8 +200,8 @@
     CanvasType.HARDWARE,
     interactiveFrameRateMs
 ) {
-    var lastOnDrawCalendar: Calendar? = null
-    var lastRenderParamaters = RenderParameters.DEFAULT_INTERACTIVE
+    public var lastOnDrawCalendar: Calendar? = null
+    public var lastRenderParameters: RenderParameters = RenderParameters.DEFAULT_INTERACTIVE
 
     override fun render(
         canvas: Canvas,
@@ -206,11 +209,14 @@
         calendar: Calendar
     ) {
         lastOnDrawCalendar = calendar
-        lastRenderParamaters = renderParameters
+        lastRenderParameters = renderParameters
+    }
+
+    override fun renderHighlightLayer(canvas: Canvas, bounds: Rect, calendar: Calendar) {
     }
 }
 
-fun createComplicationData() =
+public fun createComplicationData(): androidx.wear.complications.data.ComplicationData =
     ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
         .setShortText(ComplicationText.plainText("Test Text"))
         .setTapAction(
@@ -223,7 +229,7 @@
 /**
  * We need to prevent roboloetric from instrumenting our classes or things break...
  */
-class WatchFaceTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
+public class WatchFaceTestRunner(testClass: Class<*>) : RobolectricTestRunner(testClass) {
     override fun createClassLoaderConfig(method: FrameworkMethod): InstrumentationConfiguration =
         InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method))
             .doNotInstrumentPackage("android.support.wearable.watchface")
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index b504bb4..118cb31 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -20,7 +20,6 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
-import android.graphics.Color
 import android.graphics.Insets
 import android.graphics.Rect
 import android.graphics.RectF
@@ -35,7 +34,6 @@
 import android.support.wearable.watchface.WatchFaceStyle
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
 import android.view.SurfaceHolder
-import android.view.ViewConfiguration
 import android.view.WindowInsets
 import androidx.annotation.Px
 import androidx.test.core.app.ApplicationProvider
@@ -45,17 +43,19 @@
 import androidx.wear.complications.SystemProviders
 import androidx.wear.complications.data.ComplicationType
 import androidx.wear.complications.data.ShortTextComplicationData
+import androidx.wear.watchface.complications.rendering.CanvasComplicationDrawable
 import androidx.wear.watchface.complications.rendering.ComplicationDrawable
 import androidx.wear.watchface.control.IInteractiveWatchFace
 import androidx.wear.watchface.control.IPendingInteractiveWatchFace
 import androidx.wear.watchface.control.InteractiveInstanceManager
+import androidx.wear.watchface.control.data.CrashInfoParcel
 import androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams
 import androidx.wear.watchface.data.ComplicationBoundsType
 import androidx.wear.watchface.data.DeviceConfig
 import androidx.wear.watchface.data.IdAndComplicationDataWireFormat
 import androidx.wear.watchface.data.WatchUiState
 import androidx.wear.watchface.style.CurrentUserStyleRepository
-import androidx.wear.watchface.style.Layer
+import androidx.wear.watchface.style.WatchFaceLayer
 import androidx.wear.watchface.style.UserStyle
 import androidx.wear.watchface.style.UserStyleSchema
 import androidx.wear.watchface.style.UserStyleSetting
@@ -139,7 +139,7 @@
         "Watchface colorization", /* icon = */
         null,
         colorStyleList,
-        listOf(Layer.BASE)
+        listOf(WatchFaceLayer.BASE)
     )
 
     private val classicStyleOption =
@@ -160,7 +160,7 @@
         "Hand visual look", /* icon = */
         null,
         watchHandStyleList,
-        listOf(Layer.COMPLICATIONS_OVERLAY)
+        listOf(WatchFaceLayer.COMPLICATIONS_OVERLAY)
     )
 
     private val badStyleOption =
@@ -182,7 +182,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.SUNRISE_SUNSET),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_SUNRISE_SUNSET),
             ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .build()
@@ -203,7 +203,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
             ComplicationBounds(RectF(0.6f, 0.4f, 0.8f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
             .build()
@@ -225,7 +225,7 @@
                 ComplicationType.MONOCHROMATIC_IMAGE,
                 ComplicationType.SMALL_IMAGE
             ),
-            DefaultComplicationProviderPolicy(SystemProviders.DAY_OF_WEEK),
+            DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
             ComplicationBounds(RectF(0.0f, 0.4f, 0.4f, 0.6f)),
             edgeComplicationHitTester
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
@@ -293,7 +293,7 @@
     )
     private val complicationsStyleSetting = ComplicationsUserStyleSetting(
         UserStyleSetting.Id("complications_style_setting"),
-        "Complications",
+        "AllComplications",
         "Number and position",
         icon = null,
         complicationConfig = listOf(
@@ -302,7 +302,7 @@
             leftComplicationsOption,
             rightComplicationsOption
         ),
-        affectsLayers = listOf(Layer.COMPLICATIONS)
+        affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
     )
 
     private lateinit var renderer: TestRenderer
@@ -422,6 +422,10 @@
                         ) {
                             interactiveWatchFaceInstance = iInteractiveWatchFace
                         }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
+                            fail("WatchFace crashed: $exception")
+                        }
                     }
                 )
             )
@@ -461,7 +465,7 @@
         hasLowBitAmbient: Boolean,
         hasBurnInProtection: Boolean
     ) {
-        engine.onPropertiesChanged(
+        engine.wslFlow.onPropertiesChanged(
             Bundle().apply {
                 putBoolean(Constants.PROPERTY_LOW_BIT_AMBIENT, hasLowBitAmbient)
                 putBoolean(Constants.PROPERTY_BURN_IN_PROTECTION, hasBurnInProtection)
@@ -569,6 +573,22 @@
         watchFaceImpl.maybeUpdateDrawMode()
         assertThat(renderer.renderParameters.drawMode).isEqualTo(DrawMode.MUTE)
 
+        watchState.interruptionFilter.value = NotificationManager.INTERRUPTION_FILTER_ALL
+        watchFaceImpl.maybeUpdateDrawMode()
+        assertThat(renderer.renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+
+        watchState.interruptionFilter.value = NotificationManager.INTERRUPTION_FILTER_PRIORITY
+        watchFaceImpl.maybeUpdateDrawMode()
+        assertThat(renderer.renderParameters.drawMode).isEqualTo(DrawMode.MUTE)
+
+        watchState.interruptionFilter.value = NotificationManager.INTERRUPTION_FILTER_UNKNOWN
+        watchFaceImpl.maybeUpdateDrawMode()
+        assertThat(renderer.renderParameters.drawMode).isEqualTo(DrawMode.INTERACTIVE)
+
+        watchState.interruptionFilter.value = NotificationManager.INTERRUPTION_FILTER_ALARMS
+        watchFaceImpl.maybeUpdateDrawMode()
+        assertThat(renderer.renderParameters.drawMode).isEqualTo(DrawMode.MUTE)
+
         // Ambient takes precidence over interruption filter.
         watchState.isAmbient.value = true
         watchFaceImpl.maybeUpdateDrawMode()
@@ -604,7 +624,8 @@
         watchState.isAmbient.value = false
         testWatchFaceService.mockSystemTimeMillis = 1000L
 
-        BroadcastReceivers.sendOnMockTimeForTesting(
+        watchFaceImpl.broadcastsReceiver!!.mockTimeReceiver.onReceive(
+            context,
             Intent(WatchFaceImpl.MOCK_TIME_INTENT).apply {
                 putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_SPEED_MULTIPLIER, 2.0f)
                 putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_WRAPPING_MIN_TIME, -1L)
@@ -631,7 +652,8 @@
         watchState.isAmbient.value = false
         testWatchFaceService.mockSystemTimeMillis = 1000L
 
-        BroadcastReceivers.sendOnMockTimeForTesting(
+        watchFaceImpl.broadcastsReceiver!!.mockTimeReceiver.onReceive(
+            context,
             Intent(WatchFaceImpl.MOCK_TIME_INTENT).apply {
                 putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_SPEED_MULTIPLIER, 2.0f)
                 putExtra(WatchFaceImpl.EXTRA_MOCK_TIME_WRAPPING_MIN_TIME, 1000L)
@@ -674,20 +696,6 @@
         watchFaceImpl.onTapCommand(TapType.UP, x, y)
     }
 
-    private fun doubleTapAt(x: Int, y: Int, delayMillis: Long) {
-        tapAt(x, y)
-        runPostedTasksFor(delayMillis)
-        tapAt(x, y)
-    }
-
-    private fun tripleTapAt(x: Int, y: Int, delayMillis: Long) {
-        tapAt(x, y)
-        runPostedTasksFor(delayMillis)
-        tapAt(x, y)
-        runPostedTasksFor(delayMillis)
-        tapAt(x, y)
-    }
-
     private fun tapCancelAt(x: Int, y: Int) {
         watchFaceImpl.onTapCommand(TapType.DOWN, x, y)
         watchFaceImpl.onTapCommand(TapType.CANCEL, x, y)
@@ -707,8 +715,8 @@
         // Tap left complication.
         tapAt(30, 50)
         assertThat(complicationDrawableLeft.isHighlighted).isTrue()
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(LEFT_COMPLICATION_ID)
+        assertThat(testWatchFaceService.tappedComplicationIds)
+            .isEqualTo(listOf(LEFT_COMPLICATION_ID))
 
         runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
         assertThat(complicationDrawableLeft.isHighlighted).isFalse()
@@ -717,8 +725,8 @@
         testWatchFaceService.reset()
         tapAt(70, 50)
         assertThat(complicationDrawableRight.isHighlighted).isTrue()
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(RIGHT_COMPLICATION_ID)
+        assertThat(testWatchFaceService.tappedComplicationIds)
+            .isEqualTo(listOf(RIGHT_COMPLICATION_ID))
 
         runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
         assertThat(complicationDrawableLeft.isHighlighted).isFalse()
@@ -726,16 +734,15 @@
         // Tap on blank space.
         testWatchFaceService.reset()
         tapAt(1, 1)
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isNull()
+        assertThat(testWatchFaceService.tappedComplicationIds).isEmpty()
 
         runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
         assertThat(complicationDrawableLeft.isHighlighted).isFalse()
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(2)
+        assertThat(testWatchFaceService.tappedComplicationIds).isEmpty()
     }
 
     @Test
-    public fun fastTap_onDifferentComplications() {
+    public fun singleTaps_onDifferentComplications() {
         initEngine(
             WatchFaceType.ANALOG,
             listOf(leftComplication, rightComplication),
@@ -747,59 +754,24 @@
 
         // Rapidly tap left then right complication.
         tapAt(30, 50)
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong() / 2)
         tapAt(70, 50)
 
-        // Both complications get temporarily highlighted but only the second one registers a tap.
+        // Both complications get temporarily highlighted.
         assertThat(complicationDrawableLeft.isHighlighted).isTrue()
         assertThat(complicationDrawableRight.isHighlighted).isTrue()
-        assertThat(testWatchFaceService.complicationSingleTapped).isNull()
 
+        // And the highlight goes away after a delay.
         runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
         assertThat(complicationDrawableLeft.isHighlighted).isFalse()
         assertThat(complicationDrawableRight.isHighlighted).isFalse()
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(1)
+
+        // Taps are registered on both complications.
+        assertThat(testWatchFaceService.tappedComplicationIds)
+            .isEqualTo(listOf(LEFT_COMPLICATION_ID, RIGHT_COMPLICATION_ID))
     }
 
     @Test
-    public fun slow_doubleTap_recognisedAsSingleTap() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        assertThat(complicationDrawableLeft.isHighlighted).isFalse()
-        assertThat(complicationDrawableRight.isHighlighted).isFalse()
-
-        // Slowly tap left complication twice.
-        doubleTapAt(30, 50, ViewConfiguration.getDoubleTapTimeout().toLong() * 2)
-
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(LEFT_COMPLICATION_ID)
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(1)
-    }
-
-    @Test
-    public fun tripleTap_recognisedAsSingleTap() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        assertThat(complicationDrawableLeft.isHighlighted).isFalse()
-        assertThat(complicationDrawableRight.isHighlighted).isFalse()
-
-        // Quickly tap left complication thrice.
-        tripleTapAt(30, 50, ViewConfiguration.getDoubleTapTimeout().toLong() / 2)
-
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(LEFT_COMPLICATION_ID)
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(1)
-    }
-
-    @Test
-    public fun tapCancel_after_tapDown_at_same_location_HandledAsSingleTap() {
+    public fun tapCancel_after_tapDown_CancelsTap() {
         initEngine(
             WatchFaceType.ANALOG,
             listOf(leftComplication, rightComplication),
@@ -809,74 +781,7 @@
         testWatchFaceService.reset()
         // Tap/Cancel left complication
         tapCancelAt(30, 50)
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(LEFT_COMPLICATION_ID)
-    }
-
-    @Test
-    public fun tapDown_then_tapDown_tapCancel_HandledAsSingleTap() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        testWatchFaceService.reset()
-        // Tap down left Complication
-        watchFaceImpl.onTapCommand(TapType.DOWN, 30, 50)
-
-        // Tap down at right complication
-        watchFaceImpl.onTapCommand(TapType.DOWN, 70, 50)
-
-        // Now Tap cancel at the second position
-        watchFaceImpl.onTapCommand(TapType.CANCEL, 70, 50)
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(1)
-    }
-
-    @Test
-    public fun tapDown_tapCancel_different_positions_CancelsTap() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        testWatchFaceService.reset()
-        // Tap down at a position in left Complication
-        watchFaceImpl.onTapCommand(TapType.DOWN, 30, 50)
-        // Tap cancel at different position stillin left Complication
-        watchFaceImpl.onTapCommand(TapType.CANCEL, 32, 50)
-
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isNull()
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(0)
-    }
-
-    @Test
-    public fun singleTap_recognisedAfterTripleTap() {
-        initEngine(
-            WatchFaceType.ANALOG,
-            listOf(leftComplication, rightComplication),
-            UserStyleSchema(emptyList())
-        )
-
-        // Quickly tap right complication thrice.
-        tripleTapAt(70, 50, ViewConfiguration.getDoubleTapTimeout().toLong() / 2)
-
-        // Wait a bit for the condition to reset and clear our detection state.
-        testWatchFaceService.clearTappedState()
-        runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
-        assertThat(complicationDrawableLeft.isHighlighted).isFalse()
-        assertThat(complicationDrawableRight.isHighlighted).isFalse()
-
-        // Tap right complication.
-        tapAt(70, 50)
-        assertThat(complicationDrawableRight.isHighlighted).isTrue()
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(RIGHT_COMPLICATION_ID)
-        assertThat(testWatchFaceService.singleTapCount).isEqualTo(3)
+        assertThat(testWatchFaceService.tappedComplicationIds).isEmpty()
     }
 
     @Test
@@ -902,8 +807,8 @@
         // Tap the edge complication.
         tapAt(0, 50)
         assertThat(complicationDrawableEdge.isHighlighted).isTrue()
-        runPostedTasksFor(ViewConfiguration.getDoubleTapTimeout().toLong())
-        assertThat(testWatchFaceService.complicationSingleTapped).isEqualTo(EDGE_COMPLICATION_ID)
+        assertThat(testWatchFaceService.tappedComplicationIds)
+            .isEqualTo(listOf(EDGE_COMPLICATION_ID))
 
         runPostedTasksFor(WatchFaceImpl.CANCEL_COMPLICATION_HIGHLIGHTED_DELAY_MS)
         assertThat(complicationDrawableEdge.isHighlighted).isFalse()
@@ -954,13 +859,19 @@
         )
 
         // The delay should change when battery is low.
-        BroadcastReceivers.sendOnActionBatteryLowForTesting(Intent(Intent.ACTION_BATTERY_LOW))
+        watchFaceImpl.broadcastsReceiver!!.actionBatteryLowReceiver.onReceive(
+            context,
+            Intent(Intent.ACTION_BATTERY_LOW)
+        )
         assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0)).isEqualTo(
             WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS
         )
 
         // And go back to normal when battery is OK.
-        BroadcastReceivers.sendOnActionBatteryOkayForTesting(Intent(Intent.ACTION_BATTERY_OKAY))
+        watchFaceImpl.broadcastsReceiver!!.actionBatteryOkayReceiver.onReceive(
+            context,
+            Intent(Intent.ACTION_BATTERY_OKAY)
+        )
         assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0)).isEqualTo(
             INTERACTIVE_UPDATE_RATE_MS
         )
@@ -979,13 +890,17 @@
         )
 
         // The delay should change when battery is low.
-        BroadcastReceivers.sendOnActionBatteryLowForTesting(Intent(Intent.ACTION_BATTERY_LOW))
+        watchFaceImpl.broadcastsReceiver!!.actionBatteryLowReceiver.onReceive(
+            context,
+            Intent(Intent.ACTION_BATTERY_LOW)
+        )
         assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0)).isEqualTo(
             WatchFaceImpl.MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS
         )
 
         // And go back to normal when power is connected.
-        BroadcastReceivers.sendOnActionPowerConnectedForTesting(
+        watchFaceImpl.broadcastsReceiver!!.actionPowerConnectedReceiver.onReceive(
+            context,
             Intent(Intent.ACTION_POWER_CONNECTED)
         )
         assertThat(watchFaceImpl.computeDelayTillNextFrame(0, 0)).isEqualTo(
@@ -1451,8 +1366,8 @@
 
         // Despite disabling the background complication we should still get a
         // ContentDescriptionLabel for the main clock element.
-        val contentDescriptionLabels =
-            watchFaceImpl.complicationsManager.getContentDescriptionLabels()
+        engineWrapper.updateContentDescriptionLabels()
+        val contentDescriptionLabels = engineWrapper.contentDescriptionLabels
         assertThat(contentDescriptionLabels.size).isEqualTo(3)
         assertThat(contentDescriptionLabels[0].bounds).isEqualTo(
             Rect(
@@ -1481,6 +1396,103 @@
     }
 
     @Test
+    public fun styleChangesAccessibilityTraversalIndex() {
+        val leftAndRightComplicationsOptionIndexReversed = ComplicationsOption(
+            Option.Id(LEFT_AND_RIGHT_COMPLICATIONS),
+            "Both",
+            null,
+            listOf(
+                ComplicationOverlay.Builder(LEFT_COMPLICATION_ID)
+                    .setEnabled(true).setAccessibilityTraversalIndex(RIGHT_COMPLICATION_ID).build(),
+                ComplicationOverlay.Builder(RIGHT_COMPLICATION_ID)
+                    .setEnabled(true).setAccessibilityTraversalIndex(LEFT_COMPLICATION_ID).build()
+            )
+        )
+
+        val complicationsStyleSetting = ComplicationsUserStyleSetting(
+            UserStyleSetting.Id("complications_style_setting"),
+            "AllComplications",
+            "Number and position",
+            icon = null,
+            complicationConfig = listOf(
+                leftAndRightComplicationsOption,
+                leftAndRightComplicationsOptionIndexReversed
+            ),
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+        )
+
+        initEngine(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication, rightComplication),
+            UserStyleSchema(listOf(complicationsStyleSetting)),
+            4
+        )
+
+        // Despite disabling the background complication we should still get a
+        // ContentDescriptionLabel for the main clock element.
+        engineWrapper.updateContentDescriptionLabels()
+        val contentDescriptionLabels = engineWrapper.contentDescriptionLabels
+        assertThat(contentDescriptionLabels.size).isEqualTo(3)
+        assertThat(contentDescriptionLabels[0].bounds).isEqualTo(
+            Rect(
+                25,
+                25,
+                75,
+                75
+            )
+        ) // Clock element.
+        assertThat(contentDescriptionLabels[1].bounds).isEqualTo(
+            Rect(
+                20,
+                40,
+                40,
+                60
+            )
+        ) // Left complication.
+        assertThat(contentDescriptionLabels[2].bounds).isEqualTo(
+            Rect(
+                60,
+                40,
+                80,
+                60
+            )
+        ) // Right complication.
+
+        // Change the style
+        engineWrapper.watchFaceImpl.userStyleRepository.userStyle = UserStyle(
+            hashMapOf(complicationsStyleSetting to leftAndRightComplicationsOptionIndexReversed)
+        )
+        runPostedTasksFor(0)
+
+        val contentDescriptionLabels2 = engineWrapper.contentDescriptionLabels
+        assertThat(contentDescriptionLabels2.size).isEqualTo(3)
+        assertThat(contentDescriptionLabels2[0].bounds).isEqualTo(
+            Rect(
+                25,
+                25,
+                75,
+                75
+            )
+        ) // Clock element.
+        assertThat(contentDescriptionLabels2[1].bounds).isEqualTo(
+            Rect(
+                60,
+                40,
+                80,
+                60
+            )
+        ) // Right complication.
+        assertThat(contentDescriptionLabels2[2].bounds).isEqualTo(
+            Rect(
+                20,
+                40,
+                40,
+                60
+            )
+        ) // Left complication.
+    }
+
+    @Test
     public fun getOptionForIdentifier_ListViewStyleSetting() {
         // Check the correct Options are returned for known option names.
         assertThat(colorStyleSetting.getOptionForId(redStyleOption.id.value)).isEqualTo(
@@ -1572,7 +1584,7 @@
             DefaultComplicationProviderPolicy(
                 provider1,
                 provider2,
-                SystemProviders.SUNRISE_SUNSET
+                SystemProviders.PROVIDER_SUNRISE_SUNSET
             ),
             ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
@@ -1584,7 +1596,7 @@
         verify(iWatchFaceService).setDefaultComplicationProviderWithFallbacks(
             LEFT_COMPLICATION_ID,
             listOf(provider1, provider2),
-            SystemProviders.SUNRISE_SUNSET,
+            SystemProviders.PROVIDER_SUNRISE_SUNSET,
             ComplicationData.TYPE_SHORT_TEXT
         )
     }
@@ -1600,7 +1612,7 @@
             DefaultComplicationProviderPolicy(
                 provider1,
                 provider2,
-                SystemProviders.SUNRISE_SUNSET
+                SystemProviders.PROVIDER_SUNRISE_SUNSET
             ),
             ComplicationBounds(RectF(0.2f, 0.4f, 0.4f, 0.6f))
         ).setDefaultProviderType(ComplicationType.SHORT_TEXT)
@@ -1621,7 +1633,9 @@
             LEFT_COMPLICATION_ID, provider1, ComplicationData.TYPE_SHORT_TEXT
         )
         verify(iWatchFaceService).setDefaultSystemComplicationProvider(
-            LEFT_COMPLICATION_ID, SystemProviders.SUNRISE_SUNSET, ComplicationData.TYPE_SHORT_TEXT
+            LEFT_COMPLICATION_ID,
+            SystemProviders.PROVIDER_SUNRISE_SUNSET,
+            ComplicationData.TYPE_SHORT_TEXT
         )
     }
 
@@ -1854,7 +1868,7 @@
         )
         val complicationsStyleSetting = ComplicationsUserStyleSetting(
             UserStyleSetting.Id("complications_style_setting"),
-            "Complications",
+            "AllComplications",
             "Number and position",
             icon = null,
             complicationConfig = listOf(
@@ -1862,7 +1876,7 @@
                 leftOnlyComplicationsOption,
                 rightOnlyComplicationsOption
             ),
-            affectsLayers = listOf(Layer.COMPLICATIONS)
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
         )
 
         initEngine(
@@ -1923,14 +1937,14 @@
         )
         val complicationsStyleSetting = ComplicationsUserStyleSetting(
             UserStyleSetting.Id("complications_style_setting"),
-            "Complications",
+            "AllComplications",
             "Number and position",
             icon = null,
             complicationConfig = listOf(
                 leftOnlyComplicationsOption, // The default value which should be applied.
                 bothComplicationsOption,
             ),
-            affectsLayers = listOf(Layer.COMPLICATIONS)
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
         )
 
         initEngine(
@@ -1944,6 +1958,80 @@
         assertFalse(rightComplication.enabled)
     }
 
+    public fun UserStyleManager_init_applies_ComplicationsUserStyleSetting() {
+        val complicationId1 = 101
+        val complicationId2 = 102
+
+        val complicationsStyleSetting = ComplicationsUserStyleSetting(
+            UserStyleSetting.Id("ID"),
+            "",
+            "",
+            icon = null,
+            complicationConfig = listOf(
+                ComplicationsOption(
+                    Option.Id("one"),
+                    "one",
+                    null,
+                    listOf(
+                        ComplicationOverlay(
+                            complicationId1,
+                            enabled = true
+                        ),
+                    )
+                ),
+                ComplicationsOption(
+                    Option.Id("two"),
+                    "teo",
+                    null,
+                    listOf(
+                        ComplicationOverlay(
+                            complicationId2,
+                            enabled = true
+                        ),
+                    )
+                )
+            ),
+            listOf(WatchFaceLayer.COMPLICATIONS)
+        )
+
+        val currentUserStyleRepository =
+            CurrentUserStyleRepository(UserStyleSchema(listOf(complicationsStyleSetting)))
+
+        val manager = ComplicationsManager(
+            listOf(
+                Complication.createRoundRectComplicationBuilder(
+                    complicationId1,
+                    CanvasComplicationDrawable(complicationDrawableLeft, watchState.asWatchState()),
+                    listOf(
+                        ComplicationType.RANGED_VALUE,
+                    ),
+                    DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
+                    ComplicationBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
+                ).setDefaultProviderType(ComplicationType.RANGED_VALUE)
+                    .setEnabled(false)
+                    .build(),
+
+                Complication.createRoundRectComplicationBuilder(
+                    complicationId2,
+                    CanvasComplicationDrawable(
+                        complicationDrawableRight, watchState.asWatchState()
+                    ),
+                    listOf(
+                        ComplicationType.LONG_TEXT,
+                    ),
+                    DefaultComplicationProviderPolicy(SystemProviders.PROVIDER_DAY_OF_WEEK),
+                    ComplicationBounds(RectF(0.2f, 0.7f, 0.4f, 0.9f))
+                ).setDefaultProviderType(ComplicationType.LONG_TEXT)
+                    .setEnabled(false)
+                    .build()
+            ),
+            currentUserStyleRepository
+        )
+
+        // The init function of ComplicationsManager should enable complicationId1.
+        assertThat(manager[complicationId1]!!.enabled).isTrue()
+    }
+
     @Test
     public fun observeComplicationData() {
         initWallpaperInteractiveWatchFaceInstance(
@@ -2248,42 +2336,6 @@
     }
 
     @Test
-    public fun renderParameters_secondaryConstructor() {
-        val params = RenderParameters(
-            DrawMode.INTERACTIVE,
-            mapOf(
-                Layer.BASE to LayerMode.DRAW,
-                Layer.COMPLICATIONS to LayerMode.DRAW,
-                Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-            ),
-            null
-        )
-
-        assertThat(params.drawMode).isEqualTo(DrawMode.INTERACTIVE)
-        assertThat(params.outlineTint).isEqualTo(Color.RED)
-        assertNull(params.selectedComplicationId)
-    }
-
-    @Test
-    public fun renderParameters_secondaryConstructorEnforcesNoDrawOutlined() {
-        try {
-            RenderParameters(
-                DrawMode.INTERACTIVE,
-                mapOf(
-                    Layer.BASE to LayerMode.DRAW,
-                    Layer.COMPLICATIONS to LayerMode.DRAW_OUTLINED,
-                    Layer.COMPLICATIONS_OVERLAY to LayerMode.DRAW
-                ),
-                null
-            )
-
-            fail("Should have thrown an exception due to LayerMode.DRAW_OUTLINED")
-        } catch (e: Exception) {
-            // Expected.
-        }
-    }
-
-    @Test
     public fun sendComplicationWallpaperCommandPreRFlow() {
         initEngine(
             WatchFaceType.ANALOG,
@@ -2495,6 +2547,38 @@
         verify(observer).onChanged(true)
     }
 
+    @Test
+    public fun complicationsUserStyleSetting_with_setComplicationBounds() {
+        val complicationsStyleSetting = ComplicationsUserStyleSetting(
+            UserStyleSetting.Id("complications_style_setting"),
+            "AllComplications",
+            "Number and position",
+            icon = null,
+            complicationConfig = listOf(
+                ComplicationsOption(
+                    Option.Id(RIGHT_COMPLICATION),
+                    "Right",
+                    null,
+                    listOf(
+                        ComplicationOverlay.Builder(LEFT_COMPLICATION_ID)
+                            .setComplicationBounds(
+                                ComplicationBounds(RectF(10f, 10f, 20f, 20f))
+                            ).build()
+                    )
+                )
+            ),
+            affectsWatchFaceLayers = listOf(WatchFaceLayer.COMPLICATIONS)
+        )
+
+        // This should not crash.
+        initEngine(
+            WatchFaceType.DIGITAL,
+            listOf(leftComplication, rightComplication),
+            UserStyleSchema(listOf(complicationsStyleSetting)),
+            apiVersion = 4
+        )
+    }
+
     @Suppress("DEPRECATION")
     private fun getChinWindowInsetsApi25(@Px chinHeight: Int): WindowInsets =
         WindowInsets.Builder().setSystemWindowInsets(
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchStateTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchStateTest.kt
index bae221e..201f53c 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchStateTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchStateTest.kt
@@ -28,8 +28,10 @@
     public fun asWatchState_interruptionFilter_isPropagated() {
         val mutableWatchState = MutableWatchState()
         var watchState = mutableWatchState.asWatchState()
-        // Initially not set.
-        assertThat(watchState.interruptionFilter.hasValue()).isFalse()
+        // Initially set to unknown.
+        assertThat(watchState.interruptionFilter.hasValue()).isTrue()
+        assertThat(watchState.interruptionFilter.value)
+            .isEqualTo(NotificationManager.INTERRUPTION_FILTER_UNKNOWN)
         // Value updated.
         mutableWatchState.interruptionFilter.value =
             NotificationManager.INTERRUPTION_FILTER_PRIORITY
@@ -147,4 +149,4 @@
         assertThat(watchState.isHeadless).isFalse()
         assertThat(mutableWatchState.asWatchState().isHeadless).isTrue()
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear/api/api_lint.ignore b/wear/wear/api/api_lint.ignore
index f43557d..776b3d6 100644
--- a/wear/wear/api/api_lint.ignore
+++ b/wear/wear/api/api_lint.ignore
@@ -21,12 +21,6 @@
     ConfirmationActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead.
 
 
-GetterSetterNames: androidx.wear.widget.WearArcLayout#getClockwise():
-    Symmetric method for `setClockwise` must be named `isClockwise`; was `getClockwise`
-GetterSetterNames: androidx.wear.widget.WearArcLayout.LayoutParams#getRotate():
-    Symmetric method for `setRotate` must be named `isRotate`; was `getRotate`
-GetterSetterNames: androidx.wear.widget.WearCurvedTextView#getClockwise():
-    Symmetric method for `setClockwise` must be named `isClockwise`; was `getClockwise`
 GetterSetterNames: androidx.wear.widget.drawer.WearableDrawerView#setIsAutoPeekEnabled(boolean):
     Symmetric method for `isAutoPeekEnabled` must be named `setAutoPeekEnabled`; was `setIsAutoPeekEnabled`
 GetterSetterNames: androidx.wear.widget.drawer.WearableDrawerView#setIsLocked(boolean):
diff --git a/wear/wear/api/current.txt b/wear/wear/api/current.txt
index 4df563b..1b11fb1 100644
--- a/wear/wear/api/current.txt
+++ b/wear/wear/api/current.txt
@@ -118,6 +118,42 @@
 
 package androidx.wear.widget {
 
+  @UiThread public class ArcLayout extends android.view.ViewGroup {
+    ctor public ArcLayout(android.content.Context);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method public int getAnchorType();
+    method public boolean isClockwise();
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(int);
+    method public void setClockwise(boolean);
+    field public static final int ANCHOR_CENTER = 1; // 0x1
+    field public static final int ANCHOR_END = 2; // 0x2
+    field public static final int ANCHOR_START = 0; // 0x0
+  }
+
+  public static class ArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout.LayoutParams(int, int);
+    ctor public ArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getVerticalAlignment();
+    method public boolean isRotated();
+    method public void setRotated(boolean);
+    method public void setVerticalAlignment(int);
+    field public static final int VERTICAL_ALIGN_CENTER = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_INNER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_OUTER = 0; // 0x0
+  }
+
+  public static interface ArcLayout.Widget {
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method @Px public int getThickness();
+    method public boolean isPointInsideClickArea(float, float);
+  }
+
   @UiThread public class BoxInsetLayout extends android.view.ViewGroup {
     ctor public BoxInsetLayout(android.content.Context);
     ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?);
@@ -194,6 +230,43 @@
   @IntDef({androidx.wear.widget.ConfirmationOverlay.SUCCESS_ANIMATION, androidx.wear.widget.ConfirmationOverlay.FAILURE_ANIMATION, androidx.wear.widget.ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConfirmationOverlay.OverlayType {
   }
 
+  public class CurvedTextView extends android.view.View implements androidx.wear.widget.ArcLayout.Widget {
+    ctor public CurvedTextView(android.content.Context);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method public int getAnchorType();
+    method public android.text.TextUtils.TruncateAt? getEllipsize();
+    method public String? getFontFeatureSettings();
+    method public String? getFontVariationSettings();
+    method public float getLetterSpacing();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMaxSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMinSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method public String? getText();
+    method @ColorInt public int getTextColor();
+    method public float getTextSize();
+    method @Px public int getThickness();
+    method public android.graphics.Typeface? getTypeface();
+    method public boolean isClockwise();
+    method public boolean isPointInsideClickArea(float, float);
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(int);
+    method public void setClockwise(boolean);
+    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
+    method public void setFontFeatureSettings(String?);
+    method public void setFontVariationSettings(String?);
+    method public void setLetterSpacing(float);
+    method public void setSweepRangeDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float, @FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setText(String?);
+    method public void setTextColor(@ColorInt int);
+    method public void setTextSize(float);
+    method public void setTypeface(android.graphics.Typeface?, int);
+    method public void setTypeface(android.graphics.Typeface?);
+  }
+
   public class CurvingLayoutCallback extends androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback {
     ctor public CurvingLayoutCallback(android.content.Context!);
     method public void adjustAnchorOffsetXY(android.view.View!, float[]!);
@@ -260,79 +333,6 @@
     method public void onSwipeStarted(androidx.wear.widget.SwipeDismissFrameLayout!);
   }
 
-  @UiThread public class WearArcLayout extends android.view.ViewGroup {
-    ctor public WearArcLayout(android.content.Context);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
-    method public float getAnchorAngleDegrees();
-    method public int getAnchorType();
-    method public boolean getClockwise();
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(int);
-    method public void setClockwise(boolean);
-    field public static final int ANCHOR_CENTER = 1; // 0x1
-    field public static final int ANCHOR_END = 2; // 0x2
-    field public static final int ANCHOR_START = 0; // 0x0
-  }
-
-  public static interface WearArcLayout.ArcLayoutWidget {
-    method public void checkInvalidAttributeAsChild();
-    method public float getSweepAngleDegrees();
-    method public int getThicknessPx();
-    method public boolean insideClickArea(float, float);
-  }
-
-  public static class WearArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public WearArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout.LayoutParams(int, int);
-    ctor public WearArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public boolean getRotate();
-    method public int getVerticalAlignment();
-    method public void setRotate(boolean);
-    method public void setVerticalAlignment(int);
-    field public static final int VALIGN_CENTER = 1; // 0x1
-    field public static final int VALIGN_INNER = 2; // 0x2
-    field public static final int VALIGN_OUTER = 0; // 0x0
-  }
-
-  public class WearCurvedTextView extends android.view.View implements androidx.wear.widget.WearArcLayout.ArcLayoutWidget {
-    ctor public WearCurvedTextView(android.content.Context);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
-    method public void checkInvalidAttributeAsChild();
-    method public float getAnchorAngleDegrees();
-    method public int getAnchorType();
-    method public boolean getClockwise();
-    method public android.text.TextUtils.TruncateAt? getEllipsize();
-    method public String? getFontFeatureSettings();
-    method public String? getFontVariationSettings();
-    method public float getLetterSpacing();
-    method public float getMaxSweepDegrees();
-    method public float getMinSweepDegrees();
-    method public float getSweepAngleDegrees();
-    method public String? getText();
-    method @ColorInt public int getTextColor();
-    method public float getTextSize();
-    method public int getThicknessPx();
-    method public android.graphics.Typeface? getTypeface();
-    method public boolean insideClickArea(float, float);
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(int);
-    method public void setClockwise(boolean);
-    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
-    method public void setFontFeatureSettings(String?);
-    method public void setFontVariationSettings(String?);
-    method public void setLetterSpacing(float);
-    method public void setMaxSweepDegrees(float);
-    method public void setMinSweepDegrees(float);
-    method public void setText(String?);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(float);
-    method public void setTypeface(android.graphics.Typeface?);
-  }
-
   public class WearableLinearLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
     ctor public WearableLinearLayoutManager(android.content.Context!, androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback!);
     ctor public WearableLinearLayoutManager(android.content.Context!);
diff --git a/wear/wear/api/public_plus_experimental_current.txt b/wear/wear/api/public_plus_experimental_current.txt
index 4df563b..1b11fb1 100644
--- a/wear/wear/api/public_plus_experimental_current.txt
+++ b/wear/wear/api/public_plus_experimental_current.txt
@@ -118,6 +118,42 @@
 
 package androidx.wear.widget {
 
+  @UiThread public class ArcLayout extends android.view.ViewGroup {
+    ctor public ArcLayout(android.content.Context);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method public int getAnchorType();
+    method public boolean isClockwise();
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(int);
+    method public void setClockwise(boolean);
+    field public static final int ANCHOR_CENTER = 1; // 0x1
+    field public static final int ANCHOR_END = 2; // 0x2
+    field public static final int ANCHOR_START = 0; // 0x0
+  }
+
+  public static class ArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout.LayoutParams(int, int);
+    ctor public ArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getVerticalAlignment();
+    method public boolean isRotated();
+    method public void setRotated(boolean);
+    method public void setVerticalAlignment(int);
+    field public static final int VERTICAL_ALIGN_CENTER = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_INNER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_OUTER = 0; // 0x0
+  }
+
+  public static interface ArcLayout.Widget {
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method @Px public int getThickness();
+    method public boolean isPointInsideClickArea(float, float);
+  }
+
   @UiThread public class BoxInsetLayout extends android.view.ViewGroup {
     ctor public BoxInsetLayout(android.content.Context);
     ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?);
@@ -194,6 +230,43 @@
   @IntDef({androidx.wear.widget.ConfirmationOverlay.SUCCESS_ANIMATION, androidx.wear.widget.ConfirmationOverlay.FAILURE_ANIMATION, androidx.wear.widget.ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConfirmationOverlay.OverlayType {
   }
 
+  public class CurvedTextView extends android.view.View implements androidx.wear.widget.ArcLayout.Widget {
+    ctor public CurvedTextView(android.content.Context);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method public int getAnchorType();
+    method public android.text.TextUtils.TruncateAt? getEllipsize();
+    method public String? getFontFeatureSettings();
+    method public String? getFontVariationSettings();
+    method public float getLetterSpacing();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMaxSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMinSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method public String? getText();
+    method @ColorInt public int getTextColor();
+    method public float getTextSize();
+    method @Px public int getThickness();
+    method public android.graphics.Typeface? getTypeface();
+    method public boolean isClockwise();
+    method public boolean isPointInsideClickArea(float, float);
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(int);
+    method public void setClockwise(boolean);
+    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
+    method public void setFontFeatureSettings(String?);
+    method public void setFontVariationSettings(String?);
+    method public void setLetterSpacing(float);
+    method public void setSweepRangeDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float, @FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setText(String?);
+    method public void setTextColor(@ColorInt int);
+    method public void setTextSize(float);
+    method public void setTypeface(android.graphics.Typeface?, int);
+    method public void setTypeface(android.graphics.Typeface?);
+  }
+
   public class CurvingLayoutCallback extends androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback {
     ctor public CurvingLayoutCallback(android.content.Context!);
     method public void adjustAnchorOffsetXY(android.view.View!, float[]!);
@@ -260,79 +333,6 @@
     method public void onSwipeStarted(androidx.wear.widget.SwipeDismissFrameLayout!);
   }
 
-  @UiThread public class WearArcLayout extends android.view.ViewGroup {
-    ctor public WearArcLayout(android.content.Context);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
-    method public float getAnchorAngleDegrees();
-    method public int getAnchorType();
-    method public boolean getClockwise();
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(int);
-    method public void setClockwise(boolean);
-    field public static final int ANCHOR_CENTER = 1; // 0x1
-    field public static final int ANCHOR_END = 2; // 0x2
-    field public static final int ANCHOR_START = 0; // 0x0
-  }
-
-  public static interface WearArcLayout.ArcLayoutWidget {
-    method public void checkInvalidAttributeAsChild();
-    method public float getSweepAngleDegrees();
-    method public int getThicknessPx();
-    method public boolean insideClickArea(float, float);
-  }
-
-  public static class WearArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public WearArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout.LayoutParams(int, int);
-    ctor public WearArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public boolean getRotate();
-    method public int getVerticalAlignment();
-    method public void setRotate(boolean);
-    method public void setVerticalAlignment(int);
-    field public static final int VALIGN_CENTER = 1; // 0x1
-    field public static final int VALIGN_INNER = 2; // 0x2
-    field public static final int VALIGN_OUTER = 0; // 0x0
-  }
-
-  public class WearCurvedTextView extends android.view.View implements androidx.wear.widget.WearArcLayout.ArcLayoutWidget {
-    ctor public WearCurvedTextView(android.content.Context);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
-    method public void checkInvalidAttributeAsChild();
-    method public float getAnchorAngleDegrees();
-    method public int getAnchorType();
-    method public boolean getClockwise();
-    method public android.text.TextUtils.TruncateAt? getEllipsize();
-    method public String? getFontFeatureSettings();
-    method public String? getFontVariationSettings();
-    method public float getLetterSpacing();
-    method public float getMaxSweepDegrees();
-    method public float getMinSweepDegrees();
-    method public float getSweepAngleDegrees();
-    method public String? getText();
-    method @ColorInt public int getTextColor();
-    method public float getTextSize();
-    method public int getThicknessPx();
-    method public android.graphics.Typeface? getTypeface();
-    method public boolean insideClickArea(float, float);
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(int);
-    method public void setClockwise(boolean);
-    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
-    method public void setFontFeatureSettings(String?);
-    method public void setFontVariationSettings(String?);
-    method public void setLetterSpacing(float);
-    method public void setMaxSweepDegrees(float);
-    method public void setMinSweepDegrees(float);
-    method public void setText(String?);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(float);
-    method public void setTypeface(android.graphics.Typeface?);
-  }
-
   public class WearableLinearLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
     ctor public WearableLinearLayoutManager(android.content.Context!, androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback!);
     ctor public WearableLinearLayoutManager(android.content.Context!);
diff --git a/wear/wear/api/restricted_current.txt b/wear/wear/api/restricted_current.txt
index 31ddee57..6e3ffdf 100644
--- a/wear/wear/api/restricted_current.txt
+++ b/wear/wear/api/restricted_current.txt
@@ -118,6 +118,48 @@
 
 package androidx.wear.widget {
 
+  @UiThread public class ArcLayout extends android.view.ViewGroup {
+    ctor public ArcLayout(android.content.Context);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method @androidx.wear.widget.ArcLayout.AnchorType public int getAnchorType();
+    method public boolean isClockwise();
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(@androidx.wear.widget.ArcLayout.AnchorType int);
+    method public void setClockwise(boolean);
+    field public static final int ANCHOR_CENTER = 1; // 0x1
+    field public static final int ANCHOR_END = 2; // 0x2
+    field public static final int ANCHOR_START = 0; // 0x0
+  }
+
+  @IntDef({androidx.wear.widget.ArcLayout.ANCHOR_START, androidx.wear.widget.ArcLayout.ANCHOR_CENTER, androidx.wear.widget.ArcLayout.ANCHOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ArcLayout.AnchorType {
+  }
+
+  public static class ArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
+    ctor public ArcLayout.LayoutParams(int, int);
+    ctor public ArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method @androidx.wear.widget.ArcLayout.LayoutParams.VerticalAlignment public int getVerticalAlignment();
+    method public boolean isRotated();
+    method public void setRotated(boolean);
+    method public void setVerticalAlignment(@androidx.wear.widget.ArcLayout.LayoutParams.VerticalAlignment int);
+    field public static final int VERTICAL_ALIGN_CENTER = 1; // 0x1
+    field public static final int VERTICAL_ALIGN_INNER = 2; // 0x2
+    field public static final int VERTICAL_ALIGN_OUTER = 0; // 0x0
+  }
+
+  @IntDef({androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_OUTER, androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_CENTER, androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_INNER}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ArcLayout.LayoutParams.VerticalAlignment {
+  }
+
+  public static interface ArcLayout.Widget {
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method @Px public int getThickness();
+    method public boolean isPointInsideClickArea(float, float);
+  }
+
   @UiThread public class BoxInsetLayout extends android.view.ViewGroup {
     ctor public BoxInsetLayout(android.content.Context);
     ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?);
@@ -195,6 +237,43 @@
   @IntDef({androidx.wear.widget.ConfirmationOverlay.SUCCESS_ANIMATION, androidx.wear.widget.ConfirmationOverlay.FAILURE_ANIMATION, androidx.wear.widget.ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConfirmationOverlay.OverlayType {
   }
 
+  public class CurvedTextView extends android.view.View implements androidx.wear.widget.ArcLayout.Widget {
+    ctor public CurvedTextView(android.content.Context);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
+    method public void checkInvalidAttributeAsChild();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getAnchorAngleDegrees();
+    method @androidx.wear.widget.ArcLayout.AnchorType public int getAnchorType();
+    method public android.text.TextUtils.TruncateAt? getEllipsize();
+    method public String? getFontFeatureSettings();
+    method public String? getFontVariationSettings();
+    method public float getLetterSpacing();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMaxSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getMinSweepDegrees();
+    method @FloatRange(from=0.0f, to=360.0f, toInclusive=true) public float getSweepAngleDegrees();
+    method public String? getText();
+    method @ColorInt public int getTextColor();
+    method public float getTextSize();
+    method @Px public int getThickness();
+    method public android.graphics.Typeface? getTypeface();
+    method public boolean isClockwise();
+    method public boolean isPointInsideClickArea(float, float);
+    method public void setAnchorAngleDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setAnchorType(@androidx.wear.widget.ArcLayout.AnchorType int);
+    method public void setClockwise(boolean);
+    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
+    method public void setFontFeatureSettings(String?);
+    method public void setFontVariationSettings(String?);
+    method public void setLetterSpacing(float);
+    method public void setSweepRangeDegrees(@FloatRange(from=0.0f, to=360.0f, toInclusive=true) float, @FloatRange(from=0.0f, to=360.0f, toInclusive=true) float);
+    method public void setText(String?);
+    method public void setTextColor(@ColorInt int);
+    method public void setTextSize(float);
+    method public void setTypeface(android.graphics.Typeface?, int);
+    method public void setTypeface(android.graphics.Typeface?);
+  }
+
   public class CurvingLayoutCallback extends androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback {
     ctor public CurvingLayoutCallback(android.content.Context!);
     method public void adjustAnchorOffsetXY(android.view.View!, float[]!);
@@ -261,85 +340,6 @@
     method public void onSwipeStarted(androidx.wear.widget.SwipeDismissFrameLayout!);
   }
 
-  @UiThread public class WearArcLayout extends android.view.ViewGroup {
-    ctor public WearArcLayout(android.content.Context);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearArcLayout(android.content.Context, android.util.AttributeSet?, int, int);
-    method public float getAnchorAngleDegrees();
-    method @androidx.wear.widget.WearArcLayout.AnchorType public int getAnchorType();
-    method public boolean getClockwise();
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(@androidx.wear.widget.WearArcLayout.AnchorType int);
-    method public void setClockwise(boolean);
-    field public static final int ANCHOR_CENTER = 1; // 0x1
-    field public static final int ANCHOR_END = 2; // 0x2
-    field public static final int ANCHOR_START = 0; // 0x0
-  }
-
-  @IntDef({androidx.wear.widget.WearArcLayout.ANCHOR_START, androidx.wear.widget.WearArcLayout.ANCHOR_CENTER, androidx.wear.widget.WearArcLayout.ANCHOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WearArcLayout.AnchorType {
-  }
-
-  public static interface WearArcLayout.ArcLayoutWidget {
-    method public void checkInvalidAttributeAsChild();
-    method public float getSweepAngleDegrees();
-    method public int getThicknessPx();
-    method public boolean insideClickArea(float, float);
-  }
-
-  public static class WearArcLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public WearArcLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
-    ctor public WearArcLayout.LayoutParams(int, int);
-    ctor public WearArcLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public boolean getRotate();
-    method @androidx.wear.widget.WearArcLayout.LayoutParams.VerticalAlignment public int getVerticalAlignment();
-    method public void setRotate(boolean);
-    method public void setVerticalAlignment(@androidx.wear.widget.WearArcLayout.LayoutParams.VerticalAlignment int);
-    field public static final int VALIGN_CENTER = 1; // 0x1
-    field public static final int VALIGN_INNER = 2; // 0x2
-    field public static final int VALIGN_OUTER = 0; // 0x0
-  }
-
-  @IntDef({androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_OUTER, androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_CENTER, androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_INNER}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WearArcLayout.LayoutParams.VerticalAlignment {
-  }
-
-  public class WearCurvedTextView extends android.view.View implements androidx.wear.widget.WearArcLayout.ArcLayoutWidget {
-    ctor public WearCurvedTextView(android.content.Context);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int);
-    ctor public WearCurvedTextView(android.content.Context, android.util.AttributeSet?, int, int);
-    method public void checkInvalidAttributeAsChild();
-    method public float getAnchorAngleDegrees();
-    method public int getAnchorType();
-    method public boolean getClockwise();
-    method public android.text.TextUtils.TruncateAt? getEllipsize();
-    method public String? getFontFeatureSettings();
-    method public String? getFontVariationSettings();
-    method public float getLetterSpacing();
-    method public float getMaxSweepDegrees();
-    method public float getMinSweepDegrees();
-    method public float getSweepAngleDegrees();
-    method public String? getText();
-    method @ColorInt public int getTextColor();
-    method public float getTextSize();
-    method public int getThicknessPx();
-    method public android.graphics.Typeface? getTypeface();
-    method public boolean insideClickArea(float, float);
-    method public void setAnchorAngleDegrees(float);
-    method public void setAnchorType(@androidx.wear.widget.WearArcLayout.AnchorType int);
-    method public void setClockwise(boolean);
-    method public void setEllipsize(android.text.TextUtils.TruncateAt?);
-    method public void setFontFeatureSettings(String?);
-    method public void setFontVariationSettings(String?);
-    method public void setLetterSpacing(float);
-    method public void setMaxSweepDegrees(float);
-    method public void setMinSweepDegrees(float);
-    method public void setText(String?);
-    method public void setTextColor(@ColorInt int);
-    method public void setTextSize(float);
-    method public void setTypeface(android.graphics.Typeface?);
-  }
-
   public class WearableLinearLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
     ctor public WearableLinearLayoutManager(android.content.Context!, androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback!);
     ctor public WearableLinearLayoutManager(android.content.Context!);
diff --git a/wear/wear/build.gradle b/wear/wear/build.gradle
index a1aa6ae..80eb984 100644
--- a/wear/wear/build.gradle
+++ b/wear/wear/build.gradle
@@ -23,9 +23,9 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 
     testImplementation(KOTLIN_STDLIB)
     testImplementation(ANDROIDX_TEST_CORE)
diff --git a/wear/wear/lint-baseline.xml b/wear/wear/lint-baseline.xml
index 599106e..86495bb 100644
--- a/wear/wear/lint-baseline.xml
+++ b/wear/wear/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="KotlinPropertyAccess"
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/ArcLayoutTest.kt b/wear/wear/src/androidTest/java/androidx/wear/widget/ArcLayoutTest.kt
new file mode 100644
index 0000000..5c6d210
--- /dev/null
+++ b/wear/wear/src/androidTest/java/androidx/wear/widget/ArcLayoutTest.kt
@@ -0,0 +1,803 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.widget
+
+import android.app.Activity
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.util.AttributeSet
+import android.view.InputDevice
+import android.view.MotionEvent
+import android.view.View
+import android.view.View.MeasureSpec
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.TextView
+import androidx.core.view.children
+import androidx.core.view.forEach
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.UiController
+import androidx.test.espresso.ViewAction
+import androidx.test.espresso.action.GeneralClickAction
+import androidx.test.espresso.action.Press
+import androidx.test.espresso.action.Tap
+import androidx.test.espresso.action.ViewActions
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.filters.MediumTest
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import androidx.test.screenshot.assertAgainstGolden
+import androidx.wear.test.R
+import androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_CENTER
+import androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_INNER
+import androidx.wear.widget.ArcLayout.LayoutParams.VERTICAL_ALIGN_OUTER
+import androidx.wear.widget.util.AsyncViewActions.waitForMatchingView
+import org.hamcrest.CoreMatchers.allOf
+import org.hamcrest.CoreMatchers.any
+import org.hamcrest.Matcher
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@RunWith(Parameterized::class)
+@MediumTest
+class ArcLayoutTest(private val testHeight: Int) {
+    private val testWidth: Int = SCREEN_SIZE_DEFAULT
+    private val renderDoneLatch = CountDownLatch(1)
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule("wear/wear")
+
+    private fun doOneTest(
+        key: String,
+        views: List<View>,
+        backgroundColor: Int = Color.GRAY,
+        interactiveFunction: (FrameLayout.() -> Unit)? = null
+
+    ) {
+        val bitmap = Bitmap.createBitmap(testWidth, testHeight, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(bitmap)
+
+        // Set the main frame.
+        val mainFrame = FrameLayout(ApplicationProvider.getApplicationContext())
+        mainFrame.setBackgroundColor(backgroundColor)
+
+        for (view in views) {
+            mainFrame.addView(view)
+        }
+        val screenWidth = MeasureSpec.makeMeasureSpec(testWidth, MeasureSpec.EXACTLY)
+        val screenHeight = MeasureSpec.makeMeasureSpec(testHeight, MeasureSpec.EXACTLY)
+        mainFrame.measure(screenWidth, screenHeight)
+        mainFrame.layout(0, 0, testWidth, testHeight)
+        mainFrame.draw(canvas)
+        // If an interactive function is set, call it now and redraw.
+        // The function will generate mouse events and then we draw again to see the result
+        // displayed on the views (the test records and shows mouse events in the view)
+        interactiveFunction?.let {
+            it(mainFrame)
+            mainFrame.draw(canvas)
+        }
+        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        bitmap.assertAgainstGolden(screenshotRule, key + "_" + testHeight)
+    }
+
+    private fun createArc(text1: String = "SWEEP", text2: String = "Default") =
+        ArcLayout(ApplicationProvider.getApplicationContext())
+            .apply {
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = text1
+                            textColor = Color.BLUE
+                            setBackgroundColor(Color.rgb(100, 100, 0))
+                            setSweepRangeDegrees(45f, 360f)
+                        }
+                )
+                addView(
+                    TextView(ApplicationProvider.getApplicationContext()).apply {
+                        text = "TXT"
+                        setTextColor(Color.GREEN)
+                        layoutParams =
+                            ArcLayout.LayoutParams(
+                                ViewGroup.LayoutParams.WRAP_CONTENT,
+                                ViewGroup.LayoutParams.WRAP_CONTENT
+                            )
+                    }
+                )
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = text2
+                            textColor = Color.RED
+                            setBackgroundColor(Color.rgb(0, 100, 100))
+                        }
+                )
+            }
+
+    private fun createMixedArc() =
+        ArcLayout(ApplicationProvider.getApplicationContext())
+            .apply {
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = "One"
+                            setBackgroundColor(Color.rgb(100, 100, 100))
+                            setSweepRangeDegrees(0f, 20f)
+                            isClockwise = true
+                        }
+                )
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = "Two"
+                            setBackgroundColor(Color.rgb(150, 150, 150))
+                            setSweepRangeDegrees(0f, 20f)
+                            isClockwise = false
+                        }
+                )
+                addView(
+                    TextView(ApplicationProvider.getApplicationContext()).apply {
+                        text = "TXT"
+                        setTextColor(Color.GREEN)
+                        layoutParams =
+                            ArcLayout.LayoutParams(
+                                ViewGroup.LayoutParams.WRAP_CONTENT,
+                                ViewGroup.LayoutParams.WRAP_CONTENT
+                            ).apply { isRotated = false }
+                    }
+                )
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = "Three"
+                            setBackgroundColor(Color.rgb(100, 100, 100))
+                            setSweepRangeDegrees(0f, 20f)
+                            isClockwise = true
+                        }
+                )
+                addView(
+                    CurvedTextView(ApplicationProvider.getApplicationContext())
+                        .apply {
+                            text = "Four"
+                            setBackgroundColor(Color.rgb(150, 150, 150))
+                            setSweepRangeDegrees(0f, 20f)
+                            isClockwise = false
+                        }
+                )
+            }
+
+    @Test
+    @Throws(Exception::class)
+    fun testArcs() {
+        doOneTest(
+            "basic_arcs_screenshot",
+            listOf(
+                createArc(),
+                createArc("SWEEP", "Start").apply {
+                    anchorAngleDegrees = 90f
+                    anchorType = ArcLayout.ANCHOR_START
+                },
+                createArc("SWEEP", "End").apply {
+                    anchorAngleDegrees = 270f
+                    anchorType = ArcLayout.ANCHOR_END
+                },
+                createArc("SWEEP", "Center").apply {
+                    anchorAngleDegrees = 315f
+                    anchorType = ArcLayout.ANCHOR_CENTER
+                }
+            )
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testArcsCcw() {
+        doOneTest(
+            "basic_arcs_ccw_screenshot",
+            listOf(
+                createArc(),
+                createArc("SWEEP", "Start").apply {
+                    anchorAngleDegrees = 270f
+                    anchorType = ArcLayout.ANCHOR_START
+                },
+                createArc("SWEEP", "End").apply {
+                    anchorAngleDegrees = 90f
+                    anchorType = ArcLayout.ANCHOR_END
+                },
+                createArc("SWEEP", "Center").apply {
+                    anchorAngleDegrees = 45f
+                    anchorType = ArcLayout.ANCHOR_CENTER
+                }
+            ).apply { forEach { it.isClockwise = false } }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testArcsMixed() {
+        doOneTest(
+            "basic_arcs_mix_screenshot",
+            listOf(
+                createMixedArc(),
+                createMixedArc().apply {
+                    isClockwise = false
+                }
+            )
+        )
+    }
+
+    // We keep track of the color of added widgets, to use on touch tests.
+    // We should try to avoid using white since it have special meaning.
+    var colorProcessor: (Int) -> Int = { color ->
+        when (color) {
+            Color.WHITE -> 0xFFCCCCCC.toInt()
+            else -> color or 0xFF000000.toInt()
+        }
+    }
+    var testColors = mutableListOf<Int>()
+
+    @Before
+    fun setup() {
+        testColors = mutableListOf(0) // Used when no view got the event
+    }
+
+    // Extension functions to make the margin test more readable.
+    fun ArcLayout.addSeparator(angle: Float = 10f) {
+        addView(
+            CurvedTextView(ApplicationProvider.getApplicationContext())
+                .apply {
+                    text = " "
+                    setSweepRangeDegrees(angle, 360f)
+                    setBackgroundColor(Color.rgb(100, 100, 100))
+                    isClockwise = true
+                    textSize = 40f
+                }
+        )
+        testColors.add(colorProcessor(Color.rgb(150, 150, 150)))
+    }
+
+    fun ArcLayout.addCurvedText(
+        text: String,
+        color: Int,
+        marginLeft: Int? = null,
+        marginTop: Int? = null,
+        marginRight: Int? = null,
+        marginBottom: Int? = null,
+        margin: Int? = null,
+        paddingLeft: Int? = null,
+        paddingTop: Int? = null,
+        paddingRight: Int? = null,
+        paddingBottom: Int? = null,
+        padding: Int? = null,
+        vAlign: Int = VERTICAL_ALIGN_CENTER,
+        clockwise: Boolean = true,
+        textSize: Float = 14f,
+        textAlignment: Int = View.TEXT_ALIGNMENT_TEXT_START,
+        minSweep: Float = 0f
+    ) {
+        addView(
+            CurvedTextView(ApplicationProvider.getApplicationContext())
+                .also {
+                    it.text = text
+                    it.setBackgroundColor(color)
+                    it.isClockwise = clockwise
+                    it.textSize = textSize
+                    it.textAlignment = textAlignment
+                    it.setSweepRangeDegrees(minSweep, 360f)
+                    it.setPadding(
+                        paddingLeft ?: padding ?: 0,
+                        paddingTop ?: padding ?: 0,
+                        paddingRight ?: padding ?: 0,
+                        paddingBottom ?: padding ?: 0
+                    )
+                    it.layoutParams = ArcLayout.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.MATCH_PARENT
+                    ).apply {
+                        setMargins(
+                            marginLeft ?: margin ?: 0,
+                            marginTop ?: margin ?: 0,
+                            marginRight ?: margin ?: 0,
+                            marginBottom ?: margin ?: 0
+                        )
+                        verticalAlignment = vAlign
+                    }
+                }
+        )
+        testColors.add(colorProcessor(color))
+    }
+
+    fun ArcLayout.addTextView(
+        text: String,
+        color: Int,
+        textSize: Float = 14f
+    ) {
+        addView(
+            TextView(context).also {
+                it.text = text
+                it.background = ColorDrawable(color)
+                it.textSize = textSize
+            }
+        )
+        testColors.add(colorProcessor(color))
+    }
+
+    fun ArcLayout.addInvisibleTextView() {
+        addView(
+            TextView(context).also {
+                it.text = "Invisible"
+                it.visibility = View.INVISIBLE
+            }
+        )
+        testColors.add(0xFF13579B.toInt())
+    }
+
+    fun ArcLayout.addGoneTextView() {
+        addView(
+            TextView(context).also {
+                it.text = "Gone"
+                it.visibility = View.GONE
+            }
+        )
+        testColors.add(0xFF13579B.toInt())
+    }
+
+    private fun createArcWithMargin() =
+        ArcLayout(ApplicationProvider.getApplicationContext())
+            .apply {
+                anchorType = ArcLayout.ANCHOR_CENTER
+                addSeparator()
+                addCurvedText("RI", Color.RED, marginTop = 16, vAlign = VERTICAL_ALIGN_INNER)
+                addCurvedText(
+                    "GI",
+                    Color.GREEN,
+                    marginTop = 8,
+                    marginBottom = 8,
+                    vAlign = VERTICAL_ALIGN_INNER
+                )
+                addCurvedText("BI", Color.BLUE, marginBottom = 16, vAlign = VERTICAL_ALIGN_INNER)
+                addSeparator()
+                addCurvedText("Red", Color.RED, marginTop = 16)
+                addCurvedText("Green", Color.GREEN, marginTop = 8, marginBottom = 8)
+                addCurvedText("Blue", Color.BLUE, marginBottom = 16)
+                addSeparator()
+                addCurvedText("RO", Color.RED, marginTop = 16, vAlign = VERTICAL_ALIGN_OUTER)
+                addCurvedText(
+                    "GO",
+                    Color.GREEN,
+                    marginTop = 8,
+                    marginBottom = 8,
+                    vAlign = VERTICAL_ALIGN_OUTER
+                )
+                addCurvedText("BO", Color.BLUE, marginBottom = 16, vAlign = VERTICAL_ALIGN_OUTER)
+                addSeparator()
+                addCurvedText("L", Color.WHITE, marginRight = 20)
+                addSeparator()
+                addCurvedText("C", Color.WHITE, marginRight = 10, marginLeft = 10)
+                addSeparator()
+                addCurvedText("R", Color.WHITE, marginLeft = 20)
+                addSeparator()
+            }
+
+    private fun createTwoArcsWithMargin() = listOf(
+        // First arc goes on top
+        createArcWithMargin(),
+
+        // Second arc in the bottom, and we change al children to go counterclockwise.
+        createArcWithMargin().apply {
+            anchorAngleDegrees = 180f
+            children.forEach {
+                (it as? CurvedTextView)?.isClockwise = false
+            }
+        }
+    )
+
+    @Test
+    fun testMargins() {
+        doOneTest("margin_test", createTwoArcsWithMargin())
+    }
+
+    @Test
+    fun testMarginsCcw() {
+        doOneTest(
+            "margin_ccw_test",
+            createTwoArcsWithMargin().map {
+                it.apply { isClockwise = false }
+            }
+        )
+    }
+
+    @Test
+    fun testInvisibleAndGone() {
+        doOneTest(
+            "inivisible_gone_test",
+            listOf(
+                ArcLayout(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        anchorType = ArcLayout.ANCHOR_CENTER
+                        addCurvedText("Initial", Color.RED, textSize = 30f)
+                        addInvisibleTextView()
+                        addCurvedText("Second", Color.GREEN, textSize = 30f)
+                        addGoneTextView()
+                        addCurvedText("Third", Color.BLUE, textSize = 30f)
+                        addSeparator()
+                        addCurvedText("Initial", Color.RED, textSize = 30f, clockwise = false)
+                        addInvisibleTextView()
+                        addCurvedText("Second", Color.GREEN, textSize = 30f, clockwise = false)
+                        addGoneTextView()
+                        addCurvedText("Third", Color.BLUE, textSize = 30f, clockwise = false)
+                    }
+            )
+        )
+    }
+
+    private fun createArcsWithPaddingAndMargins() = listOf(
+        ArcLayout(ApplicationProvider.getApplicationContext())
+            .apply {
+                anchorType = ArcLayout.ANCHOR_CENTER
+                listOf(VERTICAL_ALIGN_INNER, VERTICAL_ALIGN_CENTER, VERTICAL_ALIGN_OUTER).forEach {
+                    align ->
+                    addSeparator()
+                    addCurvedText("None", 0xFFFF0000.toInt(), vAlign = align)
+                    addSeparator(angle = 1f)
+                    addCurvedText("Pad", 0xFF80FF00.toInt(), padding = 8, vAlign = align)
+                    addSeparator(angle = 1f)
+                    addCurvedText("Mar", 0xFF00FFFF.toInt(), margin = 8, vAlign = align)
+                    addSeparator(angle = 1f)
+                    addCurvedText(
+                        "Both",
+                        0xFF8000FF.toInt(),
+                        padding = 8,
+                        margin = 8,
+                        vAlign = align
+                    )
+                }
+                addSeparator()
+            },
+        ArcLayout(ApplicationProvider.getApplicationContext())
+            .apply {
+                anchorType = ArcLayout.ANCHOR_CENTER
+                anchorAngleDegrees = 180f
+                addSeparator()
+                addCurvedText("Top", 0xFFFF0000.toInt(), paddingTop = 16)
+                addSeparator()
+                addCurvedText("Bottom", 0xFF80FF00.toInt(), paddingBottom = 16)
+                addSeparator()
+                addCurvedText("Left", 0xFF00FFFF.toInt(), paddingLeft = 16)
+                addSeparator()
+                addCurvedText("Right", 0xFF8000FF.toInt(), paddingRight = 16)
+                addSeparator()
+            }
+    )
+
+    @Test
+    fun testMarginsAndPadding() {
+        doOneTest(
+            "margin_padding_test",
+            createArcsWithPaddingAndMargins()
+        )
+    }
+
+    @Test
+    fun testMarginsAndPaddingCcw() {
+        doOneTest(
+            "margin_padding_ccw_test",
+            // For each WearArcLayout, change all WearCurvedTextView children to counter-clockwise
+            createArcsWithPaddingAndMargins().map {
+                it.apply {
+                    children.forEach { child ->
+                        (child as? CurvedTextView)?.let { cv -> cv.isClockwise = false }
+                    }
+                }
+            }
+        )
+    }
+
+    // Generates a click in the x,y coordinates in the view's coordinate system.
+    fun customClick(x: Float, y: Float) = ViewActions.actionWithAssertions(
+        GeneralClickAction(
+            Tap.SINGLE,
+            { view ->
+                val xy = IntArray(2)
+                view.getLocationOnScreen(xy)
+                floatArrayOf(x + xy[0], y + xy[1])
+            },
+            Press.PINPOINT,
+            InputDevice.SOURCE_UNKNOWN,
+            MotionEvent.BUTTON_PRIMARY
+        )
+    )
+
+    // Sending clicks is slow, around a quarter of a second each, on a desktop emulator.
+    @Test(timeout = 100000)
+    fun testTouchEvents() {
+        val bitmap = Bitmap.createBitmap(testWidth, testHeight, Bitmap.Config.ARGB_8888)
+        val canvas = Canvas(bitmap)
+        val scenario = ActivityScenario.launch(TouchTestActivity::class.java)
+
+        val STEP = 30
+
+        DrawableSurface.radius = 6f
+
+        // Find the main FrameLayout that contains all widgets under test.
+        val theView = Espresso.onView(withId(R.id.curved_frame))
+            .perform(
+                waitForMatchingView(
+                    allOf(
+                        withId(R.id.curved_frame),
+                        isDisplayed()
+                    ),
+                    2000
+                )
+            )
+
+        theView.perform(object : ViewAction {
+            override fun getConstraints(): Matcher<View> = any(View::class.java)
+            override fun getDescription(): String = "Resize view to fit the test."
+            override fun perform(uiController: UiController?, view: View?) {
+                (view as? FrameLayout)?.layoutParams =
+                    FrameLayout.LayoutParams(testWidth, testHeight)
+            }
+        })
+
+        // Setup on-click handlers for each view so we can get the index of the clicked view.
+        var clicked: Int
+        scenario.onActivity {
+            listOf(
+                R.id.curved_text1, R.id.curved_text2, R.id.curved_text3,
+                R.id.curved_text4, R.id.text5, R.id.curved_text6
+            ).mapIndexed { ix, viewId ->
+                it.findViewById<View>(viewId)?.setOnClickListener {
+                    clicked = ix
+                }
+            }
+        }
+
+        // Simulate clicks in a grid all over the screen and draw a circle centered in the
+        // position of the click and which color indicates the view that got clicked.
+        // Black means no view got the click event, white means a out of range value.
+        for (y in STEP / 2 until testHeight step STEP) {
+            val points = mutableListOf<ColoredPoint>()
+            for (x in STEP / 2 until testWidth step STEP) {
+                // Perform a click, and record a point colored according to which view was clicked.
+                clicked = -1
+                theView.perform(customClick(x.toFloat(), y.toFloat()))
+                points.add(
+                    ColoredPoint(
+                        x.toFloat(), y.toFloat(),
+                        // Color the circle.
+                        listOf(
+                            Color.BLACK, // no view got the event.
+                            Color.RED, Color.GREEN, Color.BLUE,
+                            Color.YELLOW, Color.MAGENTA, Color.CYAN
+                        ).elementAtOrNull(clicked + 1) ?: Color.WHITE
+                    )
+                )
+            }
+
+            // Add all circles on the current line to the DrawableSurface.
+            // Points are batched to improve performance a bit.
+            Espresso.onView(withId(R.id.drawable_surface)).perform(object : ViewAction {
+                override fun getConstraints(): Matcher<View> = any(View::class.java)
+                override fun getDescription(): String = "Add Points"
+                override fun perform(uiController: UiController?, view: View?) {
+                    (view as? DrawableSurface)?.addPoints(points)
+                }
+            })
+        }
+
+        // At the end, get a screenshot to compare against the golden
+        scenario.onActivity {
+            it.findViewById<View>(R.id.curved_frame).draw(canvas)
+        }
+        bitmap.assertAgainstGolden(screenshotRule, "touch_screenshot" + "_" + testHeight)
+    }
+
+    // This is not testing the full event journey as the previous method does, but it's faster so
+    // we can make more tests, and test more points in them.
+    private fun testEventsFast(key: String, testViews: List<View>) {
+        val context: Context = ApplicationProvider.getApplicationContext()
+
+        // We setup the "mouse event display" view (on top, with a semi-transparent background)
+        // and the views under test.
+        val drawableSurface = DrawableSurface(context)
+        drawableSurface.background = ColorDrawable(0x40000000.toInt())
+        val views = testViews + drawableSurface
+
+        // Setup the click handlers
+        var clicked: Int
+        var viewNumber = 0
+
+        // We need this function because we want each listener to capture it's view number by value,
+        // (and a reference to the clicked variable).
+        val onTouchListenerGenerator = { myNumber: Int ->
+            { _: View, _: MotionEvent ->
+                clicked = myNumber
+                true
+            }
+        }
+        views.forEach { view ->
+            (view as? ArcLayout)?.let { arcLayout ->
+                arcLayout.forEach { innerView ->
+                    if (innerView is TextView || innerView is CurvedTextView) {
+                        innerView.setOnTouchListener(onTouchListenerGenerator(viewNumber++))
+                    }
+                }
+            }
+        }
+
+        // Do the test, sending the events
+        var time = 0L
+        DrawableSurface.radius = 1.5f
+        doOneTest(
+            key, views,
+            backgroundColor = Color.rgb(0xFF, 0xFF, 0xC0)
+        ) {
+            val STEP = 4
+
+            // Simulate clicks in a grid all over the screen and draw a circle centered in the
+            // position of the click and which color indicates the view that got clicked.
+            // Black means no view got the click event, white means a out of range value.
+            for (y in STEP / 2 until testHeight step STEP) {
+                for (x in STEP / 2 until testWidth step STEP) {
+                    // Perform a click, and record a point colored according to which view was clicked.
+                    clicked = -1
+
+                    val down_event = MotionEvent.obtain(
+                        time, time, MotionEvent.ACTION_DOWN,
+                        x.toFloat(), y.toFloat(), 0
+                    )
+                    dispatchTouchEvent(down_event)
+
+                    val up_event = MotionEvent.obtain(
+                        time, time + 5, MotionEvent.ACTION_UP,
+                        x.toFloat(), y.toFloat(), 0
+                    )
+                    dispatchTouchEvent(up_event)
+
+                    time += 10
+
+                    drawableSurface.addPoints(
+                        listOf(
+                            ColoredPoint(
+                                x.toFloat(), y.toFloat(),
+                                // Color the circle.
+                                // We use Transparent for not touched and white for out of index
+                                testColors.elementAtOrNull(clicked + 1) ?: Color.WHITE
+                            )
+                        )
+                    )
+                }
+            }
+        }
+    }
+
+    @Test(timeout = 5000)
+    fun testBasicTouch() {
+        val context: Context = ApplicationProvider.getApplicationContext()
+        // This views are the same as the test testTouchEvents()
+        val views = listOf(
+            ArcLayout(context).apply {
+                anchorAngleDegrees = 0f
+                anchorType = ArcLayout.ANCHOR_CENTER
+                isClockwise = true
+                addCurvedText(
+                    "Left", color = 0x66FF0000, textSize = 48f, minSweep = 60f,
+                    textAlignment = View.TEXT_ALIGNMENT_TEXT_START
+                )
+                addGoneTextView()
+                addCurvedText(
+                    "Center", color = 0x6600FF00, textSize = 48f, minSweep = 60f,
+                    textAlignment = View.TEXT_ALIGNMENT_CENTER
+                )
+                addCurvedText(
+                    "Right", color = 0x660000FF, textSize = 48f, minSweep = 60f,
+                    textAlignment = View.TEXT_ALIGNMENT_TEXT_END
+                )
+                addGoneTextView()
+            },
+            ArcLayout(context).apply {
+                anchorAngleDegrees = 180f
+                anchorType = ArcLayout.ANCHOR_CENTER
+                isClockwise = true
+                addGoneTextView()
+                addCurvedText(
+                    "ACL", color = 0x66FFFF00, textSize = 48f, minSweep = 40f,
+                    textAlignment = View.TEXT_ALIGNMENT_TEXT_START
+                )
+                addTextView(text = "N-TXT", color = 0x66FF00FF, textSize = 20f)
+                addCurvedText(
+                    "ACR", color = 0x6600FFFF, textSize = 60f, minSweep = 50f,
+                    textAlignment = View.TEXT_ALIGNMENT_TEXT_END, clockwise = false
+                )
+            }
+        )
+        testEventsFast("touch_fast_screenshot", views)
+    }
+
+    @Test(timeout = 10000)
+    fun testMarginTouch() {
+        val views = createTwoArcsWithMargin()
+        testEventsFast("touch_fast_margin_screenshot", views)
+    }
+
+    companion object {
+        private const val SCREEN_SIZE_DEFAULT = 390
+        private const val SCREEN_SIZE_DIFF = 100
+        private const val TIMEOUT_MS = 1000L
+
+        @JvmStatic
+        @Parameterized.Parameters(name = "testHeight={0}")
+        fun initParameters() = listOf(
+            SCREEN_SIZE_DEFAULT,
+            SCREEN_SIZE_DEFAULT + SCREEN_SIZE_DIFF,
+            SCREEN_SIZE_DEFAULT - SCREEN_SIZE_DIFF
+        )
+    }
+}
+
+// Helper activity for testing touch.
+class TouchTestActivity : Activity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        setContentView(R.layout.wear_arc_layout_touch_test)
+    }
+}
+
+data class ColoredPoint(val x: Float, val y: Float, val c: Int)
+
+// Helper class to draw some point/circles of different colors. Used by the touch test.
+open class DrawableSurface @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : View(context, attrs, defStyleAttr) {
+    private var points = mutableListOf<ColoredPoint>()
+
+    override fun onDraw(canvas: Canvas) {
+        val paint = Paint().apply {
+            strokeWidth = radius / 2f
+            style = Paint.Style.STROKE
+            alpha = 0
+        }
+        points.forEach { p ->
+            paint.color = p.c
+            canvas.drawCircle(p.x, p.y, radius, paint)
+        }
+    }
+
+    fun addPoints(newPoints: Collection<ColoredPoint>) {
+        points.addAll(newPoints)
+        invalidate()
+    }
+
+    companion object {
+        var radius = 6f
+    }
+}
\ No newline at end of file
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/CurvedTextViewTest.kt b/wear/wear/src/androidTest/java/androidx/wear/widget/CurvedTextViewTest.kt
new file mode 100644
index 0000000..34cec3d
--- /dev/null
+++ b/wear/wear/src/androidTest/java/androidx/wear/widget/CurvedTextViewTest.kt
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.widget
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Typeface
+import android.text.TextUtils
+import android.view.View
+import android.view.View.MeasureSpec
+import android.widget.FrameLayout
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import androidx.test.screenshot.assertAgainstGolden
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class CurvedTextViewTest {
+
+    private val bitmap = Bitmap.createBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, Bitmap.Config.ARGB_8888)
+    private val canvas = Canvas(bitmap)
+    private val renderDoneLatch = CountDownLatch(1)
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule("wear/wear")
+
+    private fun doOneTest(key: String, views: List<View>) {
+        // Set the main frame.
+        val mainFrame = FrameLayout(ApplicationProvider.getApplicationContext())
+        mainFrame.setBackgroundColor(Color.GRAY)
+
+        for (view in views) {
+            mainFrame.addView(view)
+        }
+        val screenWidth = MeasureSpec.makeMeasureSpec(SCREEN_WIDTH, MeasureSpec.EXACTLY)
+        val screenHeight = MeasureSpec.makeMeasureSpec(SCREEN_HEIGHT, MeasureSpec.EXACTLY)
+        mainFrame.measure(screenWidth, screenHeight)
+        mainFrame.layout(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)
+        mainFrame.draw(canvas)
+        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
+        bitmap.assertAgainstGolden(screenshotRule, key)
+    }
+
+    private fun createThree(centerStr: String, leftStr: String, rightStr: String) = listOf(
+        CurvedTextView(ApplicationProvider.getApplicationContext())
+            .apply {
+                text = centerStr
+                textColor = Color.BLUE
+                setBackgroundColor(Color.rgb(100, 100, 0))
+                anchorType = ArcLayout.ANCHOR_CENTER
+                anchorAngleDegrees = 0f
+            },
+        CurvedTextView(ApplicationProvider.getApplicationContext())
+            .apply {
+                text = leftStr
+                textColor = Color.RED
+                setBackgroundColor(Color.rgb(0, 100, 100))
+                anchorAngleDegrees = 240f
+                anchorType = ArcLayout.ANCHOR_START
+            },
+        CurvedTextView(ApplicationProvider.getApplicationContext())
+            .apply {
+                text = rightStr
+                textColor = Color.GREEN
+                setBackgroundColor(Color.rgb(100, 0, 100))
+                anchorType = ArcLayout.ANCHOR_END
+                anchorAngleDegrees = 120f
+            }
+    )
+
+    private fun createThree(): List<CurvedTextView> =
+        createThree("Center", "Left", "Right")
+
+    @Test
+    @Throws(Exception::class)
+    fun testDefaults() {
+        val textView =
+            CurvedTextView(ApplicationProvider.getApplicationContext())
+        textView.text = "Hello World!"
+        doOneTest("hello_world_screenshot", listOf(textView))
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testAnchor() {
+        doOneTest("anchors_screenshot", createThree())
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testMaxSweepDegree() {
+        doOneTest(
+            "max_sweep_degree_screenshot",
+            createThree(
+                "center long string",
+                "left string",
+                "right"
+            ).apply {
+                forEach {
+                    it.setSweepRangeDegrees(0f, 55f)
+                    it.ellipsize = TextUtils.TruncateAt.END
+                }
+            }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testMinSweepDegree() {
+        doOneTest(
+            "min_sweep_degree_screenshot",
+            createThree(
+                "center long string",
+                "left string",
+                "right"
+            ).apply {
+                forEach {
+                    it.setSweepRangeDegrees(55f, 360f)
+                    it.ellipsize = TextUtils.TruncateAt.END
+                }
+            }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun tesSweepDegree() {
+        doOneTest(
+            "sweep_degree_screenshot",
+            createThree(
+                "center long string",
+                "left string",
+                "right"
+            ).apply {
+                forEachIndexed { ix, v ->
+                    v.setSweepRangeDegrees(50f, 60f)
+                    v.ellipsize = TextUtils.TruncateAt.END
+                    v.textAlignment = listOf(
+                        View.TEXT_ALIGNMENT_CENTER,
+                        View.TEXT_ALIGNMENT_TEXT_START,
+                        View.TEXT_ALIGNMENT_TEXT_END
+                    )[ix]
+                }
+            }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testCounterClockwise() {
+        doOneTest(
+            "counter_clockwise_screenshot",
+            createThree().apply { forEach { it.isClockwise = false } }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testTextSize() {
+        doOneTest(
+            "text_size_screenshot",
+            createThree().apply {
+                forEachIndexed { ix, it -> it.textSize = 20f + ix * 4f }
+            }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testEllipsize() {
+        doOneTest(
+            "ellipsize_screenshot",
+            (
+                createThree() zip
+                    listOf(
+                        TextUtils.TruncateAt.START,
+                        TextUtils.TruncateAt.MIDDLE,
+                        TextUtils.TruncateAt.END
+                    )
+                )
+                .map
+                { (v, e) ->
+                    v.ellipsize = e
+                    v.setSweepRangeDegrees(0f, 50f)
+                    v.text += " but Longer"
+                    v
+                }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testPadding() {
+        doOneTest(
+            "padding_screenshot",
+            createThree().apply {
+                forEachIndexed { ix, it ->
+                    it.setPadding(
+                        ix * 10, ((ix + 1) % 4) * 10,
+                        ((ix + 2) % 4) * 10, ((ix + 3) % 4) * 10
+                    )
+                }
+            }
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testClockwiseTextBackground() {
+        doOneTest(
+            "cw_text_background_screenshot",
+            listOf(
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "This is a clockwise text for testing background"
+                        isClockwise = true
+                        anchorAngleDegrees = 170.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setBackgroundColor(Color.rgb(0, 100, 100))
+                    },
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "Another clockwise text"
+                        isClockwise = true
+                        anchorAngleDegrees = 70.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setBackgroundColor(Color.rgb(0, 100, 100))
+                    }
+            )
+        )
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun testCounterClockwiseTextBackground() {
+        doOneTest(
+            "ccw_text_background_screenshot",
+            listOf(
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "This is a counterclockwise text for testing background"
+                        isClockwise = false
+                        anchorAngleDegrees = 100.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setBackgroundColor(Color.rgb(0, 100, 100))
+                    },
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "Another counterclockwise text"
+                        isClockwise = false
+                        anchorAngleDegrees = 230.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setBackgroundColor(Color.rgb(0, 100, 100))
+                    }
+            )
+        )
+    }
+
+    @Test
+    fun testStyles() {
+        doOneTest(
+            "styles_test",
+            listOf(
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "Bold"
+                        anchorAngleDegrees = 0.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setTypeface(null, Typeface.BOLD)
+                    },
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "Italic"
+                        anchorAngleDegrees = 60.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setTypeface(null, Typeface.ITALIC)
+                    },
+                CurvedTextView(ApplicationProvider.getApplicationContext())
+                    .apply {
+                        text = "ItalicBold"
+                        anchorAngleDegrees = 120.0f
+                        anchorType = ArcLayout.ANCHOR_START
+                        setTypeface(null, Typeface.BOLD_ITALIC)
+                    },
+            )
+        )
+    }
+
+    companion object {
+        private const val SCREEN_WIDTH = 390
+        private const val SCREEN_HEIGHT = 390
+        private const val TIMEOUT_MS = 1000L
+    }
+}
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/WearArcLayoutTest.kt b/wear/wear/src/androidTest/java/androidx/wear/widget/WearArcLayoutTest.kt
deleted file mode 100644
index f55d325..0000000
--- a/wear/wear/src/androidTest/java/androidx/wear/widget/WearArcLayoutTest.kt
+++ /dev/null
@@ -1,770 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.widget
-
-import android.app.Activity
-import android.content.Context
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.graphics.Paint
-import android.graphics.drawable.ColorDrawable
-import android.os.Bundle
-import android.util.AttributeSet
-import android.view.InputDevice
-import android.view.MotionEvent
-import android.view.View
-import android.view.View.MeasureSpec
-import android.view.ViewGroup
-import android.widget.FrameLayout
-import android.widget.TextView
-import androidx.core.view.children
-import androidx.core.view.forEach
-import androidx.test.core.app.ActivityScenario
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.espresso.Espresso
-import androidx.test.espresso.UiController
-import androidx.test.espresso.ViewAction
-import androidx.test.espresso.action.GeneralClickAction
-import androidx.test.espresso.action.Press
-import androidx.test.espresso.action.Tap
-import androidx.test.espresso.action.ViewActions
-import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
-import androidx.test.espresso.matcher.ViewMatchers.withId
-import androidx.test.filters.MediumTest
-import androidx.test.screenshot.AndroidXScreenshotTestRule
-import androidx.test.screenshot.assertAgainstGolden
-import androidx.wear.test.R
-import androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_CENTER
-import androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_INNER
-import androidx.wear.widget.WearArcLayout.LayoutParams.VALIGN_OUTER
-import androidx.wear.widget.util.AsyncViewActions.waitForMatchingView
-import org.hamcrest.CoreMatchers.allOf
-import org.hamcrest.CoreMatchers.any
-import org.hamcrest.Matcher
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-
-@RunWith(Parameterized::class)
-@MediumTest
-class WearArcLayoutTest(private val testHeight: Int) {
-    private val testWidth: Int = SCREEN_SIZE_DEFAULT
-    private val renderDoneLatch = CountDownLatch(1)
-
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule("wear/wear")
-
-    private fun doOneTest(
-        key: String,
-        views: List<View>,
-        backgroundColor: Int = Color.GRAY,
-        interactiveFunction: (FrameLayout.() -> Unit)? = null
-
-    ) {
-        val bitmap = Bitmap.createBitmap(testWidth, testHeight, Bitmap.Config.ARGB_8888)
-        val canvas = Canvas(bitmap)
-
-        // Set the main frame.
-        val mainFrame = FrameLayout(ApplicationProvider.getApplicationContext())
-        mainFrame.setBackgroundColor(backgroundColor)
-
-        for (view in views) {
-            mainFrame.addView(view)
-        }
-        val screenWidth = MeasureSpec.makeMeasureSpec(testWidth, MeasureSpec.EXACTLY)
-        val screenHeight = MeasureSpec.makeMeasureSpec(testHeight, MeasureSpec.EXACTLY)
-        mainFrame.measure(screenWidth, screenHeight)
-        mainFrame.layout(0, 0, testWidth, testHeight)
-        mainFrame.draw(canvas)
-        // If an interactive function is set, call it now and redraw.
-        // The function will generate mouse events and then we draw again to see the result
-        // displayed on the views (the test records and shows mouse events in the view)
-        interactiveFunction?.let {
-            it(mainFrame)
-            mainFrame.draw(canvas)
-        }
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
-        bitmap.assertAgainstGolden(screenshotRule, key + "_" + testHeight)
-    }
-
-    private fun createArc(text1: String = "SWEEP", text2: String = "Default") =
-        WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = text1
-                    textColor = Color.BLUE
-                    setBackgroundColor(Color.rgb(100, 100, 0))
-                    minSweepDegrees = 45f
-                }
-            )
-            addView(
-                TextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "TXT"
-                    setTextColor(Color.GREEN)
-                    layoutParams =
-                        WearArcLayout.LayoutParams(
-                            ViewGroup.LayoutParams.WRAP_CONTENT,
-                            ViewGroup.LayoutParams.WRAP_CONTENT
-                        )
-                }
-            )
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = text2
-                    textColor = Color.RED
-                    setBackgroundColor(Color.rgb(0, 100, 100))
-                }
-            )
-        }
-
-    private fun createMixedArc() =
-        WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "One"
-                    setBackgroundColor(Color.rgb(100, 100, 100))
-                    maxSweepDegrees = 20f
-                    clockwise = true
-                }
-            )
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "Two"
-                    setBackgroundColor(Color.rgb(150, 150, 150))
-                    maxSweepDegrees = 20f
-                    clockwise = false
-                }
-            )
-            addView(
-                TextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "TXT"
-                    setTextColor(Color.GREEN)
-                    layoutParams =
-                        WearArcLayout.LayoutParams(
-                            ViewGroup.LayoutParams.WRAP_CONTENT,
-                            ViewGroup.LayoutParams.WRAP_CONTENT
-                        ).apply { rotate = false }
-                }
-            )
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "Three"
-                    setBackgroundColor(Color.rgb(100, 100, 100))
-                    maxSweepDegrees = 20f
-                    clockwise = true
-                }
-            )
-            addView(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "Four"
-                    setBackgroundColor(Color.rgb(150, 150, 150))
-                    maxSweepDegrees = 20f
-                    clockwise = false
-                }
-            )
-        }
-
-    @Test
-    @Throws(Exception::class)
-    fun testArcs() {
-        doOneTest(
-            "basic_arcs_screenshot",
-            listOf(
-                createArc(),
-                createArc("SWEEP", "Start").apply {
-                    anchorAngleDegrees = 90f
-                    anchorType = WearArcLayout.ANCHOR_START
-                },
-                createArc("SWEEP", "End").apply {
-                    anchorAngleDegrees = 270f
-                    anchorType = WearArcLayout.ANCHOR_END
-                },
-                createArc("SWEEP", "Center").apply {
-                    anchorAngleDegrees = 315f
-                    anchorType = WearArcLayout.ANCHOR_CENTER
-                }
-            )
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testArcsCcw() {
-        doOneTest(
-            "basic_arcs_ccw_screenshot",
-            listOf(
-                createArc(),
-                createArc("SWEEP", "Start").apply {
-                    anchorAngleDegrees = 270f
-                    anchorType = WearArcLayout.ANCHOR_START
-                },
-                createArc("SWEEP", "End").apply {
-                    anchorAngleDegrees = 90f
-                    anchorType = WearArcLayout.ANCHOR_END
-                },
-                createArc("SWEEP", "Center").apply {
-                    anchorAngleDegrees = 45f
-                    anchorType = WearArcLayout.ANCHOR_CENTER
-                }
-            ).apply { forEach { it.clockwise = false } }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testArcsMixed() {
-        doOneTest(
-            "basic_arcs_mix_screenshot",
-            listOf(
-                createMixedArc(),
-                createMixedArc().apply {
-                    clockwise = false
-                }
-            )
-        )
-    }
-
-    // We keep track of the color of added widgets, to use on touch tests.
-    // We should try to avoid using white since it have special meaning.
-    var colorProcessor: (Int) -> Int = { color ->
-        when (color) {
-            Color.WHITE -> 0xFFCCCCCC.toInt()
-            else -> color or 0xFF000000.toInt()
-        }
-    }
-    var testColors = mutableListOf<Int>()
-
-    @Before
-    fun setup() {
-        testColors = mutableListOf(0) // Used when no view got the event
-    }
-
-    // Extension functions to make the margin test more readable.
-    fun WearArcLayout.addSeparator(angle: Float = 10f) {
-        addView(
-            WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                text = " "
-                minSweepDegrees = angle
-                setBackgroundColor(Color.rgb(100, 100, 100))
-                clockwise = true
-                textSize = 40f
-            }
-        )
-        testColors.add(colorProcessor(Color.rgb(150, 150, 150)))
-    }
-
-    fun WearArcLayout.addCurvedText(
-        text: String,
-        color: Int,
-        marginLeft: Int? = null,
-        marginTop: Int? = null,
-        marginRight: Int? = null,
-        marginBottom: Int? = null,
-        margin: Int? = null,
-        paddingLeft: Int? = null,
-        paddingTop: Int? = null,
-        paddingRight: Int? = null,
-        paddingBottom: Int? = null,
-        padding: Int? = null,
-        vAlign: Int = VALIGN_CENTER,
-        clockwise: Boolean = true,
-        textSize: Float = 14f,
-        textAlignment: Int = View.TEXT_ALIGNMENT_TEXT_START,
-        minSweep: Float = 0f
-    ) {
-        addView(
-            WearCurvedTextView(ApplicationProvider.getApplicationContext()).also {
-                it.text = text
-                it.setBackgroundColor(color)
-                it.clockwise = clockwise
-                it.textSize = textSize
-                it.textAlignment = textAlignment
-                it.minSweepDegrees = minSweep
-                it.setPadding(
-                    paddingLeft ?: padding ?: 0,
-                    paddingTop ?: padding ?: 0,
-                    paddingRight ?: padding ?: 0,
-                    paddingBottom ?: padding ?: 0
-                )
-                it.layoutParams = WearArcLayout.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT
-                ).apply {
-                    setMargins(
-                        marginLeft ?: margin ?: 0,
-                        marginTop ?: margin ?: 0,
-                        marginRight ?: margin ?: 0,
-                        marginBottom ?: margin ?: 0
-                    )
-                    verticalAlignment = vAlign
-                }
-            }
-        )
-        testColors.add(colorProcessor(color))
-    }
-
-    fun WearArcLayout.addTextView(
-        text: String,
-        color: Int,
-        textSize: Float = 14f
-    ) {
-        addView(
-            TextView(context).also {
-                it.text = text
-                it.background = ColorDrawable(color)
-                it.textSize = textSize
-            }
-        )
-        testColors.add(colorProcessor(color))
-    }
-
-    fun WearArcLayout.addInvisibleTextView() {
-        addView(
-            TextView(context).also {
-                it.text = "Invisible"
-                it.visibility = View.INVISIBLE
-            }
-        )
-        testColors.add(0xFF13579B.toInt())
-    }
-
-    fun WearArcLayout.addGoneTextView() {
-        addView(
-            TextView(context).also {
-                it.text = "Gone"
-                it.visibility = View.GONE
-            }
-        )
-        testColors.add(0xFF13579B.toInt())
-    }
-
-    private fun createArcWithMargin() =
-        WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-            anchorType = WearArcLayout.ANCHOR_CENTER
-            addSeparator()
-            addCurvedText("RI", Color.RED, marginTop = 16, vAlign = VALIGN_INNER)
-            addCurvedText("GI", Color.GREEN, marginTop = 8, marginBottom = 8, vAlign = VALIGN_INNER)
-            addCurvedText("BI", Color.BLUE, marginBottom = 16, vAlign = VALIGN_INNER)
-            addSeparator()
-            addCurvedText("Red", Color.RED, marginTop = 16)
-            addCurvedText("Green", Color.GREEN, marginTop = 8, marginBottom = 8)
-            addCurvedText("Blue", Color.BLUE, marginBottom = 16)
-            addSeparator()
-            addCurvedText("RO", Color.RED, marginTop = 16, vAlign = VALIGN_OUTER)
-            addCurvedText("GO", Color.GREEN, marginTop = 8, marginBottom = 8, vAlign = VALIGN_OUTER)
-            addCurvedText("BO", Color.BLUE, marginBottom = 16, vAlign = VALIGN_OUTER)
-            addSeparator()
-            addCurvedText("L", Color.WHITE, marginRight = 20)
-            addSeparator()
-            addCurvedText("C", Color.WHITE, marginRight = 10, marginLeft = 10)
-            addSeparator()
-            addCurvedText("R", Color.WHITE, marginLeft = 20)
-            addSeparator()
-        }
-
-    private fun createTwoArcsWithMargin() = listOf(
-        // First arc goes on top
-        createArcWithMargin(),
-
-        // Second arc in the bottom, and we change al children to go counterclockwise.
-        createArcWithMargin().apply {
-            anchorAngleDegrees = 180f
-            children.forEach {
-                (it as? WearCurvedTextView)?.clockwise = false
-            }
-        }
-    )
-
-    @Test
-    fun testMargins() {
-        doOneTest("margin_test", createTwoArcsWithMargin())
-    }
-
-    @Test
-    fun testMarginsCcw() {
-        doOneTest(
-            "margin_ccw_test",
-            createTwoArcsWithMargin().map {
-                it.apply { clockwise = false }
-            }
-        )
-    }
-
-    @Test
-    fun testInvisibleAndGone() {
-        doOneTest(
-            "inivisible_gone_test",
-            listOf(
-                WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-                    anchorType = WearArcLayout.ANCHOR_CENTER
-                    addCurvedText("Initial", Color.RED, textSize = 30f)
-                    addInvisibleTextView()
-                    addCurvedText("Second", Color.GREEN, textSize = 30f)
-                    addGoneTextView()
-                    addCurvedText("Third", Color.BLUE, textSize = 30f)
-                    addSeparator()
-                    addCurvedText("Initial", Color.RED, textSize = 30f, clockwise = false)
-                    addInvisibleTextView()
-                    addCurvedText("Second", Color.GREEN, textSize = 30f, clockwise = false)
-                    addGoneTextView()
-                    addCurvedText("Third", Color.BLUE, textSize = 30f, clockwise = false)
-                }
-            )
-        )
-    }
-
-    private fun createArcsWithPaddingAndMargins() = listOf(
-        WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-            anchorType = WearArcLayout.ANCHOR_CENTER
-            listOf(VALIGN_INNER, VALIGN_CENTER, VALIGN_OUTER).forEach { align ->
-                addSeparator()
-                addCurvedText("None", 0xFFFF0000.toInt(), vAlign = align)
-                addSeparator(angle = 1f)
-                addCurvedText("Pad", 0xFF80FF00.toInt(), padding = 8, vAlign = align)
-                addSeparator(angle = 1f)
-                addCurvedText("Mar", 0xFF00FFFF.toInt(), margin = 8, vAlign = align)
-                addSeparator(angle = 1f)
-                addCurvedText("Both", 0xFF8000FF.toInt(), padding = 8, margin = 8, vAlign = align)
-            }
-            addSeparator()
-        },
-        WearArcLayout(ApplicationProvider.getApplicationContext()).apply {
-            anchorType = WearArcLayout.ANCHOR_CENTER
-            anchorAngleDegrees = 180f
-            addSeparator()
-            addCurvedText("Top", 0xFFFF0000.toInt(), paddingTop = 16)
-            addSeparator()
-            addCurvedText("Bottom", 0xFF80FF00.toInt(), paddingBottom = 16)
-            addSeparator()
-            addCurvedText("Left", 0xFF00FFFF.toInt(), paddingLeft = 16)
-            addSeparator()
-            addCurvedText("Right", 0xFF8000FF.toInt(), paddingRight = 16)
-            addSeparator()
-        }
-    )
-
-    @Test
-    fun testMarginsAndPadding() {
-        doOneTest(
-            "margin_padding_test",
-            createArcsWithPaddingAndMargins()
-        )
-    }
-
-    @Test
-    fun testMarginsAndPaddingCcw() {
-        doOneTest(
-            "margin_padding_ccw_test",
-            // For each WearArcLayout, change all WearCurvedTextView children to counter-clockwise
-            createArcsWithPaddingAndMargins().map {
-                it.apply {
-                    children.forEach { child ->
-                        (child as? WearCurvedTextView)?.let { cv -> cv.clockwise = false }
-                    }
-                }
-            }
-        )
-    }
-
-    // Generates a click in the x,y coordinates in the view's coordinate system.
-    fun customClick(x: Float, y: Float) = ViewActions.actionWithAssertions(
-        GeneralClickAction(
-            Tap.SINGLE,
-            { view ->
-                val xy = IntArray(2)
-                view.getLocationOnScreen(xy)
-                floatArrayOf(x + xy[0], y + xy[1])
-            },
-            Press.PINPOINT,
-            InputDevice.SOURCE_UNKNOWN,
-            MotionEvent.BUTTON_PRIMARY
-        )
-    )
-
-    // Sending clicks is slow, around a quarter of a second each, on a desktop emulator.
-    @Test(timeout = 100000)
-    fun testTouchEvents() {
-        val bitmap = Bitmap.createBitmap(testWidth, testHeight, Bitmap.Config.ARGB_8888)
-        val canvas = Canvas(bitmap)
-        val scenario = ActivityScenario.launch(TouchTestActivity::class.java)
-
-        val STEP = 30
-
-        DrawableSurface.radius = 6f
-
-        // Find the main FrameLayout that contains all widgets under test.
-        val theView = Espresso.onView(withId(R.id.curved_frame))
-            .perform(
-                waitForMatchingView(
-                    allOf(
-                        withId(R.id.curved_frame),
-                        isDisplayed()
-                    ),
-                    2000
-                )
-            )
-
-        theView.perform(object : ViewAction {
-            override fun getConstraints(): Matcher<View> = any(View::class.java)
-            override fun getDescription(): String = "Resize view to fit the test."
-            override fun perform(uiController: UiController?, view: View?) {
-                (view as? FrameLayout)?.layoutParams =
-                    FrameLayout.LayoutParams(testWidth, testHeight)
-            }
-        })
-
-        // Setup on-click handlers for each view so we can get the index of the clicked view.
-        var clicked: Int
-        scenario.onActivity {
-            listOf(
-                R.id.curved_text1, R.id.curved_text2, R.id.curved_text3,
-                R.id.curved_text4, R.id.text5, R.id.curved_text6
-            ).mapIndexed { ix, viewId ->
-                it.findViewById<View>(viewId)?.setOnClickListener {
-                    clicked = ix
-                }
-            }
-        }
-
-        // Simulate clicks in a grid all over the screen and draw a circle centered in the
-        // position of the click and which color indicates the view that got clicked.
-        // Black means no view got the click event, white means a out of range value.
-        for (y in STEP / 2 until testHeight step STEP) {
-            val points = mutableListOf<ColoredPoint>()
-            for (x in STEP / 2 until testWidth step STEP) {
-                // Perform a click, and record a point colored according to which view was clicked.
-                clicked = -1
-                theView.perform(customClick(x.toFloat(), y.toFloat()))
-                points.add(
-                    ColoredPoint(
-                        x.toFloat(), y.toFloat(),
-                        // Color the circle.
-                        listOf(
-                            Color.BLACK, // no view got the event.
-                            Color.RED, Color.GREEN, Color.BLUE,
-                            Color.YELLOW, Color.MAGENTA, Color.CYAN
-                        ).elementAtOrNull(clicked + 1) ?: Color.WHITE
-                    )
-                )
-            }
-
-            // Add all circles on the current line to the DrawableSurface.
-            // Points are batched to improve performance a bit.
-            Espresso.onView(withId(R.id.drawable_surface)).perform(object : ViewAction {
-                override fun getConstraints(): Matcher<View> = any(View::class.java)
-                override fun getDescription(): String = "Add Points"
-                override fun perform(uiController: UiController?, view: View?) {
-                    (view as? DrawableSurface)?.addPoints(points)
-                }
-            })
-        }
-
-        // At the end, get a screenshot to compare against the golden
-        scenario.onActivity {
-            it.findViewById<View>(R.id.curved_frame).draw(canvas)
-        }
-        bitmap.assertAgainstGolden(screenshotRule, "touch_screenshot" + "_" + testHeight)
-    }
-
-    // This is not testing the full event journey as the previous method does, but it's faster so
-    // we can make more tests, and test more points in them.
-    private fun testEventsFast(key: String, testViews: List<View>) {
-        val context: Context = ApplicationProvider.getApplicationContext()
-
-        // We setup the "mouse event display" view (on top, with a semi-transparent background)
-        // and the views under test.
-        val drawableSurface = DrawableSurface(context)
-        drawableSurface.background = ColorDrawable(0x40000000.toInt())
-        val views = testViews + drawableSurface
-
-        // Setup the click handlers
-        var clicked: Int
-        var viewNumber = 0
-
-        // We need this function because we want each listener to capture it's view number by value,
-        // (and a reference to the clicked variable).
-        val onTouchListenerGenerator = { myNumber: Int ->
-            { _: View, _: MotionEvent ->
-                clicked = myNumber
-                true
-            }
-        }
-        views.forEach { view ->
-            (view as? WearArcLayout)?.let { arcLayout ->
-                arcLayout.forEach { innerView ->
-                    if (innerView is TextView || innerView is WearCurvedTextView) {
-                        innerView.setOnTouchListener(onTouchListenerGenerator(viewNumber++))
-                    }
-                }
-            }
-        }
-
-        // Do the test, sending the events
-        var time = 0L
-        DrawableSurface.radius = 1.5f
-        doOneTest(
-            key, views,
-            backgroundColor = Color.rgb(0xFF, 0xFF, 0xC0)
-        ) {
-            val STEP = 4
-
-            // Simulate clicks in a grid all over the screen and draw a circle centered in the
-            // position of the click and which color indicates the view that got clicked.
-            // Black means no view got the click event, white means a out of range value.
-            for (y in STEP / 2 until testHeight step STEP) {
-                for (x in STEP / 2 until testWidth step STEP) {
-                    // Perform a click, and record a point colored according to which view was clicked.
-                    clicked = -1
-
-                    val down_event = MotionEvent.obtain(
-                        time, time, MotionEvent.ACTION_DOWN,
-                        x.toFloat(), y.toFloat(), 0
-                    )
-                    dispatchTouchEvent(down_event)
-
-                    val up_event = MotionEvent.obtain(
-                        time, time + 5, MotionEvent.ACTION_UP,
-                        x.toFloat(), y.toFloat(), 0
-                    )
-                    dispatchTouchEvent(up_event)
-
-                    time += 10
-
-                    drawableSurface.addPoints(
-                        listOf(
-                            ColoredPoint(
-                                x.toFloat(), y.toFloat(),
-                                // Color the circle.
-                                // We use Transparent for not touched and white for out of index
-                                testColors.elementAtOrNull(clicked + 1) ?: Color.WHITE
-                            )
-                        )
-                    )
-                }
-            }
-        }
-    }
-
-    @Test(timeout = 5000)
-    fun testBasicTouch() {
-        val context: Context = ApplicationProvider.getApplicationContext()
-        // This views are the same as the test testTouchEvents()
-        val views = listOf(
-            WearArcLayout(context).apply {
-                anchorAngleDegrees = 0f
-                anchorType = WearArcLayout.ANCHOR_CENTER
-                clockwise = true
-                addCurvedText(
-                    "Left", color = 0x66FF0000, textSize = 48f, minSweep = 60f,
-                    textAlignment = View.TEXT_ALIGNMENT_TEXT_START
-                )
-                addGoneTextView()
-                addCurvedText(
-                    "Center", color = 0x6600FF00, textSize = 48f, minSweep = 60f,
-                    textAlignment = View.TEXT_ALIGNMENT_CENTER
-                )
-                addCurvedText(
-                    "Right", color = 0x660000FF, textSize = 48f, minSweep = 60f,
-                    textAlignment = View.TEXT_ALIGNMENT_TEXT_END
-                )
-                addGoneTextView()
-            },
-            WearArcLayout(context).apply {
-                anchorAngleDegrees = 180f
-                anchorType = WearArcLayout.ANCHOR_CENTER
-                clockwise = true
-                addGoneTextView()
-                addCurvedText(
-                    "ACL", color = 0x66FFFF00, textSize = 48f, minSweep = 40f,
-                    textAlignment = View.TEXT_ALIGNMENT_TEXT_START
-                )
-                addTextView(text = "N-TXT", color = 0x66FF00FF, textSize = 20f)
-                addCurvedText(
-                    "ACR", color = 0x6600FFFF, textSize = 60f, minSweep = 50f,
-                    textAlignment = View.TEXT_ALIGNMENT_TEXT_END, clockwise = false
-                )
-            }
-        )
-        testEventsFast("touch_fast_screenshot", views)
-    }
-
-    @Test(timeout = 10000)
-    fun testMarginTouch() {
-        val views = createTwoArcsWithMargin()
-        testEventsFast("touch_fast_margin_screenshot", views)
-    }
-
-    companion object {
-        private const val SCREEN_SIZE_DEFAULT = 390
-        private const val SCREEN_SIZE_DIFF = 100
-        private const val TIMEOUT_MS = 1000L
-
-        @JvmStatic
-        @Parameterized.Parameters(name = "testHeight={0}")
-        fun initParameters() = listOf(
-            SCREEN_SIZE_DEFAULT,
-            SCREEN_SIZE_DEFAULT + SCREEN_SIZE_DIFF,
-            SCREEN_SIZE_DEFAULT - SCREEN_SIZE_DIFF
-        )
-    }
-}
-
-// Helper activity for testing touch.
-class TouchTestActivity : Activity() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        setContentView(R.layout.wear_arc_layout_touch_test)
-    }
-}
-
-data class ColoredPoint(val x: Float, val y: Float, val c: Int)
-
-// Helper class to draw some point/circles of different colors. Used by the touch test.
-open class DrawableSurface @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0
-) : View(context, attrs, defStyleAttr) {
-    private var points = mutableListOf<ColoredPoint>()
-
-    override fun onDraw(canvas: Canvas) {
-        val paint = Paint().apply {
-            strokeWidth = radius / 2f
-            style = Paint.Style.STROKE
-            alpha = 0
-        }
-        points.forEach { p ->
-            paint.color = p.c
-            canvas.drawCircle(p.x, p.y, radius, paint)
-        }
-    }
-
-    fun addPoints(newPoints: Collection<ColoredPoint>) {
-        points.addAll(newPoints)
-        invalidate()
-    }
-
-    companion object {
-        var radius = 6f
-    }
-}
\ No newline at end of file
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/WearCurvedTextViewTest.kt b/wear/wear/src/androidTest/java/androidx/wear/widget/WearCurvedTextViewTest.kt
deleted file mode 100644
index c09c06a..0000000
--- a/wear/wear/src/androidTest/java/androidx/wear/widget/WearCurvedTextViewTest.kt
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.widget
-
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.text.TextUtils
-import android.view.View
-import android.view.View.MeasureSpec
-import android.widget.FrameLayout
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
-import androidx.test.screenshot.AndroidXScreenshotTestRule
-import androidx.test.screenshot.assertAgainstGolden
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-
-@RunWith(AndroidJUnit4::class)
-@MediumTest
-class WearCurvedTextViewTest {
-
-    private val bitmap = Bitmap.createBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, Bitmap.Config.ARGB_8888)
-    private val canvas = Canvas(bitmap)
-    private val renderDoneLatch = CountDownLatch(1)
-
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule("wear/wear")
-
-    private fun doOneTest(key: String, views: List<View>) {
-        // Set the main frame.
-        val mainFrame = FrameLayout(ApplicationProvider.getApplicationContext())
-        mainFrame.setBackgroundColor(Color.GRAY)
-
-        for (view in views) {
-            mainFrame.addView(view)
-        }
-        val screenWidth = MeasureSpec.makeMeasureSpec(SCREEN_WIDTH, MeasureSpec.EXACTLY)
-        val screenHeight = MeasureSpec.makeMeasureSpec(SCREEN_HEIGHT, MeasureSpec.EXACTLY)
-        mainFrame.measure(screenWidth, screenHeight)
-        mainFrame.layout(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)
-        mainFrame.draw(canvas)
-        renderDoneLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)
-        bitmap.assertAgainstGolden(screenshotRule, key)
-    }
-
-    private fun createThree(centerStr: String, leftStr: String, rightStr: String) = listOf(
-        WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-            text = centerStr
-            textColor = Color.BLUE
-            setBackgroundColor(Color.rgb(100, 100, 0))
-            anchorType = WearArcLayout.ANCHOR_CENTER
-            anchorAngleDegrees = 0f
-        },
-        WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-            text = leftStr
-            textColor = Color.RED
-            setBackgroundColor(Color.rgb(0, 100, 100))
-            anchorAngleDegrees = 240f
-            anchorType = WearArcLayout.ANCHOR_START
-        },
-        WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-            text = rightStr
-            textColor = Color.GREEN
-            setBackgroundColor(Color.rgb(100, 0, 100))
-            anchorType = WearArcLayout.ANCHOR_END
-            anchorAngleDegrees = 120f
-        }
-    )
-
-    private fun createThree(): List<WearCurvedTextView> =
-        createThree("Center", "Left", "Right")
-
-    @Test
-    @Throws(Exception::class)
-    fun testDefaults() {
-        val textView = WearCurvedTextView(ApplicationProvider.getApplicationContext())
-        textView.text = "Hello World!"
-        doOneTest("hello_world_screenshot", listOf(textView))
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testAnchor() {
-        doOneTest("anchors_screenshot", createThree())
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testMaxSweepDegree() {
-        doOneTest(
-            "max_sweep_degree_screenshot",
-            createThree(
-                "center long string",
-                "left string",
-                "right"
-            ).apply {
-                forEach {
-                    it.maxSweepDegrees = 55f
-                    it.ellipsize = TextUtils.TruncateAt.END
-                }
-            }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testMinSweepDegree() {
-        doOneTest(
-            "min_sweep_degree_screenshot",
-            createThree(
-                "center long string",
-                "left string",
-                "right"
-            ).apply {
-                forEach {
-                    it.minSweepDegrees = 55f
-                    it.ellipsize = TextUtils.TruncateAt.END
-                }
-            }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun tesSweepDegree() {
-        doOneTest(
-            "sweep_degree_screenshot",
-            createThree(
-                "center long string",
-                "left string",
-                "right"
-            ).apply {
-                forEachIndexed { ix, v ->
-                    v.minSweepDegrees = 50f
-                    v.maxSweepDegrees = 60f
-                    v.ellipsize = TextUtils.TruncateAt.END
-                    v.textAlignment = listOf(
-                        View.TEXT_ALIGNMENT_CENTER,
-                        View.TEXT_ALIGNMENT_TEXT_START,
-                        View.TEXT_ALIGNMENT_TEXT_END
-                    )[ix]
-                }
-            }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testCounterClockwise() {
-        doOneTest(
-            "counter_clockwise_screenshot",
-            createThree().apply { forEach { it.clockwise = false } }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testTextSize() {
-        doOneTest(
-            "text_size_screenshot",
-            createThree().apply {
-                forEachIndexed { ix, it -> it.textSize = 20f + ix * 4f }
-            }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testEllipsize() {
-        doOneTest(
-            "ellipsize_screenshot",
-            (
-                createThree() zip
-                    listOf(
-                        TextUtils.TruncateAt.START,
-                        TextUtils.TruncateAt.MIDDLE,
-                        TextUtils.TruncateAt.END
-                    )
-                )
-                .map
-                { (v, e) -> v.ellipsize = e ; v.maxSweepDegrees = 50f; v.text += " but Longer" ; v }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testPadding() {
-        doOneTest(
-            "padding_screenshot",
-            createThree().apply {
-                forEachIndexed { ix, it ->
-                    it.setPadding(
-                        ix * 10, ((ix + 1) % 4) * 10,
-                        ((ix + 2) % 4) * 10, ((ix + 3) % 4) * 10
-                    )
-                }
-            }
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testClockwiseTextBackground() {
-        doOneTest(
-            "cw_text_background_screenshot",
-            listOf(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "This is a clockwise text for testing background"
-                    clockwise = true
-                    anchorAngleDegrees = 170.0f
-                    anchorType = WearArcLayout.ANCHOR_START
-                    setBackgroundColor(Color.rgb(0, 100, 100))
-                },
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "Another clockwise text"
-                    clockwise = true
-                    anchorAngleDegrees = 70.0f
-                    anchorType = WearArcLayout.ANCHOR_START
-                    setBackgroundColor(Color.rgb(0, 100, 100))
-                }
-            )
-        )
-    }
-
-    @Test
-    @Throws(Exception::class)
-    fun testCounterClockwiseTextBackground() {
-        doOneTest(
-            "ccw_text_background_screenshot",
-            listOf(
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "This is a counterclockwise text for testing background"
-                    clockwise = false
-                    anchorAngleDegrees = 100.0f
-                    anchorType = WearArcLayout.ANCHOR_START
-                    setBackgroundColor(Color.rgb(0, 100, 100))
-                },
-                WearCurvedTextView(ApplicationProvider.getApplicationContext()).apply {
-                    text = "Another counterclockwise text"
-                    clockwise = false
-                    anchorAngleDegrees = 230.0f
-                    anchorType = WearArcLayout.ANCHOR_START
-                    setBackgroundColor(Color.rgb(0, 100, 100))
-                }
-            )
-        )
-    }
-
-    companion object {
-        private const val SCREEN_WIDTH = 390
-        private const val SCREEN_HEIGHT = 390
-        private const val TIMEOUT_MS = 1000L
-    }
-}
diff --git a/wear/wear/src/androidTest/res/layout/wear_arc_layout_touch_test.xml b/wear/wear/src/androidTest/res/layout/wear_arc_layout_touch_test.xml
index dfc788b..5d277d9 100644
--- a/wear/wear/src/androidTest/res/layout/wear_arc_layout_touch_test.xml
+++ b/wear/wear/src/androidTest/res/layout/wear_arc_layout_touch_test.xml
@@ -29,7 +29,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
-    <androidx.wear.widget.WearArcLayout
+    <androidx.wear.widget.ArcLayout
         android:id="@+id/arc_layout1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -37,7 +37,7 @@
         circular:anchorPosition="center"
         circular:clockwise="true">
 
-        <androidx.wear.widget.WearCurvedTextView
+        <androidx.wear.widget.CurvedTextView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:text="Left"
@@ -59,7 +59,7 @@
             tools:ignore="HardcodedText"
             />
 
-        <androidx.wear.widget.WearCurvedTextView
+        <androidx.wear.widget.CurvedTextView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:text="Center"
@@ -73,7 +73,7 @@
             tools:ignore="HardcodedText"
             />
 
-        <androidx.wear.widget.WearCurvedTextView
+        <androidx.wear.widget.CurvedTextView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:text="Right"
@@ -95,9 +95,9 @@
             tools:ignore="HardcodedText"
             />
 
-    </androidx.wear.widget.WearArcLayout>
+    </androidx.wear.widget.ArcLayout>
 
-    <androidx.wear.widget.WearArcLayout
+    <androidx.wear.widget.ArcLayout
         android:id="@+id/arc_layout2"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -114,7 +114,7 @@
             tools:ignore="HardcodedText"
             />
 
-        <androidx.wear.widget.WearCurvedTextView
+        <androidx.wear.widget.CurvedTextView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:text="ACL"
@@ -139,7 +139,7 @@
             tools:ignore="HardcodedText"
             />
 
-        <androidx.wear.widget.WearCurvedTextView
+        <androidx.wear.widget.CurvedTextView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:text="ACR"
@@ -152,5 +152,5 @@
             android:textSize="30sp"
             tools:ignore="HardcodedText"
             />
-    </androidx.wear.widget.WearArcLayout>
+    </androidx.wear.widget.ArcLayout>
 </FrameLayout>
diff --git a/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java b/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java
new file mode 100644
index 0000000..1e5a8e4
--- /dev/null
+++ b/wear/wear/src/main/java/androidx/wear/widget/ArcLayout.java
@@ -0,0 +1,783 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.widget;
+
+import static java.lang.Math.asin;
+import static java.lang.Math.max;
+import static java.lang.Math.round;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.Px;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.UiThread;
+import androidx.wear.R;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+
+/**
+ * Container which will lay its elements out on an arc. Elements will be relative to a given
+ * anchor angle (where 0 degrees = 12 o clock), where the layout relative to the anchor angle is
+ * controlled using {@code anchorAngleDegrees} and {@code anchorType}. The thickness of the arc is
+ * calculated based on the child element with the greatest height (in the case of Android
+ * widgets), or greatest thickness (for curved widgets). By default, the container lays its
+ * children one by one in clockwise direction. The attribute 'clockwise' can be set to false to
+ * make the layout direction as  anti-clockwise. These two types of widgets will be drawn as
+ * follows.
+ *
+ * <p>Standard Android Widgets:
+ *
+ * <p>These widgets will be drawn as usual, but placed at the correct position on the arc, with
+ * the correct amount of rotation applied. As an example, for an Android Text widget, the text
+ * baseline would be drawn at a tangent to the arc. The arc length of a widget is obtained by
+ * measuring the width of the widget, and transforming that to the length of an arc on a circle.
+ *
+ * <p>A standard Android widget will be measured as usual, but the maximum height constraint will be
+ * capped at the minimum radius of the arc (i.e. width / 2).
+ *
+ * <p>"Curved" widgets:
+ *
+ * <p>Widgets which implement {@link ArcLayout.Widget} are expected to draw themselves within an arc
+ * automatically. These widgets will be measured with the full dimensions of the arc container.
+ * They are also expected to provide their thickness (used when calculating the thickness of the
+ * arc) and the current sweep angle (used for laying out when drawing). Note that the
+ * ArcLayout will apply a rotation transform to the canvas before drawing this child; the
+ * inner child need not perform any rotations itself.
+ *
+ * <p>An example of a widget which implements this interface is {@link CurvedTextView}, which
+ * will lay itself out along the arc.
+ */
+@UiThread
+public class ArcLayout extends ViewGroup {
+
+    /**
+     * Interface for a widget which knows it is being rendered inside an arc, and will draw
+     * itself accordingly. Any widget implementing this interface will receive the full-sized
+     * canvas, pre-rotated, in its draw call.
+     */
+    public interface Widget {
+
+        /** Returns the sweep angle that this widget is drawn with. */
+        @FloatRange(from = 0.0f, to = 360.0f, toInclusive = true)
+        float getSweepAngleDegrees();
+
+        /** Returns the thickness of this widget inside the arc. */
+        @Px
+        int getThickness();
+
+        /**
+         * Check whether the widget contains invalid attributes as a child of ArcLayout, throwing
+         * a Exception if something is wrong.
+         * This is important for widgets that can be both standalone or used inside an ArcLayout,
+         * some parameters used when the widget is standalone doesn't make sense when the widget
+         * is inside an ArcLayout.
+         */
+        void checkInvalidAttributeAsChild();
+
+        /**
+         * Return true when the given point is in the clickable area of the child widget.
+         * In particular, the coordinates should be considered as if the child was drawn
+         * centered at the default angle (12 o clock).
+         */
+        boolean isPointInsideClickArea(float x, float y);
+    }
+
+    /**
+     * Layout parameters for a widget added to an arc. This allows each element to specify
+     * whether or not it should be rotated(around the center of the child) when drawn inside the
+     * arc. For example, when the child is put at the center-bottom of the arc, whether the
+     * parent layout is responsible to rotate it 180 degree to draw it upside down.
+     *
+     * <p>Note that the {@code rotate} parameter is ignored when drawing "Fullscreen" elements.
+     */
+    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+
+        /** Vertical alignment of elements within the arc. */
+        /** @hide */
+        @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @IntDef({VERTICAL_ALIGN_OUTER, VERTICAL_ALIGN_CENTER, VERTICAL_ALIGN_INNER})
+        public @interface VerticalAlignment {
+        }
+
+        /** Align to the outer edge of the parent ArcLayout. */
+        public static final int VERTICAL_ALIGN_OUTER = 0;
+
+        /** Align to the center of the parent ArcLayout. */
+        public static final int VERTICAL_ALIGN_CENTER = 1;
+
+        /** Align to the inner edge of the parent ArcLayout. */
+        public static final int VERTICAL_ALIGN_INNER = 2;
+
+        private boolean mRotated = true;
+        @VerticalAlignment
+        private int mVerticalAlignment = VERTICAL_ALIGN_CENTER;
+
+        // Internally used during layout/draw
+        // Stores the angle of the child, used to handle touch events.
+        float mMiddleAngle;
+
+        /**
+         * Creates a new set of layout parameters. The values are extracted from the supplied
+         * attributes set and context.
+         *
+         * @param context  The Context the ArcLayout is running in, through which it can access the
+         *                 current theme, resources, etc.
+         * @param attrs    The set of attributes from which to extract the layout parameters' values
+         */
+        public LayoutParams(@NonNull Context context, @Nullable AttributeSet attrs) {
+            super(context, attrs);
+
+            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ArcLayout_Layout);
+
+            mRotated = a.getBoolean(R.styleable.ArcLayout_Layout_layout_rotate, true);
+            mVerticalAlignment =
+                    a.getInt(R.styleable.ArcLayout_Layout_layout_valign, VERTICAL_ALIGN_CENTER);
+
+            a.recycle();
+        }
+
+        /**
+         * Creates a new set of layout parameters with specified width and height
+         *
+         * @param width   The width, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
+         * @param height  The height, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
+         */
+        public LayoutParams(int width, int height) {
+            super(width, height);
+        }
+
+        /** Copy constructor */
+        public LayoutParams(@NonNull ViewGroup.LayoutParams source) {
+            super(source);
+        }
+
+        /**
+         * Gets whether the widget shall be rotated by the ArcLayout container corresponding
+         * to its layout position angle
+         */
+        public boolean isRotated() {
+            return mRotated;
+        }
+
+        /**
+         * Sets whether the widget shall be rotated by the ArcLayout container corresponding
+         * to its layout position angle
+         */
+        public void setRotated(boolean rotated) {
+            mRotated = rotated;
+        }
+
+        /**
+         * Gets how the widget is positioned vertically in the ArcLayout.
+         */
+        @VerticalAlignment
+        public int getVerticalAlignment() {
+            return mVerticalAlignment;
+        }
+
+        /**
+         * Sets how the widget is positioned vertically in the ArcLayout.
+         * @param verticalAlignment align the widget to outer, inner edges or center.
+         */
+        public void setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
+            mVerticalAlignment = verticalAlignment;
+        }
+    }
+
+    /** Annotation for anchor types. */
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @IntDef({ANCHOR_START, ANCHOR_CENTER, ANCHOR_END})
+    public @interface AnchorType {
+    }
+
+    /**
+     * Anchor at the start of the set of elements drawn within this container. This causes the first
+     * child to be drawn from {@code anchorAngle} degrees, to the right.
+     *
+     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
+     * other having 20 degrees of sweep, the first will be drawn between 0-10 degrees, and the
+     * second between 10-30 degrees.
+     */
+    public static final int ANCHOR_START = 0;
+
+    /**
+     * Anchor at the center of the set of elements drawn within this container.
+     *
+     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
+     * other having 20 degrees of sweep, the first will be drawn between -15 and -5 degrees, and the
+     * second between -5 and 15 degrees.
+     */
+    public static final int ANCHOR_CENTER = 1;
+
+    /**
+     * Anchor at the end of the set of elements drawn within this container. This causes the last
+     * element to end at {@code anchorAngle} degrees, with the other elements swept to the left.
+     *
+     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
+     * other having 20 degrees of sweep, the first will be drawn between -30 and -20 degrees, and
+     * the second between -20 and 0 degrees.
+     */
+    public static final int ANCHOR_END = 2;
+
+    private static final float DEFAULT_START_ANGLE_DEGREES = 0f;
+    private static final boolean DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE = true; // clockwise
+    @AnchorType
+    private static final int DEFAULT_ANCHOR_TYPE = ANCHOR_START;
+
+    private int mThicknessPx = 0;
+
+    @AnchorType
+    private int mAnchorType;
+    private float mAnchorAngleDegrees;
+    private boolean mClockwise;
+
+    @SuppressWarnings("SyntheticAccessor")
+    private final ChildArcAngles mChildArcAngles = new ChildArcAngles();
+
+    public ArcLayout(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public ArcLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public ArcLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public ArcLayout(
+            @NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        TypedArray a =
+                context.obtainStyledAttributes(
+                        attrs, R.styleable.ArcLayout, defStyleAttr, defStyleRes
+                );
+
+        mAnchorType = a.getInt(R.styleable.ArcLayout_anchorPosition, DEFAULT_ANCHOR_TYPE);
+        mAnchorAngleDegrees =
+                a.getFloat(
+                        R.styleable.ArcLayout_anchorAngleDegrees, DEFAULT_START_ANGLE_DEGREES
+                );
+        mClockwise = a.getBoolean(
+                R.styleable.ArcLayout_clockwise, DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE
+        );
+
+        a.recycle();
+    }
+
+    @Override
+    public void requestLayout() {
+        super.requestLayout();
+
+        for (int i = 0; i < getChildCount(); i++) {
+            getChildAt(i).forceLayout();
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        // Need to derive the thickness of the curve from the children. We're a curve, so the
+        // children can only be sized up to (width or height)/2 units. This currently only
+        // supports fitting to a circle.
+        //
+        // No matter what, fit to the given size, be it a maximum or a fixed size. It doesn't make
+        // sense for this container to wrap its children.
+        int actualWidthPx = MeasureSpec.getSize(widthMeasureSpec);
+        int actualHeightPx = MeasureSpec.getSize(heightMeasureSpec);
+
+        if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED
+                && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
+            // We can't actually resolve this.
+            // Let's fit to the screen dimensions, for need of anything better...
+            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
+            actualWidthPx = displayMetrics.widthPixels;
+            actualHeightPx = displayMetrics.heightPixels;
+        }
+
+        // Fit to a square.
+        if (actualWidthPx < actualHeightPx) {
+            actualHeightPx = actualWidthPx;
+        } else if (actualHeightPx < actualWidthPx) {
+            actualWidthPx = actualHeightPx;
+        }
+
+        int maxChildDimension = actualHeightPx / 2;
+
+        // Measure all children in the new measurespec, and cache the largest.
+        int childMeasureSpec = MeasureSpec.makeMeasureSpec(maxChildDimension, MeasureSpec.AT_MOST);
+
+        // We need to do two measure passes. First, we need to measure all "normal" children, and
+        // get the thickness of all "CurvedContainer" children. Once we have that, we know the
+        // maximum thickness, and we can lay out the "CurvedContainer" children, taking into
+        // account their vertical alignment.
+        int maxChildHeightPx = 0;
+        int childState = 0;
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            // ArcLayoutWidget is a special case. Because of how it draws, fit it to the size
+            // of the whole widget.
+            int childMeasuredHeight;
+            if (child instanceof Widget) {
+                childMeasuredHeight = ((Widget) child).getThickness();
+            } else {
+                measureChild(
+                        child,
+                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().width),
+                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().height)
+                );
+                childMeasuredHeight = child.getMeasuredHeight();
+                childState = combineMeasuredStates(childState, child.getMeasuredState());
+
+            }
+            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+            maxChildHeightPx = max(maxChildHeightPx, childMeasuredHeight
+                    + childLayoutParams.topMargin +  childLayoutParams.bottomMargin);
+        }
+
+        mThicknessPx = maxChildHeightPx;
+
+        // And now do the pass for the ArcLayoutWidgets
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            if (child instanceof Widget) {
+                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+
+                float insetPx = getChildTopInset(child);
+
+                int innerChildMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(
+                                maxChildDimension * 2 - round(insetPx * 2), MeasureSpec.EXACTLY);
+
+                measureChild(
+                        child,
+                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.width),
+                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.height)
+                );
+
+                childState = combineMeasuredStates(childState, child.getMeasuredState());
+            }
+        }
+
+        setMeasuredDimension(
+                resolveSizeAndState(actualWidthPx, widthMeasureSpec, childState),
+                resolveSizeAndState(actualHeightPx, heightMeasureSpec, childState));
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            // Curved container widgets have been measured so that the "arc" inside their widget
+            // will touch the outside of the box they have been measured in, taking into account
+            // the vertical alignment. Just grow them from the center.
+            if (child instanceof Widget) {
+                int leftPx =
+                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
+                int topPx =
+                        round((getMeasuredHeight() / 2f) - (child.getMeasuredHeight() / 2f));
+
+                child.layout(
+                        leftPx,
+                        topPx,
+                        leftPx + child.getMeasuredWidth(),
+                        topPx + child.getMeasuredHeight()
+                );
+            } else {
+                // Normal widgets need to be placed on their canvas, taking into account their
+                // vertical position.
+                // In terms of x axis, they are placed in the center of the screen, same as the
+                // center of the circle where all components lay.
+                // In terms of y axis, widget is placed on top of the circle (12 o'clock).
+                int leftPx =
+                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
+                int topPx = round(getChildTopInset(child));
+
+                child.layout(
+                        leftPx,
+                        topPx,
+                        leftPx + child.getMeasuredWidth(),
+                        topPx + child.getMeasuredHeight());
+            }
+        }
+
+        // Once dimensions are set, also layout the children in the arc, computing the
+        // center angle where they should be drawn.
+        float currentCumulativeAngle = calculateInitialRotation();
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            calculateArcAngle(child, mChildArcAngles);
+            float preRotation = mChildArcAngles.leftMarginAsAngle
+                    + mChildArcAngles.actualChildAngle / 2f;
+            float multiplier = mClockwise ? 1f : -1f;
+
+            float middleAngle = multiplier * (currentCumulativeAngle + preRotation);
+            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+            childLayoutParams.mMiddleAngle = middleAngle;
+
+            currentCumulativeAngle += mChildArcAngles.getTotalAngle();
+        }
+    }
+
+    // When a view (that can handle it) receives a TOUCH_DOWN event, it will get all subsequent
+    // events until the touch is released, even if the pointer goes outside of it's bounds.
+    private View mTouchedView = null;
+
+    @Override
+    public boolean onInterceptTouchEvent(@NonNull MotionEvent event) {
+        if (mTouchedView == null && event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+            for (int i = 0; i < getChildCount(); i++) {
+                View child = getChildAt(i);
+                // Ensure that the view is visible
+                if (child.getVisibility() != VISIBLE) {
+                    continue;
+                }
+
+                // Map the event to the child's coordinate system
+                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+                float angle = childLayoutParams.mMiddleAngle;
+
+                float[] point = new float[]{event.getX(), event.getY()};
+                mapPoint(child, angle, point);
+
+                // Check if the click is actually in the child area
+                float x = point[0];
+                float y = point[1];
+
+                if (insideChildClickArea(child, x, y)) {
+                    mTouchedView = child;
+                    break;
+                }
+            }
+        }
+        // We can't do normal dispatching because it will capture touch in the original position
+        // of children.
+        return true;
+    }
+
+    private static boolean insideChildClickArea(View child, float x, float y) {
+        if (child instanceof Widget) {
+            return ((Widget) child).isPointInsideClickArea(x, y);
+        }
+        return x >= 0 && x < child.getMeasuredWidth() && y >= 0 && y < child.getMeasuredHeight();
+    }
+
+    // Map a point to local child coordinates.
+    private void mapPoint(View child, float angle, float[] point) {
+        float cx = getMeasuredWidth() / 2;
+        float cy = getMeasuredHeight() / 2;
+
+        Matrix m = new Matrix();
+        m.postRotate(-angle, cx, cy);
+        m.postTranslate(-child.getX(), -child.getY());
+        if (!(child instanceof Widget)) {
+            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+            if (!childLayoutParams.isRotated()) {
+                m.postRotate(angle, child.getWidth() / 2, child.getHeight() / 2);
+            }
+        }
+        m.mapPoints(point);
+    }
+
+    @Override
+    @SuppressLint("ClickableViewAccessibility")
+    public boolean onTouchEvent(@NonNull MotionEvent event) {
+        if (mTouchedView != null) {
+            // Map the event's coordinates to the child's coordinate space
+            float[] point = new float[]{event.getX(), event.getY()};
+            LayoutParams touchedViewLayoutParams = (LayoutParams) mTouchedView.getLayoutParams();
+            mapPoint(mTouchedView, touchedViewLayoutParams.mMiddleAngle, point);
+
+            float dx = point[0] - event.getX();
+            float dy = point[1] - event.getY();
+            event.offsetLocation(dx, dy);
+
+            mTouchedView.dispatchTouchEvent(event);
+
+            if (event.getActionMasked() == MotionEvent.ACTION_UP
+                    || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
+                // We have finished handling these series of events.
+                mTouchedView = null;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean drawChild(@NonNull Canvas canvas, @NonNull View child, long drawingTime) {
+        // Rotate the canvas to make the children render in the right place.
+        canvas.save();
+
+        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+        float middleAngle = childLayoutParams.mMiddleAngle;
+
+        // Rotate the child widget. This rotation places child widget in its correct place in the
+        // circle. Rotation is done around the center of the circle that components make. Canvas
+        // does this at the end, when all (if any) rotations are done.
+        canvas.rotate(
+                middleAngle,
+                getMeasuredWidth() / 2f,
+                getMeasuredHeight() / 2f);
+
+        if (child instanceof Widget) {
+            ((Widget) child).checkInvalidAttributeAsChild();
+        } else {
+            // Do we need to do some counter rotation?
+            LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
+
+            float angleToRotate = 0f;
+
+            if (layoutParams.isRotated()) {
+                // For counterclockwise layout, especially when mixing standard Android widget with
+                // ArcLayoutWidget as children, we might need to rotate the standard widget to make
+                // them have the same upwards direction.
+                if (!mClockwise) {
+                    angleToRotate = 180f;
+                }
+            } else {
+                // Un-rotate about the top of the canvas, around the center of the actual child.
+                // This compounds with the initial rotation into a translation.
+                angleToRotate = -middleAngle;
+            }
+
+            // Do the actual rotation. This rotation is done in place around the center of the
+            // child to adjust it based on rotation and clockwise attributes.
+            // Actual position of this component here is still at the
+            // top of the circle (12 o'clock), meaning that the strange rotation center is
+            // because the child view is x-centered but at the top of this container. Additional
+            // offset is added for vertical rectangular screens as for them the start of an arc
+            // is lower then usual.
+            float childInset = getChildTopInset(child);
+            canvas.rotate(
+                    angleToRotate,
+                    getMeasuredWidth() / 2f,
+                    child.getMeasuredHeight() / 2f + childInset
+            );
+        }
+        boolean wasInvalidateIssued = super.drawChild(canvas, child, drawingTime);
+
+        canvas.restore();
+
+        return wasInvalidateIssued;
+    }
+
+    private float calculateInitialRotation() {
+        float multiplier = mClockwise ? 1f : -1f;
+        if (mAnchorType == ANCHOR_START) {
+            return multiplier * mAnchorAngleDegrees;
+        }
+
+        float totalArcAngle = 0;
+
+        for (int i = 0; i < getChildCount(); i++) {
+            calculateArcAngle(getChildAt(i), mChildArcAngles);
+            totalArcAngle += mChildArcAngles.getTotalAngle();
+        }
+
+        if (mAnchorType == ANCHOR_CENTER) {
+            return multiplier * mAnchorAngleDegrees - (totalArcAngle / 2f);
+        } else if (mAnchorType == ANCHOR_END) {
+            return multiplier * mAnchorAngleDegrees - totalArcAngle;
+        }
+
+        return 0;
+    }
+
+    private static float widthToAngleDegrees(float widthPx, float radiusPx) {
+        return (float) Math.toDegrees(2 * asin(widthPx / radiusPx / 2f));
+    }
+
+    private void calculateArcAngle(@NonNull View view, @NonNull ChildArcAngles childAngles) {
+        if (view.getVisibility() == GONE) {
+            childAngles.leftMarginAsAngle = 0;
+            childAngles.rightMarginAsAngle = 0;
+            childAngles.actualChildAngle = 0;
+            return;
+        }
+
+        float radiusPx = (getMeasuredWidth() / 2f) - mThicknessPx;
+
+        LayoutParams childLayoutParams = (LayoutParams) view.getLayoutParams();
+
+        childAngles.leftMarginAsAngle =
+                widthToAngleDegrees(childLayoutParams.leftMargin, radiusPx);
+        childAngles.rightMarginAsAngle =
+                widthToAngleDegrees(childLayoutParams.rightMargin, radiusPx);
+
+        if (view instanceof Widget) {
+            childAngles.actualChildAngle = ((Widget) view).getSweepAngleDegrees();
+        } else {
+            childAngles.actualChildAngle =
+                    widthToAngleDegrees(view.getMeasuredWidth(), radiusPx);
+        }
+    }
+
+    private float getChildTopInset(@NonNull View child) {
+        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
+
+        int childHeight = child instanceof Widget
+                ? ((Widget) child).getThickness()
+                : child.getMeasuredHeight();
+
+        int thicknessDiffPx =
+                mThicknessPx - childLayoutParams.topMargin - childLayoutParams.bottomMargin
+                        - childHeight;
+
+        int margin = mClockwise ? childLayoutParams.topMargin : childLayoutParams.bottomMargin;
+        float topInset = margin + getChildTopOffset(child);
+
+        switch (childLayoutParams.getVerticalAlignment()) {
+            case LayoutParams.VERTICAL_ALIGN_OUTER:
+                return topInset;
+            case LayoutParams.VERTICAL_ALIGN_CENTER:
+                return topInset + thicknessDiffPx / 2f;
+            case LayoutParams.VERTICAL_ALIGN_INNER:
+                return topInset + thicknessDiffPx;
+            default:
+                // Normally unreachable...
+                return 0;
+        }
+    }
+
+    /**
+     * For vertical rectangular screens, additional offset needs to be taken into the account for
+     * y position of normal widget in order to be in the correct place in the circle.
+     */
+    private float getChildTopOffset(View child) {
+        if (child instanceof Widget || getMeasuredWidth() >= getMeasuredHeight()) {
+            return 0;
+        }
+        return round((getMeasuredHeight() - getMeasuredWidth()) / 2f);
+    }
+
+    @Override
+    protected boolean checkLayoutParams(@NonNull ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams;
+    }
+
+    @Override
+    @NonNull
+    protected ViewGroup.LayoutParams generateLayoutParams(@NonNull ViewGroup.LayoutParams p) {
+        return new LayoutParams(p);
+    }
+
+    @Override
+    @NonNull
+    public ViewGroup.LayoutParams generateLayoutParams(@NonNull AttributeSet attrs) {
+        return new LayoutParams(getContext(), attrs);
+    }
+
+    @Override
+    @NonNull
+    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    }
+
+    /** Returns the anchor type used for this container. */
+    @AnchorType
+    public int getAnchorType() {
+        return mAnchorType;
+    }
+
+    /** Sets the anchor type used for this container. */
+    public void setAnchorType(@AnchorType int anchorType) {
+        if (anchorType < ANCHOR_START || anchorType > ANCHOR_END) {
+            throw new IllegalArgumentException("Unknown anchor type");
+        }
+
+        mAnchorType = anchorType;
+        invalidate();
+    }
+
+    /** Returns the anchor angle used for this container, in degrees. */
+    @FloatRange(from = 0.0f, to = 360.0f, toInclusive = true)
+    public float getAnchorAngleDegrees() {
+        return mAnchorAngleDegrees;
+    }
+
+    /** Sets the anchor angle used for this container, in degrees. */
+    public void setAnchorAngleDegrees(
+            @FloatRange(from = 0.0f, to = 360.0f, toInclusive = true) float anchorAngleDegrees) {
+        mAnchorAngleDegrees = anchorAngleDegrees;
+        invalidate();
+    }
+
+    /** returns the layout direction */
+    public boolean isClockwise() {
+        return mClockwise;
+    }
+
+    /** Sets the layout direction */
+    public void setClockwise(boolean clockwise) {
+        mClockwise = clockwise;
+        invalidate();
+    }
+
+    private static class ChildArcAngles {
+        public float leftMarginAsAngle;
+        public float rightMarginAsAngle;
+        public float actualChildAngle;
+
+        public float getTotalAngle() {
+            return leftMarginAsAngle + rightMarginAsAngle + actualChildAngle;
+        }
+    }
+}
diff --git a/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java b/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java
new file mode 100644
index 0000000..949098a
--- /dev/null
+++ b/wear/wear/src/main/java/androidx/wear/widget/CurvedTextView.java
@@ -0,0 +1,940 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.wear.widget;
+
+import static java.lang.Math.cos;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+import static java.lang.Math.round;
+import static java.lang.Math.sin;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.text.StaticLayout;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.FloatRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.Px;
+import androidx.annotation.RequiresApi;
+import androidx.wear.R;
+
+/**
+ * CurvedTextView is a component allowing developers to easily write curved text following
+ * the curvature of the largest circle that can be inscribed in the view. ArcLayout could be
+ * used to concatenate multiple curved texts, also layout together with other widgets such as icons.
+ */
+public class CurvedTextView extends View implements ArcLayout.Widget {
+    private static final float UNSET_ANCHOR_DEGREE = -1f;
+    private static final int UNSET_ANCHOR_TYPE = -1;
+    private static final float MIN_SWEEP_DEGREE = 0f;
+    private static final float MAX_SWEEP_DEGREE = 359.9f;
+    private static final float DEFAULT_TEXT_SIZE = 24f;
+    @ColorInt
+    private static final int DEFAULT_TEXT_COLOR = Color.WHITE;
+    private static final int DEFAULT_TEXT_STYLE = Typeface.NORMAL;
+    private static final boolean DEFAULT_CLOCKWISE = true;
+    private static final int FONT_WEIGHT_MAX = 1000;
+    private static final float ITALIC_SKEW_X = -0.25f;
+    // make 0 degree at 12 o'clock, since canvas assumes 0 degree is 3 o'clock
+    private static final float ANCHOR_DEGREE_OFFSET = -90f;
+
+    private final Path mPath = new Path();
+    private final Path mBgPath = new Path();
+    private final TextPaint mPaint = new TextPaint();
+    private final Rect mBounds = new Rect();
+    private final Rect mBgBounds = new Rect();
+    private boolean mDirty = true;
+    private String mTextToDraw = "";
+    private float mPathRadius = 0f;
+    private float mTextSweepDegrees = 0f;
+    private float mBackgroundSweepDegrees = MAX_SWEEP_DEGREE;
+    private int mLastUsedTextAlignment = -1;
+    private float mLocalRotateAngle = 0f;
+
+    @ArcLayout.AnchorType
+    private int mAnchorType;
+    private float mAnchorAngleDegrees;
+    private float mMinSweepDegrees;
+    private float mMaxSweepDegrees;
+    private String mText = "";
+    private float mTextSize = DEFAULT_TEXT_SIZE;
+    @Nullable
+    private Typeface mTypeface = null;
+    private boolean mClockwise = DEFAULT_CLOCKWISE;
+    @ColorInt
+    private int mTextColor = DEFAULT_TEXT_COLOR;
+    @Nullable
+    private TextUtils.TruncateAt mEllipsize = null;
+    private float mLetterSpacing = 0f;
+    @Nullable
+    private String mFontFeatureSettings = null;
+    @Nullable
+    private String mFontVariationSettings = null;
+
+    // If true, it means we got the touch_down event and are receiving the touch events that follow.
+    private boolean mHandlingTouch = false;
+
+
+    public CurvedTextView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CurvedTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, android.R.attr.textViewStyle);
+    }
+
+    public CurvedTextView(
+            @NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyle) {
+        this(context, attrs, defStyle, 0);
+    }
+
+    public CurvedTextView(
+            @NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyle,
+            int defStyleRes) {
+        super(context, attrs, defStyle, defStyleRes);
+
+        mPaint.setAntiAlias(true);
+
+        TextAppearanceAttributes attributes = new TextAppearanceAttributes();
+        attributes.mTextColor = ColorStateList.valueOf(DEFAULT_TEXT_COLOR);
+
+        final Resources.Theme theme = context.getTheme();
+        TypedArray a = theme.obtainStyledAttributes(
+                attrs, R.styleable.TextViewAppearance, defStyle, defStyleRes);
+
+        TypedArray appearance = null;
+        int ap = a.getResourceId(R.styleable.TextViewAppearance_android_textAppearance, -1);
+        a.recycle();
+
+        if (ap != -1) {
+            appearance = theme.obtainStyledAttributes(ap, R.styleable.TextAppearance);
+        }
+        if (appearance != null) {
+            readTextAppearance(appearance, attributes, true);
+            appearance.recycle();
+        }
+
+        a = context.obtainStyledAttributes(
+                attrs, R.styleable.CurvedTextView, defStyle, defStyleRes);
+        // overrride the value in the appearance with explicitly specified attribute values
+        readTextAppearance(a, attributes, false);
+
+        // read the other supported TextView attributes
+        if (a.hasValue(R.styleable.CurvedTextView_android_text)) {
+            mText = a.getString(R.styleable.CurvedTextView_android_text);
+        }
+
+        int textEllipsize = a.getInt(R.styleable.CurvedTextView_android_ellipsize, 0);
+        switch (textEllipsize) {
+            case 1:
+                mEllipsize = TextUtils.TruncateAt.START;
+                break;
+            case 2:
+                mEllipsize = TextUtils.TruncateAt.MIDDLE;
+                break;
+            case 3:
+                mEllipsize = TextUtils.TruncateAt.END;
+                break;
+            default:
+                mEllipsize = null;
+        }
+
+        // read the custom CurvedTextView attributes
+        mMaxSweepDegrees =
+                a.getFloat(R.styleable.CurvedTextView_maxSweepDegrees, MAX_SWEEP_DEGREE);
+        mMaxSweepDegrees = min(mMaxSweepDegrees, MAX_SWEEP_DEGREE);
+        mMinSweepDegrees =
+                a.getFloat(R.styleable.CurvedTextView_minSweepDegrees, MIN_SWEEP_DEGREE);
+        if (mMinSweepDegrees > mMaxSweepDegrees) {
+            throw new IllegalArgumentException(
+                    "MinSweepDegrees cannot be bigger than MaxSweepDegrees"
+            );
+        }
+        mAnchorType = a.getInt(R.styleable.CurvedTextView_anchorPosition, UNSET_ANCHOR_TYPE);
+        mAnchorAngleDegrees = a.getFloat(
+                R.styleable.CurvedTextView_anchorAngleDegrees, UNSET_ANCHOR_DEGREE
+        );
+        mAnchorAngleDegrees = mAnchorAngleDegrees % 360f;
+        mClockwise = a.getBoolean(R.styleable.CurvedTextView_clockwise, DEFAULT_CLOCKWISE);
+
+        a.recycle();
+
+        applyTextAppearance(attributes);
+
+        mPaint.setTextSize(mTextSize);
+    }
+
+    @Override
+    @FloatRange(from = 0.0f, to = 360.0f, toInclusive = true)
+    public float getSweepAngleDegrees() {
+        return mBackgroundSweepDegrees;
+    }
+
+    @Override
+    @Px
+    public int getThickness() {
+        return round(mPaint.getFontMetrics().descent - mPaint.getFontMetrics().ascent);
+    }
+
+    /**
+     * @throws IllegalArgumentException if the anchorType and/or anchorAngleDegrees attributes
+     *                                  were set for a widget in ArcLayout
+     */
+    @Override
+    public void checkInvalidAttributeAsChild() {
+        if (mAnchorType != UNSET_ANCHOR_TYPE) {
+            throw new IllegalArgumentException(
+                    "CurvedTextView shall not set anchorType value when added into"
+                            + "ArcLayout"
+            );
+        }
+
+        if (mAnchorAngleDegrees != UNSET_ANCHOR_DEGREE) {
+            throw new IllegalArgumentException(
+                    "CurvedTextView shall not set anchorAngleDegrees value when added into "
+                            + "ArcLayout"
+            );
+        }
+    }
+
+    /**
+     * See {@link ArcLayout.Widget#isPointInsideClickArea(float, float)}
+     */
+    @Override
+    public boolean isPointInsideClickArea(float x, float y) {
+        float radius2 = min(getWidth(), getHeight()) / 2f
+                - (mClockwise ? getPaddingTop() : getPaddingBottom());
+        float radius1 =
+                radius2 - mPaint.getFontMetrics().descent + mPaint.getFontMetrics().ascent;
+
+        float dx = x - getWidth() / 2;
+        float dy = y - getHeight() / 2;
+
+        float r2 = dx * dx + dy * dy;
+        if (r2 < radius1 * radius1 || r2 > radius2 * radius2) {
+            return false;
+        }
+
+        // Since we are symmetrical on the Y-axis, we can constrain the angle to the x>=0 quadrants.
+        float angle = (float) Math.toDegrees(Math.atan2(Math.abs(dx), -dy));
+        return angle < mBackgroundSweepDegrees / 2;
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        doUpdate();
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+
+        mPaint.getTextBounds(mText, 0, mText.length(), mBounds);
+
+        // Note that ascent is negative.
+        mPathRadius = min(getWidth(), getHeight()) / 2f
+                + (mClockwise ? mPaint.getFontMetrics().ascent - getPaddingTop() :
+                -mPaint.getFontMetrics().descent - getPaddingBottom());
+        mTextSweepDegrees = min(
+                getWidthSelf() / mPathRadius / (float) Math.PI * 180f,
+                MAX_SWEEP_DEGREE);
+        mBackgroundSweepDegrees = max(min(mMaxSweepDegrees, mTextSweepDegrees), mMinSweepDegrees);
+    }
+
+    private float getWidthSelf() {
+        return (float) mBounds.width() + getPaddingLeft() + getPaddingRight();
+    }
+
+    private String ellipsize(int ellipsizedWidth) {
+        StaticLayout.Builder layoutBuilder =
+                StaticLayout.Builder.obtain(mText, 0, mText.length(), mPaint, ellipsizedWidth);
+        layoutBuilder.setEllipsize(mEllipsize);
+        layoutBuilder.setMaxLines(1);
+        StaticLayout layout = layoutBuilder.build();
+
+        // Cut text that it's too big even if no ellipsize mode is provided.
+        if (mEllipsize == null) {
+            return mText.substring(0, layout.getLineEnd(0));
+        }
+
+        int ellipsisCount = layout.getEllipsisCount(0);
+        if (ellipsisCount == 0) {
+            return mText;
+        }
+
+        int ellipsisStart = layout.getEllipsisStart(0);
+        char[] textToDrawArray = mText.toCharArray();
+        textToDrawArray[ellipsisStart] = '\u2026'; // ellipsis "..."
+        for (int i = ellipsisStart + 1; i < ellipsisStart + ellipsisCount; i++) {
+            if (i >= 0 && i < mText.length()) {
+                textToDrawArray[i] = '\uFEFF'; // 0-width space
+            }
+        }
+        return new String(textToDrawArray);
+    }
+
+    private void updatePathsIfNeeded(boolean withBackground) {
+        // The dirty flag is not set when properties we inherit from View are modified
+        if (!mDirty && ((int) getTextAlignment() == mLastUsedTextAlignment)) {
+            return;
+        }
+
+        mDirty = false;
+        mLastUsedTextAlignment = (int) getTextAlignment();
+
+        if (mTextSweepDegrees <= mMaxSweepDegrees) {
+            mTextToDraw = mText;
+        } else {
+            mTextToDraw = ellipsize(
+                    (int) (mMaxSweepDegrees / 180f * Math.PI * mPathRadius) - getPaddingLeft()
+                            - getPaddingRight()
+            );
+            mTextSweepDegrees = mMaxSweepDegrees;
+        }
+
+        float clockwiseFactor = mClockwise ? 1f : -1f;
+
+        float alignmentFactor = 0.5f;
+        switch (getTextAlignment()) {
+            case TEXT_ALIGNMENT_TEXT_START:
+            case TEXT_ALIGNMENT_VIEW_START:
+                alignmentFactor = 0f;
+                break;
+            case TEXT_ALIGNMENT_TEXT_END:
+            case TEXT_ALIGNMENT_VIEW_END:
+                alignmentFactor = 1f;
+                break;
+            default:
+                alignmentFactor = 0.5f; // TEXT_ALIGNMENT_CENTER
+        }
+
+        float anchorTypeFactor;
+        switch (mAnchorType) {
+            case ArcLayout.ANCHOR_START:
+                anchorTypeFactor = 0.5f;
+                break;
+            case ArcLayout.ANCHOR_END:
+                anchorTypeFactor = -0.5f;
+                break;
+            case ArcLayout.ANCHOR_CENTER: // Center is the default.
+            default:
+                anchorTypeFactor = 0f;
+        }
+
+        mLocalRotateAngle = (mAnchorAngleDegrees == UNSET_ANCHOR_DEGREE ? 0f : mAnchorAngleDegrees)
+                + clockwiseFactor * anchorTypeFactor * mBackgroundSweepDegrees;
+
+        // Always draw the curved text on top center, then rotate the canvas to the right position
+        float backgroundStartAngle =
+                -clockwiseFactor * 0.5f * mBackgroundSweepDegrees + ANCHOR_DEGREE_OFFSET;
+
+        float textStartAngle =
+                backgroundStartAngle + clockwiseFactor * (float) (
+                        alignmentFactor * (mBackgroundSweepDegrees - mTextSweepDegrees)
+                                + getPaddingLeft() / mPathRadius / Math.PI * 180);
+
+        float centerX = getWidth() / 2f;
+        float centerY = getHeight() / 2f;
+        mPath.reset();
+        mPath.addArc(
+                centerX - mPathRadius,
+                centerY - mPathRadius,
+                centerX + mPathRadius,
+                centerY + mPathRadius,
+                textStartAngle,
+                clockwiseFactor * mTextSweepDegrees
+        );
+
+        if (withBackground) {
+            mBgPath.reset();
+            // NOTE: Ensure that if the code to compute these radius* change, containsPoint() is
+            // also updated.
+            float radius1 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().descent;
+            float radius2 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().ascent;
+            mBgPath.arcTo(
+                    centerX - radius2,
+                    centerY - radius2,
+                    centerX + radius2,
+                    centerY + radius2,
+                    backgroundStartAngle,
+                    clockwiseFactor * mBackgroundSweepDegrees, false
+            );
+            mBgPath.arcTo(
+                    centerX - radius1,
+                    centerY - radius1,
+                    centerX + radius1,
+                    centerY + radius1,
+                    backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees,
+                    -clockwiseFactor * mBackgroundSweepDegrees, false
+            );
+            mBgPath.close();
+
+            float angle = backgroundStartAngle;
+            float x0 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
+            float x1 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
+            float y0 = (float) (centerX + radius2 * sin(angle * Math.PI / 180));
+            float y1 = (float) (centerX + radius1 * sin(angle * Math.PI / 180));
+            angle = backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees;
+            float x2 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
+            float x3 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
+            // Background axis-aligned bounding box calculation. Note that, we always center the
+            // text on the top-center of the view.
+            // top: always will be centerY - outerRadius
+            // bottom: the max y of end points of the outer and inner arc contains the text
+            // left: if over -90 degrees, centerX - outerRadius, otherwise the min x of start,
+            // end points of the outer and inner arc contains the text
+            // right: if over 90 degrees, centerX + outerRadius, otherwise the max x of start,
+            // end points of the outer and inner arc contains the text
+            float outerRadius = max(radius1, radius2);
+            mBgBounds.top = (int) (centerY - outerRadius);
+            mBgBounds.bottom = (int) max(y0, y1);
+            mBgBounds.left =
+                    mBackgroundSweepDegrees >= 180.0f
+                            ? (int) (centerX - outerRadius)
+                            : (int) min(x0, min(x1, min(x2, x3)));
+            mBgBounds.right =
+                    mBackgroundSweepDegrees >= 180.0f
+                            ? (int) (centerX + outerRadius)
+                            : (int) max(x0, max(x1, max(x2, x3)));
+        }
+    }
+
+    @Override
+    // We only filter events and defer to super.onTouchEvent()
+    @SuppressLint("ClickableViewAccessibility")
+    public boolean onTouchEvent(@NonNull MotionEvent event) {
+        if (!mHandlingTouch && event.getAction() != MotionEvent.ACTION_DOWN) {
+            return false;
+        }
+
+        float x0 = event.getX() - getWidth() / 2;
+        float y0 = event.getY() - getHeight() / 2;
+
+        double rotAngle = -Math.toRadians(mLocalRotateAngle);
+
+        float tempX = (float)
+                ((x0 * cos(rotAngle) - y0 * sin(rotAngle)) + getWidth() / 2);
+        y0 = (float) ((x0 * sin(rotAngle) + y0 * cos(rotAngle)) + getHeight() / 2);
+        x0 = tempX;
+
+        // Should we start handling the touch events?
+        if (!mHandlingTouch && isPointInsideClickArea(x0, y0)) {
+            mHandlingTouch = true;
+        }
+
+        // We just started or are in the middle of handling events, forward to View to handle.
+        if (mHandlingTouch) {
+            if (event.getAction() == MotionEvent.ACTION_UP
+                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
+                // We should end handling events now
+                mHandlingTouch = false;
+            }
+            event.offsetLocation(x0 - event.getX(), y0 - event.getY());
+            return super.onTouchEvent(event);
+        }
+
+        return false;
+    }
+
+    @Override
+    public void draw(@NonNull Canvas canvas) {
+        canvas.save();
+
+        boolean withBackground = getBackground() != null;
+        updatePathsIfNeeded(withBackground);
+        canvas.rotate(
+                mLocalRotateAngle,
+                getWidth() / 2f,
+                getHeight() / 2f);
+
+        if (withBackground) {
+            canvas.clipPath(mBgPath);
+            getBackground().setBounds(mBgBounds);
+        }
+        super.draw(canvas);
+
+        canvas.restore();
+    }
+
+    @Override
+    protected void onDraw(@NonNull Canvas canvas) {
+        mPaint.setColor(mTextColor);
+        mPaint.setStyle(Paint.Style.FILL);
+        canvas.drawTextOnPath(mTextToDraw, mPath, 0f, 0f, mPaint);
+    }
+
+    /**
+     * Sets the Typeface taking into account the given attributes.
+     *
+     * @param familyName    Family name string, e.g. "serif"
+     * @param typefaceIndex An index of the typeface enum, e.g. SANS, SERIF.
+     * @param style         A typeface style
+     * @param weight        A weight value for the Typeface or -1 if not specified.
+     */
+    private void setTypefaceFromAttrs(
+            @Nullable String familyName,
+            int typefaceIndex,
+            int style,
+            int weight
+    ) {
+        // typeface is ignored when font family is set
+        if (mTypeface == null && familyName != null) {
+            // Lookup normal Typeface from system font map.
+            Typeface normalTypeface = Typeface.create(familyName, Typeface.NORMAL);
+            resolveStyleAndSetTypeface(normalTypeface, style, weight);
+        } else if (mTypeface != null) {
+            resolveStyleAndSetTypeface(mTypeface, style, weight);
+        } else { // both typeface and familyName is null.
+            switch (typefaceIndex) {
+                case 1:
+                    resolveStyleAndSetTypeface(Typeface.SANS_SERIF, style, weight);
+                    break;
+                case 2:
+                    resolveStyleAndSetTypeface(Typeface.SERIF, style, weight);
+                    break;
+                case 3:
+                    resolveStyleAndSetTypeface(Typeface.MONOSPACE, style, weight);
+                    break;
+                default:
+                    resolveStyleAndSetTypeface(null, style, weight);
+            }
+        }
+    }
+
+    private void resolveStyleAndSetTypeface(@Nullable Typeface tf, int style, int weight) {
+        if (weight >= 0 && Build.VERSION.SDK_INT >= 28) {
+            int clampedWeight = min(FONT_WEIGHT_MAX, weight);
+            boolean italic = (style & Typeface.ITALIC) != 0;
+            mTypeface = Api28Impl.createTypeface(tf, clampedWeight, italic);
+            mPaint.setTypeface(mTypeface);
+        } else {
+            setTypeface(tf, style);
+        }
+    }
+
+    /**
+     * Sets the typeface and style in which the text should be displayed, and turns on the fake
+     * bold and italic bits in the Paint if the Typeface that you provided does not have all the
+     * bits in the style that you specified.
+     */
+    public void setTypeface(@Nullable Typeface tf, int style) {
+        if (style > 0) {
+            if (tf == null) {
+                tf = Typeface.defaultFromStyle(style);
+            } else {
+                tf = Typeface.create(tf, style);
+            }
+            if (!tf.equals(mPaint.getTypeface())) {
+                mPaint.setTypeface(tf);
+                mTypeface = tf;
+            }
+            // now compute what (if any) algorithmic styling is needed
+            int typefaceStyle = tf != null ? tf.getStyle() : 0;
+            int need = style & ~typefaceStyle;
+            mPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
+            mPaint.setTextSkewX(((need & Typeface.ITALIC) != 0) ? ITALIC_SKEW_X : 0f);
+        } else {
+            mPaint.setFakeBoldText(false);
+            mPaint.setTextSkewX(0f);
+            if ((tf != null && !tf.equals(mPaint.getTypeface()))
+                    || (tf == null && mPaint.getTypeface() != null)) {
+                mPaint.setTypeface(tf);
+                mTypeface = tf;
+            }
+        }
+        doUpdate();
+    }
+
+    /**
+     * Set of attribute that can be defined in a Text Appearance.
+     */
+    private static class TextAppearanceAttributes {
+        @Nullable
+        ColorStateList mTextColor = null;
+        float mTextSize = DEFAULT_TEXT_SIZE;
+        @Nullable
+        String mFontFamily = null;
+        boolean mFontFamilyExplicit = false;
+        int mTypefaceIndex = -1;
+        int mTextStyle = DEFAULT_TEXT_STYLE;
+        int mFontWeight = -1;
+        float mLetterSpacing = 0f;
+        @Nullable
+        String mFontFeatureSettings = null;
+        @Nullable
+        String mFontVariationSettings = null;
+
+        TextAppearanceAttributes() {
+        }
+    }
+
+    /**
+     * Sets the textColor, size, style, font etc from the specified TextAppearanceAttributes
+     */
+    private void applyTextAppearance(TextAppearanceAttributes attributes) {
+        if (attributes.mTextColor != null) {
+            mTextColor = attributes.mTextColor.getDefaultColor();
+        }
+
+        if (attributes.mTextSize != -1f) {
+            mTextSize = attributes.mTextSize;
+        }
+
+        setTypefaceFromAttrs(
+                attributes.mFontFamily,
+                attributes.mTypefaceIndex,
+                attributes.mTextStyle,
+                attributes.mFontWeight
+        );
+
+        mPaint.setLetterSpacing(attributes.mLetterSpacing);
+        mLetterSpacing = attributes.mLetterSpacing;
+        mPaint.setFontFeatureSettings(attributes.mFontFeatureSettings);
+        mFontFeatureSettings = attributes.mFontFeatureSettings;
+        if (Build.VERSION.SDK_INT >= 26) {
+            Api26Impl.paintSetFontVariationSettings(mPaint, attributes.mFontVariationSettings);
+        }
+        mFontVariationSettings = attributes.mFontVariationSettings;
+    }
+
+    /**
+     * Read the Text Appearance attributes from a given TypedArray and set its values to the
+     * given set. If the TypedArray contains a value that already set in the given attributes,
+     * that will be overridden.
+     */
+    private void readTextAppearance(
+            TypedArray appearance,
+            TextAppearanceAttributes attributes,
+            boolean isTextAppearance
+    ) {
+        int attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_textColor :
+                R.styleable.CurvedTextView_android_textColor;
+        if (appearance.hasValue(attrIndex)) {
+            attributes.mTextColor = appearance.getColorStateList(attrIndex);
+        }
+
+        attributes.mTextSize = appearance.getDimensionPixelSize(
+                isTextAppearance ? R.styleable.TextAppearance_android_textSize :
+                        R.styleable.CurvedTextView_android_textSize,
+                (int) attributes.mTextSize
+        );
+
+        attributes.mTextStyle = appearance.getInt(
+                isTextAppearance ? R.styleable.TextAppearance_android_textStyle :
+                        R.styleable.CurvedTextView_android_textStyle,
+                attributes.mTextStyle
+        );
+
+        // make sure that the typeface attribute is read before fontFamily attribute
+        attributes.mTypefaceIndex = appearance.getInt(
+                isTextAppearance ? R.styleable.TextAppearance_android_typeface :
+                        R.styleable.CurvedTextView_android_typeface,
+                attributes.mTypefaceIndex
+        );
+        if (attributes.mTypefaceIndex != -1 && !attributes.mFontFamilyExplicit) {
+            attributes.mFontFamily = null;
+        }
+
+        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontFamily :
+                R.styleable.CurvedTextView_android_fontFamily;
+        if (appearance.hasValue(attrIndex)) {
+            attributes.mFontFamily = appearance.getString(attrIndex);
+            attributes.mFontFamilyExplicit = !isTextAppearance;
+        }
+
+        attributes.mFontWeight = appearance.getInt(
+                isTextAppearance ? R.styleable.TextAppearance_android_textFontWeight :
+                        R.styleable.CurvedTextView_android_textFontWeight,
+                attributes.mFontWeight
+        );
+
+        attributes.mLetterSpacing = appearance.getFloat(
+                isTextAppearance ? R.styleable.TextAppearance_android_letterSpacing :
+                        R.styleable.CurvedTextView_android_letterSpacing,
+                attributes.mLetterSpacing
+        );
+
+        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontFeatureSettings :
+                R.styleable.CurvedTextView_android_fontFeatureSettings;
+        if (appearance.hasValue(attrIndex)) {
+            attributes.mFontFeatureSettings = appearance.getString(attrIndex);
+        }
+
+        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontVariationSettings :
+                R.styleable.CurvedTextView_android_fontVariationSettings;
+        if (appearance.hasValue(attrIndex)) {
+            attributes.mFontVariationSettings = appearance.getString(attrIndex);
+        }
+    }
+
+    private void doUpdate() {
+        mDirty = true;
+        requestLayout();
+        postInvalidate();
+    }
+
+    private void doRedraw() {
+        mDirty = true;
+        postInvalidate();
+    }
+
+    /** Returns the anchor type for positioning the curved text */
+    @ArcLayout.AnchorType
+    public int getAnchorType() {
+        return mAnchorType;
+    }
+
+    /**
+     * Sets the anchor type for positioning the curved text.
+     * @param value the anchor type,  one of {ANCHOR_START, ANCHOR_CENTER, ANCHOR_END}
+     */
+    public void setAnchorType(@ArcLayout.AnchorType int value) {
+        mAnchorType = value;
+        doUpdate();
+    }
+
+    /** Returns the anchor angle used for positioning the text, in degrees. */
+    @FloatRange(from = 0f, to = 360f, toInclusive = true)
+    public float getAnchorAngleDegrees() {
+        return mAnchorAngleDegrees;
+    }
+
+    /** Sets the anchor angle used for positioning the text, in degrees. */
+    public void setAnchorAngleDegrees(
+            @FloatRange(from = 0f, to = 360f, toInclusive = true) float value) {
+        mAnchorAngleDegrees = value;
+        doRedraw();
+    }
+
+    /** Sets the minimum and maximum sweep angle in degrees for rendering the text.
+     * @param minSweep Ensure the text takes at least this angle (in degrees) in the arc. Use 0f if
+     *                 you don't want to specify a minimum.
+     * @param maxSweep Limit the maximum angle (in degrees) that this curved text can take. Use
+     *                 360f if you don't want to specify a maximum.
+     */
+    public void setSweepRangeDegrees(
+            @FloatRange(from = 0f, to = 360f, toInclusive = true) float minSweep,
+            @FloatRange(from = 0f, to = 360f, toInclusive = true) float maxSweep) {
+        if (minSweep > maxSweep) {
+            throw new IllegalArgumentException(
+                    "MaxSweepDegrees cannot be smaller than MinSweepDegrees"
+            );
+        }
+        mMinSweepDegrees = min(max(minSweep, MIN_SWEEP_DEGREE), MAX_SWEEP_DEGREE);
+        mMaxSweepDegrees = min(maxSweep, MAX_SWEEP_DEGREE);
+        doUpdate();
+    }
+
+    /** Returns the sweep angle in degrees for rendering the text */
+    @FloatRange(from = 0f, to = 360f, toInclusive = true)
+    public float getMinSweepDegrees() {
+        return mMinSweepDegrees;
+    }
+
+    /** Returns the maximum sweep angle in degrees for rendering the text */
+    @FloatRange(from = 0f, to = 360f, toInclusive = true)
+    public float getMaxSweepDegrees() {
+        return mMaxSweepDegrees;
+    }
+
+    /** Returns the text to be rendered */
+    @Nullable
+    public String getText() {
+        return mText;
+    }
+
+    /** Sets the text to be rendered */
+    public void setText(@Nullable String value) {
+        mText = value == null ? "" : value;
+        doUpdate();
+    }
+
+    /** Returns the text size for rendering the text */
+    public float getTextSize() {
+        return mTextSize;
+    }
+
+    /** Sets the text size for rendering the text */
+    public void setTextSize(float value) {
+        mTextSize = value;
+        mPaint.setTextSize(mTextSize);
+        doUpdate();
+    }
+
+    /** Gets the current Typeface that is used to style the text. */
+    @Nullable
+    public Typeface getTypeface() {
+        return mTypeface;
+    }
+
+    /**
+     * Sets the typeface and style in which the text should be displayed. Note that not all
+     * Typeface families actually have bold and italic variants
+     */
+    public void setTypeface(@Nullable Typeface value) {
+        mTypeface = value;
+        doUpdate();
+    }
+
+    /** Returns the curved text layout direction */
+    public boolean isClockwise() {
+        return mClockwise;
+    }
+
+    /** Sets the curved text layout direction */
+    public void setClockwise(boolean value) {
+        mClockwise = value;
+        doUpdate();
+    }
+
+    /** Returns the color for rendering the text */
+    @ColorInt
+    public int getTextColor() {
+        return mTextColor;
+    }
+
+    /** Sets the color for rendering the text */
+    public void setTextColor(@ColorInt int value) {
+        mTextColor = value;
+        doRedraw();
+    }
+
+    /**
+     * Returns where, if anywhere, words that are longer than the view is wide should be
+     * ellipsized.
+     */
+    @Nullable
+    public TextUtils.TruncateAt getEllipsize() {
+        return mEllipsize;
+    }
+
+    /**
+     * Causes words in the text that are longer than the view's width to be ellipsized. Use null
+     * to turn off ellipsizing.
+     */
+    public void setEllipsize(@Nullable TextUtils.TruncateAt value) {
+        mEllipsize = value;
+        doRedraw();
+    }
+
+    /**
+     * Gets the text letter-space value, which determines the spacing between characters. The
+     * value returned is in ems. Normally, this value is 0.0.
+     * @return The text letter-space value in ems.
+     */
+    public float getLetterSpacing() {
+        return mLetterSpacing;
+    }
+
+    /**
+     * Sets text letter-spacing in ems. Typical values for slight expansion will be around 0.05.
+     * Negative values tighten text.
+     * @param value A text letter-space value in ems.
+     */
+    public void setLetterSpacing(float value) {
+        mLetterSpacing = value;
+        doUpdate();
+    }
+
+    /**
+     * Returns the font feature settings. The format is the same as the CSS font-feature-settings
+     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     * @return The currently set font feature settings. Default is null.
+     */
+    @Nullable
+    public String getFontFeatureSettings() {
+        return mFontFeatureSettings;
+    }
+
+    /**
+     * Sets font feature settings. The format is the same as the CSS font-feature-settings
+     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
+     * @param value Font feature settings represented as CSS compatible string. This value may be
+     *             null.
+     */
+    public void setFontFeatureSettings(@Nullable String value) {
+        mFontFeatureSettings = value;
+        doUpdate();
+    }
+
+    /** Returns TrueType or OpenType font variation settings. */
+    @Nullable
+    public String getFontVariationSettings() {
+        return mFontVariationSettings;
+    }
+
+    /**
+     * Sets TrueType or OpenType font variation settings.
+     * @param value Font variation settings. You can pass null or empty string as no variation
+     *              settings. This value may be null
+     */
+    public void setFontVariationSettings(@Nullable String value) {
+        mFontVariationSettings = value;
+        doUpdate();
+    }
+
+    /**
+     * Nested class to avoid verification errors for methods induces in API level 26
+     */
+    @RequiresApi(26)
+    private static class Api26Impl {
+        private Api26Impl() {
+        }
+
+        static void paintSetFontVariationSettings(
+                Paint paint,
+                @Nullable String fontVariationSettings) {
+            paint.setFontVariationSettings(fontVariationSettings);
+        }
+    }
+
+    /**
+     * Nested class to avoid verification errors for methods induces in API level 28
+     */
+    @RequiresApi(28)
+    private static class Api28Impl {
+        private Api28Impl() {
+        }
+
+        static Typeface createTypeface(@Nullable Typeface family, int weight, boolean italic) {
+            return Typeface.create(family, weight, italic);
+        }
+    }
+
+}
diff --git a/wear/wear/src/main/java/androidx/wear/widget/WearArcLayout.java b/wear/wear/src/main/java/androidx/wear/widget/WearArcLayout.java
deleted file mode 100644
index 09b05bb..0000000
--- a/wear/wear/src/main/java/androidx/wear/widget/WearArcLayout.java
+++ /dev/null
@@ -1,772 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.widget;
-
-import static java.lang.Math.asin;
-import static java.lang.Math.max;
-import static java.lang.Math.round;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.UiThread;
-import androidx.wear.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-
-/**
- * Container which will lay its elements out on an arc. Elements will be relative to a given
- * anchor angle (where 0 degrees = 12 o clock), where the layout relative to the anchor angle is
- * controlled using {@code anchorAngleDegrees} and {@code anchorType}. The thickness of the arc is
- * calculated based on the child element with the greatest height (in the case of Android
- * widgets), or greatest thickness (for curved widgets). By default, the container lays its
- * children one by one in clockwise direction. The attribute 'clockwise' can be set to false to
- * make the layout direction as  anti-clockwise. These two types of widgets will be drawn as
- * follows.
- *
- * <p>Standard Android Widgets:
- *
- * <p>These widgets will be drawn as usual, but placed at the correct position on the arc, with
- * the correct amount of rotation applied. As an example, for an Android Text widget, the text
- * baseline would be drawn at a tangent to the arc. The arc length of a widget is obtained by
- * measuring the width of the widget, and transforming that to the length of an arc on a circle.
- *
- * <p>A standard Android widget will be measured as usual, but the maximum height constraint will be
- * capped at the minimum radius of the arc (i.e. width / 2).
- *
- * <p>"Curved" widgets:
- *
- * <p>Widgets which implement {@link ArcLayoutWidget} are expected to draw themselves within an arc
- * automatically. These widgets will be measured with the full dimensions of the arc container.
- * They are also expected to provide their thickness (used when calculating the thickness of the
- * arc) and the current sweep angle (used for laying out when drawing). Note that the
- * WearArcLayout will apply a rotation transform to the canvas before drawing this child; the
- * inner child need not perform any rotations itself.
- *
- * <p>An example of a widget which implements this interface is {@link WearCurvedTextView}, which
- * will lay itself out along the arc.
- */
-@UiThread
-public class WearArcLayout extends ViewGroup {
-
-    /**
-     * Interface for a widget which knows it is being rendered inside an arc, and will draw
-     * itself accordingly. Any widget implementing this interface will receive the full-sized
-     * canvas, pre-rotated, in its draw call.
-     */
-    public interface ArcLayoutWidget {
-
-        /** Returns the sweep angle that this widget is drawn with. */
-        float getSweepAngleDegrees();
-
-        /** Returns the thickness of this widget inside the arc. */
-        int getThicknessPx();
-
-        /**
-         * Check whether the widget contains invalid attributes as a child of WearArcLayout
-         */
-        void checkInvalidAttributeAsChild();
-
-        /**
-         * Return true when the given point is in the clickable area of the child widget.
-         * In particular, the coordinates should be considered as if the child was drawn
-         * centered at the default angle (12 o clock).
-         */
-        boolean insideClickArea(float x, float y);
-    }
-
-    /**
-     * Layout parameters for a widget added to an arc. This allows each element to specify
-     * whether or not it should be rotated(around the center of the child) when drawn inside the
-     * arc. For example, when the child is put at the center-bottom of the arc, whether the
-     * parent layout is responsible to rotate it 180 degree to draw it upside down.
-     *
-     * <p>Note that the {@code rotate} parameter is ignored when drawing "Fullscreen" elements.
-     */
-    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
-
-        /** Vertical alignment of elements within the arc. */
-        /** @hide */
-        @Retention(RetentionPolicy.SOURCE)
-        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-        @IntDef({VALIGN_OUTER, VALIGN_CENTER, VALIGN_INNER})
-        public @interface VerticalAlignment {
-        }
-
-        /** Align to the outer edge of the parent WearArcLayout. */
-        public static final int VALIGN_OUTER = 0;
-
-        /** Align to the center of the parent WearArcLayout. */
-        public static final int VALIGN_CENTER = 1;
-
-        /** Align to the inner edge of the parent WearArcLayout. */
-        public static final int VALIGN_INNER = 2;
-
-        private boolean mRotate = true;
-        @VerticalAlignment
-        private int mVerticalAlignment = VALIGN_CENTER;
-
-        // Internally used during layout/draw
-        // Stores the angle of the child, used to handle touch events.
-        float mMiddleAngle;
-
-        /**
-         * Creates a new set of layout parameters. The values are extracted from the supplied
-         * attributes set and context.
-         *
-         * @param context  the application environment
-         * @param attrs    the set of attributes from which to extract the layout parameters' values
-         */
-        public LayoutParams(@NonNull Context context, @Nullable AttributeSet attrs) {
-            super(context, attrs);
-
-            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.WearArcLayout_Layout);
-
-            mRotate = a.getBoolean(R.styleable.WearArcLayout_Layout_layout_rotate, true);
-            mVerticalAlignment =
-                    a.getInt(R.styleable.WearArcLayout_Layout_layout_valign, VALIGN_CENTER);
-
-            a.recycle();
-        }
-
-        /**
-         * Creates a new set of layout parameters with specified width and height
-         *
-         * @param width   the width, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
-         * @param height  the height, either WRAP_CONTENT, MATCH_PARENT or a fixed size in pixels
-         */
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        /** Copy constructor */
-        public LayoutParams(@NonNull ViewGroup.LayoutParams source) {
-            super(source);
-        }
-
-        /**
-         * Gets whether the widget shall be rotated by the WearArcLayout container corresponding
-         * to its layout position angle
-         */
-        public boolean getRotate() {
-            return mRotate;
-        }
-
-        /**
-         * Sets whether the widget shall be rotated by the WearArcLayout container corresponding
-         * to its layout position angle
-         */
-        public void setRotate(boolean rotate) {
-            mRotate = rotate;
-        }
-
-        /**
-         * Gets how the widget is positioned vertically in the WearArcLayout.
-         */
-        @VerticalAlignment
-        public int getVerticalAlignment() {
-            return mVerticalAlignment;
-        }
-
-        /**
-         * Sets how the widget is positioned vertically in the WearArcLayout.
-         * @param verticalAlignment align the widget to outer, inner edges or center.
-         */
-        public void setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
-            mVerticalAlignment = verticalAlignment;
-        }
-    }
-
-    /** Annotation for anchor types. */
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    @IntDef({ANCHOR_START, ANCHOR_CENTER, ANCHOR_END})
-    public @interface AnchorType {
-    }
-
-    /**
-     * Anchor at the start of the set of elements drawn within this container. This causes the first
-     * child to be drawn from {@code anchorAngle} degrees, to the right.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between 0-10 degrees, and the
-     * second between 10-30 degrees.
-     */
-    public static final int ANCHOR_START = 0;
-
-    /**
-     * Anchor at the center of the set of elements drawn within this container.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between -15 and -5 degrees, and the
-     * second between -5 and 15 degrees.
-     */
-    public static final int ANCHOR_CENTER = 1;
-
-    /**
-     * Anchor at the end of the set of elements drawn within this container. This causes the last
-     * element to end at {@code anchorAngle} degrees, with the other elements swept to the left.
-     *
-     * <p>As an example, if this container contains two arcs, one having 10 degrees of sweep and the
-     * other having 20 degrees of sweep, the first will be drawn between -30 and -20 degrees, and
-     * the second between -20 and 0 degrees.
-     */
-    public static final int ANCHOR_END = 2;
-
-    private static final float DEFAULT_START_ANGLE_DEGREES = 0f;
-    private static final boolean DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE = true; // clockwise
-    @AnchorType
-    private static final int DEFAULT_ANCHOR_TYPE = ANCHOR_START;
-
-    private int mThicknessPx = 0;
-
-    @AnchorType
-    private int mAnchorType;
-    private float mAnchorAngleDegrees;
-    private boolean mClockwise;
-
-    @SuppressWarnings("SyntheticAccessor")
-    private final ChildArcAngles mChildArcAngles = new ChildArcAngles();
-
-    public WearArcLayout(@NonNull Context context) {
-        this(context, null);
-    }
-
-    public WearArcLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public WearArcLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public WearArcLayout(
-            @NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-
-        TypedArray a =
-                context.obtainStyledAttributes(
-                        attrs, R.styleable.WearArcLayout, defStyleAttr, defStyleRes
-                );
-
-        mAnchorType = a.getInt(R.styleable.WearArcLayout_anchorPosition, DEFAULT_ANCHOR_TYPE);
-        mAnchorAngleDegrees =
-                a.getFloat(
-                        R.styleable.WearArcLayout_anchorAngleDegrees, DEFAULT_START_ANGLE_DEGREES
-                );
-        mClockwise = a.getBoolean(
-                R.styleable.WearArcLayout_clockwise, DEFAULT_LAYOUT_DIRECTION_IS_CLOCKWISE
-        );
-
-        a.recycle();
-    }
-
-    @Override
-    public void requestLayout() {
-        super.requestLayout();
-
-        for (int i = 0; i < getChildCount(); i++) {
-            getChildAt(i).forceLayout();
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        // Need to derive the thickness of the curve from the children. We're a curve, so the
-        // children can only be sized up to (width or height)/2 units. This currently only
-        // supports fitting to a circle.
-        //
-        // No matter what, fit to the given size, be it a maximum or a fixed size. It doesn't make
-        // sense for this container to wrap its children.
-        int actualWidthPx = MeasureSpec.getSize(widthMeasureSpec);
-        int actualHeightPx = MeasureSpec.getSize(heightMeasureSpec);
-
-        if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED
-                && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
-            // We can't actually resolve this.
-            // Let's fit to the screen dimensions, for need of anything better...
-            DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
-            actualWidthPx = displayMetrics.widthPixels;
-            actualHeightPx = displayMetrics.heightPixels;
-        }
-
-        // Fit to a square.
-        if (actualWidthPx < actualHeightPx) {
-            actualHeightPx = actualWidthPx;
-        } else if (actualHeightPx < actualWidthPx) {
-            actualWidthPx = actualHeightPx;
-        }
-
-        int maxChildDimension = actualHeightPx / 2;
-
-        // Measure all children in the new measurespec, and cache the largest.
-        int childMeasureSpec = MeasureSpec.makeMeasureSpec(maxChildDimension, MeasureSpec.AT_MOST);
-
-        // We need to do two measure passes. First, we need to measure all "normal" children, and
-        // get the thickness of all "CurvedContainer" children. Once we have that, we know the
-        // maximum thickness, and we can lay out the "CurvedContainer" children, taking into
-        // account their vertical alignment.
-        int maxChildHeightPx = 0;
-        int childState = 0;
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            // ArcLayoutWidget is a special case. Because of how it draws, fit it to the size
-            // of the whole widget.
-            int childMeasuredHeight;
-            if (child instanceof ArcLayoutWidget) {
-                childMeasuredHeight = ((ArcLayoutWidget) child).getThicknessPx();
-            } else {
-                measureChild(
-                        child,
-                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().width),
-                        getChildMeasureSpec(childMeasureSpec, 0, child.getLayoutParams().height)
-                );
-                childMeasuredHeight = child.getMeasuredHeight();
-                childState = combineMeasuredStates(childState, child.getMeasuredState());
-
-            }
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            maxChildHeightPx = max(maxChildHeightPx, childMeasuredHeight
-                    + childLayoutParams.topMargin +  childLayoutParams.bottomMargin);
-        }
-
-        mThicknessPx = maxChildHeightPx;
-
-        // And now do the pass for the ArcLayoutWidgets
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            if (child instanceof ArcLayoutWidget) {
-                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-
-                float insetPx = getChildTopInset(child);
-
-                int innerChildMeasureSpec =
-                        MeasureSpec.makeMeasureSpec(
-                                maxChildDimension * 2 - round(insetPx * 2), MeasureSpec.EXACTLY);
-
-                measureChild(
-                        child,
-                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.width),
-                        getChildMeasureSpec(innerChildMeasureSpec, 0, childLayoutParams.height)
-                );
-
-                childState = combineMeasuredStates(childState, child.getMeasuredState());
-            }
-        }
-
-        setMeasuredDimension(
-                resolveSizeAndState(actualWidthPx, widthMeasureSpec, childState),
-                resolveSizeAndState(actualHeightPx, heightMeasureSpec, childState));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            // Curved container widgets have been measured so that the "arc" inside their widget
-            // will touch the outside of the box they have been measured in, taking into account
-            // the vertical alignment. Just grow them from the center.
-            if (child instanceof ArcLayoutWidget) {
-                int leftPx =
-                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx =
-                        round((getMeasuredHeight() / 2f) - (child.getMeasuredHeight() / 2f));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight()
-                );
-            } else {
-                // Normal widgets need to be placed on their canvas, taking into account their
-                // vertical position.
-                // In terms of x axis, they are placed in the center of the screen, same as the
-                // center of the circle where all components lay.
-                // In terms of y axis, widget is placed on top of the circle (12 o'clock).
-                int leftPx =
-                        round((getMeasuredWidth() / 2f) - (child.getMeasuredWidth() / 2f));
-                int topPx = round(getChildTopInset(child));
-
-                child.layout(
-                        leftPx,
-                        topPx,
-                        leftPx + child.getMeasuredWidth(),
-                        topPx + child.getMeasuredHeight());
-            }
-        }
-
-        // Once dimensions are set, also layout the children in the arc, computing the
-        // center angle where they should be drawn.
-        float currentCumulativeAngle = calculateInitialRotation();
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            calculateArcAngle(child, mChildArcAngles);
-            float preRotation = mChildArcAngles.leftMarginAsAngle
-                    + mChildArcAngles.actualChildAngle / 2f;
-            float multiplier = mClockwise ? 1f : -1f;
-
-            float middleAngle = multiplier * (currentCumulativeAngle + preRotation);
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            childLayoutParams.mMiddleAngle = middleAngle;
-
-            currentCumulativeAngle += mChildArcAngles.getTotalAngle();
-        }
-    }
-
-    // When a view (that can handle it) receives a TOUCH_DOWN event, it will get all subsequent
-    // events until the touch is released, even if the pointer goes outside of it's bounds.
-    private View mTouchedView = null;
-
-    @Override
-    public boolean onInterceptTouchEvent(@NonNull MotionEvent event) {
-        if (mTouchedView == null && event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            for (int i = 0; i < getChildCount(); i++) {
-                View child = getChildAt(i);
-                // Ensure that the view is visible
-                if (child.getVisibility() != VISIBLE) {
-                    continue;
-                }
-
-                // Map the event to the child's coordinate system
-                LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-                float angle = childLayoutParams.mMiddleAngle;
-
-                float[] point = new float[]{event.getX(), event.getY()};
-                mapPoint(child, angle, point);
-
-                // Check if the click is actually in the child area
-                float x = point[0];
-                float y = point[1];
-
-                if (insideChildClickArea(child, x, y)) {
-                    mTouchedView = child;
-                    break;
-                }
-            }
-        }
-        // We can't do normal dispatching because it will capture touch in the original position
-        // of children.
-        return true;
-    }
-
-    private static boolean insideChildClickArea(View child, float x, float y) {
-        if (child instanceof ArcLayoutWidget) {
-            return ((ArcLayoutWidget) child).insideClickArea(x, y);
-        }
-        return x >= 0 && x < child.getMeasuredWidth() && y >= 0 && y < child.getMeasuredHeight();
-    }
-
-    // Map a point to local child coordinates.
-    private void mapPoint(View child, float angle, float[] point) {
-        float cx = getMeasuredWidth() / 2;
-        float cy = getMeasuredHeight() / 2;
-
-        Matrix m = new Matrix();
-        m.postRotate(-angle, cx, cy);
-        m.postTranslate(-child.getX(), -child.getY());
-        if (!(child instanceof  ArcLayoutWidget)) {
-            LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-            if (!childLayoutParams.getRotate()) {
-                m.postRotate(angle, child.getWidth() / 2, child.getHeight() / 2);
-            }
-        }
-        m.mapPoints(point);
-    }
-
-    @Override
-    @SuppressLint("ClickableViewAccessibility")
-    public boolean onTouchEvent(@NonNull MotionEvent event) {
-        if (mTouchedView != null) {
-            // Map the event's coordinates to the child's coordinate space
-            float[] point = new float[]{event.getX(), event.getY()};
-            LayoutParams touchedViewLayoutParams = (LayoutParams) mTouchedView.getLayoutParams();
-            mapPoint(mTouchedView, touchedViewLayoutParams.mMiddleAngle, point);
-
-            float dx = point[0] - event.getX();
-            float dy = point[1] - event.getY();
-            event.offsetLocation(dx, dy);
-
-            mTouchedView.dispatchTouchEvent(event);
-
-            if (event.getActionMasked() == MotionEvent.ACTION_UP
-                    || event.getActionMasked() == MotionEvent.ACTION_CANCEL) {
-                // We have finished handling these series of events.
-                mTouchedView = null;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean drawChild(@NonNull Canvas canvas, @NonNull View child, long drawingTime) {
-        // Rotate the canvas to make the children render in the right place.
-        canvas.save();
-
-        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-        float middleAngle = childLayoutParams.mMiddleAngle;
-
-        // Rotate the child widget. This rotation places child widget in its correct place in the
-        // circle. Rotation is done around the center of the circle that components make. Canvas
-        // does this at the end, when all (if any) rotations are done.
-        canvas.rotate(
-                middleAngle,
-                getMeasuredWidth() / 2f,
-                getMeasuredHeight() / 2f);
-
-        if (child instanceof ArcLayoutWidget) {
-            ((ArcLayoutWidget) child).checkInvalidAttributeAsChild();
-        } else {
-            // Do we need to do some counter rotation?
-            LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
-
-            float angleToRotate = 0f;
-
-            if (layoutParams.getRotate()) {
-                // For counterclockwise layout, especially when mixing standard Android widget with
-                // ArcLayoutWidget as children, we might need to rotate the standard widget to make
-                // them have the same upwards direction.
-                if (!mClockwise) {
-                    angleToRotate = 180f;
-                }
-            } else {
-                // Un-rotate about the top of the canvas, around the center of the actual child.
-                // This compounds with the initial rotation into a translation.
-                angleToRotate = -middleAngle;
-            }
-
-            // Do the actual rotation. This rotation is done in place around the center of the
-            // child to adjust it based on rotation and clockwise attributes.
-            // Actual position of this component here is still at the
-            // top of the circle (12 o'clock), meaning that the strange rotation center is
-            // because the child view is x-centered but at the top of this container. Additional
-            // offset is added for vertical rectangular screens as for them the start of an arc
-            // is lower then usual.
-            float childInset = getChildTopInset(child);
-            canvas.rotate(
-                    angleToRotate,
-                    getMeasuredWidth() / 2f,
-                    child.getMeasuredHeight() / 2f + childInset
-            );
-        }
-        boolean wasInvalidateIssued = super.drawChild(canvas, child, drawingTime);
-
-        canvas.restore();
-
-        return wasInvalidateIssued;
-    }
-
-    private float calculateInitialRotation() {
-        float multiplier = mClockwise ? 1f : -1f;
-        if (mAnchorType == ANCHOR_START) {
-            return multiplier * mAnchorAngleDegrees;
-        }
-
-        float totalArcAngle = 0;
-
-        for (int i = 0; i < getChildCount(); i++) {
-            calculateArcAngle(getChildAt(i), mChildArcAngles);
-            totalArcAngle += mChildArcAngles.getTotalAngle();
-        }
-
-        if (mAnchorType == ANCHOR_CENTER) {
-            return multiplier * mAnchorAngleDegrees - (totalArcAngle / 2f);
-        } else if (mAnchorType == ANCHOR_END) {
-            return multiplier * mAnchorAngleDegrees - totalArcAngle;
-        }
-
-        return 0;
-    }
-
-    private static float widthToAngleDegrees(float widthPx, float radiusPx) {
-        return (float) Math.toDegrees(2 * asin(widthPx / radiusPx / 2f));
-    }
-
-    private void calculateArcAngle(@NonNull View view, @NonNull ChildArcAngles childAngles) {
-        if (view.getVisibility() == GONE) {
-            childAngles.leftMarginAsAngle = 0;
-            childAngles.rightMarginAsAngle = 0;
-            childAngles.actualChildAngle = 0;
-            return;
-        }
-
-        float radiusPx = (getMeasuredWidth() / 2f) - mThicknessPx;
-
-        LayoutParams childLayoutParams = (LayoutParams) view.getLayoutParams();
-
-        childAngles.leftMarginAsAngle =
-                widthToAngleDegrees(childLayoutParams.leftMargin, radiusPx);
-        childAngles.rightMarginAsAngle =
-                widthToAngleDegrees(childLayoutParams.rightMargin, radiusPx);
-
-        if (view instanceof ArcLayoutWidget) {
-            childAngles.actualChildAngle = ((ArcLayoutWidget) view).getSweepAngleDegrees();
-        } else {
-            childAngles.actualChildAngle =
-                    widthToAngleDegrees(view.getMeasuredWidth(), radiusPx);
-        }
-    }
-
-    private float getChildTopInset(@NonNull View child) {
-        LayoutParams childLayoutParams = (LayoutParams) child.getLayoutParams();
-
-        int childHeight = child instanceof ArcLayoutWidget
-                ? ((ArcLayoutWidget) child).getThicknessPx()
-                : child.getMeasuredHeight();
-
-        int thicknessDiffPx =
-                mThicknessPx - childLayoutParams.topMargin - childLayoutParams.bottomMargin
-                        - childHeight;
-
-        int margin = mClockwise ? childLayoutParams.topMargin : childLayoutParams.bottomMargin;
-        float topInset = margin + getChildTopOffset(child);
-
-        switch (childLayoutParams.getVerticalAlignment()) {
-            case LayoutParams.VALIGN_OUTER:
-                return topInset;
-            case LayoutParams.VALIGN_CENTER:
-                return topInset + thicknessDiffPx / 2f;
-            case LayoutParams.VALIGN_INNER:
-                return topInset + thicknessDiffPx;
-            default:
-                // Normally unreachable...
-                return 0;
-        }
-    }
-
-    /**
-     * For vertical rectangular screens, additional offset needs to be taken into the account for
-     * y position of normal widget in order to be in the correct place in the circle.
-     */
-    private float getChildTopOffset(View child) {
-        if (child instanceof ArcLayoutWidget || getMeasuredWidth() >= getMeasuredHeight()) {
-            return 0;
-        }
-        return round((getMeasuredHeight() - getMeasuredWidth()) / 2f);
-    }
-
-    @Override
-    protected boolean checkLayoutParams(@NonNull ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams;
-    }
-
-    @Override
-    @NonNull
-    protected ViewGroup.LayoutParams generateLayoutParams(@NonNull ViewGroup.LayoutParams p) {
-        return new LayoutParams(p);
-    }
-
-    @Override
-    @NonNull
-    public ViewGroup.LayoutParams generateLayoutParams(@NonNull AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    @NonNull
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
-    }
-
-    /** Returns the anchor type used for this container. */
-    @AnchorType
-    public int getAnchorType() {
-        return mAnchorType;
-    }
-
-    /** Sets the anchor type used for this container. */
-    public void setAnchorType(@AnchorType int anchorType) {
-        if (anchorType < ANCHOR_START || anchorType > ANCHOR_END) {
-            throw new IllegalArgumentException("Unknown anchor type");
-        }
-
-        mAnchorType = anchorType;
-        invalidate();
-    }
-
-    /** Returns the anchor angle used for this container, in degrees. */
-    public float getAnchorAngleDegrees() {
-        return mAnchorAngleDegrees;
-    }
-
-    /** Sets the anchor angle used for this container, in degrees. */
-    public void setAnchorAngleDegrees(float anchorAngleDegrees) {
-        mAnchorAngleDegrees = anchorAngleDegrees;
-        invalidate();
-    }
-
-    /** returns the layout direction */
-    public boolean getClockwise() {
-        return mClockwise;
-    }
-
-    /** Sets the layout direction */
-    public void setClockwise(boolean clockwise) {
-        mClockwise = clockwise;
-        invalidate();
-    }
-
-    private static class ChildArcAngles {
-        public float leftMarginAsAngle;
-        public float rightMarginAsAngle;
-        public float actualChildAngle;
-
-        public float getTotalAngle() {
-            return leftMarginAsAngle + rightMarginAsAngle + actualChildAngle;
-        }
-    }
-}
diff --git a/wear/wear/src/main/java/androidx/wear/widget/WearCurvedTextView.java b/wear/wear/src/main/java/androidx/wear/widget/WearCurvedTextView.java
deleted file mode 100644
index b2e659e..0000000
--- a/wear/wear/src/main/java/androidx/wear/widget/WearCurvedTextView.java
+++ /dev/null
@@ -1,928 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.widget;
-
-import static java.lang.Math.cos;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-import static java.lang.Math.round;
-import static java.lang.Math.sin;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.os.Build;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.wear.R;
-
-/**
- * A WearCurvedTextView is a component allowing developers to easily write curved text following
- * the curvature of the largest circle that can be inscribed in the view. WearArcLayout could be
- * used to concatenate multiple curved texts, also layout together with other widgets such as icons.
- */
-public class WearCurvedTextView extends View implements WearArcLayout.ArcLayoutWidget {
-    private static final float UNSET_ANCHOR_DEGREE = -1f;
-    private static final int UNSET_ANCHOR_TYPE = -1;
-    private static final float MIN_SWEEP_DEGREE = 0f;
-    private static final float MAX_SWEEP_DEGREE = 359.9f;
-    private static final float DEFAULT_TEXT_SIZE = 24f;
-    @ColorInt
-    private static final int DEFAULT_TEXT_COLOR = Color.WHITE;
-    private static final int DEFAULT_TEXT_STYLE = Typeface.NORMAL;
-    private static final boolean DEFAULT_CLOCKWISE = true;
-    private static final int FONT_WEIGHT_MAX = 1000;
-    private static final float ITALIC_SKEW_X = -0.25f;
-    // make 0 degree at 12 o'clock, since canvas assumes 0 degree is 3 o'clock
-    private static final float ANCHOR_DEGREE_OFFSET = -90f;
-
-    private final Path mPath = new Path();
-    private final Path mBgPath = new Path();
-    private final TextPaint mPaint = new TextPaint();
-    private final Rect mBounds = new Rect();
-    private final Rect mBgBounds = new Rect();
-    private boolean mDirty = true;
-    private String mTextToDraw = "";
-    private float mPathRadius = 0f;
-    private float mTextSweepDegrees = 0f;
-    private float mBackgroundSweepDegrees = MAX_SWEEP_DEGREE;
-    private int mLastUsedTextAlignment = -1;
-    private float mLocalRotateAngle = 0f;
-
-    private int mAnchorType = UNSET_ANCHOR_TYPE;
-    private float mAnchorAngleDegrees = UNSET_ANCHOR_DEGREE;
-    private float mMinSweepDegrees = MIN_SWEEP_DEGREE;
-    private float mMaxSweepDegrees = MAX_SWEEP_DEGREE;
-    private String mText = "";
-    private float mTextSize = DEFAULT_TEXT_SIZE;
-    @Nullable
-    private Typeface mTypeface = null;
-    private boolean mClockwise = DEFAULT_CLOCKWISE;
-    @ColorInt
-    private int mTextColor = DEFAULT_TEXT_COLOR;
-    @Nullable
-    private TextUtils.TruncateAt mEllipsize = null;
-    private float mLetterSpacing = 0f;
-    @Nullable
-    private String mFontFeatureSettings = null;
-    @Nullable
-    private String mFontVariationSettings = null;
-
-    // If true, it means we got the touch_down event and are receiving the touch events that follow.
-    private boolean mHandlingTouch = false;
-
-
-    public WearCurvedTextView(@NonNull Context context) {
-        this(context, null);
-    }
-
-    public WearCurvedTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, android.R.attr.textViewStyle);
-    }
-
-    public WearCurvedTextView(
-            @NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyle) {
-        this(context, attrs, defStyle, 0);
-    }
-
-    public WearCurvedTextView(
-            @NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyle,
-            int defStyleRes) {
-        super(context, attrs, defStyle, defStyleRes);
-
-        mPaint.setAntiAlias(true);
-
-        TextAppearanceAttributes attributes = new TextAppearanceAttributes();
-        attributes.mTextColor = ColorStateList.valueOf(DEFAULT_TEXT_COLOR);
-
-        final Resources.Theme theme = context.getTheme();
-        TypedArray a = theme.obtainStyledAttributes(
-                attrs, R.styleable.TextViewAppearance, defStyle, defStyleRes);
-
-        TypedArray appearance = null;
-        int ap = a.getResourceId(R.styleable.TextViewAppearance_android_textAppearance, -1);
-        a.recycle();
-
-        if (ap != -1) {
-            appearance = theme.obtainStyledAttributes(ap, R.styleable.TextAppearance);
-        }
-        if (appearance != null) {
-            readTextAppearance(appearance, attributes, true);
-            appearance.recycle();
-        }
-
-        a = context.obtainStyledAttributes(
-                attrs, R.styleable.WearCurvedTextView, defStyle, defStyleRes);
-        // overrride the value in the appearance with explicitly specified attribute values
-        readTextAppearance(a, attributes, false);
-
-        // read the other supported TextView attributes
-        if (a.hasValue(R.styleable.WearCurvedTextView_android_text)) {
-            mText = a.getString(R.styleable.WearCurvedTextView_android_text);
-        }
-
-        int textEllipsize = a.getInt(R.styleable.WearCurvedTextView_android_ellipsize, 0);
-        switch (textEllipsize) {
-            case 1:
-                mEllipsize = TextUtils.TruncateAt.START;
-                break;
-            case 2:
-                mEllipsize = TextUtils.TruncateAt.MIDDLE;
-                break;
-            case 3:
-                mEllipsize = TextUtils.TruncateAt.END;
-                break;
-            default:
-                mEllipsize = null;
-        }
-
-        // read the custom WearCurvedTextView attributes
-        mMaxSweepDegrees =
-                a.getFloat(R.styleable.WearCurvedTextView_maxSweepDegrees, MAX_SWEEP_DEGREE);
-        mMaxSweepDegrees = min(mMaxSweepDegrees, MAX_SWEEP_DEGREE);
-        mMinSweepDegrees =
-                a.getFloat(R.styleable.WearCurvedTextView_minSweepDegrees, MIN_SWEEP_DEGREE);
-        if (mMinSweepDegrees > mMaxSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MinSweepDegrees cannot be bigger than MaxSweepDegrees"
-            );
-        }
-        mAnchorType = a.getInt(R.styleable.WearCurvedTextView_anchorPosition, UNSET_ANCHOR_TYPE);
-        mAnchorAngleDegrees = a.getFloat(
-                R.styleable.WearCurvedTextView_anchorAngleDegrees, UNSET_ANCHOR_DEGREE
-        );
-        mAnchorAngleDegrees = mAnchorAngleDegrees % 360f;
-        mClockwise = a.getBoolean(R.styleable.WearCurvedTextView_clockwise, DEFAULT_CLOCKWISE);
-
-        a.recycle();
-
-        applyTextAppearance(attributes);
-
-        mPaint.setTextSize(mTextSize);
-    }
-
-    @Override
-    public float getSweepAngleDegrees() {
-        return mBackgroundSweepDegrees;
-    }
-
-    @Override
-    public int getThicknessPx() {
-        return round(mPaint.getFontMetrics().descent - mPaint.getFontMetrics().ascent);
-    }
-
-    /**
-     * @throws IllegalArgumentException if the anchorType and/or anchorAngleDegrees attributes
-     *                                  were set for a widget in WearArcLayout
-     */
-    @Override
-    public void checkInvalidAttributeAsChild() {
-        if (mAnchorType != UNSET_ANCHOR_TYPE) {
-            throw new IllegalArgumentException(
-                    "WearCurvedTextView shall not set anchorType value when added into"
-                            + "WearArcLayout"
-            );
-        }
-
-        if (mAnchorAngleDegrees != UNSET_ANCHOR_DEGREE) {
-            throw new IllegalArgumentException(
-                    "WearCurvedTextView shall not set anchorAngleDegrees value when added into "
-                            + "WearArcLayout"
-            );
-        }
-    }
-
-    @Override
-    public boolean insideClickArea(float x, float y) {
-        float radius2 = min(getWidth(), getHeight()) / 2f
-                - (mClockwise ? getPaddingTop() : getPaddingBottom());
-        float radius1 =
-                radius2 - mPaint.getFontMetrics().descent + mPaint.getFontMetrics().ascent;
-
-        float dx = x - getWidth() / 2;
-        float dy = y - getHeight() / 2;
-
-        float r2 = dx * dx + dy * dy;
-        if (r2 < radius1 * radius1 || r2 > radius2 * radius2) {
-            return false;
-        }
-
-        // Since we are symmetrical on the Y-axis, we can constrain the angle to the x>=0 quadrants.
-        float angle = (float) Math.toDegrees(Math.atan2(Math.abs(dx), -dy));
-        return angle < mBackgroundSweepDegrees / 2;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        doUpdate();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-
-        mPaint.getTextBounds(mText, 0, mText.length(), mBounds);
-
-        // Note that ascent is negative.
-        mPathRadius = min(getWidth(), getHeight()) / 2f
-                + (mClockwise ? mPaint.getFontMetrics().ascent - getPaddingTop() :
-                -mPaint.getFontMetrics().descent - getPaddingBottom());
-        mTextSweepDegrees = min(
-                getWidthSelf() / mPathRadius / (float) Math.PI * 180f,
-                MAX_SWEEP_DEGREE);
-        mBackgroundSweepDegrees = max(min(mMaxSweepDegrees, mTextSweepDegrees), mMinSweepDegrees);
-    }
-
-    private float getWidthSelf() {
-        return (float) mBounds.width() + getPaddingLeft() + getPaddingRight();
-    }
-
-    private String ellipsize(int ellipsizedWidth) {
-        StaticLayout.Builder layoutBuilder =
-                StaticLayout.Builder.obtain(mText, 0, mText.length(), mPaint, ellipsizedWidth);
-        layoutBuilder.setEllipsize(mEllipsize);
-        layoutBuilder.setMaxLines(1);
-        StaticLayout layout = layoutBuilder.build();
-
-        // Cut text that it's too big even if no ellipsize mode is provided.
-        if (mEllipsize == null) {
-            return mText.substring(0, layout.getLineEnd(0));
-        }
-
-        int ellipsisCount = layout.getEllipsisCount(0);
-        if (ellipsisCount == 0) {
-            return mText;
-        }
-
-        int ellipsisStart = layout.getEllipsisStart(0);
-        char[] textToDrawArray = mText.toCharArray();
-        textToDrawArray[ellipsisStart] = '\u2026'; // ellipsis "..."
-        for (int i = ellipsisStart + 1; i < ellipsisStart + ellipsisCount; i++) {
-            if (i >= 0 && i < mText.length()) {
-                textToDrawArray[i] = '\uFEFF'; // 0-width space
-            }
-        }
-        return new String(textToDrawArray);
-    }
-
-    private void updatePathsIfNeeded(boolean withBackground) {
-        // The dirty flag is not set when properties we inherit from View are modified
-        if (!mDirty && ((int) getTextAlignment() == mLastUsedTextAlignment)) {
-            return;
-        }
-
-        mDirty = false;
-        mLastUsedTextAlignment = (int) getTextAlignment();
-
-        if (mTextSweepDegrees <= mMaxSweepDegrees) {
-            mTextToDraw = mText;
-        } else {
-            mTextToDraw = ellipsize(
-                    (int) (mMaxSweepDegrees / 180f * Math.PI * mPathRadius) - getPaddingLeft()
-                            - getPaddingRight()
-            );
-            mTextSweepDegrees = mMaxSweepDegrees;
-        }
-
-        float clockwiseFactor = mClockwise ? 1f : -1f;
-
-        float alignmentFactor = 0.5f;
-        switch (getTextAlignment()) {
-            case TEXT_ALIGNMENT_TEXT_START:
-            case TEXT_ALIGNMENT_VIEW_START:
-                alignmentFactor = 0f;
-                break;
-            case TEXT_ALIGNMENT_TEXT_END:
-            case TEXT_ALIGNMENT_VIEW_END:
-                alignmentFactor = 1f;
-                break;
-            default:
-                alignmentFactor = 0.5f; // TEXT_ALIGNMENT_CENTER
-        }
-
-        float anchorTypeFactor;
-        switch (mAnchorType) {
-            case WearArcLayout.ANCHOR_START:
-                anchorTypeFactor = 0.5f;
-                break;
-            case WearArcLayout.ANCHOR_END:
-                anchorTypeFactor = -0.5f;
-                break;
-            case WearArcLayout.ANCHOR_CENTER: // Center is the default.
-            default:
-                anchorTypeFactor = 0f;
-        }
-
-        mLocalRotateAngle = (mAnchorAngleDegrees == UNSET_ANCHOR_DEGREE ? 0f : mAnchorAngleDegrees)
-                + clockwiseFactor * anchorTypeFactor * mBackgroundSweepDegrees;
-
-        // Always draw the curved text on top center, then rotate the canvas to the right position
-        float backgroundStartAngle =
-                -clockwiseFactor * 0.5f * mBackgroundSweepDegrees + ANCHOR_DEGREE_OFFSET;
-
-        float textStartAngle =
-                backgroundStartAngle + clockwiseFactor * (float) (
-                        alignmentFactor * (mBackgroundSweepDegrees - mTextSweepDegrees)
-                                + getPaddingLeft() / mPathRadius / Math.PI * 180);
-
-        float centerX = getWidth() / 2f;
-        float centerY = getHeight() / 2f;
-        mPath.reset();
-        mPath.addArc(
-                centerX - mPathRadius,
-                centerY - mPathRadius,
-                centerX + mPathRadius,
-                centerY + mPathRadius,
-                textStartAngle,
-                clockwiseFactor * mTextSweepDegrees
-        );
-
-        if (withBackground) {
-            mBgPath.reset();
-            // NOTE: Ensure that if the code to compute these radius* change, containsPoint() is
-            // also updated.
-            float radius1 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().descent;
-            float radius2 = mPathRadius - clockwiseFactor * mPaint.getFontMetrics().ascent;
-            mBgPath.arcTo(
-                    centerX - radius2,
-                    centerY - radius2,
-                    centerX + radius2,
-                    centerY + radius2,
-                    backgroundStartAngle,
-                    clockwiseFactor * mBackgroundSweepDegrees, false
-            );
-            mBgPath.arcTo(
-                    centerX - radius1,
-                    centerY - radius1,
-                    centerX + radius1,
-                    centerY + radius1,
-                    backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees,
-                    -clockwiseFactor * mBackgroundSweepDegrees, false
-            );
-            mBgPath.close();
-
-            float angle = backgroundStartAngle;
-            float x0 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
-            float x1 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
-            float y0 = (float) (centerX + radius2 * sin(angle * Math.PI / 180));
-            float y1 = (float) (centerX + radius1 * sin(angle * Math.PI / 180));
-            angle = backgroundStartAngle + clockwiseFactor * mBackgroundSweepDegrees;
-            float x2 = (float) (centerX + radius2 * cos(angle * Math.PI / 180));
-            float x3 = (float) (centerX + radius1 * cos(angle * Math.PI / 180));
-            // Background axis-aligned bounding box calculation. Note that, we always center the
-            // text on the top-center of the view.
-            // top: always will be centerY - outerRadius
-            // bottom: the max y of end points of the outer and inner arc contains the text
-            // left: if over -90 degrees, centerX - outerRadius, otherwise the min x of start,
-            // end points of the outer and inner arc contains the text
-            // right: if over 90 degrees, centerX + outerRadius, otherwise the max x of start,
-            // end points of the outer and inner arc contains the text
-            float outerRadius = max(radius1, radius2);
-            mBgBounds.top = (int) (centerY - outerRadius);
-            mBgBounds.bottom = (int) max(y0, y1);
-            mBgBounds.left =
-                    mBackgroundSweepDegrees >= 180.0f
-                            ? (int) (centerX - outerRadius)
-                            : (int) min(x0, min(x1, min(x2, x3)));
-            mBgBounds.right =
-                    mBackgroundSweepDegrees >= 180.0f
-                            ? (int) (centerX + outerRadius)
-                            : (int) max(x0, max(x1, max(x2, x3)));
-        }
-    }
-
-    @Override
-    // We only filter events and defer to super.onTouchEvent()
-    @SuppressLint("ClickableViewAccessibility")
-    public boolean onTouchEvent(@NonNull MotionEvent event) {
-        if (!mHandlingTouch && event.getAction() != MotionEvent.ACTION_DOWN) {
-            return false;
-        }
-
-        float x0 = event.getX() - getWidth() / 2;
-        float y0 = event.getY() - getHeight() / 2;
-
-        double rotAngle = -Math.toRadians(mLocalRotateAngle);
-
-        float tempX = (float)
-                ((x0 * cos(rotAngle) - y0 * sin(rotAngle)) + getWidth() / 2);
-        y0 = (float) ((x0 * sin(rotAngle) + y0 * cos(rotAngle)) + getHeight() / 2);
-        x0 = tempX;
-
-        // Should we start handling the touch events?
-        if (!mHandlingTouch && insideClickArea(x0, y0)) {
-            mHandlingTouch = true;
-        }
-
-        // We just started or are in the middle of handling events, forward to View to handle.
-        if (mHandlingTouch) {
-            if (event.getAction() == MotionEvent.ACTION_UP
-                    || event.getAction() == MotionEvent.ACTION_CANCEL) {
-                // We should end handling events now
-                mHandlingTouch = false;
-            }
-            event.offsetLocation(x0 - event.getX(), y0 - event.getY());
-            return super.onTouchEvent(event);
-        }
-
-        return false;
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        canvas.save();
-
-        boolean withBackground = getBackground() != null;
-        updatePathsIfNeeded(withBackground);
-        canvas.rotate(
-                mLocalRotateAngle,
-                getWidth() / 2f,
-                getHeight() / 2f);
-
-        if (withBackground) {
-            canvas.clipPath(mBgPath);
-            getBackground().setBounds(mBgBounds);
-        }
-        super.draw(canvas);
-
-        canvas.restore();
-    }
-
-    @Override
-    protected void onDraw(@NonNull Canvas canvas) {
-        mPaint.setColor(mTextColor);
-        mPaint.setStyle(Paint.Style.FILL);
-        canvas.drawTextOnPath(mTextToDraw, mPath, 0f, 0f, mPaint);
-    }
-
-    /**
-     * Sets the Typeface taking into account the given attributes.
-     *
-     * @param familyName    family name string, e.g. "serif"
-     * @param typefaceIndex an index of the typeface enum, e.g. SANS, SERIF.
-     * @param style         a typeface style
-     * @param weight        a weight value for the Typeface or -1 if not specified.
-     */
-    private void setTypefaceFromAttrs(
-            @Nullable String familyName,
-            int typefaceIndex,
-            int style,
-            int weight
-    ) {
-        // typeface is ignored when font family is set
-        if (mTypeface == null && familyName != null) {
-            // Lookup normal Typeface from system font map.
-            Typeface normalTypeface = Typeface.create(familyName, Typeface.NORMAL);
-            resolveStyleAndSetTypeface(normalTypeface, style, weight);
-        } else if (mTypeface != null) {
-            resolveStyleAndSetTypeface(mTypeface, style, weight);
-        } else { // both typeface and familyName is null.
-            switch (typefaceIndex) {
-                case 1:
-                    resolveStyleAndSetTypeface(Typeface.SANS_SERIF, style, weight);
-                    break;
-                case 2:
-                    resolveStyleAndSetTypeface(Typeface.SERIF, style, weight);
-                    break;
-                case 3:
-                    resolveStyleAndSetTypeface(Typeface.MONOSPACE, style, weight);
-                    break;
-                default:
-                    resolveStyleAndSetTypeface(null, style, weight);
-            }
-        }
-    }
-
-    private void resolveStyleAndSetTypeface(@Nullable Typeface tf, int style, int weight) {
-        if (weight >= 0 && Build.VERSION.SDK_INT >= 28) {
-            int clampedWeight = min(FONT_WEIGHT_MAX, weight);
-            boolean italic = (style & Typeface.ITALIC) != 0;
-            mTypeface = Api28Impl.createTypeface(tf, clampedWeight, italic);
-            mPaint.setTypeface(mTypeface);
-        } else {
-            setTypeface(tf, style);
-        }
-    }
-
-    /**
-     * Sets the typeface and style in which the text should be displayed, and turns on the fake
-     * bold and italic bits in the Paint if the Typeface that you provided does not have all the
-     * bits in the style that you specified.
-     */
-    private void setTypeface(@Nullable Typeface tf, int style) {
-        if (style > 0) {
-            if (tf == null) {
-                tf = Typeface.defaultFromStyle(style);
-            } else {
-                tf = Typeface.create(tf, style);
-            }
-            if (!tf.equals(mPaint.getTypeface())) {
-                mPaint.setTypeface(tf);
-                mTypeface = tf;
-            }
-            // now compute what (if any) algorithmic styling is needed
-            int typefaceStyle = tf != null ? tf.getStyle() : 0;
-            int need = style & ~typefaceStyle;
-            mPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
-            mPaint.setTextSkewX(((need & Typeface.ITALIC) != 0) ? ITALIC_SKEW_X : 0f);
-        } else {
-            mPaint.setFakeBoldText(false);
-            mPaint.setTextSkewX(0f);
-            if ((tf != null && !tf.equals(mPaint.getTypeface()))
-                    || (tf == null && mPaint.getTypeface() != null)) {
-                mPaint.setTypeface(tf);
-                mTypeface = tf;
-            }
-        }
-    }
-
-    /**
-     * Set of attribute that can be defined in a Text Appearance.
-     */
-    private static class TextAppearanceAttributes {
-        @Nullable
-        ColorStateList mTextColor = null;
-        float mTextSize = DEFAULT_TEXT_SIZE;
-        @Nullable
-        String mFontFamily = null;
-        boolean mFontFamilyExplicit = false;
-        int mTypefaceIndex = -1;
-        int mTextStyle = DEFAULT_TEXT_STYLE;
-        int mFontWeight = -1;
-        float mLetterSpacing = 0f;
-        @Nullable
-        String mFontFeatureSettings = null;
-        @Nullable
-        String mFontVariationSettings = null;
-
-        TextAppearanceAttributes() {
-        }
-    }
-
-    /**
-     * Sets the textColor, size, style, font etc from the specified TextAppearanceAttributes
-     */
-    private void applyTextAppearance(TextAppearanceAttributes attributes) {
-        if (attributes.mTextColor != null) {
-            mTextColor = attributes.mTextColor.getDefaultColor();
-        }
-
-        if (attributes.mTextSize != -1f) {
-            mTextSize = attributes.mTextSize;
-        }
-
-        setTypefaceFromAttrs(
-                attributes.mFontFamily,
-                attributes.mTypefaceIndex,
-                attributes.mTextStyle,
-                attributes.mFontWeight
-        );
-
-        mPaint.setLetterSpacing(attributes.mLetterSpacing);
-        mLetterSpacing = attributes.mLetterSpacing;
-        mPaint.setFontFeatureSettings(attributes.mFontFeatureSettings);
-        mFontFeatureSettings = attributes.mFontFeatureSettings;
-        if (Build.VERSION.SDK_INT >= 26) {
-            Api26Impl.paintSetFontVariationSettings(mPaint, attributes.mFontVariationSettings);
-        }
-        mFontVariationSettings = attributes.mFontVariationSettings;
-    }
-
-    /**
-     * Read the Text Appearance attributes from a given TypedArray and set its values to the
-     * given set. If the TypedArray contains a value that already set in the given attributes,
-     * that will be overridden.
-     */
-    private void readTextAppearance(
-            TypedArray appearance,
-            TextAppearanceAttributes attributes,
-            boolean isTextAppearance
-    ) {
-        int attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_textColor :
-                R.styleable.WearCurvedTextView_android_textColor;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mTextColor = appearance.getColorStateList(attrIndex);
-        }
-
-        attributes.mTextSize = appearance.getDimensionPixelSize(
-                isTextAppearance ? R.styleable.TextAppearance_android_textSize :
-                        R.styleable.WearCurvedTextView_android_textSize,
-                (int) attributes.mTextSize
-        );
-
-        attributes.mTextStyle = appearance.getInt(
-                isTextAppearance ? R.styleable.TextAppearance_android_textStyle :
-                        R.styleable.WearCurvedTextView_android_textStyle,
-                attributes.mTextStyle
-        );
-
-        // make sure that the typeface attribute is read before fontFamily attribute
-        attributes.mTypefaceIndex = appearance.getInt(
-                isTextAppearance ? R.styleable.TextAppearance_android_typeface :
-                        R.styleable.WearCurvedTextView_android_typeface,
-                attributes.mTypefaceIndex
-        );
-        if (attributes.mTypefaceIndex != -1 && !attributes.mFontFamilyExplicit) {
-            attributes.mFontFamily = null;
-        }
-
-        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontFamily :
-                R.styleable.WearCurvedTextView_android_fontFamily;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontFamily = appearance.getString(attrIndex);
-            attributes.mFontFamilyExplicit = !isTextAppearance;
-        }
-
-        attributes.mFontWeight = appearance.getInt(
-                isTextAppearance ? R.styleable.TextAppearance_android_textFontWeight :
-                        R.styleable.WearCurvedTextView_android_textFontWeight,
-                attributes.mFontWeight
-        );
-
-        attributes.mLetterSpacing = appearance.getFloat(
-                isTextAppearance ? R.styleable.TextAppearance_android_letterSpacing :
-                        R.styleable.WearCurvedTextView_android_letterSpacing,
-                attributes.mLetterSpacing
-        );
-
-        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontFeatureSettings :
-                R.styleable.WearCurvedTextView_android_fontFeatureSettings;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontFeatureSettings = appearance.getString(attrIndex);
-        }
-
-        attrIndex = isTextAppearance ? R.styleable.TextAppearance_android_fontVariationSettings :
-                R.styleable.WearCurvedTextView_android_fontVariationSettings;
-        if (appearance.hasValue(attrIndex)) {
-            attributes.mFontVariationSettings = appearance.getString(attrIndex);
-        }
-    }
-
-    private void doUpdate() {
-        mDirty = true;
-        requestLayout();
-        postInvalidate();
-    }
-
-    private void doRedraw() {
-        mDirty = true;
-        postInvalidate();
-    }
-
-    /** returns the anchor type for positioning the curved text */
-    public int getAnchorType() {
-        return mAnchorType;
-    }
-
-    /**
-     * Sets the anchor type for positioning the curved text.
-     * @param value the anchor type,  one of {ANCHOR_START, ANCHOR_CENTER, ANCHOR_END}
-     */
-    public void setAnchorType(@WearArcLayout.AnchorType int value) {
-        mAnchorType = value;
-        doUpdate();
-    }
-
-    /** Returns the anchor angle used for positioning the text, in degrees. */
-    public float getAnchorAngleDegrees() {
-        return mAnchorAngleDegrees;
-    }
-
-    /** Sets the anchor angle used for positioning the text, in degrees. */
-    public void setAnchorAngleDegrees(float value) {
-        mAnchorAngleDegrees = value;
-        doRedraw();
-    }
-
-    /** returns the maximum sweep angle in degrees for rendering the text */
-    public float getMaxSweepDegrees() {
-        return mMaxSweepDegrees;
-    }
-
-    /** sets the maximum sweep angle in degrees for rendering the text */
-    public void setMaxSweepDegrees(float value) {
-        if (value < mMinSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MaxSweepDegrees cannot be smaller than MinSweepDegrees"
-            );
-        }
-        mMaxSweepDegrees = min(value, MAX_SWEEP_DEGREE);
-        doUpdate();
-    }
-    /** returns the sweep angle in degrees for rendering the text */
-    public float getMinSweepDegrees() {
-        return mMinSweepDegrees;
-    }
-
-    /** sets the sweep angle in degrees for rendering the text */
-    public void setMinSweepDegrees(float value) {
-        if (value > mMaxSweepDegrees) {
-            throw new IllegalArgumentException(
-                    "MinSweepDegrees cannot be bigger than MaxSweepDegrees"
-            );
-        }
-        mMinSweepDegrees = value;
-        doUpdate();
-    }
-
-    /**  returns the text to be rendered */
-    @Nullable
-    public String getText() {
-        return mText;
-    }
-
-    /** sets the text to be rendered */
-    public void setText(@Nullable String value) {
-        mText = value == null ? "" : value;
-        doUpdate();
-    }
-
-    /** returns the text size for rendering the text */
-    public float getTextSize() {
-        return mTextSize;
-    }
-
-    /** sets the text size for rendering the text */
-    public void setTextSize(float value) {
-        mTextSize = value;
-        mPaint.setTextSize(mTextSize);
-        doUpdate();
-    }
-
-    /** Gets the current Typeface that is used to style the text. */
-    @Nullable
-    public Typeface getTypeface() {
-        return mTypeface;
-    }
-
-    /**
-     * Sets the typeface and style in which the text should be displayed. Note that not all
-     * Typeface families actually have bold and italic variants
-     */
-    public void setTypeface(@Nullable Typeface value) {
-        mTypeface = value;
-        doUpdate();
-    }
-
-    /** returns the curved text layout direction */
-    public boolean getClockwise() {
-        return mClockwise;
-    }
-
-    /** sets the curved text layout direction */
-    public void setClockwise(boolean value) {
-        mClockwise = value;
-        doUpdate();
-    }
-
-    /** returns the color for rendering the text */
-    @ColorInt
-    public int getTextColor() {
-        return mTextColor;
-    }
-
-    /** sets the color for rendering the text */
-    public void setTextColor(@ColorInt int value) {
-        mTextColor = value;
-        doRedraw();
-    }
-
-    /**
-     * Returns where, if anywhere, words that are longer than the view is wide should be
-     * ellipsized.
-     */
-    @Nullable
-    public TextUtils.TruncateAt getEllipsize() {
-        return mEllipsize;
-    }
-
-    /**
-     * Causes words in the text that are longer than the view's width to be ellipsized. Use null
-     * to turn off ellipsizing.
-     */
-    public void setEllipsize(@Nullable TextUtils.TruncateAt value) {
-        mEllipsize = value;
-        doRedraw();
-    }
-
-    /**
-     * Gets the text letter-space value, which determines the spacing between characters. The
-     * value returned is in ems. Normally, this value is 0.0.
-     * @return The text letter-space value in ems.
-     */
-    public float getLetterSpacing() {
-        return mLetterSpacing;
-    }
-
-    /**
-     * Sets text letter-spacing in ems. Typical values for slight expansion will be around 0.05.
-     * Negative values tighten text.
-     * @param value A text letter-space value in ems.
-     */
-    public void setLetterSpacing(float value) {
-        mLetterSpacing = value;
-        doUpdate();
-    }
-
-    /**
-     * Returns the font feature settings. The format is the same as the CSS font-feature-settings
-     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
-     * @return the currently set font feature settings. Default is null.
-     */
-    @Nullable
-    public String getFontFeatureSettings() {
-        return mFontFeatureSettings;
-    }
-
-    /**
-     * Sets font feature settings. The format is the same as the CSS font-feature-settings
-     * attribute: https://www.w3.org/TR/css-fonts-3/#font-feature-settings-prop
-     * @param value font feature settings represented as CSS compatible string. This value may be
-     *             null.
-     */
-    public void setFontFeatureSettings(@Nullable String value) {
-        mFontFeatureSettings = value;
-        doUpdate();
-    }
-
-    /** Returns TrueType or OpenType font variation settings. */
-    @Nullable
-    public String getFontVariationSettings() {
-        return mFontVariationSettings;
-    }
-
-    /**
-     * Sets TrueType or OpenType font variation settings.
-     * @param value font variation settings. You can pass null or empty string as no variation
-     *              settings. This value may be null
-     */
-    public void setFontVariationSettings(@Nullable String value) {
-        mFontVariationSettings = value;
-        doUpdate();
-    }
-
-    /**
-     * Nested class to avoid verification errors for methods induces in API level 26
-     */
-    @RequiresApi(26)
-    private static class Api26Impl {
-        private Api26Impl() {
-        }
-
-        static void paintSetFontVariationSettings(
-                Paint paint,
-                @Nullable String fontVariationSettings) {
-            paint.setFontVariationSettings(fontVariationSettings);
-        }
-    }
-
-    /**
-     * Nested class to avoid verification errors for methods induces in API level 28
-     */
-    @RequiresApi(28)
-    private static class Api28Impl {
-        private Api28Impl() {
-        }
-
-        static Typeface createTypeface(@Nullable Typeface family, int weight, boolean italic) {
-            return Typeface.create(family, weight, italic);
-        }
-    }
-
-}
diff --git a/wear/wear/src/main/res/values-hy/strings.xml b/wear/wear/src/main/res/values-hy/strings.xml
index 68b259b..c5fa5df 100644
--- a/wear/wear/src/main/res/values-hy/strings.xml
+++ b/wear/wear/src/main/res/values-hy/strings.xml
@@ -16,6 +16,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="ws_navigation_drawer_content_description" msgid="777117228299084604">"Նավարկման դարակ"</string>
+    <string name="ws_navigation_drawer_content_description" msgid="777117228299084604">"Նավիգացիայի դարակ"</string>
     <string name="ws_action_drawer_content_description" msgid="8863821639144537553">"Գործողությունների դարակ"</string>
 </resources>
diff --git a/wear/wear/src/main/res/values/attrs.xml b/wear/wear/src/main/res/values/attrs.xml
index 93a9515..5031503 100644
--- a/wear/wear/src/main/res/values/attrs.xml
+++ b/wear/wear/src/main/res/values/attrs.xml
@@ -220,7 +220,7 @@
 
     <attr name="clockwise" format="boolean"/>
 
-    <declare-styleable name="WearCurvedTextView">
+    <declare-styleable name="CurvedTextView">
         <!-- supported TextView attributes -->
         <attr name="android:text" />
         <attr name="android:textSize" />
@@ -268,7 +268,7 @@
         <attr name="android:textAppearance" />
     </declare-styleable>
 
-    <declare-styleable name="WearArcLayout_Layout">
+    <declare-styleable name="ArcLayout_Layout">
         <attr name="layout_rotate" format="boolean" />
         <attr name="layout_valign" format="enum">
             <enum name="outer" value="0" />
@@ -277,7 +277,7 @@
         </attr>
     </declare-styleable>
 
-    <declare-styleable name="WearArcLayout">
+    <declare-styleable name="ArcLayout">
         <attr name="anchorAngleDegrees"/>
         <attr name="anchorPosition"/>
         <attr name="clockwise" />
diff --git a/webkit/integration-tests/testapp/build.gradle b/webkit/integration-tests/testapp/build.gradle
index fe4acbc..4caa18a 100644
--- a/webkit/integration-tests/testapp/build.gradle
+++ b/webkit/integration-tests/testapp/build.gradle
@@ -32,13 +32,13 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(ESPRESSO_CORE, libs.exclude_for_espresso)
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CORE, excludes.espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB, excludes.espresso)
     androidTestImplementation(ESPRESSO_IDLING_RESOURCE)
-    androidTestImplementation(ESPRESSO_WEB, libs.exclude_for_espresso)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(ESPRESSO_WEB, excludes.espresso)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
     // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
 }
 
 rootProject.tasks.getByName("buildOnServer").dependsOn(project.path + ":assembleRelease")
diff --git a/webkit/integration-tests/testapp/lint-baseline.xml b/webkit/integration-tests/testapp/lint-baseline.xml
index e9359a9..62a1f07 100644
--- a/webkit/integration-tests/testapp/lint-baseline.xml
+++ b/webkit/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -8,7 +8,7 @@
         errorLine2="        ^">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="154"
+            line="141"
             column="9"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="        ^">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="160"
+            line="147"
             column="9"/>
     </issue>
 
@@ -30,13 +30,13 @@
         errorLine2="        ^">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="166"
+            line="153"
             column="9"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mUriIdlingResource.beginLoad(request.getUrl().toString());"
         errorLine2="                                                     ~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            WebResourceResponse response = mAssetLoader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                                                       ~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.AssetLoaderAjaxActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mUriIdlingResource.endLoad(request.getUrl().toString());"
         errorLine2="                                                   ~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.AssetLoaderInternalStorageActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.AssetLoaderInternalStorageActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mAssetLoader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                               ~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.AssetLoaderSimpleActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.AssetLoaderSimpleActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mAssetLoader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                               ~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.CustomInterstitialActivity.CustomInterstitialWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.CustomInterstitialActivity.CustomInterstitialWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            myIntent.putExtra(PopupInterstitialActivity.THREAT_URL, request.getUrl().toString());"
         errorLine2="                                                                            ~~~~~~">
         <location
@@ -101,19 +101,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.DocumentStartJavaScriptActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.DocumentStartJavaScriptActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mAssetLoader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                               ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/DocumentStartJavaScriptActivity.java"
-            line="70"
+            line="68"
             column="64"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.ErrorLoggingWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.ErrorLoggingWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            logErrors(request.getUrl().toString(), error.getErrorCode());"
         errorLine2="                              ~~~~~~">
         <location
@@ -123,19 +123,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.MenuListView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.MenuListView is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
         errorLine2="        ~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="48"
+            line="46"
             column="9"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.WebMessageListenerActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.WebMessageListenerActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return mAssetLoader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                               ~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class com.example.androidx.webkit.WebMessageListenerMaliciousWebsiteActivity.MyWebViewClient is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class com.example.androidx.webkit.WebMessageListenerMaliciousWebsiteActivity.MyWebViewClient is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                WebResourceResponse response = loader.shouldInterceptRequest(request.getUrl());"
         errorLine2="                                                                                     ~~~~~~">
         <location
@@ -157,39 +157,6 @@
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` method `allowlistSafeBrowsingTestSite` of class `AllowlistActivity` requires synthetic accessor"
-        errorLine1="                    allowlistSafeBrowsingTestSite(null);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/AllowlistActivity.java"
-            line="63"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `clearAllowlist` of class `AllowlistActivity` requires synthetic accessor"
-        errorLine1="                    clearAllowlist();"
-        errorLine2="                    ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/AllowlistActivity.java"
-            line="65"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAllowlistWebView` of class `AllowlistActivity` requires synthetic accessor"
-        errorLine1="                mAllowlistWebView.loadUrl(SafeBrowsingHelpers.TEST_SAFE_BROWSING_SITE);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/AllowlistActivity.java"
-            line="83"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` field `mUriIdlingResource` of class `AssetLoaderAjaxActivity` requires synthetic accessor"
         errorLine1="            if (mUriIdlingResource != null) {"
         errorLine2="                ~~~~~~~~~~~~~~~~~~">
@@ -421,35 +388,24 @@
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` field `mContext` of class `MenuListView` requires synthetic accessor"
-        errorLine1="                featureArrayAdapter.getItem(position).start(mContext);"
-        errorLine2="                                                            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="91"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` method `recreateWebView` of class `RendererTerminationActivity` requires synthetic accessor"
-        errorLine1="                            ((RendererTerminationActivity) getActivity())"
-        errorLine2="                            ^">
+        errorLine1="                                ((RendererTerminationActivity) getActivity()).recreateWebView())"
+        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="110"
-            column="29"/>
+            line="102"
+            column="33"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` method `terminateWebViewRenderer` of class `RendererTerminationActivity` requires synthetic accessor"
-        errorLine1="                            ((RendererTerminationActivity) getActivity())"
-        errorLine2="                            ^">
+        errorLine1="                                    ((RendererTerminationActivity) getActivity())"
+        errorLine2="                                    ^">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="136"
-            column="29"/>
+            line="126"
+            column="37"/>
     </issue>
 
     <issue
@@ -459,7 +415,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="151"
+            line="138"
             column="13"/>
     </issue>
 
@@ -470,7 +426,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="157"
+            line="144"
             column="13"/>
     </issue>
 
@@ -481,7 +437,7 @@
         errorLine2="            ~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="162"
+            line="149"
             column="13"/>
     </issue>
 
@@ -492,7 +448,7 @@
         errorLine2="            ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="163"
+            line="150"
             column="13"/>
     </issue>
 
@@ -503,7 +459,7 @@
         errorLine2="                ~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="216"
+            line="203"
             column="17"/>
     </issue>
 
@@ -514,7 +470,7 @@
         errorLine2="                ~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="217"
+            line="204"
             column="17"/>
     </issue>
 
@@ -525,7 +481,7 @@
         errorLine2="                ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="222"
+            line="209"
             column="17"/>
     </issue>
 
@@ -536,7 +492,7 @@
         errorLine2="                    ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="242"
+            line="229"
             column="21"/>
     </issue>
 
@@ -547,40 +503,18 @@
         errorLine2="                    ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="252"
+            line="239"
             column="21"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` method `setupLayout` of class `SafeBrowsingActivity` requires synthetic accessor"
-        errorLine1="                                setupLayout();"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java"
-            line="48"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `showSafeBrowsingRequirementsInBrowser` of class `SafeBrowsingActivity` requires synthetic accessor"
-        errorLine1="                                    showSafeBrowsingRequirementsInBrowser();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java"
-            line="54"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
         message="Access to `private` field `mInfo` of class `TracingControllerActivity` requires synthetic accessor"
         errorLine1="                                mInfo.setVisibility(View.VISIBLE);"
         errorLine2="                                ~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="96"
+            line="97"
             column="33"/>
     </issue>
 
@@ -591,7 +525,7 @@
         errorLine2="                                ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="97"
+            line="98"
             column="33"/>
     </issue>
 
@@ -602,7 +536,7 @@
         errorLine2="                                ~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="98"
+            line="99"
             column="33"/>
     </issue>
 
@@ -613,7 +547,7 @@
         errorLine2="                                                                                        ~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="99"
+            line="100"
             column="89"/>
     </issue>
 
@@ -624,7 +558,7 @@
         errorLine2="                                    ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="101"
+            line="102"
             column="37"/>
     </issue>
 
@@ -635,7 +569,7 @@
         errorLine2="                                    ~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/TracingControllerActivity.java"
-            line="103"
+            line="104"
             column="37"/>
     </issue>
 
@@ -668,7 +602,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/AllowlistActivity.java"
-            line="46"
+            line="44"
             column="29"/>
     </issue>
 
@@ -756,7 +690,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="34"
+            line="32"
             column="25"/>
     </issue>
 
@@ -767,7 +701,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="38"
+            line="36"
             column="25"/>
     </issue>
 
@@ -778,7 +712,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="38"
+            line="36"
             column="42"/>
     </issue>
 
@@ -789,7 +723,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="42"
+            line="40"
             column="25"/>
     </issue>
 
@@ -800,7 +734,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="42"
+            line="40"
             column="42"/>
     </issue>
 
@@ -811,7 +745,7 @@
         errorLine2="                        ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="47"
+            line="45"
             column="25"/>
     </issue>
 
@@ -822,7 +756,7 @@
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="47"
+            line="45"
             column="42"/>
     </issue>
 
@@ -833,7 +767,7 @@
         errorLine2="                        ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="59"
+            line="57"
             column="25"/>
     </issue>
 
@@ -844,7 +778,7 @@
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="59"
+            line="57"
             column="38"/>
     </issue>
 
@@ -855,7 +789,7 @@
         errorLine2="                          ~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="76"
+            line="74"
             column="27"/>
     </issue>
 
@@ -866,7 +800,7 @@
         errorLine2="                         ~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/MenuListView.java"
-            line="84"
+            line="82"
             column="26"/>
     </issue>
 
@@ -899,7 +833,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/PopupInterstitialActivity.java"
-            line="51"
+            line="50"
             column="29"/>
     </issue>
 
@@ -910,7 +844,7 @@
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/Proxy.java"
-            line="60"
+            line="61"
             column="28"/>
     </issue>
 
@@ -921,7 +855,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="95"
+            line="87"
             column="23"/>
     </issue>
 
@@ -932,7 +866,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="102"
+            line="94"
             column="16"/>
     </issue>
 
@@ -943,7 +877,7 @@
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="102"
+            line="94"
             column="38"/>
     </issue>
 
@@ -954,7 +888,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="121"
+            line="111"
             column="23"/>
     </issue>
 
@@ -965,7 +899,7 @@
         errorLine2="               ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="128"
+            line="118"
             column="16"/>
     </issue>
 
@@ -976,7 +910,7 @@
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/com/example/androidx/webkit/RendererTerminationActivity.java"
-            line="128"
+            line="118"
             column="38"/>
     </issue>
 
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java
index 8af77b8..c10bdf0 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/SafeBrowsingActivity.java
@@ -61,7 +61,7 @@
         Uri safeBrowsingRequirementsUri = new Uri.Builder()
                 .scheme("https")
                 .authority("chromium.googlesource.com")
-                .path("/chromium/src/+/master/android_webview/browser/safe_browsing/README.md")
+                .path("/chromium/src/+/main/android_webview/browser/safe_browsing/README.md")
                 .encodedFragment("opt_in_consent_requirements")
                 .build();
 
diff --git a/webkit/integration-tests/testapp/src/main/res/values/strings.xml b/webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from webkit/integration-tests/testapp/src/main/res/values/strings.xml
rename to webkit/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/webkit/webkit/build.gradle b/webkit/webkit/build.gradle
index a640c8d..a52b165 100644
--- a/webkit/webkit/build.gradle
+++ b/webkit/webkit/build.gradle
@@ -36,7 +36,7 @@
     androidTestImplementation("androidx.concurrent:concurrent-futures:1.0.0")
 
     // Hamcrest matchers:
-    androidTestImplementation(ESPRESSO_CONTRIB, libs.exclude_for_espresso)
+    androidTestImplementation(ESPRESSO_CONTRIB, excludes.espresso)
 }
 
 ext {
diff --git a/webkit/webkit/lint-baseline.xml b/webkit/webkit/lint-baseline.xml
index 5e2bf42..bf080b6 100644
--- a/webkit/webkit/lint-baseline.xml
+++ b/webkit/webkit/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanUncheckedReflection"
@@ -8,7 +8,7 @@
         errorLine2="                             ^">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="384"
+            line="383"
             column="30"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                                              ^">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="405"
+            line="404"
             column="47"/>
     </issue>
 
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.AssetHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.AssetHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return context.getDataDir();"
         errorLine2="                           ~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.internal.SafeBrowsingResponseImpl is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().showInterstitial(allowReporting);"
         errorLine2="                                ~~~~~~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.internal.SafeBrowsingResponseImpl is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().proceed(report);"
         errorLine2="                                ~~~~~~~">
         <location
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.internal.SafeBrowsingResponseImpl is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.internal.SafeBrowsingResponseImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().backToSafety(report);"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerControllerImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFrameworksImpl = ServiceWorkerController.getInstance();"
         errorLine2="                                                      ~~~~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerControllerImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    mFrameworksImpl.getServiceWorkerWebSettings());"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -112,8 +112,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerControllerImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFrameworksImpl = ServiceWorkerController.getInstance();"
         errorLine2="                                                      ~~~~~~~~~~~">
         <location
@@ -123,8 +123,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerControllerImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setServiceWorkerClient(new FrameworkServiceWorkerClient(client));"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setCacheMode(mode);"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getCacheMode();"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setAllowContentAccess(allow);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getAllowContentAccess();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setAllowFileAccess(allow);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getAllowFileAccess();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setBlockNetworkLoads(flag);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.internal.ServiceWorkerWebSettingsImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getBlockNetworkLoads();"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFrameworksImpl = android.webkit.TracingController.getInstance();"
         errorLine2="                                                               ~~~~~~~~~~~">
         <location
@@ -233,8 +233,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mFrameworksImpl = android.webkit.TracingController.getInstance();"
         errorLine2="                                                               ~~~~~~~~~~~">
         <location
@@ -244,8 +244,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().isTracing();"
         errorLine2="                                       ~~~~~~~~~">
         <location
@@ -255,8 +255,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            android.webkit.TracingConfig config = new android.webkit.TracingConfig.Builder()"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -266,8 +266,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .addCategories(tracingConfig.getPredefinedCategories())"
         errorLine2="                     ~~~~~~~~~~~~~">
         <location
@@ -277,8 +277,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .addCategories(tracingConfig.getCustomIncludedCategories())"
         errorLine2="                     ~~~~~~~~~~~~~">
         <location
@@ -288,8 +288,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .setTracingMode(tracingConfig.getTracingMode())"
         errorLine2="                     ~~~~~~~~~~~~~~">
         <location
@@ -299,8 +299,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    .build();"
         errorLine2="                     ~~~~~">
         <location
@@ -310,8 +310,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().start(config);"
         errorLine2="                                ~~~~~">
         <location
@@ -321,8 +321,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.TracingControllerImpl is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.TracingControllerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().stop(outputStream, executor);"
         errorLine2="                                       ~~~~">
         <location
@@ -332,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().postMessage(compatToFrameworkMessage(message));"
         errorLine2="                                ~~~~~~~~~~~">
         <location
@@ -343,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().close();"
         errorLine2="                                ~~~~~">
         <location
@@ -354,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setWebMessageCallback(new WebMessagePort.WebMessageCallback() {"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -365,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            getFrameworksImpl().setWebMessageCallback(new WebMessagePort.WebMessageCallback() {"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new WebMessage("
         errorLine2="               ~~~~~~~~~~~~~~">
         <location
@@ -387,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                message.getData(),"
         errorLine2="                        ~~~~~~~">
         <location
@@ -398,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebMessagePortImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebMessagePortImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                portsToCompat(message.getPorts()));"
         errorLine2="                                      ~~~~~~~~">
         <location
@@ -409,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebResourceErrorImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebResourceErrorImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getErrorCode();"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
@@ -420,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.internal.WebResourceErrorImpl is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.internal.WebResourceErrorImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return getFrameworksImpl().getDescription();"
         errorLine2="                                       ~~~~~~~~~~~~~~">
         <location
@@ -431,8 +431,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.WebResourceRequestCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebResourceRequestCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return request.isRedirect();"
         errorLine2="                           ~~~~~~~~~~">
         <location
@@ -442,8 +442,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            settings.setOffscreenPreRaster(enabled);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -453,8 +453,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return settings.getOffscreenPreRaster();"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -464,8 +464,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            settings.setSafeBrowsingEnabled(enabled);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -475,8 +475,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return settings.getSafeBrowsingEnabled();"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -486,8 +486,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            settings.setDisabledActionModeMenuItems(menuItems);"
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -497,8 +497,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return settings.getDisabledActionModeMenuItems();"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -508,8 +508,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            settings.setForceDark(forceDarkMode);"
         errorLine2="                     ~~~~~~~~~~~~">
         <location
@@ -519,8 +519,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebSettingsCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebSettingsCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return settings.getForceDark();"
         errorLine2="                            ~~~~~~~~~~~~">
         <location
@@ -530,8 +530,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.webkit.WebViewClientCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (request.isForMainFrame()) {"
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
@@ -541,8 +541,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.webkit.WebViewClientCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    request.getUrl().toString());"
         errorLine2="                            ~~~~~~">
         <location
@@ -552,8 +552,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.webkit.WebViewClientCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.webkit.WebViewClientCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return shouldOverrideUrlLoading(view, request.getUrl().toString());"
         errorLine2="                                                      ~~~~~~">
         <location
@@ -563,173 +563,173 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            webview.postVisualStateCallback(requestId,"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="167"
+            line="166"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            WebView.startSafeBrowsing(context, callback);"
         errorLine2="                    ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="212"
+            line="211"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            WebView.setSafeBrowsingWhitelist(hostsList, callback);"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="263"
+            line="262"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 27, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 27. Either annotate the containing class with at least @RequiresApi(27) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(27)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 27; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return WebView.getSafeBrowsingPrivacyPolicyUrl();"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="328"
+            line="327"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return WebView.getCurrentWebViewPackage();"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="358"
+            line="357"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return WebMessagePortImpl.portsToCompat(webview.createWebMessageChannel());"
         errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="453"
+            line="452"
             column="61"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            webview.postWebMessage("
         errorLine2="                    ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="493"
+            line="492"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return webview.getWebViewClient();"
         errorLine2="                           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="741"
+            line="767"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return webview.getWebChromeClient();"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="765"
+            line="791"
             column="28"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            android.webkit.WebViewRenderProcess renderer = webview.getWebViewRenderProcess();"
         errorLine2="                                                                   ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="800"
+            line="826"
             column="68"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            webview.setWebViewRenderProcessClient(executor, webViewRenderProcessClient != null"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="851"
+            line="877"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            webview.setWebViewRenderProcessClient(webViewRenderProcessClient != null"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="890"
+            line="916"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    webview.getWebViewRenderProcessClient();"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="921"
+            line="947"
             column="29"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (webview.getWebViewLooper() != Looper.myLooper()) {"
         errorLine2="                        ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="966"
+            line="992"
             column="25"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.WebViewCompat is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.WebViewCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        + &quot;(Expected Looper &quot; + webview.getWebViewLooper() + &quot; called on &quot;"
         errorLine2="                                                        ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/webkit/WebViewCompat.java"
-            line="970"
+            line="996"
             column="57"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.webkit.internal.WebViewGlueCommunicator is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.webkit.internal.WebViewGlueCommunicator is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return WebView.getWebViewClassLoader();"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -739,8 +739,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class androidx.webkit.internal.WebViewRenderProcessImpl is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class androidx.webkit.internal.WebViewRenderProcessImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return renderer != null ? renderer.terminate() : false;"
         errorLine2="                                               ~~~~~~~~~">
         <location
diff --git a/window/window-extensions/build.gradle b/window/window-extensions/build.gradle
index 384720b..5ee89bc 100644
--- a/window/window-extensions/build.gradle
+++ b/window/window-extensions/build.gradle
@@ -37,8 +37,8 @@
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
 }
 
 androidx {
diff --git a/window/window-extensions/lint-baseline.xml b/window/window-extensions/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/window/window-extensions/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/ExtensionFoldingFeature.java b/window/window-extensions/src/main/java/androidx/window/extensions/ExtensionFoldingFeature.java
index 05232380..7e61c77 100644
--- a/window/window-extensions/src/main/java/androidx/window/extensions/ExtensionFoldingFeature.java
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/ExtensionFoldingFeature.java
@@ -179,9 +179,21 @@
         return mBounds.equals(other.mBounds);
     }
 
+    /**
+     * Manually computes the hashCode for the {@link Rect} since it is not implemented
+     * on API 15
+     */
+    private static int hashBounds(Rect bounds) {
+        int result = bounds.left;
+        result = 31 * result + bounds.top;
+        result = 31 * result + bounds.right;
+        result = 31 * result + bounds.bottom;
+        return result;
+    }
+
     @Override
     public int hashCode() {
-        int result = mBounds.hashCode();
+        int result = hashBounds(mBounds);
         result = 31 * result + mType;
         result = 31 * result + mState;
         return result;
diff --git a/window/window-samples/lint-baseline.xml b/window/window-samples/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/window/window-samples/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/window/window-samples/src/main/java/androidx/window/sample/backend/ActivityExtensions.kt b/window/window-samples/src/main/java/androidx/window/sample/backend/ActivityExtensions.kt
index 4a77e93..ad48750 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/backend/ActivityExtensions.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/backend/ActivityExtensions.kt
@@ -25,6 +25,6 @@
  * @return [Point] whose dimensions match the metrics of the window.
  */
 internal fun Activity.calculateWindowSizeExt(): Point {
-    val bounds = WindowManager(this).currentWindowMetrics.bounds
+    val bounds = WindowManager(this).getCurrentWindowMetrics().bounds
     return Point(bounds.width(), bounds.height())
-}
\ No newline at end of file
+}
diff --git a/window/window-sidecar/lint-baseline.xml b/window/window-sidecar/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/window/window-sidecar/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/window/window/api/current.txt b/window/window/api/current.txt
index 8875239..c82eaa4 100644
--- a/window/window/api/current.txt
+++ b/window/window/api/current.txt
@@ -1,17 +1,27 @@
 // Signature format: 4.0
 package androidx.window {
 
-  public interface DisplayFeature {
-    method public android.graphics.Rect getBounds();
+  public final class ActivityExtKt {
   }
 
-  public class FoldingFeature implements androidx.window.DisplayFeature {
-    ctor public FoldingFeature(android.graphics.Rect, int, int);
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public final class FoldingFeature implements androidx.window.DisplayFeature {
+    ctor public FoldingFeature(android.graphics.Rect bounds, int type, int state);
     method public android.graphics.Rect getBounds();
     method public int getOcclusionMode();
     method public int getOrientation();
     method public int getState();
     method public boolean isSeparating();
+    property public android.graphics.Rect bounds;
+    property public final boolean isSeparating;
+    property public final int occlusionMode;
+    property public final int orientation;
+    property public final int state;
+    field public static final androidx.window.FoldingFeature.Companion Companion;
     field public static final int OCCLUSION_FULL = 1; // 0x1
     field public static final int OCCLUSION_NONE = 0; // 0x0
     field public static final int ORIENTATION_HORIZONTAL = 1; // 0x1
@@ -22,33 +32,47 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
+  public static final class FoldingFeature.Companion {
+  }
+
   public interface WindowBackend {
-    method public void registerLayoutChangeCallback(android.app.Activity, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+  }
+
+  public interface WindowInfoRepo {
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
   }
 
   public final class WindowLayoutInfo {
-    method public java.util.List<androidx.window.DisplayFeature!> getDisplayFeatures();
+    method public java.util.List<androidx.window.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.DisplayFeature> displayFeatures;
   }
 
   public static final class WindowLayoutInfo.Builder {
     ctor public WindowLayoutInfo.Builder();
     method public androidx.window.WindowLayoutInfo build();
-    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<androidx.window.DisplayFeature!>);
+    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<? extends androidx.window.DisplayFeature> displayFeatures);
   }
 
   public final class WindowManager {
-    ctor public WindowManager(android.content.Context);
-    ctor public WindowManager(android.content.Context, androidx.window.WindowBackend);
+    ctor public WindowManager(android.content.Context context, optional androidx.window.WindowBackend windowBackend);
+    ctor public WindowManager(android.content.Context context);
     method public androidx.window.WindowMetrics getCurrentWindowMetrics();
     method public androidx.window.WindowMetrics getMaximumWindowMetrics();
-    method public void registerLayoutChangeCallback(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
   }
 
   public final class WindowMetrics {
-    ctor public WindowMetrics(android.graphics.Rect);
+    ctor public WindowMetrics(android.graphics.Rect bounds);
     method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public final class WindowServices {
   }
 
 }
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 8875239..c6788d2 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -1,17 +1,27 @@
 // Signature format: 4.0
 package androidx.window {
 
-  public interface DisplayFeature {
-    method public android.graphics.Rect getBounds();
+  public final class ActivityExtKt {
   }
 
-  public class FoldingFeature implements androidx.window.DisplayFeature {
-    ctor public FoldingFeature(android.graphics.Rect, int, int);
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public final class FoldingFeature implements androidx.window.DisplayFeature {
+    ctor public FoldingFeature(android.graphics.Rect bounds, int type, int state);
     method public android.graphics.Rect getBounds();
     method public int getOcclusionMode();
     method public int getOrientation();
     method public int getState();
     method public boolean isSeparating();
+    property public android.graphics.Rect bounds;
+    property public final boolean isSeparating;
+    property public final int occlusionMode;
+    property public final int orientation;
+    property public final int state;
+    field public static final androidx.window.FoldingFeature.Companion Companion;
     field public static final int OCCLUSION_FULL = 1; // 0x1
     field public static final int OCCLUSION_NONE = 0; // 0x0
     field public static final int ORIENTATION_HORIZONTAL = 1; // 0x1
@@ -22,33 +32,48 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
+  public static final class FoldingFeature.Companion {
+  }
+
   public interface WindowBackend {
-    method public void registerLayoutChangeCallback(android.app.Activity, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+  }
+
+  public interface WindowInfoRepo {
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
   }
 
   public final class WindowLayoutInfo {
-    method public java.util.List<androidx.window.DisplayFeature!> getDisplayFeatures();
+    method public java.util.List<androidx.window.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.DisplayFeature> displayFeatures;
   }
 
   public static final class WindowLayoutInfo.Builder {
     ctor public WindowLayoutInfo.Builder();
     method public androidx.window.WindowLayoutInfo build();
-    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<androidx.window.DisplayFeature!>);
+    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<? extends androidx.window.DisplayFeature> displayFeatures);
   }
 
   public final class WindowManager {
-    ctor public WindowManager(android.content.Context);
-    ctor public WindowManager(android.content.Context, androidx.window.WindowBackend);
+    ctor public WindowManager(android.content.Context context, optional androidx.window.WindowBackend windowBackend);
+    ctor public WindowManager(android.content.Context context);
     method public androidx.window.WindowMetrics getCurrentWindowMetrics();
     method public androidx.window.WindowMetrics getMaximumWindowMetrics();
-    method public void registerLayoutChangeCallback(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
   }
 
   public final class WindowMetrics {
-    ctor public WindowMetrics(android.graphics.Rect);
+    ctor public WindowMetrics(android.graphics.Rect bounds);
     method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public final class WindowServices {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static androidx.window.WindowInfoRepo windowInfoRepository(android.app.Activity);
   }
 
 }
diff --git a/window/window/api/restricted_current.txt b/window/window/api/restricted_current.txt
index 8875239..c82eaa4 100644
--- a/window/window/api/restricted_current.txt
+++ b/window/window/api/restricted_current.txt
@@ -1,17 +1,27 @@
 // Signature format: 4.0
 package androidx.window {
 
-  public interface DisplayFeature {
-    method public android.graphics.Rect getBounds();
+  public final class ActivityExtKt {
   }
 
-  public class FoldingFeature implements androidx.window.DisplayFeature {
-    ctor public FoldingFeature(android.graphics.Rect, int, int);
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public final class FoldingFeature implements androidx.window.DisplayFeature {
+    ctor public FoldingFeature(android.graphics.Rect bounds, int type, int state);
     method public android.graphics.Rect getBounds();
     method public int getOcclusionMode();
     method public int getOrientation();
     method public int getState();
     method public boolean isSeparating();
+    property public android.graphics.Rect bounds;
+    property public final boolean isSeparating;
+    property public final int occlusionMode;
+    property public final int orientation;
+    property public final int state;
+    field public static final androidx.window.FoldingFeature.Companion Companion;
     field public static final int OCCLUSION_FULL = 1; // 0x1
     field public static final int OCCLUSION_NONE = 0; // 0x0
     field public static final int ORIENTATION_HORIZONTAL = 1; // 0x1
@@ -22,33 +32,47 @@
     field public static final int TYPE_HINGE = 2; // 0x2
   }
 
+  public static final class FoldingFeature.Companion {
+  }
+
   public interface WindowBackend {
-    method public void registerLayoutChangeCallback(android.app.Activity, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+  }
+
+  public interface WindowInfoRepo {
+    method public androidx.window.WindowMetrics currentWindowMetrics();
+    method public androidx.window.WindowMetrics maximumWindowMetrics();
+    method public kotlinx.coroutines.flow.Flow<androidx.window.WindowLayoutInfo> windowLayoutInfo();
   }
 
   public final class WindowLayoutInfo {
-    method public java.util.List<androidx.window.DisplayFeature!> getDisplayFeatures();
+    method public java.util.List<androidx.window.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.DisplayFeature> displayFeatures;
   }
 
   public static final class WindowLayoutInfo.Builder {
     ctor public WindowLayoutInfo.Builder();
     method public androidx.window.WindowLayoutInfo build();
-    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<androidx.window.DisplayFeature!>);
+    method public androidx.window.WindowLayoutInfo.Builder setDisplayFeatures(java.util.List<? extends androidx.window.DisplayFeature> displayFeatures);
   }
 
   public final class WindowManager {
-    ctor public WindowManager(android.content.Context);
-    ctor public WindowManager(android.content.Context, androidx.window.WindowBackend);
+    ctor public WindowManager(android.content.Context context, optional androidx.window.WindowBackend windowBackend);
+    ctor public WindowManager(android.content.Context context);
     method public androidx.window.WindowMetrics getCurrentWindowMetrics();
     method public androidx.window.WindowMetrics getMaximumWindowMetrics();
-    method public void registerLayoutChangeCallback(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
-    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo!>);
+    method public void registerLayoutChangeCallback(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
+    method public void unregisterLayoutChangeCallback(androidx.core.util.Consumer<androidx.window.WindowLayoutInfo> callback);
   }
 
   public final class WindowMetrics {
-    ctor public WindowMetrics(android.graphics.Rect);
+    ctor public WindowMetrics(android.graphics.Rect bounds);
     method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public final class WindowServices {
   }
 
 }
diff --git a/window/window/build.gradle b/window/window/build.gradle
index 4a24e84..cfb74ad 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -17,24 +17,20 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
-import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_CORE
-import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_EXT_JUNIT
-import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_RULES
-import static androidx.build.dependencies.DependenciesKt.ANDROIDX_TEST_RUNNER
-import static androidx.build.dependencies.DependenciesKt.DEXMAKER_MOCKITO
-import static androidx.build.dependencies.DependenciesKt.JUNIT
-import static androidx.build.dependencies.DependenciesKt.MOCKITO_CORE
-import static androidx.build.dependencies.DependenciesKt.ROBOLECTRIC
-import static androidx.build.dependencies.DependenciesKt.TRUTH
-import static androidx.build.dependencies.DependenciesKt.getKOTLIN_STDLIB
+import static androidx.build.dependencies.DependenciesKt.*
 
 plugins {
     id("AndroidXPlugin")
     id("com.android.library")
+    id("kotlin-android")
 }
 
 android {
+    defaultConfig {
+        multiDexEnabled = true
+    }
     buildTypes.all {
         consumerProguardFiles "proguard-rules.pro"
     }
@@ -50,6 +46,8 @@
 }
 
 dependencies {
+    api(KOTLIN_STDLIB)
+    api(KOTLIN_COROUTINES_ANDROID)
     implementation("androidx.annotation:annotation:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
     implementation("androidx.core:core:1.3.2")
@@ -57,21 +55,25 @@
     compileOnly(project(":window:window-extensions"))
     compileOnly(project(":window:window-sidecar"))
 
-    testImplementation(KOTLIN_STDLIB)
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(ANDROIDX_TEST_RUNNER)
     testImplementation(JUNIT)
     testImplementation(TRUTH)
     testImplementation(ROBOLECTRIC)
     testImplementation(MOCKITO_CORE)
+    testImplementation(MOCKITO_KOTLIN)
+    testImplementation(KOTLIN_COROUTINES_TEST)
     testImplementation(compileOnly(project(":window:window-extensions")))
     testImplementation(compileOnly(project(":window:window-sidecar")))
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ANDROIDX_TEST_RULES)
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy)
+    androidTestImplementation(MOCKITO_KOTLIN, excludes.bytebuddy)
+    androidTestImplementation(KOTLIN_COROUTINES_TEST)
+    androidTestImplementation(MULTIDEX)
     androidTestImplementation(TRUTH)
     androidTestImplementation(compileOnly(project(":window:window-extensions")))
     androidTestImplementation(compileOnly(project(":window:window-sidecar")))
@@ -89,3 +91,10 @@
     // Sidecar interface.
     failOnDeprecationWarnings = false
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/window/window/lint-baseline.xml b/window/window/lint-baseline.xml
deleted file mode 100644
index cb49e17..0000000
--- a/window/window/lint-baseline.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="            bounds = new Rect((Rect) getBoundsMethod.invoke(windowConfig));"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="158"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="                bounds.set((Rect) getAppBounds.invoke(windowConfig));"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="192"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="                bounds.set((Rect) getAppBounds.invoke(windowConfig));"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="195"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling Method.invoke without an SDK check"
-        errorLine1="            getDisplayInfoMethod.invoke(display, displayInfo);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="379"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="            if (activity.isInMultiWindowMode()) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="190"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="        currentDisplay.getRealSize(realDisplaySize);"
-        errorLine2="                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="207"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="        if (!activity.isInMultiWindowMode()) {"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="209"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="                &amp;&amp; !activity.isInMultiWindowMode()) {"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="225"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                if (bounds.left == displayCutout.getSafeInsetLeft()) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="232"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                if (realDisplaySize.x - bounds.right == displayCutout.getSafeInsetRight()) {"
-        errorLine2="                                                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="236"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    bounds.right += displayCutout.getSafeInsetRight();"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="237"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                if (bounds.top == displayCutout.getSafeInsetTop()) {"
-        errorLine2="                                                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="240"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                if (realDisplaySize.y - bounds.bottom == displayCutout.getSafeInsetBottom()) {"
-        errorLine2="                                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="244"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
-        errorLine1="                    bounds.bottom += displayCutout.getSafeInsetBottom();"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="245"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
-        errorLine1="        if (!activity.isInMultiWindowMode()) {"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="274"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 17, the call containing class androidx.window.WindowBoundsHelper is not annotated with @RequiresApi(x) where x is at least 17. Either annotate the containing class with at least @RequiresApi(17) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(17)."
-        errorLine1="            display.getRealSize(size);"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/window/WindowBoundsHelper.java"
-            line="326"
-            column="21"/>
-    </issue>
-
-</issues>
diff --git a/window/window/src/androidTest/java/androidx/window/BoundsTest.kt b/window/window/src/androidTest/java/androidx/window/BoundsTest.kt
new file mode 100644
index 0000000..0b1f154
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/BoundsTest.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.window
+
+import android.graphics.Rect
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+public class BoundsTest {
+
+    @Test
+    public fun testConstructor_matchesRect() {
+        val rect = Rect(1, 2, 3, 4)
+        val actual = Bounds(rect)
+
+        assertEquals(rect.left, actual.left)
+        assertEquals(rect.top, actual.top)
+        assertEquals(rect.right, actual.right)
+        assertEquals(rect.bottom, actual.bottom)
+    }
+
+    // equals and hashCode do not seem to be implemented on API 15 so need to check properties
+    @Test
+    public fun testToRect_matchesBounds() {
+        val rect = Rect(1, 2, 3, 4)
+        val bounds = Bounds(rect)
+        val actual = bounds.toRect()
+
+        assertEquals(rect.left, actual.left)
+        assertEquals(rect.top, actual.top)
+        assertEquals(rect.right, actual.right)
+        assertEquals(rect.bottom, actual.bottom)
+    }
+
+    @Test
+    public fun testWidth_matchesRect() {
+        val rect = Rect(1, 2, 3, 4)
+        val actual = Bounds(rect).width
+
+        assertEquals(rect.width(), actual)
+    }
+
+    @Test
+    public fun testHeight_matchesRect() {
+        val rect = Rect(1, 2, 3, 4)
+        val actual = Bounds(rect).height
+
+        assertEquals(rect.height(), actual)
+    }
+
+    @Test
+    public fun testIsEmpty_matchesRect() {
+        val emptyRect = Rect(0, 0, 111, 0)
+        val isRectEmpty = Bounds(emptyRect).isEmpty
+        val nonEmptyRect = Rect(0, 0, 100, 100)
+        val isRectNotEmpty = Bounds(nonEmptyRect).isEmpty
+
+        assertTrue(isRectEmpty)
+        assertFalse(isRectNotEmpty)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.java b/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.java
deleted file mode 100644
index 8022f3b..0000000
--- a/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.java
+++ /dev/null
@@ -1,31 +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.window;
-
-/**
- * Base interface for tests of {@link ExtensionInterfaceCompat} implementations, contains methods
- * that each test of the device extension should include.
- * <p>Most tests of the extension compatibility wrappers require mocked extension, they are
- * listed in {@link CompatTestInterface}. This interface defines only the tests that can be
- * implemented to use the extension provided on the device.
- *
- * @see CompatTestInterface the definition of all tests that every implementation of
- * {@link ExtensionInterfaceCompat} should pass.
- */
-interface CompatDeviceTestInterface {
-    void testWindowLayoutCallback();
-}
diff --git a/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.kt b/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.kt
new file mode 100644
index 0000000..344232fd0
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/CompatDeviceTestInterface.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
+
+/**
+ * Base interface for tests of [ExtensionInterfaceCompat] implementations, contains methods
+ * that each test of the device extension should include.
+ *
+ * Most tests of the extension compatibility wrappers require mocked extension, they are
+ * listed in [CompatTestInterface]. This interface defines only the tests that can be
+ * implemented to use the extension provided on the device.
+ *
+ * @see CompatTestInterface the definition of all tests that every implementation of
+ * {@link ExtensionInterfaceCompat} should pass.
+ */
+internal interface CompatDeviceTestInterface {
+    fun testWindowLayoutCallback()
+}
diff --git a/window/window/src/androidTest/java/androidx/window/CompatTestInterface.java b/window/window/src/androidTest/java/androidx/window/CompatTestInterface.java
deleted file mode 100644
index c17f5ba..0000000
--- a/window/window/src/androidTest/java/androidx/window/CompatTestInterface.java
+++ /dev/null
@@ -1,28 +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.window;
-
-/**
- * The list of tests that every implementation of {@link ExtensionInterfaceCompat} should pass.
- */
-interface CompatTestInterface {
-    void testGetWindowLayout();
-    void testExtensionCallback_filterRemovesInvalidValues();
-    void testSetExtensionCallback();
-    void testOnWindowLayoutChangeListenerAdded();
-    void testOnWindowLayoutChangeListenerRemoved();
-}
diff --git a/window/window/src/androidTest/java/androidx/window/CompatTestInterface.kt b/window/window/src/androidTest/java/androidx/window/CompatTestInterface.kt
new file mode 100644
index 0000000..557d1d4
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/CompatTestInterface.kt
@@ -0,0 +1,27 @@
+/*
+ * 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
+
+/**
+ * The list of tests that every implementation of [ExtensionInterfaceCompat] should pass.
+ */
+internal interface CompatTestInterface {
+    fun testGetWindowLayout()
+    fun testExtensionCallback_filterRemovesInvalidValues()
+    fun testSetExtensionCallback()
+    fun testOnWindowLayoutChangeListenerAdded()
+    fun testOnWindowLayoutChangeListenerRemoved()
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.java
deleted file mode 100644
index e0ff32f..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.java
+++ /dev/null
@@ -1,158 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionFoldingFeature;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for {@link ExtensionAdapter} checking that the data is translated correctly from
- * window.extensions to window.window.  Implements {@link TranslatorTestInterface} to ensure same
- * requirements are met as {@link SidecarAdapter}
- *
- * Run: ./gradlew window:window:connectedAndroidTest
- */
-public class ExtensionAdapterTest implements TranslatorTestInterface {
-
-    private static final Rect WINDOW_BOUNDS = new Rect(0, 0, 50, 100);
-
-    private TestWindowBoundsHelper mWindowBoundsHelper;
-
-    @Before
-    public void setUp() {
-        mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    @Override
-    public void testTranslate_validFeature() {
-        Activity mockActivity = mock(Activity.class);
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        ExtensionDisplayFeature foldFeature = new ExtensionFoldingFeature(bounds,
-                ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT);
-
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        extensionDisplayFeatures.add(foldFeature);
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        List<DisplayFeature> expectedFeatures = new ArrayList<>();
-        expectedFeatures.add(new FoldingFeature(foldFeature.getBounds(), FoldingFeature.TYPE_FOLD,
-                FoldingFeature.STATE_FLAT));
-        WindowLayoutInfo expected = new WindowLayoutInfo(expectedFeatures);
-
-        ExtensionAdapter adapter = new ExtensionAdapter();
-
-        WindowLayoutInfo actual = adapter.translate(mockActivity, windowLayoutInfo);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension() {
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, 2);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
-                WINDOW_BOUNDS.bottom / 2);
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullWidthBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullHeightBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-
-        ExtensionAdapter extensionCallbackAdapter = new ExtensionAdapter();
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        Activity mockActivity = mock(Activity.class);
-
-        WindowLayoutInfo actual = extensionCallbackAdapter.translate(mockActivity,
-                windowLayoutInfo);
-
-        assertTrue("Remove hinge feature not spanning full dimension",
-                actual.getDisplayFeatures().isEmpty());
-    }
-
-    @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension() {
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
-                WINDOW_BOUNDS.bottom / 2);
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullWidthBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullHeightBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-
-        ExtensionAdapter adapter = new ExtensionAdapter();
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        Activity mockActivity = mock(Activity.class);
-
-        WindowLayoutInfo actual = adapter.translate(mockActivity, windowLayoutInfo);
-
-        assertTrue("Remove fold feature not spanning full dimension",
-                actual.getDisplayFeatures().isEmpty());
-    }
-
-    @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesUnknownFeature() {
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        ExtensionDisplayFeature foldFeature = new ExtensionFoldingFeature(bounds,
-                0 /* unknown */, ExtensionFoldingFeature.STATE_FLAT);
-
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        extensionDisplayFeatures.add(foldFeature);
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        Activity mockActivity = mock(Activity.class);
-
-        ExtensionAdapter adapter = new ExtensionAdapter();
-        WindowLayoutInfo actual = adapter.translate(mockActivity, windowLayoutInfo);
-
-        assertTrue("Remove fold feature not spanning full dimension",
-                actual.getDisplayFeatures().isEmpty());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.kt
new file mode 100644
index 0000000..b67c9ff
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionAdapterTest.kt
@@ -0,0 +1,156 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.window.extensions.ExtensionDisplayFeature
+import androidx.window.extensions.ExtensionFoldingFeature
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.mock
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+
+/**
+ * Tests for [ExtensionAdapter] checking that the data is translated correctly from
+ * window.extensions to window.window.  Implements [TranslatorTestInterface] to ensure same
+ * requirements are met as [SidecarAdapter]
+ *
+ * Run: ./gradlew window:window:connectedAndroidTest
+ */
+public class ExtensionAdapterTest : TranslatorTestInterface {
+
+    private lateinit var windowBoundsHelper: TestWindowBoundsHelper
+
+    @Before
+    public fun setUp() {
+        windowBoundsHelper = TestWindowBoundsHelper()
+        windowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(windowBoundsHelper)
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    override fun testTranslate_validFeature() {
+        val mockActivity = mock<Activity>()
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val foldFeature: ExtensionDisplayFeature = ExtensionFoldingFeature(
+            bounds,
+            ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT
+        )
+        val extensionDisplayFeatures = listOf(foldFeature)
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val expectedFeatures = listOf(
+            FoldingFeature(foldFeature.bounds, FoldingFeature.TYPE_FOLD, FoldingFeature.STATE_FLAT)
+        )
+        val expected = WindowLayoutInfo(expectedFeatures)
+        val adapter = ExtensionAdapter()
+        val actual = adapter.translate(mockActivity, windowLayoutInfo)
+        assertEquals(expected, actual)
+    }
+
+    @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, 2
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val extensionDisplayFeatures = listOf(
+            ExtensionFoldingFeature(
+                fullWidthBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            ),
+            ExtensionFoldingFeature(
+                fullHeightBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            )
+        )
+        val extensionCallbackAdapter = ExtensionAdapter()
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val mockActivity = mock<Activity>()
+        val actual = extensionCallbackAdapter.translate(
+            mockActivity,
+            windowLayoutInfo
+        )
+        assertTrue(
+            "Remove hinge feature not spanning full dimension",
+            actual.displayFeatures.isEmpty()
+        )
+    }
+
+    @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val extensionDisplayFeatures = listOf(
+            ExtensionFoldingFeature(
+                fullWidthBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            ),
+            ExtensionFoldingFeature(
+                fullHeightBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            )
+        )
+        val adapter = ExtensionAdapter()
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val mockActivity = mock<Activity>()
+        val actual = adapter.translate(mockActivity, windowLayoutInfo)
+        assertTrue(
+            "Remove fold feature not spanning full dimension",
+            actual.displayFeatures.isEmpty()
+        )
+    }
+
+    @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesUnknownFeature() {
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val foldFeature: ExtensionDisplayFeature = ExtensionFoldingFeature(
+            bounds,
+            0 /* unknown */, ExtensionFoldingFeature.STATE_FLAT
+        )
+        val extensionDisplayFeatures = listOf(foldFeature)
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val mockActivity = mock<Activity>()
+        val adapter = ExtensionAdapter()
+        val actual = adapter.translate(mockActivity, windowLayoutInfo)
+        assertTrue(
+            "Remove fold feature not spanning full dimension",
+            actual.displayFeatures.isEmpty()
+        )
+    }
+
+    private companion object {
+        private val WINDOW_BOUNDS = Rect(0, 0, 50, 100)
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.java
deleted file mode 100644
index e06cecd..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.java
+++ /dev/null
@@ -1,73 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-import static androidx.window.Version.VERSION_1_0;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for {@link ExtensionCompat} implementation of {@link ExtensionInterfaceCompat} that are
- * executed with Extension implementation provided on the device (and only if one is available).
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class ExtensionCompatDeviceTest extends WindowTestBase implements CompatDeviceTestInterface {
-    ExtensionCompat mExtensionCompat;
-
-    @Before
-    public void setUp() {
-        assumeExtensionV1_0();
-        mExtensionCompat =
-                new ExtensionCompat((Context) ApplicationProvider.getApplicationContext());
-    }
-
-    @Test
-    @Override
-    public void testWindowLayoutCallback() {
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        IBinder windowToken = getActivityWindowToken(activity);
-        assertNotNull(windowToken);
-        ExtensionCallbackInterface callbackInterface = mock(ExtensionCallbackInterface.class);
-        mExtensionCompat.setExtensionCallback(callbackInterface);
-        mExtensionCompat.onWindowLayoutChangeListenerAdded(activity);
-
-        verify(callbackInterface).onWindowLayoutChanged(any(), any());
-    }
-
-    private void assumeExtensionV1_0() {
-        Version extensionVersion = ExtensionCompat.getExtensionVersion();
-        assumeTrue(extensionVersion != null && VERSION_1_0.compareTo(extensionVersion) <= 0);
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.kt
new file mode 100644
index 0000000..6eb3985
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionCompatDeviceTest.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.window
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Assert.assertNotNull
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for [ExtensionCompat] implementation of [ExtensionInterfaceCompat] that are
+ * executed with Extension implementation provided on the device (and only if one is available).
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class ExtensionCompatDeviceTest : WindowTestBase(), CompatDeviceTestInterface {
+
+    private lateinit var extensionCompat: ExtensionCompat
+
+    @Before
+    public fun setUp() {
+        assumeExtensionV1_0()
+        extensionCompat = ExtensionCompat(ApplicationProvider.getApplicationContext() as Context)
+    }
+
+    @Test
+    override fun testWindowLayoutCallback() {
+        activityTestRule.scenario.onActivity { activity ->
+            val windowToken = getActivityWindowToken(activity)
+            assertNotNull(windowToken)
+            val callbackInterface = mock<ExtensionCallbackInterface>()
+            extensionCompat.setExtensionCallback(callbackInterface)
+            extensionCompat.onWindowLayoutChangeListenerAdded(activity)
+            verify(callbackInterface).onWindowLayoutChanged(any(), any())
+        }
+    }
+
+    private fun assumeExtensionV1_0() {
+        val extensionVersion = ExtensionCompat.extensionVersion
+        Assume.assumeTrue(
+            extensionVersion != null && Version.VERSION_1_0 <= extensionVersion
+        )
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.java
deleted file mode 100644
index 2dce4f3..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.java
+++ /dev/null
@@ -1,245 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-import static androidx.window.TestFoldingFeatureUtil.invalidFoldBounds;
-import static androidx.window.TestFoldingFeatureUtil.validFoldBound;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionFoldingFeature;
-import androidx.window.extensions.ExtensionInterface;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for {@link ExtensionCompat} implementation of {@link ExtensionInterfaceCompat}. This
- * class uses a mocked Extension to verify the behavior of the implementation on any hardware.
- * <p>Because this class extends {@link ExtensionCompatDeviceTest}, it will also run the mocked
- * versions of methods defined in {@link CompatDeviceTestInterface}.
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class ExtensionCompatTest extends WindowTestBase
-        implements CompatTestInterface {
-    private static final Rect WINDOW_BOUNDS = new Rect(0, 0, 50, 100);
-
-    ExtensionCompat mExtensionCompat;
-    private Activity mActivity;
-
-    @Before
-    public void setUp() {
-        mExtensionCompat = new ExtensionCompat(mock(ExtensionInterface.class),
-                new ExtensionAdapter());
-        mActivity = mock(Activity.class);
-
-        TestWindowBoundsHelper mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    @Override
-    public void testGetWindowLayout() {
-        FakeExtensionImp fakeExtensionImp = new FakeExtensionImp();
-        ExtensionCompat compat = new ExtensionCompat(fakeExtensionImp, new ExtensionAdapter());
-        ExtensionCallbackInterface mockCallback = mock(ExtensionCallbackInterface.class);
-        compat.setExtensionCallback(mockCallback);
-        compat.onWindowLayoutChangeListenerAdded(mock(Activity.class));
-
-        fakeExtensionImp.triggerValidSignal();
-
-        verify(mockCallback).onWindowLayoutChanged(any(),
-                argThat(windowLayoutInfo -> !windowLayoutInfo.getDisplayFeatures().isEmpty()));
-    }
-
-    @Test
-    @Override
-    public void testSetExtensionCallback() {
-        ArgumentCaptor<ExtensionInterface.ExtensionCallback> extensionCallbackCaptor =
-                ArgumentCaptor.forClass(ExtensionInterface.ExtensionCallback.class);
-
-        // Verify that the extension got the callback set
-        ExtensionCallbackInterface callback =
-                mock(ExtensionCallbackInterface.class);
-        mExtensionCompat.setExtensionCallback(callback);
-
-        verify(mExtensionCompat.mWindowExtension).setExtensionCallback(
-                extensionCallbackCaptor.capture());
-
-        // Verify that the callback set for extension propagates the window layout callback when
-        // a listener has been registered.
-        mExtensionCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.width(), 1);
-        ExtensionDisplayFeature extensionDisplayFeature =
-                new ExtensionFoldingFeature(bounds, ExtensionFoldingFeature.TYPE_HINGE,
-                        ExtensionFoldingFeature.STATE_HALF_OPENED);
-        List<ExtensionDisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(extensionDisplayFeature);
-        ExtensionWindowLayoutInfo extensionWindowLayoutInfo =
-                new ExtensionWindowLayoutInfo(displayFeatures);
-
-        extensionCallbackCaptor.getValue().onWindowLayoutChanged(mActivity,
-                extensionWindowLayoutInfo);
-        ArgumentCaptor<WindowLayoutInfo> windowLayoutInfoCaptor =
-                ArgumentCaptor.forClass(WindowLayoutInfo.class);
-        verify(callback).onWindowLayoutChanged(eq(mActivity), windowLayoutInfoCaptor.capture());
-
-        WindowLayoutInfo capturedLayout = windowLayoutInfoCaptor.getValue();
-        assertEquals(1, capturedLayout.getDisplayFeatures().size());
-        DisplayFeature capturedDisplayFeature = capturedLayout.getDisplayFeatures().get(0);
-
-        FoldingFeature foldingFeature = (FoldingFeature) capturedDisplayFeature;
-        assertNotNull(foldingFeature);
-        assertEquals(bounds, capturedDisplayFeature.getBounds());
-    }
-
-    @Override
-    public void testExtensionCallback_filterRemovesInvalidValues() {
-        FakeExtensionImp fakeExtensionImp = new FakeExtensionImp();
-        ExtensionCompat compat = new ExtensionCompat(fakeExtensionImp, new ExtensionAdapter());
-        ExtensionCallbackInterface mockCallback = mock(ExtensionCallbackInterface.class);
-        compat.setExtensionCallback(mockCallback);
-        compat.onWindowLayoutChangeListenerAdded(mock(Activity.class));
-
-        fakeExtensionImp.triggerMalformedSignal();
-
-        verify(mockCallback).onWindowLayoutChanged(any(),
-                argThat(windowLayoutInfo -> windowLayoutInfo.getDisplayFeatures().isEmpty()));
-    }
-
-    @Test
-    @Override
-    public void testOnWindowLayoutChangeListenerAdded() {
-        mExtensionCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        verify(mExtensionCompat.mWindowExtension).onWindowLayoutChangeListenerAdded(eq(mActivity));
-    }
-
-    @Test
-    @Override
-    public void testOnWindowLayoutChangeListenerRemoved() {
-        mExtensionCompat.onWindowLayoutChangeListenerRemoved(mActivity);
-        verify(mExtensionCompat.mWindowExtension)
-                .onWindowLayoutChangeListenerRemoved(eq(mActivity));
-    }
-
-    @Test
-    public void testValidateExtensionInterface() {
-        assertTrue(mExtensionCompat.validateExtensionInterface());
-    }
-
-    private static final class FakeExtensionImp implements ExtensionInterface {
-
-        private ExtensionCallback mCallback;
-        private final List<Activity> mActivities = new ArrayList<>();
-
-        FakeExtensionImp() {
-            mCallback = new ExtensionCallback() {
-
-                @Override
-                public void onWindowLayoutChanged(@NonNull Activity activity,
-                        @NonNull ExtensionWindowLayoutInfo newLayout) {
-
-                }
-            };
-        }
-
-        @Override
-        public void setExtensionCallback(@NonNull ExtensionCallback callback) {
-            mCallback = callback;
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerAdded(@NonNull Activity activity) {
-            mActivities.add(activity);
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity) {
-            mActivities.remove(activity);
-        }
-
-        void triggerMalformedSignal() {
-            triggerSignal(malformedWindowLayoutInfo());
-        }
-
-        void triggerValidSignal() {
-            triggerSignal(validWindowLayoutInfo());
-        }
-
-        void triggerSignal(ExtensionWindowLayoutInfo info) {
-            for (Activity activity: mActivities) {
-                mCallback.onWindowLayoutChanged(activity, info);
-            }
-        }
-
-        private ExtensionWindowLayoutInfo malformedWindowLayoutInfo() {
-            List<ExtensionDisplayFeature> malformedFeatures = new ArrayList<>();
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(new ExtensionFoldingFeature(malformedBound,
-                        ExtensionFoldingFeature.TYPE_FOLD,
-                        ExtensionFoldingFeature.STATE_FLAT));
-            }
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(new ExtensionFoldingFeature(malformedBound,
-                        ExtensionFoldingFeature.TYPE_HINGE,
-                        ExtensionFoldingFeature.STATE_FLAT));
-            }
-
-            return new ExtensionWindowLayoutInfo(malformedFeatures);
-        }
-
-        private ExtensionWindowLayoutInfo validWindowLayoutInfo() {
-            List<ExtensionDisplayFeature> validFeatures = new ArrayList<>();
-
-            validFeatures.add(new ExtensionFoldingFeature(validFoldBound(WINDOW_BOUNDS),
-                    ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT));
-
-            return new ExtensionWindowLayoutInfo(validFeatures);
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.kt
new file mode 100644
index 0000000..6c546a5
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionCompatTest.kt
@@ -0,0 +1,229 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.TestFoldingFeatureUtil.invalidFoldBounds
+import androidx.window.TestFoldingFeatureUtil.validFoldBound
+import androidx.window.extensions.ExtensionDisplayFeature
+import androidx.window.extensions.ExtensionFoldingFeature
+import androidx.window.extensions.ExtensionInterface
+import androidx.window.extensions.ExtensionInterface.ExtensionCallback
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.argumentCaptor
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for [ExtensionCompat] implementation of [ExtensionInterfaceCompat]. This
+ * class uses a mocked Extension to verify the behavior of the implementation on any hardware.
+ *
+ * Because this class extends [ExtensionCompatDeviceTest], it will also run the mocked
+ * versions of methods defined in [CompatDeviceTestInterface].
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class ExtensionCompatTest : WindowTestBase(), CompatTestInterface {
+
+    private lateinit var extensionCompat: ExtensionCompat
+    private lateinit var activity: Activity
+
+    @Before
+    public fun setUp() {
+        extensionCompat = ExtensionCompat(mock(), ExtensionAdapter())
+        activity = mock()
+        val mWindowBoundsHelper = TestWindowBoundsHelper()
+        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(mWindowBoundsHelper)
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    override fun testGetWindowLayout() {
+        val fakeExtensionImp = FakeExtensionImp()
+        val compat = ExtensionCompat(fakeExtensionImp, ExtensionAdapter())
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        compat.setExtensionCallback(mockCallback)
+        compat.onWindowLayoutChangeListenerAdded(mock())
+        fakeExtensionImp.triggerValidSignal()
+        verify(mockCallback).onWindowLayoutChanged(
+            any(),
+            argThat { windowLayoutInfo: WindowLayoutInfo ->
+                windowLayoutInfo.displayFeatures.isNotEmpty()
+            }
+        )
+    }
+
+    @Test
+    override fun testSetExtensionCallback() {
+        val extensionCallbackCaptor = argumentCaptor<ExtensionCallback>()
+
+        // Verify that the extension got the callback set
+        val callback = mock<ExtensionCallbackInterface>()
+        extensionCompat.setExtensionCallback(callback)
+        verify(extensionCompat.windowExtension!!).setExtensionCallback(
+            extensionCallbackCaptor.capture()
+        )
+
+        // Verify that the callback set for extension propagates the window layout callback when
+        // a listener has been registered.
+        extensionCompat.onWindowLayoutChangeListenerAdded(activity)
+        val bounds = Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.width(), 1)
+        val extensionDisplayFeature: ExtensionDisplayFeature = ExtensionFoldingFeature(
+            bounds, ExtensionFoldingFeature.TYPE_HINGE,
+            ExtensionFoldingFeature.STATE_HALF_OPENED
+        )
+        val displayFeatures = listOf(extensionDisplayFeature)
+        val extensionWindowLayoutInfo = ExtensionWindowLayoutInfo(displayFeatures)
+        extensionCallbackCaptor.firstValue.onWindowLayoutChanged(
+            activity,
+            extensionWindowLayoutInfo
+        )
+        val windowLayoutInfoCaptor = argumentCaptor<WindowLayoutInfo>()
+        verify(callback)
+            .onWindowLayoutChanged(eq(activity), windowLayoutInfoCaptor.capture())
+        val capturedLayout = windowLayoutInfoCaptor.firstValue
+        assertEquals(1, capturedLayout.displayFeatures.size.toLong())
+        val capturedDisplayFeature = capturedLayout.displayFeatures[0]
+        val foldingFeature = capturedDisplayFeature as FoldingFeature
+        assertNotNull(foldingFeature)
+        assertEquals(bounds, capturedDisplayFeature.bounds)
+    }
+
+    override fun testExtensionCallback_filterRemovesInvalidValues() {
+        val fakeExtensionImp = FakeExtensionImp()
+        val compat = ExtensionCompat(fakeExtensionImp, ExtensionAdapter())
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        compat.setExtensionCallback(mockCallback)
+        compat.onWindowLayoutChangeListenerAdded(mock())
+        fakeExtensionImp.triggerMalformedSignal()
+        verify(mockCallback).onWindowLayoutChanged(
+            any(),
+            argThat { windowLayoutInfo: WindowLayoutInfo ->
+                windowLayoutInfo.displayFeatures.isEmpty()
+            }
+        )
+    }
+
+    @Test
+    override fun testOnWindowLayoutChangeListenerAdded() {
+        extensionCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(extensionCompat.windowExtension!!).onWindowLayoutChangeListenerAdded(
+            eq(activity)
+        )
+    }
+
+    @Test
+    override fun testOnWindowLayoutChangeListenerRemoved() {
+        extensionCompat.onWindowLayoutChangeListenerRemoved(activity)
+        verify(extensionCompat.windowExtension!!)
+            .onWindowLayoutChangeListenerRemoved(eq(activity))
+    }
+
+    @Test
+    public fun testValidateExtensionInterface() {
+        assertTrue(extensionCompat.validateExtensionInterface())
+    }
+
+    private class FakeExtensionImp : ExtensionInterface {
+        private var callback: ExtensionCallback
+        private val activities = mutableListOf<Activity>()
+        override fun setExtensionCallback(callback: ExtensionCallback) {
+            this.callback = callback
+        }
+
+        override fun onWindowLayoutChangeListenerAdded(activity: Activity) {
+            activities.add(activity)
+        }
+
+        override fun onWindowLayoutChangeListenerRemoved(activity: Activity) {
+            activities.remove(activity)
+        }
+
+        fun triggerMalformedSignal() {
+            triggerSignal(malformedWindowLayoutInfo())
+        }
+
+        fun triggerValidSignal() {
+            triggerSignal(validWindowLayoutInfo())
+        }
+
+        fun triggerSignal(info: ExtensionWindowLayoutInfo?) {
+            activities.forEach { activity ->
+                callback.onWindowLayoutChanged(activity, info!!)
+            }
+        }
+
+        private fun malformedWindowLayoutInfo(): ExtensionWindowLayoutInfo {
+            val malformedFeatures = mutableListOf<ExtensionDisplayFeature>()
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    ExtensionFoldingFeature(
+                        malformedBound,
+                        ExtensionFoldingFeature.TYPE_FOLD,
+                        ExtensionFoldingFeature.STATE_FLAT
+                    )
+                )
+            }
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    ExtensionFoldingFeature(
+                        malformedBound,
+                        ExtensionFoldingFeature.TYPE_HINGE,
+                        ExtensionFoldingFeature.STATE_FLAT
+                    )
+                )
+            }
+            return ExtensionWindowLayoutInfo(malformedFeatures)
+        }
+
+        private fun validWindowLayoutInfo(): ExtensionWindowLayoutInfo {
+            val validFeatures = listOf(
+                ExtensionFoldingFeature(
+                    validFoldBound(WINDOW_BOUNDS),
+                    ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT
+                )
+            )
+            return ExtensionWindowLayoutInfo(validFeatures)
+        }
+
+        init {
+            callback = ExtensionCallback { _, _ -> }
+        }
+    }
+
+    private companion object {
+        private val WINDOW_BOUNDS = Rect(0, 0, 50, 100)
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionTest.java
deleted file mode 100644
index 1abe15b..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionTest.java
+++ /dev/null
@@ -1,293 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-import static androidx.window.ExtensionWindowBackend.initAndVerifyExtension;
-import static androidx.window.Version.VERSION_0_1;
-import static androidx.window.Version.VERSION_1_0;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.rule.ActivityTestRule;
-import androidx.window.extensions.ExtensionFoldingFeature;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/** Tests for the extension implementation on the device. */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class ExtensionTest extends WindowTestBase {
-
-    private Context mContext;
-    private ActivityTestRule<TestActivity> mActivityTestRule =
-            new ActivityTestRule<>(TestActivity.class, false, true);
-    private ActivityTestRule<TestConfigChangeHandlingActivity> mConfigHandlingActivityTestRule =
-            new ActivityTestRule<>(TestConfigChangeHandlingActivity.class, false, true);
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-    }
-
-    @Test
-    public void testExtensionInterface() {
-        assumeExtensionV10_V01();
-        ExtensionInterfaceCompat extension = initAndVerifyExtension(mContext);
-        assertTrue(extension.validateExtensionInterface());
-    }
-
-    @Test
-    public void testDisplayFeatureDataClass() {
-        assumeExtensionV10_V01();
-
-        Rect rect = new Rect(0, 100, 100, 100);
-        int type = 1;
-        int state = 1;
-        ExtensionFoldingFeature displayFeature =
-                new ExtensionFoldingFeature(rect, type, state);
-        assertEquals(rect, displayFeature.getBounds());
-    }
-
-    @Test
-    public void testWindowLayoutCallback() {
-        assumeExtensionV10_V01();
-        ExtensionInterfaceCompat extension = initAndVerifyExtension(mContext);
-        ExtensionCallbackInterface callbackInterface = mock(ExtensionCallbackInterface.class);
-        extension.setExtensionCallback(callbackInterface);
-
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        extension.onWindowLayoutChangeListenerAdded(activity);
-
-        assertTrue("Layout must happen after launch", activity.waitForLayout());
-
-        verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(any(), argThat(
-                new WindowLayoutInfoValidator(activity)));
-    }
-
-    @Test
-    public void testRegisterWindowLayoutChangeListener() {
-        assumeExtensionV10_V01();
-        ExtensionInterfaceCompat extension = initAndVerifyExtension(mContext);
-
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-
-        extension.onWindowLayoutChangeListenerAdded(activity);
-        extension.onWindowLayoutChangeListenerRemoved(activity);
-    }
-
-    @Test
-    public void testWindowLayoutUpdatesOnConfigChange() {
-        assumeExtensionV10_V01();
-        ExtensionInterfaceCompat extension = initAndVerifyExtension(mContext);
-        ExtensionCallbackInterface callbackInterface = mock(ExtensionCallbackInterface.class);
-        extension.setExtensionCallback(callbackInterface);
-
-        TestConfigChangeHandlingActivity activity =
-                mConfigHandlingActivityTestRule.launchActivity(new Intent());
-        extension.onWindowLayoutChangeListenerAdded(activity);
-
-        activity.resetLayoutCounter();
-        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
-
-        activity.waitForLayout();
-        if (activity.getResources().getConfiguration().orientation
-                != Configuration.ORIENTATION_PORTRAIT) {
-            // Orientation change did not occur on this device config. Skipping the test.
-            return;
-        }
-
-        activity.resetLayoutCounter();
-        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
-
-        boolean layoutHappened = activity.waitForLayout();
-        if (activity.getResources().getConfiguration().orientation
-                != Configuration.ORIENTATION_LANDSCAPE) {
-            // Orientation change did not occur on this device config. Skipping the test.
-            return;
-        }
-        assertTrue("Layout must happen after orientation change", layoutHappened);
-
-        if (!isSidecar()) {
-            verify(callbackInterface, atLeastOnce())
-                    .onWindowLayoutChanged(any(), argThat(new DistinctWindowLayoutInfoMatcher()));
-        } else {
-            verify(callbackInterface, atLeastOnce())
-                    .onWindowLayoutChanged(any(), any());
-        }
-    }
-
-    @Test
-    public void testWindowLayoutUpdatesOnRecreate() {
-        assumeExtensionV10_V01();
-        ExtensionInterfaceCompat extension = initAndVerifyExtension(mContext);
-        ExtensionCallbackInterface callbackInterface = mock(ExtensionCallbackInterface.class);
-        extension.setExtensionCallback(callbackInterface);
-
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        extension.onWindowLayoutChangeListenerAdded(activity);
-
-        activity.resetLayoutCounter();
-        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
-
-        activity = mActivityTestRule.getActivity();
-
-        activity.waitForLayout();
-        if (activity.getResources().getConfiguration().orientation
-                != Configuration.ORIENTATION_PORTRAIT) {
-            // Orientation change did not occur on this device config. Skipping the test.
-            return;
-        }
-
-        TestActivity.resetResumeCounter();
-        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
-        TestActivity.waitForOnResume();
-
-        activity = mActivityTestRule.getActivity();
-
-        activity.waitForLayout();
-        if (activity.getResources().getConfiguration().orientation
-                != Configuration.ORIENTATION_LANDSCAPE) {
-            // Orientation change did not occur on this device config. Skipping the test.
-            return;
-        }
-
-        if (!isSidecar()) {
-            verify(callbackInterface, atLeastOnce())
-                    .onWindowLayoutChanged(any(), argThat(new DistinctWindowLayoutInfoMatcher()));
-        } else {
-            verify(callbackInterface, atLeastOnce())
-                    .onWindowLayoutChanged(any(), any());
-        }
-    }
-
-    @Test
-    public void testVersionSupport() {
-        // Only versions 1.0 and 0.1 are supported for now
-        Version version = SidecarCompat.getSidecarVersion();
-        if (version != null) {
-            assertEquals(VERSION_0_1, version);
-        }
-        version = ExtensionCompat.getExtensionVersion();
-        if (version != null) {
-            assertEquals(VERSION_1_0, version);
-        }
-    }
-
-    private void assumeExtensionV10_V01() {
-        assumeTrue(VERSION_1_0.equals(ExtensionCompat.getExtensionVersion())
-                || VERSION_0_1.equals(SidecarCompat.getSidecarVersion()));
-    }
-
-    private boolean isSidecar() {
-        return SidecarCompat.getSidecarVersion() != null;
-    }
-
-    /**
-     * An argument matcher that ensures the arguments used to call are distinct.  The only exception
-     * is to allow the first value to trigger twice in case the initial value is pushed and then
-     * replayed.
-     */
-    private static class DistinctWindowLayoutInfoMatcher implements
-            ArgumentMatcher<WindowLayoutInfo> {
-        private Set<WindowLayoutInfo> mWindowLayoutInfos = new HashSet<>();
-
-        @Override
-        public boolean matches(WindowLayoutInfo windowLayoutInfo) {
-            if (mWindowLayoutInfos.size() == 1 && mWindowLayoutInfos.contains(windowLayoutInfo)) {
-                // First element is emitted twice so it is allowed
-                return true;
-            } else if (mWindowLayoutInfos.contains(windowLayoutInfo)) {
-                return false;
-            } else if (windowLayoutInfo.getDisplayFeatures().isEmpty()) {
-                return true;
-            } else {
-                mWindowLayoutInfos.add(windowLayoutInfo);
-                return true;
-            }
-        }
-    }
-
-    /**
-     * An argument matcher to ensure each {@link WindowLayoutInfo} is valid.
-     */
-    private static class WindowLayoutInfoValidator implements ArgumentMatcher<WindowLayoutInfo> {
-        private final TestActivity mActivity;
-
-        WindowLayoutInfoValidator(TestActivity activity) {
-            mActivity = activity;
-        }
-
-        @Override
-        public boolean matches(WindowLayoutInfo windowLayoutInfo) {
-            if (windowLayoutInfo.getDisplayFeatures().isEmpty()) {
-                return true;
-            }
-
-            for (DisplayFeature displayFeature : windowLayoutInfo.getDisplayFeatures()) {
-                if (!isValid(mActivity, displayFeature)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-
-    private static boolean isValid(TestActivity activity, DisplayFeature displayFeature) {
-        if (!(displayFeature instanceof FoldingFeature)) {
-            return false;
-        }
-        FoldingFeature feature = (FoldingFeature) displayFeature;
-
-        Rect featureRect = feature.getBounds();
-        WindowMetrics windowMetrics = new WindowManager(activity).getCurrentWindowMetrics();
-
-        if ((featureRect.height() == 0 && featureRect.width() == 0) || featureRect.left < 0
-                || featureRect.top < 0) {
-            return false;
-        }
-        if (featureRect.right < 1 || featureRect.right > windowMetrics.getBounds().width()) {
-            return false;
-        }
-        if (featureRect.bottom < 1 || featureRect.bottom > windowMetrics.getBounds().height()) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionTest.kt
new file mode 100644
index 0000000..2a8267c
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionTest.kt
@@ -0,0 +1,277 @@
+/*
+ * 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
+
+import android.content.Context
+import android.content.pm.ActivityInfo
+import android.content.res.Configuration
+import android.graphics.Rect
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.TestActivity.Companion.resetResumeCounter
+import androidx.window.TestActivity.Companion.waitForOnResume
+import androidx.window.extensions.ExtensionFoldingFeature
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.atLeastOnce
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatcher
+import java.util.HashSet
+
+/** Tests for the extension implementation on the device.  */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class ExtensionTest : WindowTestBase() {
+
+    private lateinit var context: Context
+
+    private val configHandlingActivityTestRule =
+        ActivityScenarioRule(TestConfigChangeHandlingActivity::class.java)
+
+    @Before
+    public fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+    }
+
+    @Test
+    public fun testExtensionInterface() {
+        assumeExtensionV10_V01()
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        assertTrue(extension!!.validateExtensionInterface())
+    }
+
+    @Test
+    public fun testDisplayFeatureDataClass() {
+        assumeExtensionV10_V01()
+        val rect = Rect(0, 100, 100, 100)
+        val type = 1
+        val state = 1
+        val displayFeature = ExtensionFoldingFeature(rect, type, state)
+        assertEquals(rect, displayFeature.bounds)
+    }
+
+    @Test
+    public fun testWindowLayoutCallback() {
+        assumeExtensionV10_V01()
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        val callbackInterface = mock<ExtensionCallbackInterface>()
+        extension!!.setExtensionCallback(callbackInterface)
+        activityTestRule.scenario.onActivity { activity ->
+            extension.onWindowLayoutChangeListenerAdded(activity)
+            assertTrue("Layout must happen after launch", activity.waitForLayout())
+            verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(
+                any(),
+                argThat(WindowLayoutInfoValidator(activity))
+            )
+        }
+    }
+
+    @Test
+    public fun testRegisterWindowLayoutChangeListener() {
+        assumeExtensionV10_V01()
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        activityTestRule.scenario.onActivity { activity ->
+            extension!!.onWindowLayoutChangeListenerAdded(activity)
+            extension.onWindowLayoutChangeListenerRemoved(activity)
+        }
+    }
+
+    @Test
+    public fun testWindowLayoutUpdatesOnConfigChange() {
+        assumeExtensionV10_V01()
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        val callbackInterface = mock<ExtensionCallbackInterface>()
+
+        extension!!.setExtensionCallback(callbackInterface)
+        val scenario = ActivityScenario.launch(TestConfigChangeHandlingActivity::class.java)
+        scenario.onActivity { activity ->
+            extension.onWindowLayoutChangeListenerAdded(activity)
+            activity.resetLayoutCounter()
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+            activity.waitForLayout()
+            val activityOrientation = activity.resources.configuration.orientation
+            if (activityOrientation != Configuration.ORIENTATION_PORTRAIT) {
+                // Orientation change did not occur on this device config. Skipping the test.
+                return@onActivity
+            }
+            activity.resetLayoutCounter()
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+            val layoutHappened = activity.waitForLayout()
+            if (activity.resources.configuration.orientation
+                != Configuration.ORIENTATION_LANDSCAPE
+            ) {
+                // Orientation change did not occur on this device config. Skipping the test.
+                return@onActivity
+            }
+            assertTrue("Layout must happen after orientation change", layoutHappened)
+            if (!isSidecar) {
+                verify(callbackInterface, atLeastOnce())
+                    .onWindowLayoutChanged(
+                        any(),
+                        argThat(DistinctWindowLayoutInfoMatcher())
+                    )
+            } else {
+                verify(callbackInterface, atLeastOnce())
+                    .onWindowLayoutChanged(any(), any())
+            }
+        }
+    }
+
+    @Test
+    public fun testWindowLayoutUpdatesOnRecreate() {
+        assumeExtensionV10_V01()
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        val callbackInterface = mock<ExtensionCallbackInterface>()
+        extension!!.setExtensionCallback(callbackInterface)
+        activityTestRule.scenario.onActivity { activity ->
+            extension.onWindowLayoutChangeListenerAdded(activity)
+            activity.resetLayoutCounter()
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+            activity.waitForLayout()
+            if (activity.resources.configuration.orientation
+                != Configuration.ORIENTATION_PORTRAIT
+            ) {
+                // Orientation change did not occur on this device config. Skipping the test.
+                return@onActivity
+            }
+            resetResumeCounter()
+            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+            waitForOnResume()
+            activity.waitForLayout()
+            if (activity.resources.configuration.orientation
+                != Configuration.ORIENTATION_LANDSCAPE
+            ) {
+                // Orientation change did not occur on this device config. Skipping the test.
+                return@onActivity
+            }
+            if (!isSidecar) {
+                verify(callbackInterface, atLeastOnce())
+                    .onWindowLayoutChanged(
+                        any(),
+                        argThat(DistinctWindowLayoutInfoMatcher())
+                    )
+            } else {
+                verify(callbackInterface, atLeastOnce())
+                    .onWindowLayoutChanged(any(), any())
+            }
+        }
+    }
+
+    @Test
+    public fun testVersionSupport() {
+        // Only versions 1.0 and 0.1 are supported for now
+        var version = SidecarCompat.sidecarVersion
+        if (version != null) {
+            assertEquals(Version.VERSION_0_1, version)
+        }
+        version = ExtensionCompat.extensionVersion
+        if (version != null) {
+            assertEquals(Version.VERSION_1_0, version)
+        }
+    }
+
+    private fun assumeExtensionV10_V01() {
+        Assume.assumeTrue(
+            Version.VERSION_1_0 == ExtensionCompat.extensionVersion ||
+                Version.VERSION_0_1 == SidecarCompat.sidecarVersion
+        )
+    }
+
+    private val isSidecar: Boolean
+        get() = SidecarCompat.sidecarVersion != null
+
+    /**
+     * An argument matcher that ensures the arguments used to call are distinct.  The only exception
+     * is to allow the first value to trigger twice in case the initial value is pushed and then
+     * replayed.
+     */
+    private class DistinctWindowLayoutInfoMatcher : ArgumentMatcher<WindowLayoutInfo> {
+        private val mWindowLayoutInfos: MutableSet<WindowLayoutInfo> = HashSet()
+        override fun matches(windowLayoutInfo: WindowLayoutInfo): Boolean {
+            return when {
+                mWindowLayoutInfos.size == 1 &&
+                    mWindowLayoutInfos.contains(windowLayoutInfo) -> {
+                    // First element is emitted twice so it is allowed
+                    true
+                }
+                mWindowLayoutInfos.contains(windowLayoutInfo) -> {
+                    false
+                }
+                windowLayoutInfo.displayFeatures.isEmpty() -> {
+                    true
+                }
+                else -> {
+                    mWindowLayoutInfos.add(windowLayoutInfo)
+                    true
+                }
+            }
+        }
+    }
+
+    /**
+     * An argument matcher to ensure each [WindowLayoutInfo] is valid.
+     */
+    private class WindowLayoutInfoValidator(private val mActivity: TestActivity) :
+        ArgumentMatcher<WindowLayoutInfo> {
+        override fun matches(windowLayoutInfo: WindowLayoutInfo): Boolean {
+            if (windowLayoutInfo.displayFeatures.isEmpty()) {
+                return true
+            }
+            for (displayFeature in windowLayoutInfo.displayFeatures) {
+                if (!isValid(mActivity, displayFeature)) {
+                    return false
+                }
+            }
+            return true
+        }
+    }
+
+    private companion object {
+        private fun isValid(activity: TestActivity, displayFeature: DisplayFeature): Boolean {
+            if (displayFeature !is FoldingFeature) {
+                return false
+            }
+            val featureRect: Rect = displayFeature.bounds
+            val windowMetrics = WindowManager(activity).getCurrentWindowMetrics()
+            if (
+                featureRect.height() == 0 && featureRect.width() == 0 || featureRect.left < 0 ||
+                featureRect.top < 0
+            ) {
+                return false
+            }
+            if (featureRect.right < 1 || featureRect.right > windowMetrics.bounds.width()) {
+                return false
+            }
+            return if (
+                featureRect.bottom < 1 || featureRect.bottom > windowMetrics.bounds.height()
+            ) {
+                false
+            } else true
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.java
deleted file mode 100644
index 21880fb..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.java
+++ /dev/null
@@ -1,139 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionFoldingFeature;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ExtensionTranslatingCallbackTest {
-
-    private static final Rect WINDOW_BOUNDS = new Rect(0, 0, 50, 100);
-
-    private TestWindowBoundsHelper mWindowBoundsHelper;
-
-    @Before
-    public void setUp() {
-        mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    public void testOnWindowLayoutChange_validFeature() {
-        Activity mockActivity = mock(Activity.class);
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        ExtensionDisplayFeature foldFeature = new ExtensionFoldingFeature(bounds,
-                ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT);
-
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        extensionDisplayFeatures.add(foldFeature);
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        List<DisplayFeature> expectedFeatures = new ArrayList<>();
-        expectedFeatures.add(new FoldingFeature(foldFeature.getBounds(), FoldingFeature.TYPE_FOLD,
-                FoldingFeature.STATE_FLAT));
-        WindowLayoutInfo expected = new WindowLayoutInfo(expectedFeatures);
-
-        ExtensionCallbackInterface mockCallback = mock(ExtensionCallbackInterface.class);
-        ExtensionTranslatingCallback extensionTranslatingCallback =
-                new ExtensionTranslatingCallback(mockCallback, new ExtensionAdapter());
-
-        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo);
-
-        ArgumentCaptor<WindowLayoutInfo> captor = ArgumentCaptor.forClass(WindowLayoutInfo.class);
-        verify(mockCallback).onWindowLayoutChanged(eq(mockActivity), captor.capture());
-        assertEquals(expected, captor.getValue());
-    }
-
-    @Test
-    public void testOnWindowLayoutChange_filterRemovesHingeFeatureNotSpanningFullDimension() {
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, 2);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
-                WINDOW_BOUNDS.bottom / 2);
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullWidthBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullHeightBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-
-        ExtensionCallbackInterface mockCallback = mock(ExtensionCallbackInterface.class);
-        ExtensionTranslatingCallback extensionTranslatingCallback =
-                new ExtensionTranslatingCallback(mockCallback, new ExtensionAdapter());
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        Activity mockActivity = mock(Activity.class);
-
-        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo);
-
-        verify(mockCallback).onWindowLayoutChanged(eq(mockActivity),
-                argThat((layoutInfo) -> layoutInfo.getDisplayFeatures().isEmpty()));
-    }
-
-    @Test
-    public void testOnWindowLayoutChange_filterRemovesFoldFeatureNotSpanningFullDimension() {
-        List<ExtensionDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
-                WINDOW_BOUNDS.bottom / 2);
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullWidthBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-        extensionDisplayFeatures.add(new ExtensionFoldingFeature(fullHeightBounds,
-                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT));
-
-        ExtensionCallbackInterface mockCallback = mock(ExtensionCallbackInterface.class);
-        ExtensionTranslatingCallback extensionTranslatingCallback =
-                new ExtensionTranslatingCallback(mockCallback, new ExtensionAdapter());
-        ExtensionWindowLayoutInfo windowLayoutInfo =
-                new ExtensionWindowLayoutInfo(extensionDisplayFeatures);
-
-        Activity mockActivity = mock(Activity.class);
-
-        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo);
-
-        verify(mockCallback).onWindowLayoutChanged(eq(mockActivity),
-                argThat((layoutInfo) -> layoutInfo.getDisplayFeatures().isEmpty()));
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.kt
new file mode 100644
index 0000000..f093695
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionTranslatingCallbackTest.kt
@@ -0,0 +1,144 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.extensions.ExtensionDisplayFeature
+import androidx.window.extensions.ExtensionFoldingFeature
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.argumentCaptor
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+
+public class ExtensionTranslatingCallbackTest {
+
+    private lateinit var windowBoundsHelper: TestWindowBoundsHelper
+
+    @Before
+    public fun setUp() {
+        windowBoundsHelper = TestWindowBoundsHelper()
+        windowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(windowBoundsHelper)
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    public fun testOnWindowLayoutChange_validFeature() {
+        val mockActivity = mock<Activity>()
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val foldFeature: ExtensionDisplayFeature = ExtensionFoldingFeature(
+            bounds,
+            ExtensionFoldingFeature.TYPE_FOLD, ExtensionFoldingFeature.STATE_FLAT
+        )
+        val extensionDisplayFeatures = listOf(foldFeature)
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val expectedFeatures = listOf(
+            FoldingFeature(
+                foldFeature.bounds, FoldingFeature.TYPE_FOLD,
+                FoldingFeature.STATE_FLAT
+            )
+        )
+        val expected = WindowLayoutInfo(expectedFeatures)
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        val extensionTranslatingCallback =
+            ExtensionTranslatingCallback(mockCallback, ExtensionAdapter())
+        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo)
+        val captor = argumentCaptor<WindowLayoutInfo>()
+        verify(mockCallback)
+            .onWindowLayoutChanged(eq(mockActivity), captor.capture())
+        assertEquals(expected, captor.firstValue)
+    }
+
+    @Test
+    public fun testOnWindowLayoutChange_filterRemovesHingeFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, 2
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val extensionDisplayFeatures = listOf(
+            ExtensionFoldingFeature(
+                fullWidthBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            ),
+            ExtensionFoldingFeature(
+                fullHeightBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            )
+        )
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        val extensionTranslatingCallback =
+            ExtensionTranslatingCallback(mockCallback, ExtensionAdapter())
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val mockActivity = mock<Activity>()
+        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo)
+        verify(mockCallback).onWindowLayoutChanged(
+            eq(mockActivity),
+            argThat { layoutInfo -> layoutInfo.displayFeatures.isEmpty() }
+        )
+    }
+
+    @Test
+    public fun testOnWindowLayoutChange_filterRemovesFoldFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val extensionDisplayFeatures = listOf(
+            ExtensionFoldingFeature(
+                fullWidthBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            ),
+            ExtensionFoldingFeature(
+                fullHeightBounds,
+                ExtensionFoldingFeature.TYPE_HINGE, ExtensionFoldingFeature.STATE_FLAT
+            )
+        )
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        val extensionTranslatingCallback =
+            ExtensionTranslatingCallback(mockCallback, ExtensionAdapter())
+        val windowLayoutInfo = ExtensionWindowLayoutInfo(extensionDisplayFeatures)
+        val mockActivity = mock<Activity>()
+        extensionTranslatingCallback.onWindowLayoutChanged(mockActivity, windowLayoutInfo)
+        verify(mockCallback).onWindowLayoutChanged(
+            eq(mockActivity),
+            argThat { layoutInfo -> layoutInfo.displayFeatures.isEmpty() }
+        )
+    }
+
+    internal companion object {
+        private val WINDOW_BOUNDS = Rect(0, 0, 50, 100)
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.java b/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.java
deleted file mode 100644
index 4924914..0000000
--- a/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.java
+++ /dev/null
@@ -1,241 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Rect;
-
-import androidx.core.util.Consumer;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import com.google.common.util.concurrent.MoreExecutors;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/** Tests for {@link ExtensionWindowBackend} class. */
-@SuppressWarnings({"deprecation", "unchecked"}) // TODO(b/173739071) remove DeviceState
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class ExtensionWindowBackendTest extends WindowTestBase {
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-        ExtensionWindowBackend.resetInstance();
-    }
-
-    @Test
-    public void testGetInstance() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        assertNotNull(backend);
-
-        // Verify that getInstance always returns the same value
-        ExtensionWindowBackend newBackend = ExtensionWindowBackend.getInstance(mContext);
-        assertEquals(backend, newBackend);
-    }
-
-    @Test
-    public void testInitAndVerifyExtension() {
-        Version extensionVersion = ExtensionCompat.getExtensionVersion();
-        assumeTrue(extensionVersion != null);
-        assertTrue(ExtensionWindowBackend.isExtensionVersionSupported(extensionVersion));
-
-        ExtensionInterfaceCompat extension =
-                ExtensionWindowBackend.initAndVerifyExtension(mContext);
-        assertNotNull(extension);
-        assertTrue(extension instanceof ExtensionCompat);
-        assertTrue(extension.validateExtensionInterface());
-    }
-
-    @Test
-    public void testInitAndVerifySidecar() {
-        Version sidecarVersion = SidecarCompat.getSidecarVersion();
-        assumeTrue(sidecarVersion != null);
-        assertTrue(ExtensionWindowBackend.isExtensionVersionSupported(sidecarVersion));
-
-        ExtensionInterfaceCompat sidecar =
-                ExtensionWindowBackend.initAndVerifyExtension(mContext);
-        assertNotNull(sidecar);
-        assertTrue(sidecar instanceof SidecarCompat);
-        assertTrue(sidecar.validateExtensionInterface());
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-
-        assertEquals(1, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerAdded(activity);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(consumer);
-
-        assertTrue(backend.mWindowLayoutChangeCallbacks.isEmpty());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerRemoved(eq(activity));
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_callsExtensionOnce() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-        backend.registerLayoutChangeCallback(activity, Runnable::run,
-                mock(WindowLayoutInfoConsumer.class));
-
-        assertEquals(2, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerAdded(activity);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(consumer);
-
-        assertEquals(1, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension, times(0))
-                .onWindowLayoutChangeListenerRemoved(eq(activity));
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_clearListeners() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> firstConsumer = mock(WindowLayoutInfoConsumer.class);
-        Consumer<WindowLayoutInfo> secondConsumer = mock(WindowLayoutInfoConsumer.class);
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        backend.registerLayoutChangeCallback(activity, Runnable::run, firstConsumer);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, secondConsumer);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(firstConsumer);
-        backend.unregisterLayoutChangeCallback(secondConsumer);
-
-        assertTrue(backend.mWindowLayoutChangeCallbacks.isEmpty());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerRemoved(activity);
-    }
-
-    @Test
-    public void testLayoutChangeCallback_emitNewValue() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check that callbacks from the extension are propagated correctly
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-        WindowLayoutInfo windowLayoutInfo = newTestWindowLayoutInfo();
-
-        ExtensionWindowBackend.ExtensionListenerImpl backendListener =
-                backend.new ExtensionListenerImpl();
-        backendListener.onWindowLayoutChanged(activity, windowLayoutInfo);
-
-        verify(consumer).accept(eq(windowLayoutInfo));
-    }
-
-    @Test
-    public void testWindowLayoutInfo_updatesOnSubsequentRegistration() {
-        SwitchOnUnregisterExtensionInterfaceCompat interfaceCompat =
-                new SwitchOnUnregisterExtensionInterfaceCompat();
-        ExtensionWindowBackend backend = new ExtensionWindowBackend(interfaceCompat);
-        Activity activity = mock(Activity.class);
-        SimpleConsumer<WindowLayoutInfo> consumer = new SimpleConsumer<>();
-        Executor executor = MoreExecutors.directExecutor();
-        List<WindowLayoutInfo> expected = new ArrayList<>();
-
-        backend.registerLayoutChangeCallback(activity, executor, consumer);
-        expected.add(interfaceCompat.currentWindowLayoutInfo());
-        backend.unregisterLayoutChangeCallback(consumer);
-        backend.registerLayoutChangeCallback(activity, executor, consumer);
-        expected.add(interfaceCompat.currentWindowLayoutInfo());
-        backend.unregisterLayoutChangeCallback(consumer);
-
-        assertEquals(expected, consumer.mValues);
-    }
-
-    private static WindowLayoutInfo newTestWindowLayoutInfo() {
-        WindowLayoutInfo.Builder builder = new WindowLayoutInfo.Builder();
-        WindowLayoutInfo windowLayoutInfo = builder.build();
-
-        assertTrue(windowLayoutInfo.getDisplayFeatures().isEmpty());
-
-        DisplayFeature feature1 = new FoldingFeature(new Rect(0, 2, 3, 4),
-                FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT);
-        DisplayFeature feature2 = new FoldingFeature(new Rect(0, 1, 5, 1),
-                FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT);
-
-        List<DisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(feature1);
-        displayFeatures.add(feature2);
-
-        builder = new WindowLayoutInfo.Builder();
-        builder.setDisplayFeatures(displayFeatures);
-        return builder.build();
-    }
-
-    private interface WindowLayoutInfoConsumer extends Consumer<WindowLayoutInfo> { }
-
-    private static class SimpleConsumer<T> implements Consumer<T> {
-        private final List<T> mValues;
-
-        SimpleConsumer() {
-            mValues = new ArrayList<>();
-        }
-
-        @Override
-        public void accept(T t) {
-            mValues.add(t);
-        }
-
-        List<T> allValues() {
-            return mValues;
-        }
-
-        T lastValue() {
-            return mValues.get(mValues.size() - 1);
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.kt b/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.kt
new file mode 100644
index 0000000..51d5e6b
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/ExtensionWindowBackendTest.kt
@@ -0,0 +1,215 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.content.Context
+import android.graphics.Rect
+import androidx.core.util.Consumer
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.util.concurrent.MoreExecutors
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.times
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [ExtensionWindowBackend] class.  */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class ExtensionWindowBackendTest : WindowTestBase() {
+    private lateinit var context: Context
+
+    @Before
+    public fun setUp() {
+        context = ApplicationProvider.getApplicationContext()
+        ExtensionWindowBackend.resetInstance()
+    }
+
+    @Test
+    public fun testGetInstance() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        assertNotNull(backend)
+
+        // Verify that getInstance always returns the same value
+        val newBackend = ExtensionWindowBackend.getInstance(context)
+        assertEquals(backend, newBackend)
+    }
+
+    @Test
+    public fun testInitAndVerifyExtension() {
+        val extensionVersion = ExtensionCompat.extensionVersion
+        assumeTrue(extensionVersion != null)
+        assertTrue(ExtensionWindowBackend.isExtensionVersionSupported(extensionVersion))
+        val extension = ExtensionWindowBackend.initAndVerifyExtension(context)
+        assertNotNull(extension)
+        assertTrue(extension is ExtensionCompat)
+        assertTrue(extension!!.validateExtensionInterface())
+    }
+
+    @Test
+    public fun testInitAndVerifySidecar() {
+        val sidecarVersion = SidecarCompat.sidecarVersion
+        assumeTrue(sidecarVersion != null)
+        assertTrue(ExtensionWindowBackend.isExtensionVersionSupported(sidecarVersion))
+        val sidecar = ExtensionWindowBackend.initAndVerifyExtension(context)
+        assertNotNull(sidecar)
+        assertTrue(sidecar is SidecarCompat)
+        assertTrue(sidecar!!.validateExtensionInterface())
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback() {
+        activityTestRule.scenario.onActivity { activity ->
+            val backend = ExtensionWindowBackend.getInstance(context)
+            backend.windowExtension = mock()
+            // Check registering the layout change callback
+            val consumer = mock<Consumer<WindowLayoutInfo>>()
+
+            backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+            assertEquals(1, backend.windowLayoutChangeCallbacks.size.toLong())
+            verify(backend.windowExtension!!).onWindowLayoutChangeListenerAdded(activity)
+
+            // Check unregistering the layout change callback
+            backend.unregisterLayoutChangeCallback(consumer)
+            assertTrue(backend.windowLayoutChangeCallbacks.isEmpty())
+            verify(backend.windowExtension!!).onWindowLayoutChangeListenerRemoved(
+                eq(activity)
+            )
+        }
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_callsExtensionOnce() {
+        activityTestRule.scenario.onActivity { activity ->
+            val backend = ExtensionWindowBackend.getInstance(context)
+            backend.windowExtension = mock()
+
+            // Check registering the layout change callback
+            val consumer = mock<Consumer<WindowLayoutInfo>>()
+
+            backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
+            backend.registerLayoutChangeCallback(activity, Runnable::run, mock())
+            assertEquals(2, backend.windowLayoutChangeCallbacks.size.toLong())
+            verify(backend.windowExtension!!).onWindowLayoutChangeListenerAdded(activity)
+
+            // Check unregistering the layout change callback
+            backend.unregisterLayoutChangeCallback(consumer)
+            assertEquals(1, backend.windowLayoutChangeCallbacks.size.toLong())
+            verify(backend.windowExtension!!, times(0))
+                .onWindowLayoutChangeListenerRemoved(eq(activity))
+        }
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_clearListeners() {
+        activityTestRule.scenario.onActivity { activity ->
+            val backend = ExtensionWindowBackend.getInstance(context)
+            backend.windowExtension = mock()
+
+            // Check registering the layout change callback
+            val firstConsumer = mock<Consumer<WindowLayoutInfo>>()
+            val secondConsumer = mock<Consumer<WindowLayoutInfo>>()
+
+            backend.registerLayoutChangeCallback(
+                activity,
+                { obj: Runnable -> obj.run() },
+                firstConsumer
+            )
+            backend.registerLayoutChangeCallback(
+                activity,
+                { obj: Runnable -> obj.run() },
+                secondConsumer
+            )
+
+            // Check unregistering the layout change callback
+            backend.unregisterLayoutChangeCallback(firstConsumer)
+            backend.unregisterLayoutChangeCallback(secondConsumer)
+            assertTrue(backend.windowLayoutChangeCallbacks.isEmpty())
+            verify(backend.windowExtension!!).onWindowLayoutChangeListenerRemoved(activity)
+        }
+    }
+
+    @Test
+    public fun testLayoutChangeCallback_emitNewValue() {
+        activityTestRule.scenario.onActivity { activity ->
+            val backend = ExtensionWindowBackend.getInstance(context)
+            backend.windowExtension = mock()
+
+            // Check that callbacks from the extension are propagated correctly
+            val consumer = mock<Consumer<WindowLayoutInfo>>()
+
+            backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+            val windowLayoutInfo = newTestWindowLayoutInfo()
+            val backendListener = backend.ExtensionListenerImpl()
+            backendListener.onWindowLayoutChanged(activity, windowLayoutInfo)
+            verify(consumer).accept(eq(windowLayoutInfo))
+        }
+    }
+
+    @Test
+    public fun testWindowLayoutInfo_updatesOnSubsequentRegistration() {
+        val interfaceCompat = SwitchOnUnregisterExtensionInterfaceCompat()
+        val backend = ExtensionWindowBackend(interfaceCompat)
+        val activity = mock<Activity>()
+        val consumer = SimpleConsumer<WindowLayoutInfo>()
+        val executor = MoreExecutors.directExecutor()
+        val expected = mutableListOf<WindowLayoutInfo>()
+        backend.registerLayoutChangeCallback(activity, executor, consumer)
+        expected.add(interfaceCompat.currentWindowLayoutInfo())
+        backend.unregisterLayoutChangeCallback(consumer)
+        backend.registerLayoutChangeCallback(activity, executor, consumer)
+        expected.add(interfaceCompat.currentWindowLayoutInfo())
+        backend.unregisterLayoutChangeCallback(consumer)
+        assertEquals(expected, consumer.values)
+    }
+
+    private class SimpleConsumer<T> : Consumer<T> {
+        val values = mutableListOf<T>()
+
+        override fun accept(t: T) {
+            values.add(t)
+        }
+    }
+
+    internal companion object {
+        private fun newTestWindowLayoutInfo(): WindowLayoutInfo {
+            var builder = WindowLayoutInfo.Builder()
+            val windowLayoutInfo = builder.build()
+            assertTrue(windowLayoutInfo.displayFeatures.isEmpty())
+            val feature1: DisplayFeature = FoldingFeature(
+                Rect(0, 2, 3, 4),
+                FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT
+            )
+            val feature2: DisplayFeature = FoldingFeature(
+                Rect(0, 1, 5, 1),
+                FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT
+            )
+            val displayFeatures = listOf(feature1, feature2)
+            builder = WindowLayoutInfo.Builder()
+            builder.setDisplayFeatures(displayFeatures)
+            return builder.build()
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.java b/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.java
deleted file mode 100644
index ffe4c7f..0000000
--- a/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.java
+++ /dev/null
@@ -1,280 +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.window;
-
-import static androidx.window.FoldingFeature.OCCLUSION_FULL;
-import static androidx.window.FoldingFeature.OCCLUSION_NONE;
-import static androidx.window.FoldingFeature.ORIENTATION_HORIZONTAL;
-import static androidx.window.FoldingFeature.ORIENTATION_VERTICAL;
-import static androidx.window.FoldingFeature.OcclusionType;
-import static androidx.window.FoldingFeature.Orientation;
-import static androidx.window.FoldingFeature.STATE_FLAT;
-import static androidx.window.FoldingFeature.STATE_HALF_OPENED;
-import static androidx.window.FoldingFeature.TYPE_FOLD;
-import static androidx.window.FoldingFeature.TYPE_HINGE;
-import static androidx.window.FoldingFeature.occlusionTypeToString;
-import static androidx.window.FoldingFeature.orientationToString;
-import static androidx.window.TestFoldingFeatureUtil.allFoldStates;
-import static androidx.window.TestFoldingFeatureUtil.allFoldingFeatureTypeAndStates;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Tests for {@link FoldingFeature} class. */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public final class FoldingFeatureTest {
-
-    @Test(expected = IllegalArgumentException.class)
-    public void tesEmptyRect() {
-        new FoldingFeature(new Rect(), TYPE_HINGE, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testHorizontalHingeWithNonZeroOrigin() {
-        new FoldingFeature(new Rect(1, 10, 20, 10), TYPE_HINGE, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testVerticalHingeWithNonZeroOrigin() {
-        new FoldingFeature(new Rect(10, 1, 19, 29), TYPE_HINGE, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testHorizontalFoldWithNonZeroOrigin() {
-        new FoldingFeature(new Rect(1, 10, 20, 10), TYPE_FOLD, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testVerticalFoldWithNonZeroOrigin() {
-        new FoldingFeature(new Rect(10, 1, 10, 20), TYPE_FOLD, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidType() {
-        new FoldingFeature(new Rect(0, 10, 30, 10), -1, STATE_HALF_OPENED);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidState() {
-        new FoldingFeature(new Rect(0, 10, 30, 10), TYPE_FOLD, -1);
-    }
-
-    @Test
-    @SuppressWarnings("deprecation") // TODO(b/173739071) remove when getType is package private
-    public void testSetBoundsAndType() {
-        Rect bounds = new Rect(0, 10, 30, 10);
-        int type = TYPE_HINGE;
-        int state = STATE_HALF_OPENED;
-        FoldingFeature feature = new FoldingFeature(bounds, type, state);
-
-        assertEquals(bounds, feature.getBounds());
-        assertEquals(type, feature.getType());
-        assertEquals(state, feature.getState());
-    }
-
-    @Test
-    public void testEquals_sameAttributes() {
-        Rect bounds = new Rect(1, 0, 1, 10);
-        int type = TYPE_FOLD;
-        int state = STATE_FLAT;
-
-        FoldingFeature original = new FoldingFeature(bounds, type, state);
-        FoldingFeature copy = new FoldingFeature(bounds, type, state);
-
-        assertEquals(original, copy);
-    }
-
-    @Test
-    public void testEquals_differentRect() {
-        Rect originalRect = new Rect(1, 0, 1, 10);
-        Rect otherRect = new Rect(2, 0, 2, 10);
-        int type = TYPE_FOLD;
-        int state = STATE_FLAT;
-
-        FoldingFeature original = new FoldingFeature(originalRect, type, state);
-        FoldingFeature other = new FoldingFeature(otherRect, type, state);
-
-        assertNotEquals(original, other);
-    }
-
-    @Test
-    public void testEquals_differentType() {
-        Rect rect = new Rect(1, 0, 1, 10);
-        int originalType = TYPE_FOLD;
-        int otherType = TYPE_HINGE;
-        int state = STATE_FLAT;
-
-        FoldingFeature original = new FoldingFeature(rect, originalType, state);
-        FoldingFeature other = new FoldingFeature(rect, otherType, state);
-
-        assertNotEquals(original, other);
-    }
-
-    @Test
-    public void testEquals_differentState() {
-        Rect rect = new Rect(1, 0, 1, 10);
-        int type = TYPE_FOLD;
-        int originalState = STATE_FLAT;
-        int otherState = STATE_HALF_OPENED;
-
-        FoldingFeature original = new FoldingFeature(rect, type, originalState);
-        FoldingFeature other = new FoldingFeature(rect, type, otherState);
-
-        assertNotEquals(original, other);
-    }
-
-    @Test
-    public void testHashCode_matchesIfEqual() {
-        Rect originalRect = new Rect(1, 0, 1, 10);
-        Rect matchingRect = new Rect(1, 0, 1, 10);
-        int type = TYPE_FOLD;
-        int state = STATE_FLAT;
-
-        FoldingFeature original = new FoldingFeature(originalRect, type, state);
-        FoldingFeature matching = new FoldingFeature(matchingRect, type, state);
-
-        assertEquals(original, matching);
-        assertEquals(original.hashCode(), matching.hashCode());
-    }
-
-    @Test
-    public void testIsSeparating_trueForHinge() {
-        Rect bounds = new Rect(1, 0, 1, 10);
-
-        for (FoldingFeature feature : allFoldStates(bounds, TYPE_HINGE)) {
-            assertTrue(separatingModeErrorMessage(true, feature), feature.isSeparating());
-        }
-    }
-
-    @Test
-    public void testIsSeparating_falseForFlatFold() {
-        Rect bounds = new Rect(1, 0, 1, 10);
-
-        FoldingFeature feature = new FoldingFeature(bounds, TYPE_FOLD, STATE_FLAT);
-
-        assertFalse(separatingModeErrorMessage(false, feature), feature.isSeparating());
-    }
-
-    @Test
-    public void testIsSeparating_trueForNotFlatFold() {
-        Rect bounds = new Rect(1, 0, 1, 10);
-
-        List<FoldingFeature> nonFlatFeatures = new ArrayList<>();
-        for (FoldingFeature feature : allFoldStates(bounds, TYPE_FOLD)) {
-            if (feature.getState() != STATE_FLAT) {
-                nonFlatFeatures.add(feature);
-            }
-        }
-
-        for (FoldingFeature feature : nonFlatFeatures) {
-            assertTrue(separatingModeErrorMessage(true, feature), feature.isSeparating());
-        }
-    }
-
-    @Test
-    public void testOcclusionTypeNone_emptyFeature() {
-        Rect bounds = new Rect(0, 100, 100, 100);
-
-        for (FoldingFeature feature: allFoldingFeatureTypeAndStates(bounds)) {
-            assertEquals(occlusionTypeErrorMessage(OCCLUSION_NONE, feature),
-                    OCCLUSION_NONE, feature.getOcclusionMode());
-        }
-    }
-
-    @Test
-    public void testOcclusionTypeFull_nonEmptyHingeFeature() {
-        Rect bounds = new Rect(0, 100, 100, 101);
-
-        for (FoldingFeature feature: allFoldStates(bounds, TYPE_HINGE)) {
-            assertEquals(occlusionTypeErrorMessage(OCCLUSION_FULL, feature),
-                    OCCLUSION_FULL, feature.getOcclusionMode());
-        }
-    }
-
-    @Test
-    public void testGetFeatureOrientation_isHorizontalWhenWidthIsGreaterThanHeight() {
-        Rect bounds = new Rect(0, 100, 200, 100);
-
-        for (FoldingFeature feature: allFoldingFeatureTypeAndStates(bounds)) {
-            assertEquals(featureOrientationErrorMessage(ORIENTATION_HORIZONTAL, feature),
-                    ORIENTATION_HORIZONTAL, feature.getOrientation());
-        }
-    }
-
-    @Test
-    public void testGetFeatureOrientation_isVerticalWhenHeightIsGreaterThanWidth() {
-        Rect bounds = new Rect(100, 0, 100, 200);
-
-        for (FoldingFeature feature: allFoldingFeatureTypeAndStates(bounds)) {
-            assertEquals(featureOrientationErrorMessage(ORIENTATION_VERTICAL, feature),
-                    ORIENTATION_VERTICAL, feature.getOrientation());
-        }
-    }
-
-    @Test
-    public void testGetFeatureOrientation_isVerticalWhenHeightIsEqualToWidth() {
-        Rect bounds = new Rect(0, 0, 100, 100);
-
-        for (FoldingFeature feature: allFoldingFeatureTypeAndStates(bounds)) {
-            assertEquals(featureOrientationErrorMessage(ORIENTATION_VERTICAL, feature),
-                    ORIENTATION_VERTICAL, feature.getOrientation());
-        }
-    }
-
-    @NonNull
-    private String separatingModeErrorMessage(boolean expected, @NonNull FoldingFeature feature) {
-        return errorMessage(FoldingFeature.class.getSimpleName(), "isSeparating",
-                Boolean.toString(expected), Boolean.toString(feature.isSeparating()), feature);
-    }
-
-    @NonNull
-    private static String occlusionTypeErrorMessage(@OcclusionType int expected,
-            FoldingFeature feature) {
-        return errorMessage(FoldingFeature.class.getSimpleName(), "getOcclusionMode",
-                occlusionTypeToString(expected),
-                occlusionTypeToString(feature.getOcclusionMode()), feature);
-    }
-
-    @NonNull
-    private static String featureOrientationErrorMessage(@Orientation int expected,
-            FoldingFeature feature) {
-        return errorMessage(FoldingFeature.class.getSimpleName(), "getFeatureOrientation",
-                orientationToString(expected),
-                orientationToString(feature.getOrientation()), feature);
-    }
-
-    private static String errorMessage(String className, String methodName, String expected,
-            String actual, Object value) {
-        return String.format("%s#%s was expected to be %s but was %s. %s: %s", className,
-                methodName, expected, actual, className, value.toString());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.kt b/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.kt
new file mode 100644
index 0000000..2515fec
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/FoldingFeatureTest.kt
@@ -0,0 +1,283 @@
+/*
+ * 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
+
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.window.FoldingFeature.OcclusionType
+import androidx.window.TestFoldingFeatureUtil.allFoldStates
+import androidx.window.TestFoldingFeatureUtil.allFoldingFeatureTypeAndStates
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [FoldingFeature] class.  */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class FoldingFeatureTest {
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun tesEmptyRect() {
+        FoldingFeature(Rect(), FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_HALF_OPENED)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testHorizontalHingeWithNonZeroOrigin() {
+        FoldingFeature(
+            Rect(1, 10, 20, 10),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testVerticalHingeWithNonZeroOrigin() {
+        FoldingFeature(
+            Rect(10, 1, 19, 29),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testHorizontalFoldWithNonZeroOrigin() {
+        FoldingFeature(
+            Rect(1, 10, 20, 10),
+            FoldingFeature.TYPE_FOLD,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testVerticalFoldWithNonZeroOrigin() {
+        FoldingFeature(
+            Rect(10, 1, 10, 20),
+            FoldingFeature.TYPE_FOLD,
+            FoldingFeature.STATE_HALF_OPENED
+        )
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testInvalidType() {
+        FoldingFeature(Rect(0, 10, 30, 10), -1, FoldingFeature.STATE_HALF_OPENED)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testInvalidState() {
+        FoldingFeature(Rect(0, 10, 30, 10), FoldingFeature.TYPE_FOLD, -1)
+    }
+
+    @Test // TODO(b/173739071) remove when getType is package private
+    public fun testSetBoundsAndType() {
+        val bounds = Rect(0, 10, 30, 10)
+        val type = FoldingFeature.TYPE_HINGE
+        val state = FoldingFeature.STATE_HALF_OPENED
+        val feature = FoldingFeature(bounds, type, state)
+        assertEquals(bounds, feature.bounds)
+        assertEquals(type.toLong(), feature.type.toLong())
+        assertEquals(state.toLong(), feature.state.toLong())
+    }
+
+    @Test
+    public fun testEquals_sameAttributes() {
+        val bounds = Rect(1, 0, 1, 10)
+        val type = FoldingFeature.TYPE_FOLD
+        val state = FoldingFeature.STATE_FLAT
+        val original = FoldingFeature(bounds, type, state)
+        val copy = FoldingFeature(bounds, type, state)
+        assertEquals(original, copy)
+    }
+
+    @Test
+    public fun testEquals_differentRect() {
+        val originalRect = Rect(1, 0, 1, 10)
+        val otherRect = Rect(2, 0, 2, 10)
+        val type = FoldingFeature.TYPE_FOLD
+        val state = FoldingFeature.STATE_FLAT
+        val original = FoldingFeature(originalRect, type, state)
+        val other = FoldingFeature(otherRect, type, state)
+        assertNotEquals(original, other)
+    }
+
+    @Test
+    public fun testEquals_differentType() {
+        val rect = Rect(1, 0, 1, 10)
+        val originalType = FoldingFeature.TYPE_FOLD
+        val otherType = FoldingFeature.TYPE_HINGE
+        val state = FoldingFeature.STATE_FLAT
+        val original = FoldingFeature(rect, originalType, state)
+        val other = FoldingFeature(rect, otherType, state)
+        assertNotEquals(original, other)
+    }
+
+    @Test
+    public fun testEquals_differentState() {
+        val rect = Rect(1, 0, 1, 10)
+        val type = FoldingFeature.TYPE_FOLD
+        val originalState = FoldingFeature.STATE_FLAT
+        val otherState = FoldingFeature.STATE_HALF_OPENED
+        val original = FoldingFeature(rect, type, originalState)
+        val other = FoldingFeature(rect, type, otherState)
+        assertNotEquals(original, other)
+    }
+
+    @Test
+    public fun testHashCode_matchesIfEqual() {
+        val originalRect = Rect(1, 0, 1, 10)
+        val matchingRect = Rect(1, 0, 1, 10)
+        val type = FoldingFeature.TYPE_FOLD
+        val state = FoldingFeature.STATE_FLAT
+        val original = FoldingFeature(originalRect, type, state)
+        val matching = FoldingFeature(matchingRect, type, state)
+        assertEquals(original, matching)
+        assertEquals(original.hashCode().toLong(), matching.hashCode().toLong())
+    }
+
+    @Test
+    public fun testIsSeparating_trueForHinge() {
+        val bounds = Rect(1, 0, 1, 10)
+        for (feature in allFoldStates(bounds, FoldingFeature.TYPE_HINGE)) {
+            assertTrue(separatingModeErrorMessage(true, feature), feature.isSeparating)
+        }
+    }
+
+    @Test
+    public fun testIsSeparating_falseForFlatFold() {
+        val bounds = Rect(1, 0, 1, 10)
+        val feature = FoldingFeature(bounds, FoldingFeature.TYPE_FOLD, FoldingFeature.STATE_FLAT)
+        assertFalse(separatingModeErrorMessage(false, feature), feature.isSeparating)
+    }
+
+    @Test
+    public fun testIsSeparating_trueForNotFlatFold() {
+        val bounds = Rect(1, 0, 1, 10)
+        val nonFlatFeatures = mutableListOf<FoldingFeature>()
+        for (feature in allFoldStates(bounds, FoldingFeature.TYPE_FOLD)) {
+            if (feature.state != FoldingFeature.STATE_FLAT) {
+                nonFlatFeatures.add(feature)
+            }
+        }
+        for (feature in nonFlatFeatures) {
+            assertTrue(separatingModeErrorMessage(true, feature), feature.isSeparating)
+        }
+    }
+
+    @Test
+    public fun testOcclusionTypeNone_emptyFeature() {
+        val bounds = Rect(0, 100, 100, 100)
+        for (feature in allFoldingFeatureTypeAndStates(bounds)) {
+            assertEquals(
+                occlusionTypeErrorMessage(FoldingFeature.OCCLUSION_NONE, feature),
+                FoldingFeature.OCCLUSION_NONE.toLong(), feature.occlusionMode.toLong()
+            )
+        }
+    }
+
+    @Test
+    public fun testOcclusionTypeFull_nonEmptyHingeFeature() {
+        val bounds = Rect(0, 100, 100, 101)
+        for (feature in allFoldStates(bounds, FoldingFeature.TYPE_HINGE)) {
+            assertEquals(
+                occlusionTypeErrorMessage(FoldingFeature.OCCLUSION_FULL, feature),
+                FoldingFeature.OCCLUSION_FULL.toLong(), feature.occlusionMode.toLong()
+            )
+        }
+    }
+
+    @Test
+    public fun testGetFeatureOrientation_isHorizontalWhenWidthIsGreaterThanHeight() {
+        val bounds = Rect(0, 100, 200, 100)
+        for (feature in allFoldingFeatureTypeAndStates(bounds)) {
+            assertEquals(
+                featureOrientationErrorMessage(FoldingFeature.ORIENTATION_HORIZONTAL, feature),
+                FoldingFeature.ORIENTATION_HORIZONTAL.toLong(), feature.orientation.toLong()
+            )
+        }
+    }
+
+    @Test
+    public fun testGetFeatureOrientation_isVerticalWhenHeightIsGreaterThanWidth() {
+        val bounds = Rect(100, 0, 100, 200)
+        for (feature in allFoldingFeatureTypeAndStates(bounds)) {
+            assertEquals(
+                featureOrientationErrorMessage(FoldingFeature.ORIENTATION_VERTICAL, feature),
+                FoldingFeature.ORIENTATION_VERTICAL.toLong(), feature.orientation.toLong()
+            )
+        }
+    }
+
+    @Test
+    public fun testGetFeatureOrientation_isVerticalWhenHeightIsEqualToWidth() {
+        val bounds = Rect(0, 0, 100, 100)
+        for (feature in allFoldingFeatureTypeAndStates(bounds)) {
+            assertEquals(
+                featureOrientationErrorMessage(FoldingFeature.ORIENTATION_VERTICAL, feature),
+                FoldingFeature.ORIENTATION_VERTICAL.toLong(), feature.orientation.toLong()
+            )
+        }
+    }
+
+    private fun separatingModeErrorMessage(expected: Boolean, feature: FoldingFeature): String {
+        return errorMessage(
+            FoldingFeature::class.java.simpleName,
+            "isSeparating",
+            expected.toString(),
+            feature.isSeparating.toString(),
+            feature
+        )
+    }
+
+    internal companion object {
+        private fun occlusionTypeErrorMessage(
+            @OcclusionType expected: Int,
+            feature: FoldingFeature
+        ): String {
+            return errorMessage(
+                FoldingFeature::class.java.simpleName, "getOcclusionMode",
+                FoldingFeature.occlusionTypeToString(expected),
+                FoldingFeature.occlusionTypeToString(feature.occlusionMode), feature
+            )
+        }
+
+        private fun featureOrientationErrorMessage(
+            @FoldingFeature.Orientation expected: Int,
+            feature: FoldingFeature
+        ): String {
+            return errorMessage(
+                FoldingFeature::class.java.simpleName, "getFeatureOrientation",
+                FoldingFeature.orientationToString(expected),
+                FoldingFeature.orientationToString(feature.orientation), feature
+            )
+        }
+
+        private fun errorMessage(
+            className: String,
+            methodName: String,
+            expected: String,
+            actual: String,
+            value: Any
+        ): String {
+            return String.format(
+                "%s#%s was expected to be %s but was %s. %s: %s", className,
+                methodName, expected, actual, className, value.toString()
+            )
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.java b/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.java
deleted file mode 100644
index bc3e6ad3..0000000
--- a/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.java
+++ /dev/null
@@ -1,231 +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.window;
-
-import static androidx.window.SidecarAdapter.setSidecarDevicePosture;
-import static androidx.window.SidecarAdapter.setSidecarDisplayFeatures;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class SidecarAdapterTest implements TranslatorTestInterface {
-
-    private static final Rect WINDOW_BOUNDS = new Rect(0, 0, 50, 100);
-
-    private TestWindowBoundsHelper mWindowBoundsHelper;
-
-    @Before
-    public void setUp() {
-        mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    private static SidecarDisplayFeature sidecarDisplayFeature(Rect bounds, int type) {
-        SidecarDisplayFeature feature = new SidecarDisplayFeature();
-        feature.setRect(bounds);
-        feature.setType(type);
-        return feature;
-    }
-
-    private static SidecarWindowLayoutInfo sidecarWindowLayoutInfo(
-            List<SidecarDisplayFeature> features) {
-        SidecarWindowLayoutInfo layoutInfo = new SidecarWindowLayoutInfo();
-        setSidecarDisplayFeatures(layoutInfo, features);
-        return layoutInfo;
-    }
-
-    private static SidecarDeviceState sidecarDeviceState(int posture) {
-        SidecarDeviceState deviceState = new SidecarDeviceState();
-        setSidecarDevicePosture(deviceState, posture);
-        return deviceState;
-    }
-
-    @Test
-    @Override
-    public void testTranslate_validFeature() {
-        Activity mockActivity = mock(Activity.class);
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        SidecarDisplayFeature foldFeature = sidecarDisplayFeature(bounds,
-                SidecarDisplayFeature.TYPE_FOLD);
-
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        sidecarDisplayFeatures.add(foldFeature);
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        List<DisplayFeature> expectedFeatures = new ArrayList<>();
-        expectedFeatures.add(new FoldingFeature(foldFeature.getRect(), FoldingFeature.TYPE_FOLD,
-                FoldingFeature.STATE_FLAT));
-        WindowLayoutInfo expected = new WindowLayoutInfo(expectedFeatures);
-
-        SidecarAdapter sidecarAdapter = new SidecarAdapter();
-
-        WindowLayoutInfo actual = sidecarAdapter.translate(mockActivity, windowLayoutInfo, state);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testTranslateWindowLayoutInfo_filterRemovesEmptyBoundsFeature() {
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        sidecarDisplayFeatures.add(
-                sidecarDisplayFeature(new Rect(), SidecarDisplayFeature.TYPE_FOLD));
-
-        SidecarAdapter sidecarAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-        Activity mockActivity = mock(Activity.class);
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        WindowLayoutInfo actual = sidecarAdapter.translate(mockActivity, windowLayoutInfo, state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-
-
-    @Test
-    public void testTranslateWindowLayoutInfo_filterRemovesNonEmptyAreaFoldFeature() {
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(0, 1, WINDOW_BOUNDS.width(), 2);
-        Rect fullHeightBounds = new Rect(1, 0, 2, WINDOW_BOUNDS.height());
-        sidecarDisplayFeatures.add(sidecarDisplayFeature(fullWidthBounds,
-                SidecarDisplayFeature.TYPE_FOLD));
-        sidecarDisplayFeatures.add(sidecarDisplayFeature(fullHeightBounds,
-                SidecarDisplayFeature.TYPE_FOLD));
-
-        ExtensionInterfaceCompat.ExtensionCallbackInterface mockCallback = mock(
-                ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        SidecarAdapter sidecarCallbackAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-        Activity mockActivity = mock(Activity.class);
-
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        WindowLayoutInfo actual = sidecarCallbackAdapter.translate(mockActivity, windowLayoutInfo,
-                state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-
-    // TODO(b/175507310): Reinstate after fix.
-    // @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension() {
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, 2);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
-                WINDOW_BOUNDS.bottom / 2);
-        sidecarDisplayFeatures.add(sidecarDisplayFeature(fullWidthBounds,
-                SidecarDisplayFeature.TYPE_HINGE));
-        sidecarDisplayFeatures.add(sidecarDisplayFeature(fullHeightBounds,
-                SidecarDisplayFeature.TYPE_HINGE));
-
-        SidecarAdapter sidecarAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        Activity mockActivity = mock(Activity.class);
-
-        WindowLayoutInfo actual = sidecarAdapter.translate(mockActivity, windowLayoutInfo, state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-
-    // TODO(b/175507310): Reinstate after fix.
-    // @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension() {
-        List<SidecarDisplayFeature> extensionDisplayFeatures = new ArrayList<>();
-        Rect fullWidthBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
-                WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top);
-        Rect fullHeightBounds = new Rect(WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
-                WINDOW_BOUNDS.bottom / 2);
-        extensionDisplayFeatures.add(sidecarDisplayFeature(fullWidthBounds,
-                SidecarDisplayFeature.TYPE_HINGE));
-        extensionDisplayFeatures.add(sidecarDisplayFeature(fullHeightBounds,
-                SidecarDisplayFeature.TYPE_HINGE));
-
-        SidecarAdapter sidecarCallbackAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(
-                extensionDisplayFeatures);
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        Activity mockActivity = mock(Activity.class);
-
-        WindowLayoutInfo actual = sidecarCallbackAdapter.translate(mockActivity, windowLayoutInfo,
-                state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-
-    @Test
-    @Override
-    public void testTranslateWindowLayoutInfo_filterRemovesUnknownFeature() {
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        SidecarDisplayFeature unknownFeature = sidecarDisplayFeature(bounds, 0 /* unknown */);
-        sidecarDisplayFeatures.add(unknownFeature);
-
-        SidecarAdapter sidecarAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-        Activity mockActivity = mock(Activity.class);
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        WindowLayoutInfo actual = sidecarAdapter.translate(mockActivity, windowLayoutInfo, state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-
-    @Test
-    public void testTranslateWindowLayoutInfo_filterRemovesInvalidPostureFeature() {
-        List<SidecarDisplayFeature> sidecarDisplayFeatures = new ArrayList<>();
-        Rect bounds = new Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0);
-        SidecarDisplayFeature unknownFeature = sidecarDisplayFeature(bounds, -1000 /* invalid */);
-        sidecarDisplayFeatures.add(unknownFeature);
-
-        SidecarAdapter sidecarAdapter = new SidecarAdapter();
-        SidecarWindowLayoutInfo windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures);
-        Activity mockActivity = mock(Activity.class);
-        SidecarDeviceState state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED);
-
-        WindowLayoutInfo actual = sidecarAdapter.translate(mockActivity, windowLayoutInfo, state);
-
-        assertTrue(actual.getDisplayFeatures().isEmpty());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.kt
new file mode 100644
index 0000000..69abf1d
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/SidecarAdapterTest.kt
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Sidecar is deprecated but consuming code must be maintained for compatibility reasons
+@file:Suppress("DEPRECATION")
+
+package androidx.window
+
+import android.graphics.Rect
+import androidx.window.sidecar.SidecarDeviceState
+import androidx.window.sidecar.SidecarDisplayFeature
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+
+public class SidecarAdapterTest : TranslatorTestInterface {
+
+    private lateinit var windowBoundsHelper: TestWindowBoundsHelper
+
+    @Before
+    public fun setUp() {
+        windowBoundsHelper = TestWindowBoundsHelper()
+        windowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(windowBoundsHelper)
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    override fun testTranslate_validFeature() {
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val foldFeature = sidecarDisplayFeature(
+            bounds,
+            SidecarDisplayFeature.TYPE_FOLD
+        )
+        val sidecarDisplayFeatures = listOf(foldFeature)
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val expectedFeatures = listOf(
+            FoldingFeature(
+                foldFeature.rect, FoldingFeature.TYPE_FOLD,
+                FoldingFeature.STATE_FLAT
+            )
+        )
+        val expected = WindowLayoutInfo(expectedFeatures)
+        val sidecarAdapter = SidecarAdapter()
+        val actual = sidecarAdapter.translate(windowLayoutInfo, state)
+        assertEquals(expected, actual)
+    }
+
+    @Test
+    public fun testTranslateWindowLayoutInfo_filterRemovesEmptyBoundsFeature() {
+        val sidecarDisplayFeatures = listOf(
+            sidecarDisplayFeature(Rect(), SidecarDisplayFeature.TYPE_FOLD)
+        )
+        val sidecarAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    @Test
+    public fun testTranslateWindowLayoutInfo_filterRemovesNonEmptyAreaFoldFeature() {
+        val fullWidthBounds = Rect(0, 1, WINDOW_BOUNDS.width(), 2)
+        val fullHeightBounds = Rect(1, 0, 2, WINDOW_BOUNDS.height())
+        val sidecarDisplayFeatures = listOf(
+            sidecarDisplayFeature(
+                fullWidthBounds,
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            sidecarDisplayFeature(
+                fullHeightBounds,
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val sidecarCallbackAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarCallbackAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    // TODO(b/175507310): Reinstate after fix.
+    // @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, 2
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, 2,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val sidecarDisplayFeatures = listOf(
+            sidecarDisplayFeature(
+                fullWidthBounds,
+                SidecarDisplayFeature.TYPE_HINGE
+            ),
+            sidecarDisplayFeature(
+                fullHeightBounds,
+                SidecarDisplayFeature.TYPE_HINGE
+            )
+        )
+        val sidecarAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    // TODO(b/175507310): Reinstate after fix.
+    // @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension() {
+        val fullWidthBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top,
+            WINDOW_BOUNDS.right / 2, WINDOW_BOUNDS.top
+        )
+        val fullHeightBounds = Rect(
+            WINDOW_BOUNDS.left, WINDOW_BOUNDS.top, WINDOW_BOUNDS.left,
+            WINDOW_BOUNDS.bottom / 2
+        )
+        val extensionDisplayFeatures = listOf(
+            sidecarDisplayFeature(
+                fullWidthBounds,
+                SidecarDisplayFeature.TYPE_HINGE
+            ),
+            sidecarDisplayFeature(
+                fullHeightBounds,
+                SidecarDisplayFeature.TYPE_HINGE
+            )
+        )
+        val sidecarCallbackAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(
+            extensionDisplayFeatures
+        )
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarCallbackAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    @Test
+    override fun testTranslateWindowLayoutInfo_filterRemovesUnknownFeature() {
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val unknownFeature = sidecarDisplayFeature(bounds, 0 /* unknown */)
+
+        val sidecarDisplayFeatures = listOf(unknownFeature)
+        val sidecarAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    @Test
+    public fun testTranslateWindowLayoutInfo_filterRemovesInvalidPostureFeature() {
+        val bounds = Rect(WINDOW_BOUNDS.left, 0, WINDOW_BOUNDS.right, 0)
+        val unknownFeature = sidecarDisplayFeature(bounds, -1000 /* invalid */)
+        val sidecarDisplayFeatures = listOf(unknownFeature)
+        val sidecarAdapter = SidecarAdapter()
+        val windowLayoutInfo = sidecarWindowLayoutInfo(sidecarDisplayFeatures)
+        val state = sidecarDeviceState(SidecarDeviceState.POSTURE_OPENED)
+        val actual = sidecarAdapter.translate(windowLayoutInfo, state)
+        assertTrue(actual.displayFeatures.isEmpty())
+    }
+
+    internal companion object {
+        private val WINDOW_BOUNDS = Rect(0, 0, 50, 100)
+        private fun sidecarDisplayFeature(bounds: Rect, type: Int): SidecarDisplayFeature {
+            val feature = SidecarDisplayFeature()
+            feature.rect = bounds
+            feature.type = type
+            return feature
+        }
+
+        private fun sidecarWindowLayoutInfo(
+            features: List<SidecarDisplayFeature>
+        ): SidecarWindowLayoutInfo {
+            val layoutInfo = SidecarWindowLayoutInfo()
+            SidecarAdapter.setSidecarDisplayFeatures(layoutInfo, features)
+            return layoutInfo
+        }
+
+        private fun sidecarDeviceState(posture: Int): SidecarDeviceState {
+            val deviceState = SidecarDeviceState()
+            SidecarAdapter.setSidecarDevicePosture(deviceState, posture)
+            return deviceState
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.java b/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.java
deleted file mode 100644
index c2b1590..0000000
--- a/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.java
+++ /dev/null
@@ -1,117 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-import static androidx.window.SidecarAdapter.getSidecarDisplayFeatures;
-import static androidx.window.Version.VERSION_0_1;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
-
-import java.util.List;
-
-/**
- * Tests for {@link SidecarCompat} implementation of {@link ExtensionInterfaceCompat} that are
- * executed with Sidecar implementation provided on the device (and only if one is available).
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class SidecarCompatDeviceTest extends WindowTestBase implements CompatDeviceTestInterface {
-    private SidecarCompat mSidecarCompat;
-    private TestActivity mTestActivity;
-
-    @Before
-    public void setUp() {
-        assumeExtensionV01();
-        mSidecarCompat = new SidecarCompat((Context) ApplicationProvider.getApplicationContext());
-        mTestActivity = mActivityTestRule.launchActivity(new Intent());
-    }
-
-    @Test
-    @Override
-    public void testWindowLayoutCallback() {
-        IBinder windowToken = getActivityWindowToken(mTestActivity);
-        assertNotNull(windowToken);
-        ExtensionCallbackInterface callbackInterface = mock(ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(callbackInterface);
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mTestActivity);
-
-        SidecarWindowLayoutInfo sidecarWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(windowToken);
-
-        verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(any(),
-                argThat(new SidecarMatcher(sidecarWindowLayoutInfo)));
-    }
-
-    private void assumeExtensionV01() {
-        Version sidecarVersion = SidecarCompat.getSidecarVersion();
-        assumeTrue(VERSION_0_1.equals(sidecarVersion));
-    }
-
-    private static class SidecarMatcher implements ArgumentMatcher<WindowLayoutInfo> {
-
-        private final SidecarWindowLayoutInfo mSidecarWindowLayoutInfo;
-
-        SidecarMatcher(SidecarWindowLayoutInfo sidecarWindowLayoutInfo) {
-            mSidecarWindowLayoutInfo = sidecarWindowLayoutInfo;
-        }
-
-        @Override
-        public boolean matches(WindowLayoutInfo windowLayoutInfo) {
-            List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                    getSidecarDisplayFeatures(mSidecarWindowLayoutInfo);
-            if (windowLayoutInfo.getDisplayFeatures().size() != sidecarDisplayFeatures.size()) {
-                return false;
-            }
-            for (int i = 0; i < windowLayoutInfo.getDisplayFeatures().size(); i++) {
-                // Sidecar only has folding features
-                FoldingFeature feature = (FoldingFeature) windowLayoutInfo.getDisplayFeatures()
-                        .get(i);
-                SidecarDisplayFeature sidecarDisplayFeature = sidecarDisplayFeatures.get(i);
-
-                if (feature.getType() != sidecarDisplayFeature.getType()) {
-                    return false;
-                }
-                if (!feature.getBounds().equals(sidecarDisplayFeature.getRect())) {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.kt b/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.kt
new file mode 100644
index 0000000..a3a0a0e
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/SidecarCompatDeviceTest.kt
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+// Sidecar is deprecated but consuming code must be maintained for compatibility reasons
+@file:Suppress("DEPRECATION")
+
+package androidx.window
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.atLeastOnce
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Assert.assertNotNull
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatcher
+
+/**
+ * Tests for [SidecarCompat] implementation of [ExtensionInterfaceCompat] that are
+ * executed with Sidecar implementation provided on the device (and only if one is available).
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class SidecarCompatDeviceTest : WindowTestBase(), CompatDeviceTestInterface {
+
+    private lateinit var sidecarCompat: SidecarCompat
+
+    @Before
+    public fun setUp() {
+        assumeExtensionV01()
+        sidecarCompat = SidecarCompat(ApplicationProvider.getApplicationContext() as Context)
+    }
+
+    @Test
+    override fun testWindowLayoutCallback() {
+        activityTestRule.scenario.onActivity { testActivity ->
+            val windowToken = getActivityWindowToken(testActivity)
+            assertNotNull(windowToken)
+            val callbackInterface = mock<ExtensionCallbackInterface>()
+            sidecarCompat.setExtensionCallback(callbackInterface)
+            sidecarCompat.onWindowLayoutChangeListenerAdded(testActivity)
+            val sidecarWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(windowToken)
+            verify(callbackInterface, atLeastOnce()).onWindowLayoutChanged(
+                any(),
+                argThat(SidecarMatcher(sidecarWindowLayoutInfo))
+            )
+        }
+    }
+
+    private fun assumeExtensionV01() {
+        val sidecarVersion = SidecarCompat.sidecarVersion
+        assumeTrue(Version.VERSION_0_1 == sidecarVersion)
+    }
+
+    private class SidecarMatcher(
+        private val sidecarWindowLayoutInfo: SidecarWindowLayoutInfo
+    ) : ArgumentMatcher<WindowLayoutInfo> {
+        override fun matches(windowLayoutInfo: WindowLayoutInfo): Boolean {
+            val sidecarDisplayFeatures =
+                SidecarAdapter.getSidecarDisplayFeatures(sidecarWindowLayoutInfo)
+            if (windowLayoutInfo.displayFeatures.size != sidecarDisplayFeatures.size) {
+                return false
+            }
+            for (i in windowLayoutInfo.displayFeatures.indices) {
+                // Sidecar only has folding features
+                val feature = windowLayoutInfo.displayFeatures[i] as FoldingFeature
+                val sidecarDisplayFeature = sidecarDisplayFeatures[i]
+                if (feature.type != sidecarDisplayFeature.type) {
+                    return false
+                }
+                if (feature.bounds != sidecarDisplayFeature.rect) {
+                    return false
+                }
+            }
+            return true
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.java b/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.java
deleted file mode 100644
index eccc28b..0000000
--- a/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.java
+++ /dev/null
@@ -1,530 +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.window;
-
-import static androidx.window.SidecarAdapter.getSidecarDisplayFeatures;
-import static androidx.window.SidecarAdapter.setSidecarDevicePosture;
-import static androidx.window.SidecarAdapter.setSidecarDisplayFeatures;
-import static androidx.window.TestFoldingFeatureUtil.invalidFoldBounds;
-import static androidx.window.TestFoldingFeatureUtil.validFoldBound;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.view.View;
-import android.view.Window;
-
-import androidx.annotation.NonNull;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarInterface;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests for {@link SidecarCompat} implementation of {@link ExtensionInterfaceCompat}. This class
- * uses a mocked Sidecar to verify the behavior of the implementation on any hardware.
- * <p>Because this class extends {@link SidecarCompatDeviceTest}, it will also run the mocked
- * versions of methods defined in {@link CompatDeviceTestInterface}.
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class SidecarCompatTest extends WindowTestBase
-        implements CompatTestInterface {
-    private static final Rect WINDOW_BOUNDS = new Rect(1, 1, 50, 100);
-
-    private Activity mActivity;
-    private SidecarCompat mSidecarCompat;
-
-    @Before
-    public void setUp() {
-        mActivity = mock(Activity.class);
-        mSidecarCompat = new SidecarCompat(mock(SidecarInterface.class), new SidecarAdapter());
-
-        when(mActivity.getResources())
-                .thenReturn(ApplicationProvider.getApplicationContext().getResources());
-
-        Window window = spy(new TestWindow(mActivity));
-        window.getAttributes().token = mock(IBinder.class);
-        when(mActivity.getWindow()).thenReturn(window);
-
-        TestWindowBoundsHelper mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-
-        // Setup mocked sidecar responses
-        SidecarDeviceState defaultDeviceState = new SidecarDeviceState();
-        setSidecarDevicePosture(defaultDeviceState, SidecarDeviceState.POSTURE_HALF_OPENED);
-        when(mSidecarCompat.mSidecar.getDeviceState()).thenReturn(defaultDeviceState);
-
-        SidecarDisplayFeature sidecarDisplayFeature = newDisplayFeature(
-                new Rect(0, 1, WINDOW_BOUNDS.width(), 1), SidecarDisplayFeature.TYPE_HINGE);
-        SidecarWindowLayoutInfo sidecarWindowLayoutInfo = new SidecarWindowLayoutInfo();
-        List<SidecarDisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(sidecarDisplayFeature);
-        setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures);
-        when(mSidecarCompat.mSidecar.getWindowLayoutInfo(any()))
-                .thenReturn(sidecarWindowLayoutInfo);
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    @Override
-    public void testGetWindowLayout() {
-        FakeExtensionImp fakeSidecarImp = new FakeExtensionImp(
-                newDeviceState(SidecarDeviceState.POSTURE_OPENED),
-                newWindowLayoutInfo(Collections.emptyList()));
-        SidecarCompat compat = new SidecarCompat(fakeSidecarImp, new SidecarAdapter());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface mockCallback = mock(
-                ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        compat.setExtensionCallback(mockCallback);
-        compat.onWindowLayoutChangeListenerAdded(mActivity);
-
-        fakeSidecarImp.triggerGoodSignal();
-
-        verify(mockCallback, atLeastOnce()).onWindowLayoutChanged(eq(mActivity),
-                any(WindowLayoutInfo.class));
-    }
-
-    @Test
-    public void testGetWindowLayout_featureWithEmptyBounds() {
-        // Add a feature with an empty bounds to the reported list
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(getActivityWindowToken(mActivity));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                getSidecarDisplayFeatures(originalWindowLayoutInfo);
-        SidecarDisplayFeature newFeature = new SidecarDisplayFeature();
-        newFeature.setRect(new Rect());
-        sidecarDisplayFeatures.add(newFeature);
-
-        // Verify that this feature is skipped.
-        WindowLayoutInfo windowLayoutInfo = mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 1,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_foldWithNonZeroArea() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                getSidecarDisplayFeatures(originalWindowLayoutInfo);
-        // Horizontal fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width(), 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height()),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_hingeNotSpanningEntireWindow() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                getSidecarDisplayFeatures(originalWindowLayoutInfo);
-        // Horizontal hinge.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical hinge.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_foldNotSpanningEntireWindow() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                getSidecarDisplayFeatures(originalWindowLayoutInfo);
-        // Horizontal fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Override
-    public void testExtensionCallback_filterRemovesInvalidValues() {
-        FakeExtensionImp fakeSidecarImp = new FakeExtensionImp(
-                newDeviceState(SidecarDeviceState.POSTURE_OPENED),
-                newWindowLayoutInfo(Collections.emptyList()));
-        SidecarCompat compat = new SidecarCompat(fakeSidecarImp, new SidecarAdapter());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface mockCallback = mock(
-                ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        compat.setExtensionCallback(mockCallback);
-        compat.onWindowLayoutChangeListenerAdded(mActivity);
-
-        fakeSidecarImp.triggerMalformedSignal();
-
-        verify(mockCallback).onWindowLayoutChanged(any(),
-                argThat(windowLayoutInfo -> windowLayoutInfo.getDisplayFeatures().isEmpty()));
-    }
-
-    @Test
-    @Override
-    public void testSetExtensionCallback() {
-        ArgumentCaptor<SidecarInterface.SidecarCallback> sidecarCallbackCaptor =
-                ArgumentCaptor.forClass(SidecarInterface.SidecarCallback.class);
-
-        // Verify that the sidecar got the callback set
-        ExtensionInterfaceCompat.ExtensionCallbackInterface callback =
-                mock(ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(callback);
-
-        verify(mSidecarCompat.mSidecar).setSidecarCallback(sidecarCallbackCaptor.capture());
-
-        // Verify that the callback set for sidecar propagates the device state callback
-        SidecarDeviceState sidecarDeviceState = new SidecarDeviceState();
-        setSidecarDevicePosture(sidecarDeviceState, SidecarDeviceState.POSTURE_HALF_OPENED);
-
-        sidecarCallbackCaptor.getValue().onDeviceStateChanged(sidecarDeviceState);
-
-        // Verify that the callback set for sidecar propagates the window layout callback when a
-        // window layout changed listener has been added.
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        Rect bounds = new Rect(0, 1, WINDOW_BOUNDS.width(), 1);
-        SidecarDisplayFeature sidecarDisplayFeature = newDisplayFeature(bounds,
-                SidecarDisplayFeature.TYPE_HINGE);
-        SidecarWindowLayoutInfo sidecarWindowLayoutInfo = new SidecarWindowLayoutInfo();
-        List<SidecarDisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(sidecarDisplayFeature);
-        setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures);
-
-        sidecarCallbackCaptor.getValue().onWindowLayoutChanged(getActivityWindowToken(mActivity),
-                sidecarWindowLayoutInfo);
-        ArgumentCaptor<WindowLayoutInfo> windowLayoutInfoCaptor =
-                ArgumentCaptor.forClass(WindowLayoutInfo.class);
-        verify(callback).onWindowLayoutChanged(eq(mActivity),
-                windowLayoutInfoCaptor.capture());
-
-        WindowLayoutInfo capturedLayout = windowLayoutInfoCaptor.getValue();
-        assertEquals(1, capturedLayout.getDisplayFeatures().size());
-        DisplayFeature capturedDisplayFeature = capturedLayout.getDisplayFeatures().get(0);
-        FoldingFeature foldingFeature = (FoldingFeature) capturedDisplayFeature;
-        assertNotNull(foldingFeature);
-        assertEquals(bounds, capturedDisplayFeature.getBounds());
-    }
-
-    @Test
-    public void testMissingCallToOnWindowLayoutChangedListenerAdded() {
-        ArgumentCaptor<SidecarInterface.SidecarCallback> sidecarCallbackCaptor =
-                ArgumentCaptor.forClass(SidecarInterface.SidecarCallback.class);
-
-        // Verify that the sidecar got the callback set
-        ExtensionInterfaceCompat.ExtensionCallbackInterface callback =
-                mock(ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(callback);
-
-        verify(mSidecarCompat.mSidecar).setSidecarCallback(sidecarCallbackCaptor.capture());
-
-        // Verify that the callback set for sidecar propagates the window layout callback when a
-        // window layout changed listener has been added.
-        SidecarDisplayFeature sidecarDisplayFeature = new SidecarDisplayFeature();
-        sidecarDisplayFeature.setType(SidecarDisplayFeature.TYPE_HINGE);
-        Rect bounds = new Rect(1, 2, 3, 4);
-        sidecarDisplayFeature.setRect(bounds);
-        SidecarWindowLayoutInfo sidecarWindowLayoutInfo = new SidecarWindowLayoutInfo();
-        List<SidecarDisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(sidecarDisplayFeature);
-        setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures);
-
-        IBinder windowToken = mock(IBinder.class);
-        sidecarCallbackCaptor.getValue().onWindowLayoutChanged(windowToken,
-                sidecarWindowLayoutInfo);
-        verifyZeroInteractions(callback);
-    }
-
-    @Test
-    @Override
-    public void testOnWindowLayoutChangeListenerAdded() {
-        IBinder windowToken = getActivityWindowToken(mActivity);
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        verify(mSidecarCompat.mSidecar).onWindowLayoutChangeListenerAdded(windowToken);
-        verify(mSidecarCompat.mSidecar).onDeviceStateListenersChanged(false);
-    }
-
-    @Test
-    public void testOnWindowLayoutChangeListenerAdded_emitInitialValue() {
-        SidecarWindowLayoutInfo layoutInfo = new SidecarWindowLayoutInfo();
-        WindowLayoutInfo expectedLayoutInfo = new WindowLayoutInfo(new ArrayList<>());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface listener =
-                mock(ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(listener);
-        when(mSidecarCompat.mSidecar.getWindowLayoutInfo(any())).thenReturn(layoutInfo);
-
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-
-        verify(listener).onWindowLayoutChanged(mActivity, expectedLayoutInfo);
-    }
-
-    @Test
-    public void testOnWindowLayoutChangeListenerAdded_emitInitialValueDelayed() {
-        SidecarWindowLayoutInfo layoutInfo = new SidecarWindowLayoutInfo();
-        WindowLayoutInfo expectedLayoutInfo = new WindowLayoutInfo(new ArrayList<>());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface listener =
-                mock(ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(listener);
-        when(mSidecarCompat.mSidecar.getWindowLayoutInfo(any())).thenReturn(layoutInfo);
-        View fakeView = mock(View.class);
-        Window fakeWindow = new TestWindow(mActivity, fakeView);
-        doAnswer(invocation -> {
-            View.OnAttachStateChangeListener stateChangeListener = invocation.getArgument(0);
-            fakeWindow.getAttributes().token = mock(IBinder.class);
-            stateChangeListener.onViewAttachedToWindow(fakeView);
-            return null;
-        }).when(fakeView).addOnAttachStateChangeListener(any());
-        when(mActivity.getWindow()).thenReturn(fakeWindow);
-
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-
-        verify(listener).onWindowLayoutChanged(mActivity, expectedLayoutInfo);
-    }
-
-    @Test
-    @Override
-    public void testOnWindowLayoutChangeListenerRemoved() {
-        IBinder windowToken = getActivityWindowToken(mActivity);
-        mSidecarCompat.onWindowLayoutChangeListenerRemoved(mActivity);
-        verify(mSidecarCompat.mSidecar).onWindowLayoutChangeListenerRemoved(eq(windowToken));
-    }
-
-    @Test
-    public void testOnDeviceStateListenersChanged() {
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        mSidecarCompat.onWindowLayoutChangeListenerRemoved(mActivity);
-        verify(mSidecarCompat.mSidecar).onDeviceStateListenersChanged(true);
-    }
-
-    @Test
-    public void testOnDeviceStateChangedUpdatesWindowLayout() {
-        FakeExtensionImp fakeSidecarImp = new FakeExtensionImp(
-                newDeviceState(SidecarDeviceState.POSTURE_CLOSED),
-                validWindowLayoutInfo());
-        SidecarCompat compat = new SidecarCompat(fakeSidecarImp, new SidecarAdapter());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface mockCallback = mock(
-                ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        compat.setExtensionCallback(mockCallback);
-        compat.onWindowLayoutChangeListenerAdded(mActivity);
-        ArgumentCaptor<WindowLayoutInfo> windowLayoutCaptor = ArgumentCaptor.forClass(
-                WindowLayoutInfo.class);
-
-        reset(mockCallback);
-        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_OPENED));
-        verify(mockCallback).onWindowLayoutChanged(eq(mActivity), windowLayoutCaptor.capture());
-        FoldingFeature capturedFoldingFeature = (FoldingFeature) windowLayoutCaptor.getValue()
-                .getDisplayFeatures().get(0);
-        assertEquals(FoldingFeature.STATE_FLAT, capturedFoldingFeature.getState());
-
-        reset(mockCallback);
-        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_HALF_OPENED));
-        verify(mockCallback).onWindowLayoutChanged(eq(mActivity), windowLayoutCaptor.capture());
-        capturedFoldingFeature = (FoldingFeature) windowLayoutCaptor.getValue().getDisplayFeatures()
-                .get(0);
-        assertEquals(FoldingFeature.STATE_HALF_OPENED, capturedFoldingFeature.getState());
-
-        // No display features must be reported in closed state or flipped state.
-        reset(mockCallback);
-        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_CLOSED));
-        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_FLIPPED));
-        verify(mockCallback).onWindowLayoutChanged(eq(mActivity), windowLayoutCaptor.capture());
-        assertTrue(windowLayoutCaptor.getValue().getDisplayFeatures().isEmpty());
-    }
-
-    private static SidecarDisplayFeature newDisplayFeature(Rect rect, int type) {
-        SidecarDisplayFeature feature = new SidecarDisplayFeature();
-        feature.setRect(rect);
-        feature.setType(type);
-        return feature;
-    }
-
-    private static SidecarWindowLayoutInfo newWindowLayoutInfo(
-            List<SidecarDisplayFeature> features) {
-        SidecarWindowLayoutInfo info = new SidecarWindowLayoutInfo();
-        setSidecarDisplayFeatures(info, features);
-        return info;
-    }
-
-    private static SidecarWindowLayoutInfo validWindowLayoutInfo() {
-        List<SidecarDisplayFeature> goodFeatures = new ArrayList<>();
-
-        goodFeatures.add(newDisplayFeature(validFoldBound(WINDOW_BOUNDS),
-                SidecarDisplayFeature.TYPE_FOLD));
-
-        return newWindowLayoutInfo(goodFeatures);
-    }
-
-    private static SidecarDeviceState newDeviceState(int posture) {
-        SidecarDeviceState state = new SidecarDeviceState();
-        setSidecarDevicePosture(state, posture);
-        return state;
-    }
-
-    private static final class FakeExtensionImp implements SidecarInterface {
-
-        private SidecarDeviceState mDeviceState;
-        private SidecarWindowLayoutInfo mInfo;
-        private SidecarInterface.SidecarCallback mCallback;
-        private List<IBinder> mTokens = new ArrayList<>();
-
-        FakeExtensionImp(@NonNull SidecarDeviceState deviceState,
-                @NonNull SidecarWindowLayoutInfo info) {
-            mDeviceState = deviceState;
-            mInfo = info;
-            mCallback = new SidecarInterface.SidecarCallback() {
-                @Override
-                public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
-
-                }
-
-                @Override
-                public void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                        @NonNull SidecarWindowLayoutInfo newLayout) {
-
-                }
-            };
-        }
-
-        @Override
-        public void setSidecarCallback(@NonNull SidecarCallback callback) {
-            mCallback = callback;
-        }
-
-        @NonNull
-        @Override
-        public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
-            return mInfo;
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
-            mTokens.add(windowToken);
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
-            mTokens.remove(windowToken);
-        }
-
-        @NonNull
-        @Override
-        public SidecarDeviceState getDeviceState() {
-            return mDeviceState;
-        }
-
-        @Override
-        public void onDeviceStateListenersChanged(boolean isEmpty) {
-
-        }
-
-        void triggerMalformedSignal() {
-            triggerSignal(malformedWindowLayoutInfo());
-        }
-
-        void triggerGoodSignal() {
-            triggerSignal(validWindowLayoutInfo());
-        }
-
-        void triggerSignal(SidecarWindowLayoutInfo info) {
-            mInfo = info;
-            for (IBinder token : mTokens) {
-                mCallback.onWindowLayoutChanged(token, info);
-            }
-        }
-
-        public void triggerDeviceState(SidecarDeviceState state) {
-            mDeviceState = state;
-            mCallback.onDeviceStateChanged(state);
-        }
-
-        private SidecarWindowLayoutInfo malformedWindowLayoutInfo() {
-            List<SidecarDisplayFeature> malformedFeatures = new ArrayList<>();
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(newDisplayFeature(malformedBound,
-                        SidecarDisplayFeature.TYPE_FOLD));
-            }
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(newDisplayFeature(malformedBound,
-                        SidecarDisplayFeature.TYPE_HINGE));
-            }
-
-            return newWindowLayoutInfo(malformedFeatures);
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.kt b/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.kt
new file mode 100644
index 0000000..71a1733
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/SidecarCompatTest.kt
@@ -0,0 +1,536 @@
+/*
+ * 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.
+ */
+// Sidecar is deprecated but consuming code must be maintained for compatibility reasons
+@file:Suppress("DEPRECATION")
+
+package androidx.window
+
+import android.app.Activity
+import android.content.Context
+import android.graphics.Rect
+import android.os.IBinder
+import android.view.View
+import android.view.Window
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.TestFoldingFeatureUtil.invalidFoldBounds
+import androidx.window.TestFoldingFeatureUtil.validFoldBound
+import androidx.window.sidecar.SidecarDeviceState
+import androidx.window.sidecar.SidecarDisplayFeature
+import androidx.window.sidecar.SidecarInterface
+import androidx.window.sidecar.SidecarInterface.SidecarCallback
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.argThat
+import com.nhaarman.mockitokotlin2.argumentCaptor
+import com.nhaarman.mockitokotlin2.atLeastOnce
+import com.nhaarman.mockitokotlin2.doAnswer
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.reset
+import com.nhaarman.mockitokotlin2.spy
+import com.nhaarman.mockitokotlin2.verify
+import com.nhaarman.mockitokotlin2.verifyZeroInteractions
+import com.nhaarman.mockitokotlin2.whenever
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for [SidecarCompat] implementation of [ExtensionInterfaceCompat]. This class
+ * uses a mocked Sidecar to verify the behavior of the implementation on any hardware.
+ *
+ * Because this class extends [SidecarCompatDeviceTest], it will also run the mocked
+ * versions of methods defined in [CompatDeviceTestInterface].
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class SidecarCompatTest : WindowTestBase(), CompatTestInterface {
+
+    private lateinit var activity: Activity
+    private lateinit var sidecarCompat: SidecarCompat
+
+    @Before
+    public fun setUp() {
+        activity = mock()
+        sidecarCompat = SidecarCompat(mock(), SidecarAdapter())
+        whenever(activity.getResources())
+            .thenReturn(ApplicationProvider.getApplicationContext<Context>().resources)
+        val window: Window = spy(TestWindow(activity))
+        window.attributes.token = mock()
+        whenever(activity.getWindow()).thenReturn(window)
+        val mWindowBoundsHelper = TestWindowBoundsHelper()
+        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(mWindowBoundsHelper)
+
+        // Setup mocked sidecar responses
+        val defaultDeviceState = SidecarDeviceState()
+        SidecarAdapter.setSidecarDevicePosture(
+            defaultDeviceState,
+            SidecarDeviceState.POSTURE_HALF_OPENED
+        )
+        whenever(sidecarCompat.sidecar!!.deviceState).thenReturn(defaultDeviceState)
+        val sidecarDisplayFeature = newDisplayFeature(
+            Rect(0, 1, WINDOW_BOUNDS.width(), 1), SidecarDisplayFeature.TYPE_HINGE
+        )
+        val sidecarWindowLayoutInfo = SidecarWindowLayoutInfo()
+        val displayFeatures = listOf(sidecarDisplayFeature)
+        SidecarAdapter.setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures)
+        whenever(sidecarCompat.sidecar!!.getWindowLayoutInfo(any()))
+            .thenReturn(sidecarWindowLayoutInfo)
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    override fun testGetWindowLayout() {
+        val fakeSidecarImp = FakeExtensionImp(
+            newDeviceState(SidecarDeviceState.POSTURE_OPENED),
+            newWindowLayoutInfo(emptyList())
+        )
+        val compat = SidecarCompat(fakeSidecarImp, SidecarAdapter())
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        compat.setExtensionCallback(mockCallback)
+        compat.onWindowLayoutChangeListenerAdded(activity)
+        fakeSidecarImp.triggerGoodSignal()
+        verify(mockCallback, atLeastOnce()).onWindowLayoutChanged(eq(activity), any())
+    }
+
+    @Test
+    public fun testGetWindowLayout_featureWithEmptyBounds() {
+        // Add a feature with an empty bounds to the reported list
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(
+            getActivityWindowToken(
+                activity
+            )
+        )
+        val sidecarDisplayFeatures =
+            SidecarAdapter.getSidecarDisplayFeatures(originalWindowLayoutInfo)
+        val newFeature = SidecarDisplayFeature()
+        newFeature.rect = Rect()
+        SidecarAdapter.setSidecarDisplayFeatures(
+            originalWindowLayoutInfo,
+            sidecarDisplayFeatures + newFeature
+        )
+
+        // Verify that this feature is skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_foldWithNonZeroArea() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(mock())
+        val sidecarDisplayFeatures =
+            SidecarAdapter.getSidecarDisplayFeatures(originalWindowLayoutInfo)
+        val additionalFeatures = listOf(
+            // Horizontal fold.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width(), 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical fold.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height()),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_hingeNotSpanningEntireWindow() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(mock())
+        val sidecarDisplayFeatures =
+            SidecarAdapter.getSidecarDisplayFeatures(originalWindowLayoutInfo)
+        val additionalFeatures = listOf(
+            // Horizontal hinge.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical hinge.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_foldNotSpanningEntireWindow() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(mock())
+        val sidecarDisplayFeatures =
+            SidecarAdapter.getSidecarDisplayFeatures(originalWindowLayoutInfo)
+
+        val additionalFeatures = listOf(
+            // Horizontal fold.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical fold.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    override fun testExtensionCallback_filterRemovesInvalidValues() {
+        val fakeSidecarImp = FakeExtensionImp(
+            newDeviceState(SidecarDeviceState.POSTURE_OPENED),
+            newWindowLayoutInfo(emptyList())
+        )
+        val compat = SidecarCompat(fakeSidecarImp, SidecarAdapter())
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        compat.setExtensionCallback(mockCallback)
+        compat.onWindowLayoutChangeListenerAdded(activity)
+        fakeSidecarImp.triggerMalformedSignal()
+        verify(mockCallback).onWindowLayoutChanged(
+            any(),
+            argThat { windowLayoutInfo -> windowLayoutInfo.displayFeatures.isEmpty() }
+        )
+    }
+
+    @Test
+    override fun testSetExtensionCallback() {
+        val sidecarCallbackCaptor = argumentCaptor<SidecarCallback>()
+
+        // Verify that the sidecar got the callback set
+        val callback = mock<ExtensionCallbackInterface>()
+        sidecarCompat.setExtensionCallback(callback)
+        verify(sidecarCompat.sidecar!!)
+            .setSidecarCallback(sidecarCallbackCaptor.capture())
+
+        // Verify that the callback set for sidecar propagates the device state callback
+        val sidecarDeviceState = SidecarDeviceState()
+        SidecarAdapter.setSidecarDevicePosture(
+            sidecarDeviceState,
+            SidecarDeviceState.POSTURE_HALF_OPENED
+        )
+        sidecarCallbackCaptor.firstValue.onDeviceStateChanged(sidecarDeviceState)
+
+        // Verify that the callback set for sidecar propagates the window layout callback when a
+        // window layout changed listener has been added.
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        val bounds = Rect(0, 1, WINDOW_BOUNDS.width(), 1)
+        val sidecarDisplayFeature = newDisplayFeature(
+            bounds,
+            SidecarDisplayFeature.TYPE_HINGE
+        )
+        val sidecarWindowLayoutInfo = SidecarWindowLayoutInfo()
+        val displayFeatures = listOf(sidecarDisplayFeature)
+        SidecarAdapter.setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures)
+        sidecarCallbackCaptor.firstValue.onWindowLayoutChanged(
+            getActivityWindowToken(
+                activity
+            ),
+            sidecarWindowLayoutInfo
+        )
+        val windowLayoutInfoCaptor = argumentCaptor<WindowLayoutInfo>()
+        verify(callback).onWindowLayoutChanged(eq(activity), windowLayoutInfoCaptor.capture())
+        val capturedLayout = windowLayoutInfoCaptor.firstValue
+        assertEquals(1, capturedLayout.displayFeatures.size.toLong())
+        val capturedDisplayFeature = capturedLayout.displayFeatures[0]
+        val foldingFeature = capturedDisplayFeature as FoldingFeature
+        assertNotNull(foldingFeature)
+        assertEquals(bounds, capturedDisplayFeature.bounds)
+    }
+
+    @Test
+    public fun testMissingCallToOnWindowLayoutChangedListenerAdded() {
+        val sidecarCallbackCaptor = argumentCaptor<SidecarCallback>()
+        // Verify that the sidecar got the callback set
+        val callback = mock<ExtensionCallbackInterface>()
+        sidecarCompat.setExtensionCallback(callback)
+        verify(sidecarCompat.sidecar!!)
+            .setSidecarCallback(sidecarCallbackCaptor.capture())
+
+        // Verify that the callback set for sidecar propagates the window layout callback when a
+        // window layout changed listener has been added.
+        val sidecarDisplayFeature = SidecarDisplayFeature()
+        sidecarDisplayFeature.type = SidecarDisplayFeature.TYPE_HINGE
+        val bounds = Rect(1, 2, 3, 4)
+        sidecarDisplayFeature.rect = bounds
+        val sidecarWindowLayoutInfo = SidecarWindowLayoutInfo()
+        val displayFeatures = listOf(sidecarDisplayFeature)
+        SidecarAdapter.setSidecarDisplayFeatures(sidecarWindowLayoutInfo, displayFeatures)
+        val windowToken = mock<IBinder>()
+        sidecarCallbackCaptor.firstValue.onWindowLayoutChanged(
+            windowToken,
+            sidecarWindowLayoutInfo
+        )
+        verifyZeroInteractions(callback)
+    }
+
+    @Test
+    override fun testOnWindowLayoutChangeListenerAdded() {
+        val windowToken = getActivityWindowToken(
+            activity
+        )
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(sidecarCompat.sidecar!!).onWindowLayoutChangeListenerAdded(windowToken)
+        verify(sidecarCompat.sidecar!!).onDeviceStateListenersChanged(false)
+    }
+
+    @Test
+    public fun testOnWindowLayoutChangeListenerAdded_emitInitialValue() {
+        val layoutInfo = SidecarWindowLayoutInfo()
+        val expectedLayoutInfo = WindowLayoutInfo(listOf())
+        val listener = mock<ExtensionCallbackInterface>()
+        sidecarCompat.setExtensionCallback(listener)
+        whenever(sidecarCompat.sidecar!!.getWindowLayoutInfo(any()))
+            .thenReturn(layoutInfo)
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(listener).onWindowLayoutChanged(
+            activity, expectedLayoutInfo
+        )
+    }
+
+    @Test
+    public fun testOnWindowLayoutChangeListenerAdded_emitInitialValueDelayed() {
+        val layoutInfo = SidecarWindowLayoutInfo()
+        val expectedLayoutInfo = WindowLayoutInfo(listOf())
+        val listener = mock<ExtensionCallbackInterface>()
+        sidecarCompat.setExtensionCallback(listener)
+        whenever(sidecarCompat.sidecar!!.getWindowLayoutInfo(any()))
+            .thenReturn(layoutInfo)
+        val fakeView = mock<View>()
+        val fakeWindow: Window = TestWindow(activity, fakeView)
+        doAnswer { invocation ->
+            val stateChangeListener = invocation.getArgument<View.OnAttachStateChangeListener>(0)
+            fakeWindow.attributes.token = mock()
+            stateChangeListener.onViewAttachedToWindow(fakeView)
+            null
+        }.whenever(fakeView).addOnAttachStateChangeListener(any())
+        whenever(activity.window).thenReturn(fakeWindow)
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(listener).onWindowLayoutChanged(
+            activity, expectedLayoutInfo
+        )
+    }
+
+    @Test
+    override fun testOnWindowLayoutChangeListenerRemoved() {
+        val windowToken = getActivityWindowToken(
+            activity
+        )
+        sidecarCompat.onWindowLayoutChangeListenerRemoved(activity)
+        verify(sidecarCompat.sidecar!!).onWindowLayoutChangeListenerRemoved(
+            eq(windowToken)
+        )
+    }
+
+    @Test
+    public fun testOnDeviceStateListenersChanged() {
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        sidecarCompat.onWindowLayoutChangeListenerRemoved(activity)
+        verify(sidecarCompat.sidecar!!).onDeviceStateListenersChanged(true)
+    }
+
+    @Test
+    public fun testOnDeviceStateChangedUpdatesWindowLayout() {
+        val fakeSidecarImp = FakeExtensionImp(
+            newDeviceState(SidecarDeviceState.POSTURE_CLOSED),
+            validWindowLayoutInfo()
+        )
+        val compat = SidecarCompat(fakeSidecarImp, SidecarAdapter())
+        val mockCallback = mock<ExtensionCallbackInterface>()
+        compat.setExtensionCallback(mockCallback)
+        compat.onWindowLayoutChangeListenerAdded(activity)
+        val windowLayoutCaptor = argumentCaptor<WindowLayoutInfo>()
+        reset(mockCallback)
+        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_OPENED))
+        verify(mockCallback).onWindowLayoutChanged(eq(activity), windowLayoutCaptor.capture())
+        var capturedFoldingFeature = windowLayoutCaptor.firstValue
+            .displayFeatures[0] as FoldingFeature
+        assertEquals(
+            FoldingFeature.STATE_FLAT.toLong(),
+            capturedFoldingFeature.state.toLong()
+        )
+        reset(mockCallback)
+        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_HALF_OPENED))
+        verify(mockCallback)
+            .onWindowLayoutChanged(eq(activity), windowLayoutCaptor.capture())
+        capturedFoldingFeature = windowLayoutCaptor.secondValue.displayFeatures[0] as FoldingFeature
+        assertEquals(
+            FoldingFeature.STATE_HALF_OPENED.toLong(),
+            capturedFoldingFeature.state.toLong()
+        )
+
+        // No display features must be reported in closed state or flipped state.
+        reset(mockCallback)
+        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_CLOSED))
+        fakeSidecarImp.triggerDeviceState(newDeviceState(SidecarDeviceState.POSTURE_FLIPPED))
+        verify(mockCallback)
+            .onWindowLayoutChanged(eq(activity), windowLayoutCaptor.capture())
+        assertTrue(windowLayoutCaptor.thirdValue.displayFeatures.isEmpty())
+    }
+
+    private class FakeExtensionImp(
+        private var deviceState: SidecarDeviceState,
+        private var info: SidecarWindowLayoutInfo
+    ) : SidecarInterface {
+        private var callback: SidecarCallback
+        private val tokens = mutableListOf<IBinder>()
+        override fun setSidecarCallback(callback: SidecarCallback) {
+            this.callback = callback
+        }
+
+        override fun getWindowLayoutInfo(windowToken: IBinder): SidecarWindowLayoutInfo {
+            return info
+        }
+
+        override fun onWindowLayoutChangeListenerAdded(windowToken: IBinder) {
+            tokens.add(windowToken)
+        }
+
+        override fun onWindowLayoutChangeListenerRemoved(windowToken: IBinder) {
+            tokens.remove(windowToken)
+        }
+
+        override fun getDeviceState(): SidecarDeviceState {
+            return deviceState
+        }
+
+        override fun onDeviceStateListenersChanged(isEmpty: Boolean) {}
+        fun triggerMalformedSignal() {
+            triggerSignal(malformedWindowLayoutInfo())
+        }
+
+        fun triggerGoodSignal() {
+            triggerSignal(validWindowLayoutInfo())
+        }
+
+        fun triggerSignal(info: SidecarWindowLayoutInfo) {
+            this.info = info
+            for (token in tokens) {
+                callback.onWindowLayoutChanged(token, info)
+            }
+        }
+
+        fun triggerDeviceState(state: SidecarDeviceState) {
+            deviceState = state
+            callback.onDeviceStateChanged(state)
+        }
+
+        private fun malformedWindowLayoutInfo(): SidecarWindowLayoutInfo {
+            val malformedFeatures = mutableListOf<SidecarDisplayFeature>()
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    newDisplayFeature(
+                        malformedBound,
+                        SidecarDisplayFeature.TYPE_FOLD
+                    )
+                )
+            }
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    newDisplayFeature(
+                        malformedBound,
+                        SidecarDisplayFeature.TYPE_HINGE
+                    )
+                )
+            }
+            return newWindowLayoutInfo(malformedFeatures)
+        }
+
+        init {
+            callback = object : SidecarCallback {
+                override fun onDeviceStateChanged(newDeviceState: SidecarDeviceState) {}
+                override fun onWindowLayoutChanged(
+                    windowToken: IBinder,
+                    newLayout: SidecarWindowLayoutInfo
+                ) {
+                }
+            }
+        }
+    }
+
+    private companion object {
+        private val WINDOW_BOUNDS = Rect(1, 1, 50, 100)
+        private fun newDisplayFeature(rect: Rect, type: Int): SidecarDisplayFeature {
+            val feature = SidecarDisplayFeature()
+            feature.rect = rect
+            feature.type = type
+            return feature
+        }
+
+        private fun newWindowLayoutInfo(
+            features: List<SidecarDisplayFeature>
+        ): SidecarWindowLayoutInfo {
+            val info = SidecarWindowLayoutInfo()
+            SidecarAdapter.setSidecarDisplayFeatures(info, features)
+            return info
+        }
+
+        private fun validWindowLayoutInfo(): SidecarWindowLayoutInfo {
+            val goodFeatures = listOf(
+                newDisplayFeature(
+                    validFoldBound(WINDOW_BOUNDS),
+                    SidecarDisplayFeature.TYPE_FOLD
+                )
+            )
+            return newWindowLayoutInfo(goodFeatures)
+        }
+
+        private fun newDeviceState(posture: Int): SidecarDeviceState {
+            val state = SidecarDeviceState()
+            SidecarAdapter.setSidecarDevicePosture(state, posture)
+            return state
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/TestActivity.java b/window/window/src/androidTest/java/androidx/window/TestActivity.java
deleted file mode 100644
index b5632cd..0000000
--- a/window/window/src/androidTest/java/androidx/window/TestActivity.java
+++ /dev/null
@@ -1,97 +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.window;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import androidx.annotation.Nullable;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class TestActivity extends Activity implements View.OnLayoutChangeListener {
-
-    private CountDownLatch mLayoutLatch = new CountDownLatch(1);
-    private static CountDownLatch sResumeLatch = new CountDownLatch(1);
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        final View contentView = new View(this);
-        setContentView(contentView);
-
-        getWindow().getDecorView().addOnLayoutChangeListener(this);
-    }
-
-    @Override
-    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
-            int oldTop, int oldRight, int oldBottom) {
-        mLayoutLatch.countDown();
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        sResumeLatch.countDown();
-    }
-
-    /**
-     * Resets layout counter when waiting for a layout to happen before calling
-     * {@link #waitForLayout()}.
-     */
-    public void resetLayoutCounter() {
-        mLayoutLatch = new CountDownLatch(1);
-    }
-
-    /**
-     * Blocks and waits for the next layout to happen. {@link #resetLayoutCounter()} must be called
-     * before calling this method.
-     * @return {@code true} if the layout happened before the timeout count reached zero and
-     *         {@code false} if the waiting time elapsed before the layout happened.
-     */
-    public boolean waitForLayout() {
-        try {
-            return mLayoutLatch.await(3, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Resets layout counter when waiting for a layout to happen before calling
-     * {@link #waitForOnResume()}.
-     */
-    public static void resetResumeCounter() {
-        sResumeLatch = new CountDownLatch(1);
-    }
-
-    /**
-     * Same as {@link #waitForLayout()}, but waits for onResume() to be called for any activity of
-     * this class. This can be used to track activity re-creation.
-     * @return {@code true} if the onResume() happened before the timeout count reached zero and
-     *         {@code false} if the waiting time elapsed before the onResume() happened.
-     */
-    public static boolean waitForOnResume() {
-        try {
-            return sResumeLatch.await(3, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            return false;
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/TestActivity.kt b/window/window/src/androidTest/java/androidx/window/TestActivity.kt
new file mode 100644
index 0000000..e05121e
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/TestActivity.kt
@@ -0,0 +1,103 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.os.Bundle
+import android.view.View
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+public open class TestActivity : Activity(), View.OnLayoutChangeListener {
+
+    private var layoutLatch = CountDownLatch(1)
+
+    public override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val contentView = View(this)
+        setContentView(contentView)
+        window.decorView.addOnLayoutChangeListener(this)
+    }
+
+    override fun onLayoutChange(
+        v: View,
+        left: Int,
+        top: Int,
+        right: Int,
+        bottom: Int,
+        oldLeft: Int,
+        oldTop: Int,
+        oldRight: Int,
+        oldBottom: Int
+    ) {
+        layoutLatch.countDown()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        resumeLatch.countDown()
+    }
+
+    /**
+     * Resets layout counter when waiting for a layout to happen before calling
+     * [.waitForLayout].
+     */
+    public fun resetLayoutCounter() {
+        layoutLatch = CountDownLatch(1)
+    }
+
+    /**
+     * Blocks and waits for the next layout to happen. [.resetLayoutCounter] must be called
+     * before calling this method.
+     * @return `true` if the layout happened before the timeout count reached zero and
+     * `false` if the waiting time elapsed before the layout happened.
+     */
+    public fun waitForLayout(): Boolean {
+        return try {
+            layoutLatch.await(3, TimeUnit.SECONDS)
+        } catch (e: InterruptedException) {
+            false
+        }
+    }
+
+    internal companion object {
+        private var resumeLatch = CountDownLatch(1)
+
+        /**
+         * Resets layout counter when waiting for a layout to happen before calling
+         * [.waitForOnResume].
+         */
+        @JvmStatic
+        fun resetResumeCounter() {
+            resumeLatch = CountDownLatch(1)
+        }
+
+        /**
+         * Same as [.waitForLayout], but waits for onResume() to be called for any activity of
+         * this class. This can be used to track activity re-creation.
+         * @return `true` if the onResume() happened before the timeout count reached zero and
+         * `false` if the waiting time elapsed before the onResume() happened.
+         */
+        @JvmStatic
+        fun waitForOnResume(): Boolean {
+            return try {
+                resumeLatch.await(3, TimeUnit.SECONDS)
+            } catch (e: InterruptedException) {
+                false
+            }
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.java b/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.java
deleted file mode 100644
index 2f42d07..0000000
--- a/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.java
+++ /dev/null
@@ -1,21 +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.window;
-
-/** Activity that handles orientation configuration change. */
-public final class TestConfigChangeHandlingActivity extends TestActivity {
-}
diff --git a/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.kt b/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.kt
new file mode 100644
index 0000000..541a273
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/TestConfigChangeHandlingActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * 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
+
+/** Activity that handles orientation configuration change.  */
+internal class TestConfigChangeHandlingActivity : TestActivity()
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/TestWindowBoundsHelper.java b/window/window/src/androidTest/java/androidx/window/TestWindowBoundsHelper.java
deleted file mode 100644
index 15a069e..0000000
--- a/window/window/src/androidTest/java/androidx/window/TestWindowBoundsHelper.java
+++ /dev/null
@@ -1,100 +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.window;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.HashMap;
-
-/**
- * Subclass of {@link WindowBoundsHelper} used to override the results for testing.
- *
- * @see WindowBoundsHelper
- * @see WindowBoundsHelper#setForTesting(WindowBoundsHelper)
- */
-class TestWindowBoundsHelper extends WindowBoundsHelper {
-    private Rect mGlobalOverriddenBounds;
-    private final HashMap<Activity, Rect> mOverriddenBounds = new HashMap<>();
-    private final HashMap<Activity, Rect> mOverriddenMaximumBounds = new HashMap<>();
-
-    /**
-     * Overrides the bounds returned from this helper for the given context. Passing null {@code
-     * bounds} has the effect of clearing the bounds override.
-     * <p>
-     * Note: A global override set as a result of {@link #setCurrentBounds(Rect)} takes precedence
-     * over the value set with this method.
-     */
-    void setCurrentBoundsForActivity(@NonNull Activity activity, @Nullable Rect bounds) {
-        mOverriddenBounds.put(activity, bounds);
-    }
-
-    /**
-     * Overrides the max bounds returned from this helper for the given context. Passing {@code
-     * null} {@code bounds} has the effect of clearing the bounds override.
-     */
-    void setMaximumBoundsForActivity(@NonNull Activity activity, @Nullable Rect bounds) {
-        mOverriddenMaximumBounds.put(activity, bounds);
-    }
-
-    /**
-     * Overrides the bounds returned from this helper for all supplied contexts. Passing null
-     * {@code bounds} has the effect of clearing the global override.
-     */
-    void setCurrentBounds(@Nullable Rect bounds) {
-        mGlobalOverriddenBounds = bounds;
-    }
-
-    @Override
-    @NonNull
-    Rect computeCurrentWindowBounds(Activity activity) {
-        if (mGlobalOverriddenBounds != null) {
-            return mGlobalOverriddenBounds;
-        }
-
-        Rect bounds = mOverriddenBounds.get(activity);
-        if (bounds != null) {
-            return bounds;
-        }
-
-        return super.computeCurrentWindowBounds(activity);
-    }
-
-    @NonNull
-    @Override
-    Rect computeMaximumWindowBounds(Activity activity) {
-        Rect bounds = mOverriddenMaximumBounds.get(activity);
-        if (bounds != null) {
-            return bounds;
-        }
-
-        return super.computeMaximumWindowBounds(activity);
-    }
-
-    /**
-     * Clears any overrides set with {@link #setCurrentBounds(Rect)} or
-     * {@link #setCurrentBoundsForActivity(Activity, Rect)}.
-     */
-    void reset() {
-        mGlobalOverriddenBounds = null;
-        mOverriddenBounds.clear();
-        mOverriddenMaximumBounds.clear();
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.java b/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.java
deleted file mode 100644
index 2c1decc..0000000
--- a/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.java
+++ /dev/null
@@ -1,28 +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.window;
-
-/**
- * An interface to ensure the same tests are run for translating from value objects in
- * window.sidecar or window.extensions to window.window.
- */
-public interface TranslatorTestInterface {
-    void testTranslate_validFeature();
-    void testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension();
-    void testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension();
-    void testTranslateWindowLayoutInfo_filterRemovesUnknownFeature();
-}
diff --git a/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.kt b/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.kt
new file mode 100644
index 0000000..85ec2a9
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/TranslatorTestInterface.kt
@@ -0,0 +1,27 @@
+/*
+ * 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
+
+/**
+ * An interface to ensure the same tests are run for translating from value objects in
+ * window.sidecar or window.extensions to window.window.
+ */
+internal interface TranslatorTestInterface {
+    fun testTranslate_validFeature()
+    fun testTranslateWindowLayoutInfo_filterRemovesHingeFeatureNotSpanningFullDimension()
+    fun testTranslateWindowLayoutInfo_filterRemovesFoldFeatureNotSpanningFullDimension()
+    fun testTranslateWindowLayoutInfo_filterRemovesUnknownFeature()
+}
diff --git a/window/window/src/androidTest/java/androidx/window/VersionTest.java b/window/window/src/androidTest/java/androidx/window/VersionTest.java
deleted file mode 100644
index ce83b7f..0000000
--- a/window/window/src/androidTest/java/androidx/window/VersionTest.java
+++ /dev/null
@@ -1,84 +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.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public final class VersionTest {
-
-    @Test
-    public void testParse() {
-        // Test valid version string
-        Version v = Version.parse("1.2.3-test");
-        assertNotNull(v);
-        assertEquals(1, v.getMajor());
-        assertEquals(2, v.getMinor());
-        assertEquals(3, v.getPatch());
-        assertEquals("test", v.getDescription());
-
-        // Test invalid version string
-        v = Version.parse("invalid");
-        assertNull(v);
-    }
-
-    @Test
-    public void testCompareTo() {
-        // Test diff in major
-        Version v1 = Version.parse("2.2.3-test");
-        Version v2 = Version.parse("1.2.3-test");
-        assertThat(v1.compareTo(v2)).isGreaterThan(0);
-        assertThat(v2.compareTo(v1)).isLessThan(0);
-
-        // Test diff in minor
-        v1 = Version.parse("1.2.3-test");
-        v2 = Version.parse("1.1.3-test");
-        assertThat(v1.compareTo(v2)).isGreaterThan(0);
-        assertThat(v2.compareTo(v1)).isLessThan(0);
-
-        // Test diff in patch
-        v1 = Version.parse("1.2.3-test");
-        v2 = Version.parse("1.2.0-test");
-        assertThat(v1.compareTo(v2)).isGreaterThan(0);
-        assertThat(v2.compareTo(v1)).isLessThan(0);
-
-        // Test equals. Description is not included in the check.
-        v1 = Version.parse("1.2.3-t1");
-        v2 = Version.parse("1.2.3-t2");
-        assertEquals(v1, v2);
-        assertEquals(v1.hashCode(), v2.hashCode());
-    }
-
-    @Test
-    public void testStatics() {
-        assertEquals(Version.parse("0.1.0-1"), Version.VERSION_0_1);
-        assertEquals(Version.parse("1.0.0-2"), Version.VERSION_1_0);
-        assertEquals(Version.parse("0.0.0-3"), Version.UNKNOWN);
-        assertEquals(Version.CURRENT, Version.VERSION_1_0);
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/VersionTest.kt b/window/window/src/androidTest/java/androidx/window/VersionTest.kt
new file mode 100644
index 0000000..272f777
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/VersionTest.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.window
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertNull
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class VersionTest {
+
+    @Test
+    public fun testParse() {
+        // Test valid version string
+        var v = Version.parse("1.2.3-test")
+        assertNotNull(v)
+        assertEquals(1, v!!.major.toLong())
+        assertEquals(2, v.minor.toLong())
+        assertEquals(3, v.patch.toLong())
+        assertEquals("test", v.description)
+
+        // Test invalid version string
+        v = Version.parse("invalid")
+        assertNull(v)
+    }
+
+    @Test
+    public fun testCompareTo() {
+        // Test diff in major
+        var v1 = Version.parse("2.2.3-test")
+        var v2 = Version.parse("1.2.3-test")
+        assertThat(v1!!.compareTo(v2!!)).isGreaterThan(0)
+        assertThat(v2.compareTo(v1)).isLessThan(0)
+
+        // Test diff in minor
+        v1 = Version.parse("1.2.3-test")
+        v2 = Version.parse("1.1.3-test")
+        assertThat(v1!!.compareTo(v2!!)).isGreaterThan(0)
+        assertThat(v2.compareTo(v1)).isLessThan(0)
+
+        // Test diff in patch
+        v1 = Version.parse("1.2.3-test")
+        v2 = Version.parse("1.2.0-test")
+        assertThat(v1!!.compareTo(v2!!)).isGreaterThan(0)
+        assertThat(v2.compareTo(v1)).isLessThan(0)
+
+        // Test equals. Description is not included in the check.
+        v1 = Version.parse("1.2.3-t1")
+        v2 = Version.parse("1.2.3-t2")
+        assertEquals(v1, v2)
+        assertEquals(v1.hashCode().toLong(), v2.hashCode().toLong())
+    }
+
+    @Test
+    public fun testStatics() {
+        assertEquals(Version.parse("0.1.0-1"), Version.VERSION_0_1)
+        assertEquals(Version.parse("1.0.0-2"), Version.VERSION_1_0)
+        assertEquals(Version.parse("0.0.0-3"), Version.UNKNOWN)
+        assertEquals(Version.CURRENT, Version.VERSION_1_0)
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowBackendTest.java b/window/window/src/androidTest/java/androidx/window/WindowBackendTest.java
deleted file mode 100644
index 34bbc2a..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowBackendTest.java
+++ /dev/null
@@ -1,91 +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.window;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Consumer;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import com.google.common.util.concurrent.MoreExecutors;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/** Tests for {@link WindowBackend} class. */
-@SuppressWarnings("unchecked")
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class WindowBackendTest extends WindowTestBase {
-
-    /**
-     * Verifies that {@link WindowManager} instance would use the assigned
-     * {@link WindowBackend}.
-     */
-    @Test
-    public void testFakeWindowBackend() {
-        WindowLayoutInfo windowLayoutInfo = newTestWindowLayout();
-        WindowBackend windowBackend = new FakeWindowBackend(windowLayoutInfo);
-        TestActivity activity = mActivityTestRule.launchActivity(new Intent());
-        WindowManager wm = new WindowManager(activity, windowBackend);
-        Consumer<WindowLayoutInfo> layoutInfoConsumer = mock(Consumer.class);
-
-        wm.registerLayoutChangeCallback(MoreExecutors.directExecutor(), layoutInfoConsumer);
-
-        verify(layoutInfoConsumer).accept(windowLayoutInfo);
-    }
-
-    private WindowLayoutInfo newTestWindowLayout() {
-        List<DisplayFeature> displayFeatureList = new ArrayList<>();
-        DisplayFeature displayFeature = new FoldingFeature(
-                new Rect(10, 0, 10, 100), FoldingFeature.TYPE_HINGE,
-                FoldingFeature.STATE_FLAT);
-        displayFeatureList.add(displayFeature);
-        return new WindowLayoutInfo(displayFeatureList);
-    }
-
-    private static class FakeWindowBackend implements WindowBackend {
-        private WindowLayoutInfo mWindowLayoutInfo;
-
-        private FakeWindowBackend(@NonNull WindowLayoutInfo windowLayoutInfo) {
-            mWindowLayoutInfo = windowLayoutInfo;
-        }
-
-        @Override
-        public void registerLayoutChangeCallback(@NonNull Activity activity,
-                @NonNull Executor executor, @NonNull Consumer<WindowLayoutInfo> callback) {
-            executor.execute(() -> callback.accept(mWindowLayoutInfo));
-        }
-
-        @Override
-        public void unregisterLayoutChangeCallback(@NonNull Consumer<WindowLayoutInfo> callback) {
-            // Empty
-        }
-
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowBackendTest.kt b/window/window/src/androidTest/java/androidx/window/WindowBackendTest.kt
new file mode 100644
index 0000000..fce69cd
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowBackendTest.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.window
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.core.util.Consumer
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.util.concurrent.MoreExecutors
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import java.util.concurrent.Executor
+
+/** Tests for [WindowBackend] class.  */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class WindowBackendTest : WindowTestBase() {
+
+    /**
+     * Verifies that [WindowManager] instance would use the assigned
+     * [WindowBackend].
+     */
+    @Test
+    public fun testFakeWindowBackend() {
+        val windowLayoutInfo = newTestWindowLayout()
+        val windowBackend: WindowBackend = FakeWindowBackend(windowLayoutInfo)
+        activityTestRule.scenario.onActivity { activity ->
+            val wm = WindowManager(activity, windowBackend)
+            val layoutInfoConsumer: Consumer<WindowLayoutInfo> = mock(
+                WindowLayoutInfoConsumer::class.java
+            )
+            wm.registerLayoutChangeCallback(MoreExecutors.directExecutor(), layoutInfoConsumer)
+            verify(layoutInfoConsumer).accept(windowLayoutInfo)
+        }
+    }
+
+    private fun newTestWindowLayout(): WindowLayoutInfo {
+        val displayFeature: DisplayFeature = FoldingFeature(
+            Rect(10, 0, 10, 100), FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_FLAT
+        )
+        return WindowLayoutInfo(listOf(displayFeature))
+    }
+
+    private interface WindowLayoutInfoConsumer : Consumer<WindowLayoutInfo>
+
+    private class FakeWindowBackend(private val windowLayoutInfo: WindowLayoutInfo) :
+        WindowBackend {
+        override fun registerLayoutChangeCallback(
+            activity: Activity,
+            executor: Executor,
+            callback: Consumer<WindowLayoutInfo>
+        ) {
+            executor.execute { callback.accept(windowLayoutInfo) }
+        }
+
+        override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
+            // Empty
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.java b/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.java
deleted file mode 100644
index c320d4d..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.java
+++ /dev/null
@@ -1,319 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assume.assumeFalse;
-import static org.junit.Assume.assumeTrue;
-
-import android.app.Activity;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Build;
-import android.view.Display;
-import android.view.WindowManager;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.test.core.app.ActivityScenario;
-import androidx.test.ext.junit.rules.ActivityScenarioRule;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import org.junit.AssumptionViolatedException;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/** Tests for {@link WindowBoundsHelper} class. */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class WindowBoundsHelperTest {
-    @Rule
-    public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
-            new ActivityScenarioRule<>(TestActivity.class);
-
-    @Test
-    public void testGetCurrentWindowBounds_matchParentWindowSize_avoidCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetCurrentWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-            lp.height = WindowManager.LayoutParams.MATCH_PARENT;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetCurrentWindowBounds_fixedWindowSize_avoidCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetCurrentWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = 100;
-            lp.height = 100;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetCurrentWindowBounds_matchParentWindowSize_layoutBehindCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetCurrentWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-            lp.height = WindowManager.LayoutParams.MATCH_PARENT;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetCurrentWindowBounds_fixedWindowSize_layoutBehindCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetCurrentWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = 100;
-            lp.height = 100;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetCurrentWindowBounds_postR() {
-        assumePlatformROrAbove();
-
-        runActionsAcrossActivityLifecycle(activity -> { }, activity -> {
-            Rect bounds = WindowBoundsHelper.getInstance().computeCurrentWindowBounds(activity);
-            Rect windowMetricsBounds =
-                    activity.getWindowManager().getCurrentWindowMetrics().getBounds();
-            assertEquals(windowMetricsBounds, bounds);
-        });
-    }
-
-    @Test
-    public void testGetMaximumWindowBounds_matchParentWindowSize_avoidCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetMaximumWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-            lp.height = WindowManager.LayoutParams.MATCH_PARENT;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetMaximumWindowBounds_fixedWindowSize_avoidCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetMaximumWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = 100;
-            lp.height = 100;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetMaximumWindowBounds_matchParentWindowSize_layoutBehindCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetMaximumWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = WindowManager.LayoutParams.MATCH_PARENT;
-            lp.height = WindowManager.LayoutParams.MATCH_PARENT;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetMaximumWindowBounds_fixedWindowSize_layoutBehindCutouts_preR() {
-        assumePlatformBeforeR();
-        assumeNotMultiWindow();
-
-        testGetMaximumWindowBoundsMatchesRealDisplaySize(activity -> {
-            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
-            lp.width = 100;
-            lp.height = 100;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                lp.layoutInDisplayCutoutMode =
-                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-            }
-            activity.getWindow().setAttributes(lp);
-        });
-    }
-
-    @Test
-    public void testGetMaximumWindowBounds_postR() {
-        assumePlatformROrAbove();
-
-        runActionsAcrossActivityLifecycle(activity -> { }, activity -> {
-            Rect bounds = WindowBoundsHelper.getInstance().computeMaximumWindowBounds(activity);
-            Rect windowMetricsBounds =
-                    activity.getWindowManager().getMaximumWindowMetrics().getBounds();
-            assertEquals(windowMetricsBounds, bounds);
-        });
-    }
-
-    private void testGetCurrentWindowBoundsMatchesRealDisplaySize(
-            ActivityScenario.ActivityAction<TestActivity> initialAction) {
-        ActivityScenario.ActivityAction<TestActivity> assertWindowBoundsMatchesDisplayAction =
-                new AssertCurrentWindowBoundsEqualsRealDisplaySizeAction();
-        runActionsAcrossActivityLifecycle(initialAction, assertWindowBoundsMatchesDisplayAction);
-    }
-
-    private void testGetMaximumWindowBoundsMatchesRealDisplaySize(
-            ActivityScenario.ActivityAction<TestActivity> initialAction) {
-        ActivityScenario.ActivityAction<TestActivity> assertWindowBoundsMatchesDisplayAction =
-                new AssertMaximumWindowBoundsEqualsRealDisplaySizeAction();
-        runActionsAcrossActivityLifecycle(initialAction, assertWindowBoundsMatchesDisplayAction);
-    }
-
-    /**
-     * Creates and launches an activity performing the supplied actions at various points in the
-     * activity lifecycle.
-     *
-     * @param initialAction the action that will run once before the activity is created.
-     * @param verifyAction the action to run once after each change in activity lifecycle state.
-     */
-    private void runActionsAcrossActivityLifecycle(
-            ActivityScenario.ActivityAction<TestActivity> initialAction,
-            ActivityScenario.ActivityAction<TestActivity> verifyAction) {
-        ActivityScenario<TestActivity> scenario = mActivityScenarioRule.getScenario();
-        scenario.onActivity(initialAction);
-
-        scenario.moveToState(Lifecycle.State.CREATED);
-        scenario.onActivity(verifyAction);
-
-        scenario.moveToState(Lifecycle.State.STARTED);
-        scenario.onActivity(verifyAction);
-
-        scenario.moveToState(Lifecycle.State.RESUMED);
-        scenario.onActivity(verifyAction);
-    }
-
-    private void assumeNotMultiWindow() {
-        ActivityScenario<TestActivity> scenario = mActivityScenarioRule.getScenario();
-        try {
-            scenario.onActivity(activity -> assumeFalse(isInMultiWindowMode(activity)));
-        } catch (RuntimeException e) {
-            if (e.getCause() instanceof AssumptionViolatedException) {
-                AssumptionViolatedException failedAssumption =
-                        (AssumptionViolatedException) e.getCause();
-                throw failedAssumption;
-            }
-            throw e;
-        }
-    }
-
-    private static boolean isInMultiWindowMode(Activity activity) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            return activity.isInMultiWindowMode();
-        }
-        return false;
-    }
-
-    private static void assumePlatformBeforeR() {
-        assumeTrue(Build.VERSION.SDK_INT < Build.VERSION_CODES.R);
-    }
-
-    private static void assumePlatformROrAbove() {
-        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R);
-    }
-
-    private static final class AssertCurrentWindowBoundsEqualsRealDisplaySizeAction implements
-            ActivityScenario.ActivityAction<TestActivity> {
-        @Override
-        public void perform(TestActivity activity) {
-            Display display;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-                display = activity.getDisplay();
-            } else {
-                display = activity.getWindowManager().getDefaultDisplay();
-            }
-
-            Point realDisplaySize = WindowBoundsHelper.getRealSizeForDisplay(display);
-
-            Rect bounds = WindowBoundsHelper.getInstance().computeCurrentWindowBounds(activity);
-            assertNotEquals("Device can not have zero width", 0, realDisplaySize.x);
-            assertNotEquals("Device can not have zero height", 0, realDisplaySize.y);
-            assertEquals("Window bounds width does not match real display width",
-                    realDisplaySize.x, bounds.width());
-            assertEquals("Window bounds height does not match real display height",
-                    realDisplaySize.y, bounds.height());
-        }
-    }
-
-    private static final class AssertMaximumWindowBoundsEqualsRealDisplaySizeAction implements
-            ActivityScenario.ActivityAction<TestActivity> {
-        @Override
-        public void perform(TestActivity activity) {
-            Display display;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-                display = activity.getDisplay();
-            } else {
-                display = activity.getWindowManager().getDefaultDisplay();
-            }
-
-            Point realDisplaySize = WindowBoundsHelper.getRealSizeForDisplay(display);
-
-            Rect bounds = WindowBoundsHelper.getInstance().computeMaximumWindowBounds(activity);
-            assertEquals("Window bounds width does not match real display width",
-                    realDisplaySize.x, bounds.width());
-            assertEquals("Window bounds height does not match real display height",
-                    realDisplaySize.y, bounds.height());
-        }
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.kt b/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.kt
new file mode 100644
index 0000000..4d2a399
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowBoundsHelperTest.kt
@@ -0,0 +1,308 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.os.Build
+import android.view.Display
+import android.view.WindowManager
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ActivityScenario.ActivityAction
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.Assert
+import org.junit.Assume
+import org.junit.AssumptionViolatedException
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [WindowBoundsHelper] class.  */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class WindowBoundsHelperTest {
+
+    @get:Rule
+    public var activityScenarioRule: ActivityScenarioRule<TestActivity> =
+        ActivityScenarioRule(TestActivity::class.java)
+
+    @Test
+    public fun testGetCurrentWindowBounds_matchParentWindowSize_avoidCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetCurrentWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = WindowManager.LayoutParams.MATCH_PARENT
+            lp.height = WindowManager.LayoutParams.MATCH_PARENT
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetCurrentWindowBounds_fixedWindowSize_avoidCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetCurrentWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = 100
+            lp.height = 100
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetCurrentWindowBounds_matchParentWindowSize_layoutBehindCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetCurrentWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = WindowManager.LayoutParams.MATCH_PARENT
+            lp.height = WindowManager.LayoutParams.MATCH_PARENT
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetCurrentWindowBounds_fixedWindowSize_layoutBehindCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetCurrentWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = 100
+            lp.height = 100
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetCurrentWindowBounds_postR() {
+        assumePlatformROrAbove()
+        runActionsAcrossActivityLifecycle({ }) { activity: TestActivity ->
+            val bounds = WindowBoundsHelper.instance.computeCurrentWindowBounds(activity)
+            val windowMetricsBounds = activity.windowManager.currentWindowMetrics.bounds
+            Assert.assertEquals(windowMetricsBounds, bounds)
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowBounds_matchParentWindowSize_avoidCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetMaximumWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = WindowManager.LayoutParams.MATCH_PARENT
+            lp.height = WindowManager.LayoutParams.MATCH_PARENT
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowBounds_fixedWindowSize_avoidCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetMaximumWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = 100
+            lp.height = 100
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowBounds_matchParentWindowSize_layoutBehindCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetMaximumWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = WindowManager.LayoutParams.MATCH_PARENT
+            lp.height = WindowManager.LayoutParams.MATCH_PARENT
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowBounds_fixedWindowSize_layoutBehindCutouts_preR() {
+        assumePlatformBeforeR()
+        assumeNotMultiWindow()
+        testGetMaximumWindowBoundsMatchesRealDisplaySize { activity: TestActivity ->
+            val lp = activity.window.attributes
+            lp.width = 100
+            lp.height = 100
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                lp.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+            }
+            activity.window.attributes = lp
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowBounds_postR() {
+        assumePlatformROrAbove()
+        runActionsAcrossActivityLifecycle({ }) { activity: TestActivity ->
+            val bounds = WindowBoundsHelper.instance.computeMaximumWindowBounds(activity)
+            val windowMetricsBounds = activity.windowManager.maximumWindowMetrics.bounds
+            Assert.assertEquals(windowMetricsBounds, bounds)
+        }
+    }
+
+    private fun testGetCurrentWindowBoundsMatchesRealDisplaySize(
+        initialAction: ActivityAction<TestActivity>
+    ) {
+        val assertWindowBoundsMatchesDisplayAction: ActivityAction<TestActivity> =
+            AssertCurrentWindowBoundsEqualsRealDisplaySizeAction()
+        runActionsAcrossActivityLifecycle(initialAction, assertWindowBoundsMatchesDisplayAction)
+    }
+
+    private fun testGetMaximumWindowBoundsMatchesRealDisplaySize(
+        initialAction: ActivityAction<TestActivity>
+    ) {
+        val assertWindowBoundsMatchesDisplayAction: ActivityAction<TestActivity> =
+            AssertMaximumWindowBoundsEqualsRealDisplaySizeAction()
+        runActionsAcrossActivityLifecycle(initialAction, assertWindowBoundsMatchesDisplayAction)
+    }
+
+    /**
+     * Creates and launches an activity performing the supplied actions at various points in the
+     * activity lifecycle.
+     *
+     * @param initialAction the action that will run once before the activity is created.
+     * @param verifyAction the action to run once after each change in activity lifecycle state.
+     */
+    private fun runActionsAcrossActivityLifecycle(
+        initialAction: ActivityAction<TestActivity>,
+        verifyAction: ActivityAction<TestActivity>
+    ) {
+        val scenario = activityScenarioRule.scenario
+        scenario.onActivity(initialAction)
+        scenario.moveToState(Lifecycle.State.CREATED)
+        scenario.onActivity(verifyAction)
+        scenario.moveToState(Lifecycle.State.STARTED)
+        scenario.onActivity(verifyAction)
+        scenario.moveToState(Lifecycle.State.RESUMED)
+        scenario.onActivity(verifyAction)
+    }
+
+    private fun assumeNotMultiWindow() {
+        val scenario = activityScenarioRule.scenario
+        try {
+            scenario.onActivity { activity: TestActivity ->
+                Assume.assumeFalse(
+                    isInMultiWindowMode(
+                        activity
+                    )
+                )
+            }
+        } catch (e: RuntimeException) {
+            if (e.cause is AssumptionViolatedException) {
+                val failedAssumption = e.cause as AssumptionViolatedException?
+                throw failedAssumption!!
+            }
+            throw e
+        }
+    }
+
+    private class AssertCurrentWindowBoundsEqualsRealDisplaySizeAction :
+        ActivityAction<TestActivity> {
+        override fun perform(activity: TestActivity) {
+            val display: Display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+                activity.display ?: throw Exception("No display for activity")
+            } else {
+                @Suppress("DEPRECATION")
+                activity.windowManager.defaultDisplay
+            }
+            val realDisplaySize = WindowBoundsHelper.getRealSizeForDisplay(display)
+            val bounds = WindowBoundsHelper.instance.computeCurrentWindowBounds(activity)
+            Assert.assertNotEquals("Device can not have zero width", 0, realDisplaySize.x.toLong())
+            Assert.assertNotEquals("Device can not have zero height", 0, realDisplaySize.y.toLong())
+            Assert.assertEquals(
+                "Window bounds width does not match real display width",
+                realDisplaySize.x.toLong(), bounds.width().toLong()
+            )
+            Assert.assertEquals(
+                "Window bounds height does not match real display height",
+                realDisplaySize.y.toLong(), bounds.height().toLong()
+            )
+        }
+    }
+
+    private class AssertMaximumWindowBoundsEqualsRealDisplaySizeAction :
+        ActivityAction<TestActivity> {
+        override fun perform(activity: TestActivity) {
+            val display: Display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+                activity.display ?: throw Exception("No display for activity")
+            } else {
+                @Suppress("DEPRECATION")
+                activity.windowManager.defaultDisplay
+            }
+            val realDisplaySize = WindowBoundsHelper.getRealSizeForDisplay(display)
+            val bounds = WindowBoundsHelper.instance.computeMaximumWindowBounds(activity)
+            Assert.assertEquals(
+                "Window bounds width does not match real display width",
+                realDisplaySize.x.toLong(), bounds.width().toLong()
+            )
+            Assert.assertEquals(
+                "Window bounds height does not match real display height",
+                realDisplaySize.y.toLong(), bounds.height().toLong()
+            )
+        }
+    }
+
+    private companion object {
+        private fun isInMultiWindowMode(activity: Activity): Boolean {
+            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                activity.isInMultiWindowMode
+            } else false
+        }
+
+        private fun assumePlatformBeforeR() {
+            Assume.assumeTrue(Build.VERSION.SDK_INT < Build.VERSION_CODES.R)
+        }
+
+        private fun assumePlatformROrAbove() {
+            Assume.assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
+        }
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowInfoRepoImpTest.kt b/window/window/src/androidTest/java/androidx/window/WindowInfoRepoImpTest.kt
new file mode 100644
index 0000000..724e6e3
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowInfoRepoImpTest.kt
@@ -0,0 +1,122 @@
+/*
+ * 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
+
+import android.app.Activity
+import androidx.core.util.Consumer
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestCoroutineScope
+import kotlinx.coroutines.test.runBlockingTest
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import java.util.concurrent.Executor
+
+@OptIn(ExperimentalCoroutinesApi::class)
+public class WindowInfoRepoImpTest {
+
+    @get:Rule
+    public val activityScenario: ActivityScenarioRule<TestActivity> =
+        ActivityScenarioRule(TestActivity::class.java)
+
+    private val testScope = TestCoroutineScope()
+
+    @Test
+    public fun testGetCurrentWindowMetrics() {
+        activityScenario.scenario.onActivity { testActivity ->
+            val windowBoundsHelper = WindowBoundsHelper.instance
+            val repo = WindowInfoRepoImp(
+                testActivity,
+                windowBoundsHelper,
+                FakeWindowBackend()
+            )
+            val expectedBounds = windowBoundsHelper.computeCurrentWindowBounds(testActivity)
+            val expected = WindowMetrics(expectedBounds)
+            val actual = repo.currentWindowMetrics()
+            assertEquals(expected, actual)
+        }
+    }
+
+    @Test
+    public fun testGetMaximumWindowMetrics() {
+        activityScenario.scenario.onActivity { testActivity ->
+            val windowBoundsHelper = WindowBoundsHelper.instance
+            val repo = WindowInfoRepoImp(
+                testActivity,
+                windowBoundsHelper,
+                FakeWindowBackend()
+            )
+            val expectedBounds = windowBoundsHelper.computeMaximumWindowBounds(testActivity)
+            val expected = WindowMetrics(expectedBounds)
+            val actual = repo.maximumWindowMetrics()
+            assertEquals(expected, actual)
+        }
+    }
+
+    @Test
+    public fun testWindowLayoutFeatures(): Unit = testScope.runBlockingTest {
+        activityScenario.scenario.onActivity { testActivity ->
+            val windowBoundsHelper = WindowBoundsHelper.instance
+            val fakeBackend = FakeWindowBackend()
+            val repo = WindowInfoRepoImp(
+                testActivity,
+                windowBoundsHelper,
+                fakeBackend
+            )
+            val collector = TestConsumer<WindowLayoutInfo>()
+            testScope.launch {
+                repo.windowLayoutInfo().collect(collector::accept)
+            }
+            fakeBackend.triggerSignal(WindowLayoutInfo(emptyList()))
+            collector.assertValue(WindowLayoutInfo(emptyList()))
+        }
+    }
+
+    private class FakeWindowBackend : WindowBackend {
+
+        private class CallbackHolder(
+            val executor: Executor,
+            val callback: Consumer<WindowLayoutInfo>
+        ) : Consumer<WindowLayoutInfo> {
+
+            override fun accept(t: WindowLayoutInfo?) {
+                executor.execute { callback.accept(t) }
+            }
+        }
+
+        private val consumers = mutableListOf<CallbackHolder>()
+
+        fun triggerSignal(info: WindowLayoutInfo) {
+            consumers.forEach { consumer -> consumer.accept(info) }
+        }
+
+        override fun registerLayoutChangeCallback(
+            activity: Activity,
+            executor: Executor,
+            callback: Consumer<WindowLayoutInfo>
+        ) {
+            consumers.add(CallbackHolder(executor, callback))
+        }
+
+        override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
+            consumers.removeIf { it.callback == callback }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.java b/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.java
deleted file mode 100644
index 62154b1..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.java
+++ /dev/null
@@ -1,123 +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.window;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.graphics.Rect;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Tests for {@link WindowLayoutInfo} class. */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public final class WindowLayoutInfoTest {
-
-    @Test
-    public void testBuilder_empty() {
-        WindowLayoutInfo.Builder builder = new WindowLayoutInfo.Builder();
-        WindowLayoutInfo windowLayoutInfo = builder.build();
-
-        assertThat(windowLayoutInfo.getDisplayFeatures()).isEmpty();
-    }
-
-    @Test
-    public void testBuilder_setDisplayFeatures() {
-        DisplayFeature feature1 = new FoldingFeature(new Rect(1, 0, 3, 4),
-                FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT);
-
-        DisplayFeature feature2 = new FoldingFeature(new Rect(1, 0, 1, 4),
-                FoldingFeature.STATE_FLAT, FoldingFeature.STATE_FLAT);
-
-        List<DisplayFeature> displayFeatures = new ArrayList<>();
-        displayFeatures.add(feature1);
-        displayFeatures.add(feature2);
-
-        WindowLayoutInfo.Builder builder = new WindowLayoutInfo.Builder();
-        builder.setDisplayFeatures(displayFeatures);
-        WindowLayoutInfo windowLayoutInfo = builder.build();
-
-        assertEquals(displayFeatures, windowLayoutInfo.getDisplayFeatures());
-    }
-
-    @Test
-    public void testEquals_sameFeatures() {
-        List<DisplayFeature> features = new ArrayList<>();
-
-        WindowLayoutInfo original = new WindowLayoutInfo(features);
-        WindowLayoutInfo copy = new WindowLayoutInfo(features);
-
-        assertEquals(original, copy);
-    }
-
-    @Test
-    public void testEquals_differentFeatures() {
-        List<DisplayFeature> originalFeatures = new ArrayList<>();
-        List<DisplayFeature> differentFeatures = new ArrayList<>();
-        Rect rect = new Rect(1, 0, 1, 10);
-        differentFeatures.add(new FoldingFeature(rect, FoldingFeature.TYPE_HINGE,
-                FoldingFeature.STATE_FLAT));
-
-        WindowLayoutInfo original = new WindowLayoutInfo(originalFeatures);
-        WindowLayoutInfo different = new WindowLayoutInfo(differentFeatures);
-
-        assertNotEquals(original, different);
-    }
-
-    @Test
-    public void testHashCode_matchesIfEqual() {
-        List<DisplayFeature> firstFeatures = new ArrayList<>();
-        List<DisplayFeature> secondFeatures = new ArrayList<>();
-        WindowLayoutInfo first = new WindowLayoutInfo(firstFeatures);
-        WindowLayoutInfo second = new WindowLayoutInfo(secondFeatures);
-
-        assertEquals(first, second);
-        assertEquals(first.hashCode(), second.hashCode());
-    }
-
-    @Test
-    public void testHashCode_matchesIfEqualFeatures() {
-        DisplayFeature originalFeature = new FoldingFeature(
-                new Rect(0, 0, 100, 0),
-                FoldingFeature.TYPE_HINGE,
-                FoldingFeature.STATE_FLAT
-        );
-        DisplayFeature matchingFeature = new FoldingFeature(
-                new Rect(0, 0, 100, 0),
-                FoldingFeature.TYPE_HINGE,
-                FoldingFeature.STATE_FLAT
-        );
-        List<DisplayFeature> firstFeatures = Collections.singletonList(originalFeature);
-        List<DisplayFeature> secondFeatures = Collections.singletonList(matchingFeature);
-        WindowLayoutInfo first = new WindowLayoutInfo(firstFeatures);
-        WindowLayoutInfo second = new WindowLayoutInfo(secondFeatures);
-
-        assertEquals(first, second);
-        assertEquals(first.hashCode(), second.hashCode());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.kt b/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.kt
new file mode 100644
index 0000000..24f7639
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowLayoutInfoTest.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.
+ */
+package androidx.window
+
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [WindowLayoutInfo] class.  */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class WindowLayoutInfoTest {
+
+    @Test
+    public fun testBuilder_empty() {
+        val builder = WindowLayoutInfo.Builder()
+        val windowLayoutInfo = builder.build()
+        assertThat(windowLayoutInfo.displayFeatures).isEmpty()
+    }
+
+    @Test
+    public fun testBuilder_setDisplayFeatures() {
+        val feature1: DisplayFeature = FoldingFeature(
+            Rect(1, 0, 3, 4),
+            FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT
+        )
+        val feature2: DisplayFeature = FoldingFeature(
+            Rect(1, 0, 1, 4),
+            FoldingFeature.STATE_FLAT, FoldingFeature.STATE_FLAT
+        )
+        val displayFeatures = listOf(feature1, feature2)
+        val builder = WindowLayoutInfo.Builder()
+        builder.setDisplayFeatures(displayFeatures)
+        val windowLayoutInfo = builder.build()
+        assertEquals(displayFeatures, windowLayoutInfo.displayFeatures)
+    }
+
+    @Test
+    public fun testEquals_sameFeatures() {
+        val features = listOf<DisplayFeature>()
+        val original = WindowLayoutInfo(features)
+        val copy = WindowLayoutInfo(features)
+        assertEquals(original, copy)
+    }
+
+    @Test
+    public fun testEquals_differentFeatures() {
+        val originalFeatures = listOf<DisplayFeature>()
+        val rect = Rect(1, 0, 1, 10)
+        val differentFeatures = listOf(
+            FoldingFeature(
+                rect, FoldingFeature.TYPE_HINGE,
+                FoldingFeature.STATE_FLAT
+            )
+        )
+        val original = WindowLayoutInfo(originalFeatures)
+        val different = WindowLayoutInfo(differentFeatures)
+        assertNotEquals(original, different)
+    }
+
+    @Test
+    public fun testHashCode_matchesIfEqual() {
+        val firstFeatures = emptyList<DisplayFeature>()
+        val secondFeatures = emptyList<DisplayFeature>()
+        val first = WindowLayoutInfo(firstFeatures)
+        val second = WindowLayoutInfo(secondFeatures)
+        assertEquals(first, second)
+        assertEquals(first.hashCode().toLong(), second.hashCode().toLong())
+    }
+
+    @Test
+    public fun testHashCode_matchesIfEqualFeatures() {
+        val originalFeature: DisplayFeature = FoldingFeature(
+            Rect(0, 0, 100, 0),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_FLAT
+        )
+        val matchingFeature: DisplayFeature = FoldingFeature(
+            Rect(0, 0, 100, 0),
+            FoldingFeature.TYPE_HINGE,
+            FoldingFeature.STATE_FLAT
+        )
+        val firstFeatures = listOf(originalFeature)
+        val secondFeatures = listOf(matchingFeature)
+        val first = WindowLayoutInfo(firstFeatures)
+        val second = WindowLayoutInfo(secondFeatures)
+        assertEquals(first, second)
+        assertEquals(first.hashCode().toLong(), second.hashCode().toLong())
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowManagerTest.java b/window/window/src/androidTest/java/androidx/window/WindowManagerTest.java
deleted file mode 100644
index 8b8e142..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowManagerTest.java
+++ /dev/null
@@ -1,119 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.content.ContextWrapper;
-import android.graphics.Rect;
-
-import androidx.core.util.Consumer;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-
-import com.google.common.util.concurrent.MoreExecutors;
-
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.concurrent.Executor;
-
-/** Tests for {@link WindowManager} class. */
-@SuppressWarnings("unchecked")
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public final class WindowManagerTest extends WindowTestBase {
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    public void testConstructor_activity() {
-        new WindowManager(mock(Activity.class), mock(WindowBackend.class));
-    }
-
-    @Test
-    public void testConstructor_wrappedActivity() {
-        new WindowManager(new ContextWrapper(mock(Activity.class)), mock(WindowBackend.class));
-    }
-
-    @Test
-    public void testConstructor_nullWindowBackend() {
-        new WindowManager(mock(Activity.class), null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConstructor_applicationContext() {
-        new WindowManager(ApplicationProvider.getApplicationContext(), mock(WindowBackend.class));
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback() {
-        WindowBackend backend = mock(WindowBackend.class);
-        Activity activity = mock(Activity.class);
-        WindowManager wm = new WindowManager(activity, backend);
-
-        Executor executor = MoreExecutors.directExecutor();
-        Consumer<WindowLayoutInfo> consumer = mock(Consumer.class);
-        wm.registerLayoutChangeCallback(executor, consumer);
-        verify(backend).registerLayoutChangeCallback(activity, executor, consumer);
-
-        wm.unregisterLayoutChangeCallback(consumer);
-        verify(backend).unregisterLayoutChangeCallback(eq(consumer));
-    }
-
-    @Test
-    public void testGetCurrentWindowMetrics() {
-        WindowBackend backend = mock(WindowBackend.class);
-        Activity activity = mock(Activity.class);
-        WindowManager wm = new WindowManager(activity, backend);
-
-        Rect bounds = new Rect(1, 2, 3, 4);
-        TestWindowBoundsHelper mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBoundsForActivity(activity, bounds);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-
-        WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
-        assertNotNull(windowMetrics);
-        assertEquals(bounds, windowMetrics.getBounds());
-    }
-
-    @Test
-    public void testGetMaximumWindowMetrics() {
-        WindowBackend backend = mock(WindowBackend.class);
-        Activity activity = mock(Activity.class);
-        WindowManager wm = new WindowManager(activity, backend);
-
-        Rect bounds = new Rect(0, 2, 4, 5);
-        TestWindowBoundsHelper mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setMaximumBoundsForActivity(activity, bounds);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-
-        WindowMetrics windowMetrics = wm.getMaximumWindowMetrics();
-        assertNotNull(windowMetrics);
-        assertEquals(bounds, windowMetrics.getBounds());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowManagerTest.kt b/window/window/src/androidTest/java/androidx/window/WindowManagerTest.kt
new file mode 100644
index 0000000..011bddc
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowManagerTest.kt
@@ -0,0 +1,116 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.content.ContextWrapper
+import android.graphics.Rect
+import androidx.core.util.Consumer
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.util.concurrent.MoreExecutors
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [WindowManager] class.  */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+public class WindowManagerTest : WindowTestBase() {
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    public fun testConstructor_activity() {
+        WindowManager(
+            mock<Activity>(),
+            mock()
+        )
+    }
+
+    @Test
+    public fun testConstructor_wrappedActivity() {
+        WindowManager(
+            ContextWrapper(mock<Activity>()),
+            mock()
+        )
+    }
+
+    @Test
+    public fun testConstructor_nullWindowBackend() {
+        WindowManager(mock<Activity>())
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    public fun testConstructor_applicationContext() {
+        WindowManager(
+            ApplicationProvider.getApplicationContext(),
+            mock()
+        )
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback() {
+        val backend = mock<WindowBackend>()
+        val activity = mock<Activity>()
+        val wm = WindowManager(activity, backend)
+        val executor = MoreExecutors.directExecutor()
+        val consumer: Consumer<WindowLayoutInfo> = mock<WindowLayoutInfoConsumer>()
+        wm.registerLayoutChangeCallback(executor, consumer)
+        verify(backend).registerLayoutChangeCallback(activity, executor, consumer)
+        wm.unregisterLayoutChangeCallback(consumer)
+        verify(backend).unregisterLayoutChangeCallback(eq(consumer))
+    }
+
+    @Test
+    public fun testGetCurrentWindowMetrics() {
+        val backend = mock<WindowBackend>()
+        val activity = mock<Activity>()
+        val wm = WindowManager(activity, backend)
+        val bounds = Rect(1, 2, 3, 4)
+        val mWindowBoundsHelper = TestWindowBoundsHelper()
+        mWindowBoundsHelper.setCurrentBoundsForActivity(activity, bounds)
+        WindowBoundsHelper.setForTesting(mWindowBoundsHelper)
+        val windowMetrics = wm.getCurrentWindowMetrics()
+        assertNotNull(windowMetrics)
+        assertEquals(bounds, windowMetrics.bounds)
+    }
+
+    @Test
+    public fun testGetMaximumWindowMetrics() {
+        val backend = mock<WindowBackend>()
+        val activity = mock<Activity>()
+        val wm = WindowManager(activity, backend)
+        val bounds = Rect(0, 2, 4, 5)
+        val mWindowBoundsHelper = TestWindowBoundsHelper()
+        mWindowBoundsHelper.setMaximumBoundsForActivity(activity, bounds)
+        WindowBoundsHelper.setForTesting(mWindowBoundsHelper)
+        val windowMetrics = wm.getMaximumWindowMetrics()
+        assertNotNull(windowMetrics)
+        assertEquals(bounds, windowMetrics.bounds)
+    }
+
+    private interface WindowLayoutInfoConsumer : Consumer<WindowLayoutInfo>
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.java b/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.java
deleted file mode 100644
index 126e31e..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.java
+++ /dev/null
@@ -1,70 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.graphics.Rect;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/** Tests for {@link WindowMetrics} class. */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public final class WindowMetricsTest {
-
-    @Test
-    public void testGetBounds() {
-        Rect bounds = new Rect(1, 2, 3, 4);
-        WindowMetrics windowMetrics = new WindowMetrics(bounds);
-        assertEquals(bounds, windowMetrics.getBounds());
-    }
-
-    @Test
-    public void testEquals_sameBounds() {
-        Rect bounds = new Rect(1, 2, 3, 4);
-        WindowMetrics windowMetrics0 = new WindowMetrics(bounds);
-        WindowMetrics windowMetrics1 = new WindowMetrics(bounds);
-
-        assertEquals(windowMetrics0, windowMetrics1);
-    }
-
-    @Test
-    public void testEquals_differentBounds() {
-        Rect bounds0 = new Rect(1, 2, 3, 4);
-        WindowMetrics windowMetrics0 = new WindowMetrics(bounds0);
-
-        Rect bounds1 = new Rect(6, 7, 8, 9);
-        WindowMetrics windowMetrics1 = new WindowMetrics(bounds1);
-
-        assertNotEquals(windowMetrics0, windowMetrics1);
-    }
-
-    @Test
-    public void testHashCode_matchesIfEqual() {
-        Rect bounds = new Rect(1, 2, 3, 4);
-        WindowMetrics windowMetrics0 = new WindowMetrics(bounds);
-        WindowMetrics windowMetrics1 = new WindowMetrics(bounds);
-
-        assertEquals(windowMetrics0.hashCode(), windowMetrics1.hashCode());
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.kt b/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.kt
new file mode 100644
index 0000000..a64b015
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowMetricsTest.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.window
+
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [WindowMetrics] class.  */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+public class WindowMetricsTest {
+    @Test
+    public fun testGetBounds() {
+        val bounds = Rect(1, 2, 3, 4)
+        val windowMetrics = WindowMetrics(bounds)
+        assertEquals(bounds, windowMetrics.bounds)
+    }
+
+    @Test
+    public fun testEquals_sameBounds() {
+        val bounds = Rect(1, 2, 3, 4)
+        val windowMetrics0 = WindowMetrics(bounds)
+        val windowMetrics1 = WindowMetrics(bounds)
+        assertEquals(windowMetrics0, windowMetrics1)
+    }
+
+    @Test
+    public fun testEquals_differentBounds() {
+        val bounds0 = Rect(1, 2, 3, 4)
+        val windowMetrics0 = WindowMetrics(bounds0)
+        val bounds1 = Rect(6, 7, 8, 9)
+        val windowMetrics1 = WindowMetrics(bounds1)
+        assertNotEquals(windowMetrics0, windowMetrics1)
+    }
+
+    @Test
+    public fun testHashCode_matchesIfEqual() {
+        val bounds = Rect(1, 2, 3, 4)
+        val windowMetrics0 = WindowMetrics(bounds)
+        val windowMetrics1 = WindowMetrics(bounds)
+        assertEquals(windowMetrics0.hashCode().toLong(), windowMetrics1.hashCode().toLong())
+    }
+}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowTestBase.java b/window/window/src/androidTest/java/androidx/window/WindowTestBase.java
deleted file mode 100644
index afa2bee..0000000
--- a/window/window/src/androidTest/java/androidx/window/WindowTestBase.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.window;
-
-import android.app.Activity;
-import android.os.IBinder;
-
-import androidx.test.rule.ActivityTestRule;
-
-/**
- * Base class for all tests in the module.
- */
-class WindowTestBase {
-    ActivityTestRule<TestActivity> mActivityTestRule =
-            new ActivityTestRule<>(TestActivity.class, false, true);
-
-    static IBinder getActivityWindowToken(Activity activity) {
-        return activity.getWindow().getAttributes().token;
-    }
-}
diff --git a/window/window/src/androidTest/java/androidx/window/WindowTestBase.kt b/window/window/src/androidTest/java/androidx/window/WindowTestBase.kt
new file mode 100644
index 0000000..ac49fa1
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/WindowTestBase.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
+
+import android.app.Activity
+import android.os.IBinder
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import org.junit.Rule
+
+/**
+ * Base class for all tests in the module.
+ */
+public open class WindowTestBase {
+    @get:Rule
+    public val activityTestRule: ActivityScenarioRule<TestActivity> =
+        ActivityScenarioRule(TestActivity::class.java)
+
+    public companion object {
+        @JvmStatic
+        public fun getActivityWindowToken(activity: Activity): IBinder {
+            return activity.window.attributes.token
+        }
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/ActivityCompatHelper.kt b/window/window/src/main/java/androidx/window/ActivityCompatHelper.kt
new file mode 100644
index 0000000..f5a319e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ActivityCompatHelper.kt
@@ -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.window
+
+import android.app.Activity
+import android.graphics.Rect
+import android.os.Build
+import androidx.annotation.RequiresApi
+
+@RequiresApi(Build.VERSION_CODES.N)
+internal object ActivityCompatHelperApi24 {
+    fun isInMultiWindowMode(activity: Activity): Boolean {
+        return activity.isInMultiWindowMode
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+internal object ActivityCompatHelperApi30 {
+    fun currentWindowBounds(activity: Activity): Rect {
+        return activity.windowManager.currentWindowMetrics.bounds
+    }
+
+    fun maximumWindowBounds(activity: Activity): Rect {
+        return activity.windowManager.maximumWindowMetrics.bounds
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/ActivityExt.kt b/window/window/src/main/java/androidx/window/ActivityExt.kt
new file mode 100644
index 0000000..a5149ca
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ActivityExt.kt
@@ -0,0 +1,26 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.os.IBinder
+
+/**
+ * A utility method [Activity] to return an optional [IBinder] window token from an [Activity].
+ */
+internal fun getActivityWindowToken(activity: Activity?): IBinder? {
+    return activity?.window?.attributes?.token
+}
diff --git a/window/window/src/main/java/androidx/window/ActivityUtil.java b/window/window/src/main/java/androidx/window/ActivityUtil.java
deleted file mode 100644
index b6e2cbd..0000000
--- a/window/window/src/main/java/androidx/window/ActivityUtil.java
+++ /dev/null
@@ -1,38 +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.window;
-
-import android.app.Activity;
-import android.os.IBinder;
-
-import androidx.annotation.Nullable;
-
-/**
- * A class to contain utility methods related to an {@link Activity}.
- */
-final class ActivityUtil {
-
-    private ActivityUtil() {}
-
-    @Nullable
-    static IBinder getActivityWindowToken(@Nullable Activity activity) {
-        if (activity == null) {
-            return null;
-        }
-        return activity.getWindow() != null ? activity.getWindow().getAttributes().token : null;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/Bounds.kt b/window/window/src/main/java/androidx/window/Bounds.kt
new file mode 100644
index 0000000..a6681a1
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/Bounds.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.window
+
+import android.graphics.Rect
+
+/**
+ * A wrapper for [Rect] to handle compatibility issues with API 15. In API 15, equals and
+ * hashCode operate on the reference as opposed to the attributes. This leads to test failures
+ * because the data matches but the equals check fails.
+ *
+ * Also useful in unit tests since you can instantiate [Bounds] in a JVM test but when you
+ * instantiate [Rect] you are using the class from the mockable jar file. The mockable jar does
+ * not contain any behavior or calculations.
+ */
+internal class Bounds(
+    val left: Int,
+    val top: Int,
+    val right: Int,
+    val bottom: Int
+) {
+
+    constructor(rect: Rect) : this(rect.left, rect.top, rect.right, rect.bottom)
+
+    /**
+     * Return the [Rect] representation of the bounds
+     */
+    fun toRect(): Rect = Rect(left, top, right, bottom)
+
+    /**
+     * The width of the bounds, may be negative.
+     */
+    val width: Int
+        get() = right - left
+
+    /**
+     * The height of the bounds, may be negative.
+     */
+    val height: Int
+        get() = bottom - top
+
+    /**
+     * Determines if the bounds has empty area.
+     */
+    val isEmpty: Boolean
+        get() = height == 0 || width == 0
+
+    override fun toString(): String {
+        return "${Bounds::class.java.simpleName} { [$left,$top,$right,$bottom] }"
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as Bounds
+
+        if (left != other.left) return false
+        if (top != other.top) return false
+        if (right != other.right) return false
+        if (bottom != other.bottom) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = left
+        result = 31 * result + top
+        result = 31 * result + right
+        result = 31 * result + bottom
+        return result
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/DisplayCompatHelper.kt b/window/window/src/main/java/androidx/window/DisplayCompatHelper.kt
new file mode 100644
index 0000000..7d66655
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/DisplayCompatHelper.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
+
+import android.graphics.Point
+import android.os.Build
+import android.view.Display
+import android.view.DisplayCutout
+import androidx.annotation.RequiresApi
+
+@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+internal object DisplayCompatHelperApi17 {
+
+    @Suppress("DEPRECATION")
+    fun getRealSize(display: Display, point: Point) {
+        display.getRealSize(point)
+    }
+}
+
+@RequiresApi(Build.VERSION_CODES.P)
+internal object DisplayCompatHelperApi28 {
+
+    fun safeInsetLeft(displayCutout: DisplayCutout): Int {
+        return displayCutout.safeInsetLeft
+    }
+
+    fun safeInsetTop(displayCutout: DisplayCutout): Int {
+        return displayCutout.safeInsetTop
+    }
+
+    fun safeInsetRight(displayCutout: DisplayCutout): Int {
+        return displayCutout.safeInsetRight
+    }
+
+    fun safeInsetBottom(displayCutout: DisplayCutout): Int {
+        return displayCutout.safeInsetBottom
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/DisplayFeature.java b/window/window/src/main/java/androidx/window/DisplayFeature.java
deleted file mode 100644
index b47b9bf..0000000
--- a/window/window/src/main/java/androidx/window/DisplayFeature.java
+++ /dev/null
@@ -1,43 +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.window;
-
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-
-/**
- * Description of a physical feature on the display.
- *
- * <p>A display feature is a distinctive physical attribute located within the display panel of
- * the device. It can intrude into the application window space and create a visual distortion,
- * visual or touch discontinuity, make some area invisible or create a logical divider or separation
- * in the screen space.
- *
- * @see FoldingFeature that represents a screen fold that intersects the application window.
- */
-public interface DisplayFeature {
-
-    /**
-     * The bounding rectangle of the feature within the application window
-     * in the window coordinate space.
-     *
-     * @return bounds of display feature.
-     */
-    @NonNull
-    Rect getBounds();
-}
diff --git a/window/window/src/main/java/androidx/window/DisplayFeature.kt b/window/window/src/main/java/androidx/window/DisplayFeature.kt
new file mode 100644
index 0000000..5d3207c
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/DisplayFeature.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.window
+
+import android.graphics.Rect
+
+/**
+ * Description of a physical feature on the display.
+ *
+ *
+ * A display feature is a distinctive physical attribute located within the display panel of
+ * the device. It can intrude into the application window space and create a visual distortion,
+ * visual or touch discontinuity, make some area invisible or create a logical divider or
+ * separation in the screen space.
+ *
+ * @see FoldingFeature that represents a screen fold that intersects the application window.
+ */
+public interface DisplayFeature {
+    /**
+     * The bounding rectangle of the feature within the application window
+     * in the window coordinate space.
+     */
+    public val bounds: Rect
+}
diff --git a/window/window/src/main/java/androidx/window/ExtensionAdapter.java b/window/window/src/main/java/androidx/window/ExtensionAdapter.java
deleted file mode 100644
index 426c771..0000000
--- a/window/window/src/main/java/androidx/window/ExtensionAdapter.java
+++ /dev/null
@@ -1,132 +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.window;
-
-import static androidx.window.ExtensionCompat.DEBUG;
-
-import android.app.Activity;
-import android.graphics.Rect;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionFoldingFeature;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for translating Extension data classes
- */
-final class ExtensionAdapter {
-    private static final String TAG = "ExtensionAdapter";
-
-    /**
-     * Perform the translation from {@link ExtensionWindowLayoutInfo} to {@link WindowLayoutInfo}.
-     * Translates a valid {@link ExtensionDisplayFeature} into a valid {@link DisplayFeature}. If
-     * a feature is not valid it is removed
-     *
-     * @param activity   An {@link android.app.Activity}.
-     * @param layoutInfo The source {@link ExtensionWindowLayoutInfo} to be converted
-     * @return {@link WindowLayoutInfo} containing the valid {@link DisplayFeature}
-     */
-    @NonNull
-    WindowLayoutInfo translate(@NonNull Activity activity,
-            @NonNull ExtensionWindowLayoutInfo layoutInfo) {
-        List<DisplayFeature> featureList = new ArrayList<>();
-        for (ExtensionDisplayFeature sourceFeature : layoutInfo.getDisplayFeatures()) {
-            DisplayFeature targetFeature = translate(activity, sourceFeature);
-            if (targetFeature != null) {
-                featureList.add(targetFeature);
-            }
-        }
-        return new WindowLayoutInfo(featureList);
-    }
-
-    @Nullable
-    DisplayFeature translate(Activity activity, ExtensionDisplayFeature displayFeature) {
-        if (!(displayFeature instanceof ExtensionFoldingFeature)) {
-            return null;
-        }
-        ExtensionFoldingFeature feature = (ExtensionFoldingFeature) displayFeature;
-        final Rect windowBounds = WindowBoundsHelper.getInstance()
-                .computeCurrentWindowBounds(activity);
-        return translateFoldFeature(windowBounds, feature);
-    }
-
-    @Nullable
-    private static DisplayFeature translateFoldFeature(@NonNull Rect windowBounds,
-            @NonNull ExtensionFoldingFeature feature) {
-        if (!isValid(windowBounds, feature)) {
-            return null;
-        }
-        int type;
-        switch (feature.getType()) {
-            case ExtensionFoldingFeature.TYPE_FOLD:
-                type = FoldingFeature.TYPE_FOLD;
-                break;
-            case ExtensionFoldingFeature.TYPE_HINGE:
-                type = FoldingFeature.TYPE_HINGE;
-                break;
-            default:
-                if (DEBUG) {
-                    Log.d(TAG, "Unknown feature type: " + feature.getType()
-                            + ", skipping feature.");
-                }
-                return null;
-        }
-        int state;
-        switch (feature.getState()) {
-            case ExtensionFoldingFeature.STATE_FLAT:
-                state = FoldingFeature.STATE_FLAT;
-                break;
-            case ExtensionFoldingFeature.STATE_HALF_OPENED:
-                state = FoldingFeature.STATE_HALF_OPENED;
-                break;
-            default:
-                if (DEBUG) {
-                    Log.d(TAG, "Unknown feature state: " + feature.getState()
-                            + ", skipping feature.");
-                }
-                return null;
-        }
-        return new FoldingFeature(feature.getBounds(), type, state);
-    }
-
-    private static boolean isValid(Rect windowBounds, ExtensionFoldingFeature feature) {
-        if (feature.getBounds().width() == 0 && feature.getBounds().height() == 0) {
-            return false;
-        }
-        if (feature.getType() == ExtensionFoldingFeature.TYPE_FOLD
-                && !feature.getBounds().isEmpty()) {
-            return false;
-        }
-        if (feature.getType() != ExtensionFoldingFeature.TYPE_FOLD
-                && feature.getType() != ExtensionFoldingFeature.TYPE_HINGE) {
-            return false;
-        }
-        return hasMatchingDimension(feature.getBounds(), windowBounds);
-    }
-
-    private static boolean hasMatchingDimension(Rect lhs, Rect rhs) {
-        boolean matchesWidth = lhs.left == rhs.left && lhs.right == rhs.right;
-        boolean matchesHeight = lhs.top == rhs.top && lhs.bottom == rhs.bottom;
-        return matchesWidth || matchesHeight;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ExtensionAdapter.kt b/window/window/src/main/java/androidx/window/ExtensionAdapter.kt
new file mode 100644
index 0000000..9102d00
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ExtensionAdapter.kt
@@ -0,0 +1,110 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.graphics.Rect
+import android.util.Log
+import androidx.window.WindowBoundsHelper.Companion.instance
+import androidx.window.extensions.ExtensionDisplayFeature
+import androidx.window.extensions.ExtensionFoldingFeature
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+
+/**
+ * A class for translating Extension data classes
+ */
+internal class ExtensionAdapter {
+    /**
+     * Perform the translation from [ExtensionWindowLayoutInfo] to [WindowLayoutInfo].
+     * Translates a valid [ExtensionDisplayFeature] into a valid [DisplayFeature]. If
+     * a feature is not valid it is removed
+     *
+     * @param activity   An [android.app.Activity].
+     * @param layoutInfo The source [ExtensionWindowLayoutInfo] to be converted
+     * @return [WindowLayoutInfo] containing the valid [DisplayFeature]
+     */
+    fun translate(
+        activity: Activity,
+        layoutInfo: ExtensionWindowLayoutInfo
+    ): WindowLayoutInfo {
+        val featureList = layoutInfo.displayFeatures.mapNotNull { translate(activity, it) }
+        return WindowLayoutInfo(featureList)
+    }
+
+    fun translate(activity: Activity, displayFeature: ExtensionDisplayFeature): DisplayFeature? {
+        if (displayFeature !is ExtensionFoldingFeature) {
+            return null
+        }
+        val windowBounds = instance.computeCurrentWindowBounds(activity)
+        return translateFoldFeature(windowBounds, displayFeature)
+    }
+
+    companion object {
+        private const val TAG = "ExtensionAdapter"
+        internal fun translateFoldFeature(
+            windowBounds: Rect,
+            feature: ExtensionFoldingFeature
+        ): DisplayFeature? {
+            if (!isValid(windowBounds, feature)) {
+                return null
+            }
+            val type = when (feature.type) {
+                ExtensionFoldingFeature.TYPE_FOLD -> FoldingFeature.TYPE_FOLD
+                ExtensionFoldingFeature.TYPE_HINGE -> FoldingFeature.TYPE_HINGE
+                else -> {
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(TAG, "Unknown feature type: ${feature.type}, skipping feature.")
+                    }
+                    return null
+                }
+            }
+            val state = when (feature.state) {
+                ExtensionFoldingFeature.STATE_FLAT -> FoldingFeature.STATE_FLAT
+                ExtensionFoldingFeature.STATE_HALF_OPENED -> FoldingFeature.STATE_HALF_OPENED
+                else -> {
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(TAG, "Unknown feature state: ${feature.state}, skipping feature.")
+                    }
+                    return null
+                }
+            }
+            return FoldingFeature(feature.bounds, type, state)
+        }
+
+        private fun isValid(windowBounds: Rect, feature: ExtensionFoldingFeature): Boolean {
+            if (feature.bounds.width() == 0 && feature.bounds.height() == 0) {
+                return false
+            }
+            if (feature.type == ExtensionFoldingFeature.TYPE_FOLD && !feature.bounds.isEmpty) {
+                return false
+            }
+            return if (feature.type != ExtensionFoldingFeature.TYPE_FOLD &&
+                feature.type != ExtensionFoldingFeature.TYPE_HINGE
+            ) {
+                false
+            } else hasMatchingDimension(
+                feature.bounds,
+                windowBounds
+            )
+        }
+
+        private fun hasMatchingDimension(lhs: Rect, rhs: Rect): Boolean {
+            val matchesWidth = lhs.left == rhs.left && lhs.right == rhs.right
+            val matchesHeight = lhs.top == rhs.top && lhs.bottom == rhs.bottom
+            return matchesWidth || matchesHeight
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/ExtensionCompat.java b/window/window/src/main/java/androidx/window/ExtensionCompat.java
deleted file mode 100644
index 99679c7..0000000
--- a/window/window/src/main/java/androidx/window/ExtensionCompat.java
+++ /dev/null
@@ -1,163 +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.window;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Rect;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionFoldingFeature;
-import androidx.window.extensions.ExtensionInterface;
-import androidx.window.extensions.ExtensionProvider;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Compatibility wrapper for extension versions v1.0+. */
-final class ExtensionCompat implements ExtensionInterfaceCompat {
-    static final boolean DEBUG = false;
-    private static final String TAG = "ExtensionVersionCompat";
-
-    @VisibleForTesting
-    final ExtensionInterface mWindowExtension;
-    final ExtensionAdapter mAdapter;
-
-    ExtensionCompat(Context context) {
-        this(ExtensionProvider.getExtensionImpl(context), new ExtensionAdapter());
-        if (mWindowExtension == null) {
-            throw new IllegalArgumentException("Extension provider returned null");
-        }
-    }
-
-    @VisibleForTesting
-    ExtensionCompat(ExtensionInterface extension, ExtensionAdapter adapter) {
-        // Empty implementation to avoid null checks
-        mWindowExtension = extension;
-        mAdapter = adapter;
-    }
-
-    @Override
-    public void setExtensionCallback(@NonNull ExtensionCallbackInterface extensionCallback) {
-        ExtensionTranslatingCallback translatingCallback = new ExtensionTranslatingCallback(
-                extensionCallback, mAdapter);
-        mWindowExtension.setExtensionCallback(translatingCallback);
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerAdded(@NonNull Activity activity) {
-        mWindowExtension.onWindowLayoutChangeListenerAdded(activity);
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity) {
-        mWindowExtension.onWindowLayoutChangeListenerRemoved(activity);
-    }
-
-    @Nullable
-    static Version getExtensionVersion() {
-        try {
-            String vendorVersion = ExtensionProvider.getApiVersion();
-            return !TextUtils.isEmpty(vendorVersion) ? Version.parse(vendorVersion) : null;
-        } catch (NoClassDefFoundError e) {
-            if (DEBUG) {
-                Log.d(TAG, "Extension version not found");
-            }
-            return null;
-        } catch (UnsupportedOperationException e) {
-            if (DEBUG) {
-                Log.d(TAG, "Stub Extension");
-            }
-            return null;
-        }
-    }
-
-    /** Verifies that extension implementation corresponds to the interface of the version. */
-    @Override
-    @SuppressWarnings("unused")
-    public boolean validateExtensionInterface() {
-        try {
-            // extension.setExtensionCallback(ExtensionInterface.ExtensionCallback);
-            Method methodSetExtensionCallback = mWindowExtension.getClass().getMethod(
-                    "setExtensionCallback", ExtensionInterface.ExtensionCallback.class);
-            Class<?> rSetExtensionCallback = methodSetExtensionCallback.getReturnType();
-            if (!rSetExtensionCallback.equals(void.class)) {
-                throw new NoSuchMethodException("Illegal return type for 'setExtensionCallback': "
-                        + rSetExtensionCallback);
-            }
-
-            // extension.onWindowLayoutChangeListenerAdded(Activity);
-            Method methodRegisterWindowLayoutChangeListener = mWindowExtension.getClass()
-                    .getMethod("onWindowLayoutChangeListenerAdded", Activity.class);
-            Class<?> rtRegisterWindowLayoutChangeListener =
-                    methodRegisterWindowLayoutChangeListener.getReturnType();
-            if (!rtRegisterWindowLayoutChangeListener.equals(void.class)) {
-                throw new NoSuchMethodException(
-                        "Illegal return type for 'onWindowLayoutChangeListenerAdded': "
-                                + rtRegisterWindowLayoutChangeListener);
-            }
-
-            // extension.onWindowLayoutChangeListenerRemoved(Activity);
-            Method methodUnregisterWindowLayoutChangeListener = mWindowExtension.getClass()
-                    .getMethod("onWindowLayoutChangeListenerRemoved", Activity.class);
-            Class<?> rtUnregisterWindowLayoutChangeListener =
-                    methodUnregisterWindowLayoutChangeListener.getReturnType();
-            if (!rtUnregisterWindowLayoutChangeListener.equals(void.class)) {
-                throw new NoSuchMethodException(
-                        "Illegal return type for 'onWindowLayoutChangeListenerRemoved': "
-                                + rtUnregisterWindowLayoutChangeListener);
-            }
-
-            // {@link ExtensionFoldingFeature} constructor
-            ExtensionFoldingFeature displayFoldingFeature =
-                    new ExtensionFoldingFeature(new Rect(0, 0, 100, 0),
-                            ExtensionFoldingFeature.TYPE_FOLD,
-                            ExtensionFoldingFeature.STATE_FLAT);
-
-            // displayFoldFeature.getBounds()
-            Rect tmpRect = displayFoldingFeature.getBounds();
-
-            // displayFoldFeature.getState()
-            int tmpState = displayFoldingFeature.getState();
-
-            // displayFoldFeature.getType()
-            int tmpType = displayFoldingFeature.getType();
-
-            // ExtensionWindowLayoutInfo constructor
-            ExtensionWindowLayoutInfo windowLayoutInfo =
-                    new ExtensionWindowLayoutInfo(new ArrayList<>());
-
-            // windowLayoutInfo.getDisplayFeatures()
-            List<ExtensionDisplayFeature> tmpDisplayFeatures =
-                    windowLayoutInfo.getDisplayFeatures();
-            return true;
-        } catch (Throwable t) {
-            if (DEBUG) {
-                Log.e(TAG, "Extension implementation doesn't conform to interface version "
-                        + getExtensionVersion() + ", error: " + t);
-            }
-            return false;
-        }
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ExtensionCompat.kt b/window/window/src/main/java/androidx/window/ExtensionCompat.kt
new file mode 100644
index 0000000..18d0d3d
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ExtensionCompat.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.window
+
+import android.app.Activity
+import android.content.Context
+import android.graphics.Rect
+import android.text.TextUtils
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.Version.Companion.parse
+import androidx.window.extensions.ExtensionFoldingFeature
+import androidx.window.extensions.ExtensionInterface
+import androidx.window.extensions.ExtensionInterface.ExtensionCallback
+import androidx.window.extensions.ExtensionProvider
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+import java.util.ArrayList
+
+/** Compatibility wrapper for extension versions v1.0+.  */
+internal class ExtensionCompat @VisibleForTesting constructor(
+    @field:VisibleForTesting val windowExtension: ExtensionInterface?,
+    private val adapter: ExtensionAdapter
+) : ExtensionInterfaceCompat {
+    constructor(context: Context) : this(
+        ExtensionProvider.getExtensionImpl(context),
+        ExtensionAdapter()
+    ) {
+        requireNotNull(windowExtension) { "Extension provider returned null" }
+    }
+
+    override fun setExtensionCallback(extensionCallback: ExtensionCallbackInterface) {
+        val translatingCallback = ExtensionTranslatingCallback(extensionCallback, adapter)
+        windowExtension?.setExtensionCallback(translatingCallback)
+    }
+
+    override fun onWindowLayoutChangeListenerAdded(activity: Activity) {
+        windowExtension?.onWindowLayoutChangeListenerAdded(activity)
+    }
+
+    override fun onWindowLayoutChangeListenerRemoved(activity: Activity) {
+        windowExtension?.onWindowLayoutChangeListenerRemoved(activity)
+    }
+
+    /** Verifies that extension implementation corresponds to the interface of the version.  */
+    override fun validateExtensionInterface(): Boolean {
+        return try {
+            // extension.setExtensionCallback(ExtensionInterface.ExtensionCallback);
+            val methodSetExtensionCallback = windowExtension?.javaClass?.getMethod(
+                "setExtensionCallback", ExtensionCallback::class.java
+            )
+            val rSetExtensionCallback = methodSetExtensionCallback?.returnType
+            if (rSetExtensionCallback != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'setExtensionCallback': $rSetExtensionCallback"
+                )
+            }
+
+            // extension.onWindowLayoutChangeListenerAdded(Activity);
+            val methodRegisterWindowLayoutChangeListener = windowExtension?.javaClass
+                ?.getMethod("onWindowLayoutChangeListenerAdded", Activity::class.java)
+            val rtRegisterWindowLayoutChangeListener =
+                methodRegisterWindowLayoutChangeListener?.returnType
+            if (rtRegisterWindowLayoutChangeListener != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'onWindowLayoutChangeListenerAdded': " +
+                        "$rtRegisterWindowLayoutChangeListener"
+                )
+            }
+
+            // extension.onWindowLayoutChangeListenerRemoved(Activity);
+            val methodUnregisterWindowLayoutChangeListener = windowExtension?.javaClass
+                ?.getMethod("onWindowLayoutChangeListenerRemoved", Activity::class.java)
+            val rtUnregisterWindowLayoutChangeListener =
+                methodUnregisterWindowLayoutChangeListener?.returnType
+            if (rtUnregisterWindowLayoutChangeListener != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'onWindowLayoutChangeListenerRemoved': " +
+                        "$rtUnregisterWindowLayoutChangeListener"
+                )
+            }
+
+            // {@link ExtensionFoldingFeature} constructor
+            val displayFoldingFeature = ExtensionFoldingFeature(
+                Rect(0, 0, 100, 0),
+                ExtensionFoldingFeature.TYPE_FOLD,
+                ExtensionFoldingFeature.STATE_FLAT
+            )
+
+            // displayFoldFeature.getBounds()
+            @Suppress("UNUSED_VARIABLE") val tmpRect = displayFoldingFeature.bounds
+
+            // displayFoldFeature.getState()
+            @Suppress("UNUSED_VARIABLE") val tmpState = displayFoldingFeature.state
+
+            // displayFoldFeature.getType()
+            @Suppress("UNUSED_VARIABLE") val tmpType = displayFoldingFeature.type
+
+            // ExtensionWindowLayoutInfo constructor
+            val windowLayoutInfo = ExtensionWindowLayoutInfo(ArrayList())
+
+            // windowLayoutInfo.getDisplayFeatures()
+            @Suppress("UNUSED_VARIABLE") val tmpDisplayFeatures = windowLayoutInfo.displayFeatures
+            true
+        } catch (t: Throwable) {
+            if (DEBUG) {
+                Log.e(
+                    TAG,
+                    "Extension implementation doesn't conform to interface version " +
+                        "$extensionVersion, error: $t"
+                )
+            }
+            false
+        }
+    }
+
+    companion object {
+        const val DEBUG = false
+        private const val TAG = "ExtensionVersionCompat"
+        val extensionVersion: Version?
+            get() = try {
+                val vendorVersion = ExtensionProvider.getApiVersion()
+                if (!TextUtils.isEmpty(vendorVersion)) parse(vendorVersion) else null
+            } catch (e: NoClassDefFoundError) {
+                if (DEBUG) {
+                    Log.d(TAG, "Extension version not found")
+                }
+                null
+            } catch (e: UnsupportedOperationException) {
+                if (DEBUG) {
+                    Log.d(TAG, "Stub Extension")
+                }
+                null
+            }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.java b/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.java
deleted file mode 100644
index 6b64029..0000000
--- a/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.java
+++ /dev/null
@@ -1,64 +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.window;
-
-import android.app.Activity;
-
-import androidx.annotation.NonNull;
-
-/**
- * Base interface for different extension versions that serves as an API compatibility wrapper.
- * @see ExtensionCompat
- * @see SidecarCompat
- */
-interface ExtensionInterfaceCompat {
-
-    /**
-     * Verifies if the extension interface conforms to the declared version.
-     */
-    boolean validateExtensionInterface();
-
-    /**
-     * Sets the callback that is used by the extension to inform about hardware state changes.
-     */
-    void setExtensionCallback(@NonNull ExtensionCallbackInterface extensionCallback);
-
-    /**
-     * Notifies extension that a listener for display feature layout changes was registered for the
-     * given activity context. Should notify the {@link ExtensionCallbackInterface} of
-     * the initial {@link WindowLayoutInfo} when it is available.
-     */
-    void onWindowLayoutChangeListenerAdded(@NonNull Activity activity);
-
-    /**
-     * Notifies extension that a listener for display feature layout changes was removed for the
-     * given activity context.
-     */
-    void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity);
-
-    /**
-     * Callback that will be registered with the WindowManager library, and that the extension
-     * should use to report all state changes.
-     */
-    interface ExtensionCallbackInterface {
-        /**
-         * Called by extension when the feature layout inside the window changes.
-         */
-        void onWindowLayoutChanged(@NonNull Activity activity,
-                @NonNull WindowLayoutInfo newLayout);
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.kt b/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.kt
new file mode 100644
index 0000000..987284e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ExtensionInterfaceCompat.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.window
+
+import android.app.Activity
+
+/**
+ * Base interface for different extension versions that serves as an API compatibility wrapper.
+ * @see ExtensionCompat
+ *
+ * @see SidecarCompat
+ */
+internal interface ExtensionInterfaceCompat {
+    /**
+     * Verifies if the extension interface conforms to the declared version.
+     */
+    fun validateExtensionInterface(): Boolean
+
+    /**
+     * Sets the callback that is used by the extension to inform about hardware state changes.
+     */
+    fun setExtensionCallback(extensionCallback: ExtensionCallbackInterface)
+
+    /**
+     * Notifies extension that a listener for display feature layout changes was registered for the
+     * given activity context. Should notify the [ExtensionCallbackInterface] of
+     * the initial [WindowLayoutInfo] when it is available.
+     */
+    fun onWindowLayoutChangeListenerAdded(activity: Activity)
+
+    /**
+     * Notifies extension that a listener for display feature layout changes was removed for the
+     * given activity context.
+     */
+    fun onWindowLayoutChangeListenerRemoved(activity: Activity)
+
+    /**
+     * Callback that will be registered with the WindowManager library, and that the extension
+     * should use to report all state changes.
+     */
+    interface ExtensionCallbackInterface {
+        /**
+         * Called by extension when the feature layout inside the window changes.
+         */
+        fun onWindowLayoutChanged(activity: Activity, newLayout: WindowLayoutInfo)
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.java b/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.java
deleted file mode 100644
index b549e5c..0000000
--- a/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.java
+++ /dev/null
@@ -1,45 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-import static androidx.window.extensions.ExtensionInterface.ExtensionCallback;
-
-import android.app.Activity;
-
-import androidx.annotation.NonNull;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-/**
- * A class to adapt from {@link ExtensionWindowLayoutInfo} to the local classes.
- */
-class ExtensionTranslatingCallback implements ExtensionCallback {
-
-    private final ExtensionCallbackInterface mCallback;
-    private final ExtensionAdapter mAdapter;
-
-    ExtensionTranslatingCallback(ExtensionCallbackInterface callback, ExtensionAdapter adapter) {
-        mCallback = callback;
-        mAdapter = adapter;
-    }
-
-    @Override
-    public void onWindowLayoutChanged(@NonNull Activity activity,
-            @NonNull ExtensionWindowLayoutInfo newLayout) {
-        mCallback.onWindowLayoutChanged(activity, mAdapter.translate(activity, newLayout));
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.kt b/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.kt
new file mode 100644
index 0000000..5e6c259
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ExtensionTranslatingCallback.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.window
+
+import android.app.Activity
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.extensions.ExtensionInterface.ExtensionCallback
+import androidx.window.extensions.ExtensionWindowLayoutInfo
+
+/**
+ * A class to adapt from [ExtensionWindowLayoutInfo] to the local classes.
+ */
+internal class ExtensionTranslatingCallback(
+    private val callback: ExtensionCallbackInterface,
+    private val adapter: ExtensionAdapter
+) : ExtensionCallback {
+
+    override fun onWindowLayoutChanged(
+        activity: Activity,
+        newLayout: ExtensionWindowLayoutInfo
+    ) {
+        callback.onWindowLayoutChanged(activity, adapter.translate(activity, newLayout))
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/ExtensionWindowBackend.java b/window/window/src/main/java/androidx/window/ExtensionWindowBackend.java
deleted file mode 100644
index fa2ad62..0000000
--- a/window/window/src/main/java/androidx/window/ExtensionWindowBackend.java
+++ /dev/null
@@ -1,276 +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.window;
-
-import static androidx.window.ExtensionCompat.DEBUG;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.core.util.Consumer;
-import androidx.window.extensions.ExtensionInterface;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Executor;
-
-/**
- * Default implementation of {@link WindowBackend} that uses a combination of platform APIs and
- * device-dependent OEM extensions.
- */
-final class ExtensionWindowBackend implements WindowBackend {
-    private static volatile ExtensionWindowBackend sInstance;
-    private static final Object sLock = new Object();
-
-    @GuardedBy("sLock")
-    @VisibleForTesting
-    ExtensionInterfaceCompat mWindowExtension;
-
-    /**
-     * List of all registered callbacks for window layout info. Not protected by {@link #sLock} to
-     * allow iterating and callback execution without holding the global lock.
-     */
-    @VisibleForTesting
-    final List<WindowLayoutChangeCallbackWrapper> mWindowLayoutChangeCallbacks =
-            new CopyOnWriteArrayList<>();
-
-    private static final String TAG = "WindowServer";
-
-    @VisibleForTesting
-    ExtensionWindowBackend(@Nullable ExtensionInterfaceCompat windowExtension) {
-        mWindowExtension = windowExtension;
-        if (mWindowExtension != null) {
-            mWindowExtension.setExtensionCallback(new ExtensionListenerImpl());
-        }
-    }
-
-    /**
-     * Gets the shared instance of the class.
-     */
-    @NonNull
-    public static ExtensionWindowBackend getInstance(@NonNull Context context) {
-        if (sInstance == null) {
-            synchronized (sLock) {
-                if (sInstance == null) {
-                    ExtensionInterfaceCompat windowExtension = initAndVerifyExtension(context);
-                    sInstance = new ExtensionWindowBackend(windowExtension);
-                }
-            }
-        }
-        return sInstance;
-    }
-
-    @Override
-    public void registerLayoutChangeCallback(@NonNull Activity activity,
-            @NonNull Executor executor, @NonNull Consumer<WindowLayoutInfo> callback) {
-        synchronized (sLock) {
-            if (mWindowExtension == null) {
-                if (DEBUG) {
-                    Log.v(TAG, "Extension not loaded, skipping callback registration.");
-                }
-                callback.accept(new WindowLayoutInfo(new ArrayList<>()));
-                return;
-            }
-
-            // Check if the activity was already registered, in case we need to report tracking of a
-            // new activity to the extension.
-            boolean isActivityRegistered = isActivityRegistered(activity);
-
-            WindowLayoutChangeCallbackWrapper callbackWrapper =
-                    new WindowLayoutChangeCallbackWrapper(activity, executor, callback);
-            mWindowLayoutChangeCallbacks.add(callbackWrapper);
-            if (!isActivityRegistered) {
-                mWindowExtension.onWindowLayoutChangeListenerAdded(activity);
-            }
-        }
-    }
-
-    private boolean isActivityRegistered(@NonNull Activity activity) {
-        for (WindowLayoutChangeCallbackWrapper callbackWrapper : mWindowLayoutChangeCallbacks) {
-            if (callbackWrapper.mActivity.equals(activity)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void unregisterLayoutChangeCallback(@NonNull Consumer<WindowLayoutInfo> callback) {
-        synchronized (sLock) {
-            if (mWindowExtension == null) {
-                if (DEBUG) {
-                    Log.v(TAG, "Extension not loaded, skipping callback un-registration.");
-                }
-                return;
-            }
-
-            // The same callback may be registered for multiple different window tokens, and
-            // vice-versa. First collect all items to be removed.
-            List<WindowLayoutChangeCallbackWrapper> itemsToRemove = new ArrayList<>();
-            for (WindowLayoutChangeCallbackWrapper callbackWrapper : mWindowLayoutChangeCallbacks) {
-                Consumer<WindowLayoutInfo> registeredCallback = callbackWrapper.mCallback;
-                if (registeredCallback == callback) {
-                    itemsToRemove.add(callbackWrapper);
-                }
-            }
-            // Remove the items from the list and notify extension if needed.
-            mWindowLayoutChangeCallbacks.removeAll(itemsToRemove);
-            for (WindowLayoutChangeCallbackWrapper callbackWrapper : itemsToRemove) {
-                callbackRemovedForActivity(callbackWrapper.mActivity);
-            }
-        }
-    }
-
-    /**
-     * Checks if there are no more registered callbacks left for the activity and inform
-     * extension if needed.
-     */
-    @GuardedBy("sLock")
-    private void callbackRemovedForActivity(Activity activity) {
-        for (WindowLayoutChangeCallbackWrapper callbackWrapper : mWindowLayoutChangeCallbacks) {
-            if (callbackWrapper.mActivity.equals(activity)) {
-                // Found a registered callback for token.
-                return;
-            }
-        }
-        // No registered callbacks left for the activity - report to extension.
-        mWindowExtension.onWindowLayoutChangeListenerRemoved(activity);
-    }
-
-    @VisibleForTesting
-    class ExtensionListenerImpl implements ExtensionInterfaceCompat.ExtensionCallbackInterface {
-
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public void onWindowLayoutChanged(@NonNull Activity activity,
-                @NonNull WindowLayoutInfo newLayout) {
-            for (WindowLayoutChangeCallbackWrapper callbackWrapper : mWindowLayoutChangeCallbacks) {
-                if (!callbackWrapper.mActivity.equals(activity)) {
-                    continue;
-                }
-
-                callbackWrapper.accept(newLayout);
-            }
-        }
-    }
-
-    /**
-     * Wrapper around {@link Consumer<WindowLayoutInfo>} that also includes the {@link Executor}
-     * on which the callback should run and the {@link Activity}.
-     */
-    private static class WindowLayoutChangeCallbackWrapper {
-        final Executor mExecutor;
-        final Consumer<WindowLayoutInfo> mCallback;
-        final Activity mActivity;
-
-        WindowLayoutChangeCallbackWrapper(@NonNull Activity activity, @NonNull Executor executor,
-                @NonNull Consumer<WindowLayoutInfo> callback) {
-            mActivity = activity;
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        void accept(WindowLayoutInfo layoutInfo) {
-            mExecutor.execute(() -> mCallback.accept(layoutInfo));
-        }
-    }
-
-    /**
-     * Loads an instance of {@link ExtensionInterface} implemented by OEM if available on this
-     * device. This also verifies if the loaded implementation conforms to the declared API version.
-     */
-    @Nullable
-    static ExtensionInterfaceCompat initAndVerifyExtension(Context context) {
-        ExtensionInterfaceCompat impl = null;
-        try {
-            if (isExtensionVersionSupported(ExtensionCompat.getExtensionVersion())) {
-                impl = new ExtensionCompat(context);
-                if (!impl.validateExtensionInterface()) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Loaded extension doesn't match the interface version");
-                    }
-                    impl = null;
-                }
-            }
-        } catch (Throwable t) {
-            if (DEBUG) {
-                Log.d(TAG, "Failed to load extension: " + t);
-            }
-            impl = null;
-        }
-
-        if (impl == null) {
-            // Falling back to Sidecar
-            try {
-                if (isExtensionVersionSupported(SidecarCompat.getSidecarVersion())) {
-                    impl = new SidecarCompat(context);
-                    if (!impl.validateExtensionInterface()) {
-                        if (DEBUG) {
-                            Log.d(TAG, "Loaded Sidecar doesn't match the interface version");
-                        }
-                        impl = null;
-                    }
-                }
-            } catch (Throwable t) {
-                if (DEBUG) {
-                    Log.d(TAG, "Failed to load sidecar: " + t);
-                }
-                impl = null;
-            }
-        }
-
-        if (impl == null) {
-            if (DEBUG) {
-                Log.d(TAG, "No supported extension or sidecar found");
-            }
-        }
-
-        return impl;
-    }
-
-    /**
-     * Checks if the Extension version provided on this device is supported by the current version
-     * of the library.
-     */
-    @VisibleForTesting
-    static boolean isExtensionVersionSupported(@Nullable Version extensionVersion) {
-        if (extensionVersion == null) {
-            return false;
-        }
-        if (extensionVersion.getMajor() == 1) {
-            // Disable androidx.window.extensions support in release builds of the library until the
-            // extensions API is finalized.
-            return DEBUG;
-        }
-        return Version.CURRENT.getMajor() >= extensionVersion.getMajor();
-    }
-
-    /**
-     * Test-only affordance to forget the existing instance.
-     */
-    @VisibleForTesting
-    static void resetInstance() {
-        sInstance = null;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/ExtensionWindowBackend.kt b/window/window/src/main/java/androidx/window/ExtensionWindowBackend.kt
new file mode 100644
index 0000000..24abe4e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/ExtensionWindowBackend.kt
@@ -0,0 +1,252 @@
+/*
+ * 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
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.util.Log
+import androidx.annotation.GuardedBy
+import androidx.annotation.VisibleForTesting
+import androidx.core.util.Consumer
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import java.util.ArrayList
+import java.util.concurrent.CopyOnWriteArrayList
+import java.util.concurrent.Executor
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * Default implementation of [WindowBackend] that uses a combination of platform APIs and
+ * device-dependent OEM extensions.
+ */
+internal class ExtensionWindowBackend @VisibleForTesting constructor(
+    @field:VisibleForTesting @field:GuardedBy(
+        "globalLock"
+    ) var windowExtension: ExtensionInterfaceCompat?
+) : WindowBackend {
+
+    init {
+        windowExtension?.setExtensionCallback(ExtensionListenerImpl())
+    }
+
+    /**
+     * List of all registered callbacks for window layout info. Not protected by [globalLock] to
+     * allow iterating and callback execution without holding the global lock.
+     */
+    @VisibleForTesting
+    val windowLayoutChangeCallbacks = CopyOnWriteArrayList<WindowLayoutChangeCallbackWrapper>()
+
+    override fun registerLayoutChangeCallback(
+        activity: Activity,
+        executor: Executor,
+        callback: Consumer<WindowLayoutInfo>
+    ) {
+        globalLock.withLock {
+            val windowExtension = windowExtension
+            if (windowExtension == null) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.v(TAG, "Extension not loaded, skipping callback registration.")
+                }
+                callback.accept(WindowLayoutInfo(emptyList()))
+                return
+            }
+
+            // Check if the activity was already registered, in case we need to report tracking of
+            // a new activity to the extension.
+            val isActivityRegistered = isActivityRegistered(activity)
+            val callbackWrapper = WindowLayoutChangeCallbackWrapper(activity, executor, callback)
+            windowLayoutChangeCallbacks.add(callbackWrapper)
+            if (!isActivityRegistered) {
+                windowExtension.onWindowLayoutChangeListenerAdded(activity)
+            }
+        }
+    }
+
+    private fun isActivityRegistered(activity: Activity): Boolean {
+        return windowLayoutChangeCallbacks.any { callbackWrapper ->
+            callbackWrapper.activity == activity
+        }
+    }
+
+    override fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
+        synchronized(globalLock) {
+            if (windowExtension == null) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.v(TAG, "Extension not loaded, skipping callback un-registration.")
+                }
+                return
+            }
+
+            // The same callback may be registered for multiple different window tokens, and
+            // vice-versa. First collect all items to be removed.
+            val itemsToRemove: MutableList<WindowLayoutChangeCallbackWrapper> = ArrayList()
+            for (callbackWrapper in windowLayoutChangeCallbacks) {
+                val registeredCallback = callbackWrapper.callback
+                if (registeredCallback === callback) {
+                    itemsToRemove.add(callbackWrapper)
+                }
+            }
+            // Remove the items from the list and notify extension if needed.
+            windowLayoutChangeCallbacks.removeAll(itemsToRemove)
+            for (callbackWrapper in itemsToRemove) {
+                callbackRemovedForActivity(callbackWrapper.activity)
+            }
+        }
+    }
+
+    /**
+     * Checks if there are no more registered callbacks left for the activity and inform
+     * extension if needed.
+     */
+    @GuardedBy("sLock")
+    private fun callbackRemovedForActivity(activity: Activity) {
+        val hasRegisteredCallback = windowLayoutChangeCallbacks.any { wrapper ->
+            wrapper.activity == activity
+        }
+        if (hasRegisteredCallback) {
+            return
+        }
+        // No registered callbacks left for the activity - report to extension.
+        windowExtension?.onWindowLayoutChangeListenerRemoved(activity)
+    }
+
+    @VisibleForTesting
+    internal inner class ExtensionListenerImpl : ExtensionCallbackInterface {
+        @SuppressLint("SyntheticAccessor")
+        override fun onWindowLayoutChanged(
+            activity: Activity,
+            newLayout: WindowLayoutInfo
+        ) {
+            for (callbackWrapper in windowLayoutChangeCallbacks) {
+                if (callbackWrapper.activity != activity) {
+                    continue
+                }
+                callbackWrapper.accept(newLayout)
+            }
+        }
+    }
+
+    /**
+     * Wrapper around [<] that also includes the [Executor]
+     * on which the callback should run and the [Activity].
+     */
+    internal class WindowLayoutChangeCallbackWrapper(
+        val activity: Activity,
+        private val executor: Executor,
+        val callback: Consumer<WindowLayoutInfo>
+    ) {
+        fun accept(layoutInfo: WindowLayoutInfo) {
+            executor.execute { callback.accept(layoutInfo) }
+        }
+    }
+
+    companion object {
+        @Volatile
+        private var globalInstance: ExtensionWindowBackend? = null
+        private val globalLock = ReentrantLock()
+        private const val TAG = "WindowServer"
+
+        /**
+         * Gets the shared instance of the class.
+         */
+        fun getInstance(context: Context): ExtensionWindowBackend {
+            if (globalInstance == null) {
+                globalLock.withLock {
+                    if (globalInstance == null) {
+                        val windowExtension = initAndVerifyExtension(context)
+                        globalInstance = ExtensionWindowBackend(windowExtension)
+                    }
+                }
+            }
+            return globalInstance!!
+        }
+
+        /**
+         * Loads an instance of [androidx.window.extensions.ExtensionInterface] implemented by OEM
+         * if available on this device. This also verifies if the loaded implementation conforms
+         * to the declared API version.
+         */
+        fun initAndVerifyExtension(context: Context): ExtensionInterfaceCompat? {
+            var impl: ExtensionInterfaceCompat? = null
+            try {
+                if (isExtensionVersionSupported(ExtensionCompat.extensionVersion)) {
+                    impl = ExtensionCompat(context)
+                    if (!impl.validateExtensionInterface()) {
+                        if (ExtensionCompat.DEBUG) {
+                            Log.d(TAG, "Loaded extension doesn't match the interface version")
+                        }
+                        impl = null
+                    }
+                }
+            } catch (t: Throwable) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "Failed to load extension: $t")
+                }
+                impl = null
+            }
+            if (impl == null) {
+                // Falling back to Sidecar
+                try {
+                    if (isExtensionVersionSupported(SidecarCompat.sidecarVersion)) {
+                        impl = SidecarCompat(context)
+                        if (!impl.validateExtensionInterface()) {
+                            if (ExtensionCompat.DEBUG) {
+                                Log.d(TAG, "Loaded Sidecar doesn't match the interface version")
+                            }
+                            impl = null
+                        }
+                    }
+                } catch (t: Throwable) {
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(TAG, "Failed to load sidecar: $t")
+                    }
+                    impl = null
+                }
+            }
+            if (impl == null) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "No supported extension or sidecar found")
+                }
+            }
+            return impl
+        }
+
+        /**
+         * Checks if the Extension version provided on this device is supported by the current
+         * version of the library.
+         */
+        @VisibleForTesting
+        fun isExtensionVersionSupported(extensionVersion: Version?): Boolean {
+            if (extensionVersion == null) {
+                return false
+            }
+            return if (extensionVersion.major == 1) {
+                // Disable androidx.window.extensions support in release builds of the library
+                // until the extensions API is finalized.
+                ExtensionCompat.DEBUG
+            } else Version.CURRENT.major >= extensionVersion.major
+        }
+
+        /**
+         * Test-only affordance to forget the existing instance.
+         */
+        @VisibleForTesting
+        fun resetInstance() {
+            globalInstance = null
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/FoldingFeature.java b/window/window/src/main/java/androidx/window/FoldingFeature.java
deleted file mode 100644
index 889ede0..0000000
--- a/window/window/src/main/java/androidx/window/FoldingFeature.java
+++ /dev/null
@@ -1,336 +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.window;
-
-import android.graphics.Rect;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * A feature that describes a fold in the flexible display
- * or a hinge between two physical display panels.
- */
-public class FoldingFeature implements DisplayFeature {
-
-    /**
-     * A fold in the flexible screen without a physical gap.
-     */
-    public static final int TYPE_FOLD = 1;
-
-    /**
-     * A physical separation with a hinge that allows two display panels to fold.
-     */
-    public static final int TYPE_HINGE = 2;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            TYPE_FOLD,
-            TYPE_HINGE,
-    })
-    @interface Type{}
-
-    /**
-     * The foldable device is completely open, the screen space that is presented to the user is
-     * flat. See the
-     * <a href="https://developer.android.com/guide/topics/ui/foldables#postures">Posture</a>
-     * section in the official documentation for visual samples and references.
-     */
-    public static final int STATE_FLAT = 1;
-
-    /**
-     * The foldable device's hinge is in an intermediate position between opened and closed state,
-     * there is a non-flat angle between parts of the flexible screen or between physical screen
-     * panels. See the
-     * <a href="https://developer.android.com/guide/topics/ui/foldables#postures">Posture</a>
-     * section in the official documentation for visual samples and references.
-     */
-    public static final int STATE_HALF_OPENED = 2;
-
-    /**
-     * The {@link FoldingFeature} does not occlude the content in any way. One example is a flat
-     * continuous fold where content can stretch across the fold. Another example is a hinge that
-     * has width or height equal to 0. In this case the content is physically split across both
-     * displays, but fully visible.
-     */
-    public static final int OCCLUSION_NONE = 0;
-
-    /**
-     * The {@link FoldingFeature} occludes all content. One example is a hinge that is considered to
-     * be part of the window, so that part of the UI is not visible to the user. Any content shown
-     * in the same area as the hinge may not be accessible in any way. Fully occluded areas should
-     * always be avoided when placing interactive UI elements and text.
-     */
-    public static final int OCCLUSION_FULL = 1;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            OCCLUSION_NONE,
-            OCCLUSION_FULL
-    })
-    @interface OcclusionType {}
-
-    /**
-     * The height of the {@link FoldingFeature} is greater than or equal to the width.
-     */
-    public static final int ORIENTATION_VERTICAL = 0;
-
-    /**
-     * The width of the {@link FoldingFeature} is greater than the height.
-     */
-    public static final int ORIENTATION_HORIZONTAL = 1;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            ORIENTATION_HORIZONTAL,
-            ORIENTATION_VERTICAL
-    })
-    @interface Orientation {}
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            STATE_HALF_OPENED,
-            STATE_FLAT,
-    })
-    @interface State {}
-
-    /**
-     * The bounding rectangle of the feature within the application window in the window
-     * coordinate space.
-     */
-    @NonNull
-    private final Rect mBounds;
-
-    /**
-     * The physical type of the feature.
-     */
-    @Type
-    private final int mType;
-
-    /**
-     * The state of the feature.
-     */
-    @State
-    private final int mState;
-
-    public FoldingFeature(@NonNull Rect bounds, @Type int type, @State int state) {
-        validateState(state);
-        validateType(type);
-        validateFeatureBounds(bounds);
-        mBounds = new Rect(bounds);
-        mType = type;
-        mState = state;
-    }
-
-    @NonNull
-    @Override
-    public Rect getBounds() {
-        return new Rect(mBounds);
-    }
-
-    /**
-     * Returns type that is either {@link FoldingFeature#TYPE_FOLD} or
-     * {@link FoldingFeature#TYPE_HINGE}
-     */
-    @Type
-    @VisibleForTesting
-    int getType() {
-        return mType;
-    }
-
-    @State
-    public int getState() {
-        return mState;
-    }
-
-    /**
-     * Calculates if a {@link FoldingFeature} should be thought of as splitting the window into
-     * multiple physical areas that can be seen by users as logically separate. Display panels
-     * connected by a hinge are always separated. Folds on flexible screens should be treated as
-     * separating when they are not {@link FoldingFeature#STATE_FLAT}.
-     *
-     * Apps may use this to determine if content should lay out around the {@link FoldingFeature}.
-     * Developers should consider the placement of interactive elements. Similar to the case of
-     * {@link FoldingFeature#OCCLUSION_FULL}, when a feature is separating then consider laying
-     * out the controls around the {@link FoldingFeature}.
-     *
-     * An example use case is to determine if the UI should be split into two logical areas. A media
-     * app where there is some auxiliary content, such as comments or description of a video, may
-     * need to adapt the layout. The media can be put on one side of the {@link FoldingFeature} and
-     * the auxiliary content can be placed on the other side.
-     *
-     * @return {@code true} if the feature splits the display into two areas, {@code false}
-     * otherwise.
-     */
-    public boolean isSeparating() {
-        if (mType == TYPE_HINGE) {
-            return true;
-        }
-        if (mType == TYPE_FOLD && mState == STATE_HALF_OPENED) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Calculates the occlusion mode to determine if a {@link FoldingFeature} occludes a part of
-     * the window. This flag is useful for determining if UI elements need to be moved
-     * around so that the user can access them. For some devices occluded elements can not be
-     * accessed by the user at all.
-     *
-     * For occlusion type {@link FoldingFeature#OCCLUSION_NONE} the feature can be treated as a
-     * guideline. One example would be for a continuously folding screen. For occlusion type
-     * {@link FoldingFeature#OCCLUSION_FULL} the feature should be avoided completely since content
-     * will not be visible or touchable, like a hinge device with two displays.
-     *
-     * The occlusion mode is useful to determine if the UI needs to adapt to the
-     * {@link FoldingFeature}. For example, full screen games should consider avoiding anything in
-     * the occluded region if it negatively affects the gameplay.  The user can not tap
-     * on the occluded interactive UI elements nor can they see important information.
-     *
-     * @return {@link FoldingFeature#OCCLUSION_NONE} if the {@link FoldingFeature} has empty
-     * bounds.
-     */
-    @OcclusionType
-    public int getOcclusionMode() {
-        if (mBounds.width() == 0 || mBounds.height() == 0) {
-            return OCCLUSION_NONE;
-        }
-        return OCCLUSION_FULL;
-    }
-
-    /**
-     * Returns {@link FoldingFeature#ORIENTATION_HORIZONTAL} if the width is greater than the
-     * height, {@link FoldingFeature#ORIENTATION_VERTICAL} otherwise.
-     */
-    @Orientation
-    public int getOrientation() {
-        return mBounds.width() > mBounds.height()
-                ? ORIENTATION_HORIZONTAL
-                : ORIENTATION_VERTICAL;
-    }
-
-    static String occlusionTypeToString(@OcclusionType int type) {
-        switch (type) {
-            case OCCLUSION_NONE:
-                return "OCCLUSION_NONE";
-            case OCCLUSION_FULL:
-                return "OCCLUSION_FULL";
-            default:
-                return "UNKNOWN";
-        }
-    }
-
-    static String orientationToString(@Orientation int direction) {
-        switch (direction) {
-            case ORIENTATION_HORIZONTAL:
-                return "ORIENTATION_HORIZONTAL";
-            case ORIENTATION_VERTICAL:
-                return "ORIENTATION_VERTICAL";
-            default:
-                return "UNKNOWN";
-        }
-    }
-
-    /**
-     * Verifies the state is {@link FoldingFeature#STATE_FLAT} or
-     * {@link FoldingFeature#STATE_HALF_OPENED}.
-     */
-    private static void validateState(int state) {
-        if (state != STATE_FLAT && state != STATE_HALF_OPENED) {
-            throw new IllegalArgumentException("State must be either " + stateToString(STATE_FLAT)
-                    + " or " + stateToString(STATE_HALF_OPENED));
-        }
-    }
-
-    /**
-     * Verifies the type is either {@link FoldingFeature#TYPE_HINGE} or
-     * {@link FoldingFeature#TYPE_FOLD}
-     */
-    private static void validateType(int type) {
-        if (type != TYPE_FOLD && type != TYPE_HINGE) {
-            throw new IllegalArgumentException("Type must be either " + typeToString(TYPE_FOLD)
-                    + " or " + typeToString(TYPE_HINGE));
-        }
-    }
-
-    /**
-     * Verifies the bounds of the folding feature.
-     */
-    private static void validateFeatureBounds(@NonNull Rect bounds) {
-        if (bounds.width() == 0 && bounds.height() == 0) {
-            throw new IllegalArgumentException("Bounds must be non zero");
-        }
-        if (bounds.left != 0 && bounds.top != 0) {
-            throw new IllegalArgumentException("Bounding rectangle must start at the top or "
-                    + "left window edge for folding features");
-        }
-    }
-
-    @NonNull
-    private static String typeToString(int type) {
-        switch (type) {
-            case TYPE_FOLD:
-                return "FOLD";
-            case TYPE_HINGE:
-                return "HINGE";
-            default:
-                return "Unknown feature type (" + type + ")";
-        }
-    }
-
-    @NonNull
-    private static String stateToString(int state) {
-        switch (state) {
-            case STATE_FLAT:
-                return "FLAT";
-            case STATE_HALF_OPENED:
-                return "HALF_OPENED";
-            default:
-                return "Unknown feature state (" + state + ")";
-        }
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return FoldingFeature.class.getSimpleName() + " { " + mBounds + ", type="
-                + typeToString(mType) + ", state=" + stateToString(mState) + " }";
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof FoldingFeature)) return false;
-        FoldingFeature that = (FoldingFeature) o;
-        return mType == that.mType
-            && mState == that.mState
-            && mBounds.equals(that.mBounds);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = mBounds.hashCode();
-        result = 31 * result + mType;
-        result = 31 * result + mState;
-        return result;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/FoldingFeature.kt b/window/window/src/main/java/androidx/window/FoldingFeature.kt
new file mode 100644
index 0000000..c3092bc
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/FoldingFeature.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.window
+
+import android.graphics.Rect
+import androidx.annotation.IntDef
+import androidx.window.FoldingFeature.Companion.ORIENTATION_VERTICAL as ORIENTATION_VERTICAL1
+
+/**
+ * A feature that describes a fold in the flexible display
+ * or a hinge between two physical display panels.
+ *
+ * @param [type] that is either [FoldingFeature.TYPE_FOLD] or [FoldingFeature.TYPE_HINGE]
+ * @param [state] the physical state of the hinge that is either [FoldingFeature.STATE_FLAT] or
+ * [FoldingFeature.STATE_HALF_OPENED]
+ */
+public class FoldingFeature internal constructor(
+    /**
+     * The bounding rectangle of the feature within the application window in the window
+     * coordinate space.
+     */
+    private val featureBounds: Bounds,
+    @Type internal val type: Int,
+    @State public val state: Int
+) : DisplayFeature {
+
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(TYPE_FOLD, TYPE_HINGE)
+    internal annotation class Type
+
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(OCCLUSION_NONE, OCCLUSION_FULL)
+    internal annotation class OcclusionType
+
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL1)
+    internal annotation class Orientation
+
+    @Retention(AnnotationRetention.SOURCE)
+    @IntDef(STATE_HALF_OPENED, STATE_FLAT)
+    internal annotation class State
+
+    override val bounds: Rect
+        get() = featureBounds.toRect()
+
+    init {
+        validateState(state)
+        validateType(type)
+        validateFeatureBounds(featureBounds)
+    }
+
+    public constructor(
+        bounds: Rect,
+        type: Int,
+        state: Int
+    ) : this(Bounds(bounds), type, state)
+
+    /**
+     * Calculates if a [FoldingFeature] should be thought of as splitting the window into
+     * multiple physical areas that can be seen by users as logically separate. Display panels
+     * connected by a hinge are always separated. Folds on flexible screens should be treated as
+     * separating when they are not [FoldingFeature.STATE_FLAT].
+     *
+     * Apps may use this to determine if content should lay out around the [FoldingFeature].
+     * Developers should consider the placement of interactive elements. Similar to the case of
+     * [FoldingFeature.OCCLUSION_FULL], when a feature is separating then consider laying
+     * out the controls around the [FoldingFeature].
+     *
+     * An example use case is to determine if the UI should be split into two logical areas. A
+     * media app where there is some auxiliary content, such as comments or description of a video,
+     * may need to adapt the layout. The media can be put on one side of the [FoldingFeature] and
+     * the auxiliary content can be placed on the other side.
+     *
+     * @return `true` if the feature splits the display into two areas, `false`
+     * otherwise.
+     */
+    public val isSeparating: Boolean
+        get() = when {
+            type == TYPE_HINGE -> true
+            type == TYPE_FOLD && state == STATE_HALF_OPENED -> true
+            else -> false
+        }
+
+    /**
+     * Calculates the occlusion mode to determine if a [FoldingFeature] occludes a part of
+     * the window. This flag is useful for determining if UI elements need to be moved
+     * around so that the user can access them. For some devices occluded elements can not be
+     * accessed by the user at all.
+     *
+     * For occlusion type [FoldingFeature.OCCLUSION_NONE] the feature can be treated as a
+     * guideline. One example would be for a continuously folding screen. For occlusion type
+     * [FoldingFeature.OCCLUSION_FULL] the feature should be avoided completely since content
+     * will not be visible or touchable, like a hinge device with two displays.
+     *
+     * The occlusion mode is useful to determine if the UI needs to adapt to the
+     * [FoldingFeature]. For example, full screen games should consider avoiding anything in
+     * the occluded region if it negatively affects the gameplay.  The user can not tap
+     * on the occluded interactive UI elements nor can they see important information.
+     *
+     * @return [FoldingFeature.OCCLUSION_NONE] if the [FoldingFeature] has empty
+     * bounds.
+     */
+    @get:OcclusionType
+    public val occlusionMode: Int
+        get() = if (featureBounds.width == 0 || featureBounds.height == 0) {
+            OCCLUSION_NONE
+        } else {
+            OCCLUSION_FULL
+        }
+
+    /**
+     * Returns [FoldingFeature.ORIENTATION_HORIZONTAL] if the width is greater than the
+     * height, [FoldingFeature.ORIENTATION_VERTICAL] otherwise.
+     */
+    @get:Orientation
+    public val orientation: Int
+        get() {
+            return if (featureBounds.width > featureBounds.height) {
+                ORIENTATION_HORIZONTAL
+            } else {
+                ORIENTATION_VERTICAL
+            }
+        }
+
+    override fun toString(): String {
+        return (
+            "${FoldingFeature::class.java.simpleName} { $featureBounds, " +
+                "type=${typeToString(type)}, state=${stateToString(state)} }"
+            )
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as FoldingFeature
+
+        if (featureBounds != other.featureBounds) return false
+        if (type != other.type) return false
+        if (state != other.state) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = featureBounds.hashCode()
+        result = 31 * result + type
+        result = 31 * result + state
+        return result
+    }
+
+    public companion object {
+        /**
+         * A fold in the flexible screen without a physical gap.
+         */
+        public const val TYPE_FOLD: Int = 1
+
+        /**
+         * A physical separation with a hinge that allows two display panels to fold.
+         */
+        public const val TYPE_HINGE: Int = 2
+
+        /**
+         * The foldable device is completely open, the screen space that is presented to the user
+         * is flat. See the
+         * [Posture](https://developer.android.com/guide/topics/ui/foldables#postures)
+         * section in the official documentation for visual samples and references.
+         */
+        public const val STATE_FLAT: Int = 1
+
+        /**
+         * The foldable device's hinge is in an intermediate position between opened and closed
+         * state, there is a non-flat angle between parts of the flexible screen or between
+         * physical screen panels. See the
+         * [Posture](https://developer.android.com/guide/topics/ui/foldables#postures)
+         * section in the official documentation for visual samples and references.
+         */
+        public const val STATE_HALF_OPENED: Int = 2
+
+        /**
+         * The [FoldingFeature] does not occlude the content in any way. One example is a flat
+         * continuous fold where content can stretch across the fold. Another example is a hinge
+         * that has width or height equal to 0. In this case the content is physically split across
+         * both displays, but fully visible.
+         */
+        public const val OCCLUSION_NONE: Int = 0
+
+        /**
+         * The [FoldingFeature] occludes all content. One example is a hinge that is considered to
+         * be part of the window, so that part of the UI is not visible to the user. Any content
+         * shown in the same area as the hinge may not be accessible in any way. Fully occluded
+         * areas should always be avoided when placing interactive UI elements and text.
+         */
+        public const val OCCLUSION_FULL: Int = 1
+
+        /**
+         * The height of the [FoldingFeature] is greater than or equal to the width.
+         */
+        public const val ORIENTATION_VERTICAL: Int = 0
+
+        /**
+         * The width of the [FoldingFeature] is greater than the height.
+         */
+        public const val ORIENTATION_HORIZONTAL: Int = 1
+
+        internal fun occlusionTypeToString(@OcclusionType type: Int): String {
+            return when (type) {
+                OCCLUSION_NONE -> "OCCLUSION_NONE"
+                OCCLUSION_FULL -> "OCCLUSION_FULL"
+                else -> "UNKNOWN"
+            }
+        }
+
+        internal fun orientationToString(@Orientation direction: Int): String {
+            return when (direction) {
+                ORIENTATION_HORIZONTAL -> "ORIENTATION_HORIZONTAL"
+                ORIENTATION_VERTICAL1 -> "ORIENTATION_VERTICAL"
+                else -> "UNKNOWN"
+            }
+        }
+
+        /**
+         * Verifies the state is [FoldingFeature.STATE_FLAT] or
+         * [FoldingFeature.STATE_HALF_OPENED].
+         */
+        internal fun validateState(state: Int) {
+            require(!(state != STATE_FLAT && state != STATE_HALF_OPENED)) {
+                "State must be either ${stateToString(STATE_FLAT)} or " +
+                    stateToString(STATE_HALF_OPENED)
+            }
+        }
+
+        /**
+         * Verifies the type is either [FoldingFeature.TYPE_HINGE] or
+         * [FoldingFeature.TYPE_FOLD]
+         */
+        internal fun validateType(type: Int) {
+            require(!(type != TYPE_FOLD && type != TYPE_HINGE)) {
+                "Type must be either ${typeToString(TYPE_FOLD)} or ${typeToString(TYPE_HINGE)}"
+            }
+        }
+
+        /**
+         * Verifies the bounds of the folding feature.
+         */
+        internal fun validateFeatureBounds(bounds: Bounds) {
+            require(!(bounds.width == 0 && bounds.height == 0)) { "Bounds must be non zero" }
+            require(!(bounds.left != 0 && bounds.top != 0)) {
+                "Bounding rectangle must start at the top or left window edge for folding features"
+            }
+        }
+
+        internal fun typeToString(type: Int): String {
+            return when (type) {
+                TYPE_FOLD -> "FOLD"
+                TYPE_HINGE -> "HINGE"
+                else -> "Unknown feature type ($type)"
+            }
+        }
+
+        internal fun stateToString(state: Int): String {
+            return when (state) {
+                STATE_FLAT -> "FLAT"
+                STATE_HALF_OPENED -> "HALF_OPENED"
+                else -> "Unknown feature state ($state)"
+            }
+        }
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/SidecarAdapter.java b/window/window/src/main/java/androidx/window/SidecarAdapter.java
deleted file mode 100644
index 2d7acdb..0000000
--- a/window/window/src/main/java/androidx/window/SidecarAdapter.java
+++ /dev/null
@@ -1,357 +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.window;
-
-import static androidx.window.ExtensionCompat.DEBUG;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.graphics.Rect;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for translating Sidecar data classes.
- */
-final class SidecarAdapter {
-
-    private static final String TAG = SidecarAdapter.class.getSimpleName();
-
-    @NonNull
-    List<DisplayFeature> translate(SidecarWindowLayoutInfo sidecarWindowLayoutInfo,
-            SidecarDeviceState deviceState, Rect windowBounds) {
-        List<DisplayFeature> displayFeatures = new ArrayList<>();
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                getSidecarDisplayFeatures(sidecarWindowLayoutInfo);
-        if (sidecarDisplayFeatures == null) {
-            return displayFeatures;
-        }
-
-        for (SidecarDisplayFeature sidecarFeature : sidecarDisplayFeatures) {
-            final DisplayFeature displayFeature = translate(sidecarFeature, deviceState,
-                    windowBounds);
-            if (displayFeature != null) {
-                displayFeatures.add(displayFeature);
-            }
-        }
-        return displayFeatures;
-    }
-
-    // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-    @SuppressLint("BanUncheckedReflection")
-    @SuppressWarnings("unchecked")
-    @VisibleForTesting
-    @Nullable
-    static List<SidecarDisplayFeature> getSidecarDisplayFeatures(SidecarWindowLayoutInfo info) {
-        try {
-            return info.displayFeatures;
-        } catch (NoSuchFieldError error) {
-            try {
-                Method methodGetFeatures = SidecarWindowLayoutInfo.class.getMethod(
-                        "getDisplayFeatures");
-                return (List<SidecarDisplayFeature>) methodGetFeatures.invoke(info);
-            } catch (NoSuchMethodException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (IllegalAccessException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (InvocationTargetException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        return null;
-    }
-
-    // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-    @SuppressLint("BanUncheckedReflection")
-    @VisibleForTesting
-    static void setSidecarDisplayFeatures(SidecarWindowLayoutInfo info,
-            List<SidecarDisplayFeature> displayFeatures) {
-        try {
-            info.displayFeatures = displayFeatures;
-        } catch (NoSuchFieldError error) {
-            try {
-                Method methodSetFeatures = SidecarWindowLayoutInfo.class.getMethod(
-                        "setDisplayFeatures", List.class);
-                methodSetFeatures.invoke(info, displayFeatures);
-            } catch (NoSuchMethodException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (IllegalAccessException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (InvocationTargetException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    @NonNull
-    WindowLayoutInfo translate(@NonNull Activity activity,
-            @Nullable SidecarWindowLayoutInfo extensionInfo, @NonNull SidecarDeviceState state) {
-        if (extensionInfo == null) {
-            return new WindowLayoutInfo(new ArrayList<>());
-        }
-
-        SidecarDeviceState deviceState = new SidecarDeviceState();
-        int devicePosture = getSidecarDevicePosture(state);
-        setSidecarDevicePosture(deviceState, devicePosture);
-
-        Rect windowBounds = WindowBoundsHelper.getInstance().computeCurrentWindowBounds(activity);
-        List<DisplayFeature> displayFeatures = translate(extensionInfo, deviceState, windowBounds);
-        return new WindowLayoutInfo(displayFeatures);
-    }
-
-
-    private static int getSidecarDevicePosture(SidecarDeviceState sidecarDeviceState) {
-        int rawPosture = getRawSidecarDevicePosture(sidecarDeviceState);
-        if (rawPosture < SidecarDeviceState.POSTURE_UNKNOWN
-                || rawPosture > SidecarDeviceState.POSTURE_FLIPPED) {
-            return SidecarDeviceState.POSTURE_UNKNOWN;
-        }
-        return rawPosture;
-    }
-
-    // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-    @SuppressLint("BanUncheckedReflection")
-    @VisibleForTesting
-    static int getRawSidecarDevicePosture(SidecarDeviceState sidecarDeviceState) {
-        try {
-            return sidecarDeviceState.posture;
-        } catch (NoSuchFieldError error) {
-            try {
-                Method methodGetPosture = SidecarDeviceState.class.getMethod("getPosture");
-                return (int) methodGetPosture.invoke(sidecarDeviceState);
-            } catch (NoSuchMethodException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (IllegalAccessException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (InvocationTargetException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        return SidecarDeviceState.POSTURE_UNKNOWN;
-    }
-
-    // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-    @SuppressLint("BanUncheckedReflection")
-    @VisibleForTesting
-    static void setSidecarDevicePosture(SidecarDeviceState sidecarDeviceState, int posture) {
-        try {
-            sidecarDeviceState.posture = posture;
-        } catch (NoSuchFieldError error) {
-            try {
-                Method methodSetPosture = SidecarDeviceState.class.getMethod("setPosture",
-                        int.class);
-                methodSetPosture.invoke(sidecarDeviceState, posture);
-            } catch (NoSuchMethodException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (IllegalAccessException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            } catch (InvocationTargetException e) {
-                if (DEBUG) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    /**
-     * Converts the display feature from extension. Can return {@code null} if there is an issue
-     * with the value passed from extension.
-     */
-    @Nullable
-    // TODO(b/175507310): Remove after fix.
-    @SuppressWarnings({"UnusedVariable", "ObjectToString"})
-    private static DisplayFeature translate(SidecarDisplayFeature feature,
-            SidecarDeviceState deviceState, Rect windowBounds) {
-        Rect bounds = feature.getRect();
-        if (bounds.width() == 0 && bounds.height() == 0) {
-            if (DEBUG) {
-                Log.d(TAG, "Passed a display feature with empty rect, skipping: " + feature);
-            }
-            return null;
-        }
-
-        if (feature.getType() == SidecarDisplayFeature.TYPE_FOLD) {
-            if (bounds.width() != 0 && bounds.height() != 0) {
-                // Bounds for fold types are expected to be zero-wide or zero-high.
-                // See DisplayFeature#getBounds().
-                if (DEBUG) {
-                    Log.d(TAG, "Passed a non-zero area display feature expected to be zero-area, "
-                            + "skipping: " + feature);
-                }
-                return null;
-            }
-        }
-        if (feature.getType() == SidecarDisplayFeature.TYPE_HINGE
-                || feature.getType() == SidecarDisplayFeature.TYPE_FOLD) {
-            // TODO(b/175507310): Reinstate after fix on the OEM side.
-            if (!((bounds.left == 0/* && bounds.right == windowBounds.width()*/)
-                    || (bounds.top == 0/* && bounds.bottom == windowBounds.height()*/))) {
-                // Bounds for fold and hinge types are expected to span the entire window space.
-                // See DisplayFeature#getBounds().
-                if (DEBUG) {
-                    Log.d(TAG, "Passed a display feature expected to span the entire window but "
-                            + "does not, skipping: " + feature);
-                }
-                return null;
-            }
-        }
-
-        final int type;
-        switch (feature.getType()) {
-            case SidecarDisplayFeature.TYPE_FOLD:
-                type = FoldingFeature.TYPE_FOLD;
-                break;
-            case SidecarDisplayFeature.TYPE_HINGE:
-                type = FoldingFeature.TYPE_HINGE;
-                break;
-            default:
-                if (DEBUG) {
-                    Log.d(TAG, "Unknown feature type: " + feature.getType()
-                            + ", skipping feature.");
-                }
-                return null;
-        }
-
-        final int state;
-        final int devicePosture = getSidecarDevicePosture(deviceState);
-        switch (devicePosture) {
-            case SidecarDeviceState.POSTURE_CLOSED:
-            case SidecarDeviceState.POSTURE_UNKNOWN:
-            case SidecarDeviceState.POSTURE_FLIPPED:
-                return null;
-            case SidecarDeviceState.POSTURE_HALF_OPENED:
-                state = FoldingFeature.STATE_HALF_OPENED;
-                break;
-            case SidecarDeviceState.POSTURE_OPENED:
-            default:
-                state = FoldingFeature.STATE_FLAT;
-                break;
-        }
-
-        return new FoldingFeature(feature.getRect(), type, state);
-    }
-
-    boolean isEqualSidecarDeviceState(@Nullable SidecarDeviceState first,
-            @Nullable SidecarDeviceState second) {
-        if (first == second) {
-            return true;
-        }
-        if (first == null) {
-            return false;
-        }
-        if (second == null) {
-            return false;
-        }
-        int firstPosture = getSidecarDevicePosture(first);
-        int secondPosture = getSidecarDevicePosture(second);
-
-        return firstPosture == secondPosture;
-    }
-
-    boolean isEqualSidecarWindowLayoutInfo(@Nullable SidecarWindowLayoutInfo first,
-            @Nullable SidecarWindowLayoutInfo second) {
-        if (first == second) {
-            return true;
-        }
-        if (first == null) {
-            return false;
-        }
-        if (second == null) {
-            return false;
-        }
-        List<SidecarDisplayFeature> firstDisplayFeatures = getSidecarDisplayFeatures(first);
-        List<SidecarDisplayFeature> secondDisplayFeatures = getSidecarDisplayFeatures(second);
-        return isEqualSidecarDisplayFeatures(firstDisplayFeatures, secondDisplayFeatures);
-    }
-
-    private boolean isEqualSidecarDisplayFeatures(@Nullable List<SidecarDisplayFeature> first,
-            @Nullable List<SidecarDisplayFeature> second) {
-        if (first == second) {
-            return true;
-        }
-        if (first == null) {
-            return false;
-        }
-        if (second == null) {
-            return false;
-        }
-        if (first.size() != second.size()) {
-            return false;
-        }
-        for (int i = 0; i < first.size(); i++) {
-            SidecarDisplayFeature firstFeature = first.get(i);
-            SidecarDisplayFeature secondFeature = second.get(i);
-            if (!isEqualSidecarDisplayFeature(firstFeature, secondFeature)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isEqualSidecarDisplayFeature(@Nullable SidecarDisplayFeature first,
-            @Nullable SidecarDisplayFeature second) {
-        if (first == second) {
-            return true;
-        }
-        if (first == null) {
-            return false;
-        }
-        if (second == null) {
-            return false;
-        }
-        if (first.getType() != second.getType()) {
-            return false;
-        }
-        if (!first.getRect().equals(second.getRect())) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/SidecarAdapter.kt b/window/window/src/main/java/androidx/window/SidecarAdapter.kt
new file mode 100644
index 0000000..5430c9b
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/SidecarAdapter.kt
@@ -0,0 +1,345 @@
+/*
+ * 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("DEPRECATION")
+
+package androidx.window
+
+import android.annotation.SuppressLint
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.window.sidecar.SidecarDeviceState
+import androidx.window.sidecar.SidecarDisplayFeature
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import java.lang.reflect.InvocationTargetException
+
+/**
+ * A class for translating Sidecar data classes.
+ */
+internal class SidecarAdapter {
+
+    fun translate(
+        sidecarDisplayFeatures: List<SidecarDisplayFeature>,
+        deviceState: SidecarDeviceState
+    ): List<DisplayFeature> {
+        return sidecarDisplayFeatures.mapNotNull { sidecarFeature ->
+            translate(sidecarFeature, deviceState)
+        }
+    }
+
+    fun translate(
+        extensionInfo: SidecarWindowLayoutInfo?,
+        state: SidecarDeviceState
+    ): WindowLayoutInfo {
+        if (extensionInfo == null) {
+            return WindowLayoutInfo(emptyList())
+        }
+        val deviceState = SidecarDeviceState()
+        val devicePosture = getSidecarDevicePosture(state)
+        setSidecarDevicePosture(deviceState, devicePosture)
+        val sidecarDisplayFeatures = getSidecarDisplayFeatures(extensionInfo)
+        val displayFeatures = translate(sidecarDisplayFeatures, deviceState)
+        return WindowLayoutInfo(displayFeatures)
+    }
+
+    fun isEqualSidecarDeviceState(
+        first: SidecarDeviceState?,
+        second: SidecarDeviceState?
+    ): Boolean {
+        if (first == second) {
+            return true
+        }
+        if (first == null) {
+            return false
+        }
+        if (second == null) {
+            return false
+        }
+        val firstPosture = getSidecarDevicePosture(first)
+        val secondPosture = getSidecarDevicePosture(second)
+        return firstPosture == secondPosture
+    }
+
+    fun isEqualSidecarWindowLayoutInfo(
+        first: SidecarWindowLayoutInfo?,
+        second: SidecarWindowLayoutInfo?
+    ): Boolean {
+        if (first == second) {
+            return true
+        }
+        if (first == null) {
+            return false
+        }
+        if (second == null) {
+            return false
+        }
+        val firstDisplayFeatures = getSidecarDisplayFeatures(first)
+        val secondDisplayFeatures = getSidecarDisplayFeatures(second)
+        return isEqualSidecarDisplayFeatures(firstDisplayFeatures, secondDisplayFeatures)
+    }
+
+    private fun isEqualSidecarDisplayFeatures(
+        first: List<SidecarDisplayFeature>?,
+        second: List<SidecarDisplayFeature>?
+    ): Boolean {
+        if (first === second) {
+            return true
+        }
+        if (first == null) {
+            return false
+        }
+        if (second == null) {
+            return false
+        }
+        if (first.size != second.size) {
+            return false
+        }
+        for (i in first.indices) {
+            val firstFeature = first[i]
+            val secondFeature = second[i]
+            if (!isEqualSidecarDisplayFeature(firstFeature, secondFeature)) {
+                return false
+            }
+        }
+        return true
+    }
+
+    private fun isEqualSidecarDisplayFeature(
+        first: SidecarDisplayFeature?,
+        second: SidecarDisplayFeature?
+    ): Boolean {
+        if (first == second) {
+            return true
+        }
+        if (first == null) {
+            return false
+        }
+        if (second == null) {
+            return false
+        }
+        if (first.type != second.type) {
+            return false
+        }
+        return if (first.rect != second.rect) {
+            false
+        } else {
+            true
+        }
+    }
+
+    companion object {
+        private val TAG = SidecarAdapter::class.java.simpleName
+
+        // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+        @SuppressLint("BanUncheckedReflection")
+        @VisibleForTesting
+        fun getSidecarDisplayFeatures(info: SidecarWindowLayoutInfo): List<SidecarDisplayFeature> {
+            try {
+                return info.displayFeatures ?: emptyList()
+            } catch (error: NoSuchFieldError) {
+                try {
+                    val methodGetFeatures = SidecarWindowLayoutInfo::class.java.getMethod(
+                        "getDisplayFeatures"
+                    )
+                    @Suppress("UNCHECKED_CAST")
+                    return methodGetFeatures.invoke(info) as List<SidecarDisplayFeature>
+                } catch (e: NoSuchMethodException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: IllegalAccessException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: InvocationTargetException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+            return emptyList()
+        }
+
+        // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+        @SuppressLint("BanUncheckedReflection")
+        @VisibleForTesting
+        fun setSidecarDisplayFeatures(
+            info: SidecarWindowLayoutInfo,
+            displayFeatures: List<SidecarDisplayFeature?>
+        ) {
+            try {
+                info.displayFeatures = displayFeatures
+            } catch (error: NoSuchFieldError) {
+                try {
+                    val methodSetFeatures = SidecarWindowLayoutInfo::class.java.getMethod(
+                        "setDisplayFeatures", MutableList::class.java
+                    )
+                    methodSetFeatures.invoke(info, displayFeatures)
+                } catch (e: NoSuchMethodException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: IllegalAccessException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: InvocationTargetException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+        }
+
+        internal fun getSidecarDevicePosture(sidecarDeviceState: SidecarDeviceState): Int {
+            val rawPosture = getRawSidecarDevicePosture(sidecarDeviceState)
+            return if (rawPosture < SidecarDeviceState.POSTURE_UNKNOWN ||
+                rawPosture > SidecarDeviceState.POSTURE_FLIPPED
+            ) {
+                SidecarDeviceState.POSTURE_UNKNOWN
+            } else {
+                rawPosture
+            }
+        }
+
+        // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+        @SuppressLint("BanUncheckedReflection")
+        @VisibleForTesting
+        fun getRawSidecarDevicePosture(sidecarDeviceState: SidecarDeviceState): Int {
+            try {
+                return sidecarDeviceState.posture
+            } catch (error: NoSuchFieldError) {
+                try {
+                    val methodGetPosture = SidecarDeviceState::class.java.getMethod("getPosture")
+                    return methodGetPosture.invoke(sidecarDeviceState) as Int
+                } catch (e: NoSuchMethodException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: IllegalAccessException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: InvocationTargetException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+            return SidecarDeviceState.POSTURE_UNKNOWN
+        }
+
+        // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+        @SuppressLint("BanUncheckedReflection")
+        @VisibleForTesting
+        fun setSidecarDevicePosture(sidecarDeviceState: SidecarDeviceState, posture: Int) {
+            try {
+                sidecarDeviceState.posture = posture
+            } catch (error: NoSuchFieldError) {
+                try {
+                    val methodSetPosture = SidecarDeviceState::class.java.getMethod(
+                        "setPosture",
+                        Int::class.javaPrimitiveType
+                    )
+                    methodSetPosture.invoke(sidecarDeviceState, posture)
+                } catch (e: NoSuchMethodException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: IllegalAccessException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                } catch (e: InvocationTargetException) {
+                    if (ExtensionCompat.DEBUG) {
+                        e.printStackTrace()
+                    }
+                }
+            }
+        }
+
+        /**
+         * Converts the display feature from extension. Can return `null` if there is an issue
+         * with the value passed from extension.
+         */
+        internal fun translate(
+            feature: SidecarDisplayFeature,
+            deviceState: SidecarDeviceState
+        ): DisplayFeature? {
+            val bounds = feature.rect
+            if (bounds.width() == 0 && bounds.height() == 0) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "Passed a display feature with empty rect, skipping: $feature")
+                }
+                return null
+            }
+            if (feature.type == SidecarDisplayFeature.TYPE_FOLD) {
+                if (bounds.width() != 0 && bounds.height() != 0) {
+                    // Bounds for fold types are expected to be zero-wide or zero-high.
+                    // See DisplayFeature#getBounds().
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(
+                            TAG,
+                            "Passed a non-zero area display feature expected to be zero-area, " +
+                                "skipping: $feature"
+                        )
+                    }
+                    return null
+                }
+            }
+            if (feature.type == SidecarDisplayFeature.TYPE_HINGE ||
+                feature.type == SidecarDisplayFeature.TYPE_FOLD
+            ) {
+                // TODO(b/175507310): Reinstate after fix on the OEM side.
+                if (
+                    !(
+                        bounds.left == 0 /* && bounds.right == windowBounds.width()*/ ||
+                            bounds.top == 0 /* && bounds.bottom == windowBounds.height()*/
+                        )
+                ) {
+                    // Bounds for fold and hinge types are expected to span the entire window space.
+                    // See DisplayFeature#getBounds().
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(
+                            TAG,
+                            "Passed a display feature expected to span the entire window but " +
+                                "does not, skipping: $feature"
+                        )
+                    }
+                    return null
+                }
+            }
+            val type: Int = when (feature.type) {
+                SidecarDisplayFeature.TYPE_FOLD -> FoldingFeature.TYPE_FOLD
+                SidecarDisplayFeature.TYPE_HINGE -> FoldingFeature.TYPE_HINGE
+                else -> {
+                    if (ExtensionCompat.DEBUG) {
+                        Log.d(TAG, "Unknown feature type: ${feature.type}, skipping feature.")
+                    }
+                    return null
+                }
+            }
+            val state: Int = when (getSidecarDevicePosture(deviceState)) {
+                SidecarDeviceState.POSTURE_CLOSED,
+                SidecarDeviceState.POSTURE_UNKNOWN,
+                SidecarDeviceState.POSTURE_FLIPPED -> return null
+                SidecarDeviceState.POSTURE_HALF_OPENED -> FoldingFeature.STATE_HALF_OPENED
+                SidecarDeviceState.POSTURE_OPENED -> FoldingFeature.STATE_FLAT
+                else -> FoldingFeature.STATE_FLAT
+            }
+            return FoldingFeature(feature.rect, type, state)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/SidecarCompat.java b/window/window/src/main/java/androidx/window/SidecarCompat.java
deleted file mode 100644
index ad950a4..0000000
--- a/window/window/src/main/java/androidx/window/SidecarCompat.java
+++ /dev/null
@@ -1,446 +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.window;
-
-import static androidx.window.ActivityUtil.getActivityWindowToken;
-import static androidx.window.ExtensionCompat.DEBUG;
-import static androidx.window.Version.VERSION_0_1;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.collection.SimpleArrayMap;
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarInterface;
-import androidx.window.sidecar.SidecarProvider;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.WeakHashMap;
-
-/** Extension interface compatibility wrapper for v0.1 sidecar. */
-@SuppressWarnings("deprecation")
-final class SidecarCompat implements ExtensionInterfaceCompat {
-    private static final String TAG = "SidecarCompat";
-
-    // Map of active listeners registered with #onWindowLayoutChangeListenerAdded() and not yet
-    // removed by #onWindowLayoutChangeListenerRemoved().
-    protected final SimpleArrayMap<IBinder, Activity> mWindowListenerRegisteredContexts =
-            new SimpleArrayMap<>();
-
-    private ExtensionCallbackInterface mExtensionCallback;
-    private final SidecarAdapter mSidecarAdapter;
-
-    @VisibleForTesting
-    final SidecarInterface mSidecar;
-
-    SidecarCompat(Context context) {
-        this(SidecarProvider.getSidecarImpl(context), new SidecarAdapter());
-        if (mSidecar == null) {
-            throw new IllegalArgumentException("Sidecar provider returned null");
-        }
-    }
-
-    @VisibleForTesting
-    SidecarCompat(@NonNull SidecarInterface sidecar, SidecarAdapter sidecarAdapter) {
-        // Empty implementation to avoid null checks.
-        mExtensionCallback = new ExtensionCallbackInterface() {
-
-            @Override
-            public void onWindowLayoutChanged(@NonNull Activity activity,
-                    @NonNull WindowLayoutInfo newLayout) {
-
-            }
-        };
-        mSidecar = sidecar;
-        mSidecarAdapter = sidecarAdapter;
-    }
-
-    @Override
-    public void setExtensionCallback(@NonNull ExtensionCallbackInterface extensionCallback) {
-        mExtensionCallback = new DistinctElementCallback(extensionCallback);
-        mSidecar.setSidecarCallback(new DistinctSidecarElementCallback(mSidecarAdapter,
-                new TranslatingCallback()));
-    }
-
-    @NonNull
-    @VisibleForTesting
-    WindowLayoutInfo getWindowLayoutInfo(@NonNull Activity activity) {
-        IBinder windowToken = getActivityWindowToken(activity);
-
-        SidecarWindowLayoutInfo windowLayoutInfo = mSidecar.getWindowLayoutInfo(windowToken);
-        return mSidecarAdapter.translate(activity, windowLayoutInfo, mSidecar.getDeviceState());
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerAdded(@NonNull Activity activity) {
-        IBinder windowToken = getActivityWindowToken(activity);
-
-        if (windowToken != null) {
-            register(windowToken, activity);
-        } else {
-            FirstAttachAdapter attachAdapter = new FirstAttachAdapter(this, activity);
-            activity.getWindow().getDecorView().addOnAttachStateChangeListener(attachAdapter);
-        }
-    }
-
-    /**
-     * Register an {@link IBinder} token and an {@link Activity} so that the given
-     * {@link Activity} will receive updates when there is a new {@link WindowLayoutInfo}.
-     * @param windowToken for the given {@link Activity}.
-     * @param activity that is listening for changes of {@link WindowLayoutInfo}
-     */
-    void register(@NonNull IBinder windowToken, @NonNull Activity activity) {
-        mWindowListenerRegisteredContexts.put(windowToken, activity);
-        mSidecar.onWindowLayoutChangeListenerAdded(windowToken);
-        // Since SidecarDeviceState and SidecarWindowLayout are merged we trigger both
-        // data streams.
-        if (mWindowListenerRegisteredContexts.size() == 1) {
-            mSidecar.onDeviceStateListenersChanged(false);
-        }
-        mExtensionCallback.onWindowLayoutChanged(activity, getWindowLayoutInfo(activity));
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity) {
-        IBinder windowToken = getActivityWindowToken(activity);
-
-        mSidecar.onWindowLayoutChangeListenerRemoved(windowToken);
-        boolean isLast = mWindowListenerRegisteredContexts.size() == 1;
-        mWindowListenerRegisteredContexts.remove(windowToken);
-        if (isLast) {
-            mSidecar.onDeviceStateListenersChanged(true);
-        }
-    }
-
-    @SuppressLint("BanUncheckedReflection")
-    @Override
-    @SuppressWarnings("unused")
-    public boolean validateExtensionInterface() {
-        try {
-            // sidecar.setSidecarCallback(SidecarInterface.SidecarCallback);
-            Method methodSetSidecarCallback = mSidecar.getClass().getMethod("setSidecarCallback",
-                    SidecarInterface.SidecarCallback.class);
-            Class<?> rSetSidecarCallback = methodSetSidecarCallback.getReturnType();
-            if (!rSetSidecarCallback.equals(void.class)) {
-                throw new NoSuchMethodException("Illegal return type for 'setSidecarCallback': "
-                        + rSetSidecarCallback);
-            }
-
-            // DO NOT REMOVE SINCE THIS IS VALIDATING THE INTERFACE.
-            // sidecar.getDeviceState()
-            SidecarDeviceState tmpDeviceState = mSidecar.getDeviceState();
-
-            // sidecar.onDeviceStateListenersChanged(boolean);
-            mSidecar.onDeviceStateListenersChanged(true /* isEmpty */);
-
-            // sidecar.getWindowLayoutInfo(IBinder)
-            Method methodGetWindowLayoutInfo = mSidecar.getClass()
-                    .getMethod("getWindowLayoutInfo", IBinder.class);
-            Class<?> rtGetWindowLayoutInfo = methodGetWindowLayoutInfo.getReturnType();
-            if (!rtGetWindowLayoutInfo.equals(SidecarWindowLayoutInfo.class)) {
-                throw new NoSuchMethodException(
-                        "Illegal return type for 'getWindowLayoutInfo': "
-                                + rtGetWindowLayoutInfo);
-            }
-
-            // sidecar.onWindowLayoutChangeListenerAdded(IBinder);
-            Method methodRegisterWindowLayoutChangeListener = mSidecar.getClass()
-                    .getMethod("onWindowLayoutChangeListenerAdded", IBinder.class);
-            Class<?> rtRegisterWindowLayoutChangeListener =
-                    methodRegisterWindowLayoutChangeListener.getReturnType();
-            if (!rtRegisterWindowLayoutChangeListener.equals(void.class)) {
-                throw new NoSuchMethodException(
-                        "Illegal return type for 'onWindowLayoutChangeListenerAdded': "
-                                + rtRegisterWindowLayoutChangeListener);
-            }
-
-            // sidecar.onWindowLayoutChangeListenerRemoved(IBinder);
-            Method methodUnregisterWindowLayoutChangeListener = mSidecar.getClass()
-                    .getMethod("onWindowLayoutChangeListenerRemoved", IBinder.class);
-            Class<?> rtUnregisterWindowLayoutChangeListener =
-                    methodUnregisterWindowLayoutChangeListener.getReturnType();
-            if (!rtUnregisterWindowLayoutChangeListener.equals(void.class)) {
-                throw new NoSuchMethodException(
-                        "Illegal return type for 'onWindowLayoutChangeListenerRemoved': "
-                                + rtUnregisterWindowLayoutChangeListener);
-            }
-
-            // SidecarDeviceState constructor
-            tmpDeviceState = new SidecarDeviceState();
-
-            // deviceState.posture
-            // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-            try {
-                tmpDeviceState.posture = SidecarDeviceState.POSTURE_OPENED;
-            } catch (NoSuchFieldError error) {
-                if (DEBUG) {
-                    Log.w(TAG, "Sidecar implementation doesn't conform to primary interface "
-                            + "version, continue to check for the secondary one "
-                            + VERSION_0_1 + ", error: " + error);
-                }
-                Method methodSetPosture = SidecarDeviceState.class.getMethod("setPosture",
-                        int.class);
-                methodSetPosture.invoke(tmpDeviceState, SidecarDeviceState.POSTURE_OPENED);
-                Method methodGetPosture = SidecarDeviceState.class.getMethod("getPosture");
-                int posture = (int) methodGetPosture.invoke(tmpDeviceState);
-                if (posture != SidecarDeviceState.POSTURE_OPENED) {
-                    throw new Exception("Invalid device posture getter/setter");
-                }
-            }
-
-            // SidecarDisplayFeature constructor
-            SidecarDisplayFeature displayFeature = new SidecarDisplayFeature();
-
-            // displayFeature.getRect()/setRect()
-            Rect tmpRect = displayFeature.getRect();
-            displayFeature.setRect(tmpRect);
-
-            // displayFeature.getType()/setType()
-            int tmpType = displayFeature.getType();
-            displayFeature.setType(SidecarDisplayFeature.TYPE_FOLD);
-
-            // SidecarWindowLayoutInfo constructor
-            SidecarWindowLayoutInfo windowLayoutInfo = new SidecarWindowLayoutInfo();
-
-            // windowLayoutInfo.displayFeatures
-            try {
-                final List<SidecarDisplayFeature> tmpDisplayFeatures =
-                        windowLayoutInfo.displayFeatures;
-                // TODO(b/172620880): Workaround for Sidecar API implementation issue.
-            } catch (NoSuchFieldError error) {
-                if (DEBUG) {
-                    Log.w(TAG, "Sidecar implementation doesn't conform to primary interface "
-                            + "version, continue to check for the secondary one "
-                            + VERSION_0_1 + ", error: " + error);
-                }
-                List<SidecarDisplayFeature> featureList = new ArrayList<>();
-                featureList.add(displayFeature);
-                Method methodSetFeatures = SidecarWindowLayoutInfo.class.getMethod(
-                        "setDisplayFeatures", List.class);
-                methodSetFeatures.invoke(windowLayoutInfo, featureList);
-                Method methodGetFeatures = SidecarWindowLayoutInfo.class.getMethod(
-                        "getDisplayFeatures");
-                @SuppressWarnings("unchecked")
-                final List<SidecarDisplayFeature> resultDisplayFeatures =
-                        (List<SidecarDisplayFeature>) methodGetFeatures.invoke(windowLayoutInfo);
-                if (!featureList.equals(resultDisplayFeatures)) {
-                    throw new Exception("Invalid display feature getter/setter");
-                }
-            }
-
-            return true;
-        } catch (Throwable t) {
-            if (DEBUG) {
-                Log.e(TAG, "Sidecar implementation doesn't conform to interface version "
-                        + VERSION_0_1 + ", error: " + t);
-            }
-            return false;
-        }
-    }
-
-    @Nullable
-    static Version getSidecarVersion() {
-        try {
-            String vendorVersion = SidecarProvider.getApiVersion();
-            return !TextUtils.isEmpty(vendorVersion) ? Version.parse(vendorVersion) : null;
-        } catch (NoClassDefFoundError e) {
-            if (DEBUG) {
-                Log.d(TAG, "Sidecar version not found");
-            }
-            return null;
-        } catch (UnsupportedOperationException e) {
-            if (DEBUG) {
-                Log.d(TAG, "Stub Sidecar");
-            }
-            return null;
-        }
-    }
-
-    /**
-     * An adapter that will run a callback when a window is attached and then be removed from the
-     * listener set.
-     */
-    private static class FirstAttachAdapter implements View.OnAttachStateChangeListener {
-
-        private final SidecarCompat mSidecarCompat;
-        private final WeakReference<Activity> mActivityWeakReference;
-
-        FirstAttachAdapter(SidecarCompat sidecarCompat, Activity activity) {
-            mSidecarCompat = sidecarCompat;
-            mActivityWeakReference = new WeakReference<>(activity);
-        }
-
-        @Override
-        public void onViewAttachedToWindow(View view) {
-            view.removeOnAttachStateChangeListener(this);
-            Activity activity = mActivityWeakReference.get();
-            IBinder token = getActivityWindowToken(activity);
-            if (activity == null) {
-                if (DEBUG) {
-                    Log.d(TAG, "Unable to register activity since activity is missing");
-                }
-                return;
-            }
-            if (token == null) {
-                if (DEBUG) {
-                    Log.w(TAG, "Unable to register activity since the window token is missing");
-                }
-                return;
-            }
-            mSidecarCompat.register(token, activity);
-        }
-
-        @Override
-        public void onViewDetachedFromWindow(View view) { }
-    }
-
-    final class TranslatingCallback implements SidecarInterface.SidecarCallback {
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
-            for (int i = 0; i < mWindowListenerRegisteredContexts.size(); i++) {
-                Activity activity = mWindowListenerRegisteredContexts.valueAt(i);
-                IBinder windowToken = getActivityWindowToken(activity);
-                if (windowToken == null) {
-                    continue;
-                }
-                SidecarWindowLayoutInfo layoutInfo = mSidecar.getWindowLayoutInfo(windowToken);
-                mExtensionCallback.onWindowLayoutChanged(activity,
-                        mSidecarAdapter.translate(activity, layoutInfo, newDeviceState));
-            }
-        }
-
-        @Override
-        @SuppressLint("SyntheticAccessor")
-        public void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                @NonNull SidecarWindowLayoutInfo newLayout) {
-            Activity activity = mWindowListenerRegisteredContexts.get(windowToken);
-            if (activity == null) {
-                Log.w(TAG, "Unable to resolve activity from window token. Missing a call"
-                        + "to #onWindowLayoutChangeListenerAdded()?");
-                return;
-            }
-
-            mExtensionCallback.onWindowLayoutChanged(activity,
-                    mSidecarAdapter.translate(activity, newLayout, mSidecar.getDeviceState()));
-        }
-    }
-
-    /**
-     * A class to record the last calculated values from {@link SidecarInterface} and filter out
-     * duplicates. This class uses {@link WindowLayoutInfo} as opposed to
-     * {@link SidecarDisplayFeature} since the methods {@link Object#equals(Object)} and
-     * {@link Object#hashCode()} may not have been overridden.
-     */
-    private static final class DistinctElementCallback
-            implements ExtensionCallbackInterface {
-
-        private final Object mLock = new Object();
-        /**
-         * A map from {@link Activity} to the last computed {@link WindowLayoutInfo} for the
-         * given activity. A {@link WeakHashMap} is used to avoid retaining the {@link Activity}.
-         */
-        @GuardedBy("mLock")
-        private final WeakHashMap<Activity, WindowLayoutInfo> mActivityWindowLayoutInfo =
-                new WeakHashMap<>();
-        private final ExtensionCallbackInterface mCallbackInterface;
-
-        DistinctElementCallback(ExtensionCallbackInterface callbackInterface) {
-            mCallbackInterface = callbackInterface;
-        }
-
-        @Override
-        public void onWindowLayoutChanged(@NonNull Activity activity,
-                @NonNull WindowLayoutInfo newLayout) {
-            synchronized (mLock) {
-                WindowLayoutInfo lastInfo = mActivityWindowLayoutInfo.get(activity);
-                if (newLayout.equals(lastInfo)) {
-                    return;
-                }
-                mActivityWindowLayoutInfo.put(activity, newLayout);
-            }
-            mCallbackInterface.onWindowLayoutChanged(activity, newLayout);
-        }
-    }
-
-    /**
-     * A class to record the last calculated values from {@link SidecarInterface} and filter out
-     * duplicates. This class uses {@link SidecarAdapter} to compute equality since the methods
-     * {@link Object#equals(Object)} and {@link Object#hashCode()} may not have been overridden.
-     */
-    private static final class DistinctSidecarElementCallback
-            implements SidecarInterface.SidecarCallback {
-
-        private final Object mLock = new Object();
-        @GuardedBy("mLock")
-        private SidecarDeviceState mLastDeviceState;
-        /**
-         * A map from {@link Activity} to the last computed {@link WindowLayoutInfo} for the
-         * given activity. A {@link WeakHashMap} is used to avoid retaining the {@link Activity}.
-         */
-        @GuardedBy("mLock")
-        private final WeakHashMap<IBinder, SidecarWindowLayoutInfo> mActivityWindowLayoutInfo =
-                new WeakHashMap<>();
-        private final SidecarAdapter mSidecarAdapter;
-        private final SidecarInterface.SidecarCallback mCallbackInterface;
-
-        DistinctSidecarElementCallback(SidecarAdapter adapter,
-                SidecarInterface.SidecarCallback callbackInterface) {
-            mSidecarAdapter = adapter;
-            mCallbackInterface = callbackInterface;
-        }
-
-        @Override
-        public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
-            synchronized (mLock) {
-                if (mSidecarAdapter.isEqualSidecarDeviceState(mLastDeviceState, newDeviceState)) {
-                    return;
-                }
-                mLastDeviceState = newDeviceState;
-                mCallbackInterface.onDeviceStateChanged(newDeviceState);
-            }
-        }
-
-        @Override
-        public void onWindowLayoutChanged(@NonNull IBinder token,
-                @NonNull SidecarWindowLayoutInfo newLayout) {
-            synchronized (mLock) {
-                SidecarWindowLayoutInfo lastInfo = mActivityWindowLayoutInfo.get(token);
-                if (mSidecarAdapter.isEqualSidecarWindowLayoutInfo(lastInfo, newLayout)) {
-                    return;
-                }
-                mActivityWindowLayoutInfo.put(token, newLayout);
-            }
-            mCallbackInterface.onWindowLayoutChanged(token, newLayout);
-        }
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/SidecarCompat.kt b/window/window/src/main/java/androidx/window/SidecarCompat.kt
new file mode 100644
index 0000000..5bc2c49
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/SidecarCompat.kt
@@ -0,0 +1,421 @@
+/*
+ * 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.
+ */
+// Sidecar is deprecated but we still need to support it.
+@file:Suppress("DEPRECATION")
+
+package androidx.window
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.os.IBinder
+import android.text.TextUtils
+import android.util.Log
+import android.view.View
+import androidx.annotation.GuardedBy
+import androidx.annotation.VisibleForTesting
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.Version.Companion.parse
+import androidx.window.sidecar.SidecarDeviceState
+import androidx.window.sidecar.SidecarDisplayFeature
+import androidx.window.sidecar.SidecarInterface
+import androidx.window.sidecar.SidecarInterface.SidecarCallback
+import androidx.window.sidecar.SidecarProvider
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import java.lang.ref.WeakReference
+import java.util.ArrayList
+import java.util.WeakHashMap
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/** Extension interface compatibility wrapper for v0.1 sidecar.  */
+internal class SidecarCompat @VisibleForTesting constructor(
+    @VisibleForTesting
+    val sidecar: SidecarInterface?,
+    private val sidecarAdapter: SidecarAdapter
+) : ExtensionInterfaceCompat {
+    // Map of active listeners registered with #onWindowLayoutChangeListenerAdded() and not yet
+    // removed by #onWindowLayoutChangeListenerRemoved().
+    private val windowListenerRegisteredContexts = mutableMapOf<IBinder, Activity>()
+    private var extensionCallback: ExtensionCallbackInterface? = null
+
+    constructor(context: Context) : this(
+        SidecarProvider.getSidecarImpl(context),
+        SidecarAdapter()
+    )
+
+    override fun setExtensionCallback(extensionCallback: ExtensionCallbackInterface) {
+        this.extensionCallback = DistinctElementCallback(extensionCallback)
+        sidecar?.setSidecarCallback(
+            DistinctSidecarElementCallback(
+                sidecarAdapter,
+                TranslatingCallback()
+            )
+        )
+    }
+
+    @VisibleForTesting
+    fun getWindowLayoutInfo(activity: Activity): WindowLayoutInfo {
+        val windowToken = getActivityWindowToken(activity) ?: return WindowLayoutInfo(emptyList())
+        val windowLayoutInfo = sidecar?.getWindowLayoutInfo(windowToken)
+        return sidecarAdapter.translate(
+            windowLayoutInfo,
+            sidecar?.deviceState ?: SidecarDeviceState()
+        )
+    }
+
+    override fun onWindowLayoutChangeListenerAdded(activity: Activity) {
+        val windowToken = getActivityWindowToken(activity)
+        if (windowToken != null) {
+            register(windowToken, activity)
+        } else {
+            val attachAdapter = FirstAttachAdapter(this, activity)
+            activity.window.decorView.addOnAttachStateChangeListener(attachAdapter)
+        }
+    }
+
+    /**
+     * Register an [IBinder] token and an [Activity] so that the given
+     * [Activity] will receive updates when there is a new [WindowLayoutInfo].
+     * @param windowToken for the given [Activity].
+     * @param activity that is listening for changes of [WindowLayoutInfo]
+     */
+    fun register(windowToken: IBinder, activity: Activity) {
+        windowListenerRegisteredContexts[windowToken] = activity
+        sidecar?.onWindowLayoutChangeListenerAdded(windowToken)
+        // Since SidecarDeviceState and SidecarWindowLayout are merged we trigger both
+        // data streams.
+        if (windowListenerRegisteredContexts.size == 1) {
+            sidecar?.onDeviceStateListenersChanged(false)
+        }
+        extensionCallback?.onWindowLayoutChanged(activity, getWindowLayoutInfo(activity))
+    }
+
+    override fun onWindowLayoutChangeListenerRemoved(activity: Activity) {
+        val windowToken = getActivityWindowToken(activity) ?: return
+        sidecar?.onWindowLayoutChangeListenerRemoved(windowToken)
+        val isLast = windowListenerRegisteredContexts.size == 1
+        windowListenerRegisteredContexts.remove(windowToken)
+        if (isLast) {
+            sidecar?.onDeviceStateListenersChanged(true)
+        }
+    }
+
+    @SuppressLint("BanUncheckedReflection")
+    override fun validateExtensionInterface(): Boolean {
+        return try {
+            // sidecar.setSidecarCallback(SidecarInterface.SidecarCallback);
+            val methodSetSidecarCallback = sidecar?.javaClass?.getMethod(
+                "setSidecarCallback",
+                SidecarCallback::class.java
+            )
+            val rSetSidecarCallback = methodSetSidecarCallback?.returnType
+            if (rSetSidecarCallback != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'setSidecarCallback': $rSetSidecarCallback"
+                )
+            }
+
+            // DO NOT REMOVE SINCE THIS IS VALIDATING THE INTERFACE.
+            // sidecar.getDeviceState()
+            @Suppress("VARIABLE_WITH_REDUNDANT_INITIALIZER")
+            var tmpDeviceState = sidecar?.deviceState
+
+            // sidecar.onDeviceStateListenersChanged(boolean);
+            sidecar?.onDeviceStateListenersChanged(true /* isEmpty */)
+
+            // sidecar.getWindowLayoutInfo(IBinder)
+            val methodGetWindowLayoutInfo = sidecar?.javaClass
+                ?.getMethod("getWindowLayoutInfo", IBinder::class.java)
+            val rtGetWindowLayoutInfo = methodGetWindowLayoutInfo?.returnType
+            if (rtGetWindowLayoutInfo != SidecarWindowLayoutInfo::class.java) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'getWindowLayoutInfo': $rtGetWindowLayoutInfo"
+                )
+            }
+
+            // sidecar.onWindowLayoutChangeListenerAdded(IBinder);
+            val methodRegisterWindowLayoutChangeListener = sidecar?.javaClass
+                ?.getMethod("onWindowLayoutChangeListenerAdded", IBinder::class.java)
+            val rtRegisterWindowLayoutChangeListener =
+                methodRegisterWindowLayoutChangeListener?.returnType
+            if (rtRegisterWindowLayoutChangeListener != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'onWindowLayoutChangeListenerAdded': " +
+                        "$rtRegisterWindowLayoutChangeListener"
+                )
+            }
+
+            // sidecar.onWindowLayoutChangeListenerRemoved(IBinder);
+            val methodUnregisterWindowLayoutChangeListener = sidecar?.javaClass
+                ?.getMethod("onWindowLayoutChangeListenerRemoved", IBinder::class.java)
+            val rtUnregisterWindowLayoutChangeListener =
+                methodUnregisterWindowLayoutChangeListener?.returnType
+            if (rtUnregisterWindowLayoutChangeListener != Void.TYPE) {
+                throw NoSuchMethodException(
+                    "Illegal return type for 'onWindowLayoutChangeListenerRemoved': " +
+                        "$rtUnregisterWindowLayoutChangeListener"
+                )
+            }
+
+            // SidecarDeviceState constructor
+            tmpDeviceState = SidecarDeviceState()
+
+            // deviceState.posture
+            // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+            try {
+                tmpDeviceState.posture = SidecarDeviceState.POSTURE_OPENED
+            } catch (error: NoSuchFieldError) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.w(
+                        TAG,
+                        "Sidecar implementation doesn't conform to primary interface version, " +
+                            "continue to check for the secondary one ${Version.VERSION_0_1}, " +
+                            "error: $error"
+                    )
+                }
+                val methodSetPosture = SidecarDeviceState::class.java.getMethod(
+                    "setPosture",
+                    Int::class.javaPrimitiveType
+                )
+                methodSetPosture.invoke(tmpDeviceState, SidecarDeviceState.POSTURE_OPENED)
+                val methodGetPosture = SidecarDeviceState::class.java.getMethod("getPosture")
+                val posture = methodGetPosture.invoke(tmpDeviceState) as Int
+                if (posture != SidecarDeviceState.POSTURE_OPENED) {
+                    throw Exception("Invalid device posture getter/setter")
+                }
+            }
+
+            // SidecarDisplayFeature constructor
+            val displayFeature = SidecarDisplayFeature()
+
+            // displayFeature.getRect()/setRect()
+            val tmpRect = displayFeature.rect
+            displayFeature.rect = tmpRect
+
+            // displayFeature.getType()/setType()
+            @Suppress("UNUSED_VARIABLE")
+            val tmpType = displayFeature.type
+            displayFeature.type = SidecarDisplayFeature.TYPE_FOLD
+
+            // SidecarWindowLayoutInfo constructor
+            val windowLayoutInfo = SidecarWindowLayoutInfo()
+
+            // windowLayoutInfo.displayFeatures
+            try {
+                @Suppress("UNUSED_VARIABLE")
+                val tmpDisplayFeatures = windowLayoutInfo.displayFeatures
+                // TODO(b/172620880): Workaround for Sidecar API implementation issue.
+            } catch (error: NoSuchFieldError) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.w(
+                        TAG,
+                        "Sidecar implementation doesn't conform to primary interface version, " +
+                            "continue to check for the secondary one ${Version.VERSION_0_1}, " +
+                            "error: $error"
+                    )
+                }
+                val featureList: MutableList<SidecarDisplayFeature> = ArrayList()
+                featureList.add(displayFeature)
+                val methodSetFeatures = SidecarWindowLayoutInfo::class.java.getMethod(
+                    "setDisplayFeatures", MutableList::class.java
+                )
+                methodSetFeatures.invoke(windowLayoutInfo, featureList)
+                val methodGetFeatures = SidecarWindowLayoutInfo::class.java.getMethod(
+                    "getDisplayFeatures"
+                )
+                @Suppress("UNCHECKED_CAST")
+                val resultDisplayFeatures =
+                    methodGetFeatures.invoke(windowLayoutInfo) as List<SidecarDisplayFeature>
+                if (featureList != resultDisplayFeatures) {
+                    throw Exception("Invalid display feature getter/setter")
+                }
+            }
+            true
+        } catch (t: Throwable) {
+            if (ExtensionCompat.DEBUG) {
+                Log.e(
+                    TAG,
+                    "Sidecar implementation doesn't conform to interface version " +
+                        "${Version.VERSION_0_1}, error: $t"
+                )
+            }
+            false
+        }
+    }
+
+    /**
+     * An adapter that will run a callback when a window is attached and then be removed from the
+     * listener set.
+     */
+    private class FirstAttachAdapter(
+        private val sidecarCompat: SidecarCompat,
+        activity: Activity
+    ) : View.OnAttachStateChangeListener {
+        private val activityWeakReference = WeakReference(activity)
+        override fun onViewAttachedToWindow(view: View) {
+            view.removeOnAttachStateChangeListener(this)
+            val activity = activityWeakReference.get()
+            val token = getActivityWindowToken(activity)
+            if (activity == null) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "Unable to register activity since activity is missing")
+                }
+                return
+            }
+            if (token == null) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.w(TAG, "Unable to register activity since the window token is missing")
+                }
+                return
+            }
+            sidecarCompat.register(token, activity)
+        }
+
+        override fun onViewDetachedFromWindow(view: View) {}
+    }
+
+    internal inner class TranslatingCallback : SidecarCallback {
+        @SuppressLint("SyntheticAccessor")
+        override fun onDeviceStateChanged(newDeviceState: SidecarDeviceState) {
+            windowListenerRegisteredContexts.values.forEach { activity ->
+                val layoutInfo = getActivityWindowToken(activity)
+                    ?.let { windowToken -> sidecar?.getWindowLayoutInfo(windowToken) }
+                extensionCallback?.onWindowLayoutChanged(
+                    activity,
+                    sidecarAdapter.translate(layoutInfo, newDeviceState)
+                )
+            }
+        }
+
+        @SuppressLint("SyntheticAccessor")
+        override fun onWindowLayoutChanged(
+            windowToken: IBinder,
+            newLayout: SidecarWindowLayoutInfo
+        ) {
+            val activity = windowListenerRegisteredContexts[windowToken]
+            if (activity == null) {
+                Log.w(
+                    TAG,
+                    "Unable to resolve activity from window token. Missing a call to " +
+                        "#onWindowLayoutChangeListenerAdded()?"
+                )
+                return
+            }
+            val layoutInfo = sidecarAdapter.translate(
+                newLayout,
+                sidecar?.deviceState ?: SidecarDeviceState()
+            )
+            extensionCallback?.onWindowLayoutChanged(activity, layoutInfo)
+        }
+    }
+
+    /**
+     * A class to record the last calculated values from [SidecarInterface] and filter out
+     * duplicates. This class uses [WindowLayoutInfo] as opposed to
+     * [SidecarDisplayFeature] since the methods [Object.equals] and
+     * [Object.hashCode] may not have been overridden.
+     */
+    private class DistinctElementCallback(
+        private val callbackInterface: ExtensionCallbackInterface
+    ) : ExtensionCallbackInterface {
+        private val lock = ReentrantLock()
+
+        /**
+         * A map from [Activity] to the last computed [WindowLayoutInfo] for the
+         * given activity. A [WeakHashMap] is used to avoid retaining the [Activity].
+         */
+        @GuardedBy("mLock")
+        private val activityWindowLayoutInfo = WeakHashMap<Activity, WindowLayoutInfo>()
+        override fun onWindowLayoutChanged(
+            activity: Activity,
+            newLayout: WindowLayoutInfo
+        ) {
+            lock.withLock {
+                val lastInfo = activityWindowLayoutInfo[activity]
+                if (newLayout == lastInfo) {
+                    return
+                }
+                activityWindowLayoutInfo.put(activity, newLayout)
+            }
+            callbackInterface.onWindowLayoutChanged(activity, newLayout)
+        }
+    }
+
+    /**
+     * A class to record the last calculated values from [SidecarInterface] and filter out
+     * duplicates. This class uses [SidecarAdapter] to compute equality since the methods
+     * [Object.equals] and [Object.hashCode] may not have been overridden.
+     */
+    private class DistinctSidecarElementCallback(
+        private val sidecarAdapter: SidecarAdapter,
+        private val callbackInterface: SidecarCallback
+    ) : SidecarCallback {
+        private val lock = ReentrantLock()
+
+        @GuardedBy("lock")
+        private var lastDeviceState: SidecarDeviceState? = null
+
+        /**
+         * A map from [Activity] to the last computed [WindowLayoutInfo] for the
+         * given activity. A [WeakHashMap] is used to avoid retaining the [Activity].
+         */
+        @GuardedBy("mLock")
+        private val mActivityWindowLayoutInfo = WeakHashMap<IBinder, SidecarWindowLayoutInfo>()
+        override fun onDeviceStateChanged(newDeviceState: SidecarDeviceState) {
+            lock.withLock {
+                if (sidecarAdapter.isEqualSidecarDeviceState(lastDeviceState, newDeviceState)) {
+                    return
+                }
+                lastDeviceState = newDeviceState
+                callbackInterface.onDeviceStateChanged(newDeviceState)
+            }
+        }
+
+        override fun onWindowLayoutChanged(
+            token: IBinder,
+            newLayout: SidecarWindowLayoutInfo
+        ) {
+            synchronized(lock) {
+                val lastInfo = mActivityWindowLayoutInfo[token]
+                if (sidecarAdapter.isEqualSidecarWindowLayoutInfo(lastInfo, newLayout)) {
+                    return
+                }
+                mActivityWindowLayoutInfo.put(token, newLayout)
+            }
+            callbackInterface.onWindowLayoutChanged(token, newLayout)
+        }
+    }
+
+    companion object {
+        private const val TAG = "SidecarCompat"
+        val sidecarVersion: Version?
+            get() = try {
+                val vendorVersion = SidecarProvider.getApiVersion()
+                if (!TextUtils.isEmpty(vendorVersion)) parse(vendorVersion) else null
+            } catch (e: NoClassDefFoundError) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "Sidecar version not found")
+                }
+                null
+            } catch (e: UnsupportedOperationException) {
+                if (ExtensionCompat.DEBUG) {
+                    Log.d(TAG, "Stub Sidecar")
+                }
+                null
+            }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/Version.java b/window/window/src/main/java/androidx/window/Version.java
deleted file mode 100644
index 83a9d45..0000000
--- a/window/window/src/main/java/androidx/window/Version.java
+++ /dev/null
@@ -1,154 +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.window;
-
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-
-import java.math.BigInteger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Class encapsulating a version with major, minor, patch and description values.
- */
-class Version implements Comparable<Version> {
-    static final Version UNKNOWN = new Version(0, 0, 0, "");
-    static final Version VERSION_0_1 = new Version(0, 1, 0, "");
-    static final Version VERSION_1_0 = new Version(1, 0, 0, "");
-    static final Version CURRENT = VERSION_1_0;
-
-    private static final String VERSION_PATTERN_STRING =
-            "(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:-(.+))?";
-
-    private final int mMajor;
-    private final int mMinor;
-    private final int mPatch;
-    private final String mDescription;
-    // Cached BigInteger value of the version.
-    private BigInteger mBigInteger;
-
-    private Version(int major, int minor, int patch, String description) {
-        mMajor = major;
-        mMinor = minor;
-        mPatch = patch;
-        mDescription = description;
-    }
-
-    /**
-     * Parses a string to a version object.
-     *
-     * @param versionString string in the format "1.2.3" or "1.2.3-Description"
-     *                      (major.minor.patch[-description])
-     * @return the parsed Version object or {@code null}> if the versionString format is invalid.
-     */
-    static Version parse(String versionString) {
-        if (TextUtils.isEmpty(versionString)) {
-            return null;
-        }
-
-        Matcher matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString);
-        if (!matcher.matches()) {
-            return null;
-        }
-
-        int major = Integer.parseInt(matcher.group(1));
-        int minor = Integer.parseInt(matcher.group(2));
-        int patch = Integer.parseInt(matcher.group(3));
-        String description = matcher.group(4) != null ? matcher.group(4) : "";
-        return new Version(major, minor, patch, description);
-    }
-
-    int getMajor() {
-        return mMajor;
-    }
-
-    int getMinor() {
-        return mMinor;
-    }
-
-    int getPatch() {
-        return mPatch;
-    }
-
-    String getDescription() {
-        return mDescription;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder(getMajor())
-                .append(".")
-                .append(getMinor())
-                .append(".")
-                .append(getPatch());
-        if (!TextUtils.isEmpty(getDescription())) {
-            sb.append("-").append(getDescription());
-        }
-        return sb.toString();
-    }
-
-    /**
-     * To compare the major, minor and patch version with another.
-     *
-     * @param other The version to compare to this one.
-     * @return 0 if it have the same major minor and patch version; less than 0 if this version
-     * sorts ahead of <var>other</var>; greater than 0 if this version sorts after <var>other</var>.
-     */
-    @Override
-    public int compareTo(@NonNull Version other) {
-        return toBigInteger().compareTo(other.toBigInteger());
-    }
-
-    @NonNull
-    private BigInteger toBigInteger() {
-        if (mBigInteger == null) {
-            mBigInteger = BigInteger.valueOf(mMajor)
-                    .shiftLeft(32)
-                    .or(BigInteger.valueOf(mMinor))
-                    .shiftLeft(32)
-                    .or(BigInteger.valueOf(mPatch));
-        }
-        return mBigInteger;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof Version)) {
-            return false;
-        }
-
-        Version otherVersionObj = (Version) obj;
-
-        // The equals checking ignores the description.
-        return mMajor == otherVersionObj.mMajor
-                && mMinor == otherVersionObj.mMinor
-                && mPatch == otherVersionObj.mPatch;
-    }
-
-    @Override
-    public int hashCode() {
-        // The hash code ignores the description.
-        int result = 17;
-        result = result * 31 + mMajor;
-        result = result * 31 + mMinor;
-        result = result * 31 + mPatch;
-        return result;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/Version.kt b/window/window/src/main/java/androidx/window/Version.kt
new file mode 100644
index 0000000..29c3ea0
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/Version.kt
@@ -0,0 +1,109 @@
+/*
+ * 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
+
+import java.math.BigInteger
+import java.util.regex.Pattern
+
+/**
+ * Class encapsulating a version with major, minor, patch and description values.
+ */
+internal class Version private constructor(
+    val major: Int,
+    val minor: Int,
+    val patch: Int,
+    val description: String
+) : Comparable<Version> {
+
+    // Cached BigInteger value of the version.
+    private val bigInteger: BigInteger by lazy {
+        BigInteger.valueOf(major.toLong()).shiftLeft(32)
+            .or(BigInteger.valueOf(minor.toLong()))
+            .shiftLeft(32)
+            .or(BigInteger.valueOf(patch.toLong()))
+    }
+
+    override fun toString(): String {
+        val postfix = if (description.isNotBlank()) {
+            "-$description"
+        } else {
+            ""
+        }
+        return "$major.$minor.$patch$postfix"
+    }
+
+    /**
+     * To compare the major, minor and patch version with another.
+     *
+     * @param other The version to compare to this one.
+     * @return 0 if it have the same major minor and patch version; less than 0 if this version
+     * sorts ahead of <var>other</var>; greater than 0 if this version sorts after <var>other</var>.
+     */
+    override fun compareTo(other: Version): Int {
+        return bigInteger.compareTo(other.bigInteger)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (other !is Version) {
+            return false
+        }
+
+        // The equals checking ignores the description.
+        return major == other.major && minor == other.minor && patch == other.patch
+    }
+
+    override fun hashCode(): Int {
+        // The hash code ignores the description.
+        var result = 17
+        result = result * 31 + major
+        result = result * 31 + minor
+        result = result * 31 + patch
+        return result
+    }
+
+    companion object {
+        val UNKNOWN = Version(0, 0, 0, "")
+        @JvmField
+        val VERSION_0_1 = Version(0, 1, 0, "")
+        val VERSION_1_0 = Version(1, 0, 0, "")
+        @JvmField
+        val CURRENT = VERSION_1_0
+        private const val VERSION_PATTERN_STRING = "(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:-(.+))?"
+
+        /**
+         * Parses a string to a version object.
+         *
+         * @param versionString string in the format "1.2.3" or "1.2.3-Description"
+         * (major.minor.patch[-description])
+         * @return the parsed Version object or `null`> if the versionString format is invalid.
+         */
+        @JvmStatic
+        fun parse(versionString: String?): Version? {
+            if (versionString == null || versionString.isBlank()) {
+                return null
+            }
+            val matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString)
+            if (!matcher.matches()) {
+                return null
+            }
+            val major = matcher.group(1)?.toInt() ?: return null
+            val minor = matcher.group(2)?.toInt() ?: return null
+            val patch = matcher.group(3)?.toInt() ?: return null
+            val description = if (matcher.group(4) != null) matcher.group(4) else ""
+            return Version(major, minor, patch, description)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/WindowBackend.java b/window/window/src/main/java/androidx/window/WindowBackend.java
deleted file mode 100644
index 3eb4869..0000000
--- a/window/window/src/main/java/androidx/window/WindowBackend.java
+++ /dev/null
@@ -1,44 +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.window;
-
-import android.app.Activity;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Consumer;
-
-import java.util.concurrent.Executor;
-
-/**
- * Backing interface for {@link WindowManager} instances that server as the default information
- * supplier.
- */
-public interface WindowBackend {
-
-    /**
-     * Registers a callback for layout changes of the window for the supplied {@link Activity}.
-     * Must be called only after the it is attached to the window.
-     */
-    void registerLayoutChangeCallback(@NonNull Activity activity, @NonNull Executor executor,
-            @NonNull Consumer<WindowLayoutInfo> callback);
-
-    /**
-     * Unregisters a callback for window layout changes of the {@link Activity} window.
-     */
-    void unregisterLayoutChangeCallback(@NonNull Consumer<WindowLayoutInfo> callback);
-
-}
diff --git a/window/window/src/main/java/androidx/window/WindowBackend.kt b/window/window/src/main/java/androidx/window/WindowBackend.kt
new file mode 100644
index 0000000..29bc71f
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowBackend.kt
@@ -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.window
+
+import android.app.Activity
+import androidx.core.util.Consumer
+import java.util.concurrent.Executor
+
+/**
+ * Backing interface for {@link androidx.window.WindowManager} instances that server as the default
+ * information
+ * supplier.
+ */
+public interface WindowBackend {
+    /**
+     * Registers a callback for layout changes of the window for the supplied [Activity].
+     * Must be called only after the it is attached to the window.
+     */
+    public fun registerLayoutChangeCallback(
+        activity: Activity,
+        executor: Executor,
+        callback: Consumer<WindowLayoutInfo>
+    )
+
+    /**
+     * Unregisters a callback for window layout changes of the [Activity] window.
+     */
+    public fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>)
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/WindowBoundsHelper.java b/window/window/src/main/java/androidx/window/WindowBoundsHelper.java
deleted file mode 100644
index c71b772..0000000
--- a/window/window/src/main/java/androidx/window/WindowBoundsHelper.java
+++ /dev/null
@@ -1,398 +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.window;
-
-import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
-import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
-import static android.os.Build.VERSION_CODES.N;
-import static android.os.Build.VERSION_CODES.P;
-import static android.os.Build.VERSION_CODES.Q;
-import static android.os.Build.VERSION_CODES.R;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Build;
-import android.util.Log;
-import android.view.Display;
-import android.view.DisplayCutout;
-import android.view.View;
-import android.view.WindowInsets;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.VisibleForTesting;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * Helper class used to compute window bounds across Android versions. Obtain an instance with
- * {@link #getInstance()}.
- */
-class WindowBoundsHelper {
-    private static final String TAG = "WindowBoundsHelper";
-
-    private static WindowBoundsHelper sInstance = new WindowBoundsHelper();
-    @Nullable
-    private static WindowBoundsHelper sTestInstance;
-
-    static WindowBoundsHelper getInstance() {
-        if (sTestInstance != null) {
-            return sTestInstance;
-        }
-        return sInstance;
-    }
-
-    @VisibleForTesting
-    static void setForTesting(@Nullable WindowBoundsHelper helper) {
-        sTestInstance = helper;
-    }
-
-    WindowBoundsHelper() {}
-
-    /**
-     * Computes the size and position of the area the window would occupy with
-     * {@link android.view.WindowManager.LayoutParams#MATCH_PARENT MATCH_PARENT} width and height
-     * and any combination of flags that would allow the window to extend behind display cutouts.
-     * <p>
-     * For example, {@link android.view.WindowManager.LayoutParams#layoutInDisplayCutoutMode} set to
-     * {@link android.view.WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS} or the
-     * {@link android.view.WindowManager.LayoutParams#FLAG_LAYOUT_NO_LIMITS} flag set.
-     * <p>
-     * The value returned from this method may be different from platform API(s) used to determine
-     * the size and position of the visible area a given context occupies. For example:
-     * <ul>
-     *     <li>{@link Display#getSize(Point)} can be used to determine the size of the visible area
-     *     a window occupies, but may be subtracted to exclude certain system decorations that
-     *     always appear on screen, notably the navigation bar.
-     *     <li>The decor view's {@link View#getWidth()} and {@link View#getHeight()} can be used to
-     *     determine the size of the top level view in the view hierarchy, but this size is
-     *     determined through a combination of {@link android.view.WindowManager.LayoutParams}
-     *     flags and may not represent the true window size. For example, a window that does not
-     *     indicate it can be displayed behind a display cutout will have the size of the decor
-     *     view offset to exclude this region unless this region overlaps with the status bar, while
-     *     the value returned from this method will include this region.
-     * </ul>
-     * <p>
-     * The value returned from this method is guaranteed to be correct on platforms
-     * {@link Build.VERSION_CODES#Q Q} and above. For older platforms the value may be invalid if
-     * the activity is in multi-window mode or if the navigation bar offset can not be accounted
-     * for, though a best effort is made to ensure the returned value is as close as possible to
-     * the true value. See {@link #computeWindowBoundsP(Activity)} and
-     * {@link #computeWindowBoundsN(Activity)}.
-     * <p>
-     * Note: The value of this is based on the last windowing state reported to the client.
-     *
-     * @see android.view.WindowManager#getCurrentWindowMetrics()
-     * @see android.view.WindowMetrics#getBounds()
-     */
-    @NonNull
-    Rect computeCurrentWindowBounds(Activity activity) {
-        if (Build.VERSION.SDK_INT >= R) {
-            return activity.getWindowManager().getCurrentWindowMetrics().getBounds();
-        } else if (Build.VERSION.SDK_INT >= Q) {
-            return computeWindowBoundsQ(activity);
-        } else if (Build.VERSION.SDK_INT >= P) {
-            return computeWindowBoundsP(activity);
-        } else if (Build.VERSION.SDK_INT >= N) {
-            return computeWindowBoundsN(activity);
-        } else {
-            return computeWindowBoundsIceCreamSandwich(activity);
-        }
-    }
-
-    /**
-     * Computes the maximum size and position of the area the window can expect with
-     * {@link android.view.WindowManager.LayoutParams#MATCH_PARENT MATCH_PARENT} width and height
-     * and any combination of flags that would allow the window to extend behind display cutouts.
-     * <p>
-     * The value returned from this method will always match {@link Display#getRealSize(Point)} on
-     * {@link Build.VERSION_CODES#Q Android 10} and below.
-     *
-     * @see android.view.WindowManager#getMaximumWindowMetrics()
-     */
-    @NonNull
-    Rect computeMaximumWindowBounds(Activity activity) {
-        if (Build.VERSION.SDK_INT >= R) {
-            return activity.getWindowManager().getMaximumWindowMetrics().getBounds();
-        } else {
-            Display display = activity.getWindowManager().getDefaultDisplay();
-            Point displaySize = getRealSizeForDisplay(display);
-            return new Rect(0, 0, displaySize.x, displaySize.y);
-        }
-    }
-
-    /** Computes the window bounds for {@link Build.VERSION_CODES#Q}. */
-    @NonNull
-    @RequiresApi(Q)
-    private static Rect computeWindowBoundsQ(Activity activity) {
-        Rect bounds;
-        Configuration config = activity.getResources().getConfiguration();
-        try {
-            Field windowConfigField = Configuration.class.getDeclaredField("windowConfiguration");
-            windowConfigField.setAccessible(true);
-            Object windowConfig = windowConfigField.get(config);
-
-            Method getBoundsMethod = windowConfig.getClass().getDeclaredMethod("getBounds");
-            bounds = new Rect((Rect) getBoundsMethod.invoke(windowConfig));
-        } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException
-                | InvocationTargetException e) {
-            Log.w(TAG, e);
-            // If reflection fails for some reason default to the P implementation which still has
-            // the ability to account for display cutouts.
-            bounds = computeWindowBoundsP(activity);
-        }
-
-        return bounds;
-    }
-
-    /**
-     * Computes the window bounds for {@link Build.VERSION_CODES#P}.
-     * <p>
-     * NOTE: This method may result in incorrect values if the {@link Resources} value stored at
-     * 'navigation_bar_height' does not match the true navigation bar inset on the window.
-     * </ul>
-     */
-    @NonNull
-    @RequiresApi(P)
-    private static Rect computeWindowBoundsP(Activity activity) {
-        Rect bounds = new Rect();
-        Configuration config = activity.getResources().getConfiguration();
-        try {
-            Field windowConfigField = Configuration.class.getDeclaredField("windowConfiguration");
-            windowConfigField.setAccessible(true);
-            Object windowConfig = windowConfigField.get(config);
-
-            // In multi-window mode we'll use the WindowConfiguration#mBounds property which
-            // should match the window size. Otherwise we'll use the mAppBounds property and will
-            // adjust it below.
-            if (activity.isInMultiWindowMode()) {
-                Method getAppBounds = windowConfig.getClass().getDeclaredMethod("getBounds");
-                bounds.set((Rect) getAppBounds.invoke(windowConfig));
-            } else {
-                Method getAppBounds = windowConfig.getClass().getDeclaredMethod("getAppBounds");
-                bounds.set((Rect) getAppBounds.invoke(windowConfig));
-            }
-        } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException
-                | InvocationTargetException e) {
-            Log.w(TAG, e);
-            Display defaultDisplay = activity.getWindowManager().getDefaultDisplay();
-            defaultDisplay.getRectSize(bounds);
-        }
-
-        android.view.WindowManager platformWindowManager = activity.getWindowManager();
-        Display currentDisplay = platformWindowManager.getDefaultDisplay();
-        Point realDisplaySize = new Point();
-        currentDisplay.getRealSize(realDisplaySize);
-
-        if (!activity.isInMultiWindowMode()) {
-            // The activity is not in multi-window mode. Check if the addition of the navigation
-            // bar size to mAppBounds results in the real display size and if so assume the nav
-            // bar height should be added to the result.
-            int navigationBarHeight = getNavigationBarHeight(activity);
-
-            if (bounds.bottom + navigationBarHeight == realDisplaySize.y) {
-                bounds.bottom += navigationBarHeight;
-            } else if (bounds.right + navigationBarHeight == realDisplaySize.x) {
-                bounds.right += navigationBarHeight;
-            } else if (bounds.left == navigationBarHeight) {
-                bounds.left = 0;
-            }
-        }
-
-        if ((bounds.width() < realDisplaySize.x || bounds.height() < realDisplaySize.y)
-                && !activity.isInMultiWindowMode()) {
-            // If the corrected bounds are not the same as the display size and the activity is not
-            // in multi-window mode it is possible there are unreported cutouts inset-ing the
-            // window depending on the layoutInCutoutMode. Check for them here by getting the
-            // cutout from the display itself.
-            DisplayCutout displayCutout = getCutoutForDisplay(currentDisplay);
-            if (displayCutout != null) {
-                if (bounds.left == displayCutout.getSafeInsetLeft()) {
-                    bounds.left = 0;
-                }
-
-                if (realDisplaySize.x - bounds.right == displayCutout.getSafeInsetRight()) {
-                    bounds.right += displayCutout.getSafeInsetRight();
-                }
-
-                if (bounds.top == displayCutout.getSafeInsetTop()) {
-                    bounds.top = 0;
-                }
-
-                if (realDisplaySize.y - bounds.bottom == displayCutout.getSafeInsetBottom()) {
-                    bounds.bottom += displayCutout.getSafeInsetBottom();
-                }
-            }
-        }
-
-        return bounds;
-    }
-
-    /**
-     * Computes the window bounds for platforms between {@link Build.VERSION_CODES#N}
-     * and {@link Build.VERSION_CODES#O_MR1}, inclusive.
-     * <p>
-     * NOTE: This method may result in incorrect values under the following conditions:
-     * <ul>
-     *     <li>If the activity is in multi-window mode the origin of the returned bounds will
-     *     always be anchored at (0, 0).
-     *     <li>If the {@link Resources} value stored at 'navigation_bar_height' does not match the
-     *     true navigation bar size the returned bounds will not take into account the navigation
-     *     bar.
-     * </ul>
-     */
-    @NonNull
-    @RequiresApi(N)
-    private static Rect computeWindowBoundsN(Activity activity) {
-        Rect bounds = new Rect();
-
-        Display defaultDisplay = activity.getWindowManager().getDefaultDisplay();
-        defaultDisplay.getRectSize(bounds);
-
-        if (!activity.isInMultiWindowMode()) {
-            // The activity is not in multi-window mode. Check if the addition of the navigation
-            // bar size to Display#getSize() results in the real display size and if so return
-            // this value. If not, return the result of Display#getSize().
-            Point realDisplaySize = getRealSizeForDisplay(defaultDisplay);
-            int navigationBarHeight = getNavigationBarHeight(activity);
-
-            if (bounds.bottom + navigationBarHeight == realDisplaySize.y) {
-                bounds.bottom += navigationBarHeight;
-            } else if (bounds.right + navigationBarHeight == realDisplaySize.x) {
-                bounds.right += navigationBarHeight;
-            }
-        }
-
-        return bounds;
-    }
-
-    /**
-     * Computes the window bounds for platforms between {@link Build.VERSION_CODES#JELLY_BEAN}
-     * and {@link Build.VERSION_CODES#M}, inclusive.
-     * <p>
-     * Given that multi-window mode isn't supported before N we simply return the real display
-     * size which should match the window size of a full-screen app.
-     */
-    @NonNull
-    @RequiresApi(ICE_CREAM_SANDWICH)
-    private static Rect computeWindowBoundsIceCreamSandwich(Activity activity) {
-        Display defaultDisplay = activity.getWindowManager().getDefaultDisplay();
-        Point realDisplaySize = getRealSizeForDisplay(defaultDisplay);
-
-        Rect bounds = new Rect();
-        if (realDisplaySize.x == 0 || realDisplaySize.y == 0) {
-            defaultDisplay.getRectSize(bounds);
-        } else {
-            bounds.right = realDisplaySize.x;
-            bounds.bottom = realDisplaySize.y;
-        }
-        return bounds;
-    }
-
-    /**
-     * Returns the full (real) size of the display, in pixels, without subtracting any window
-     * decor or applying any compatibility scale factors.
-     * <p>
-     * The size is adjusted based on the current rotation of the display.
-     *
-     * @return a point representing the real display size in pixels.
-     *
-     * @see Display#getRealSize(Point)
-     */
-    @NonNull
-    @VisibleForTesting
-    @RequiresApi(ICE_CREAM_SANDWICH)
-    static Point getRealSizeForDisplay(Display display) {
-        Point size = new Point();
-        if (Build.VERSION.SDK_INT >= JELLY_BEAN_MR1) {
-            display.getRealSize(size);
-        } else {
-            try {
-                Method getRealSizeMethod = Display.class.getDeclaredMethod("getRealSize",
-                        Point.class);
-                getRealSizeMethod.setAccessible(true);
-                getRealSizeMethod.invoke(display, size);
-            } catch (NoSuchMethodException e) {
-                Log.w(TAG, e);
-            } catch (IllegalAccessException e) {
-                Log.w(TAG, e);
-            } catch (InvocationTargetException e) {
-                Log.w(TAG, e);
-            }
-        }
-        return size;
-    }
-
-    /**
-     * Returns the {@link Resources} value stored as 'navigation_bar_height'.
-     * <p>
-     * Note: This is error-prone and is <b>not</b> the recommended way to determine the size
-     * of the overlapping region between the navigation bar and a given window. The best approach
-     * is to acquire the {@link WindowInsets}.
-     */
-    private static int getNavigationBarHeight(Context context) {
-        Resources resources = context.getResources();
-        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
-        if (resourceId > 0) {
-            return resources.getDimensionPixelSize(resourceId);
-        }
-        return 0;
-    }
-
-    /**
-     * Returns the {@link DisplayCutout} for the given display. Note that display cutout returned
-     * here is for the display and the insets provided are in the display coordinate system.
-     *
-     * @return the display cutout for the given display.
-     */
-    @Nullable
-    @RequiresApi(P)
-    private static DisplayCutout getCutoutForDisplay(Display display) {
-        DisplayCutout displayCutout = null;
-        try {
-            Class<?> displayInfoClass = Class.forName("android.view.DisplayInfo");
-            Constructor<?> displayInfoConstructor = displayInfoClass.getConstructor();
-            displayInfoConstructor.setAccessible(true);
-            Object displayInfo = displayInfoConstructor.newInstance();
-
-            Method getDisplayInfoMethod = display.getClass().getDeclaredMethod(
-                    "getDisplayInfo", displayInfo.getClass());
-            getDisplayInfoMethod.setAccessible(true);
-            getDisplayInfoMethod.invoke(display, displayInfo);
-
-            Field displayCutoutField = displayInfo.getClass().getDeclaredField("displayCutout");
-            displayCutoutField.setAccessible(true);
-            Object cutout = displayCutoutField.get(displayInfo);
-            if (cutout instanceof DisplayCutout) {
-                displayCutout = (DisplayCutout) cutout;
-            }
-        } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException
-                | IllegalAccessException | InvocationTargetException
-                | InstantiationException e) {
-            Log.w(TAG, e);
-        }
-        return displayCutout;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/WindowBoundsHelper.kt b/window/window/src/main/java/androidx/window/WindowBoundsHelper.kt
new file mode 100644
index 0000000..6434d39
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowBoundsHelper.kt
@@ -0,0 +1,435 @@
+/*
+ * 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
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Context
+import android.content.res.Configuration
+import android.graphics.Point
+import android.graphics.Rect
+import android.os.Build
+import android.os.Build.VERSION_CODES
+import android.util.Log
+import android.view.Display
+import android.view.DisplayCutout
+import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
+import androidx.window.ActivityCompatHelperApi24.isInMultiWindowMode
+import androidx.window.ActivityCompatHelperApi30.currentWindowBounds
+import androidx.window.ActivityCompatHelperApi30.maximumWindowBounds
+import androidx.window.DisplayCompatHelperApi17.getRealSize
+import androidx.window.DisplayCompatHelperApi28.safeInsetBottom
+import androidx.window.DisplayCompatHelperApi28.safeInsetLeft
+import androidx.window.DisplayCompatHelperApi28.safeInsetRight
+import androidx.window.DisplayCompatHelperApi28.safeInsetTop
+import java.lang.reflect.InvocationTargetException
+
+/**
+ * Helper class used to compute window bounds across Android versions. Obtain an instance with
+ * [.getInstance].
+ */
+internal open class WindowBoundsHelper {
+    /**
+     * Computes the size and position of the area the window would occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * For example, [android.view.WindowManager.LayoutParams.layoutInDisplayCutoutMode] set to
+     * [android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS] or the
+     * [android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS] flag set.
+     *
+     *
+     * The value returned from this method may be different from platform API(s) used to determine
+     * the size and position of the visible area a given context occupies. For example:
+     *
+     *  * [Display.getSize] can be used to determine the size of the visible area
+     * a window occupies, but may be subtracted to exclude certain system decorations that
+     * always appear on screen, notably the navigation bar.
+     *  * The decor view's [android.view.View#getWidth] and [android.view.View@getHeight] can be
+     *  used to determine the size of the top level view in the view hierarchy, but this size is
+     * determined through a combination of [android.view.WindowManager.LayoutParams]
+     * flags and may not represent the true window size. For example, a window that does not
+     * indicate it can be displayed behind a display cutout will have the size of the decor
+     * view offset to exclude this region unless this region overlaps with the status bar, while
+     * the value returned from this method will include this region.
+     *
+     *
+     *
+     * The value returned from this method is guaranteed to be correct on platforms
+     * [Q][Build.VERSION_CODES.Q] and above. For older platforms the value may be invalid if
+     * the activity is in multi-window mode or if the navigation bar offset can not be accounted
+     * for, though a best effort is made to ensure the returned value is as close as possible to
+     * the true value. See [.computeWindowBoundsP] and
+     * [.computeWindowBoundsN].
+     *
+     *
+     * Note: The value of this is based on the last windowing state reported to the client.
+     *
+     * @see android.view.WindowManager.getCurrentWindowMetrics
+     * @see android.view.WindowMetrics.getBounds
+     */
+    open fun computeCurrentWindowBounds(activity: Activity): Rect {
+        return if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
+            currentWindowBounds(activity)
+        } else if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) {
+            computeWindowBoundsQ(activity)
+        } else if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
+            computeWindowBoundsP(activity)
+        } else if (Build.VERSION.SDK_INT >= VERSION_CODES.N) {
+            computeWindowBoundsN(activity)
+        } else {
+            computeWindowBoundsIceCreamSandwich(activity)
+        }
+    }
+
+    /**
+     * Computes the maximum size and position of the area the window can expect with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value returned from this method will always match [Display.getRealSize] on
+     * [Android 10][Build.VERSION_CODES.Q] and below.
+     *
+     * @see android.view.WindowManager.getMaximumWindowMetrics
+     */
+    open fun computeMaximumWindowBounds(activity: Activity): Rect {
+        return if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
+            maximumWindowBounds(activity)
+        } else {
+            // [WindowManager#getDefaultDisplay] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            val display = activity.windowManager.defaultDisplay
+            val displaySize = getRealSizeForDisplay(display)
+            Rect(0, 0, displaySize.x, displaySize.y)
+        }
+    }
+
+    companion object {
+        private const val TAG = "WindowBoundsHelper"
+        private val globalInstance = WindowBoundsHelper()
+        private var testInstance: WindowBoundsHelper? = null
+        @JvmStatic
+        val instance: WindowBoundsHelper
+            get() = testInstance ?: globalInstance
+
+        @VisibleForTesting
+        fun setForTesting(helper: WindowBoundsHelper?) {
+            testInstance = helper
+        }
+
+        /** Computes the window bounds for [Build.VERSION_CODES.Q].  */
+        @SuppressLint("BanUncheckedReflection")
+        @RequiresApi(VERSION_CODES.Q)
+        internal fun computeWindowBoundsQ(activity: Activity): Rect {
+            var bounds: Rect
+            val config = activity.resources.configuration
+            try {
+                val windowConfigField =
+                    Configuration::class.java.getDeclaredField("windowConfiguration")
+                windowConfigField.isAccessible = true
+                val windowConfig = windowConfigField[config]
+                val getBoundsMethod = windowConfig.javaClass.getDeclaredMethod("getBounds")
+                bounds = Rect(getBoundsMethod.invoke(windowConfig) as Rect)
+            } catch (e: NoSuchFieldException) {
+                Log.w(TAG, e)
+                // If reflection fails for some reason default to the P implementation which still
+                // has the ability to account for display cutouts.
+                bounds = computeWindowBoundsP(activity)
+            } catch (e: NoSuchMethodException) {
+                Log.w(TAG, e)
+                bounds = computeWindowBoundsP(activity)
+            } catch (e: IllegalAccessException) {
+                Log.w(TAG, e)
+                bounds = computeWindowBoundsP(activity)
+            } catch (e: InvocationTargetException) {
+                Log.w(TAG, e)
+                bounds = computeWindowBoundsP(activity)
+            }
+            return bounds
+        }
+
+        /**
+         * Computes the window bounds for [Build.VERSION_CODES.P].
+         *
+         *
+         * NOTE: This method may result in incorrect values if the [android.content.res.Resources]
+         * value stored at 'navigation_bar_height' does not match the true navigation bar inset on
+         * the window.
+         *
+         */
+        @SuppressLint("BanUncheckedReflection")
+        @RequiresApi(VERSION_CODES.P)
+        internal fun computeWindowBoundsP(activity: Activity): Rect {
+            val bounds = Rect()
+            val config = activity.resources.configuration
+            try {
+                val windowConfigField =
+                    Configuration::class.java.getDeclaredField("windowConfiguration")
+                windowConfigField.isAccessible = true
+                val windowConfig = windowConfigField[config]
+
+                // In multi-window mode we'll use the WindowConfiguration#mBounds property which
+                // should match the window size. Otherwise we'll use the mAppBounds property and
+                // will adjust it below.
+                if (isInMultiWindowMode(activity)) {
+                    val getAppBounds = windowConfig.javaClass.getDeclaredMethod("getBounds")
+                    bounds.set((getAppBounds.invoke(windowConfig) as Rect))
+                } else {
+                    val getAppBounds = windowConfig.javaClass.getDeclaredMethod("getAppBounds")
+                    bounds.set((getAppBounds.invoke(windowConfig) as Rect))
+                }
+            } catch (e: NoSuchFieldException) {
+                Log.w(TAG, e)
+                getRectSizeFromDisplay(activity, bounds)
+            } catch (e: NoSuchMethodException) {
+                Log.w(TAG, e)
+                getRectSizeFromDisplay(activity, bounds)
+            } catch (e: IllegalAccessException) {
+                Log.w(TAG, e)
+                getRectSizeFromDisplay(activity, bounds)
+            } catch (e: InvocationTargetException) {
+                Log.w(TAG, e)
+                getRectSizeFromDisplay(activity, bounds)
+            }
+            val platformWindowManager = activity.windowManager
+
+            // [WindowManager#getDefaultDisplay] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            val currentDisplay = platformWindowManager.defaultDisplay
+            val realDisplaySize = Point()
+            // [Display#getRealSize] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            getRealSize(display = currentDisplay, point = realDisplaySize)
+            if (!isInMultiWindowMode(activity)) {
+                // The activity is not in multi-window mode. Check if the addition of the
+                // navigation bar size to mAppBounds results in the real display size and if so
+                // assume the nav bar height should be added to the result.
+                val navigationBarHeight = getNavigationBarHeight(activity)
+                if (bounds.bottom + navigationBarHeight == realDisplaySize.y) {
+                    bounds.bottom += navigationBarHeight
+                } else if (bounds.right + navigationBarHeight == realDisplaySize.x) {
+                    bounds.right += navigationBarHeight
+                } else if (bounds.left == navigationBarHeight) {
+                    bounds.left = 0
+                }
+            }
+            if ((bounds.width() < realDisplaySize.x || bounds.height() < realDisplaySize.y) &&
+                !isInMultiWindowMode(activity)
+            ) {
+                // If the corrected bounds are not the same as the display size and the activity is
+                // not in multi-window mode it is possible there are unreported cutouts inset-ing
+                // the window depending on the layoutInCutoutMode. Check for them here by getting
+                // the cutout from the display itself.
+                val displayCutout = getCutoutForDisplay(currentDisplay)
+                if (displayCutout != null) {
+                    if (bounds.left == safeInsetLeft(displayCutout)) {
+                        bounds.left = 0
+                    }
+                    if (realDisplaySize.x - bounds.right == safeInsetRight(displayCutout)) {
+                        bounds.right += safeInsetRight(displayCutout)
+                    }
+                    if (bounds.top == safeInsetTop(displayCutout)) {
+                        bounds.top = 0
+                    }
+                    if (realDisplaySize.y - bounds.bottom == safeInsetBottom(displayCutout)) {
+                        bounds.bottom += safeInsetBottom(displayCutout)
+                    }
+                }
+            }
+            return bounds
+        }
+
+        private fun getRectSizeFromDisplay(activity: Activity, bounds: Rect) {
+            // [WindowManager#getDefaultDisplay] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            val defaultDisplay = activity.windowManager.defaultDisplay
+            // [Display#getRectSize] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            defaultDisplay.getRectSize(bounds)
+        }
+
+        /**
+         * Computes the window bounds for platforms between [Build.VERSION_CODES.N]
+         * and [Build.VERSION_CODES.O_MR1], inclusive.
+         *
+         *
+         * NOTE: This method may result in incorrect values under the following conditions:
+         *
+         *  * If the activity is in multi-window mode the origin of the returned bounds will
+         * always be anchored at (0, 0).
+         *  * If the [android.content.res.Resources] value stored at 'navigation_bar_height' does
+         *  not match the true navigation bar size the returned bounds will not take into account
+         *  the navigation
+         * bar.
+         *
+         */
+        @RequiresApi(VERSION_CODES.N)
+        internal fun computeWindowBoundsN(activity: Activity): Rect {
+            val bounds = Rect()
+            // [WindowManager#getDefaultDisplay] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            val defaultDisplay = activity.windowManager.defaultDisplay
+            // [Display#getRectSize] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            defaultDisplay.getRectSize(bounds)
+            if (!isInMultiWindowMode(activity)) {
+                // The activity is not in multi-window mode. Check if the addition of the
+                // navigation bar size to Display#getSize() results in the real display size and
+                // if so return this value. If not, return the result of Display#getSize().
+                val realDisplaySize = getRealSizeForDisplay(defaultDisplay)
+                val navigationBarHeight = getNavigationBarHeight(activity)
+                if (bounds.bottom + navigationBarHeight == realDisplaySize.y) {
+                    bounds.bottom += navigationBarHeight
+                } else if (bounds.right + navigationBarHeight == realDisplaySize.x) {
+                    bounds.right += navigationBarHeight
+                }
+            }
+            return bounds
+        }
+
+        /**
+         * Computes the window bounds for platforms between [Build.VERSION_CODES.JELLY_BEAN]
+         * and [Build.VERSION_CODES.M], inclusive.
+         *
+         *
+         * Given that multi-window mode isn't supported before N we simply return the real display
+         * size which should match the window size of a full-screen app.
+         */
+        @RequiresApi(VERSION_CODES.ICE_CREAM_SANDWICH)
+        internal fun computeWindowBoundsIceCreamSandwich(activity: Activity): Rect {
+            // [WindowManager#getDefaultDisplay] is deprecated but we have this for
+            // compatibility with older versions
+            @Suppress("DEPRECATION")
+            val defaultDisplay = activity.windowManager.defaultDisplay
+            val realDisplaySize = getRealSizeForDisplay(defaultDisplay)
+            val bounds = Rect()
+            if (realDisplaySize.x == 0 || realDisplaySize.y == 0) {
+                // [Display#getRectSize] is deprecated but we have this for
+                // compatibility with older versions
+                @Suppress("DEPRECATION")
+                defaultDisplay.getRectSize(bounds)
+            } else {
+                bounds.right = realDisplaySize.x
+                bounds.bottom = realDisplaySize.y
+            }
+            return bounds
+        }
+
+        /**
+         * Returns the full (real) size of the display, in pixels, without subtracting any window
+         * decor or applying any compatibility scale factors.
+         *
+         *
+         * The size is adjusted based on the current rotation of the display.
+         *
+         * @return a point representing the real display size in pixels.
+         *
+         * @see Display.getRealSize
+         */
+        @VisibleForTesting
+        @RequiresApi(VERSION_CODES.ICE_CREAM_SANDWICH)
+        fun getRealSizeForDisplay(display: Display): Point {
+            val size = Point()
+            if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
+                getRealSize(display, size)
+            } else {
+                try {
+                    val getRealSizeMethod = Display::class.java.getDeclaredMethod(
+                        "getRealSize",
+                        Point::class.java
+                    )
+                    getRealSizeMethod.isAccessible = true
+                    getRealSizeMethod.invoke(display, size)
+                } catch (e: NoSuchMethodException) {
+                    Log.w(TAG, e)
+                } catch (e: IllegalAccessException) {
+                    Log.w(TAG, e)
+                } catch (e: InvocationTargetException) {
+                    Log.w(TAG, e)
+                }
+            }
+            return size
+        }
+
+        /**
+         * Returns the [android.content.res.Resources] value stored as 'navigation_bar_height'.
+         *
+         *
+         * Note: This is error-prone and is **not** the recommended way to determine the size
+         * of the overlapping region between the navigation bar and a given window. The best
+         * approach is to acquire the [android.view.WindowInsets].
+         */
+        private fun getNavigationBarHeight(context: Context): Int {
+            val resources = context.resources
+            val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
+            return if (resourceId > 0) {
+                resources.getDimensionPixelSize(resourceId)
+            } else 0
+        }
+
+        /**
+         * Returns the [DisplayCutout] for the given display. Note that display cutout returned
+         * here is for the display and the insets provided are in the display coordinate system.
+         *
+         * @return the display cutout for the given display.
+         */
+        @SuppressLint("BanUncheckedReflection")
+        @RequiresApi(VERSION_CODES.P)
+        private fun getCutoutForDisplay(display: Display): DisplayCutout? {
+            var displayCutout: DisplayCutout? = null
+            try {
+                val displayInfoClass = Class.forName("android.view.DisplayInfo")
+                val displayInfoConstructor = displayInfoClass.getConstructor()
+                displayInfoConstructor.isAccessible = true
+                val displayInfo = displayInfoConstructor.newInstance()
+                val getDisplayInfoMethod = display.javaClass.getDeclaredMethod(
+                    "getDisplayInfo", displayInfo.javaClass
+                )
+                getDisplayInfoMethod.isAccessible = true
+                getDisplayInfoMethod.invoke(display, displayInfo)
+                val displayCutoutField = displayInfo.javaClass.getDeclaredField("displayCutout")
+                displayCutoutField.isAccessible = true
+                val cutout = displayCutoutField[displayInfo]
+                if (cutout is DisplayCutout) {
+                    displayCutout = cutout
+                }
+            } catch (e: ClassNotFoundException) {
+                Log.w(TAG, e)
+            } catch (e: NoSuchMethodException) {
+                Log.w(TAG, e)
+            } catch (e: NoSuchFieldException) {
+                Log.w(TAG, e)
+            } catch (e: IllegalAccessException) {
+                Log.w(TAG, e)
+            } catch (e: InvocationTargetException) {
+                Log.w(TAG, e)
+            } catch (e: InstantiationException) {
+                Log.w(TAG, e)
+            }
+            return displayCutout
+        }
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/WindowInfoRepo.kt b/window/window/src/main/java/androidx/window/WindowInfoRepo.kt
new file mode 100644
index 0000000..32ea8e3
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowInfoRepo.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.window
+
+import android.content.Context
+import kotlinx.coroutines.flow.Flow
+
+/**
+ * An interface to provide all the relevant info about a [android.view.Window].
+ */
+public interface WindowInfoRepo {
+
+    /**
+     * Returns the [WindowMetrics] according to the current system state.
+     *
+     *
+     * The metrics describe the size of the area the window would occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the **current** windowing state of the system. For
+     * example, for activities in multi-window mode, the metrics returned are based on the
+     * current bounds that the user has selected for the [Activity][android.app.Activity]'s
+     * window.
+     *
+     * @see maximumWindowMetrics
+     * @see android.view.WindowManager.getCurrentWindowMetrics
+     */
+    public fun currentWindowMetrics(): WindowMetrics
+
+    /**
+     * Returns the largest [WindowMetrics] an app may expect in the current system state.
+     *
+     *
+     * The metrics describe the size of the largest potential area the window might occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the largest **potential** windowing state of the system.
+     * For example, for activities in multi-window mode the metrics returned are based on what the
+     * bounds would be if the user expanded the window to cover the entire screen.
+     *
+     *
+     * Note that this might still be smaller than the size of the physical display if certain
+     * areas of the display are not available to windows created for the associated [Context].
+     * For example, devices with foldable displays that wrap around the enclosure may split the
+     * physical display into different regions, one for the front and one for the back, each acting
+     * as different logical displays. In this case [.getMaximumWindowMetrics] would return
+     * the region describing the side of the device the associated [context&#39;s][Context]
+     * window is placed.
+     *
+     * @see currentWindowMetrics
+     * @see android.view.WindowManager.getMaximumWindowMetrics
+     */
+    public fun maximumWindowMetrics(): WindowMetrics
+
+    /**
+     * A [Flow] of [WindowLayoutInfo] that contains all the available features.
+     */
+    public fun windowLayoutInfo(): Flow<WindowLayoutInfo>
+}
diff --git a/window/window/src/main/java/androidx/window/WindowInfoRepoImp.kt b/window/window/src/main/java/androidx/window/WindowInfoRepoImp.kt
new file mode 100644
index 0000000..817459f
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowInfoRepoImp.kt
@@ -0,0 +1,104 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.content.Context
+import androidx.core.util.Consumer
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.buffer
+import kotlinx.coroutines.flow.callbackFlow
+
+/**
+ * An implementation of [WindowInfoRepo] that provides the [WindowLayoutInfo] and
+ * [WindowMetrics] for the given [Activity].
+ *
+ * @param activity that the provided window is based on.
+ * @param windowBoundsHelper a helper to calculate the [WindowMetrics] for the [Activity].
+ * @param windowBackend a helper to provide the [WindowLayoutInfo].
+ */
+@ExperimentalCoroutinesApi
+internal class WindowInfoRepoImp(
+    private val activity: Activity,
+    private val windowBoundsHelper: WindowBoundsHelper,
+    private val windowBackend: WindowBackend
+) : WindowInfoRepo {
+
+    /**
+     * Returns the [WindowMetrics] according to the current system state.
+     *
+     *
+     * The metrics describe the size of the area the window would occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the **current** windowing state of the system. For
+     * example, for activities in multi-window mode, the metrics returned are based on the
+     * current bounds that the user has selected for the [Activity][android.app.Activity]'s
+     * window.
+     *
+     * @see maximumWindowMetrics
+     * @see android.view.WindowManager.getCurrentWindowMetrics
+     */
+    override fun currentWindowMetrics(): WindowMetrics {
+        return WindowMetrics(windowBoundsHelper.computeCurrentWindowBounds(activity))
+    }
+
+    /**
+     * Returns the largest [WindowMetrics] an app may expect in the current system state.
+     *
+     *
+     * The metrics describe the size of the largest potential area the window might occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the largest **potential** windowing state of the system.
+     * For example, for activities in multi-window mode the metrics returned are based on what the
+     * bounds would be if the user expanded the window to cover the entire screen.
+     *
+     *
+     * Note that this might still be smaller than the size of the physical display if certain
+     * areas of the display are not available to windows created for the associated [Context].
+     * For example, devices with foldable displays that wrap around the enclosure may split the
+     * physical display into different regions, one for the front and one for the back, each acting
+     * as different logical displays. In this case [.getMaximumWindowMetrics] would return
+     * the region describing the side of the device the associated [context&#39;s][Context]
+     * window is placed.
+     *
+     * @see currentWindowMetrics
+     * @see android.view.WindowManager.getMaximumWindowMetrics
+     */
+    override fun maximumWindowMetrics(): WindowMetrics {
+        return WindowMetrics(windowBoundsHelper.computeMaximumWindowBounds(activity))
+    }
+
+    /**
+     * A [Flow] of window layout changes in the current visual [Context].
+     *
+     * @see Activity.onAttachedToWindow
+     */
+    override fun windowLayoutInfo(): Flow<WindowLayoutInfo> = callbackFlow {
+        val callback = Consumer<WindowLayoutInfo> { info -> offer(info) }
+        windowBackend.registerLayoutChangeCallback(activity, Runnable::run, callback)
+        awaitClose { windowBackend.unregisterLayoutChangeCallback(callback) }
+    }.buffer(capacity = UNLIMITED)
+}
diff --git a/window/window/src/main/java/androidx/window/WindowLayoutInfo.java b/window/window/src/main/java/androidx/window/WindowLayoutInfo.java
deleted file mode 100644
index d19f91c..0000000
--- a/window/window/src/main/java/androidx/window/WindowLayoutInfo.java
+++ /dev/null
@@ -1,113 +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.window;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Consumer;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * Contains the list of {@link DisplayFeature}-s located within the window. For example, a hinge or
- * display fold can go across the window, in which case it might make sense to separate the
- * visual content and interactive elements into two groups, e.g. list-detail or view-controls.
- * <p>Only the features that are present within the current window bounds are reported. Their
- * positions and sizes can change if the window is moved or resized on screen.
- * @see WindowManager#registerLayoutChangeCallback(Executor, Consumer) for tracking changes in
- * display feature list and positions.
- */
-public final class WindowLayoutInfo {
-    private final List<DisplayFeature> mDisplayFeatures;
-
-    WindowLayoutInfo(@NonNull List<DisplayFeature> displayFeatures) {
-        mDisplayFeatures = Collections.unmodifiableList(displayFeatures);
-    }
-
-    /**
-     * Gets the list of physical display features within the window.
-     */
-    @NonNull
-    public List<DisplayFeature> getDisplayFeatures() {
-        return mDisplayFeatures;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("WindowLayoutInfo{ DisplayFeatures[");
-        for (int i = 0; i < mDisplayFeatures.size(); i++) {
-            DisplayFeature feature = mDisplayFeatures.get(i);
-            sb.append(feature);
-            if (i < mDisplayFeatures.size() - 1) {
-                sb.append(", ");
-            }
-        }
-        sb.append("] }");
-        return sb.toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        WindowLayoutInfo that = (WindowLayoutInfo) o;
-
-        return mDisplayFeatures.equals(that.mDisplayFeatures);
-    }
-
-    @Override
-    public int hashCode() {
-        return mDisplayFeatures.hashCode();
-    }
-
-    /**
-     * Builder for {@link WindowLayoutInfo} objects.
-     */
-    public static final class Builder {
-        private List<DisplayFeature> mDisplayFeatures = new ArrayList<>();
-
-        /**
-         * Creates an initially empty builder.
-         */
-        public Builder() {
-        }
-
-        /**
-         * Sets the display features for the {@link WindowLayoutInfo} instance.
-         */
-        @NonNull
-        public Builder setDisplayFeatures(@NonNull List<DisplayFeature> displayFeatures) {
-            mDisplayFeatures.clear();
-            mDisplayFeatures.addAll(displayFeatures);
-            return this;
-        }
-
-        /**
-         * Creates a {@link WindowLayoutInfo} instance with the specified fields.
-         * @return A WindowLayoutInfo instance.
-         */
-        @NonNull
-        public WindowLayoutInfo build() {
-            return new WindowLayoutInfo(mDisplayFeatures);
-        }
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/WindowLayoutInfo.kt b/window/window/src/main/java/androidx/window/WindowLayoutInfo.kt
new file mode 100644
index 0000000..2c44a3a
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowLayoutInfo.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.window
+
+/**
+ * Contains the list of [DisplayFeature]-s located within the window. For example, a hinge or
+ * display fold can go across the window, in which case it might make sense to separate the
+ * visual content and interactive elements into two groups, e.g. list-detail or view-controls.
+ *
+ * Only the features that are present within the current window bounds are reported. Their
+ * positions and sizes can change if the window is moved or resized on screen.
+ * @see WindowManager.registerLayoutChangeCallback
+ */
+public class WindowLayoutInfo internal constructor(
+    /**
+     * [displayFeatures] all the [DisplayFeature] within the window.
+     */
+    public val displayFeatures: List<DisplayFeature>
+) {
+
+    override fun toString(): String {
+        return displayFeatures.joinToString(
+            separator = ", ",
+            prefix = "WindowLayoutInfo{ DisplayFeatures[",
+            postfix = "] }"
+        )
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || javaClass != other.javaClass) return false
+        val that = other as WindowLayoutInfo
+        return displayFeatures == that.displayFeatures
+    }
+
+    override fun hashCode(): Int {
+        return displayFeatures.hashCode()
+    }
+
+    /**
+     * Builder for [WindowLayoutInfo] objects.
+     */
+    public class Builder {
+        private var displayFeatures: List<DisplayFeature> = emptyList()
+
+        /**
+         * Sets the display features for the [WindowLayoutInfo] instance.
+         */
+        public fun setDisplayFeatures(displayFeatures: List<DisplayFeature>): Builder {
+            this.displayFeatures = displayFeatures.toList()
+            return this
+        }
+
+        /**
+         * Creates a [WindowLayoutInfo] instance with the specified fields.
+         * @return A WindowLayoutInfo instance.
+         */
+        public fun build(): WindowLayoutInfo {
+            return WindowLayoutInfo(displayFeatures.toList())
+        }
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/WindowManager.java b/window/window/src/main/java/androidx/window/WindowManager.java
deleted file mode 100644
index 08cb2cb..0000000
--- a/window/window/src/main/java/androidx/window/WindowManager.java
+++ /dev/null
@@ -1,165 +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.window;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.util.Consumer;
-import androidx.window.extensions.ExtensionInterface;
-
-import java.util.concurrent.Executor;
-
-/**
- * Main interaction point with the WindowManager library. An instance of this class allows
- * polling the current state of the device and display, and registering callbacks for changes in
- * the corresponding states.
- */
-public final class WindowManager {
-    /**
-     * Activity that was registered with this instance of {@link WindowManager} at creation.
-     * This is used to find the token identifier of the window when requesting layout information
-     * from the {@link androidx.window.sidecar.SidecarInterface} or is passed directly to the
-     * {@link ExtensionInterface}.
-     */
-    private final Activity mActivity;
-    /**
-     * The backend that supplies the information through this class.
-     */
-    private final WindowBackend mWindowBackend;
-
-    /**
-     * Gets an instance of the class initialized with and connected to the provided {@link Context}.
-     * All methods of this class will return information that is associated with this visual
-     * context.
-     *
-     * @param context A visual context, such as an {@link Activity} or a {@link ContextWrapper}
-     *                around one, to use for initialization.
-     */
-    public WindowManager(@NonNull Context context) {
-        this(context, ExtensionWindowBackend.getInstance(context));
-    }
-
-    /**
-     * Gets an instance of the class initialized with and connected to the provided {@link Context}.
-     * All methods of this class will return information that is associated with this visual
-     * context.
-     *
-     * @param context       A visual context, such as an {@link Activity} or a
-     * {@link ContextWrapper}
-     *                      around one, to use for initialization.
-     * @param windowBackend Backing server class that will provide information for this instance.
-     *                      Pass a custom {@link WindowBackend} implementation for testing.
-     */
-    public WindowManager(@NonNull Context context, @NonNull WindowBackend windowBackend) {
-        Activity activity = getActivityFromContext(context);
-        if (activity == null) {
-            throw new IllegalArgumentException("Used non-visual Context to obtain an instance of "
-                    + "WindowManager. Please use an Activity or a ContextWrapper around one "
-                    + "instead.");
-        }
-        mActivity = activity;
-        mWindowBackend = windowBackend;
-    }
-
-    /**
-     * Registers a callback for layout changes of the window of the current visual {@link Context}.
-     * Must be called only after the it is attached to the window.
-     *
-     * @see Activity#onAttachedToWindow()
-     */
-    public void registerLayoutChangeCallback(@NonNull Executor executor,
-            @NonNull Consumer<WindowLayoutInfo> callback) {
-        mWindowBackend.registerLayoutChangeCallback(mActivity, executor, callback);
-    }
-
-    /**
-     * Unregisters a callback for window layout changes of the window.
-     */
-    public void unregisterLayoutChangeCallback(@NonNull Consumer<WindowLayoutInfo> callback) {
-        mWindowBackend.unregisterLayoutChangeCallback(callback);
-    }
-
-    /**
-     * Returns the {@link WindowMetrics} according to the current system state.
-     * <p>
-     * The metrics describe the size of the area the window would occupy with
-     * {@link android.view.WindowManager.LayoutParams#MATCH_PARENT MATCH_PARENT} width and height
-     * and any combination of flags that would allow the window to extend behind display cutouts.
-     * <p>
-     * The value of this is based on the <b>current</b> windowing state of the system. For
-     * example, for activities in multi-window mode, the metrics returned are based on the
-     * current bounds that the user has selected for the {@link android.app.Activity Activity}'s
-     * window.
-     *
-     * @see #getMaximumWindowMetrics()
-     * @see android.view.WindowManager#getCurrentWindowMetrics()
-     */
-    @NonNull
-    public WindowMetrics getCurrentWindowMetrics() {
-        Rect currentBounds = WindowBoundsHelper.getInstance().computeCurrentWindowBounds(mActivity);
-        return new WindowMetrics(currentBounds);
-    }
-
-    /**
-     * Returns the largest {@link WindowMetrics} an app may expect in the current system state.
-     * <p>
-     * The metrics describe the size of the largest potential area the window might occupy with
-     * {@link android.view.WindowManager.LayoutParams#MATCH_PARENT MATCH_PARENT} width and height
-     * and any combination of flags that would allow the window to extend behind display cutouts.
-     * <p>
-     * The value of this is based on the largest <b>potential</b> windowing state of the system.
-     * For example, for activities in multi-window mode the metrics returned are based on what the
-     * bounds would be if the user expanded the window to cover the entire screen.
-     * <p>
-     * Note that this might still be smaller than the size of the physical display if certain
-     * areas of the display are not available to windows created for the associated {@link Context}.
-     * For example, devices with foldable displays that wrap around the enclosure may split the
-     * physical display into different regions, one for the front and one for the back, each acting
-     * as different logical displays. In this case {@link #getMaximumWindowMetrics()} would return
-     * the region describing the side of the device the associated {@link Context context's}
-     * window is placed.
-     *
-     * @see #getCurrentWindowMetrics()
-     * @see android.view.WindowManager#getMaximumWindowMetrics()
-     */
-    @NonNull
-    public WindowMetrics getMaximumWindowMetrics() {
-        Rect maxBounds = WindowBoundsHelper.getInstance().computeMaximumWindowBounds(mActivity);
-        return new WindowMetrics(maxBounds);
-    }
-
-    /**
-     * Unwraps the hierarchy of {@link ContextWrapper}-s until {@link Activity} is reached.
-     *
-     * @return Base {@link Activity} context or {@code null} if not available.
-     */
-    @Nullable
-    private static Activity getActivityFromContext(Context context) {
-        while (context instanceof ContextWrapper) {
-            if (context instanceof Activity) {
-                return (Activity) context;
-            }
-            context = ((ContextWrapper) context).getBaseContext();
-        }
-        return null;
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/WindowManager.kt b/window/window/src/main/java/androidx/window/WindowManager.kt
new file mode 100644
index 0000000..3c29415
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowManager.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.window
+
+import android.app.Activity
+import android.content.Context
+import android.content.ContextWrapper
+import androidx.core.util.Consumer
+import java.util.concurrent.Executor
+
+/**
+ * Main interaction point with the WindowManager library. An instance of this class allows
+ * polling the current state of the device and display, and registering callbacks for changes in
+ * the corresponding states.
+ *
+ * All methods of this class will return information that is associated with this visual
+ * context.
+ *
+ */
+public class WindowManager @JvmOverloads constructor(
+    /**
+     * A visual [Context], such as an [Activity] or a [ContextWrapper]
+     */
+    context: Context,
+    /**
+     * Backing server class that will provide information for this instance.
+     *
+     * Pass a custom [WindowBackend] implementation for testing.
+     */
+    private val windowBackend: WindowBackend = ExtensionWindowBackend.getInstance(
+        context
+    )
+) {
+    /**
+     * Activity that was registered with this instance of [WindowManager] at creation.
+     * This is used to find the token identifier of the window when requesting layout information
+     * from the [androidx.window.sidecar.SidecarInterface] or is passed directly to the
+     * [androidx.window.extensions.ExtensionInterface].
+     */
+    private val activity: Activity = getActivityFromContext(context)
+        ?: throw IllegalArgumentException(
+            "Used non-visual Context to obtain an instance of WindowManager. Please use an " +
+                "Activity or a ContextWrapper around one instead."
+        )
+
+    /**
+     * Registers a callback for layout changes of the window of the current visual [Context].
+     * Must be called only after the it is attached to the window.
+     *
+     * @see Activity.onAttachedToWindow
+     */
+    public fun registerLayoutChangeCallback(
+        executor: Executor,
+        callback: Consumer<WindowLayoutInfo>
+    ) {
+        windowBackend.registerLayoutChangeCallback(activity, executor, callback)
+    }
+
+    /**
+     * Unregisters a callback for window layout changes of the window.
+     */
+    public fun unregisterLayoutChangeCallback(callback: Consumer<WindowLayoutInfo>) {
+        windowBackend.unregisterLayoutChangeCallback(callback)
+    }
+
+    /**
+     * Returns the [WindowMetrics] according to the current system state.
+     *
+     *
+     * The metrics describe the size of the area the window would occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the **current** windowing state of the system. For
+     * example, for activities in multi-window mode, the metrics returned are based on the
+     * current bounds that the user has selected for the [Activity][android.app.Activity]'s
+     * window.
+     *
+     * @see .getMaximumWindowMetrics
+     * @see android.view.WindowManager.getCurrentWindowMetrics
+     */
+    public fun getCurrentWindowMetrics(): WindowMetrics {
+        val currentBounds =
+            WindowBoundsHelper.instance.computeCurrentWindowBounds(activity)
+        return WindowMetrics(currentBounds)
+    }
+
+    /**
+     * Returns the largest [WindowMetrics] an app may expect in the current system state.
+     *
+     *
+     * The metrics describe the size of the largest potential area the window might occupy with
+     * [MATCH_PARENT][android.view.WindowManager.LayoutParams.MATCH_PARENT] width and height
+     * and any combination of flags that would allow the window to extend behind display cutouts.
+     *
+     *
+     * The value of this is based on the largest **potential** windowing state of the system.
+     * For example, for activities in multi-window mode the metrics returned are based on what the
+     * bounds would be if the user expanded the window to cover the entire screen.
+     *
+     *
+     * Note that this might still be smaller than the size of the physical display if certain
+     * areas of the display are not available to windows created for the associated [Context].
+     * For example, devices with foldable displays that wrap around the enclosure may split the
+     * physical display into different regions, one for the front and one for the back, each acting
+     * as different logical displays. In this case [.getMaximumWindowMetrics] would return
+     * the region describing the side of the device the associated [context&#39;s][Context]
+     * window is placed.
+     *
+     * @see .getCurrentWindowMetrics
+     * @see android.view.WindowManager.getMaximumWindowMetrics
+     */
+    public fun getMaximumWindowMetrics(): WindowMetrics {
+        val maxBounds = WindowBoundsHelper.instance.computeMaximumWindowBounds(activity)
+        return WindowMetrics(maxBounds)
+    }
+
+    internal companion object {
+        /**
+         * Unwraps the hierarchy of [ContextWrapper]-s until [Activity] is reached.
+         *
+         * @return Base [Activity] context or `null` if not available.
+         */
+        fun getActivityFromContext(initialContext: Context): Activity? {
+            var context: Context? = initialContext
+            while (context is ContextWrapper) {
+                if (context is Activity) {
+                    return context
+                }
+                context = context.baseContext
+            }
+            return null
+        }
+    }
+}
diff --git a/window/window/src/main/java/androidx/window/WindowMetrics.java b/window/window/src/main/java/androidx/window/WindowMetrics.java
deleted file mode 100644
index 9faa5f6..0000000
--- a/window/window/src/main/java/androidx/window/WindowMetrics.java
+++ /dev/null
@@ -1,75 +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.window;
-
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.view.Display;
-import android.view.WindowManager;
-
-import androidx.annotation.NonNull;
-
-/**
- * Metrics about a {@link android.view.Window}, consisting of its bounds.
- * <p>
- * This is usually obtained from {@link WindowManager#getCurrentWindowMetrics()} or
- * {@link WindowManager#getMaximumWindowMetrics()}.
- *
- * @see WindowManager#getCurrentWindowMetrics()
- * @see WindowManager#getMaximumWindowMetrics()
- */
-public final class WindowMetrics {
-    @NonNull
-    private final Rect mBounds;
-
-    /**
-     * Constructs a new {@link WindowMetrics} instance.
-     *
-     * @param bounds rect describing the bounds of the window, see {@link #getBounds}.
-     */
-    public WindowMetrics(@NonNull Rect bounds) {
-        mBounds = new Rect(bounds);
-    }
-
-    /**
-     * Returns a new {@link Rect} describing the bounds of the area the window occupies.
-     * <p>
-     * <b>Note that the size of the reported bounds can have different size than
-     * {@link Display#getSize(Point)}.</b> This method reports the window size including all system
-     * decorations, while {@link Display#getSize(Point)} reports the area excluding navigation bars
-     * and display cutout areas.
-     *
-     * @return window bounds in pixels.
-     */
-    @NonNull
-    public Rect getBounds() {
-        return new Rect(mBounds);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        WindowMetrics that = (WindowMetrics) o;
-        return mBounds.equals(that.mBounds);
-    }
-
-    @Override
-    public int hashCode() {
-        return mBounds.hashCode();
-    }
-}
diff --git a/window/window/src/main/java/androidx/window/WindowMetrics.kt b/window/window/src/main/java/androidx/window/WindowMetrics.kt
new file mode 100644
index 0000000..b026004
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowMetrics.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.window
+
+import android.graphics.Rect
+
+/**
+ * Metrics about a [android.view.Window], consisting of its bounds.
+ *
+ *
+ * This is usually obtained from [WindowManager#getCurrentWindowMetrics] or
+ * [WindowManager#getMaximumWindowMetrics].
+ *
+ * @see WindowManager#getCurrentWindowMetrics
+ * @see WindowManager#getMaximumWindowMetrics
+ */
+public class WindowMetrics internal constructor(private val _bounds: Bounds) {
+
+    public constructor(bounds: Rect) : this(Bounds(bounds))
+
+    /**
+     * Returns a new [Rect] describing the bounds of the area the window occupies.
+     *
+     *
+     * **Note that the size of the reported bounds can have different size than
+     * [Display#getSize].** This method reports the window size including all system
+     * decorations, while [Display#getSize] reports the area excluding navigation bars
+     * and display cutout areas.
+     *
+     * @return window bounds in pixels.
+     */
+    public val bounds: Rect
+        get() = _bounds.toRect()
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || javaClass != other.javaClass) return false
+        val that = other as WindowMetrics
+        return _bounds == that._bounds
+    }
+
+    override fun hashCode(): Int {
+        return _bounds.hashCode()
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/WindowServices.kt b/window/window/src/main/java/androidx/window/WindowServices.kt
new file mode 100644
index 0000000..fd3881d
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/WindowServices.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.
+ */
+@file:JvmName("WindowServices")
+
+package androidx.window
+
+import android.app.Activity
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+/**
+ * Provide an instance of [WindowInfoRepo] that is associated to the given [Activity]
+ */
+@ExperimentalCoroutinesApi
+public fun Activity.windowInfoRepository(): WindowInfoRepo {
+    return WindowInfoRepoImp(
+        this,
+        WindowBoundsHelper.instance,
+        ExtensionWindowBackend.getInstance(this)
+    )
+}
diff --git a/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.java b/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.java
deleted file mode 100644
index 75891a5..0000000
--- a/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.java
+++ /dev/null
@@ -1,198 +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.window;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.core.util.Consumer;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link ExtensionWindowBackend} that run on the JVM.
- */
-@SuppressWarnings("deprecation") // TODO(b/173739071) Remove DeviceState
-public class ExtensionWindowBackendUnitTest {
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = mock(Context.class);
-        ExtensionWindowBackend.resetInstance();
-    }
-
-    @Test
-    public void testGetInstance() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        assertNotNull(backend);
-
-        // Verify that getInstance always returns the same value
-        ExtensionWindowBackend newBackend = ExtensionWindowBackend.getInstance(mContext);
-        assertEquals(backend, newBackend);
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        Activity activity = mock(Activity.class);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-
-        assertEquals(1, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerAdded(activity);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(consumer);
-
-        assertTrue(backend.mWindowLayoutChangeCallbacks.isEmpty());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerRemoved(eq(activity));
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_noExtension() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = null;
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        Activity activity = mock(Activity.class);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-
-        verify(consumer).accept(any());
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_synchronousExtension() {
-        WindowLayoutInfo expectedInfo = newTestWindowLayoutInfo();
-        ExtensionInterfaceCompat extensionInterfaceCompat =
-                new SynchronousExtensionInterface(expectedInfo);
-        ExtensionWindowBackend backend = new ExtensionWindowBackend(extensionInterfaceCompat);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        Activity activity = mock(Activity.class);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-
-        // Check unregistering the layout change callback
-        verify(consumer).accept(expectedInfo);
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_callsExtensionOnce() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> consumer = mock(WindowLayoutInfoConsumer.class);
-        Activity activity = mock(Activity.class);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, consumer);
-        backend.registerLayoutChangeCallback(activity, Runnable::run,
-                mock(WindowLayoutInfoConsumer.class));
-
-        assertEquals(2, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerAdded(activity);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(consumer);
-
-        assertEquals(1, backend.mWindowLayoutChangeCallbacks.size());
-        verify(backend.mWindowExtension, times(0))
-                .onWindowLayoutChangeListenerRemoved(eq(activity));
-    }
-
-    @Test
-    public void testRegisterLayoutChangeCallback_clearListeners() {
-        ExtensionWindowBackend backend = ExtensionWindowBackend.getInstance(mContext);
-        backend.mWindowExtension = mock(ExtensionInterfaceCompat.class);
-
-        // Check registering the layout change callback
-        Consumer<WindowLayoutInfo> firstConsumer = mock(WindowLayoutInfoConsumer.class);
-        Consumer<WindowLayoutInfo> secondConsumer = mock(WindowLayoutInfoConsumer.class);
-        Activity activity = mock(Activity.class);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, firstConsumer);
-        backend.registerLayoutChangeCallback(activity, Runnable::run, secondConsumer);
-
-        // Check unregistering the layout change callback
-        backend.unregisterLayoutChangeCallback(firstConsumer);
-        backend.unregisterLayoutChangeCallback(secondConsumer);
-
-        assertTrue(backend.mWindowLayoutChangeCallbacks.isEmpty());
-        verify(backend.mWindowExtension).onWindowLayoutChangeListenerRemoved(activity);
-    }
-
-    private static WindowLayoutInfo newTestWindowLayoutInfo() {
-        WindowLayoutInfo.Builder builder = new WindowLayoutInfo.Builder();
-        return builder.build();
-    }
-
-    private interface WindowLayoutInfoConsumer extends Consumer<WindowLayoutInfo> { }
-
-    private static class SynchronousExtensionInterface implements ExtensionInterfaceCompat {
-
-        private ExtensionCallbackInterface mInterface;
-        private final WindowLayoutInfo mWindowLayoutInfo;
-
-        SynchronousExtensionInterface(WindowLayoutInfo windowLayoutInfo) {
-            mInterface = new ExtensionCallbackInterface() {
-
-                @Override
-                public void onWindowLayoutChanged(@NonNull Activity activity,
-                        @NonNull WindowLayoutInfo newLayout) {
-
-                }
-            };
-            mWindowLayoutInfo = windowLayoutInfo;
-        }
-
-        @Override
-        public boolean validateExtensionInterface() {
-            return true;
-        }
-
-        @Override
-        public void setExtensionCallback(
-                @NonNull ExtensionCallbackInterface extensionCallback) {
-            mInterface = extensionCallback;
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerAdded(@NonNull Activity activity) {
-            mInterface.onWindowLayoutChanged(activity, mWindowLayoutInfo);
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity) {
-
-        }
-
-    }
-}
diff --git a/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.kt b/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.kt
new file mode 100644
index 0000000..2648025
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/ExtensionWindowBackendUnitTest.kt
@@ -0,0 +1,189 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.content.Context
+import androidx.core.util.Consumer
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.times
+import com.nhaarman.mockitokotlin2.verify
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+
+/**
+ * Unit tests for [ExtensionWindowBackend] that run on the JVM.
+ */
+public class ExtensionWindowBackendUnitTest {
+    private lateinit var context: Context
+    @Before
+    public fun setUp() {
+        context = mock()
+        ExtensionWindowBackend.resetInstance()
+    }
+
+    @Test
+    public fun testGetInstance() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        assertNotNull(backend)
+
+        // Verify that getInstance always returns the same value
+        val newBackend = ExtensionWindowBackend.getInstance(context)
+        assertEquals(backend, newBackend)
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        backend.windowExtension = mock()
+
+        // Check registering the layout change callback
+        val consumer = mock<Consumer<WindowLayoutInfo>>()
+        val activity = mock<Activity>()
+        backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+        assertEquals(1, backend.windowLayoutChangeCallbacks.size.toLong())
+        verify(backend.windowExtension!!).onWindowLayoutChangeListenerAdded(activity)
+
+        // Check unregistering the layout change callback
+        backend.unregisterLayoutChangeCallback(consumer)
+        assertTrue(backend.windowLayoutChangeCallbacks.isEmpty())
+        verify(backend.windowExtension!!).onWindowLayoutChangeListenerRemoved(
+            eq(activity)
+        )
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_noExtension() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        backend.windowExtension = null
+
+        // Check registering the layout change callback
+        val consumer = mock<Consumer<WindowLayoutInfo>>()
+        val activity = mock<Activity>()
+        backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+        verify(consumer).accept(any())
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_synchronousExtension() {
+        val expectedInfo = newTestWindowLayoutInfo()
+        val extensionInterfaceCompat: ExtensionInterfaceCompat =
+            SynchronousExtensionInterface(expectedInfo)
+        val backend = ExtensionWindowBackend(extensionInterfaceCompat)
+
+        // Check registering the layout change callback
+        val consumer: Consumer<WindowLayoutInfo> = mock()
+        val activity = mock<Activity>()
+        backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+
+        // Check unregistering the layout change callback
+        verify(consumer).accept(expectedInfo)
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_callsExtensionOnce() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        backend.windowExtension = mock()
+
+        // Check registering the layout change callback
+        val consumer: Consumer<WindowLayoutInfo> = mock()
+        val activity = mock<Activity>()
+        backend.registerLayoutChangeCallback(activity, { obj: Runnable -> obj.run() }, consumer)
+        backend.registerLayoutChangeCallback(
+            activity, { obj: Runnable -> obj.run() },
+            mock()
+        )
+        assertEquals(2, backend.windowLayoutChangeCallbacks.size.toLong())
+        verify(backend.windowExtension!!).onWindowLayoutChangeListenerAdded(activity)
+
+        // Check unregistering the layout change callback
+        backend.unregisterLayoutChangeCallback(consumer)
+        assertEquals(1, backend.windowLayoutChangeCallbacks.size.toLong())
+        verify(backend.windowExtension!!, times(0))
+            .onWindowLayoutChangeListenerRemoved(eq(activity))
+    }
+
+    @Test
+    public fun testRegisterLayoutChangeCallback_clearListeners() {
+        val backend = ExtensionWindowBackend.getInstance(context)
+        backend.windowExtension = mock()
+
+        // Check registering the layout change callback
+        val firstConsumer = mock<Consumer<WindowLayoutInfo>>()
+        val secondConsumer = mock<Consumer<WindowLayoutInfo>>()
+        val activity = mock<Activity>()
+        backend.registerLayoutChangeCallback(
+            activity,
+            { obj: Runnable -> obj.run() },
+            firstConsumer
+        )
+        backend.registerLayoutChangeCallback(
+            activity,
+            { obj: Runnable -> obj.run() },
+            secondConsumer
+        )
+
+        // Check unregistering the layout change callback
+        backend.unregisterLayoutChangeCallback(firstConsumer)
+        backend.unregisterLayoutChangeCallback(secondConsumer)
+        assertTrue(backend.windowLayoutChangeCallbacks.isEmpty())
+        verify(backend.windowExtension!!).onWindowLayoutChangeListenerRemoved(activity)
+    }
+
+    private class SynchronousExtensionInterface(windowLayoutInfo: WindowLayoutInfo) :
+        ExtensionInterfaceCompat {
+        private var mInterface: ExtensionCallbackInterface
+        private val mWindowLayoutInfo: WindowLayoutInfo
+        override fun validateExtensionInterface(): Boolean {
+            return true
+        }
+
+        override fun setExtensionCallback(
+            extensionCallback: ExtensionCallbackInterface
+        ) {
+            mInterface = extensionCallback
+        }
+
+        override fun onWindowLayoutChangeListenerAdded(activity: Activity) {
+            mInterface.onWindowLayoutChanged(activity, mWindowLayoutInfo)
+        }
+
+        override fun onWindowLayoutChangeListenerRemoved(activity: Activity) {}
+
+        init {
+            mInterface = object : ExtensionCallbackInterface {
+                override fun onWindowLayoutChanged(
+                    activity: Activity,
+                    newLayout: WindowLayoutInfo
+                ) {}
+            }
+            mWindowLayoutInfo = windowLayoutInfo
+        }
+    }
+
+    private companion object {
+        private fun newTestWindowLayoutInfo(): WindowLayoutInfo {
+            val builder = WindowLayoutInfo.Builder()
+            return builder.build()
+        }
+    }
+}
diff --git a/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.java b/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.java
deleted file mode 100644
index e5db532..0000000
--- a/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.java
+++ /dev/null
@@ -1,360 +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.window;
-
-import static androidx.window.ActivityUtil.getActivityWindowToken;
-import static androidx.window.TestFoldingFeatureUtil.invalidFoldBounds;
-import static androidx.window.TestFoldingFeatureUtil.validFoldBound;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-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 static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.graphics.Rect;
-import android.os.IBinder;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-
-import androidx.annotation.NonNull;
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarInterface;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit tests for {@link SidecarCompat} that run on the JVM.
- */
-public final class SidecarCompatUnitTest {
-
-    private static final Rect WINDOW_BOUNDS = new Rect(1, 1, 50, 100);
-
-    private Activity mActivity;
-    private SidecarCompat mSidecarCompat;
-
-    @Before
-    public void setUp() {
-        TestWindowBoundsHelper mWindowBoundsHelper = new TestWindowBoundsHelper();
-        mWindowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS);
-        WindowBoundsHelper.setForTesting(mWindowBoundsHelper);
-
-        mActivity = mock(Activity.class);
-        Window window = spy(new TestWindow(mActivity));
-        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
-        doReturn(params).when(window).getAttributes();
-        when(mActivity.getWindow()).thenReturn(window);
-
-        SidecarInterface mockSidecarInterface = mock(SidecarInterface.class);
-        when(mockSidecarInterface.getDeviceState()).thenReturn(
-                newDeviceState(SidecarDeviceState.POSTURE_FLIPPED));
-        when(mockSidecarInterface.getWindowLayoutInfo(any())).thenReturn(
-                newWindowLayoutInfo(new ArrayList<>()));
-        mSidecarCompat = new SidecarCompat(mockSidecarInterface, new SidecarAdapter());
-    }
-
-    @After
-    public void tearDown() {
-        WindowBoundsHelper.setForTesting(null);
-    }
-
-    @Test
-    public void testGetWindowLayout_featureWithEmptyBounds() {
-        // Add a feature with an empty bounds to the reported list
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(getActivityWindowToken(mActivity));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                originalWindowLayoutInfo.displayFeatures;
-        SidecarDisplayFeature newFeature = new SidecarDisplayFeature();
-        newFeature.setRect(new Rect());
-        sidecarDisplayFeatures.add(newFeature);
-
-        // Verify that this feature is skipped.
-        WindowLayoutInfo windowLayoutInfo = mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 1,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_foldWithNonZeroArea() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                originalWindowLayoutInfo.displayFeatures;
-        // Horizontal fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width(), 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height()),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_hingeNotSpanningEntireWindow() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                originalWindowLayoutInfo.displayFeatures;
-        // Horizontal hinge.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical hinge.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testGetWindowLayout_foldNotSpanningEntireWindow() {
-        SidecarWindowLayoutInfo originalWindowLayoutInfo =
-                mSidecarCompat.mSidecar.getWindowLayoutInfo(mock(IBinder.class));
-        List<SidecarDisplayFeature> sidecarDisplayFeatures =
-                originalWindowLayoutInfo.displayFeatures;
-        // Horizontal fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
-                        SidecarDisplayFeature.TYPE_FOLD));
-        // Vertical fold.
-        sidecarDisplayFeatures.add(
-                newDisplayFeature(new Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
-                        SidecarDisplayFeature.TYPE_FOLD));
-
-        // Verify that these features are skipped.
-        WindowLayoutInfo windowLayoutInfo =
-                mSidecarCompat.getWindowLayoutInfo(mActivity);
-
-        assertEquals(sidecarDisplayFeatures.size() - 2,
-                windowLayoutInfo.getDisplayFeatures().size());
-    }
-
-    @Test
-    public void testOnWindowLayoutChangeListenerAdded() {
-        IBinder expectedToken = mock(IBinder.class);
-        mActivity.getWindow().getAttributes().token = expectedToken;
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        verify(mSidecarCompat.mSidecar).onWindowLayoutChangeListenerAdded(expectedToken);
-        verify(mSidecarCompat.mSidecar).onDeviceStateListenersChanged(false);
-    }
-
-    @Test
-    public void testOnWindowLayoutChangeListenerAdded_emitInitialValueDelayed() {
-        SidecarWindowLayoutInfo layoutInfo = new SidecarWindowLayoutInfo();
-        WindowLayoutInfo expectedLayoutInfo = new WindowLayoutInfo(new ArrayList<>());
-        ExtensionInterfaceCompat.ExtensionCallbackInterface listener =
-                mock(ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        mSidecarCompat.setExtensionCallback(listener);
-        when(mSidecarCompat.mSidecar.getWindowLayoutInfo(any())).thenReturn(layoutInfo);
-        View fakeView = mock(View.class);
-        Window mockWindow = mock(Window.class);
-        when(mockWindow.getAttributes()).thenReturn(new WindowManager.LayoutParams());
-        doAnswer(invocation -> {
-            View.OnAttachStateChangeListener stateChangeListener = invocation.getArgument(0);
-            mockWindow.getAttributes().token = mock(IBinder.class);
-            stateChangeListener.onViewAttachedToWindow(fakeView);
-            return null;
-        }).when(fakeView).addOnAttachStateChangeListener(any());
-        when(mockWindow.getDecorView()).thenReturn(fakeView);
-        when(mActivity.getWindow()).thenReturn(mockWindow);
-
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-
-        verify(listener).onWindowLayoutChanged(mActivity, expectedLayoutInfo);
-        verify(mSidecarCompat.mSidecar).onWindowLayoutChangeListenerAdded(
-                getActivityWindowToken(mActivity));
-        verify(fakeView).addOnAttachStateChangeListener(any());
-    }
-
-    @Test
-    public void testOnWindowLayoutChangeListenerRemoved() {
-        IBinder expectedToken = mock(IBinder.class);
-        mActivity.getWindow().getAttributes().token = expectedToken;
-        mSidecarCompat.onWindowLayoutChangeListenerAdded(mActivity);
-        mSidecarCompat.onWindowLayoutChangeListenerRemoved(mActivity);
-        verify(mSidecarCompat.mSidecar).onWindowLayoutChangeListenerRemoved(expectedToken);
-        verify(mSidecarCompat.mSidecar).onDeviceStateListenersChanged(true);
-    }
-
-    @Test
-    public void testExtensionCallback_deduplicateValues() {
-        ExtensionInterfaceCompat.ExtensionCallbackInterface callback = mock(
-                ExtensionInterfaceCompat.ExtensionCallbackInterface.class);
-        FakeExtensionImp fakeExtensionImp = new FakeExtensionImp();
-        SidecarCompat compat = new SidecarCompat(fakeExtensionImp, new SidecarAdapter());
-        compat.setExtensionCallback(callback);
-        mActivity.getWindow().getAttributes().token = mock(IBinder.class);
-
-        compat.onWindowLayoutChangeListenerAdded(mActivity);
-        fakeExtensionImp.triggerDeviceState(fakeExtensionImp.getDeviceState());
-        fakeExtensionImp.triggerDeviceState(fakeExtensionImp.getDeviceState());
-
-        verify(callback, times(1)).onWindowLayoutChanged(any(), any());
-    }
-
-    private static SidecarDisplayFeature newDisplayFeature(Rect rect, int type) {
-        SidecarDisplayFeature feature = new SidecarDisplayFeature();
-        feature.setRect(rect);
-        feature.setType(type);
-        return feature;
-    }
-
-    private static SidecarWindowLayoutInfo newWindowLayoutInfo(
-            List<SidecarDisplayFeature> features) {
-        SidecarWindowLayoutInfo info = new SidecarWindowLayoutInfo();
-        info.displayFeatures = new ArrayList<>();
-        info.displayFeatures.addAll(features);
-        return info;
-    }
-
-    private static SidecarDeviceState newDeviceState(int posture) {
-        SidecarDeviceState state = new SidecarDeviceState();
-        state.posture = posture;
-        return state;
-    }
-
-    private static final class FakeExtensionImp implements SidecarInterface {
-
-        private SidecarInterface.SidecarCallback mCallback;
-        private List<IBinder> mTokens = new ArrayList<>();
-
-        FakeExtensionImp() {
-            mCallback = new SidecarInterface.SidecarCallback() {
-                @Override
-                public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
-
-                }
-
-                @Override
-                public void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                        @NonNull SidecarWindowLayoutInfo newLayout) {
-
-                }
-            };
-        }
-
-        @Override
-        public void setSidecarCallback(@NonNull SidecarCallback callback) {
-            mCallback = callback;
-        }
-
-        @NonNull
-        @Override
-        public SidecarWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
-            return null;
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
-
-        }
-
-        @Override
-        public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
-
-        }
-
-        @NonNull
-        @Override
-        public SidecarDeviceState getDeviceState() {
-            SidecarDeviceState state = new SidecarDeviceState();
-            return state;
-        }
-
-        @Override
-        public void onDeviceStateListenersChanged(boolean isEmpty) {
-
-        }
-
-        void triggerMalformedSignal() {
-            triggerSignal(malformedWindowLayoutInfo());
-        }
-
-        void triggerGoodSignal() {
-            triggerSignal(validWindowLayoutInfo());
-        }
-
-        void triggerSignal(SidecarWindowLayoutInfo info) {
-            for (IBinder token: mTokens) {
-                triggerSignal(token, info);
-            }
-        }
-
-        void triggerSignal(IBinder token, SidecarWindowLayoutInfo info) {
-            mCallback.onWindowLayoutChanged(token, info);
-        }
-
-        public void triggerDeviceState(SidecarDeviceState state) {
-            mCallback.onDeviceStateChanged(state);
-
-        }
-
-        private SidecarWindowLayoutInfo malformedWindowLayoutInfo() {
-            List<SidecarDisplayFeature> malformedFeatures = new ArrayList<>();
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(newDisplayFeature(malformedBound,
-                        SidecarDisplayFeature.TYPE_FOLD));
-            }
-
-            for (Rect malformedBound : invalidFoldBounds(WINDOW_BOUNDS)) {
-                malformedFeatures.add(newDisplayFeature(malformedBound,
-                        SidecarDisplayFeature.TYPE_HINGE));
-            }
-
-            return newWindowLayoutInfo(malformedFeatures);
-        }
-
-        private SidecarWindowLayoutInfo validWindowLayoutInfo() {
-            List<SidecarDisplayFeature> goodFeatures = new ArrayList<>();
-
-            goodFeatures.add(newDisplayFeature(validFoldBound(WINDOW_BOUNDS),
-                    SidecarDisplayFeature.TYPE_FOLD));
-
-            return newWindowLayoutInfo(goodFeatures);
-        }
-    }
-}
diff --git a/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.kt b/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.kt
new file mode 100644
index 0000000..8378ae1
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/SidecarCompatUnitTest.kt
@@ -0,0 +1,346 @@
+/*
+ * 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.
+ */
+// Sidecar is deprecated but consuming code must be maintained for compatibility reasons
+@file:Suppress("DEPRECATION")
+
+package androidx.window
+
+import android.app.Activity
+import android.graphics.Rect
+import android.os.IBinder
+import android.view.View
+import android.view.Window
+import android.view.WindowManager
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import androidx.window.TestFoldingFeatureUtil.invalidFoldBounds
+import androidx.window.TestFoldingFeatureUtil.validFoldBound
+import androidx.window.sidecar.SidecarDeviceState
+import androidx.window.sidecar.SidecarDisplayFeature
+import androidx.window.sidecar.SidecarInterface
+import androidx.window.sidecar.SidecarInterface.SidecarCallback
+import androidx.window.sidecar.SidecarWindowLayoutInfo
+import com.nhaarman.mockitokotlin2.any
+import com.nhaarman.mockitokotlin2.doAnswer
+import com.nhaarman.mockitokotlin2.doReturn
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.spy
+import com.nhaarman.mockitokotlin2.times
+import com.nhaarman.mockitokotlin2.verify
+import com.nhaarman.mockitokotlin2.whenever
+import org.junit.After
+import org.junit.Assert.assertEquals
+import org.junit.Before
+import org.junit.Test
+
+/**
+ * Unit tests for [SidecarCompat] that run on the JVM.
+ */
+public class SidecarCompatUnitTest {
+
+    private lateinit var activity: Activity
+    private lateinit var sidecarCompat: SidecarCompat
+
+    @Before
+    public fun setUp() {
+        val windowBoundsHelper = TestWindowBoundsHelper()
+        windowBoundsHelper.setCurrentBounds(WINDOW_BOUNDS)
+        WindowBoundsHelper.setForTesting(windowBoundsHelper)
+        activity = mock()
+        val window: Window = spy(TestWindow(activity))
+        val params = WindowManager.LayoutParams()
+        params.token = mock()
+        doReturn(params).whenever(window).attributes
+        whenever(activity.getWindow()).thenReturn(window)
+        val mockSidecarInterface = mock<SidecarInterface>()
+        whenever(mockSidecarInterface.deviceState).thenReturn(
+            newDeviceState(SidecarDeviceState.POSTURE_FLIPPED)
+        )
+        whenever(mockSidecarInterface.getWindowLayoutInfo(any())).thenReturn(
+            newWindowLayoutInfo(emptyList())
+        )
+        sidecarCompat = SidecarCompat(mockSidecarInterface, SidecarAdapter())
+    }
+
+    @After
+    public fun tearDown() {
+        WindowBoundsHelper.setForTesting(null)
+    }
+
+    @Test
+    public fun testGetWindowLayout_featureWithEmptyBounds() {
+        // Add a feature with an empty bounds to the reported list
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(
+            getActivityWindowToken(activity)!!
+        )
+        val sidecarDisplayFeatures = originalWindowLayoutInfo.displayFeatures ?: emptyList()
+        val newFeature = SidecarDisplayFeature()
+        newFeature.rect = Rect()
+        val replacementFeatures = sidecarDisplayFeatures + newFeature
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that this feature is skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_foldWithNonZeroArea() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(
+            mock()
+        )
+        val sidecarDisplayFeatures = originalWindowLayoutInfo.displayFeatures ?: emptyList()
+        val additionalFeatures = listOf(
+            // Horizontal fold.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width(), 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical fold.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height()),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_hingeNotSpanningEntireWindow() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(
+            mock()
+        )
+        val sidecarDisplayFeatures = originalWindowLayoutInfo.displayFeatures ?: emptyList()
+        val additionalFeatures = listOf(
+            // Horizontal hinge.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical hinge.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testGetWindowLayout_foldNotSpanningEntireWindow() {
+        val originalWindowLayoutInfo = sidecarCompat.sidecar!!.getWindowLayoutInfo(
+            mock()
+        )
+        val sidecarDisplayFeatures = originalWindowLayoutInfo.displayFeatures ?: emptyList()
+        val additionalFeatures = listOf(
+            // Horizontal fold.
+            newDisplayFeature(
+                Rect(0, 1, WINDOW_BOUNDS.width() - 1, 2),
+                SidecarDisplayFeature.TYPE_FOLD
+            ),
+            // Vertical fold.
+            newDisplayFeature(
+                Rect(1, 0, 2, WINDOW_BOUNDS.height() - 1),
+                SidecarDisplayFeature.TYPE_FOLD
+            )
+        )
+        val replacementFeatures = sidecarDisplayFeatures + additionalFeatures
+        SidecarAdapter.setSidecarDisplayFeatures(originalWindowLayoutInfo, replacementFeatures)
+
+        // Verify that these features are skipped.
+        val windowLayoutInfo = sidecarCompat.getWindowLayoutInfo(activity)
+        assertEquals(
+            (sidecarDisplayFeatures.size).toLong(),
+            windowLayoutInfo.displayFeatures.size.toLong()
+        )
+    }
+
+    @Test
+    public fun testOnWindowLayoutChangeListenerAdded() {
+        val expectedToken = mock<IBinder>()
+        activity.window.attributes.token = expectedToken
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(sidecarCompat.sidecar!!).onWindowLayoutChangeListenerAdded(expectedToken)
+        verify(sidecarCompat.sidecar!!).onDeviceStateListenersChanged(false)
+    }
+
+    @Test
+    public fun testOnWindowLayoutChangeListenerAdded_emitInitialValueDelayed() {
+        val layoutInfo = SidecarWindowLayoutInfo()
+        val expectedLayoutInfo = WindowLayoutInfo(emptyList())
+        val listener = mock<ExtensionCallbackInterface>()
+        sidecarCompat.setExtensionCallback(listener)
+        whenever(sidecarCompat.sidecar!!.getWindowLayoutInfo(any()))
+            .thenReturn(layoutInfo)
+        val fakeView = mock<View>()
+        val mockWindow = mock<Window>()
+        whenever(mockWindow.attributes).thenReturn(WindowManager.LayoutParams())
+        doAnswer { invocation ->
+            val stateChangeListener = invocation.getArgument<View.OnAttachStateChangeListener>(0)
+            mockWindow.attributes.token = mock()
+            stateChangeListener.onViewAttachedToWindow(fakeView)
+            null
+        }.whenever(fakeView).addOnAttachStateChangeListener(any())
+        whenever(mockWindow.decorView).thenReturn(fakeView)
+        whenever(activity.window).thenReturn(mockWindow)
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        verify(listener).onWindowLayoutChanged(
+            activity, expectedLayoutInfo
+        )
+        verify(sidecarCompat.sidecar!!).onWindowLayoutChangeListenerAdded(
+            getActivityWindowToken(activity)!!
+        )
+        verify(fakeView).addOnAttachStateChangeListener(any())
+    }
+
+    @Test
+    public fun testOnWindowLayoutChangeListenerRemoved() {
+        val expectedToken = mock<IBinder>()
+        activity.window.attributes.token = expectedToken
+        sidecarCompat.onWindowLayoutChangeListenerAdded(activity)
+        sidecarCompat.onWindowLayoutChangeListenerRemoved(activity)
+        verify(sidecarCompat.sidecar!!).onWindowLayoutChangeListenerRemoved(expectedToken)
+        verify(sidecarCompat.sidecar!!).onDeviceStateListenersChanged(true)
+    }
+
+    @Test
+    public fun testExtensionCallback_deduplicateValues() {
+        val callback = mock<ExtensionCallbackInterface>()
+        val fakeExtensionImp = FakeExtensionImp()
+        val compat = SidecarCompat(fakeExtensionImp, SidecarAdapter())
+        compat.setExtensionCallback(callback)
+        activity.window.attributes.token = mock()
+        compat.onWindowLayoutChangeListenerAdded(activity)
+        fakeExtensionImp.triggerDeviceState(fakeExtensionImp.deviceState)
+        fakeExtensionImp.triggerDeviceState(fakeExtensionImp.deviceState)
+        verify(callback, times(1))
+            .onWindowLayoutChanged(any(), any())
+    }
+
+    private class FakeExtensionImp() : SidecarInterface {
+        private var callback: SidecarCallback? = null
+        private val tokens = mutableListOf<IBinder>()
+        override fun setSidecarCallback(callback: SidecarCallback) {
+            this.callback = callback
+        }
+
+        override fun getWindowLayoutInfo(windowToken: IBinder): SidecarWindowLayoutInfo {
+            return SidecarWindowLayoutInfo()
+        }
+
+        override fun onWindowLayoutChangeListenerAdded(windowToken: IBinder) {}
+        override fun onWindowLayoutChangeListenerRemoved(windowToken: IBinder) {}
+        override fun getDeviceState(): SidecarDeviceState {
+            return SidecarDeviceState()
+        }
+
+        override fun onDeviceStateListenersChanged(isEmpty: Boolean) {}
+        fun triggerMalformedSignal() {
+            triggerSignal(malformedWindowLayoutInfo())
+        }
+
+        fun triggerGoodSignal() {
+            triggerSignal(validWindowLayoutInfo())
+        }
+
+        fun triggerSignal(info: SidecarWindowLayoutInfo?) {
+            for (token in tokens) {
+                triggerSignal(token, info)
+            }
+        }
+
+        fun triggerSignal(token: IBinder?, info: SidecarWindowLayoutInfo?) {
+            callback?.onWindowLayoutChanged(token!!, info!!)
+        }
+
+        fun triggerDeviceState(state: SidecarDeviceState?) {
+            callback?.onDeviceStateChanged(state!!)
+        }
+
+        private fun malformedWindowLayoutInfo(): SidecarWindowLayoutInfo {
+            val malformedFeatures = mutableListOf<SidecarDisplayFeature>()
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    newDisplayFeature(
+                        malformedBound,
+                        SidecarDisplayFeature.TYPE_FOLD
+                    )
+                )
+            }
+            for (malformedBound in invalidFoldBounds(WINDOW_BOUNDS)) {
+                malformedFeatures.add(
+                    newDisplayFeature(
+                        malformedBound,
+                        SidecarDisplayFeature.TYPE_HINGE
+                    )
+                )
+            }
+            return newWindowLayoutInfo(malformedFeatures)
+        }
+
+        private fun validWindowLayoutInfo(): SidecarWindowLayoutInfo {
+            val goodFeatures = listOf(
+                newDisplayFeature(
+                    validFoldBound(WINDOW_BOUNDS),
+                    SidecarDisplayFeature.TYPE_FOLD
+                )
+            )
+            return newWindowLayoutInfo(goodFeatures)
+        }
+    }
+
+    private companion object {
+        private val WINDOW_BOUNDS = Rect(1, 1, 50, 100)
+        private fun newDisplayFeature(rect: Rect, type: Int): SidecarDisplayFeature {
+            val feature = SidecarDisplayFeature()
+            feature.rect = rect
+            feature.type = type
+            return feature
+        }
+
+        private fun newWindowLayoutInfo(
+            features: List<SidecarDisplayFeature>
+        ): SidecarWindowLayoutInfo {
+            val info = SidecarWindowLayoutInfo()
+            info.displayFeatures = features
+            return info
+        }
+
+        private fun newDeviceState(posture: Int): SidecarDeviceState {
+            val state = SidecarDeviceState()
+            state.posture = posture
+            return state
+        }
+    }
+}
diff --git a/window/window/src/test/java/androidx/window/TestWindowBoundsHelper.java b/window/window/src/test/java/androidx/window/TestWindowBoundsHelper.java
deleted file mode 100644
index 15a069e..0000000
--- a/window/window/src/test/java/androidx/window/TestWindowBoundsHelper.java
+++ /dev/null
@@ -1,100 +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.window;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.HashMap;
-
-/**
- * Subclass of {@link WindowBoundsHelper} used to override the results for testing.
- *
- * @see WindowBoundsHelper
- * @see WindowBoundsHelper#setForTesting(WindowBoundsHelper)
- */
-class TestWindowBoundsHelper extends WindowBoundsHelper {
-    private Rect mGlobalOverriddenBounds;
-    private final HashMap<Activity, Rect> mOverriddenBounds = new HashMap<>();
-    private final HashMap<Activity, Rect> mOverriddenMaximumBounds = new HashMap<>();
-
-    /**
-     * Overrides the bounds returned from this helper for the given context. Passing null {@code
-     * bounds} has the effect of clearing the bounds override.
-     * <p>
-     * Note: A global override set as a result of {@link #setCurrentBounds(Rect)} takes precedence
-     * over the value set with this method.
-     */
-    void setCurrentBoundsForActivity(@NonNull Activity activity, @Nullable Rect bounds) {
-        mOverriddenBounds.put(activity, bounds);
-    }
-
-    /**
-     * Overrides the max bounds returned from this helper for the given context. Passing {@code
-     * null} {@code bounds} has the effect of clearing the bounds override.
-     */
-    void setMaximumBoundsForActivity(@NonNull Activity activity, @Nullable Rect bounds) {
-        mOverriddenMaximumBounds.put(activity, bounds);
-    }
-
-    /**
-     * Overrides the bounds returned from this helper for all supplied contexts. Passing null
-     * {@code bounds} has the effect of clearing the global override.
-     */
-    void setCurrentBounds(@Nullable Rect bounds) {
-        mGlobalOverriddenBounds = bounds;
-    }
-
-    @Override
-    @NonNull
-    Rect computeCurrentWindowBounds(Activity activity) {
-        if (mGlobalOverriddenBounds != null) {
-            return mGlobalOverriddenBounds;
-        }
-
-        Rect bounds = mOverriddenBounds.get(activity);
-        if (bounds != null) {
-            return bounds;
-        }
-
-        return super.computeCurrentWindowBounds(activity);
-    }
-
-    @NonNull
-    @Override
-    Rect computeMaximumWindowBounds(Activity activity) {
-        Rect bounds = mOverriddenMaximumBounds.get(activity);
-        if (bounds != null) {
-            return bounds;
-        }
-
-        return super.computeMaximumWindowBounds(activity);
-    }
-
-    /**
-     * Clears any overrides set with {@link #setCurrentBounds(Rect)} or
-     * {@link #setCurrentBoundsForActivity(Activity, Rect)}.
-     */
-    void reset() {
-        mGlobalOverriddenBounds = null;
-        mOverriddenBounds.clear();
-        mOverriddenMaximumBounds.clear();
-    }
-}
diff --git a/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.java b/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.java
deleted file mode 100644
index 5a72bc4..0000000
--- a/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.java
+++ /dev/null
@@ -1,35 +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.window;
-
-import static androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface;
-
-import android.app.Activity;
-
-import androidx.annotation.NonNull;
-
-/**
- * An empty implementation of {@link ExtensionCallbackInterface} with no-op methods.
- */
-public class EmptyExtensionCallbackInterface implements ExtensionCallbackInterface {
-
-    @Override
-    public void onWindowLayoutChanged(@NonNull Activity activity,
-            @NonNull WindowLayoutInfo newLayout) {
-
-    }
-}
diff --git a/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.kt b/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.kt
new file mode 100644
index 0000000..3f5f907
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/EmptyExtensionCallbackInterface.kt
@@ -0,0 +1,26 @@
+/*
+ * 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
+
+import android.app.Activity
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+
+/**
+ * An empty implementation of [ExtensionCallbackInterface] with no-op methods.
+ */
+internal class EmptyExtensionCallbackInterface : ExtensionCallbackInterface {
+    override fun onWindowLayoutChanged(activity: Activity, newLayout: WindowLayoutInfo) {}
+}
diff --git a/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.java b/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.java
deleted file mode 100644
index 2bca753..0000000
--- a/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.java
+++ /dev/null
@@ -1,85 +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.window;
-
-import static androidx.window.FoldingFeature.STATE_FLAT;
-import static androidx.window.FoldingFeature.STATE_HALF_OPENED;
-import static androidx.window.FoldingFeature.TYPE_HINGE;
-
-import android.app.Activity;
-import android.graphics.Rect;
-
-import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-
-import java.util.Collections;
-
-/**
- * An implementation of {@link ExtensionInterfaceCompat} that switches the state when a consumer
- * is unregistered. Useful for testing consumers when they go through a cycle of register then
- * unregister then register again.
- */
-public final class SwitchOnUnregisterExtensionInterfaceCompat implements ExtensionInterfaceCompat {
-
-    private final Object mLock = new Object();
-    private final Rect mFoldBounds = new Rect(0, 100, 200, 100);
-    @GuardedBy("mLock")
-    private ExtensionCallbackInterface mCallback = new EmptyExtensionCallbackInterface();
-    @GuardedBy("mLock")
-    private int mState = STATE_FLAT;
-
-    @Override
-    public boolean validateExtensionInterface() {
-        return true;
-    }
-
-    @Override
-    public void setExtensionCallback(@NonNull ExtensionCallbackInterface extensionCallback) {
-        synchronized (mLock) {
-            mCallback = extensionCallback;
-        }
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerAdded(@NonNull Activity activity) {
-        synchronized (mLock) {
-            mCallback.onWindowLayoutChanged(activity, currentWindowLayoutInfo());
-        }
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerRemoved(@NonNull Activity activity) {
-        synchronized (mLock) {
-            mState = toggleState(mState);
-        }
-    }
-
-    WindowLayoutInfo currentWindowLayoutInfo() {
-        return new WindowLayoutInfo(Collections.singletonList(currentFoldingFeature()));
-    }
-
-    FoldingFeature currentFoldingFeature() {
-        return new FoldingFeature(mFoldBounds, TYPE_HINGE, mState);
-    }
-
-    private static int toggleState(int currentState) {
-        if (currentState == STATE_FLAT) {
-            return STATE_HALF_OPENED;
-        }
-        return STATE_FLAT;
-    }
-}
diff --git a/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.kt b/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.kt
new file mode 100644
index 0000000..899378d
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/SwitchOnUnregisterExtensionInterfaceCompat.kt
@@ -0,0 +1,72 @@
+/*
+ * 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
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.annotation.GuardedBy
+import androidx.window.ExtensionInterfaceCompat.ExtensionCallbackInterface
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * An implementation of [ExtensionInterfaceCompat] that switches the state when a consumer
+ * is unregistered. Useful for testing consumers when they go through a cycle of register then
+ * unregister then register again.
+ */
+internal class SwitchOnUnregisterExtensionInterfaceCompat : ExtensionInterfaceCompat {
+    private val lock: Lock = ReentrantLock()
+    private val foldBounds = Rect(0, 100, 200, 100)
+    @GuardedBy("mLock")
+    private var callback: ExtensionCallbackInterface = EmptyExtensionCallbackInterface()
+    @GuardedBy("mLock")
+    private var state = FoldingFeature.STATE_FLAT
+
+    override fun validateExtensionInterface(): Boolean {
+        return true
+    }
+
+    override fun setExtensionCallback(extensionCallback: ExtensionCallbackInterface) {
+        lock.withLock { callback = extensionCallback }
+    }
+
+    override fun onWindowLayoutChangeListenerAdded(activity: Activity) {
+        lock.withLock { callback.onWindowLayoutChanged(activity, currentWindowLayoutInfo()) }
+    }
+
+    override fun onWindowLayoutChangeListenerRemoved(activity: Activity) {
+        lock.withLock { state = toggleState(state) }
+    }
+
+    fun currentWindowLayoutInfo(): WindowLayoutInfo {
+        return WindowLayoutInfo(listOf(currentFoldingFeature()))
+    }
+
+    fun currentFoldingFeature(): FoldingFeature {
+        return FoldingFeature(foldBounds, FoldingFeature.TYPE_HINGE, state)
+    }
+
+    internal companion object {
+        private fun toggleState(currentState: Int): Int {
+            return if (currentState == FoldingFeature.STATE_FLAT) {
+                FoldingFeature.STATE_HALF_OPENED
+            } else {
+                FoldingFeature.STATE_FLAT
+            }
+        }
+    }
+}
diff --git a/window/window/src/testUtil/java/androidx/window/TestConsumer.kt b/window/window/src/testUtil/java/androidx/window/TestConsumer.kt
new file mode 100644
index 0000000..6976014
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/TestConsumer.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
+
+import androidx.core.util.Consumer
+import org.junit.Assert.assertEquals
+
+/**
+ * A test [Consumer] to hold all the values and make assertions based on the values.
+ */
+public class TestConsumer<T> : Consumer<T> {
+
+    private val values: MutableList<T> = mutableListOf()
+
+    /**
+     * Add the value to the list of seen values.
+     */
+    override fun accept(t: T) {
+        values.add(t)
+    }
+
+    /**
+     * Assert that there have been a fixed number of values
+     */
+    public fun assertValueCount(count: Int) {
+        assertEquals(count, values.size)
+    }
+
+    /**
+     * Assert that there has been exactly one value.
+     */
+    public fun assertValue(t: T) {
+        assertValueCount(1)
+        assertEquals(t, values[0])
+    }
+}
diff --git a/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.java b/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.java
deleted file mode 100644
index e889f98..0000000
--- a/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.java
+++ /dev/null
@@ -1,110 +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.window;
-
-import static androidx.window.FoldingFeature.STATE_FLAT;
-import static androidx.window.FoldingFeature.STATE_HALF_OPENED;
-import static androidx.window.FoldingFeature.TYPE_FOLD;
-import static androidx.window.FoldingFeature.TYPE_HINGE;
-
-import android.graphics.Rect;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class containing static methods for creating different window bound types. Test methods are
- * shared between the unit tests and the instrumentation tests.
- */
-final class TestFoldingFeatureUtil {
-
-    private TestFoldingFeatureUtil() {
-    }
-
-    /**
-     * @param windowBounds the bounds of the window.
-     * @return {@link Rect} that is a valid fold bound within the given window.
-     */
-    static Rect validFoldBound(Rect windowBounds) {
-        int verticalMid = windowBounds.height() / 2;
-        return new Rect(0, verticalMid, windowBounds.width(), verticalMid);
-    }
-
-    /**
-     * @return {@link Rect} containing the invalid zero bounds.
-     */
-    static Rect invalidZeroBound() {
-        return new Rect();
-    }
-
-    /**
-     * @param windowBounds the bounds of the window.
-     * @return {@link Rect} for bounds where the width is shorter than the window width.
-     */
-    static Rect invalidBoundShortWidth(Rect windowBounds) {
-        return new Rect(0, 0, windowBounds.width() / 2, 0);
-    }
-
-    /**
-     * @param windowBounds the bounds of the window.
-     * @return {@link Rect} for bounds where the height is shorter than the window height.
-     */
-    static Rect invalidBoundShortHeight(Rect windowBounds) {
-        return new Rect(0, 0, 0, windowBounds.height() / 2);
-    }
-
-    /**
-     * @param windowBounds the bounds of the window.
-     * @return a {@link List} of {@link Rect} of invalid bounds for folding features
-     */
-    static List<Rect> invalidFoldBounds(Rect windowBounds) {
-        List<Rect> badBounds = new ArrayList<>();
-
-        badBounds.add(invalidZeroBound());
-        badBounds.add(invalidBoundShortWidth(windowBounds));
-        badBounds.add(invalidBoundShortHeight(windowBounds));
-
-        return badBounds;
-    }
-
-    /**
-     * @param bounds for the test {@link FoldingFeature}
-     * @param type   of the {@link FoldingFeature}
-     * @return {@link List} of {@link FoldingFeature} containing all the possible states for the
-     * given type.
-     */
-    static List<FoldingFeature> allFoldStates(Rect bounds, @FoldingFeature.Type int type) {
-        List<FoldingFeature> states = new ArrayList<>();
-
-        states.add(new FoldingFeature(bounds, type, STATE_FLAT));
-        states.add(new FoldingFeature(bounds, type, STATE_HALF_OPENED));
-
-        return states;
-    }
-
-    /**
-     * @param bounds for the test {@link FoldingFeature}
-     * @return {@link List} of {@link FoldingFeature} containing all the possible states and
-     * types.
-     */
-    static List<FoldingFeature> allFoldingFeatureTypeAndStates(Rect bounds) {
-        List<FoldingFeature> features = new ArrayList<>();
-        features.addAll(allFoldStates(bounds, TYPE_HINGE));
-        features.addAll(allFoldStates(bounds, TYPE_FOLD));
-        return features;
-    }
-}
diff --git a/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.kt b/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.kt
new file mode 100644
index 0000000..78266e2
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/TestFoldingFeatureUtil.kt
@@ -0,0 +1,95 @@
+/*
+ * 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
+
+import android.graphics.Rect
+
+/**
+ * A class containing static methods for creating different window bound types. Test methods are
+ * shared between the unit tests and the instrumentation tests.
+ */
+internal object TestFoldingFeatureUtil {
+    /**
+     * @param windowBounds the bounds of the window.
+     * @return [Rect] that is a valid fold bound within the given window.
+     */
+    @JvmStatic
+    fun validFoldBound(windowBounds: Rect): Rect {
+        val verticalMid = windowBounds.height() / 2
+        return Rect(0, verticalMid, windowBounds.width(), verticalMid)
+    }
+
+    /**
+     * @return [Rect] containing the invalid zero bounds.
+     */
+    fun invalidZeroBound(): Rect {
+        return Rect()
+    }
+
+    /**
+     * @param windowBounds the bounds of the window.
+     * @return [Rect] for bounds where the width is shorter than the window width.
+     */
+    fun invalidBoundShortWidth(windowBounds: Rect): Rect {
+        return Rect(0, 0, windowBounds.width() / 2, 0)
+    }
+
+    /**
+     * @param windowBounds the bounds of the window.
+     * @return [Rect] for bounds where the height is shorter than the window height.
+     */
+    fun invalidBoundShortHeight(windowBounds: Rect): Rect {
+        return Rect(0, 0, 0, windowBounds.height() / 2)
+    }
+
+    /**
+     * @param windowBounds the bounds of the window.
+     * @return a [List] of [Rect] of invalid bounds for folding features
+     */
+    @JvmStatic
+    fun invalidFoldBounds(windowBounds: Rect): List<Rect> {
+        return listOf(
+            invalidZeroBound(),
+            invalidBoundShortWidth(windowBounds),
+            invalidBoundShortHeight(windowBounds)
+        )
+    }
+
+    /**
+     * @param bounds for the test [FoldingFeature]
+     * @param type   of the [FoldingFeature]
+     * @return [List] of [FoldingFeature] containing all the possible states for the
+     * given type.
+     */
+    @JvmStatic
+    fun allFoldStates(bounds: Rect, @FoldingFeature.Type type: Int): List<FoldingFeature> {
+        return listOf(
+            FoldingFeature(bounds, type, FoldingFeature.STATE_FLAT),
+            FoldingFeature(bounds, type, FoldingFeature.STATE_HALF_OPENED)
+        )
+    }
+
+    /**
+     * @param bounds for the test [FoldingFeature]
+     * @return [List] of [FoldingFeature] containing all the possible states and
+     * types.
+     */
+    @JvmStatic
+    fun allFoldingFeatureTypeAndStates(bounds: Rect): List<FoldingFeature> {
+        return allFoldStates(bounds, FoldingFeature.TYPE_HINGE) +
+            allFoldStates(bounds, FoldingFeature.TYPE_FOLD)
+    }
+}
diff --git a/window/window/src/testUtil/java/androidx/window/TestWindow.java b/window/window/src/testUtil/java/androidx/window/TestWindow.java
deleted file mode 100644
index 3b6dc01..0000000
--- a/window/window/src/testUtil/java/androidx/window/TestWindow.java
+++ /dev/null
@@ -1,234 +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.window;
-
-import static org.mockito.Mockito.mock;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.InputQueue;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.SurfaceHolder;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/** Stub implementation of {@link Window} for use in tests. */
-public class TestWindow extends Window {
-
-    private final View mDecorView;
-
-    public TestWindow(Context context) {
-        this(context, mock(View.class));
-    }
-
-    public TestWindow(Context context, View decorView) {
-        super(context);
-        mDecorView = decorView;
-    }
-
-    @Override
-    protected void onActive() {}
-
-    @Override
-    public void setChildDrawable(int i, Drawable drawable) {}
-
-    @Override
-    public void setChildInt(int i, int i1) {}
-
-    @Override
-    public boolean isShortcutKey(int i, KeyEvent keyEvent) {
-        return false;
-    }
-
-    @Override
-    public void setVolumeControlStream(int i) {}
-
-    @Override
-    public int getVolumeControlStream() {
-        return 0;
-    }
-
-    @Override
-    public int getStatusBarColor() {
-        return 0;
-    }
-
-    @Override
-    public void setStatusBarColor(int i) {}
-
-    @Override
-    public int getNavigationBarColor() {
-        return 0;
-    }
-
-    @Override
-    public void setNavigationBarColor(int i) {}
-
-    @Override
-    public void setDecorCaptionShade(int i) {}
-
-    @Override
-    public void setResizingCaptionDrawable(Drawable drawable) {}
-
-    @Override
-    public boolean superDispatchKeyEvent(KeyEvent keyEvent) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchKeyShortcutEvent(KeyEvent keyEvent) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchTouchEvent(MotionEvent motionEvent) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchTrackballEvent(MotionEvent motionEvent) {
-        return false;
-    }
-
-    @Override
-    public boolean superDispatchGenericMotionEvent(MotionEvent motionEvent) {
-        return false;
-    }
-
-    @NonNull
-    @Override
-    public View getDecorView() {
-        return mDecorView;
-    }
-
-    @Override
-    public View peekDecorView() {
-        return null;
-    }
-
-    @Override
-    public Bundle saveHierarchyState() {
-        return null;
-    }
-
-    @Override
-    public void restoreHierarchyState(Bundle bundle) {}
-
-    @Override
-    public void takeSurface(SurfaceHolder.Callback2 callback2) {}
-
-    @Override
-    public void takeInputQueue(InputQueue.Callback callback) {}
-
-    @Override
-    public boolean isFloating() {
-        return false;
-    }
-
-    @Override
-    public void setContentView(int i) {}
-
-    @Override
-    public void setContentView(View view) {}
-
-    @Override
-    public void setContentView(View view, ViewGroup.LayoutParams layoutParams) {}
-
-    @Override
-    public void addContentView(View view, ViewGroup.LayoutParams layoutParams) {}
-
-    @Nullable
-    @Override
-    public View getCurrentFocus() {
-        return null;
-    }
-
-    @NonNull
-    @Override
-    public LayoutInflater getLayoutInflater() {
-        return null;
-    }
-
-    @Override
-    public void setTitle(CharSequence charSequence) {}
-
-    @Override
-    public void setTitleColor(int i) {}
-
-    @Override
-    public void openPanel(int i, KeyEvent keyEvent) {}
-
-    @Override
-    public void closePanel(int i) {}
-
-    @Override
-    public void togglePanel(int i, KeyEvent keyEvent) {}
-
-    @Override
-    public void invalidatePanelMenu(int i) {}
-
-    @Override
-    public boolean performPanelShortcut(int i, int i1, KeyEvent keyEvent, int i2) {
-        return false;
-    }
-
-    @Override
-    public boolean performPanelIdentifierAction(int i, int i1, int i2) {
-        return false;
-    }
-
-    @Override
-    public void closeAllPanels() {}
-
-    @Override
-    public boolean performContextMenuIdentifierAction(int i, int i1) {
-        return false;
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration configuration) {}
-
-    @Override
-    public void setBackgroundDrawable(Drawable drawable) {}
-
-    @Override
-    public void setFeatureDrawableResource(int i, int i1) {}
-
-    @Override
-    public void setFeatureDrawable(int i, Drawable drawable) {}
-
-    @Override
-    public void setFeatureDrawableUri(int i, Uri uri) {}
-
-    @Override
-    public void setFeatureDrawableAlpha(int i, int i1) {}
-
-    @Override
-    public void setFeatureInt(int i, int i1) {}
-
-    @Override
-    public void takeKeyEvents(boolean b) {}
-}
diff --git a/window/window/src/testUtil/java/androidx/window/TestWindow.kt b/window/window/src/testUtil/java/androidx/window/TestWindow.kt
new file mode 100644
index 0000000..e9e9515
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/TestWindow.kt
@@ -0,0 +1,140 @@
+/*
+ * 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
+
+import android.content.Context
+import android.content.res.Configuration
+import android.graphics.drawable.Drawable
+import android.net.Uri
+import android.os.Bundle
+import android.view.InputQueue
+import android.view.KeyEvent
+import android.view.LayoutInflater
+import android.view.MotionEvent
+import android.view.SurfaceHolder
+import android.view.View
+import android.view.ViewGroup
+import android.view.Window
+import org.mockito.Mockito.mock
+
+/** Stub implementation of [Window] for use in tests.  */
+internal open class TestWindow @JvmOverloads constructor(
+    context: Context?,
+    private val decorView: View = mock(View::class.java)
+) : Window(context) {
+    override fun onActive() {}
+    override fun setChildDrawable(i: Int, drawable: Drawable) {}
+    override fun setChildInt(i: Int, i1: Int) {}
+    override fun isShortcutKey(i: Int, keyEvent: KeyEvent): Boolean {
+        return false
+    }
+
+    override fun setVolumeControlStream(i: Int) {}
+    override fun getVolumeControlStream(): Int {
+        return 0
+    }
+
+    override fun getStatusBarColor(): Int {
+        return 0
+    }
+
+    override fun setStatusBarColor(i: Int) {}
+    override fun getNavigationBarColor(): Int {
+        return 0
+    }
+
+    override fun setNavigationBarColor(i: Int) {}
+    override fun setDecorCaptionShade(i: Int) {}
+    override fun setResizingCaptionDrawable(drawable: Drawable) {}
+    override fun superDispatchKeyEvent(keyEvent: KeyEvent): Boolean {
+        return false
+    }
+
+    override fun superDispatchKeyShortcutEvent(keyEvent: KeyEvent): Boolean {
+        return false
+    }
+
+    override fun superDispatchTouchEvent(motionEvent: MotionEvent): Boolean {
+        return false
+    }
+
+    override fun superDispatchTrackballEvent(motionEvent: MotionEvent): Boolean {
+        return false
+    }
+
+    override fun superDispatchGenericMotionEvent(motionEvent: MotionEvent): Boolean {
+        return false
+    }
+
+    override fun getDecorView(): View {
+        return decorView
+    }
+
+    override fun peekDecorView(): View {
+        TODO("NOT IMPLEMENTED")
+    }
+
+    override fun saveHierarchyState(): Bundle {
+        TODO("NOT IMPLEMENTED")
+    }
+
+    override fun restoreHierarchyState(bundle: Bundle) {}
+    override fun takeSurface(callback2: SurfaceHolder.Callback2) {}
+    override fun takeInputQueue(callback: InputQueue.Callback) {}
+    override fun isFloating(): Boolean {
+        return false
+    }
+
+    override fun setContentView(i: Int) {}
+    override fun setContentView(view: View) {}
+    override fun setContentView(view: View, layoutParams: ViewGroup.LayoutParams) {}
+    override fun addContentView(view: View, layoutParams: ViewGroup.LayoutParams) {}
+    override fun getCurrentFocus(): View? {
+        return null
+    }
+
+    override fun getLayoutInflater(): LayoutInflater {
+        TODO("NOT IMPLEMENTED")
+    }
+
+    override fun setTitle(charSequence: CharSequence) {}
+    override fun setTitleColor(i: Int) {}
+    override fun openPanel(i: Int, keyEvent: KeyEvent) {}
+    override fun closePanel(i: Int) {}
+    override fun togglePanel(i: Int, keyEvent: KeyEvent) {}
+    override fun invalidatePanelMenu(i: Int) {}
+    override fun performPanelShortcut(i: Int, i1: Int, keyEvent: KeyEvent, i2: Int): Boolean {
+        return false
+    }
+
+    override fun performPanelIdentifierAction(i: Int, i1: Int, i2: Int): Boolean {
+        return false
+    }
+
+    override fun closeAllPanels() {}
+    override fun performContextMenuIdentifierAction(i: Int, i1: Int): Boolean {
+        return false
+    }
+
+    override fun onConfigurationChanged(configuration: Configuration) {}
+    override fun setBackgroundDrawable(drawable: Drawable) {}
+    override fun setFeatureDrawableResource(i: Int, i1: Int) {}
+    override fun setFeatureDrawable(i: Int, drawable: Drawable) {}
+    override fun setFeatureDrawableUri(i: Int, uri: Uri) {}
+    override fun setFeatureDrawableAlpha(i: Int, i1: Int) {}
+    override fun setFeatureInt(i: Int, i1: Int) {}
+    override fun takeKeyEvents(b: Boolean) {}
+}
diff --git a/window/window/src/testUtil/java/androidx/window/TestWindowBoundsHelper.kt b/window/window/src/testUtil/java/androidx/window/TestWindowBoundsHelper.kt
new file mode 100644
index 0000000..b022283
--- /dev/null
+++ b/window/window/src/testUtil/java/androidx/window/TestWindowBoundsHelper.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package androidx.window
+
+import android.app.Activity
+import android.graphics.Rect
+
+/**
+ * Subclass of [WindowBoundsHelper] used to override the results for testing.
+ *
+ * @see WindowBoundsHelper
+ *
+ * @see WindowBoundsHelper.setForTesting
+ */
+internal class TestWindowBoundsHelper : WindowBoundsHelper() {
+    private var globalOverriddenBounds: Rect? = null
+    private val overriddenBounds = mutableMapOf<Activity, Rect?>()
+    private val overriddenMaximumBounds = mutableMapOf<Activity, Rect?>()
+
+    /**
+     * Overrides the bounds returned from this helper for the given context. Passing `null` [bounds]
+     * has the effect of clearing the bounds override.
+     *
+     * Note: A global override set as a result of [.setCurrentBounds] takes precedence
+     * over the value set with this method.
+     */
+    fun setCurrentBoundsForActivity(activity: Activity, bounds: Rect?) {
+        overriddenBounds[activity] = bounds
+    }
+
+    /**
+     * Overrides the max bounds returned from this helper for the given context. Passing `null`
+     * [bounds] has the effect of clearing the bounds override.
+     */
+    fun setMaximumBoundsForActivity(activity: Activity, bounds: Rect?) {
+        overriddenMaximumBounds[activity] = bounds
+    }
+
+    /**
+     * Overrides the bounds returned from this helper for all supplied contexts. Passing null
+     * [bounds] has the effect of clearing the global override.
+     */
+    fun setCurrentBounds(bounds: Rect?) {
+        globalOverriddenBounds = bounds
+    }
+
+    override fun computeCurrentWindowBounds(activity: Activity): Rect {
+        return globalOverriddenBounds ?: overriddenBounds[activity]
+            ?: super.computeCurrentWindowBounds(activity)
+    }
+
+    override fun computeMaximumWindowBounds(activity: Activity): Rect {
+        val bounds = overriddenMaximumBounds[activity]
+        return bounds ?: super.computeMaximumWindowBounds(activity)
+    }
+
+    /**
+     * Clears any overrides set with [.setCurrentBounds] or
+     * [.setCurrentBoundsForActivity].
+     */
+    fun reset() {
+        globalOverriddenBounds = null
+        overriddenBounds.clear()
+        overriddenMaximumBounds.clear()
+    }
+}
diff --git a/work/integration-tests/testapp/lint-baseline.xml b/work/integration-tests/testapp/lint-baseline.xml
index 9f8217d..b8627cf 100644
--- a/work/integration-tests/testapp/lint-baseline.xml
+++ b/work/integration-tests/testapp/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.integration.testapp.ForegroundWorker is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.integration.testapp.ForegroundWorker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW)"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -13,8 +13,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.integration.testapp.ForegroundWorker is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.integration.testapp.ForegroundWorker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        channel.description = description"
         errorLine2="                ~~~~~~~~~~~">
         <location
@@ -24,8 +24,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.integration.testapp.ForegroundWorker is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.integration.testapp.ForegroundWorker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -35,8 +35,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.integration.testapp.ForegroundWorker is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.integration.testapp.ForegroundWorker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        notificationManager.createNotificationChannel(channel)"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -46,8 +46,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                &amp;&amp; Build.VERSION.SDK_INT >= 16 &amp;&amp; data.getClipData() != null) {"
         errorLine2="                                                       ~~~~~~~~~~~">
         <location
@@ -57,8 +57,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            int count = data.getClipData().getItemCount();"
         errorLine2="                             ~~~~~~~~~~~">
         <location
@@ -68,8 +68,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 16, the call containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is not annotated with @RequiresApi(x) where x is at least 16. Either annotate the containing class with at least @RequiresApi(16) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(16)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 16; however, the containing class androidx.work.integration.testapp.imageprocessing.ImageProcessingActivity is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                String uriString = data.getClipData().getItemAt(i).getUri().toString();"
         errorLine2="                                        ~~~~~~~~~~~">
         <location
@@ -79,57 +79,57 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    jobScheduler.cancelAll();"
         errorLine2="                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="523"
+            line="558"
             column="34"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        jobScheduler.schedule("
         errorLine2="                                     ~~~~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="525"
+            line="560"
             column="38"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                new JobInfo.Builder("
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="526"
+            line="561"
             column="33"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                        .setMinimumLatency(10 * 60 * 1000)"
         errorLine2="                                         ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="529"
+            line="564"
             column="42"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class null is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                        .build());"
         errorLine2="                                         ~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="530"
+            line="565"
             column="42"/>
     </issue>
 
@@ -140,7 +140,7 @@
         errorLine2="                         ~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="174"
+            line="179"
             column="26"/>
     </issue>
 
@@ -150,8 +150,8 @@
         errorLine1="    &lt;integer name=&quot;channel_importance&quot;>3&lt;/integer>"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
-            line="42"
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="45"
             column="14"/>
     </issue>
 
@@ -161,8 +161,8 @@
         errorLine1="    &lt;integer name=&quot;notification_id&quot;>1&lt;/integer>"
         errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/values/strings.xml"
-            line="45"
+            file="src/main/res/values/donottranslate-strings.xml"
+            line="48"
             column="14"/>
     </issue>
 
@@ -437,7 +437,7 @@
         errorLine2="                            ~~~~~~">
         <location
             file="src/main/java/androidx/work/integration/testapp/MainActivity.java"
-            line="76"
+            line="81"
             column="29"/>
     </issue>
 
diff --git a/work/integration-tests/testapp/src/main/res/values/strings.xml b/work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
similarity index 100%
rename from work/integration-tests/testapp/src/main/res/values/strings.xml
rename to work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
diff --git a/work/workmanager-benchmark/lint-baseline.xml b/work/workmanager-benchmark/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/work/workmanager-benchmark/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-gcm/build.gradle b/work/workmanager-gcm/build.gradle
index b87f85f..004c634 100644
--- a/work/workmanager-gcm/build.gradle
+++ b/work/workmanager-gcm/build.gradle
@@ -48,8 +48,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     testImplementation(JUNIT)
 }
 
diff --git a/work/workmanager-gcm/lint-baseline.xml b/work/workmanager-gcm/lint-baseline.xml
index ca653be..2f222a0 100644
--- a/work/workmanager-gcm/lint-baseline.xml
+++ b/work/workmanager-gcm/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanKeepAnnotation"
diff --git a/work/workmanager-inspection/build.gradle b/work/workmanager-inspection/build.gradle
index f0e66dc..781a9c5 100644
--- a/work/workmanager-inspection/build.gradle
+++ b/work/workmanager-inspection/build.gradle
@@ -57,12 +57,6 @@
         // studio pipeline works only starting with Android O
         minSdkVersion 26
     }
-
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-    }
-
     sourceSets {
         main.resources.srcDirs += "src/main/proto"
     }
diff --git a/work/workmanager-inspection/lint-baseline.xml b/work/workmanager-inspection/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/work/workmanager-inspection/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-ktx/build.gradle b/work/workmanager-ktx/build.gradle
index fa3953a..e323c94 100644
--- a/work/workmanager-ktx/build.gradle
+++ b/work/workmanager-ktx/build.gradle
@@ -39,8 +39,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation("androidx.room:room-testing:2.2.5")
     testImplementation(JUNIT)
 }
diff --git a/work/workmanager-ktx/lint-baseline.xml b/work/workmanager-ktx/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/work/workmanager-ktx/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt b/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
index 2c933c8..81d2a56 100644
--- a/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
+++ b/work/workmanager-ktx/src/main/java/androidx/work/CoroutineWorker.kt
@@ -77,8 +77,11 @@
     }
 
     /**
-     * A suspending method to do your work.  This function runs on the coroutine context specified
-     * by [coroutineContext].
+     * A suspending method to do your work.
+     * <p>
+     * To specify which [CoroutineDispatcher] your work should run on, use `withContext()`
+     * within `doWork()`.
+     * If there is no other dispatcher declared, [Dispatchers.Default] will be used.
      * <p>
      * A CoroutineWorker is given a maximum of ten minutes to finish its execution and return a
      * [ListenableWorker.Result].  After this time has expired, the worker will be signalled to
diff --git a/work/workmanager-lint/lint-baseline.xml b/work/workmanager-lint/lint-baseline.xml
deleted file mode 100644
index 297ae16..0000000
--- a/work/workmanager-lint/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-lint/src/test/java/androidx/work/lint/ApiLintVersionsTest.kt b/work/workmanager-lint/src/test/java/androidx/work/lint/ApiLintVersionsTest.kt
new file mode 100644
index 0000000..7288459
--- /dev/null
+++ b/work/workmanager-lint/src/test/java/androidx/work/lint/ApiLintVersionsTest.kt
@@ -0,0 +1,41 @@
+/*
+ * 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("UnstableApiUsage")
+
+package androidx.work.lint
+
+import com.android.tools.lint.client.api.LintClient
+import com.android.tools.lint.detector.api.CURRENT_API
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ApiLintVersionsTest {
+
+    @Test
+    fun versionsCheck() {
+        LintClient.clientName = LintClient.CLIENT_UNIT_TESTS
+
+        val registry = WorkManagerIssueRegistry()
+        // We hardcode version registry.api to the version that is used to run tests.
+        assertEquals("registry.api matches version used to run tests", CURRENT_API, registry.api)
+        // Intentionally fails in IDE, because we use different API version in Studio and CLI.
+        assertEquals("registry.minApi is set to minimum level of 3", 3, registry.minApi)
+    }
+}
diff --git a/work/workmanager-multiprocess/build.gradle b/work/workmanager-multiprocess/build.gradle
index 76bcadb..596d4cb 100644
--- a/work/workmanager-multiprocess/build.gradle
+++ b/work/workmanager-multiprocess/build.gradle
@@ -50,8 +50,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
     testImplementation(KOTLIN_STDLIB)
     testImplementation(JUNIT)
diff --git a/work/workmanager-multiprocess/lint-baseline.xml b/work/workmanager-multiprocess/lint-baseline.xml
deleted file mode 100644
index 6a82a8f..0000000
--- a/work/workmanager-multiprocess/lint-baseline.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="BanKeepAnnotation"
-        message="Uses @Keep annotation"
-        errorLine1="    @Keep"
-        errorLine2="    ~~~~~">
-        <location
-            file="src/main/java/androidx/work/multiprocess/RemoteWorkManagerClient.java"
-            line="80"
-            column="5"/>
-    </issue>
-
-</issues>
diff --git a/work/workmanager-rxjava2/lint-baseline.xml b/work/workmanager-rxjava2/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/work/workmanager-rxjava2/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-rxjava3/lint-baseline.xml b/work/workmanager-rxjava3/lint-baseline.xml
deleted file mode 100644
index 8f1aa4b..0000000
--- a/work/workmanager-rxjava3/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
-
-</issues>
diff --git a/work/workmanager-testing/build.gradle b/work/workmanager-testing/build.gradle
index 7018887..745ad5a 100644
--- a/work/workmanager-testing/build.gradle
+++ b/work/workmanager-testing/build.gradle
@@ -38,8 +38,8 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has it"s own MockMaker
 
     testImplementation(ANDROIDX_TEST_CORE)
     testImplementation(JUNIT)
diff --git a/work/workmanager-testing/lint-baseline.xml b/work/workmanager-testing/lint-baseline.xml
index 9529618..cad2625 100644
--- a/work/workmanager-testing/lint-baseline.xml
+++ b/work/workmanager-testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="KotlinPropertyAccess"
diff --git a/work/workmanager/build.gradle b/work/workmanager/build.gradle
index 2ba9ca2..c97b230 100644
--- a/work/workmanager/build.gradle
+++ b/work/workmanager/build.gradle
@@ -75,8 +75,8 @@
     androidTestImplementation(projectOrArtifact(":lifecycle:lifecycle-runtime-testing"))
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
-    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
-    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(MOCKITO_CORE, excludes.bytebuddy) // DexMaker has its own MockMaker
+    androidTestImplementation(DEXMAKER_MOCKITO, excludes.bytebuddy) // DexMaker has its own MockMaker
     androidTestImplementation(project(":internal-testutils-runtime"))
     testImplementation(JUNIT)
     lintPublish(project(":work:work-runtime-lint"))
diff --git a/work/workmanager/lint-baseline.xml b/work/workmanager/lint-baseline.xml
index ef161ab..c4e74ad 100644
--- a/work/workmanager/lint-baseline.xml
+++ b/work/workmanager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta02" client="gradle" variant="debug" version="4.2.0-beta02">
+<issues format="5" by="lint 4.2.0-beta06" client="gradle" variant="debug" version="4.2.0-beta06">
 
     <issue
         id="BanSynchronizedMethods"
@@ -79,8 +79,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.work.impl.background.systemalarm.Alarms is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.work.impl.background.systemalarm.Alarms is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                alarmManager.setExact(RTC_WAKEUP, triggerAtMillis, pendingIntent);"
         errorLine2="                             ~~~~~~~~">
         <location
@@ -90,8 +90,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.Constraints.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.Constraints.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mTriggerContentUpdateDelay = duration.toMillis();"
         errorLine2="                                                  ~~~~~~~~">
         <location
@@ -101,8 +101,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.Constraints.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.Constraints.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mTriggerContentMaxDelay = duration.toMillis();"
         errorLine2="                                               ~~~~~~~~">
         <location
@@ -112,19 +112,19 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.work.impl.utils.ForceStopRunnable is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 19; however, the containing class androidx.work.impl.utils.ForceStopRunnable is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                alarmManager.setExact(RTC_WAKEUP, triggerAt, pendingIntent);"
         errorLine2="                             ~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/utils/ForceStopRunnable.java"
-            line="294"
+            line="303"
             column="30"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mConnectivityManager.registerDefaultNetworkCallback(mNetworkCallback);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -134,8 +134,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -145,8 +145,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 23, the call containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is not annotated with @RequiresApi(x) where x is at least 23. Either annotate the containing class with at least @RequiresApi(23) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(23)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 23; however, the containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            Network network = mConnectivityManager.getActiveNetwork();"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~">
         <location
@@ -156,8 +156,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            NetworkCapabilities capabilities = mConnectivityManager.getNetworkCapabilities(network);"
         errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -167,8 +167,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.work.impl.constraints.trackers.NetworkStateTracker is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    &amp;&amp; capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);"
         errorLine2="                                    ~~~~~~~~~~~~~">
         <location
@@ -178,8 +178,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.PeriodicWorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.PeriodicWorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.setPeriodic(repeatInterval.toMillis());"
         errorLine2="                                                 ~~~~~~~~">
         <location
@@ -189,8 +189,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.PeriodicWorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.PeriodicWorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.setPeriodic(repeatInterval.toMillis(), flexInterval.toMillis());"
         errorLine2="                                                 ~~~~~~~~">
         <location
@@ -200,8 +200,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.PeriodicWorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.PeriodicWorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.setPeriodic(repeatInterval.toMillis(), flexInterval.toMillis());"
         errorLine2="                                                                          ~~~~~~~~">
         <location
@@ -211,8 +211,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.work.impl.utils.ProcessUtils is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.work.impl.utils.ProcessUtils is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return Application.getProcessName();"
         errorLine2="                               ~~~~~~~~~~~~~~">
         <location
@@ -222,8 +222,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 29, the call containing class null is not annotated with @RequiresApi(x) where x is at least 29. Either annotate the containing class with at least @RequiresApi(29) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(29)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 29; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                    startForeground(notificationId, notification, notificationType);"
         errorLine2="                    ~~~~~~~~~~~~~~~">
         <location
@@ -233,85 +233,96 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.setImportantWhileForeground(true);"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="102"
+            line="105"
             column="25"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                builder.addTriggerContentUri(convertContentUriTrigger(trigger));"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="109"
+            line="112"
             column="25"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setTriggerContentUpdateDelay(constraints.getTriggerContentUpdateDelay());"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="111"
+            line="114"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setTriggerContentMaxDelay(constraints.getTriggerMaxContentDelay());"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="112"
+            line="115"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setRequiresBatteryNotLow(constraints.requiresBatteryNotLow());"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="119"
+            line="122"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            builder.setRequiresStorageNotLow(constraints.requiresStorageNotLow());"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="120"
+            line="123"
             column="21"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new JobInfo.TriggerContentUri(trigger.getUri(), flag);"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
-            line="130"
+            line="133"
             column="16"/>
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobService is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.work.impl.background.systemjob.SystemJobInfoConverter is reachable from earlier API levels and will fail run-time class verification."
+        errorLine1="            builder.setRequiredNetwork(networkRequest);"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java"
+            line="152"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobService is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (params.getTriggeredContentUris() != null) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -321,8 +332,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobService is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobService is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        Arrays.asList(params.getTriggeredContentUris());"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -332,8 +343,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobService is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobService is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            if (params.getTriggeredContentAuthorities() != null) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -343,8 +354,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.background.systemjob.SystemJobService is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.background.systemjob.SystemJobService is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                        Arrays.asList(params.getTriggeredContentAuthorities());"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -354,8 +365,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 28, the call containing class androidx.work.impl.background.systemjob.SystemJobService is not annotated with @RequiresApi(x) where x is at least 28. Either annotate the containing class with at least @RequiresApi(28) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(28)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 28; however, the containing class androidx.work.impl.background.systemjob.SystemJobService is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                runtimeExtras.network = params.getNetwork();"
         errorLine2="                                               ~~~~~~~~~~">
         <location
@@ -365,8 +376,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.work.impl.WorkDatabasePathHelper is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 21; however, the containing class androidx.work.impl.WorkDatabasePathHelper is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        return new File(context.getNoBackupFilesDir(), filePath);"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -376,8 +387,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 24, the call containing class androidx.work.impl.WorkManagerImpl is not annotated with @RequiresApi(x) where x is at least 24. Either annotate the containing class with at least @RequiresApi(24) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(24)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 24; however, the containing class androidx.work.impl.WorkManagerImpl is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N &amp;&amp; context.isDeviceProtectedStorage()) {"
         errorLine2="                                                                      ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -387,8 +398,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.WorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.WorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.setBackoffDelayDuration(duration.toMillis());"
         errorLine2="                                                       ~~~~~~~~">
         <location
@@ -398,8 +409,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.WorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.WorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.minimumRetentionDuration = duration.toMillis();"
         errorLine2="                                                          ~~~~~~~~">
         <location
@@ -409,8 +420,8 @@
     </issue>
 
     <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 26, the call containing class androidx.work.WorkRequest.Builder is not annotated with @RequiresApi(x) where x is at least 26. Either annotate the containing class with at least @RequiresApi(26) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(26)."
+        id="ClassVerificationFailure"
+        message="This call references a method added in API level 26; however, the containing class androidx.work.WorkRequest.Builder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mWorkSpec.initialDelay = duration.toMillis();"
         errorLine2="                                              ~~~~~~~~">
         <location
@@ -947,39 +958,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public Operation getOperation() {"
-        errorLine2="           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/impl/utils/EnqueueRunnable.java"
-            line="106"
-            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 onReceive(Context context, Intent intent) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/impl/utils/ForceStopRunnable.java"
-            line="313"
-            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 onReceive(Context context, Intent intent) {"
-        errorLine2="                                               ~~~~~~">
-        <location
-            file="src/main/java/androidx/work/impl/utils/ForceStopRunnable.java"
-            line="313"
-            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 static InputMerger fromClassName(String className) {"
         errorLine2="                  ~~~~~~~~~~~">
         <location
@@ -2051,7 +2029,7 @@
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="88"
+            line="90"
             column="34"/>
     </issue>
 
@@ -2062,7 +2040,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="121"
+            line="123"
             column="19"/>
     </issue>
 
@@ -2073,7 +2051,7 @@
         errorLine2="                                         ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="154"
+            line="156"
             column="42"/>
     </issue>
 
@@ -2084,7 +2062,7 @@
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="175"
+            line="177"
             column="19"/>
     </issue>
 
@@ -2095,7 +2073,7 @@
         errorLine2="                                       ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="196"
+            line="199"
             column="40"/>
     </issue>
 
@@ -2106,7 +2084,7 @@
         errorLine2="                  ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="226"
+            line="234"
             column="19"/>
     </issue>
 
@@ -2117,7 +2095,7 @@
         errorLine2="                  ~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="255"
+            line="267"
             column="19"/>
     </issue>
 
@@ -2128,7 +2106,7 @@
         errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="255"
+            line="267"
             column="56"/>
     </issue>
 
@@ -2139,7 +2117,7 @@
         errorLine2="                  ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="293"
+            line="306"
             column="19"/>
     </issue>
 
@@ -2150,7 +2128,7 @@
         errorLine2="                                                                   ~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/model/WorkTypeConverters.java"
-            line="293"
+            line="306"
             column="68"/>
     </issue>
 
@@ -2161,7 +2139,7 @@
         errorLine2="               ~~~~~~~">
         <location
             file="src/main/java/androidx/work/WorkerParameters.java"
-            line="208"
+            line="216"
             column="16"/>
     </issue>
 
@@ -2172,7 +2150,7 @@
         errorLine2="               ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/work/impl/WorkerWrapper.java"
-            line="685"
+            line="684"
             column="16"/>
     </issue>
 
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
index 0135781..418e1c8 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/workers/ConstraintTrackingWorkerTest.java
@@ -72,6 +72,7 @@
 import org.jetbrains.annotations.NotNull;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -189,6 +190,7 @@
         assertThat(workSpec.state, is(WorkInfo.State.ENQUEUED));
     }
 
+    @Ignore
     @Test
     @SdkSuppress(minSdkVersion = 24, maxSdkVersion = 25)
     public void testConstraintTrackingWorker_onConstraintsChanged() throws InterruptedException {